diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/audio/audio_destination.cc')
-rw-r--r-- | chromium/third_party/blink/renderer/platform/audio/audio_destination.cc | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc b/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc index 24e122b12ac..1c98e7ca63f 100644 --- a/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc +++ b/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc @@ -36,6 +36,7 @@ #include "third_party/blink/public/platform/web_audio_latency_hint.h" #include "third_party/blink/renderer/platform/audio/audio_utilities.h" #include "third_party/blink/renderer/platform/audio/push_pull_fifo.h" +#include "third_party/blink/renderer/platform/audio/vector_math.h" #include "third_party/blink/renderer/platform/cross_thread_functional.h" #include "third_party/blink/renderer/platform/histogram.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" @@ -149,6 +150,23 @@ void AudioDestination::Render(const WebVector<float*>& destination_data, delay_timestamp, "delay (s)", delay); } +// Determine if the rendered data is audible. +static bool IsAudible(const AudioBus* rendered_data) { + // Compute the energy in each channel and sum up the energy in each channel + // for the total energy. + float energy = 0; + + unsigned data_size = rendered_data->length(); + for (unsigned k = 0; k < rendered_data->NumberOfChannels(); ++k) { + const float* data = rendered_data->Channel(k)->Data(); + float channel_energy; + VectorMath::Vsvesq(data, 1, &channel_energy, data_size); + energy += channel_energy; + } + + return energy > 0; +} + void AudioDestination::RequestRender(size_t frames_requested, size_t frames_to_render, double delay, @@ -183,8 +201,26 @@ void AudioDestination::RequestRender(size_t frames_requested, output_position.position = 0.0; // Process WebAudio graph and push the rendered output to FIFO. - callback_.Render(nullptr, render_bus_.get(), + callback_.Render(render_bus_.get(), AudioUtilities::kRenderQuantumFrames, output_position); + + // Detect silence (or not) for MEI + bool is_audible = IsAudible(render_bus_.get()); + + if (is_audible) { + ++total_audible_renders_; + } + + if (was_audible_) { + if (!is_audible) { + was_audible_ = false; + } + } else { + if (is_audible) { + was_audible_ = true; + } + } + fifo_->Push(render_bus_.get()); } |