| Index: Source/modules/webaudio/AudioNodeInput.cpp
|
| diff --git a/Source/modules/webaudio/AudioNodeInput.cpp b/Source/modules/webaudio/AudioNodeInput.cpp
|
| index e2af1dbe85189f64447f905ffc80247e72d512b7..e1abb49b6c7aa43d954ce5925e10e0d8a37c14ce 100644
|
| --- a/Source/modules/webaudio/AudioNodeInput.cpp
|
| +++ b/Source/modules/webaudio/AudioNodeInput.cpp
|
| @@ -33,7 +33,7 @@
|
| namespace blink {
|
|
|
| inline AudioNodeInput::AudioNodeInput(AudioNode& node)
|
| - : AudioSummingJunction(node.context())
|
| + : AudioSummingJunction(node.context()->handler())
|
| , m_node(node)
|
| {
|
| // Set to mono by default.
|
| @@ -47,13 +47,18 @@ AudioNodeInput* AudioNodeInput::create(AudioNode& node)
|
|
|
| DEFINE_TRACE(AudioNodeInput)
|
| {
|
| + // TODO(tkent): Oilpan: m_renderingOutputs should not be strong references.
|
| + // This is a short-term workaround to avoid crashes, and causes AudioNode
|
| + // leaks.
|
| + AudioContext::AutoLocker locker(deferredTaskHandler());
|
| + for (size_t i = 0; i < m_renderingOutputs.size(); ++i)
|
| + visitor->trace(m_renderingOutputs[i]);
|
| visitor->trace(m_node);
|
| - AudioSummingJunction::trace(visitor);
|
| }
|
|
|
| void AudioNodeInput::connect(AudioNodeOutput& output)
|
| {
|
| - ASSERT(context()->isGraphOwner());
|
| + ASSERT(deferredTaskHandler().isGraphOwner());
|
|
|
| // Check if we're already connected to this output.
|
| if (m_outputs.contains(&output))
|
| @@ -66,7 +71,7 @@ void AudioNodeInput::connect(AudioNodeOutput& output)
|
|
|
| void AudioNodeInput::disconnect(AudioNodeOutput& output)
|
| {
|
| - ASSERT(context()->isGraphOwner());
|
| + ASSERT(deferredTaskHandler().isGraphOwner());
|
|
|
| // First try to disconnect from "active" connections.
|
| if (m_outputs.contains(&output)) {
|
| @@ -92,7 +97,7 @@ void AudioNodeInput::disconnect(AudioNodeOutput& output)
|
|
|
| void AudioNodeInput::disable(AudioNodeOutput& output)
|
| {
|
| - ASSERT(context()->isGraphOwner());
|
| + ASSERT(deferredTaskHandler().isGraphOwner());
|
| ASSERT(m_outputs.contains(&output));
|
|
|
| m_disabledOutputs.add(&output);
|
| @@ -105,7 +110,7 @@ void AudioNodeInput::disable(AudioNodeOutput& output)
|
|
|
| void AudioNodeInput::enable(AudioNodeOutput& output)
|
| {
|
| - ASSERT(context()->isGraphOwner());
|
| + ASSERT(deferredTaskHandler().isGraphOwner());
|
| ASSERT(m_disabledOutputs.contains(&output));
|
|
|
| // Move output from disabled list to active list.
|
| @@ -124,8 +129,8 @@ void AudioNodeInput::didUpdate()
|
|
|
| void AudioNodeInput::updateInternalBus()
|
| {
|
| - ASSERT(context()->isAudioThread());
|
| - ASSERT(context()->isGraphOwner());
|
| + ASSERT(deferredTaskHandler().isAudioThread());
|
| + ASSERT(deferredTaskHandler().isGraphOwner());
|
|
|
| unsigned numberOfInputChannels = numberOfChannels();
|
|
|
| @@ -158,7 +163,7 @@ unsigned AudioNodeInput::numberOfChannels() const
|
|
|
| AudioBus* AudioNodeInput::bus()
|
| {
|
| - ASSERT(context()->isAudioThread());
|
| + ASSERT(deferredTaskHandler().isAudioThread());
|
|
|
| // Handle single connection specially to allow for in-place processing.
|
| if (numberOfRenderingConnections() == 1 && node().internalChannelCountMode() == AudioNode::Max)
|
| @@ -170,14 +175,14 @@ AudioBus* AudioNodeInput::bus()
|
|
|
| AudioBus* AudioNodeInput::internalSummingBus()
|
| {
|
| - ASSERT(context()->isAudioThread());
|
| + ASSERT(deferredTaskHandler().isAudioThread());
|
|
|
| return m_internalSummingBus.get();
|
| }
|
|
|
| void AudioNodeInput::sumAllConnections(AudioBus* summingBus, size_t framesToProcess)
|
| {
|
| - ASSERT(context()->isAudioThread());
|
| + ASSERT(deferredTaskHandler().isAudioThread());
|
|
|
| // We shouldn't be calling this method if there's only one connection, since it's less efficient.
|
| ASSERT(numberOfRenderingConnections() > 1 || node().internalChannelCountMode() != AudioNode::Max);
|
| @@ -204,7 +209,7 @@ void AudioNodeInput::sumAllConnections(AudioBus* summingBus, size_t framesToProc
|
|
|
| AudioBus* AudioNodeInput::pull(AudioBus* inPlaceBus, size_t framesToProcess)
|
| {
|
| - ASSERT(context()->isAudioThread());
|
| + ASSERT(deferredTaskHandler().isAudioThread());
|
|
|
| // Handle single connection case.
|
| if (numberOfRenderingConnections() == 1 && node().internalChannelCountMode() == AudioNode::Max) {
|
|
|