Changeset 150856 in webkit


Ignore:
Timestamp:
May 28, 2013 4:42:45 PM (11 years ago)
Author:
crogers@google.com
Message:

Support multiple HRTFDatabases for different sample-rates
https://bugs.webkit.org/show_bug.cgi?id=116183

Reviewed by Kenneth Russell.

Adapted from Blink:
https://codereview.chromium.org/14636011/

This removes the limitation which required OfflineAudioContexts to be created at native sample-rate

  • Modules/webaudio/AudioContext.h:

(WebCore::AudioContext::hrtfDatabaseLoader):
(AudioContext):

  • Modules/webaudio/OfflineAudioContext.cpp:

(WebCore::OfflineAudioContext::create):

  • Modules/webaudio/OfflineAudioDestinationNode.cpp:

(WebCore::OfflineAudioDestinationNode::offlineRender):

  • Modules/webaudio/PannerNode.cpp:

(WebCore::PannerNode::initialize):
(WebCore::PannerNode::setPanningModel):

  • platform/audio/HRTFDatabaseLoader.cpp:

(WebCore):
(WebCore::HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary):
(WebCore::HRTFDatabaseLoader::~HRTFDatabaseLoader):

  • platform/audio/HRTFDatabaseLoader.h:

(HRTFDatabaseLoader):
(WebCore::HRTFDatabaseLoader::loaderMap):

  • platform/audio/HRTFPanner.cpp:

(WebCore::HRTFPanner::HRTFPanner):
(WebCore::HRTFPanner::calculateDesiredAzimuthIndexAndBlend):
(WebCore::HRTFPanner::pan):

  • platform/audio/HRTFPanner.h:

(HRTFPanner):

  • platform/audio/Panner.cpp:

(WebCore::Panner::create):

  • platform/audio/Panner.h:

(WebCore):

