Changeset 150856 in webkit
- Timestamp:
- May 28, 2013 4:42:45 PM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r150855 r150856 1 2013-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 1 41 2013-05-28 Alexey Proskuryakov <ap@apple.com> 2 42 -
trunk/Source/WebCore/Modules/webaudio/AudioContext.h
r148921 r150856 89 89 // Returns true when initialize() was called AND all asynchronous initialization has completed. 90 90 bool isRunnable() const; 91 92 HRTFDatabaseLoader* hrtfDatabaseLoader() const { return m_hrtfDatabaseLoader.get(); } 91 93 92 94 // Document notification -
trunk/Source/WebCore/Modules/webaudio/OfflineAudioContext.cpp
r145745 r150856 31 31 #include "Document.h" 32 32 #include "ExceptionCode.h" 33 #include "HRTFDatabaseLoader.h"34 33 #include "ScriptExecutionContext.h" 35 34 … … 46 45 Document* document = toDocument(context); 47 46 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)) { 52 48 ec = SYNTAX_ERR; 53 49 return 0; -
trunk/Source/WebCore/Modules/webaudio/OfflineAudioDestinationNode.cpp
r149817 r150856 117 117 // Synchronize with HRTFDatabaseLoader. 118 118 // The database must be loaded before we can proceed. 119 HRTFDatabaseLoader* loader = HRTFDatabaseLoader::loader();119 HRTFDatabaseLoader* loader = context()->hrtfDatabaseLoader(); 120 120 ASSERT(loader); 121 121 if (!loader) -
trunk/Source/WebCore/Modules/webaudio/PannerNode.cpp
r146486 r150856 145 145 if (isInitialized()) 146 146 return; 147 148 m_panner = Panner::create(m_panningModel, sampleRate() );147 148 m_panner = Panner::create(m_panningModel, sampleRate(), context()->hrtfDatabaseLoader()); 149 149 150 150 AudioNode::initialize(); … … 201 201 MutexLocker processLocker(m_pannerLock); 202 202 203 OwnPtr<Panner> newPanner = Panner::create(model, sampleRate() );203 OwnPtr<Panner> newPanner = Panner::create(model, sampleRate(), context()->hrtfDatabaseLoader()); 204 204 m_panner = newPanner.release(); 205 205 m_panningModel = model; -
trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.cpp
r148921 r150856 39 39 40 40 // Singleton 41 HRTFDatabaseLoader * HRTFDatabaseLoader::s_loader= 0;41 HRTFDatabaseLoader::LoaderMap* HRTFDatabaseLoader::s_loaderMap = 0; 42 42 43 43 PassRefPtr<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(float sampleRate) … … 47 47 RefPtr<HRTFDatabaseLoader> loader; 48 48 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) { 56 54 ASSERT(sampleRate == loader->databaseSampleRate()); 55 return loader; 57 56 } 58 57 58 loader = adoptRef(new HRTFDatabaseLoader(sampleRate)); 59 s_loaderMap->add(sampleRate, loader.get()); 60 61 loader->loadAsynchronously(); 62 59 63 return loader; 60 64 } … … 73 77 waitForLoaderThreadCompletion(); 74 78 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); 79 83 } 80 81 84 82 85 // Asynchronously load the database in this thread. … … 124 127 } 125 128 126 HRTFDatabase* HRTFDatabaseLoader::defaultHRTFDatabase()127 {128 if (!s_loader)129 return 0;130 131 return s_loader->database();132 }133 134 129 } // namespace WebCore 135 130 -
trunk/Source/WebCore/platform/audio/HRTFDatabaseLoader.h
r148921 r150856 31 31 32 32 #include "HRTFDatabase.h" 33 #include <wtf/HashMap.h> 33 34 #include <wtf/PassRefPtr.h> 34 35 #include <wtf/RefCounted.h> … … 42 43 class HRTFDatabaseLoader : public RefCounted<HRTFDatabaseLoader> { 43 44 public: 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. 46 48 // Must be called from the main thread. 47 49 static PassRefPtr<HRTFDatabaseLoader> createAndLoadAsynchronouslyIfNecessary(float sampleRate); 48 50 49 // Returns the singleton HRTFDatabaseLoader.50 static HRTFDatabaseLoader* loader() { return s_loader; }51 52 51 // Both constructor and destructor must be called from the main thread. 53 52 ~HRTFDatabaseLoader(); … … 66 65 void load(); 67 66 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 73 67 private: 74 68 // Both constructor and destructor must be called from the main thread. … … 79 73 void loadAsynchronously(); 80 74 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 82 82 OwnPtr<HRTFDatabase> m_hrtfDatabase; 83 83 -
trunk/Source/WebCore/platform/audio/HRTFPanner.cpp
r110507 r150856 48 48 const unsigned RenderingQuantum = 128; 49 49 50 HRTFPanner::HRTFPanner(float sampleRate )50 HRTFPanner::HRTFPanner(float sampleRate, HRTFDatabaseLoader* databaseLoader) 51 51 : Panner(PanningModelHRTF) 52 , m_databaseLoader(databaseLoader) 52 53 , m_sampleRate(sampleRate) 53 54 , m_crossfadeSelection(CrossfadeSelection1) … … 69 70 , m_tempR2(RenderingQuantum) 70 71 { 72 ASSERT(databaseLoader); 71 73 } 72 74 … … 101 103 azimuth += 360.0; 102 104 103 HRTFDatabase* database = HRTFDatabaseLoader::defaultHRTFDatabase();105 HRTFDatabase* database = m_databaseLoader->database(); 104 106 ASSERT(database); 105 107 … … 136 138 137 139 // 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(); 139 141 ASSERT(database); 140 142 if (!database) { -
trunk/Source/WebCore/platform/audio/HRTFPanner.h
r110507 r150856 28 28 #include "DelayDSPKernel.h" 29 29 #include "FFTConvolver.h" 30 #include "HRTFDatabaseLoader.h" 30 31 #include "Panner.h" 31 32 … … 34 35 class HRTFPanner : public Panner { 35 36 public: 36 explicit HRTFPanner(float sampleRate );37 explicit HRTFPanner(float sampleRate, HRTFDatabaseLoader*); 37 38 virtual ~HRTFPanner(); 38 39 … … 53 54 // and azimuthBlend which is an interpolation value from 0 -> 1. 54 55 int calculateDesiredAzimuthIndexAndBlend(double azimuth, double& azimuthBlend); 56 57 RefPtr<HRTFDatabaseLoader> m_databaseLoader; 55 58 56 59 float m_sampleRate; -
trunk/Source/WebCore/platform/audio/Panner.cpp
r96745 r150856 39 39 namespace WebCore { 40 40 41 PassOwnPtr<Panner> Panner::create(PanningModel model, float sampleRate )41 PassOwnPtr<Panner> Panner::create(PanningModel model, float sampleRate, HRTFDatabaseLoader* databaseLoader) 42 42 { 43 43 OwnPtr<Panner> panner; … … 49 49 50 50 case PanningModelHRTF: 51 panner = adoptPtr(new HRTFPanner(sampleRate ));51 panner = adoptPtr(new HRTFPanner(sampleRate, databaseLoader)); 52 52 break; 53 53 -
trunk/Source/WebCore/platform/audio/Panner.h
r110507 r150856 35 35 36 36 class AudioBus; 37 class HRTFDatabaseLoader; 37 38 38 39 // Abstract base class for panning a mono or stereo source. … … 48 49 typedef unsigned PanningModel; 49 50 50 static PassOwnPtr<Panner> create(PanningModel, float sampleRate );51 static PassOwnPtr<Panner> create(PanningModel, float sampleRate, HRTFDatabaseLoader*); 51 52 52 53 virtual ~Panner() { };
Note: See TracChangeset
for help on using the changeset viewer.