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 39namespace WebCore { 40 41// Singleton 42HRTFDatabaseLoader::LoaderMap* HRTFDatabaseLoader::s_loaderMap = 0; 43 44PassRefPtr<HRTFDatabaseLoader> HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(float sampleRate) 45{ 46 ASSERT(isMainThread()); 47 48 if (!s_loaderMap) 49 s_loaderMap = adoptPtr(new LoaderMap()).leakPtr(); 50 51 RefPtr<HRTFDatabaseLoader> loader = s_loaderMap->get(sampleRate); 52 if (loader) { 53 ASSERT(sampleRate == loader->databaseSampleRate()); 54 return loader; 55 } 56 57 loader = adoptRef(new HRTFDatabaseLoader(sampleRate)); 58 s_loaderMap->add(sampleRate, loader.get()); 59 60 loader->loadAsynchronously(); 61 62 return loader; 63} 64 65HRTFDatabaseLoader::HRTFDatabaseLoader(float sampleRate) 66 : m_databaseSampleRate(sampleRate) 67{ 68 ASSERT(isMainThread()); 69} 70 71HRTFDatabaseLoader::~HRTFDatabaseLoader() 72{ 73 ASSERT(isMainThread()); 74 75 waitForLoaderThreadCompletion(); 76 m_hrtfDatabase.clear(); 77 78 // Remove ourself from the map. 79 if (s_loaderMap) 80 s_loaderMap->remove(m_databaseSampleRate); 81} 82 83void HRTFDatabaseLoader::load() 84{ 85 ASSERT(!isMainThread()); 86 if (!m_hrtfDatabase) { 87 // Load the default HRTF database. 88 m_hrtfDatabase = HRTFDatabase::create(m_databaseSampleRate); 89 } 90} 91 92void HRTFDatabaseLoader::loadAsynchronously() 93{ 94 ASSERT(isMainThread()); 95 96 MutexLocker locker(m_threadLock); 97 98 if (!m_hrtfDatabase && !m_databaseLoaderThread) { 99 // Start the asynchronous database loading process. 100 m_databaseLoaderThread = adoptPtr(blink::Platform::current()->createThread("HRTF database loader")); 101 m_databaseLoaderThread->postTask(new Task(WTF::bind(&HRTFDatabaseLoader::load, this))); 102 } 103} 104 105bool HRTFDatabaseLoader::isLoaded() const 106{ 107 return m_hrtfDatabase; 108} 109 110void HRTFDatabaseLoader::waitForLoaderThreadCompletion() 111{ 112 MutexLocker locker(m_threadLock); 113 m_databaseLoaderThread.clear(); 114} 115 116} // namespace WebCore 117 118#endif // ENABLE(WEB_AUDIO) 119