Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: Source/modules/webaudio/AudioNode.cpp

Issue 1214463003: Split "Online" and "Offline" AudioContext processing (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Bring to ToT Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/modules/webaudio/AudioNode.h ('k') | Source/modules/webaudio/AudioNodeInput.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 11 matching lines...) Expand all
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 #if ENABLE(WEB_AUDIO) 26 #if ENABLE(WEB_AUDIO)
27 #include "modules/webaudio/AudioNode.h" 27 #include "modules/webaudio/AudioNode.h"
28 28
29 #include "bindings/core/v8/ExceptionState.h" 29 #include "bindings/core/v8/ExceptionState.h"
30 #include "core/dom/ExceptionCode.h" 30 #include "core/dom/ExceptionCode.h"
31 #include "core/inspector/InstanceCounters.h" 31 #include "core/inspector/InstanceCounters.h"
32 #include "modules/webaudio/AudioContext.h" 32 #include "modules/webaudio/AbstractAudioContext.h"
33 #include "modules/webaudio/AudioNodeInput.h" 33 #include "modules/webaudio/AudioNodeInput.h"
34 #include "modules/webaudio/AudioNodeOutput.h" 34 #include "modules/webaudio/AudioNodeOutput.h"
35 #include "modules/webaudio/AudioParam.h" 35 #include "modules/webaudio/AudioParam.h"
36 #include "wtf/Atomics.h" 36 #include "wtf/Atomics.h"
37 #include "wtf/MainThread.h" 37 #include "wtf/MainThread.h"
38 38
39 #if DEBUG_AUDIONODE_REFERENCES 39 #if DEBUG_AUDIONODE_REFERENCES
40 #include <stdio.h> 40 #include <stdio.h>
41 #endif 41 #endif
42 42
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 output->dispose(); 106 output->dispose();
107 m_node = nullptr; 107 m_node = nullptr;
108 } 108 }
109 109
110 AudioNode* AudioHandler::node() const 110 AudioNode* AudioHandler::node() const
111 { 111 {
112 ASSERT(isMainThread()); 112 ASSERT(isMainThread());
113 return m_node; 113 return m_node;
114 } 114 }
115 115
116 AudioContext* AudioHandler::context() const 116 AbstractAudioContext* AudioHandler::context() const
117 { 117 {
118 return m_context; 118 return m_context;
119 } 119 }
120 120
121 String AudioHandler::nodeTypeName() const 121 String AudioHandler::nodeTypeName() const
122 { 122 {
123 switch (m_nodeType) { 123 switch (m_nodeType) {
124 case NodeTypeDestination: 124 case NodeTypeDestination:
125 return "AudioDestinationNode"; 125 return "AudioDestinationNode";
126 case NodeTypeOscillator: 126 case NodeTypeOscillator:
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 } 204 }
205 205
206 unsigned long AudioHandler::channelCount() 206 unsigned long AudioHandler::channelCount()
207 { 207 {
208 return m_channelCount; 208 return m_channelCount;
209 } 209 }
210 210
211 void AudioHandler::setChannelCount(unsigned long channelCount, ExceptionState& e xceptionState) 211 void AudioHandler::setChannelCount(unsigned long channelCount, ExceptionState& e xceptionState)
212 { 212 {
213 ASSERT(isMainThread()); 213 ASSERT(isMainThread());
214 AudioContext::AutoLocker locker(context()); 214 AbstractAudioContext::AutoLocker locker(context());
215 215
216 if (channelCount > 0 && channelCount <= AudioContext::maxNumberOfChannels()) { 216 if (channelCount > 0 && channelCount <= AbstractAudioContext::maxNumberOfCha nnels()) {
217 if (m_channelCount != channelCount) { 217 if (m_channelCount != channelCount) {
218 m_channelCount = channelCount; 218 m_channelCount = channelCount;
219 if (m_channelCountMode != Max) 219 if (m_channelCountMode != Max)
220 updateChannelsForInputs(); 220 updateChannelsForInputs();
221 } 221 }
222 } else { 222 } else {
223 exceptionState.throwDOMException( 223 exceptionState.throwDOMException(
224 NotSupportedError, 224 NotSupportedError,
225 ExceptionMessages::indexOutsideRange<unsigned long>( 225 ExceptionMessages::indexOutsideRange<unsigned long>(
226 "channel count", 226 "channel count",
227 channelCount, 227 channelCount,
228 1, 228 1,
229 ExceptionMessages::InclusiveBound, 229 ExceptionMessages::InclusiveBound,
230 AudioContext::maxNumberOfChannels(), 230 AbstractAudioContext::maxNumberOfChannels(),
231 ExceptionMessages::InclusiveBound)); 231 ExceptionMessages::InclusiveBound));
232 } 232 }
233 } 233 }
234 234
235 String AudioHandler::channelCountMode() 235 String AudioHandler::channelCountMode()
236 { 236 {
237 switch (m_channelCountMode) { 237 switch (m_channelCountMode) {
238 case Max: 238 case Max:
239 return "max"; 239 return "max";
240 case ClampedMax: 240 case ClampedMax:
241 return "clamped-max"; 241 return "clamped-max";
242 case Explicit: 242 case Explicit:
243 return "explicit"; 243 return "explicit";
244 } 244 }
245 ASSERT_NOT_REACHED(); 245 ASSERT_NOT_REACHED();
246 return ""; 246 return "";
247 } 247 }
248 248
249 void AudioHandler::setChannelCountMode(const String& mode, ExceptionState& excep tionState) 249 void AudioHandler::setChannelCountMode(const String& mode, ExceptionState& excep tionState)
250 { 250 {
251 ASSERT(isMainThread()); 251 ASSERT(isMainThread());
252 AudioContext::AutoLocker locker(context()); 252 AbstractAudioContext::AutoLocker locker(context());
253 253
254 ChannelCountMode oldMode = m_channelCountMode; 254 ChannelCountMode oldMode = m_channelCountMode;
255 255
256 if (mode == "max") { 256 if (mode == "max") {
257 m_newChannelCountMode = Max; 257 m_newChannelCountMode = Max;
258 } else if (mode == "clamped-max") { 258 } else if (mode == "clamped-max") {
259 m_newChannelCountMode = ClampedMax; 259 m_newChannelCountMode = ClampedMax;
260 } else if (mode == "explicit") { 260 } else if (mode == "explicit") {
261 m_newChannelCountMode = Explicit; 261 m_newChannelCountMode = Explicit;
262 } else { 262 } else {
(...skipping 12 matching lines...) Expand all
275 case AudioBus::Discrete: 275 case AudioBus::Discrete:
276 return "discrete"; 276 return "discrete";
277 } 277 }
278 ASSERT_NOT_REACHED(); 278 ASSERT_NOT_REACHED();
279 return ""; 279 return "";
280 } 280 }
281 281
282 void AudioHandler::setChannelInterpretation(const String& interpretation, Except ionState& exceptionState) 282 void AudioHandler::setChannelInterpretation(const String& interpretation, Except ionState& exceptionState)
283 { 283 {
284 ASSERT(isMainThread()); 284 ASSERT(isMainThread());
285 AudioContext::AutoLocker locker(context()); 285 AbstractAudioContext::AutoLocker locker(context());
286 286
287 if (interpretation == "speakers") { 287 if (interpretation == "speakers") {
288 m_channelInterpretation = AudioBus::Speakers; 288 m_channelInterpretation = AudioBus::Speakers;
289 } else if (interpretation == "discrete") { 289 } else if (interpretation == "discrete") {
290 m_channelInterpretation = AudioBus::Discrete; 290 m_channelInterpretation = AudioBus::Discrete;
291 } else { 291 } else {
292 ASSERT_NOT_REACHED(); 292 ASSERT_NOT_REACHED();
293 } 293 }
294 } 294 }
295 295
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 void AudioHandler::unsilenceOutputs() 383 void AudioHandler::unsilenceOutputs()
384 { 384 {
385 for (auto& output : m_outputs) 385 for (auto& output : m_outputs)
386 output->bus()->clearSilentFlag(); 386 output->bus()->clearSilentFlag();
387 } 387 }
388 388
389 void AudioHandler::enableOutputsIfNecessary() 389 void AudioHandler::enableOutputsIfNecessary()
390 { 390 {
391 if (m_isDisabled && m_connectionRefCount > 0) { 391 if (m_isDisabled && m_connectionRefCount > 0) {
392 ASSERT(isMainThread()); 392 ASSERT(isMainThread());
393 AudioContext::AutoLocker locker(context()); 393 AbstractAudioContext::AutoLocker locker(context());
394 394
395 m_isDisabled = false; 395 m_isDisabled = false;
396 for (auto& output : m_outputs) 396 for (auto& output : m_outputs)
397 output->enable(); 397 output->enable();
398 } 398 }
399 } 399 }
400 400
401 void AudioHandler::disableOutputsIfNecessary() 401 void AudioHandler::disableOutputsIfNecessary()
402 { 402 {
403 // Disable outputs if appropriate. We do this if the number of connections i s 0 or 1. The case 403 // Disable outputs if appropriate. We do this if the number of connections i s 0 or 1. The case
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
506 unsigned AudioHandler::numberOfOutputChannels() const 506 unsigned AudioHandler::numberOfOutputChannels() const
507 { 507 {
508 // This should only be called for ScriptProcessorNodes which are the only no des where you can 508 // This should only be called for ScriptProcessorNodes which are the only no des where you can
509 // have an output with 0 channels. All other nodes have have at least one o utput channel, so 509 // have an output with 0 channels. All other nodes have have at least one o utput channel, so
510 // there's no reason other nodes should ever call this function. 510 // there's no reason other nodes should ever call this function.
511 ASSERT_WITH_MESSAGE(1, "numberOfOutputChannels() not valid for node type %d" , nodeType()); 511 ASSERT_WITH_MESSAGE(1, "numberOfOutputChannels() not valid for node type %d" , nodeType());
512 return 1; 512 return 1;
513 } 513 }
514 // ---------------------------------------------------------------- 514 // ----------------------------------------------------------------
515 515
516 AudioNode::AudioNode(AudioContext& context) 516 AudioNode::AudioNode(AbstractAudioContext& context)
517 : m_context(context) 517 : m_context(context)
518 , m_handler(nullptr) 518 , m_handler(nullptr)
519 { 519 {
520 ThreadState::current()->registerPreFinalizer(this); 520 ThreadState::current()->registerPreFinalizer(this);
521 } 521 }
522 522
523 void AudioNode::dispose() 523 void AudioNode::dispose()
524 { 524 {
525 ASSERT(isMainThread()); 525 ASSERT(isMainThread());
526 AudioContext::AutoLocker locker(context()); 526 AbstractAudioContext::AutoLocker locker(context());
527 handler().dispose(); 527 handler().dispose();
528 if (context()->contextState() == AudioContext::Running) 528 if (context()->contextState() == AbstractAudioContext::Running)
529 context()->deferredTaskHandler().addRenderingOrphanHandler(m_handler.rel ease()); 529 context()->deferredTaskHandler().addRenderingOrphanHandler(m_handler.rel ease());
530 } 530 }
531 531
532 void AudioNode::setHandler(PassRefPtr<AudioHandler> handler) 532 void AudioNode::setHandler(PassRefPtr<AudioHandler> handler)
533 { 533 {
534 ASSERT(handler); 534 ASSERT(handler);
535 m_handler = handler; 535 m_handler = handler;
536 } 536 }
537 537
538 AudioHandler& AudioNode::handler() const 538 AudioHandler& AudioNode::handler() const
539 { 539 {
540 return *m_handler; 540 return *m_handler;
541 } 541 }
542 542
543 DEFINE_TRACE(AudioNode) 543 DEFINE_TRACE(AudioNode)
544 { 544 {
545 visitor->trace(m_context); 545 visitor->trace(m_context);
546 visitor->trace(m_connectedNodes); 546 visitor->trace(m_connectedNodes);
547 visitor->trace(m_connectedParams); 547 visitor->trace(m_connectedParams);
548 RefCountedGarbageCollectedEventTargetWithInlineData<AudioNode>::trace(visito r); 548 RefCountedGarbageCollectedEventTargetWithInlineData<AudioNode>::trace(visito r);
549 } 549 }
550 550
551 AudioContext* AudioNode::context() const 551 AbstractAudioContext* AudioNode::context() const
552 { 552 {
553 return m_context; 553 return m_context;
554 } 554 }
555 555
556 void AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned i nputIndex, ExceptionState& exceptionState) 556 void AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsigned i nputIndex, ExceptionState& exceptionState)
557 { 557 {
558 ASSERT(isMainThread()); 558 ASSERT(isMainThread());
559 AudioContext::AutoLocker locker(context()); 559 AbstractAudioContext::AutoLocker locker(context());
560 560
561 if (context()->isContextClosed()) { 561 if (context()->isContextClosed()) {
562 exceptionState.throwDOMException( 562 exceptionState.throwDOMException(
563 InvalidStateError, 563 InvalidStateError,
564 "Cannot connect after the context has been closed."); 564 "Cannot connect after the context has been closed.");
565 return; 565 return;
566 } 566 }
567 567
568 if (!destination) { 568 if (!destination) {
569 exceptionState.throwDOMException( 569 exceptionState.throwDOMException(
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 m_connectedNodes[outputIndex] = new HeapHashSet<Member<AudioNode>>(); 609 m_connectedNodes[outputIndex] = new HeapHashSet<Member<AudioNode>>();
610 m_connectedNodes[outputIndex]->add(destination); 610 m_connectedNodes[outputIndex]->add(destination);
611 611
612 // Let context know that a connection has been made. 612 // Let context know that a connection has been made.
613 context()->incrementConnectionCount(); 613 context()->incrementConnectionCount();
614 } 614 }
615 615
616 void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState& exceptionState) 616 void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState& exceptionState)
617 { 617 {
618 ASSERT(isMainThread()); 618 ASSERT(isMainThread());
619 AudioContext::AutoLocker locker(context()); 619 AbstractAudioContext::AutoLocker locker(context());
620 620
621 if (context()->isContextClosed()) { 621 if (context()->isContextClosed()) {
622 exceptionState.throwDOMException( 622 exceptionState.throwDOMException(
623 InvalidStateError, 623 InvalidStateError,
624 "Cannot connect after the context has been closed."); 624 "Cannot connect after the context has been closed.");
625 return; 625 return;
626 } 626 }
627 627
628 if (!param) { 628 if (!param) {
629 exceptionState.throwDOMException( 629 exceptionState.throwDOMException(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
676 if (!output.isConnectedToAudioParam(param.handler())) 676 if (!output.isConnectedToAudioParam(param.handler()))
677 return false; 677 return false;
678 output.disconnectAudioParam(param.handler()); 678 output.disconnectAudioParam(param.handler());
679 m_connectedParams[outputIndex]->remove(&param); 679 m_connectedParams[outputIndex]->remove(&param);
680 return true; 680 return true;
681 } 681 }
682 682
683 void AudioNode::disconnect() 683 void AudioNode::disconnect()
684 { 684 {
685 ASSERT(isMainThread()); 685 ASSERT(isMainThread());
686 AudioContext::AutoLocker locker(context()); 686 AbstractAudioContext::AutoLocker locker(context());
687 687
688 // Disconnect all outgoing connections. 688 // Disconnect all outgoing connections.
689 for (unsigned i = 0; i < numberOfOutputs(); ++i) 689 for (unsigned i = 0; i < numberOfOutputs(); ++i)
690 disconnectAllFromOutput(i); 690 disconnectAllFromOutput(i);
691 } 691 }
692 692
693 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) 693 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState)
694 { 694 {
695 ASSERT(isMainThread()); 695 ASSERT(isMainThread());
696 AudioContext::AutoLocker locker(context()); 696 AbstractAudioContext::AutoLocker locker(context());
697 697
698 // Sanity check on the output index. 698 // Sanity check on the output index.
699 if (outputIndex >= numberOfOutputs()) { 699 if (outputIndex >= numberOfOutputs()) {
700 exceptionState.throwDOMException( 700 exceptionState.throwDOMException(
701 IndexSizeError, 701 IndexSizeError,
702 ExceptionMessages::indexOutsideRange( 702 ExceptionMessages::indexOutsideRange(
703 "output index", 703 "output index",
704 outputIndex, 704 outputIndex,
705 0u, 705 0u,
706 ExceptionMessages::InclusiveBound, 706 ExceptionMessages::InclusiveBound,
707 numberOfOutputs() - 1, 707 numberOfOutputs() - 1,
708 ExceptionMessages::InclusiveBound)); 708 ExceptionMessages::InclusiveBound));
709 return; 709 return;
710 } 710 }
711 // Disconnect all outgoing connections from the given output. 711 // Disconnect all outgoing connections from the given output.
712 disconnectAllFromOutput(outputIndex); 712 disconnectAllFromOutput(outputIndex);
713 } 713 }
714 714
715 void AudioNode::disconnect(AudioNode* destination, ExceptionState& exceptionStat e) 715 void AudioNode::disconnect(AudioNode* destination, ExceptionState& exceptionStat e)
716 { 716 {
717 ASSERT(isMainThread()); 717 ASSERT(isMainThread());
718 AudioContext::AutoLocker locker(context()); 718 AbstractAudioContext::AutoLocker locker(context());
719 719
720 unsigned numberOfDisconnections = 0; 720 unsigned numberOfDisconnections = 0;
721 721
722 // FIXME: Can this be optimized? ChannelSplitter and ChannelMerger can have 722 // FIXME: Can this be optimized? ChannelSplitter and ChannelMerger can have
723 // 32 ports and that requires 1024 iterations to validate entire connections . 723 // 32 ports and that requires 1024 iterations to validate entire connections .
724 for (unsigned outputIndex = 0; outputIndex < numberOfOutputs(); ++outputInde x) { 724 for (unsigned outputIndex = 0; outputIndex < numberOfOutputs(); ++outputInde x) {
725 for (unsigned inputIndex = 0; inputIndex < destination->handler().number OfInputs(); ++inputIndex) { 725 for (unsigned inputIndex = 0; inputIndex < destination->handler().number OfInputs(); ++inputIndex) {
726 if (disconnectFromOutputIfConnected(outputIndex, *destination, input Index)) 726 if (disconnectFromOutputIfConnected(outputIndex, *destination, input Index))
727 numberOfDisconnections++; 727 numberOfDisconnections++;
728 } 728 }
729 } 729 }
730 730
731 // If there is no connection to the destination, throw an exception. 731 // If there is no connection to the destination, throw an exception.
732 if (numberOfDisconnections == 0) { 732 if (numberOfDisconnections == 0) {
733 exceptionState.throwDOMException( 733 exceptionState.throwDOMException(
734 InvalidAccessError, 734 InvalidAccessError,
735 "the given destination is not connected."); 735 "the given destination is not connected.");
736 return; 736 return;
737 } 737 }
738 } 738 }
739 739
740 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, Excepti onState& exceptionState) 740 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, Excepti onState& exceptionState)
741 { 741 {
742 ASSERT(isMainThread()); 742 ASSERT(isMainThread());
743 AudioContext::AutoLocker locker(context()); 743 AbstractAudioContext::AutoLocker locker(context());
744 744
745 if (outputIndex >= numberOfOutputs()) { 745 if (outputIndex >= numberOfOutputs()) {
746 // The output index is out of range. Throw an exception. 746 // The output index is out of range. Throw an exception.
747 exceptionState.throwDOMException( 747 exceptionState.throwDOMException(
748 IndexSizeError, 748 IndexSizeError,
749 ExceptionMessages::indexOutsideRange( 749 ExceptionMessages::indexOutsideRange(
750 "output index", 750 "output index",
751 outputIndex, 751 outputIndex,
752 0u, 752 0u,
753 ExceptionMessages::InclusiveBound, 753 ExceptionMessages::InclusiveBound,
(...skipping 14 matching lines...) Expand all
768 if (numberOfDisconnections == 0) { 768 if (numberOfDisconnections == 0) {
769 exceptionState.throwDOMException( 769 exceptionState.throwDOMException(
770 InvalidAccessError, 770 InvalidAccessError,
771 "output (" + String::number(outputIndex) + ") is not connected to th e given destination."); 771 "output (" + String::number(outputIndex) + ") is not connected to th e given destination.");
772 } 772 }
773 } 773 }
774 774
775 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, unsigne d inputIndex, ExceptionState& exceptionState) 775 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, unsigne d inputIndex, ExceptionState& exceptionState)
776 { 776 {
777 ASSERT(isMainThread()); 777 ASSERT(isMainThread());
778 AudioContext::AutoLocker locker(context()); 778 AbstractAudioContext::AutoLocker locker(context());
779 779
780 if (outputIndex >= numberOfOutputs()) { 780 if (outputIndex >= numberOfOutputs()) {
781 exceptionState.throwDOMException( 781 exceptionState.throwDOMException(
782 IndexSizeError, 782 IndexSizeError,
783 ExceptionMessages::indexOutsideRange( 783 ExceptionMessages::indexOutsideRange(
784 "output index", 784 "output index",
785 outputIndex, 785 outputIndex,
786 0u, 786 0u,
787 ExceptionMessages::InclusiveBound, 787 ExceptionMessages::InclusiveBound,
788 numberOfOutputs() - 1, 788 numberOfOutputs() - 1,
(...skipping 19 matching lines...) Expand all
808 exceptionState.throwDOMException( 808 exceptionState.throwDOMException(
809 InvalidAccessError, 809 InvalidAccessError,
810 "output (" + String::number(outputIndex) + ") is not connected to th e input (" + String::number(inputIndex) + ") of the destination."); 810 "output (" + String::number(outputIndex) + ") is not connected to th e input (" + String::number(inputIndex) + ") of the destination.");
811 return; 811 return;
812 } 812 }
813 } 813 }
814 814
815 void AudioNode::disconnect(AudioParam* destinationParam, ExceptionState& excepti onState) 815 void AudioNode::disconnect(AudioParam* destinationParam, ExceptionState& excepti onState)
816 { 816 {
817 ASSERT(isMainThread()); 817 ASSERT(isMainThread());
818 AudioContext::AutoLocker locker(context()); 818 AbstractAudioContext::AutoLocker locker(context());
819 819
820 // The number of disconnection made. 820 // The number of disconnection made.
821 unsigned numberOfDisconnections = 0; 821 unsigned numberOfDisconnections = 0;
822 822
823 // Check if the node output is connected the destination AudioParam. 823 // Check if the node output is connected the destination AudioParam.
824 // Disconnect if connected and increase |numberOfDisconnectios| by 1. 824 // Disconnect if connected and increase |numberOfDisconnectios| by 1.
825 for (unsigned outputIndex = 0; outputIndex < handler().numberOfOutputs(); ++ outputIndex) { 825 for (unsigned outputIndex = 0; outputIndex < handler().numberOfOutputs(); ++ outputIndex) {
826 if (disconnectFromOutputIfConnected(outputIndex, *destinationParam)) 826 if (disconnectFromOutputIfConnected(outputIndex, *destinationParam))
827 numberOfDisconnections++; 827 numberOfDisconnections++;
828 } 828 }
829 829
830 // Throw an exception when there is no valid connection to the destination. 830 // Throw an exception when there is no valid connection to the destination.
831 if (numberOfDisconnections == 0) { 831 if (numberOfDisconnections == 0) {
832 exceptionState.throwDOMException( 832 exceptionState.throwDOMException(
833 InvalidAccessError, 833 InvalidAccessError,
834 "the given AudioParam is not connected."); 834 "the given AudioParam is not connected.");
835 return; 835 return;
836 } 836 }
837 } 837 }
838 838
839 void AudioNode::disconnect(AudioParam* destinationParam, unsigned outputIndex, E xceptionState& exceptionState) 839 void AudioNode::disconnect(AudioParam* destinationParam, unsigned outputIndex, E xceptionState& exceptionState)
840 { 840 {
841 ASSERT(isMainThread()); 841 ASSERT(isMainThread());
842 AudioContext::AutoLocker locker(context()); 842 AbstractAudioContext::AutoLocker locker(context());
843 843
844 if (outputIndex >= handler().numberOfOutputs()) { 844 if (outputIndex >= handler().numberOfOutputs()) {
845 // The output index is out of range. Throw an exception. 845 // The output index is out of range. Throw an exception.
846 exceptionState.throwDOMException( 846 exceptionState.throwDOMException(
847 IndexSizeError, 847 IndexSizeError,
848 ExceptionMessages::indexOutsideRange( 848 ExceptionMessages::indexOutsideRange(
849 "output index", 849 "output index",
850 outputIndex, 850 outputIndex,
851 0u, 851 0u,
852 ExceptionMessages::InclusiveBound, 852 ExceptionMessages::InclusiveBound,
853 numberOfOutputs() - 1, 853 numberOfOutputs() - 1,
854 ExceptionMessages::InclusiveBound)); 854 ExceptionMessages::InclusiveBound));
855 return; 855 return;
856 } 856 }
857 857
858 // If the output index is valid, proceed to disconnect. 858 // If the output index is valid, proceed to disconnect.
859 if (!disconnectFromOutputIfConnected(outputIndex, *destinationParam)) { 859 if (!disconnectFromOutputIfConnected(outputIndex, *destinationParam)) {
860 exceptionState.throwDOMException( 860 exceptionState.throwDOMException(
861 InvalidAccessError, 861 InvalidAccessError,
862 "specified destination AudioParam and node output (" + String::numbe r(outputIndex) + ") are not connected."); 862 "specified destination AudioParam and node output (" + String::numbe r(outputIndex) + ") are not connected.");
863 return; 863 return;
864 } 864 }
865 } 865 }
866 866
867 void AudioNode::disconnectWithoutException(unsigned outputIndex) 867 void AudioNode::disconnectWithoutException(unsigned outputIndex)
868 { 868 {
869 ASSERT(isMainThread()); 869 ASSERT(isMainThread());
870 AudioContext::AutoLocker locker(context()); 870 AbstractAudioContext::AutoLocker locker(context());
871 871
872 // Sanity check input and output indices. 872 // Sanity check input and output indices.
873 if (outputIndex >= handler().numberOfOutputs()) 873 if (outputIndex >= handler().numberOfOutputs())
874 return; 874 return;
875 disconnectAllFromOutput(outputIndex); 875 disconnectAllFromOutput(outputIndex);
876 } 876 }
877 877
878 unsigned AudioNode::numberOfInputs() const 878 unsigned AudioNode::numberOfInputs() const
879 { 879 {
880 return handler().numberOfInputs(); 880 return handler().numberOfInputs();
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 { 929 {
930 m_connectedNodes.append(nullptr); 930 m_connectedNodes.append(nullptr);
931 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedNodes.size()); 931 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedNodes.size());
932 m_connectedParams.append(nullptr); 932 m_connectedParams.append(nullptr);
933 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedParams.size()); 933 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedParams.size());
934 } 934 }
935 935
936 } // namespace blink 936 } // namespace blink
937 937
938 #endif // ENABLE(WEB_AUDIO) 938 #endif // ENABLE(WEB_AUDIO)
OLDNEW
« no previous file with comments | « Source/modules/webaudio/AudioNode.h ('k') | Source/modules/webaudio/AudioNodeInput.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698