2 * Copyright (C) 2011, Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY
17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include "modules/webaudio/DefaultAudioDestinationNode.h"
31 #include "bindings/core/v8/ExceptionMessages.h"
32 #include "bindings/core/v8/ExceptionState.h"
33 #include "core/dom/ExceptionCode.h"
34 #include "platform/Logging.h"
35 #include "wtf/MainThread.h"
39 DefaultAudioDestinationNode::DefaultAudioDestinationNode(AudioContext* context)
40 : AudioDestinationNode(context, AudioDestination::hardwareSampleRate())
41 , m_numberOfInputChannels(0)
43 // Node-specific default mixing rules.
45 m_channelCountMode = Explicit;
46 m_channelInterpretation = AudioBus::Speakers;
49 DefaultAudioDestinationNode::~DefaultAudioDestinationNode()
51 ASSERT(!isInitialized());
54 void DefaultAudioDestinationNode::dispose()
57 AudioDestinationNode::dispose();
60 void DefaultAudioDestinationNode::initialize()
62 ASSERT(isMainThread());
67 AudioNode::initialize();
70 void DefaultAudioDestinationNode::uninitialize()
72 ASSERT(isMainThread());
76 m_destination->stop();
77 m_numberOfInputChannels = 0;
79 AudioNode::uninitialize();
82 void DefaultAudioDestinationNode::createDestination()
84 float hardwareSampleRate = AudioDestination::hardwareSampleRate();
85 WTF_LOG(WebAudio, ">>>> hardwareSampleRate = %f\n", hardwareSampleRate);
87 m_destination = AudioDestination::create(*this, m_inputDeviceId, m_numberOfInputChannels, channelCount(), hardwareSampleRate);
90 void DefaultAudioDestinationNode::startRendering()
92 ASSERT(isInitialized());
94 m_destination->start();
97 unsigned long DefaultAudioDestinationNode::maxChannelCount() const
99 return AudioDestination::maxChannelCount();
102 void DefaultAudioDestinationNode::setChannelCount(unsigned long channelCount, ExceptionState& exceptionState)
104 // The channelCount for the input to this node controls the actual number of channels we
105 // send to the audio hardware. It can only be set depending on the maximum number of
106 // channels supported by the hardware.
108 ASSERT(isMainThread());
110 if (!maxChannelCount() || channelCount > maxChannelCount()) {
111 exceptionState.throwDOMException(
113 ExceptionMessages::indexOutsideRange<unsigned>("channel count", channelCount, 1, ExceptionMessages::InclusiveBound, maxChannelCount(), ExceptionMessages::InclusiveBound));
117 unsigned long oldChannelCount = this->channelCount();
118 AudioNode::setChannelCount(channelCount, exceptionState);
120 if (!exceptionState.hadException() && this->channelCount() != oldChannelCount && isInitialized()) {
121 // Re-create destination.
122 m_destination->stop();
124 m_destination->start();
130 #endif // ENABLE(WEB_AUDIO)