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 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
270 if (context() != param->context()) { | 270 if (context() != param->context()) { |
271 exceptionState.throwDOMException( | 271 exceptionState.throwDOMException( |
272 SyntaxError, | 272 SyntaxError, |
273 "cannot connect to an AudioParam belonging to a different audio cont ext."); | 273 "cannot connect to an AudioParam belonging to a different audio cont ext."); |
274 return; | 274 return; |
275 } | 275 } |
276 | 276 |
277 param->connect(*output(outputIndex)); | 277 param->connect(*output(outputIndex)); |
278 } | 278 } |
279 | 279 |
280 void AudioNode::disconnect() | |
281 { | |
282 ASSERT(isMainThread()); | |
283 AudioContext::AutoLocker locker(context()); | |
284 | |
285 // Disconnect all outgoing connections. | |
286 for (unsigned i = 0; i < numberOfOutputs(); ++i) | |
287 this->output(i)->disconnectAll(); | |
288 } | |
289 | |
280 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) | 290 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) |
281 { | 291 { |
282 ASSERT(isMainThread()); | 292 ASSERT(isMainThread()); |
283 AudioContext::AutoLocker locker(context()); | 293 AudioContext::AutoLocker locker(context()); |
284 | 294 |
295 // Sanity check on the output index. | |
296 if (outputIndex >= numberOfOutputs()) { | |
297 exceptionState.throwDOMException( | |
298 IndexSizeError, | |
299 ExceptionMessages::indexOutsideRange( | |
300 "output", | |
Raymond Toy
2015/02/12 19:45:53
Would the error message be better if you said "out
hongchan
2015/02/13 01:16:57
I went back and forth on this one. Now the whole m
| |
301 outputIndex, | |
302 0u, | |
303 ExceptionMessages::InclusiveBound, | |
304 numberOfOutputs(), | |
305 ExceptionMessages::InclusiveBound)); | |
306 return; | |
307 } | |
308 | |
309 // Disconnect all outgoing connections from the given output. | |
310 AudioNodeOutput* output = this->output(outputIndex); | |
311 output->disconnectAll(); | |
312 } | |
313 | |
314 void AudioNode::disconnect(AudioNode* destination, ExceptionState& exceptionStat e) | |
315 { | |
316 ASSERT(isMainThread()); | |
317 AudioContext::AutoLocker locker(context()); | |
318 | |
319 unsigned numberOfDisconnections = 0; | |
320 | |
321 // FIXME: Can this be optimized? ChannelSplitter and ChannelMerger can have | |
322 // 32 ports and that requires 1024 iterations to validate entire connections . | |
323 for (unsigned i = 0; i < numberOfOutputs(); ++i) { | |
324 AudioNodeOutput* output = this->output(i); | |
325 for (unsigned j = 0; j < destination->numberOfInputs(); ++j) { | |
326 AudioNodeInput* input = destination->input(j); | |
327 if (output->isConnectedToInput(*input)) { | |
328 output->disconnectInput(*input); | |
329 numberOfDisconnections++; | |
330 } | |
331 } | |
332 } | |
333 | |
334 // If there is no connection to the destination, throw an exception. | |
335 if (numberOfDisconnections == 0) { | |
336 exceptionState.throwDOMException( | |
337 InvalidAccessError, | |
338 "the given destination is not connected."); | |
339 return; | |
340 } | |
341 } | |
342 | |
343 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, Excepti onState& exceptionState) | |
344 { | |
345 ASSERT(isMainThread()); | |
346 AudioContext::AutoLocker locker(context()); | |
347 | |
348 // Sanity check on output index. | |
349 if (outputIndex >= numberOfOutputs()) { | |
350 exceptionState.throwDOMException( | |
351 IndexSizeError, | |
352 ExceptionMessages::indexOutsideRange( | |
353 "output", | |
Raymond Toy
2015/02/12 19:45:53
Same comment as on line 300.
| |
354 outputIndex, | |
355 0u, | |
356 ExceptionMessages::InclusiveBound, | |
357 numberOfOutputs(), | |
358 ExceptionMessages::InclusiveBound)); | |
359 return; | |
360 } | |
361 | |
362 unsigned numberOfDisconnections = 0; | |
363 AudioNodeOutput* output = this->output(outputIndex); | |
364 | |
365 // Sanity check on destination inputs and disconnect when possible. | |
366 for (unsigned i = 0; i < destination->numberOfInputs(); ++i) { | |
367 AudioNodeInput* input = destination->input(i); | |
368 if (output->isConnectedToInput(*input)) { | |
369 output->disconnectInput(*input); | |
370 numberOfDisconnections++; | |
371 } | |
372 } | |
373 | |
374 // If there is no connection to the destination, throw an exception. | |
375 if (numberOfDisconnections == 0) { | |
376 exceptionState.throwDOMException( | |
377 InvalidAccessError, | |
378 "output (" + String::number(outputIndex) + ") is not connected to th e given destination."); | |
379 return; | |
380 } | |
381 } | |
382 | |
383 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, unsigne d inputIndex, ExceptionState& exceptionState) | |
384 { | |
385 ASSERT(isMainThread()); | |
386 AudioContext::AutoLocker locker(context()); | |
387 | |
285 // Sanity check input and output indices. | 388 // Sanity check input and output indices. |
286 if (outputIndex >= numberOfOutputs()) { | 389 if (outputIndex >= numberOfOutputs()) { |
287 exceptionState.throwDOMException( | 390 exceptionState.throwDOMException( |
288 IndexSizeError, | 391 IndexSizeError, |
289 "output index (" + String::number(outputIndex) + ") exceeds number o f outputs (" + String::number(numberOfOutputs()) + ")."); | 392 ExceptionMessages::indexOutsideRange( |
290 return; | 393 "output", |
291 } | 394 outputIndex, |
292 | 395 0u, |
293 AudioNodeOutput* output = this->output(outputIndex); | 396 ExceptionMessages::InclusiveBound, |
294 output->disconnectAll(); | 397 numberOfOutputs(), |
398 ExceptionMessages::InclusiveBound)); | |
399 return; | |
400 } | |
401 | |
402 if (inputIndex >= destination->numberOfInputs()) { | |
403 exceptionState.throwDOMException( | |
404 IndexSizeError, | |
405 ExceptionMessages::indexOutsideRange( | |
406 "input", | |
407 outputIndex, | |
408 0u, | |
409 ExceptionMessages::InclusiveBound, | |
410 destination->numberOfInputs(), | |
411 ExceptionMessages::InclusiveBound)); | |
412 return; | |
413 } | |
414 | |
415 AudioNodeOutput* output = this->output(outputIndex); | |
416 AudioNodeInput* input = destination->input(inputIndex); | |
417 | |
418 // Sanity check on the connection between the output and the destination inp ut. | |
419 if (!output->isConnectedToInput(*input)) { | |
420 exceptionState.throwDOMException( | |
421 InvalidAccessError, | |
422 "output (" + String::number(outputIndex) + ") is not connected to th e input (" + String::number(inputIndex) + ") of the destination."); | |
423 return; | |
424 } | |
425 | |
426 output->disconnectInput(*input); | |
427 } | |
428 | |
429 void AudioNode::disconnect(AudioParam* destinationParam, ExceptionState& excepti onState) | |
430 { | |
431 ASSERT(isMainThread()); | |
432 AudioContext::AutoLocker locker(context()); | |
433 | |
434 unsigned numberOfDisconnections = 0; | |
435 | |
436 for (unsigned i = 0; i < numberOfOutputs(); ++i) { | |
437 AudioNodeOutput* output = this->output(i); | |
438 if (output->isConnectedToAudioParam(*destinationParam)) { | |
439 output->disconnectAudioParam(*destinationParam); | |
440 numberOfDisconnections++; | |
441 } | |
442 } | |
443 | |
444 // Throw an exception when there is no valid connection to the destination. | |
445 if (numberOfDisconnections == 0) { | |
446 exceptionState.throwDOMException( | |
447 InvalidAccessError, | |
448 "the node and the given AudioParam are not connected."); | |
Raymond Toy
2015/02/12 19:45:53
Make this error message consistent with the error
hongchan
2015/02/13 01:16:57
Done.
| |
449 return; | |
450 } | |
451 } | |
452 | |
453 void AudioNode::disconnect(AudioParam* destinationParam, unsigned outputIndex, E xceptionState& exceptionState) | |
454 { | |
455 ASSERT(isMainThread()); | |
456 AudioContext::AutoLocker locker(context()); | |
457 | |
458 // Sanity check on the output index. | |
459 if (outputIndex >= numberOfOutputs()) { | |
460 exceptionState.throwDOMException( | |
461 IndexSizeError, | |
462 ExceptionMessages::indexOutsideRange( | |
463 "output", | |
464 outputIndex, | |
465 0u, | |
466 ExceptionMessages::InclusiveBound, | |
467 numberOfOutputs(), | |
468 ExceptionMessages::InclusiveBound)); | |
469 return; | |
470 } | |
471 | |
472 AudioNodeOutput* output = this->output(outputIndex); | |
473 | |
474 // Sanity check on the connection between the output and the destination. | |
475 if (!output->isConnectedToAudioParam(*destinationParam)) { | |
476 exceptionState.throwDOMException( | |
477 InvalidAccessError, | |
478 "specified destination AudioParam and node output (" + String::numbe r(outputIndex) + ") are not connected."); | |
479 return; | |
480 } | |
481 | |
482 output->disconnectAudioParam(*destinationParam); | |
295 } | 483 } |
296 | 484 |
297 void AudioNode::disconnectWithoutException(unsigned outputIndex) | 485 void AudioNode::disconnectWithoutException(unsigned outputIndex) |
298 { | 486 { |
299 ASSERT(isMainThread()); | 487 ASSERT(isMainThread()); |
300 AudioContext::AutoLocker locker(context()); | 488 AudioContext::AutoLocker locker(context()); |
301 | 489 |
302 // Sanity check input and output indices. | 490 // Sanity check input and output indices. |
303 if (outputIndex < numberOfOutputs()) { | 491 if (outputIndex < numberOfOutputs()) { |
304 AudioNodeOutput* output = this->output(outputIndex); | 492 AudioNodeOutput* output = this->output(outputIndex); |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
603 | 791 |
604 void AudioNode::updateChannelCountMode() | 792 void AudioNode::updateChannelCountMode() |
605 { | 793 { |
606 m_channelCountMode = m_newChannelCountMode; | 794 m_channelCountMode = m_newChannelCountMode; |
607 updateChannelsForInputs(); | 795 updateChannelsForInputs(); |
608 } | 796 } |
609 | 797 |
610 } // namespace blink | 798 } // namespace blink |
611 | 799 |
612 #endif // ENABLE(WEB_AUDIO) | 800 #endif // ENABLE(WEB_AUDIO) |
OLD | NEW |