Location:
trunk/Source/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r150855 r150856  
     12013-05-28  Chris Rogers  <crogers@google.com>
     2
     3        Support multiple HRTFDatabases for different sample-rates
     4        https://bugs.webkit.org/show_bug.cgi?id=116183
     5
     6        Reviewed by Kenneth Russell.
     7
     8        Adapted from Blink:
     9        https://codereview.chromium.org/14636011/
     10
     11        This removes the limitation which required OfflineAudioContexts to be created at native sample-rate
     12
     13        * Modules/webaudio/AudioContext.h:
     14        (WebCore::AudioContext::hrtfDatabaseLoader):
     15        (AudioContext):
     16        * Modules/webaudio/OfflineAudioContext.cpp:
     17        (WebCore::OfflineAudioContext::create):
     18        * Modules/webaudio/OfflineAudioDestinationNode.cpp:
     19        (WebCore::OfflineAudioDestinationNode::offlineRender):
     20        * Modules/webaudio/PannerNode.cpp:
     21        (WebCore::PannerNode::initialize):
     22        (WebCore::PannerNode::setPanningModel):
     23        * platform/audio/HRTFDatabaseLoader.cpp:
     24        (WebCore):
     25        (WebCore::HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary):
     26        (WebCore::HRTFDatabaseLoader::~HRTFDatabaseLoader):
     27        * platform/audio/HRTFDatabaseLoader.h:
     28        (HRTFDatabaseLoader):
     29        (WebCore::HRTFDatabaseLoader::loaderMap):
     30        * platform/audio/HRTFPanner.cpp:
     31        (WebCore::HRTFPanner::HRTFPanner):
     32        (WebCore::HRTFPanner::calculateDesiredAzimuthIndexAndBlend):
     33        (WebCore::HRTFPanner::pan):
     34        * platform/audio/HRTFPanner.h:
     35        (HRTFPanner):
     36        * platform/audio/Panner.cpp:
     37        (WebCore::Panner::create):
     38        * platform/audio/Panner.h:
     39        (WebCore):
     40
    1412013-05-28  Alexey Proskuryakov  <ap@apple.com>
    242
  • trunk/Source/WebCore/Modules/webaudio/AudioContext.h

    r148921 r150856  
    8989    // Returns true when initialize() was called AND all asynchronous initialization has completed.
    9090    bool isRunnable() const;
     91
     92    HRTFDatabaseLoader* hrtfDatabaseLoader() const { return m_hrtfDatabaseLoader.get(); }
    9193
    9294    // Document notification
  • trunk/Source/WebCore/Modules/webaudio/OfflineAudioContext.cpp

    r145745 r150856  
    3131#include "Document.h"
    3232#include "ExceptionCode.h"
    33 #include "HRTFDatabaseLoader.h"
    3433#include "ScriptExecutionContext.h"
    3534
     
    4645    Document* document = toDocument(context);
    4746
    48     // FIXME: offline contexts have limitations on supported sample-rates.
    49     // Currently all AudioContexts must have the same sample-rate.
    50     HRTFDatabaseLoader* loader = HRTFDatabaseLoader::loader();
    51     if (numberOfChannels > 10 || !isSampleRateRangeGood(sampleRate) || (loader && loader->databaseSampleRate() != sampleRate)) {
     47    if (numberOfChannels > 10 || !isSampleRateRangeGood(sampleRate)) {
    5248        ec = SYNTAX_ERR;
    5349        return 0;
  • trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.cpp

    r149817 r150856  
    117117    // Synchronize with HRTFDatabaseLoader.
    118118    // The database must be loaded before we can proceed.
    119     HRTFDatabaseLoader* loader = HRTFDatabaseLoader::loader();
     119    HRTFDatabaseLoader* loader = context()->hrtfDatabaseLoader();
    120120    ASSERT(loader);
    121121    if (!loader)
  • trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp

    r146486 r150856  
    145145    if (isInitialized())
    146146        return;
    147        
    148     m_panner = Panner::create(m_panningModel, sampleRate());
     147
     148    m_panner = Panner::create(m_panningModel, sampleRate(), context()->hrtfDatabaseLoader());
    149149
    150150    AudioNode::initialize();
     
    201201            MutexLocker processLocker(m_pannerLock);
    202202           
    203             OwnPtr<Panner> newPanner = Panner::create(model, sampleRate());
     203            OwnPtr<Panner> newPanner = Panner::create(model, sampleRate(), context()->hrtfDatabaseLoader());
    204204            m_panner = newPanner.release();
    205205            m_panningModel = model;
  • trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.cpp

    r148921 r150856  
    3939
    4040// Singleton
    41 HRTFDatabaseLoader* HRTFDatabaseLoader::s_loader = 0;
     41HRTFDatabaseLoader::LoaderMap* HRTFDatabaseLoader::s_loaderMap = 0;
    4242
    4343PassRefPtr<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(float sampleRate)
     
    4747    RefPtr<HRTFDatabaseLoader> loader;
    4848   
    49     if (!s_loader) {
    50         // Lazily create and load.
    51         loader = adoptRef(new HRTFDatabaseLoader(sampleRate));
    52         s_loader = loader.get();
    53         loader->loadAsynchronously();
    54     } else {
    55         loader = s_loader;
     49    if (!s_loaderMap)
     50        s_loaderMap = adoptPtr(new LoaderMap()).leakPtr();
     51
     52    loader = s_loaderMap->get(sampleRate);
     53    if (loader) {
    5654        ASSERT(sampleRate == loader->databaseSampleRate());
     55        return loader;
    5756    }
    58    
     57
     58    loader = adoptRef(new HRTFDatabaseLoader(sampleRate));
     59    s_loaderMap->add(sampleRate, loader.get());
     60
     61    loader->loadAsynchronously();
     62
    5963    return loader;
    6064}
     
    7377    waitForLoaderThreadCompletion();
    7478    m_hrtfDatabase.clear();
    75    
    76     // Clear out singleton.
    77     ASSERT(this == s_loader);
    78     s_loader = 0;
     79
     80    // Remove ourself from the map.
     81    if (s_loaderMap)
     82        s_loaderMap->remove(m_databaseSampleRate);
    7983}
    80 
    8184
    8285// Asynchronously load the database in this thread.
     
    124127}
    125128
    126 HRTFDatabase* HRTFDatabaseLoader::defaultHRTFDatabase()
    127 {
    128     if (!s_loader)
    129         return 0;
    130    
    131     return s_loader->database();
    132 }
    133 
    134129} // namespace WebCore
    135130
  • trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.h

    r148921 r150856  
    3131
    3232#include "HRTFDatabase.h"
     33#include <wtf/HashMap.h>
    3334#include <wtf/PassRefPtr.h>
    3435#include <wtf/RefCounted.h>
     
    4243class HRTFDatabaseLoader : public RefCounted<HRTFDatabaseLoader> {
    4344public:
    44     // Lazily creates the singleton HRTFDatabaseLoader (if not already created) and starts loading asynchronously (when created the first time).
    45     // Returns the singleton HRTFDatabaseLoader.
     45    // Lazily creates a HRTFDatabaseLoader (if not already created) for the given sample-rate
     46    // and starts loading asynchronously (when created the first time).
     47    // Returns the HRTFDatabaseLoader.
    4648    // Must be called from the main thread.
    4749    static PassRefPtr<HRTFDatabaseLoader> createAndLoadAsynchronouslyIfNecessary(float sampleRate);
    4850
    49     // Returns the singleton HRTFDatabaseLoader.
    50     static HRTFDatabaseLoader* loader() { return s_loader; }
    51    
    5251    // Both constructor and destructor must be called from the main thread.
    5352    ~HRTFDatabaseLoader();
     
    6665    void load();
    6766
    68     // defaultHRTFDatabase() gives access to the loaded database.
    69     // This can be called from any thread, but it is the callers responsibilty to call this while the context (and thus HRTFDatabaseLoader)
    70     // is still alive.  Otherwise this will return 0.
    71     static HRTFDatabase* defaultHRTFDatabase();
    72 
    7367private:
    7468    // Both constructor and destructor must be called from the main thread.
     
    7973    void loadAsynchronously();
    8074
    81     static HRTFDatabaseLoader* s_loader; // singleton
     75    // Map from sample-rate to loader.
     76    typedef HashMap<double, HRTFDatabaseLoader*> LoaderMap;
     77
     78    // Keeps track of loaders on a per-sample-rate basis.
     79    static LoaderMap* s_loaderMap; // singleton
     80    static HRTFDatabaseLoader::LoaderMap* loaderMap() { return s_loaderMap; }
     81
    8282    OwnPtr<HRTFDatabase> m_hrtfDatabase;
    8383
  • trunk/Source/WebCore/platform/audio/HRTFPanner.cpp

    r110507 r150856  
    4848const unsigned RenderingQuantum = 128;
    4949
    50 HRTFPanner::HRTFPanner(float sampleRate)
     50HRTFPanner::HRTFPanner(float sampleRate, HRTFDatabaseLoader* databaseLoader)
    5151    : Panner(PanningModelHRTF)
     52    , m_databaseLoader(databaseLoader)
    5253    , m_sampleRate(sampleRate)
    5354    , m_crossfadeSelection(CrossfadeSelection1)
     
    6970    , m_tempR2(RenderingQuantum)
    7071{
     72    ASSERT(databaseLoader);
    7173}
    7274
     
    101103        azimuth += 360.0;
    102104
    103     HRTFDatabase* database = HRTFDatabaseLoader::defaultHRTFDatabase();
     105    HRTFDatabase* database = m_databaseLoader->database();
    104106    ASSERT(database);
    105107
     
    136138
    137139    // This code only runs as long as the context is alive and after database has been loaded.
    138     HRTFDatabase* database = HRTFDatabaseLoader::defaultHRTFDatabase();
     140    HRTFDatabase* database = m_databaseLoader->database();
    139141    ASSERT(database);
    140142    if (!database) {
  • trunk/Source/WebCore/platform/audio/HRTFPanner.h

    r110507 r150856  
    2828#include "DelayDSPKernel.h"
    2929#include "FFTConvolver.h"
     30#include "HRTFDatabaseLoader.h"
    3031#include "Panner.h"
    3132
     
    3435class HRTFPanner : public Panner {
    3536public:
    36     explicit HRTFPanner(float sampleRate);
     37    explicit HRTFPanner(float sampleRate, HRTFDatabaseLoader*);
    3738    virtual ~HRTFPanner();
    3839
     
    5354    // and azimuthBlend which is an interpolation value from 0 -> 1.
    5455    int calculateDesiredAzimuthIndexAndBlend(double azimuth, double& azimuthBlend);
     56
     57    RefPtr<HRTFDatabaseLoader> m_databaseLoader;
    5558
    5659    float m_sampleRate;
  • trunk/Source/WebCore/platform/audio/Panner.cpp

    r96745 r150856  
    3939namespace WebCore {
    4040
    41 PassOwnPtr<Panner> Panner::create(PanningModel model, float sampleRate)
     41PassOwnPtr<Panner> Panner::create(PanningModel model, float sampleRate, HRTFDatabaseLoader* databaseLoader)
    4242{
    4343    OwnPtr<Panner> panner;
     
    4949
    5050    case PanningModelHRTF:
    51         panner = adoptPtr(new HRTFPanner(sampleRate));
     51        panner = adoptPtr(new HRTFPanner(sampleRate, databaseLoader));
    5252        break;
    5353
  • trunk/Source/WebCore/platform/audio/Panner.h

    r110507 r150856  
    3535
    3636class AudioBus;
     37class HRTFDatabaseLoader;
    3738
    3839// Abstract base class for panning a mono or stereo source.
     
    4849    typedef unsigned PanningModel;
    4950
    50     static PassOwnPtr<Panner> create(PanningModel, float sampleRate);
     51    static PassOwnPtr<Panner> create(PanningModel, float sampleRate, HRTFDatabaseLoader*);
    5152
    5253    virtual ~Panner() { };
Note: See TracChangeset for help on using the changeset viewer.