Commit 856dfa81 authored by Hongchan Choi's avatar Hongchan Choi Committed by Commit Bot

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/1113955Reviewed-by: default avatarRaymond Toy <rtoy@chromium.org>
Commit-Queue: Hongchan Choi <hongchan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#570167}
parent 35d4c584
...@@ -24,13 +24,8 @@ ...@@ -24,13 +24,8 @@
*/ */
#include "third_party/blink/renderer/modules/webaudio/audio_destination_node.h" #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/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 { namespace blink {
...@@ -43,72 +38,6 @@ AudioDestinationHandler::~AudioDestinationHandler() { ...@@ -43,72 +38,6 @@ AudioDestinationHandler::~AudioDestinationHandler() {
DCHECK(!IsInitialized()); 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(&current_sample_frame_, new_sample_frame);
Context()->UpdateWorkletGlobalScopeOnRenderingThread();
}
// ---------------------------------------------------------------- // ----------------------------------------------------------------
AudioDestinationNode::AudioDestinationNode(BaseAudioContext& context) AudioDestinationNode::AudioDestinationNode(BaseAudioContext& context)
......
...@@ -26,17 +26,12 @@ ...@@ -26,17 +26,12 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_DESTINATION_NODE_H_ #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_WEBAUDIO_AUDIO_DESTINATION_NODE_H_
#define 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/modules/webaudio/audio_node.h"
#include "third_party/blink/renderer/platform/audio/audio_bus.h" #include "third_party/blink/renderer/platform/wtf/atomics.h"
#include "third_party/blink/renderer/platform/audio/audio_io_callback.h"
namespace blink { namespace blink {
class AudioBus; class AudioDestinationHandler : public AudioHandler {
class BaseAudioContext;
class AudioDestinationHandler : public AudioHandler, public AudioIOCallback {
public: public:
AudioDestinationHandler(AudioNode&); AudioDestinationHandler(AudioNode&);
~AudioDestinationHandler() override; ~AudioDestinationHandler() override;
...@@ -45,12 +40,6 @@ class AudioDestinationHandler : public AudioHandler, public AudioIOCallback { ...@@ -45,12 +40,6 @@ class AudioDestinationHandler : public AudioHandler, public AudioIOCallback {
void Process(size_t) final { void Process(size_t) final {
} // we're pulled by hardware so this is never called } // 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 { size_t CurrentSampleFrame() const {
return AcquireLoad(&current_sample_frame_); return AcquireLoad(&current_sample_frame_);
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "third_party/blink/renderer/modules/webaudio/deferred_task_handler.h" #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/modules/webaudio/iir_filter_node.h"
#include "third_party/blink/renderer/platform/audio/audio_bus.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/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h"
#include "third_party/blink/renderer/platform/wtf/threading.h" #include "third_party/blink/renderer/platform/wtf/threading.h"
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <memory> #include <memory>
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/testing/dummy_page_holder.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/convolver_node.h"
#include "third_party/blink/renderer/modules/webaudio/offline_audio_context.h" #include "third_party/blink/renderer/modules/webaudio/offline_audio_context.h"
......
...@@ -25,11 +25,17 @@ ...@@ -25,11 +25,17 @@
#include "third_party/blink/renderer/modules/webaudio/default_audio_destination_node.h" #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.h"
#include "third_party/blink/renderer/modules/webaudio/audio_worklet_messaging_proxy.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/modules/webaudio/base_audio_context.h"
#include "third_party/blink/renderer/platform/bindings/exception_messages.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/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 { namespace blink {
...@@ -175,6 +181,73 @@ int DefaultAudioDestinationHandler::GetFramesPerBuffer() const { ...@@ -175,6 +181,73 @@ int DefaultAudioDestinationHandler::GetFramesPerBuffer() const {
return destination_ ? destination_->FramesPerBuffer() : 0; 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(&current_sample_frame_, new_sample_frame);
Context()->UpdateWorkletGlobalScopeOnRenderingThread();
}
// ---------------------------------------------------------------- // ----------------------------------------------------------------
DefaultAudioDestinationNode::DefaultAudioDestinationNode( DefaultAudioDestinationNode::DefaultAudioDestinationNode(
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "third_party/blink/public/platform/web_audio_latency_hint.h" #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/modules/webaudio/audio_destination_node.h"
#include "third_party/blink/renderer/platform/audio/audio_destination.h" #include "third_party/blink/renderer/platform/audio/audio_destination.h"
#include "third_party/blink/renderer/platform/audio/audio_io_callback.h"
namespace blink { namespace blink {
...@@ -37,7 +38,8 @@ class BaseAudioContext; ...@@ -37,7 +38,8 @@ class BaseAudioContext;
class ExceptionState; class ExceptionState;
class WebAudioLatencyHint; class WebAudioLatencyHint;
class DefaultAudioDestinationHandler final : public AudioDestinationHandler { class DefaultAudioDestinationHandler final : public AudioDestinationHandler,
public AudioIOCallback {
public: public:
static scoped_refptr<DefaultAudioDestinationHandler> Create( static scoped_refptr<DefaultAudioDestinationHandler> Create(
AudioNode&, AudioNode&,
...@@ -57,6 +59,12 @@ class DefaultAudioDestinationHandler final : public AudioDestinationHandler { ...@@ -57,6 +59,12 @@ class DefaultAudioDestinationHandler final : public AudioDestinationHandler {
unsigned long MaxChannelCount() const override; unsigned long MaxChannelCount() const override;
double SampleRate() 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. // Returns a hadrware callback buffer size from audio infra.
size_t GetCallbackBufferSize() const; size_t GetCallbackBufferSize() const;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment