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

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

Issue 886173004: Fix AudioNode.disconnect() to support selective disconnection. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Test for AudioParam disconnection Created 5 years, 10 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 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
285 // Sanity check input and output indices. 295 // Sanity check on the output index.
286 if (outputIndex >= numberOfOutputs()) { 296 if (outputIndex >= numberOfOutputs()) {
287 exceptionState.throwDOMException( 297 exceptionState.throwDOMException(
288 IndexSizeError, 298 IndexSizeError,
289 "output index (" + String::number(outputIndex) + ") exceeds number o f outputs (" + String::number(numberOfOutputs()) + ")."); 299 "output index (" + String::number(outputIndex) + ") exceeds number o f outputs (" + String::number(numberOfOutputs()) + ").");
290 return; 300 return;
291 } 301 }
292 302
303 // Disconnect all outgoing connections from the given output.
304 AudioNodeOutput* output = this->output(outputIndex);
305 output->disconnectAll();
306 }
307
308 void AudioNode::disconnect(AudioNode* destination, ExceptionState& exceptionStat e)
309 {
310 ASSERT(isMainThread());
311 AudioContext::AutoLocker locker(context());
312
313 bool isConnectedToDestination = false;
314
315 // TO FIX: Can this be optimized? ChannelSplitter and ChannelMerger can have
Raymond Toy 2015/02/11 21:31:18 s/TO FIX/FIXME/ according to http://www.webkit.org
hongchan 2015/02/12 18:38:01 Done.
316 // 32 ports and that requires 1024 iterations to validate entire connections .
317 for (unsigned i = 0; i < numberOfOutputs(); ++i) {
318 AudioNodeOutput* output = this->output(i);
319 for (unsigned j = 0; j < destination->numberOfInputs(); ++j) {
320 AudioNodeInput* input = destination->input(j);
321 if (output->isConnectedWithInput(*input)) {
322 output->disconnectInput(*input);
323 isConnectedToDestination = true;
324 }
325 }
326 }
327
328 // If there is no connection to the destination, throw an exception.
329 if (!isConnectedToDestination) {
330 exceptionState.throwDOMException(
331 InvalidAccessError,
332 "the given destination is not connected.");
333 return;
334 }
335 }
336
337 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, Excepti onState& exceptionState)
338 {
339 ASSERT(isMainThread());
340 AudioContext::AutoLocker locker(context());
341
342 // Sanity check on output index.
343 if (outputIndex >= numberOfOutputs()) {
344 exceptionState.throwDOMException(
345 IndexSizeError,
346 "output index (" + String::number(outputIndex) + ") exceeds number o f outputs (" + String::number(numberOfOutputs()) + ").");
Raymond Toy 2015/02/11 21:31:18 Consider using IndexOutsideOfRange.
hongchan 2015/02/12 18:38:01 Acknowledged.
347 return;
348 }
349
350 bool isConnectedToDestination = false;
351 AudioNodeOutput* output = this->output(outputIndex);
352
353 // Sanity check on destination inputs and disconnect when possible.
354 for (unsigned i = 0; i < destination->numberOfInputs(); ++i) {
355 AudioNodeInput* input = destination->input(i);
356 if (output->isConnectedWithInput(*input)) {
357 output->disconnectInput(*input);
358 isConnectedToDestination = true;
359 }
360 }
361
362 // If there is no connection to the destination, throw an exception.
363 if (!isConnectedToDestination) {
364 exceptionState.throwDOMException(
365 InvalidAccessError,
366 "the given destination is not connected.");
Raymond Toy 2015/02/11 21:31:18 Give the output index with the message.
hongchan 2015/02/12 18:38:00 I will try to come up with the better error messag
367 return;
368 }
369 }
370
371 void AudioNode::disconnect(AudioNode* destination, unsigned outputIndex, unsigne d inputIndex, ExceptionState& exceptionState)
372 {
373 ASSERT(isMainThread());
374 AudioContext::AutoLocker locker(context());
375
376 // Sanity check input and output indices.
377 if (outputIndex >= numberOfOutputs()) {
378 exceptionState.throwDOMException(
379 IndexSizeError,
380 "output index (" + String::number(outputIndex) + ") exceeds number o f outputs (" + String::number(numberOfOutputs()) + ").");
Raymond Toy 2015/02/11 21:31:18 Consider using IndexOutsideOfRange, here and below
hongchan 2015/02/12 18:38:01 Done.
381 return;
382 }
383
384 if (inputIndex >= destination->numberOfInputs()) {
385 exceptionState.throwDOMException(
386 IndexSizeError,
387 "input index (" + String::number(inputIndex) + ") exceeds number of inputs of destination node (" + String::number(destination->numberOfInputs()) + ").");
388 return;
389 }
390
293 AudioNodeOutput* output = this->output(outputIndex); 391 AudioNodeOutput* output = this->output(outputIndex);
294 output->disconnectAll(); 392 AudioNodeInput* input = destination->input(inputIndex);
393
394 // Sanity check on the connection between the output and the destination inp ut.
395 if (!output->isConnectedWithInput(*input)) {
396 exceptionState.throwDOMException(
397 InvalidAccessError,
398 "the given destination input (" + String::number(inputIndex) + ") an d node output (" + String::number(outputIndex) + ") are not connected.");
Raymond Toy 2015/02/11 21:31:18 I think it reads better to say output # is not con
hongchan 2015/02/12 18:38:01 Done.
399 return;
400 }
401
402 output->disconnectInput(*input);
403 }
404
405 void AudioNode::disconnect(AudioParam* destinationParam, ExceptionState& excepti onState)
406 {
407 ASSERT(isMainThread());
408 AudioContext::AutoLocker locker(context());
409
410 bool isConnectedToDestination = false;
411
412 for (unsigned i = 0; i < numberOfOutputs(); ++i) {
413 AudioNodeOutput* output = this->output(i);
414 if (output->isConnectedWithAudioParam(*destinationParam)) {
415 output->disconnectAudioParam(*destinationParam);
416 isConnectedToDestination = true;
417 }
418 }
419
420 // Throw an exception when there is no valid connection to the destination.
421 if (!isConnectedToDestination) {
422 exceptionState.throwDOMException(
423 InvalidAccessError,
424 "the given destination AudioParam and the node are not connected.");
425 return;
426 }
427 }
428
429 void AudioNode::disconnect(AudioParam* destinationParam, unsigned outputIndex, E xceptionState& exceptionState)
430 {
431 ASSERT(isMainThread());
432 AudioContext::AutoLocker locker(context());
433
434 // Sanity check input and output indices.
435 if (outputIndex >= numberOfOutputs()) {
436 exceptionState.throwDOMException(
437 IndexSizeError,
438 "output index (" + String::number(outputIndex) + ") exceeds number o f outputs (" + String::number(numberOfOutputs()) + ").");
439 return;
440 }
441
442 AudioNodeOutput* output = this->output(outputIndex);
443
444 // Sanity check on the connection between the output and the destination.
445 if (!output->isConnectedWithAudioParam(*destinationParam)) {
446 exceptionState.throwDOMException(
447 InvalidAccessError,
448 "specified destination AudioParam and node output (" + String::numbe r(outputIndex) + ") are not connected.");
449 return;
450 }
451
452 output->disconnectAudioParam(*destinationParam);
295 } 453 }
296 454
297 void AudioNode::disconnectWithoutException(unsigned outputIndex) 455 void AudioNode::disconnectWithoutException(unsigned outputIndex)
298 { 456 {
299 ASSERT(isMainThread()); 457 ASSERT(isMainThread());
300 AudioContext::AutoLocker locker(context()); 458 AudioContext::AutoLocker locker(context());
301 459
302 // Sanity check input and output indices. 460 // Sanity check input and output indices.
303 if (outputIndex < numberOfOutputs()) { 461 if (outputIndex < numberOfOutputs()) {
304 AudioNodeOutput* output = this->output(outputIndex); 462 AudioNodeOutput* output = this->output(outputIndex);
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 761
604 void AudioNode::updateChannelCountMode() 762 void AudioNode::updateChannelCountMode()
605 { 763 {
606 m_channelCountMode = m_newChannelCountMode; 764 m_channelCountMode = m_newChannelCountMode;
607 updateChannelsForInputs(); 765 updateChannelsForInputs();
608 } 766 }
609 767
610 } // namespace blink 768 } // namespace blink
611 769
612 #endif // ENABLE(WEB_AUDIO) 770 #endif // ENABLE(WEB_AUDIO)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698