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.cc58
1 files changed, 37 insertions, 21 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 5e740515fed..6f99b28263c 100644
--- a/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc
+++ b/chromium/third_party/blink/renderer/platform/audio/audio_destination.cc
@@ -40,7 +40,7 @@
#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"
-#include "third_party/blink/renderer/platform/web_task_runner.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
namespace blink {
@@ -64,14 +64,14 @@ AudioDestination::AudioDestination(AudioIOCallback& callback,
unsigned number_of_output_channels,
const WebAudioLatencyHint& latency_hint)
: number_of_output_channels_(number_of_output_channels),
- is_playing_(false),
+ play_state_(PlayState::kStopped),
fifo_(
std::make_unique<PushPullFIFO>(number_of_output_channels, kFIFOSize)),
output_bus_(AudioBus::Create(number_of_output_channels,
- AudioUtilities::kRenderQuantumFrames,
+ audio_utilities::kRenderQuantumFrames,
false)),
render_bus_(AudioBus::Create(number_of_output_channels,
- AudioUtilities::kRenderQuantumFrames)),
+ audio_utilities::kRenderQuantumFrames)),
callback_(callback),
frames_elapsed_(0) {
// Create WebAudioDevice. blink::WebAudioDevice is designed to support the
@@ -88,7 +88,7 @@ AudioDestination::AudioDestination(AudioIOCallback& callback,
// first FIFO pulls from causing "underflow" errors.
const unsigned priming_render_quanta =
ceil(callback_buffer_size_ /
- static_cast<float>(AudioUtilities::kRenderQuantumFrames));
+ static_cast<float>(audio_utilities::kRenderQuantumFrames));
for (unsigned i = 0; i < priming_render_quanta; ++i) {
fifo_->Push(render_bus_.get());
}
@@ -169,11 +169,11 @@ void AudioDestination::RequestRender(size_t frames_requested,
base::TimeTicks received_timestamp = base::TimeTicks::Now();
for (size_t pushed_frames = 0; pushed_frames < frames_to_render;
- pushed_frames += AudioUtilities::kRenderQuantumFrames) {
+ pushed_frames += audio_utilities::kRenderQuantumFrames) {
// If platform buffer is more than two times longer than |framesToProcess|
// we do not want output position to get stuck so we promote it
// using the elapsed time from the moment it was initially obtained.
- if (callback_buffer_size_ > AudioUtilities::kRenderQuantumFrames * 2) {
+ if (callback_buffer_size_ > audio_utilities::kRenderQuantumFrames * 2) {
double delta = (base::TimeTicks::Now() - received_timestamp).InSecondsF();
output_position.position += delta;
output_position.timestamp += delta;
@@ -185,8 +185,8 @@ void AudioDestination::RequestRender(size_t frames_requested,
output_position.position = 0.0;
// Process WebAudio graph and push the rendered output to FIFO.
- callback_.Render(render_bus_.get(),
- AudioUtilities::kRenderQuantumFrames, output_position);
+ callback_.Render(render_bus_.get(), audio_utilities::kRenderQuantumFrames,
+ output_position);
fifo_->Push(render_bus_.get());
}
@@ -198,10 +198,10 @@ void AudioDestination::Start() {
DCHECK(IsMainThread());
// Start the "audio device" after the rendering thread is ready.
- if (web_audio_device_ && !is_playing_) {
+ if (web_audio_device_ && play_state_ == PlayState::kStopped) {
TRACE_EVENT0("webaudio", "AudioDestination::Start");
web_audio_device_->Start();
- is_playing_ = true;
+ play_state_ = PlayState::kPlaying;
}
}
@@ -209,11 +209,11 @@ void AudioDestination::StartWithWorkletTaskRunner(
scoped_refptr<base::SingleThreadTaskRunner> worklet_task_runner) {
DCHECK(IsMainThread());
- if (web_audio_device_ && !is_playing_) {
+ if (web_audio_device_ && play_state_ == PlayState::kStopped) {
TRACE_EVENT0("webaudio", "AudioDestination::Start");
worklet_task_runner_ = std::move(worklet_task_runner);
web_audio_device_->Start();
- is_playing_ = true;
+ play_state_ = PlayState::kPlaying;
}
}
@@ -222,11 +222,27 @@ void AudioDestination::Stop() {
// This assumes stopping the "audio device" is synchronous and dumping the
// rendering thread is safe after that.
- if (web_audio_device_ && is_playing_) {
+ if (web_audio_device_ && play_state_ != PlayState::kStopped) {
TRACE_EVENT0("webaudio", "AudioDestination::Stop");
web_audio_device_->Stop();
worklet_task_runner_ = nullptr;
- is_playing_ = false;
+ play_state_ = PlayState::kStopped;
+ }
+}
+
+void AudioDestination::Pause() {
+ DCHECK(IsMainThread());
+ if (web_audio_device_ && play_state_ == PlayState::kPlaying) {
+ web_audio_device_->Pause();
+ play_state_ = PlayState::kPaused;
+ }
+}
+
+void AudioDestination::Resume() {
+ DCHECK(IsMainThread());
+ if (web_audio_device_ && play_state_ == PlayState::kPaused) {
+ web_audio_device_->Resume();
+ play_state_ = PlayState::kPlaying;
}
}
@@ -237,7 +253,7 @@ size_t AudioDestination::CallbackBufferSize() const {
bool AudioDestination::IsPlaying() {
DCHECK(IsMainThread());
- return is_playing_;
+ return play_state_ == PlayState::kPlaying;
}
int AudioDestination::FramesPerBuffer() const {
@@ -253,9 +269,8 @@ float AudioDestination::HardwareSampleRate() {
return static_cast<float>(Platform::Current()->AudioHardwareSampleRate());
}
-unsigned long AudioDestination::MaxChannelCount() {
- return static_cast<unsigned long>(
- Platform::Current()->AudioHardwareOutputChannels());
+uint32_t AudioDestination::MaxChannelCount() {
+ return Platform::Current()->AudioHardwareOutputChannels();
}
bool AudioDestination::CheckBufferSize() {
@@ -275,8 +290,9 @@ bool AudioDestination::CheckBufferSize() {
// Check if the requested buffer size is too large.
bool is_buffer_size_valid =
- callback_buffer_size_ + AudioUtilities::kRenderQuantumFrames <= kFIFOSize;
- DCHECK_LE(callback_buffer_size_ + AudioUtilities::kRenderQuantumFrames,
+ callback_buffer_size_ + audio_utilities::kRenderQuantumFrames <=
+ kFIFOSize;
+ DCHECK_LE(callback_buffer_size_ + audio_utilities::kRenderQuantumFrames,
kFIFOSize);
return is_buffer_size_valid;
}