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

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

Issue 2159403002: Replace ASSERT with DCHECK in WebAudio (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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
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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 if (!s_isNodeCountInitialized) { 59 if (!s_isNodeCountInitialized) {
60 s_isNodeCountInitialized = true; 60 s_isNodeCountInitialized = true;
61 atexit(AudioHandler::printNodeCounts); 61 atexit(AudioHandler::printNodeCounts);
62 } 62 }
63 #endif 63 #endif
64 InstanceCounters::incrementCounter(InstanceCounters::AudioHandlerCounter); 64 InstanceCounters::incrementCounter(InstanceCounters::AudioHandlerCounter);
65 } 65 }
66 66
67 AudioHandler::~AudioHandler() 67 AudioHandler::~AudioHandler()
68 { 68 {
69 ASSERT(isMainThread()); 69 DCHECK(isMainThread());
70 // dispose() should be called. 70 // dispose() should be called.
71 ASSERT(!node()); 71 DCHECK(!node());
72 InstanceCounters::decrementCounter(InstanceCounters::AudioHandlerCounter); 72 InstanceCounters::decrementCounter(InstanceCounters::AudioHandlerCounter);
73 #if DEBUG_AUDIONODE_REFERENCES 73 #if DEBUG_AUDIONODE_REFERENCES
74 --s_nodeCount[getNodeType()]; 74 --s_nodeCount[getNodeType()];
75 fprintf(stderr, "%p: %2d: AudioNode::~AudioNode() %d [%d]\n", 75 fprintf(stderr, "%p: %2d: AudioNode::~AudioNode() %d [%d]\n",
76 this, getNodeType(), m_connectionRefCount, s_nodeCount[getNodeType()]); 76 this, getNodeType(), m_connectionRefCount, s_nodeCount[getNodeType()]);
77 #endif 77 #endif
78 } 78 }
79 79
80 void AudioHandler::initialize() 80 void AudioHandler::initialize()
81 { 81 {
82 m_isInitialized = true; 82 m_isInitialized = true;
83 } 83 }
84 84
85 void AudioHandler::uninitialize() 85 void AudioHandler::uninitialize()
86 { 86 {
87 m_isInitialized = false; 87 m_isInitialized = false;
88 } 88 }
89 89
90 void AudioHandler::clearInternalStateWhenDisabled() 90 void AudioHandler::clearInternalStateWhenDisabled()
91 { 91 {
92 } 92 }
93 93
94 void AudioHandler::dispose() 94 void AudioHandler::dispose()
95 { 95 {
96 ASSERT(isMainThread()); 96 DCHECK(isMainThread());
97 ASSERT(context()->isGraphOwner()); 97 ASSERT(context()->isGraphOwner());
98 98
99 context()->deferredTaskHandler().removeChangedChannelCountMode(this); 99 context()->deferredTaskHandler().removeChangedChannelCountMode(this);
100 context()->deferredTaskHandler().removeChangedChannelInterpretation(this); 100 context()->deferredTaskHandler().removeChangedChannelInterpretation(this);
101 context()->deferredTaskHandler().removeAutomaticPullNode(this); 101 context()->deferredTaskHandler().removeAutomaticPullNode(this);
102 for (auto& output : m_outputs) 102 for (auto& output : m_outputs)
103 output->dispose(); 103 output->dispose();
104 m_node = nullptr; 104 m_node = nullptr;
105 } 105 }
106 106
107 AudioNode* AudioHandler::node() const 107 AudioNode* AudioHandler::node() const
108 { 108 {
109 ASSERT(isMainThread()); 109 DCHECK(isMainThread());
110 return m_node; 110 return m_node;
111 } 111 }
112 112
113 BaseAudioContext* AudioHandler::context() const 113 BaseAudioContext* AudioHandler::context() const
114 { 114 {
115 return m_context; 115 return m_context;
116 } 116 }
117 117
118 String AudioHandler::nodeTypeName() const 118 String AudioHandler::nodeTypeName() const
119 { 119 {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 default: 159 default:
160 ASSERT_NOT_REACHED(); 160 ASSERT_NOT_REACHED();
161 return "UnknownNode"; 161 return "UnknownNode";
162 } 162 }
163 } 163 }
164 164
165 void AudioHandler::setNodeType(NodeType type) 165 void AudioHandler::setNodeType(NodeType type)
166 { 166 {
167 // Don't allow the node type to be changed to a different node type, after i t's already been 167 // Don't allow the node type to be changed to a different node type, after i t's already been
168 // set! And the new type can't be unknown or end! 168 // set! And the new type can't be unknown or end!
169 ASSERT(m_nodeType == NodeTypeUnknown); 169 DCHECK_EQ(m_nodeType, NodeTypeUnknown);
170 ASSERT(type != NodeTypeUnknown); 170 DCHECK_NE(type, NodeTypeUnknown);
171 ASSERT(type != NodeTypeEnd); 171 DCHECK_NE(type, NodeTypeEnd);
172 172
173 m_nodeType = type; 173 m_nodeType = type;
174 174
175 #if DEBUG_AUDIONODE_REFERENCES 175 #if DEBUG_AUDIONODE_REFERENCES
176 ++s_nodeCount[type]; 176 ++s_nodeCount[type];
177 fprintf(stderr, "%p: %2d: AudioNode::AudioNode [%3d]\n", this, getNodeType() , s_nodeCount[getNodeType()]); 177 fprintf(stderr, "%p: %2d: AudioNode::AudioNode [%3d]\n", this, getNodeType() , s_nodeCount[getNodeType()]);
178 #endif 178 #endif
179 } 179 }
180 180
181 void AudioHandler::addInput() 181 void AudioHandler::addInput()
182 { 182 {
183 m_inputs.append(AudioNodeInput::create(*this)); 183 m_inputs.append(AudioNodeInput::create(*this));
184 } 184 }
185 185
186 void AudioHandler::addOutput(unsigned numberOfChannels) 186 void AudioHandler::addOutput(unsigned numberOfChannels)
187 { 187 {
188 ASSERT(isMainThread()); 188 DCHECK(isMainThread());
189 m_outputs.append(AudioNodeOutput::create(this, numberOfChannels)); 189 m_outputs.append(AudioNodeOutput::create(this, numberOfChannels));
190 node()->didAddOutput(numberOfOutputs()); 190 node()->didAddOutput(numberOfOutputs());
191 } 191 }
192 192
193 AudioNodeInput& AudioHandler::input(unsigned i) 193 AudioNodeInput& AudioHandler::input(unsigned i)
194 { 194 {
195 return *m_inputs[i]; 195 return *m_inputs[i];
196 } 196 }
197 197
198 AudioNodeOutput& AudioHandler::output(unsigned i) 198 AudioNodeOutput& AudioHandler::output(unsigned i)
199 { 199 {
200 return *m_outputs[i]; 200 return *m_outputs[i];
201 } 201 }
202 202
203 unsigned long AudioHandler::channelCount() 203 unsigned long AudioHandler::channelCount()
204 { 204 {
205 return m_channelCount; 205 return m_channelCount;
206 } 206 }
207 207
208 void AudioHandler::setChannelCount(unsigned long channelCount, ExceptionState& e xceptionState) 208 void AudioHandler::setChannelCount(unsigned long channelCount, ExceptionState& e xceptionState)
209 { 209 {
210 ASSERT(isMainThread()); 210 DCHECK(isMainThread());
211 BaseAudioContext::AutoLocker locker(context()); 211 BaseAudioContext::AutoLocker locker(context());
212 212
213 if (channelCount > 0 && channelCount <= BaseAudioContext::maxNumberOfChannel s()) { 213 if (channelCount > 0 && channelCount <= BaseAudioContext::maxNumberOfChannel s()) {
214 if (m_channelCount != channelCount) { 214 if (m_channelCount != channelCount) {
215 m_channelCount = channelCount; 215 m_channelCount = channelCount;
216 if (m_channelCountMode != Max) 216 if (m_channelCountMode != Max)
217 updateChannelsForInputs(); 217 updateChannelsForInputs();
218 } 218 }
219 } else { 219 } else {
220 exceptionState.throwDOMException( 220 exceptionState.throwDOMException(
(...skipping 17 matching lines...) Expand all
238 return "clamped-max"; 238 return "clamped-max";
239 case Explicit: 239 case Explicit:
240 return "explicit"; 240 return "explicit";
241 } 241 }
242 ASSERT_NOT_REACHED(); 242 ASSERT_NOT_REACHED();
243 return ""; 243 return "";
244 } 244 }
245 245
246 void AudioHandler::setChannelCountMode(const String& mode, ExceptionState& excep tionState) 246 void AudioHandler::setChannelCountMode(const String& mode, ExceptionState& excep tionState)
247 { 247 {
248 ASSERT(isMainThread()); 248 DCHECK(isMainThread());
249 BaseAudioContext::AutoLocker locker(context()); 249 BaseAudioContext::AutoLocker locker(context());
250 250
251 ChannelCountMode oldMode = m_channelCountMode; 251 ChannelCountMode oldMode = m_channelCountMode;
252 252
253 if (mode == "max") { 253 if (mode == "max") {
254 m_newChannelCountMode = Max; 254 m_newChannelCountMode = Max;
255 } else if (mode == "clamped-max") { 255 } else if (mode == "clamped-max") {
256 m_newChannelCountMode = ClampedMax; 256 m_newChannelCountMode = ClampedMax;
257 } else if (mode == "explicit") { 257 } else if (mode == "explicit") {
258 m_newChannelCountMode = Explicit; 258 m_newChannelCountMode = Explicit;
(...skipping 12 matching lines...) Expand all
271 return "speakers"; 271 return "speakers";
272 case AudioBus::Discrete: 272 case AudioBus::Discrete:
273 return "discrete"; 273 return "discrete";
274 } 274 }
275 ASSERT_NOT_REACHED(); 275 ASSERT_NOT_REACHED();
276 return ""; 276 return "";
277 } 277 }
278 278
279 void AudioHandler::setChannelInterpretation(const String& interpretation, Except ionState& exceptionState) 279 void AudioHandler::setChannelInterpretation(const String& interpretation, Except ionState& exceptionState)
280 { 280 {
281 ASSERT(isMainThread()); 281 DCHECK(isMainThread());
282 BaseAudioContext::AutoLocker locker(context()); 282 BaseAudioContext::AutoLocker locker(context());
283 283
284 AudioBus::ChannelInterpretation oldMode = m_channelInterpretation; 284 AudioBus::ChannelInterpretation oldMode = m_channelInterpretation;
285 285
286 if (interpretation == "speakers") { 286 if (interpretation == "speakers") {
287 m_newChannelInterpretation = AudioBus::Speakers; 287 m_newChannelInterpretation = AudioBus::Speakers;
288 } else if (interpretation == "discrete") { 288 } else if (interpretation == "discrete") {
289 m_newChannelInterpretation = AudioBus::Discrete; 289 m_newChannelInterpretation = AudioBus::Discrete;
290 } else { 290 } else {
291 ASSERT_NOT_REACHED(); 291 ASSERT_NOT_REACHED();
292 } 292 }
293 293
294 if (m_newChannelInterpretation != oldMode) 294 if (m_newChannelInterpretation != oldMode)
295 context()->deferredTaskHandler().addChangedChannelInterpretation(this); 295 context()->deferredTaskHandler().addChangedChannelInterpretation(this);
296 } 296 }
297 297
298 void AudioHandler::updateChannelsForInputs() 298 void AudioHandler::updateChannelsForInputs()
299 { 299 {
300 for (auto& input : m_inputs) 300 for (auto& input : m_inputs)
301 input->changedOutputs(); 301 input->changedOutputs();
302 } 302 }
303 303
304 void AudioHandler::processIfNecessary(size_t framesToProcess) 304 void AudioHandler::processIfNecessary(size_t framesToProcess)
305 { 305 {
306 ASSERT(context()->isAudioThread()); 306 DCHECK(context()->isAudioThread());
307 307
308 if (!isInitialized()) 308 if (!isInitialized())
309 return; 309 return;
310 310
311 // Ensure that we only process once per rendering quantum. 311 // Ensure that we only process once per rendering quantum.
312 // This handles the "fanout" problem where an output is connected to multipl e inputs. 312 // This handles the "fanout" problem where an output is connected to multipl e inputs.
313 // The first time we're called during this time slice we process, but after that we don't want to re-process, 313 // The first time we're called during this time slice we process, but after that we don't want to re-process,
314 // instead our output(s) will already have the results cached in their bus; 314 // instead our output(s) will already have the results cached in their bus;
315 double currentTime = context()->currentTime(); 315 double currentTime = context()->currentTime();
316 if (m_lastProcessingTime != currentTime) { 316 if (m_lastProcessingTime != currentTime) {
(...skipping 12 matching lines...) Expand all
329 // to go silent and we want to propagate that hint to the downstream nodes! (For 329 // to go silent and we want to propagate that hint to the downstream nodes! (For
330 // example, a Gain node with a gain of 0 will want to silence its ou tput.) 330 // example, a Gain node with a gain of 0 will want to silence its ou tput.)
331 unsilenceOutputs(); 331 unsilenceOutputs();
332 process(framesToProcess); 332 process(framesToProcess);
333 } 333 }
334 } 334 }
335 } 335 }
336 336
337 void AudioHandler::checkNumberOfChannelsForInput(AudioNodeInput* input) 337 void AudioHandler::checkNumberOfChannelsForInput(AudioNodeInput* input)
338 { 338 {
339 ASSERT(context()->isAudioThread()); 339 DCHECK(context()->isAudioThread());
340 ASSERT(context()->isGraphOwner()); 340 ASSERT(context()->isGraphOwner());
341 341
342 ASSERT(m_inputs.contains(input)); 342 DCHECK(m_inputs.contains(input));
343 if (!m_inputs.contains(input)) 343 if (!m_inputs.contains(input))
344 return; 344 return;
345 345
346 input->updateInternalBus(); 346 input->updateInternalBus();
347 } 347 }
348 348
349 double AudioHandler::tailTime() const 349 double AudioHandler::tailTime() const
350 { 350 {
351 return 0; 351 return 0;
352 } 352 }
353 353
354 double AudioHandler::latencyTime() const 354 double AudioHandler::latencyTime() const
355 { 355 {
356 return 0; 356 return 0;
357 } 357 }
358 358
359 bool AudioHandler::propagatesSilence() const 359 bool AudioHandler::propagatesSilence() const
360 { 360 {
361 return m_lastNonSilentTime + latencyTime() + tailTime() < context()->current Time(); 361 return m_lastNonSilentTime + latencyTime() + tailTime() < context()->current Time();
362 } 362 }
363 363
364 void AudioHandler::pullInputs(size_t framesToProcess) 364 void AudioHandler::pullInputs(size_t framesToProcess)
365 { 365 {
366 ASSERT(context()->isAudioThread()); 366 DCHECK(context()->isAudioThread());
367 367
368 // Process all of the AudioNodes connected to our inputs. 368 // Process all of the AudioNodes connected to our inputs.
369 for (auto& input : m_inputs) 369 for (auto& input : m_inputs)
370 input->pull(0, framesToProcess); 370 input->pull(0, framesToProcess);
371 } 371 }
372 372
373 bool AudioHandler::inputsAreSilent() 373 bool AudioHandler::inputsAreSilent()
374 { 374 {
375 for (auto& input : m_inputs) { 375 for (auto& input : m_inputs) {
376 if (!input->bus()->isSilent()) 376 if (!input->bus()->isSilent())
(...skipping 10 matching lines...) Expand all
387 387
388 void AudioHandler::unsilenceOutputs() 388 void AudioHandler::unsilenceOutputs()
389 { 389 {
390 for (auto& output : m_outputs) 390 for (auto& output : m_outputs)
391 output->bus()->clearSilentFlag(); 391 output->bus()->clearSilentFlag();
392 } 392 }
393 393
394 void AudioHandler::enableOutputsIfNecessary() 394 void AudioHandler::enableOutputsIfNecessary()
395 { 395 {
396 if (m_isDisabled && m_connectionRefCount > 0) { 396 if (m_isDisabled && m_connectionRefCount > 0) {
397 ASSERT(isMainThread()); 397 DCHECK(isMainThread());
398 BaseAudioContext::AutoLocker locker(context()); 398 BaseAudioContext::AutoLocker locker(context());
399 399
400 m_isDisabled = false; 400 m_isDisabled = false;
401 for (auto& output : m_outputs) 401 for (auto& output : m_outputs)
402 output->enable(); 402 output->enable();
403 } 403 }
404 } 404 }
405 405
406 void AudioHandler::disableOutputsIfNecessary() 406 void AudioHandler::disableOutputsIfNecessary()
407 { 407 {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 context()->lock(); 461 context()->lock();
462 hasLock = true; 462 hasLock = true;
463 } 463 }
464 464
465 if (hasLock) { 465 if (hasLock) {
466 breakConnectionWithLock(); 466 breakConnectionWithLock();
467 context()->unlock(); 467 context()->unlock();
468 } else { 468 } else {
469 // We were unable to get the lock, so put this in a list to finish up 469 // We were unable to get the lock, so put this in a list to finish up
470 // later. 470 // later.
471 ASSERT(context()->isAudioThread()); 471 DCHECK(context()->isAudioThread());
472 context()->deferredTaskHandler().addDeferredBreakConnection(*this); 472 context()->deferredTaskHandler().addDeferredBreakConnection(*this);
473 } 473 }
474 } 474 }
475 475
476 void AudioHandler::breakConnectionWithLock() 476 void AudioHandler::breakConnectionWithLock()
477 { 477 {
478 atomicDecrement(&m_connectionRefCount); 478 atomicDecrement(&m_connectionRefCount);
479 479
480 #if DEBUG_AUDIONODE_REFERENCES 480 #if DEBUG_AUDIONODE_REFERENCES
481 fprintf(stderr, "%p: %2d: AudioNode::deref %3d [%3d]\n", 481 fprintf(stderr, "%p: %2d: AudioNode::deref %3d [%3d]\n",
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 529
530 AudioNode::AudioNode(BaseAudioContext& context) 530 AudioNode::AudioNode(BaseAudioContext& context)
531 : m_context(context) 531 : m_context(context)
532 , m_handler(nullptr) 532 , m_handler(nullptr)
533 { 533 {
534 ThreadState::current()->registerPreFinalizer(this); 534 ThreadState::current()->registerPreFinalizer(this);
535 } 535 }
536 536
537 void AudioNode::dispose() 537 void AudioNode::dispose()
538 { 538 {
539 ASSERT(isMainThread()); 539 DCHECK(isMainThread());
540 BaseAudioContext::AutoLocker locker(context()); 540 BaseAudioContext::AutoLocker locker(context());
541 handler().dispose(); 541 handler().dispose();
542 if (context()->contextState() == BaseAudioContext::Running) 542 if (context()->contextState() == BaseAudioContext::Running)
543 context()->deferredTaskHandler().addRenderingOrphanHandler(m_handler.rel ease()); 543 context()->deferredTaskHandler().addRenderingOrphanHandler(m_handler.rel ease());
544 } 544 }
545 545
546 void AudioNode::setHandler(PassRefPtr<AudioHandler> handler) 546 void AudioNode::setHandler(PassRefPtr<AudioHandler> handler)
547 { 547 {
548 ASSERT(handler); 548 DCHECK(handler);
549 m_handler = handler; 549 m_handler = handler;
550 } 550 }
551 551
552 AudioHandler& AudioNode::handler() const 552 AudioHandler& AudioNode::handler() const
553 { 553 {
554 return *m_handler; 554 return *m_handler;
555 } 555 }
556 556
557 DEFINE_TRACE(AudioNode) 557 DEFINE_TRACE(AudioNode)
558 { 558 {
559 visitor->trace(m_context); 559 visitor->trace(m_context);
560 visitor->trace(m_connectedNodes); 560 visitor->trace(m_connectedNodes);
561 visitor->trace(m_connectedParams); 561 visitor->trace(m_connectedParams);
562 EventTargetWithInlineData::trace(visitor); 562 EventTargetWithInlineData::trace(visitor);
563 } 563 }
564 564
565 BaseAudioContext* AudioNode::context() const 565 BaseAudioContext* AudioNode::context() const
566 { 566 {
567 return m_context; 567 return m_context;
568 } 568 }
569 569
570 AudioNode* AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsi gned inputIndex, ExceptionState& exceptionState) 570 AudioNode* AudioNode::connect(AudioNode* destination, unsigned outputIndex, unsi gned inputIndex, ExceptionState& exceptionState)
571 { 571 {
572 ASSERT(isMainThread()); 572 DCHECK(isMainThread());
573 BaseAudioContext::AutoLocker locker(context()); 573 BaseAudioContext::AutoLocker locker(context());
574 574
575 if (context()->isContextClosed()) { 575 if (context()->isContextClosed()) {
576 exceptionState.throwDOMException( 576 exceptionState.throwDOMException(
577 InvalidStateError, 577 InvalidStateError,
578 "Cannot connect after the context has been closed."); 578 "Cannot connect after the context has been closed.");
579 return nullptr; 579 return nullptr;
580 } 580 }
581 581
582 if (!destination) { 582 if (!destination) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 m_connectedNodes[outputIndex]->add(destination); 624 m_connectedNodes[outputIndex]->add(destination);
625 625
626 // Let context know that a connection has been made. 626 // Let context know that a connection has been made.
627 context()->incrementConnectionCount(); 627 context()->incrementConnectionCount();
628 628
629 return destination; 629 return destination;
630 } 630 }
631 631
632 void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState& exceptionState) 632 void AudioNode::connect(AudioParam* param, unsigned outputIndex, ExceptionState& exceptionState)
633 { 633 {
634 ASSERT(isMainThread()); 634 DCHECK(isMainThread());
635 BaseAudioContext::AutoLocker locker(context()); 635 BaseAudioContext::AutoLocker locker(context());
636 636
637 if (context()->isContextClosed()) { 637 if (context()->isContextClosed()) {
638 exceptionState.throwDOMException( 638 exceptionState.throwDOMException(
639 InvalidStateError, 639 InvalidStateError,
640 "Cannot connect after the context has been closed."); 640 "Cannot connect after the context has been closed.");
641 return; 641 return;
642 } 642 }
643 643
644 if (!param) { 644 if (!param) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 AudioNodeOutput& output = handler().output(outputIndex); 691 AudioNodeOutput& output = handler().output(outputIndex);
692 if (!output.isConnectedToAudioParam(param.handler())) 692 if (!output.isConnectedToAudioParam(param.handler()))
693 return false; 693 return false;
694 output.disconnectAudioParam(param.handler()); 694 output.disconnectAudioParam(param.handler());
695 m_connectedParams[outputIndex]->remove(&param); 695 m_connectedParams[outputIndex]->remove(&param);
696 return true; 696 return true;
697 } 697 }
698 698
699 void AudioNode::disconnect() 699 void AudioNode::disconnect()
700 { 700 {
701 ASSERT(isMainThread()); 701 DCHECK(isMainThread());
702 BaseAudioContext::AutoLocker locker(context()); 702 BaseAudioContext::AutoLocker locker(context());
703 703
704 // Disconnect all outgoing connections. 704 // Disconnect all outgoing connections.
705 for (unsigned i = 0; i < numberOfOutputs(); ++i) 705 for (unsigned i = 0; i < numberOfOutputs(); ++i)
706 disconnectAllFromOutput(i); 706 disconnectAllFromOutput(i);
707 } 707 }
708 708
709 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState) 709 void AudioNode::disconnect(unsigned outputIndex, ExceptionState& exceptionState)
710 { 710 {
711 ASSERT(isMainThread()); 711 DCHECK(isMainThread());
712 BaseAudioContext::AutoLocker locker(context()); 712 BaseAudioContext::AutoLocker locker(context());
713 713
714 // Sanity check on the output index. 714 // Sanity check on the output index.
715 if (outputIndex >= numberOfOutputs()) { 715 if (outputIndex >= numberOfOutputs()) {
716 exceptionState.throwDOMException( 716 exceptionState.throwDOMException(
717 IndexSizeError, 717 IndexSizeError,
718 ExceptionMessages::indexOutsideRange( 718 ExceptionMessages::indexOutsideRange(
719 "output index", 719 "output index",
720 outputIndex, 720 outputIndex,
721 0u, 721 0u,
722 ExceptionMessages::InclusiveBound, 722 ExceptionMessages::InclusiveBound,
723 numberOfOutputs() - 1, 723 numberOfOutputs() - 1,
724 ExceptionMessages::InclusiveBound)); 724 ExceptionMessages::InclusiveBound));
725 return; 725 return;
726 } 726 }
727 // Disconnect all outgoing connections from the given output. 727 // Disconnect all outgoing connections from the given output.
728 disconnectAllFromOutput(outputIndex); 728 disconnectAllFromOutput(outputIndex);
729 } 729 }
730 730
731 void AudioNode::disconnect(AudioNode* destination, ExceptionState& exceptionStat e) 731 void AudioNode::disconnect(AudioNode* destination, ExceptionState& exceptionStat e)
732 { 732 {
733 ASSERT(isMainThread()); 733 DCHECK(isMainThread());
734 BaseAudioContext::AutoLocker locker(context()); 734 BaseAudioContext::AutoLocker locker(context());
735 735
736 unsigned numberOfDisconnections = 0; 736 unsigned numberOfDisconnections = 0;
737 737
738 // FIXME: Can this be optimized? ChannelSplitter and ChannelMerger can have 738 // FIXME: Can this be optimized? ChannelSplitter and ChannelMerger can have
739 // 32 ports and that requires 1024 iterations to validate entire connections . 739 // 32 ports and that requires 1024 iterations to validate entire connections .
740 for (unsigned outputIndex = 0; outputIndex < numberOfOutputs(); ++outputInde x) { 740 for (unsigned outputIndex = 0; outputIndex < numberOfOutputs(); ++outputInde x) {
741 for (unsigned inputIndex = 0; inputIndex < destination->handler().number OfInputs(); ++inputIndex) { 741 for (unsigned inputIndex = 0; inputIndex < destination->handler().number OfInputs(); ++inputIndex) {
742 if (disconnectFromOutputIfConnected(outputIndex, *destination, input Index)) 742 if (disconnectFromOutputIfConnected(outputIndex, *destination, input Index))
743 numberOfDisconnections++; 743 numberOfDisconnections++;
744 } 744 }
745 } 745 }
746 746
747 // If there is no connection to the destination, throw an exception. 747 // If there is no connection to the destination, throw an exception.
748 if (numberOfDisconnections == 0) { 748 if (numberOfDisconnections == 0) {
749 exceptionState.throwDOMException( 749 exceptionState.throwDOMException(
750 InvalidAccessError, 750 InvalidAccessError,
751 "the given destination is not connected."); 751 "the given destination is not connected.");
752 return; 752 return;
753 } 753 }
754 } 754 }
755 755
756 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, Excepti onState& exceptionState) 756 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, Excepti onState& exceptionState)
757 { 757 {
758 ASSERT(isMainThread()); 758 DCHECK(isMainThread());
759 BaseAudioContext::AutoLocker locker(context()); 759 BaseAudioContext::AutoLocker locker(context());
760 760
761 if (outputIndex >= numberOfOutputs()) { 761 if (outputIndex >= numberOfOutputs()) {
762 // The output index is out of range. Throw an exception. 762 // The output index is out of range. Throw an exception.
763 exceptionState.throwDOMException( 763 exceptionState.throwDOMException(
764 IndexSizeError, 764 IndexSizeError,
765 ExceptionMessages::indexOutsideRange( 765 ExceptionMessages::indexOutsideRange(
766 "output index", 766 "output index",
767 outputIndex, 767 outputIndex,
768 0u, 768 0u,
(...skipping 14 matching lines...) Expand all
783 // If there is no connection to the destination, throw an exception. 783 // If there is no connection to the destination, throw an exception.
784 if (numberOfDisconnections == 0) { 784 if (numberOfDisconnections == 0) {
785 exceptionState.throwDOMException( 785 exceptionState.throwDOMException(
786 InvalidAccessError, 786 InvalidAccessError,
787 "output (" + String::number(outputIndex) + ") is not connected to th e given destination."); 787 "output (" + String::number(outputIndex) + ") is not connected to th e given destination.");
788 } 788 }
789 } 789 }
790 790
791 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, unsigne d inputIndex, ExceptionState& exceptionState) 791 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, unsigne d inputIndex, ExceptionState& exceptionState)
792 { 792 {
793 ASSERT(isMainThread()); 793 DCHECK(isMainThread());
794 BaseAudioContext::AutoLocker locker(context()); 794 BaseAudioContext::AutoLocker locker(context());
795 795
796 if (outputIndex >= numberOfOutputs()) { 796 if (outputIndex >= numberOfOutputs()) {
797 exceptionState.throwDOMException( 797 exceptionState.throwDOMException(
798 IndexSizeError, 798 IndexSizeError,
799 ExceptionMessages::indexOutsideRange( 799 ExceptionMessages::indexOutsideRange(
800 "output index", 800 "output index",
801 outputIndex, 801 outputIndex,
802 0u, 802 0u,
803 ExceptionMessages::InclusiveBound, 803 ExceptionMessages::InclusiveBound,
(...skipping 19 matching lines...) Expand all
823 if (!disconnectFromOutputIfConnected(outputIndex, *destination, inputIndex)) { 823 if (!disconnectFromOutputIfConnected(outputIndex, *destination, inputIndex)) {
824 exceptionState.throwDOMException( 824 exceptionState.throwDOMException(
825 InvalidAccessError, 825 InvalidAccessError,
826 "output (" + String::number(outputIndex) + ") is not connected to th e input (" + String::number(inputIndex) + ") of the destination."); 826 "output (" + String::number(outputIndex) + ") is not connected to th e input (" + String::number(inputIndex) + ") of the destination.");
827 return; 827 return;
828 } 828 }
829 } 829 }
830 830
831 void AudioNode::disconnect(AudioParam* destinationParam, ExceptionState& excepti onState) 831 void AudioNode::disconnect(AudioParam* destinationParam, ExceptionState& excepti onState)
832 { 832 {
833 ASSERT(isMainThread()); 833 DCHECK(isMainThread());
834 BaseAudioContext::AutoLocker locker(context()); 834 BaseAudioContext::AutoLocker locker(context());
835 835
836 // The number of disconnection made. 836 // The number of disconnection made.
837 unsigned numberOfDisconnections = 0; 837 unsigned numberOfDisconnections = 0;
838 838
839 // Check if the node output is connected the destination AudioParam. 839 // Check if the node output is connected the destination AudioParam.
840 // Disconnect if connected and increase |numberOfDisconnectios| by 1. 840 // Disconnect if connected and increase |numberOfDisconnectios| by 1.
841 for (unsigned outputIndex = 0; outputIndex < handler().numberOfOutputs(); ++ outputIndex) { 841 for (unsigned outputIndex = 0; outputIndex < handler().numberOfOutputs(); ++ outputIndex) {
842 if (disconnectFromOutputIfConnected(outputIndex, *destinationParam)) 842 if (disconnectFromOutputIfConnected(outputIndex, *destinationParam))
843 numberOfDisconnections++; 843 numberOfDisconnections++;
844 } 844 }
845 845
846 // Throw an exception when there is no valid connection to the destination. 846 // Throw an exception when there is no valid connection to the destination.
847 if (numberOfDisconnections == 0) { 847 if (numberOfDisconnections == 0) {
848 exceptionState.throwDOMException( 848 exceptionState.throwDOMException(
849 InvalidAccessError, 849 InvalidAccessError,
850 "the given AudioParam is not connected."); 850 "the given AudioParam is not connected.");
851 return; 851 return;
852 } 852 }
853 } 853 }
854 854
855 void AudioNode::disconnect(AudioParam* destinationParam, unsigned outputIndex, E xceptionState& exceptionState) 855 void AudioNode::disconnect(AudioParam* destinationParam, unsigned outputIndex, E xceptionState& exceptionState)
856 { 856 {
857 ASSERT(isMainThread()); 857 DCHECK(isMainThread());
858 BaseAudioContext::AutoLocker locker(context()); 858 BaseAudioContext::AutoLocker locker(context());
859 859
860 if (outputIndex >= handler().numberOfOutputs()) { 860 if (outputIndex >= handler().numberOfOutputs()) {
861 // The output index is out of range. Throw an exception. 861 // The output index is out of range. Throw an exception.
862 exceptionState.throwDOMException( 862 exceptionState.throwDOMException(
863 IndexSizeError, 863 IndexSizeError,
864 ExceptionMessages::indexOutsideRange( 864 ExceptionMessages::indexOutsideRange(
865 "output index", 865 "output index",
866 outputIndex, 866 outputIndex,
867 0u, 867 0u,
868 ExceptionMessages::InclusiveBound, 868 ExceptionMessages::InclusiveBound,
869 numberOfOutputs() - 1, 869 numberOfOutputs() - 1,
870 ExceptionMessages::InclusiveBound)); 870 ExceptionMessages::InclusiveBound));
871 return; 871 return;
872 } 872 }
873 873
874 // If the output index is valid, proceed to disconnect. 874 // If the output index is valid, proceed to disconnect.
875 if (!disconnectFromOutputIfConnected(outputIndex, *destinationParam)) { 875 if (!disconnectFromOutputIfConnected(outputIndex, *destinationParam)) {
876 exceptionState.throwDOMException( 876 exceptionState.throwDOMException(
877 InvalidAccessError, 877 InvalidAccessError,
878 "specified destination AudioParam and node output (" + String::numbe r(outputIndex) + ") are not connected."); 878 "specified destination AudioParam and node output (" + String::numbe r(outputIndex) + ") are not connected.");
879 return; 879 return;
880 } 880 }
881 } 881 }
882 882
883 void AudioNode::disconnectWithoutException(unsigned outputIndex) 883 void AudioNode::disconnectWithoutException(unsigned outputIndex)
884 { 884 {
885 ASSERT(isMainThread()); 885 DCHECK(isMainThread());
886 BaseAudioContext::AutoLocker locker(context()); 886 BaseAudioContext::AutoLocker locker(context());
887 887
888 // Sanity check input and output indices. 888 // Sanity check input and output indices.
889 if (outputIndex >= handler().numberOfOutputs()) 889 if (outputIndex >= handler().numberOfOutputs())
890 return; 890 return;
891 disconnectAllFromOutput(outputIndex); 891 disconnectAllFromOutput(outputIndex);
892 } 892 }
893 893
894 unsigned AudioNode::numberOfInputs() const 894 unsigned AudioNode::numberOfInputs() const
895 { 895 {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 } 937 }
938 938
939 ExecutionContext* AudioNode::getExecutionContext() const 939 ExecutionContext* AudioNode::getExecutionContext() const
940 { 940 {
941 return context()->getExecutionContext(); 941 return context()->getExecutionContext();
942 } 942 }
943 943
944 void AudioNode::didAddOutput(unsigned numberOfOutputs) 944 void AudioNode::didAddOutput(unsigned numberOfOutputs)
945 { 945 {
946 m_connectedNodes.append(nullptr); 946 m_connectedNodes.append(nullptr);
947 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedNodes.size()); 947 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedNodes.size());
hongchan 2016/08/15 15:43:21 Can we use DCHECK for this? I did not do the resea
HyungwookLee 2016/08/16 03:16:04 In my investigation, ASSERT_UNUSED() is considered
948 m_connectedParams.append(nullptr); 948 m_connectedParams.append(nullptr);
949 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedParams.size()); 949 ASSERT_UNUSED(numberOfOutputs, numberOfOutputs == m_connectedParams.size());
hongchan 2016/08/15 15:43:21 Ditto.
HyungwookLee 2016/08/16 03:16:04 Done.
950 } 950 }
951 951
952 } // namespace blink 952 } // namespace blink
953 953
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698