1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "config.h" 30 31 #if ENABLE(WEB_AUDIO) 32 33 #include "platform/audio/HRTFDatabaseLoader.h" 34 35 #include "platform/Task.h" 36 #include "public/platform/Platform.h" 37 #include "wtf/MainThread.h" 38 39 namespace WebCore { 40 41 // Singleton 42 HRTFDatabaseLoader::LoaderMap* HRTFDatabaseLoader::s_loaderMap = 0; 43 44 PassRefPtr<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(float sampleRate) 45 { 46 ASSERT(isMainThread()); 47 48 RefPtr<HRTFDatabaseLoader> loader; 49 50 if (!s_loaderMap) 51 s_loaderMap = adoptPtr(new LoaderMap()).leakPtr(); 52 53 loader = s_loaderMap->get(sampleRate); 54 if (loader) { 55 ASSERT(sampleRate == loader->databaseSampleRate()); 56 return loader; 57 } 58 59 loader = adoptRef(new HRTFDatabaseLoader(sampleRate)); 60 s_loaderMap->add(sampleRate, loader.get()); 61 62 loader->loadAsynchronously(); 63 64 return loader; 65 } 66 67 HRTFDatabaseLoader::HRTFDatabaseLoader(float sampleRate) 68 : m_databaseSampleRate(sampleRate) 69 { 70 ASSERT(isMainThread()); 71 } 72 73 HRTFDatabaseLoader::~HRTFDatabaseLoader() 74 { 75 ASSERT(isMainThread()); 76 77 waitForLoaderThreadCompletion(); 78 m_hrtfDatabase.clear(); 79 80 // Remove ourself from the map. 81 if (s_loaderMap) 82 s_loaderMap->remove(m_databaseSampleRate); 83 } 84 85 void HRTFDatabaseLoader::load() 86 { 87 ASSERT(!isMainThread()); 88 if (!m_hrtfDatabase) { 89 // Load the default HRTF database. 90 m_hrtfDatabase = HRTFDatabase::create(m_databaseSampleRate); 91 } 92 } 93 94 void HRTFDatabaseLoader::loadAsynchronously() 95 { 96 ASSERT(isMainThread()); 97 98 MutexLocker locker(m_threadLock); 99 100 if (!m_hrtfDatabase && !m_databaseLoaderThread) { 101 // Start the asynchronous database loading process. 102 m_databaseLoaderThread = adoptPtr(blink::Platform::current()->createThread("HRTF database loader")); 103 m_databaseLoaderThread->postTask(new Task(WTF::bind(&HRTFDatabaseLoader::load, this))); 104 } 105 } 106 107 bool HRTFDatabaseLoader::isLoaded() const 108 { 109 return m_hrtfDatabase; 110 } 111 112 void HRTFDatabaseLoader::waitForLoaderThreadCompletion() 113 { 114 MutexLocker locker(m_threadLock); 115 m_databaseLoaderThread.clear(); 116 } 117 118 } // namespace WebCore 119 120 #endif // ENABLE(WEB_AUDIO) 121