Chromium Code Reviews| Index: Source/core/platform/audio/HRTFDatabaseLoader.cpp |
| diff --git a/Source/core/platform/audio/HRTFDatabaseLoader.cpp b/Source/core/platform/audio/HRTFDatabaseLoader.cpp |
| index b4dc6301f3a234a8b9fd0c6fc09e9d8661ff06d2..e6033660473dc29ec2aef3457c411fc955a0a5e9 100644 |
| --- a/Source/core/platform/audio/HRTFDatabaseLoader.cpp |
| +++ b/Source/core/platform/audio/HRTFDatabaseLoader.cpp |
| @@ -39,7 +39,7 @@ |
| namespace WebCore { |
| // Singleton |
| -HRTFDatabaseLoader* HRTFDatabaseLoader::s_loader = 0; |
| +HRTFDatabaseLoader::LoaderMap* HRTFDatabaseLoader::s_loaderMap = 0; |
| PassRefPtr<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(float sampleRate) |
| { |
| @@ -47,16 +47,20 @@ PassRefPtr<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIf |
| RefPtr<HRTFDatabaseLoader> loader; |
| - if (!s_loader) { |
| - // Lazily create and load. |
| - loader = adoptRef(new HRTFDatabaseLoader(sampleRate)); |
| - s_loader = loader.get(); |
| - loader->loadAsynchronously(); |
| - } else { |
| - loader = s_loader; |
| + if (!s_loaderMap) |
| + s_loaderMap = adoptPtr(new LoaderMap()).leakPtr(); |
| + |
| + loader = s_loaderMap->get(sampleRate); |
| + if (loader) { |
| ASSERT(sampleRate == loader->databaseSampleRate()); |
| + return loader; |
| } |
| - |
| + |
| + loader = adoptRef(new HRTFDatabaseLoader(sampleRate)); |
| + s_loaderMap->add(sampleRate, loader.get()); |
| + |
| + loader->loadAsynchronously(); |
| + |
| return loader; |
| } |
| @@ -73,12 +77,11 @@ HRTFDatabaseLoader::~HRTFDatabaseLoader() |
| waitForLoaderThreadCompletion(); |
| m_hrtfDatabase.clear(); |
| - |
| - // Clear out singleton. |
| - ASSERT(this == s_loader); |
| - s_loader = 0; |
| -} |
| + // Remove ourself from the map. |
| + if (s_loaderMap) |
| + s_loaderMap->remove(m_databaseSampleRate); |
| +} |
| // Asynchronously load the database in this thread. |
| static void databaseLoaderEntry(void* threadData) |
| @@ -124,20 +127,22 @@ void HRTFDatabaseLoader::waitForLoaderThreadCompletion() |
| m_databaseLoaderThread = 0; |
| } |
| -HRTFDatabase* HRTFDatabaseLoader::defaultHRTFDatabase() |
| -{ |
| - if (!s_loader) |
| - return 0; |
| - |
| - return s_loader->database(); |
| -} |
| - |
| void HRTFDatabaseLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const |
| { |
| MemoryClassInfo info(memoryObjectInfo, this, PlatformMemoryTypes::AudioSharedData); |
| info.addMember(m_hrtfDatabase, "hrtfDatabase"); |
| } |
| +void HRTFDatabaseLoader::LoaderMap::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const |
| +{ |
| + if (s_loaderMap) { |
|
Ken Russell (switch to Gerrit)
2013/05/13 21:44:18
This method should also ASSERT(isMainThread()).
Chris Rogers
2013/05/14 20:23:10
Done.
|
| + for (HRTFDatabaseLoader::LoaderMap::iterator i = s_loaderMap->begin(); i != s_loaderMap->end(); ++i) { |
| + HRTFDatabaseLoader* loader = i.get()->value; |
| + loader->reportMemoryUsage(memoryObjectInfo); |
| + } |
| + } |
| +} |
| + |
| } // namespace WebCore |
| #endif // ENABLE(WEB_AUDIO) |