| // Copyright 2013 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/base/fake_audio_renderer_sink.h" |
| |
| #include "base/functional/bind.h" |
| #include "base/location.h" |
| #include "base/logging.h" |
| #include "base/task/sequenced_task_runner.h" |
| #include "media/base/audio_glitch_info.h" |
| |
| namespace media { |
| |
| FakeAudioRendererSink::FakeAudioRendererSink() |
| : FakeAudioRendererSink( |
| AudioParameters(AudioParameters::AUDIO_FAKE, |
| ChannelLayoutConfig::Stereo(), |
| AudioParameters::kTelephoneSampleRate, |
| 1)) {} |
| |
| FakeAudioRendererSink::FakeAudioRendererSink( |
| const AudioParameters& hardware_params) |
| : state_(kUninitialized), |
| callback_(nullptr), |
| output_device_info_(std::string(), |
| OUTPUT_DEVICE_STATUS_OK, |
| hardware_params), |
| is_optimized_for_hw_params_(true) {} |
| |
| FakeAudioRendererSink::~FakeAudioRendererSink() { |
| DCHECK(!callback_); |
| } |
| |
| void FakeAudioRendererSink::Initialize(const AudioParameters& params, |
| RenderCallback* callback) { |
| DCHECK(state_ == kUninitialized || state_ == kStopped); |
| DCHECK(!callback_); |
| DCHECK(callback); |
| |
| callback_ = callback; |
| ChangeState(kInitialized); |
| } |
| |
| void FakeAudioRendererSink::Start() { |
| DCHECK_EQ(state_, kInitialized); |
| ChangeState(kStarted); |
| } |
| |
| void FakeAudioRendererSink::Stop() { |
| callback_ = nullptr; |
| ChangeState(kStopped); |
| } |
| |
| void FakeAudioRendererSink::Flush() { |
| DCHECK_NE(state_, kPlaying); |
| } |
| |
| void FakeAudioRendererSink::Pause() { |
| DCHECK(state_ == kStarted || state_ == kPlaying) << "state_ " << state_; |
| ChangeState(kPaused); |
| } |
| |
| void FakeAudioRendererSink::Play() { |
| DCHECK(state_ == kStarted || state_ == kPaused) << "state_ " << state_; |
| ChangeState(kPlaying); |
| } |
| |
| bool FakeAudioRendererSink::SetVolume(double volume) { |
| return true; |
| } |
| |
| OutputDeviceInfo FakeAudioRendererSink::GetOutputDeviceInfo() { |
| return output_device_info_; |
| } |
| |
| void FakeAudioRendererSink::GetOutputDeviceInfoAsync( |
| OutputDeviceInfoCB info_cb) { |
| base::SequencedTaskRunner::GetCurrentDefault()->PostTask( |
| FROM_HERE, base::BindOnce(std::move(info_cb), output_device_info_)); |
| } |
| |
| bool FakeAudioRendererSink::IsOptimizedForHardwareParameters() { |
| return is_optimized_for_hw_params_; |
| } |
| |
| bool FakeAudioRendererSink::CurrentThreadIsRenderingThread() { |
| NOTIMPLEMENTED(); |
| return false; |
| } |
| |
| bool FakeAudioRendererSink::Render(AudioBus* dest, |
| base::TimeDelta delay, |
| int* frames_written) { |
| if (state_ != kPlaying) |
| return false; |
| |
| *frames_written = callback_->Render(delay, base::TimeTicks::Now(), {}, dest); |
| return true; |
| } |
| |
| void FakeAudioRendererSink::OnRenderError() { |
| DCHECK_NE(state_, kUninitialized); |
| DCHECK_NE(state_, kStopped); |
| |
| callback_->OnRenderError(); |
| } |
| |
| void FakeAudioRendererSink::SetIsOptimizedForHardwareParameters(bool value) { |
| is_optimized_for_hw_params_ = value; |
| } |
| |
| void FakeAudioRendererSink::ChangeState(State new_state) { |
| static const char* kStateNames[] = { |
| "kUninitialized", |
| "kInitialized", |
| "kStarted", |
| "kPaused", |
| "kPlaying", |
| "kStopped" |
| }; |
| |
| DVLOG(1) << __func__ << " : " << kStateNames[state_] << " -> " |
| << kStateNames[new_state]; |
| state_ = new_state; |
| } |
| |
| } // namespace media |