From 856dfa819d6dd5ccc0191ee4753a5a3a178aa07c Mon Sep 17 00:00:00 2001 From: Hongchan Choi Date: Mon, 25 Jun 2018 20:48:19 +0000 Subject: [PATCH] Move AudioIOCallback class to DefaultAudioDestinationNode AudioIOCallback is specifically designed for real-time audio IO and is not appropriate for AudioDestinationNode. This CL moves the class to DefaultAudioDestinationNode. Bug: 854229 Change-Id: Icb0df6414b944ea1dde3e957d2f36c314b079e0e Reviewed-on: https://chromium-review.googlesource.com/1113955 Reviewed-by: Raymond Toy Commit-Queue: Hongchan Choi Cr-Commit-Position: refs/heads/master@{#570167} --- .../webaudio/audio_destination_node.cc | 73 +------------------ .../modules/webaudio/audio_destination_node.h | 15 +--- .../modules/webaudio/base_audio_context.h | 1 + .../modules/webaudio/convolver_node_test.cc | 1 + .../default_audio_destination_node.cc | 73 +++++++++++++++++++ .../webaudio/default_audio_destination_node.h | 10 ++- 6 files changed, 87 insertions(+), 86 deletions(-) diff --git a/third_party/blink/renderer/modules/webaudio/audio_destination_node.cc b/third_party/blink/renderer/modules/webaudio/audio_destination_node.cc index 89b4932f633d35..ac37756aab8dc5 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_destination_node.cc +++ b/third_party/blink/renderer/modules/webaudio/audio_destination_node.cc @@ -24,13 +24,8 @@ */ #include "third_party/blink/renderer/modules/webaudio/audio_destination_node.h" -#include "third_party/blink/renderer/modules/webaudio/audio_node_input.h" -#include "third_party/blink/renderer/modules/webaudio/audio_node_output.h" + #include "third_party/blink/renderer/modules/webaudio/base_audio_context.h" -#include "third_party/blink/renderer/platform/audio/audio_utilities.h" -#include "third_party/blink/renderer/platform/audio/denormal_disabler.h" -#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" -#include "third_party/blink/renderer/platform/wtf/atomics.h" namespace blink { @@ -43,72 +38,6 @@ AudioDestinationHandler::~AudioDestinationHandler() { DCHECK(!IsInitialized()); } -void AudioDestinationHandler::Render(AudioBus* destination_bus, - size_t number_of_frames, - const AudioIOPosition& output_position) { - TRACE_EVENT0("webaudio", "AudioDestinationHandler::Render"); - - // We don't want denormals slowing down any of the audio processing - // since they can very seriously hurt performance. This will take care of all - // AudioNodes because they all process within this scope. - DenormalDisabler denormal_disabler; - - // Need to check if the context actually alive. Otherwise the subsequent - // steps will fail. If the context is not alive somehow, return immediately - // and do nothing. - // - // TODO(hongchan): because the context can go away while rendering, so this - // check cannot guarantee the safe execution of the following steps. - DCHECK(Context()); - if (!Context()) - return; - - Context()->GetDeferredTaskHandler().SetAudioThreadToCurrentThread(); - - // If the destination node is not initialized, pass the silence to the final - // audio destination (one step before the FIFO). This check is for the case - // where the destination is in the middle of tearing down process. - if (!IsInitialized()) { - destination_bus->Zero(); - return; - } - - // Let the context take care of any business at the start of each render - // quantum. - Context()->HandlePreRenderTasks(output_position); - - DCHECK_GE(NumberOfInputs(), 1u); - if (NumberOfInputs() < 1) { - destination_bus->Zero(); - return; - } - // This will cause the node(s) connected to us to process, which in turn will - // pull on their input(s), all the way backwards through the rendering graph. - AudioBus* rendered_bus = Input(0).Pull(destination_bus, number_of_frames); - - if (!rendered_bus) { - destination_bus->Zero(); - } else if (rendered_bus != destination_bus) { - // in-place processing was not possible - so copy - destination_bus->CopyFrom(*rendered_bus); - } - - // Process nodes which need a little extra help because they are not connected - // to anything, but still need to process. - Context()->GetDeferredTaskHandler().ProcessAutomaticPullNodes( - number_of_frames); - - // Let the context take care of any business at the end of each render - // quantum. - Context()->HandlePostRenderTasks(); - - // Advance current sample-frame. - size_t new_sample_frame = current_sample_frame_ + number_of_frames; - ReleaseStore(¤t_sample_frame_, new_sample_frame); - - Context()->UpdateWorkletGlobalScopeOnRenderingThread(); -} - // ---------------------------------------------------------------- AudioDestinationNode::AudioDestinationNode(BaseAudioContext& context) diff --git a/third_party/blink/renderer/modules/webaudio/audio_destination_node.h b/third_party/blink/renderer/modules/webaudio/audio_destination_node.h index c93fc8496defdf..e79204e6177056 100644 --- a/third_party/blink/renderer/modules/webaudio/audio_destination_node.h +++ b/third_party/blink/renderer/modules/webaudio/audio_destination_node.h @@ -26,17 +26,12 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_DESTINATION_NODE_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_DESTINATION_NODE_H_ -#include "third_party/blink/renderer/modules/webaudio/audio_buffer.h" #include "third_party/blink/renderer/modules/webaudio/audio_node.h" -#include "third_party/blink/renderer/platform/audio/audio_bus.h" -#include "third_party/blink/renderer/platform/audio/audio_io_callback.h" +#include "third_party/blink/renderer/platform/wtf/atomics.h" namespace blink { -class AudioBus; -class BaseAudioContext; - -class AudioDestinationHandler : public AudioHandler, public AudioIOCallback { +class AudioDestinationHandler : public AudioHandler { public: AudioDestinationHandler(AudioNode&); ~AudioDestinationHandler() override; @@ -45,12 +40,6 @@ class AudioDestinationHandler : public AudioHandler, public AudioIOCallback { void Process(size_t) final { } // we're pulled by hardware so this is never called - // Invoked by the AudioDestination to get the next render quantum into - // |destination_bus|. - void Render(AudioBus* destination_bus, - size_t number_of_frames, - const AudioIOPosition& output_position) final; - size_t CurrentSampleFrame() const { return AcquireLoad(¤t_sample_frame_); } diff --git a/third_party/blink/renderer/modules/webaudio/base_audio_context.h b/third_party/blink/renderer/modules/webaudio/base_audio_context.h index e4f1d9adeed542..e888c083018af3 100644 --- a/third_party/blink/renderer/modules/webaudio/base_audio_context.h +++ b/third_party/blink/renderer/modules/webaudio/base_audio_context.h @@ -43,6 +43,7 @@ #include "third_party/blink/renderer/modules/webaudio/deferred_task_handler.h" #include "third_party/blink/renderer/modules/webaudio/iir_filter_node.h" #include "third_party/blink/renderer/platform/audio/audio_bus.h" +#include "third_party/blink/renderer/platform/audio/audio_io_callback.h" #include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/threading.h" diff --git a/third_party/blink/renderer/modules/webaudio/convolver_node_test.cc b/third_party/blink/renderer/modules/webaudio/convolver_node_test.cc index 548264494ef5ff..cb5179a2dd1170 100644 --- a/third_party/blink/renderer/modules/webaudio/convolver_node_test.cc +++ b/third_party/blink/renderer/modules/webaudio/convolver_node_test.cc @@ -5,6 +5,7 @@ #include #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/renderer/core/testing/dummy_page_holder.h" +#include "third_party/blink/renderer/modules/webaudio/audio_buffer.h" #include "third_party/blink/renderer/modules/webaudio/convolver_node.h" #include "third_party/blink/renderer/modules/webaudio/offline_audio_context.h" diff --git a/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc b/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc index 43552f6a2bc94a..0ed8c178c7bc4e 100644 --- a/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc +++ b/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.cc @@ -25,11 +25,17 @@ #include "third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h" +#include "third_party/blink/renderer/modules/webaudio/audio_node_input.h" +#include "third_party/blink/renderer/modules/webaudio/audio_node_output.h" #include "third_party/blink/renderer/modules/webaudio/audio_worklet.h" #include "third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.h" #include "third_party/blink/renderer/modules/webaudio/base_audio_context.h" #include "third_party/blink/renderer/platform/bindings/exception_messages.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/audio/audio_utilities.h" +#include "third_party/blink/renderer/platform/audio/denormal_disabler.h" +#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" +#include "third_party/blink/renderer/platform/wtf/atomics.h" namespace blink { @@ -175,6 +181,73 @@ int DefaultAudioDestinationHandler::GetFramesPerBuffer() const { return destination_ ? destination_->FramesPerBuffer() : 0; } +void DefaultAudioDestinationHandler::Render( + AudioBus* destination_bus, + size_t number_of_frames, + const AudioIOPosition& output_position) { + TRACE_EVENT0("webaudio", "DefaultAudioDestinationHandler::Render"); + + // We don't want denormals slowing down any of the audio processing + // since they can very seriously hurt performance. This will take care of all + // AudioNodes because they all process within this scope. + DenormalDisabler denormal_disabler; + + // Need to check if the context actually alive. Otherwise the subsequent + // steps will fail. If the context is not alive somehow, return immediately + // and do nothing. + // + // TODO(hongchan): because the context can go away while rendering, so this + // check cannot guarantee the safe execution of the following steps. + DCHECK(Context()); + if (!Context()) + return; + + Context()->GetDeferredTaskHandler().SetAudioThreadToCurrentThread(); + + // If the destination node is not initialized, pass the silence to the final + // audio destination (one step before the FIFO). This check is for the case + // where the destination is in the middle of tearing down process. + if (!IsInitialized()) { + destination_bus->Zero(); + return; + } + + // Let the context take care of any business at the start of each render + // quantum. + Context()->HandlePreRenderTasks(output_position); + + DCHECK_GE(NumberOfInputs(), 1u); + if (NumberOfInputs() < 1) { + destination_bus->Zero(); + return; + } + // This will cause the node(s) connected to us to process, which in turn will + // pull on their input(s), all the way backwards through the rendering graph. + AudioBus* rendered_bus = Input(0).Pull(destination_bus, number_of_frames); + + if (!rendered_bus) { + destination_bus->Zero(); + } else if (rendered_bus != destination_bus) { + // in-place processing was not possible - so copy + destination_bus->CopyFrom(*rendered_bus); + } + + // Process nodes which need a little extra help because they are not connected + // to anything, but still need to process. + Context()->GetDeferredTaskHandler().ProcessAutomaticPullNodes( + number_of_frames); + + // Let the context take care of any business at the end of each render + // quantum. + Context()->HandlePostRenderTasks(); + + // Advance current sample-frame. + size_t new_sample_frame = current_sample_frame_ + number_of_frames; + ReleaseStore(¤t_sample_frame_, new_sample_frame); + + Context()->UpdateWorkletGlobalScopeOnRenderingThread(); +} + // ---------------------------------------------------------------- DefaultAudioDestinationNode::DefaultAudioDestinationNode( diff --git a/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h b/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h index 7ea62afa2003b5..8eb2802f2d2f8b 100644 --- a/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h +++ b/third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h @@ -30,6 +30,7 @@ #include "third_party/blink/public/platform/web_audio_latency_hint.h" #include "third_party/blink/renderer/modules/webaudio/audio_destination_node.h" #include "third_party/blink/renderer/platform/audio/audio_destination.h" +#include "third_party/blink/renderer/platform/audio/audio_io_callback.h" namespace blink { @@ -37,7 +38,8 @@ class BaseAudioContext; class ExceptionState; class WebAudioLatencyHint; -class DefaultAudioDestinationHandler final : public AudioDestinationHandler { +class DefaultAudioDestinationHandler final : public AudioDestinationHandler, + public AudioIOCallback { public: static scoped_refptr Create( AudioNode&, @@ -57,6 +59,12 @@ class DefaultAudioDestinationHandler final : public AudioDestinationHandler { unsigned long MaxChannelCount() const override; double SampleRate() const override; + // Implements AudioIOCallback: invoked by Platform AudioDestination to get + // the next render quantum into |destination_bus|. + void Render(AudioBus* destination_bus, + size_t number_of_frames, + const AudioIOPosition& output_position) final; + // Returns a hadrware callback buffer size from audio infra. size_t GetCallbackBufferSize() const;