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