summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc
diff options
context:
space:
mode:
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.cc38
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());
}