| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010, Google Inc. All rights reserved. | 2 * Copyright (C) 2010, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 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. | 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 23 */ | 23 */ |
| 24 | 24 |
| 25 #include "config.h" | 25 #include "config.h" |
| 26 | 26 |
| 27 #if ENABLE(WEB_AUDIO) | 27 #if ENABLE(WEB_AUDIO) |
| 28 | 28 |
| 29 #include "modules/webaudio/AudioNode.h" | 29 #include "modules/webaudio/AudioNode.h" |
| 30 | 30 |
| 31 #include "bindings/v8/ExceptionMessages.h" | |
| 32 #include "bindings/v8/ExceptionState.h" | 31 #include "bindings/v8/ExceptionState.h" |
| 33 #include "core/dom/ExceptionCode.h" | 32 #include "core/dom/ExceptionCode.h" |
| 34 #include "modules/webaudio/AudioContext.h" | 33 #include "modules/webaudio/AudioContext.h" |
| 35 #include "modules/webaudio/AudioNodeInput.h" | 34 #include "modules/webaudio/AudioNodeInput.h" |
| 36 #include "modules/webaudio/AudioNodeOutput.h" | 35 #include "modules/webaudio/AudioNodeOutput.h" |
| 37 #include "modules/webaudio/AudioParam.h" | 36 #include "modules/webaudio/AudioParam.h" |
| 38 #include "wtf/Atomics.h" | 37 #include "wtf/Atomics.h" |
| 39 #include "wtf/MainThread.h" | 38 #include "wtf/MainThread.h" |
| 40 | 39 |
| 41 #if DEBUG_AUDIONODE_REFERENCES | 40 #if DEBUG_AUDIONODE_REFERENCES |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 } | 170 } |
| 172 | 171 |
| 173 void AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned i
nputIndex, ExceptionState& exceptionState) | 172 void AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned i
nputIndex, ExceptionState& exceptionState) |
| 174 { | 173 { |
| 175 ASSERT(isMainThread()); | 174 ASSERT(isMainThread()); |
| 176 AudioContext::AutoLocker locker(context()); | 175 AudioContext::AutoLocker locker(context()); |
| 177 | 176 |
| 178 if (!destination) { | 177 if (!destination) { |
| 179 exceptionState.throwDOMException( | 178 exceptionState.throwDOMException( |
| 180 SyntaxError, | 179 SyntaxError, |
| 181 ExceptionMessages::failedToExecute( | 180 "invalid destination node."); |
| 182 "connect", | |
| 183 "AudioNode", | |
| 184 "invalid destination node.")); | |
| 185 return; | 181 return; |
| 186 } | 182 } |
| 187 | 183 |
| 188 // Sanity check input and output indices. | 184 // Sanity check input and output indices. |
| 189 if (outputIndex >= numberOfOutputs()) { | 185 if (outputIndex >= numberOfOutputs()) { |
| 190 exceptionState.throwDOMException( | 186 exceptionState.throwDOMException( |
| 191 IndexSizeError, | 187 IndexSizeError, |
| 192 ExceptionMessages::failedToExecute( | 188 "output index (" + String::number(outputIndex) + ") exceeds number o
f outputs (" + String::number(numberOfOutputs()) + ")."); |
| 193 "connect", | |
| 194 "AudioNode", | |
| 195 "output index (" + String::number(outputIndex) + ") exceeds numb
er of outputs (" + String::number(numberOfOutputs()) + ").")); | |
| 196 return; | 189 return; |
| 197 } | 190 } |
| 198 | 191 |
| 199 if (destination && inputIndex >= destination->numberOfInputs()) { | 192 if (destination && inputIndex >= destination->numberOfInputs()) { |
| 200 exceptionState.throwDOMException( | 193 exceptionState.throwDOMException( |
| 201 IndexSizeError, | 194 IndexSizeError, |
| 202 ExceptionMessages::failedToExecute( | 195 "input index (" + String::number(inputIndex) + ") exceeds number of
inputs (" + String::number(destination->numberOfInputs()) + ")."); |
| 203 "connect", | |
| 204 "AudioNode", | |
| 205 "input index (" + String::number(inputIndex) + ") exceeds number
of inputs (" + String::number(destination->numberOfInputs()) + ").")); | |
| 206 return; | 196 return; |
| 207 } | 197 } |
| 208 | 198 |
| 209 if (context() != destination->context()) { | 199 if (context() != destination->context()) { |
| 210 exceptionState.throwDOMException( | 200 exceptionState.throwDOMException( |
| 211 SyntaxError, | 201 SyntaxError, |
| 212 ExceptionMessages::failedToExecute( | 202 "cannot connect to a destination belonging to a different audio cont
ext."); |
| 213 "connect", | |
| 214 "AudioNode", | |
| 215 "cannot connect to a destination belonging to a different audio
context.")); | |
| 216 return; | 203 return; |
| 217 } | 204 } |
| 218 | 205 |
| 219 AudioNodeInput* input = destination->input(inputIndex); | 206 AudioNodeInput* input = destination->input(inputIndex); |
| 220 AudioNodeOutput* output = this->output(outputIndex); | 207 AudioNodeOutput* output = this->output(outputIndex); |
| 221 input->connect(output); | 208 input->connect(output); |
| 222 | 209 |
| 223 // Let context know that a connection has been made. | 210 // Let context know that a connection has been made. |
| 224 context()->incrementConnectionCount(); | 211 context()->incrementConnectionCount(); |
| 225 } | 212 } |
| 226 | 213 |
| 227 void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState&
exceptionState) | 214 void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState&
exceptionState) |
| 228 { | 215 { |
| 229 ASSERT(isMainThread()); | 216 ASSERT(isMainThread()); |
| 230 AudioContext::AutoLocker locker(context()); | 217 AudioContext::AutoLocker locker(context()); |
| 231 | 218 |
| 232 if (!param) { | 219 if (!param) { |
| 233 exceptionState.throwDOMException( | 220 exceptionState.throwDOMException( |
| 234 SyntaxError, | 221 SyntaxError, |
| 235 ExceptionMessages::failedToExecute( | 222 "invalid AudioParam."); |
| 236 "connect", | |
| 237 "AudioNode", | |
| 238 "invalid AudioParam.")); | |
| 239 return; | 223 return; |
| 240 } | 224 } |
| 241 | 225 |
| 242 if (outputIndex >= numberOfOutputs()) { | 226 if (outputIndex >= numberOfOutputs()) { |
| 243 exceptionState.throwDOMException( | 227 exceptionState.throwDOMException( |
| 244 IndexSizeError, | 228 IndexSizeError, |
| 245 ExceptionMessages::failedToExecute( | 229 "output index (" + String::number(outputIndex) + ") exceeds number o
f outputs (" + String::number(numberOfOutputs()) + ")."); |
| 246 "connect", | |
| 247 "AudioNode", | |
| 248 "output index (" + String::number(outputIndex) + ") exceeds numb
er of outputs (" + String::number(numberOfOutputs()) + ").")); | |
| 249 return; | 230 return; |
| 250 } | 231 } |
| 251 | 232 |
| 252 if (context() != param->context()) { | 233 if (context() != param->context()) { |
| 253 exceptionState.throwDOMException( | 234 exceptionState.throwDOMException( |
| 254 SyntaxError, | 235 SyntaxError, |
| 255 ExceptionMessages::failedToExecute( | 236 "cannot connect to an AudioParam belonging to a different audio cont
ext."); |
| 256 "connect", | |
| 257 "AudioNode", | |
| 258 "cannot connect to an AudioParam belonging to a different audio
context.")); | |
| 259 return; | 237 return; |
| 260 } | 238 } |
| 261 | 239 |
| 262 AudioNodeOutput* output = this->output(outputIndex); | 240 AudioNodeOutput* output = this->output(outputIndex); |
| 263 param->connect(output); | 241 param->connect(output); |
| 264 } | 242 } |
| 265 | 243 |
| 266 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) | 244 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) |
| 267 { | 245 { |
| 268 ASSERT(isMainThread()); | 246 ASSERT(isMainThread()); |
| 269 AudioContext::AutoLocker locker(context()); | 247 AudioContext::AutoLocker locker(context()); |
| 270 | 248 |
| 271 // Sanity check input and output indices. | 249 // Sanity check input and output indices. |
| 272 if (outputIndex >= numberOfOutputs()) { | 250 if (outputIndex >= numberOfOutputs()) { |
| 273 exceptionState.throwDOMException( | 251 exceptionState.throwDOMException( |
| 274 IndexSizeError, | 252 IndexSizeError, |
| 275 ExceptionMessages::failedToExecute( | 253 "output index (" + String::number(outputIndex) + ") exceeds number o
f outputs (" + String::number(numberOfOutputs()) + ")."); |
| 276 "disconnect", | |
| 277 "AudioNode", | |
| 278 "output index (" + String::number(outputIndex) + ") exceeds numb
er of outputs (" + String::number(numberOfOutputs()) + ").")); | |
| 279 return; | 254 return; |
| 280 } | 255 } |
| 281 | 256 |
| 282 AudioNodeOutput* output = this->output(outputIndex); | 257 AudioNodeOutput* output = this->output(outputIndex); |
| 283 output->disconnectAll(); | 258 output->disconnectAll(); |
| 284 } | 259 } |
| 285 | 260 |
| 286 unsigned long AudioNode::channelCount() | 261 unsigned long AudioNode::channelCount() |
| 287 { | 262 { |
| 288 return m_channelCount; | 263 return m_channelCount; |
| 289 } | 264 } |
| 290 | 265 |
| 291 void AudioNode::setChannelCount(unsigned long channelCount, ExceptionState& exce
ptionState) | 266 void AudioNode::setChannelCount(unsigned long channelCount, ExceptionState& exce
ptionState) |
| 292 { | 267 { |
| 293 ASSERT(isMainThread()); | 268 ASSERT(isMainThread()); |
| 294 AudioContext::AutoLocker locker(context()); | 269 AudioContext::AutoLocker locker(context()); |
| 295 | 270 |
| 296 if (channelCount > 0 && channelCount <= AudioContext::maxNumberOfChannels())
{ | 271 if (channelCount > 0 && channelCount <= AudioContext::maxNumberOfChannels())
{ |
| 297 if (m_channelCount != channelCount) { | 272 if (m_channelCount != channelCount) { |
| 298 m_channelCount = channelCount; | 273 m_channelCount = channelCount; |
| 299 if (m_channelCountMode != Max) | 274 if (m_channelCountMode != Max) |
| 300 updateChannelsForInputs(); | 275 updateChannelsForInputs(); |
| 301 } | 276 } |
| 302 } else { | 277 } else { |
| 303 exceptionState.throwDOMException( | 278 exceptionState.throwDOMException( |
| 304 NotSupportedError, | 279 NotSupportedError, |
| 305 ExceptionMessages::failedToSet( | 280 "channel count (" + String::number(channelCount) + ") must be betwee
n 1 and " + String::number(AudioContext::maxNumberOfChannels()) + "."); |
| 306 "channelCount", | |
| 307 "AudioNode", | |
| 308 "channel count (" + String::number(channelCount) | |
| 309 + ") must be between 1 and " | |
| 310 + String::number(AudioContext::maxNumberOfChannels()) + ".")); | |
| 311 } | 281 } |
| 312 } | 282 } |
| 313 | 283 |
| 314 String AudioNode::channelCountMode() | 284 String AudioNode::channelCountMode() |
| 315 { | 285 { |
| 316 switch (m_channelCountMode) { | 286 switch (m_channelCountMode) { |
| 317 case Max: | 287 case Max: |
| 318 return "max"; | 288 return "max"; |
| 319 case ClampedMax: | 289 case ClampedMax: |
| 320 return "clamped-max"; | 290 return "clamped-max"; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 334 | 304 |
| 335 if (mode == "max") { | 305 if (mode == "max") { |
| 336 m_channelCountMode = Max; | 306 m_channelCountMode = Max; |
| 337 } else if (mode == "clamped-max") { | 307 } else if (mode == "clamped-max") { |
| 338 m_channelCountMode = ClampedMax; | 308 m_channelCountMode = ClampedMax; |
| 339 } else if (mode == "explicit") { | 309 } else if (mode == "explicit") { |
| 340 m_channelCountMode = Explicit; | 310 m_channelCountMode = Explicit; |
| 341 } else { | 311 } else { |
| 342 exceptionState.throwDOMException( | 312 exceptionState.throwDOMException( |
| 343 InvalidStateError, | 313 InvalidStateError, |
| 344 ExceptionMessages::failedToSet( | 314 "invalid mode '" + mode + "'; must be 'max', 'clamped-max', or 'expl
icit'."); |
| 345 "channelCountMode", | |
| 346 "AudioNode", | |
| 347 "invalid mode '" + mode + "'; must be 'max', 'clamped-max', or '
explicit'.")); | |
| 348 } | 315 } |
| 349 | 316 |
| 350 if (m_channelCountMode != oldMode) | 317 if (m_channelCountMode != oldMode) |
| 351 updateChannelsForInputs(); | 318 updateChannelsForInputs(); |
| 352 } | 319 } |
| 353 | 320 |
| 354 String AudioNode::channelInterpretation() | 321 String AudioNode::channelInterpretation() |
| 355 { | 322 { |
| 356 switch (m_channelInterpretation) { | 323 switch (m_channelInterpretation) { |
| 357 case AudioBus::Speakers: | 324 case AudioBus::Speakers: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 368 ASSERT(isMainThread()); | 335 ASSERT(isMainThread()); |
| 369 AudioContext::AutoLocker locker(context()); | 336 AudioContext::AutoLocker locker(context()); |
| 370 | 337 |
| 371 if (interpretation == "speakers") { | 338 if (interpretation == "speakers") { |
| 372 m_channelInterpretation = AudioBus::Speakers; | 339 m_channelInterpretation = AudioBus::Speakers; |
| 373 } else if (interpretation == "discrete") { | 340 } else if (interpretation == "discrete") { |
| 374 m_channelInterpretation = AudioBus::Discrete; | 341 m_channelInterpretation = AudioBus::Discrete; |
| 375 } else { | 342 } else { |
| 376 exceptionState.throwDOMException( | 343 exceptionState.throwDOMException( |
| 377 InvalidStateError, | 344 InvalidStateError, |
| 378 ExceptionMessages::failedToSet( | 345 "invalid interpretation '" + interpretation + "'; must be 'speakers'
or 'discrete'."); |
| 379 "channelInterpretation", | |
| 380 "AudioNode", | |
| 381 "invalid interpretation '" + interpretation + "'; must be 'speak
ers' or 'discrete'.")); | |
| 382 } | 346 } |
| 383 } | 347 } |
| 384 | 348 |
| 385 void AudioNode::updateChannelsForInputs() | 349 void AudioNode::updateChannelsForInputs() |
| 386 { | 350 { |
| 387 for (unsigned i = 0; i < m_inputs.size(); ++i) | 351 for (unsigned i = 0; i < m_inputs.size(); ++i) |
| 388 input(i)->changedOutputs(); | 352 input(i)->changedOutputs(); |
| 389 } | 353 } |
| 390 | 354 |
| 391 const AtomicString& AudioNode::interfaceName() const | 355 const AtomicString& AudioNode::interfaceName() const |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 fprintf(stderr, "%d: %d\n", i, s_nodeCount[i]); | 588 fprintf(stderr, "%d: %d\n", i, s_nodeCount[i]); |
| 625 | 589 |
| 626 fprintf(stderr, "===========================\n\n\n"); | 590 fprintf(stderr, "===========================\n\n\n"); |
| 627 } | 591 } |
| 628 | 592 |
| 629 #endif // DEBUG_AUDIONODE_REFERENCES | 593 #endif // DEBUG_AUDIONODE_REFERENCES |
| 630 | 594 |
| 631 } // namespace WebCore | 595 } // namespace WebCore |
| 632 | 596 |
| 633 #endif // ENABLE(WEB_AUDIO) | 597 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |