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