| 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 12 matching lines...) Expand all Loading... |
| 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/PannerNode.h" | 27 #include "modules/webaudio/PannerNode.h" |
| 28 | 28 |
| 29 #include "bindings/core/v8/ExceptionMessages.h" | 29 #include "bindings/core/v8/ExceptionMessages.h" |
| 30 #include "bindings/core/v8/ExceptionState.h" | 30 #include "bindings/core/v8/ExceptionState.h" |
| 31 #include "core/dom/ExceptionCode.h" | 31 #include "core/dom/ExceptionCode.h" |
| 32 #include "core/dom/ExecutionContext.h" | 32 #include "core/dom/ExecutionContext.h" |
| 33 #include "modules/webaudio/AbstractAudioContext.h" |
| 33 #include "modules/webaudio/AudioBufferSourceNode.h" | 34 #include "modules/webaudio/AudioBufferSourceNode.h" |
| 34 #include "modules/webaudio/AudioContext.h" | |
| 35 #include "modules/webaudio/AudioNodeInput.h" | 35 #include "modules/webaudio/AudioNodeInput.h" |
| 36 #include "modules/webaudio/AudioNodeOutput.h" | 36 #include "modules/webaudio/AudioNodeOutput.h" |
| 37 #include "platform/audio/HRTFPanner.h" | 37 #include "platform/audio/HRTFPanner.h" |
| 38 #include "wtf/MathExtras.h" | 38 #include "wtf/MathExtras.h" |
| 39 | 39 |
| 40 namespace blink { | 40 namespace blink { |
| 41 | 41 |
| 42 static void fixNANs(double& x) | 42 static void fixNANs(double& x) |
| 43 { | 43 { |
| 44 if (std::isnan(x) || std::isinf(x)) | 44 if (std::isnan(x) || std::isinf(x)) |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 if (!source) { | 100 if (!source) { |
| 101 destination->zero(); | 101 destination->zero(); |
| 102 return; | 102 return; |
| 103 } | 103 } |
| 104 | 104 |
| 105 // The audio thread can't block on this lock, so we call tryLock() instead. | 105 // The audio thread can't block on this lock, so we call tryLock() instead. |
| 106 MutexTryLocker tryLocker(m_processLock); | 106 MutexTryLocker tryLocker(m_processLock); |
| 107 MutexTryLocker tryListenerLocker(listener()->listenerLock()); | 107 MutexTryLocker tryListenerLocker(listener()->listenerLock()); |
| 108 | 108 |
| 109 if (tryLocker.locked() && tryListenerLocker.locked()) { | 109 if (tryLocker.locked() && tryListenerLocker.locked()) { |
| 110 // HRTFDatabase should be loaded before proceeding for offline audio con
text when the panning model is HRTF. | 110 // HRTFDatabase should be loaded before proceeding when the panning mode
l is HRTF. |
| 111 if (m_panningModel == Panner::PanningModelHRTF && !listener()->isHRTFDat
abaseLoaded()) { | 111 if (m_panningModel == Panner::PanningModelHRTF && !listener()->isHRTFDat
abaseLoaded()) { |
| 112 if (context()->isOfflineContext()) { | 112 if (context()->hasRealtimeConstraint()) { |
| 113 listener()->waitForHRTFDatabaseLoaderThreadCompletion(); | 113 // Some AbstractAudioContexts cannot block on the HRTFDatabase l
oader. |
| 114 } else { | |
| 115 destination->zero(); | 114 destination->zero(); |
| 116 return; | 115 return; |
| 117 } | 116 } |
| 117 |
| 118 listener()->waitForHRTFDatabaseLoaderThreadCompletion(); |
| 118 } | 119 } |
| 119 | 120 |
| 120 // Apply the panning effect. | 121 // Apply the panning effect. |
| 121 double azimuth; | 122 double azimuth; |
| 122 double elevation; | 123 double elevation; |
| 123 azimuthElevation(&azimuth, &elevation); | 124 azimuthElevation(&azimuth, &elevation); |
| 124 | 125 |
| 125 m_panner->pan(azimuth, elevation, source, destination, framesToProcess); | 126 m_panner->pan(azimuth, elevation, source, destination, framesToProcess); |
| 126 | 127 |
| 127 // Get the distance and cone gain. | 128 // Get the distance and cone gain. |
| (...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 if (dirty & PannerHandler::DistanceConeGainDirty) | 523 if (dirty & PannerHandler::DistanceConeGainDirty) |
| 523 m_isDistanceConeGainDirty = true; | 524 m_isDistanceConeGainDirty = true; |
| 524 | 525 |
| 525 if (dirty & PannerHandler::DopplerRateDirty) | 526 if (dirty & PannerHandler::DopplerRateDirty) |
| 526 m_isDopplerRateDirty = true; | 527 m_isDopplerRateDirty = true; |
| 527 } | 528 } |
| 528 | 529 |
| 529 void PannerHandler::setChannelCount(unsigned long channelCount, ExceptionState&
exceptionState) | 530 void PannerHandler::setChannelCount(unsigned long channelCount, ExceptionState&
exceptionState) |
| 530 { | 531 { |
| 531 ASSERT(isMainThread()); | 532 ASSERT(isMainThread()); |
| 532 AudioContext::AutoLocker locker(context()); | 533 AbstractAudioContext::AutoLocker locker(context()); |
| 533 | 534 |
| 534 // A PannerNode only supports 1 or 2 channels | 535 // A PannerNode only supports 1 or 2 channels |
| 535 if (channelCount > 0 && channelCount <= 2) { | 536 if (channelCount > 0 && channelCount <= 2) { |
| 536 if (m_channelCount != channelCount) { | 537 if (m_channelCount != channelCount) { |
| 537 m_channelCount = channelCount; | 538 m_channelCount = channelCount; |
| 538 if (m_channelCountMode != Max) | 539 if (m_channelCountMode != Max) |
| 539 updateChannelsForInputs(); | 540 updateChannelsForInputs(); |
| 540 } | 541 } |
| 541 } else { | 542 } else { |
| 542 exceptionState.throwDOMException( | 543 exceptionState.throwDOMException( |
| 543 NotSupportedError, | 544 NotSupportedError, |
| 544 ExceptionMessages::indexOutsideRange<unsigned long>( | 545 ExceptionMessages::indexOutsideRange<unsigned long>( |
| 545 "channelCount", | 546 "channelCount", |
| 546 channelCount, | 547 channelCount, |
| 547 1, | 548 1, |
| 548 ExceptionMessages::InclusiveBound, | 549 ExceptionMessages::InclusiveBound, |
| 549 2, | 550 2, |
| 550 ExceptionMessages::InclusiveBound)); | 551 ExceptionMessages::InclusiveBound)); |
| 551 } | 552 } |
| 552 } | 553 } |
| 553 | 554 |
| 554 void PannerHandler::setChannelCountMode(const String& mode, ExceptionState& exce
ptionState) | 555 void PannerHandler::setChannelCountMode(const String& mode, ExceptionState& exce
ptionState) |
| 555 { | 556 { |
| 556 ASSERT(isMainThread()); | 557 ASSERT(isMainThread()); |
| 557 AudioContext::AutoLocker locker(context()); | 558 AbstractAudioContext::AutoLocker locker(context()); |
| 558 | 559 |
| 559 ChannelCountMode oldMode = m_channelCountMode; | 560 ChannelCountMode oldMode = m_channelCountMode; |
| 560 | 561 |
| 561 if (mode == "clamped-max") { | 562 if (mode == "clamped-max") { |
| 562 m_newChannelCountMode = ClampedMax; | 563 m_newChannelCountMode = ClampedMax; |
| 563 } else if (mode == "explicit") { | 564 } else if (mode == "explicit") { |
| 564 m_newChannelCountMode = Explicit; | 565 m_newChannelCountMode = Explicit; |
| 565 } else if (mode == "max") { | 566 } else if (mode == "max") { |
| 566 // This is not supported for a PannerNode, which can only handle 1 or 2
channels. | 567 // This is not supported for a PannerNode, which can only handle 1 or 2
channels. |
| 567 exceptionState.throwDOMException( | 568 exceptionState.throwDOMException( |
| 568 NotSupportedError, | 569 NotSupportedError, |
| 569 "Panner: 'max' is not allowed"); | 570 "Panner: 'max' is not allowed"); |
| 570 m_newChannelCountMode = oldMode; | 571 m_newChannelCountMode = oldMode; |
| 571 } else { | 572 } else { |
| 572 // Do nothing for other invalid values. | 573 // Do nothing for other invalid values. |
| 573 m_newChannelCountMode = oldMode; | 574 m_newChannelCountMode = oldMode; |
| 574 } | 575 } |
| 575 | 576 |
| 576 if (m_newChannelCountMode != oldMode) | 577 if (m_newChannelCountMode != oldMode) |
| 577 context()->deferredTaskHandler().addChangedChannelCountMode(this); | 578 context()->deferredTaskHandler().addChangedChannelCountMode(this); |
| 578 } | 579 } |
| 579 | 580 |
| 580 // ---------------------------------------------------------------- | 581 // ---------------------------------------------------------------- |
| 581 | 582 |
| 582 PannerNode::PannerNode(AudioContext& context, float sampelRate) | 583 PannerNode::PannerNode(AbstractAudioContext& context, float sampelRate) |
| 583 : AudioNode(context) | 584 : AudioNode(context) |
| 584 { | 585 { |
| 585 setHandler(PannerHandler::create(*this, sampelRate)); | 586 setHandler(PannerHandler::create(*this, sampelRate)); |
| 586 } | 587 } |
| 587 | 588 |
| 588 PannerNode* PannerNode::create(AudioContext& context, float sampleRate) | 589 PannerNode* PannerNode::create(AbstractAudioContext& context, float sampleRate) |
| 589 { | 590 { |
| 590 return new PannerNode(context, sampleRate); | 591 return new PannerNode(context, sampleRate); |
| 591 } | 592 } |
| 592 | 593 |
| 593 PannerHandler& PannerNode::pannerHandler() const | 594 PannerHandler& PannerNode::pannerHandler() const |
| 594 { | 595 { |
| 595 return static_cast<PannerHandler&>(handler()); | 596 return static_cast<PannerHandler&>(handler()); |
| 596 } | 597 } |
| 597 | 598 |
| 598 String PannerNode::panningModel() const | 599 String PannerNode::panningModel() const |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 686 } | 687 } |
| 687 | 688 |
| 688 void PannerNode::setConeOuterGain(double gain) | 689 void PannerNode::setConeOuterGain(double gain) |
| 689 { | 690 { |
| 690 pannerHandler().setConeOuterGain(gain); | 691 pannerHandler().setConeOuterGain(gain); |
| 691 } | 692 } |
| 692 | 693 |
| 693 } // namespace blink | 694 } // namespace blink |
| 694 | 695 |
| 695 #endif // ENABLE(WEB_AUDIO) | 696 #endif // ENABLE(WEB_AUDIO) |
| OLD | NEW |