Skip to content

Commit

Permalink
Move AudioIOCallback class to DefaultAudioDestinationNode
Browse files Browse the repository at this point in the history
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 <[email protected]>
Commit-Queue: Hongchan Choi <[email protected]>
Cr-Commit-Position: refs/heads/master@{#570167}
  • Loading branch information
hoch authored and Commit Bot committed Jun 25, 2018
1 parent 35d4c58 commit 856dfa8
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 86 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -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(&current_sample_frame_, new_sample_frame);

Context()->UpdateWorkletGlobalScopeOnRenderingThread();
}

// ----------------------------------------------------------------

AudioDestinationNode::AudioDestinationNode(BaseAudioContext& context)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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(&current_sample_frame_);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
#include <memory>
#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"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand Down Expand Up @@ -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(&current_sample_frame_, new_sample_frame);

Context()->UpdateWorkletGlobalScopeOnRenderingThread();
}

// ----------------------------------------------------------------

DefaultAudioDestinationNode::DefaultAudioDestinationNode(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,16 @@
#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 {

class BaseAudioContext;
class ExceptionState;
class WebAudioLatencyHint;

class DefaultAudioDestinationHandler final : public AudioDestinationHandler {
class DefaultAudioDestinationHandler final : public AudioDestinationHandler,
public AudioIOCallback {
public:
static scoped_refptr<DefaultAudioDestinationHandler> Create(
AudioNode&,
Expand All @@ -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;

Expand Down

0 comments on commit 856dfa8

Please sign in to comment.