| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chromecast/media/audio/cast_audio_device_factory.h" |
| |
| #include <string> |
| |
| #include "content/renderer/media/audio/audio_output_ipc_factory.h" |
| #include "media/audio/audio_output_device.h" |
| #include "media/base/audio_capturer_source.h" |
| #include "media/base/audio_parameters.h" |
| #include "media/base/audio_renderer_sink.h" |
| #include "media/base/output_device_info.h" |
| |
| namespace chromecast { |
| namespace media { |
| |
| class NonSwitchableAudioRendererSink |
| : public ::media::SwitchableAudioRendererSink { |
| public: |
| explicit NonSwitchableAudioRendererSink( |
| scoped_refptr<::media::AudioOutputDevice> output_device) |
| : output_device_(std::move(output_device)) {} |
| |
| void Initialize(const ::media::AudioParameters& params, |
| RenderCallback* callback) override { |
| output_device_->Initialize(params, callback); |
| } |
| |
| void Start() override { output_device_->Start(); } |
| |
| void Stop() override { output_device_->Stop(); } |
| |
| void Pause() override { output_device_->Pause(); } |
| |
| void Play() override { output_device_->Play(); } |
| |
| bool SetVolume(double volume) override { |
| return output_device_->SetVolume(volume); |
| } |
| |
| ::media::OutputDeviceInfo GetOutputDeviceInfo() override { |
| return output_device_->GetOutputDeviceInfo(); |
| } |
| |
| void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override { |
| output_device_->GetOutputDeviceInfoAsync(std::move(info_cb)); |
| } |
| |
| bool IsOptimizedForHardwareParameters() override { |
| return output_device_->IsOptimizedForHardwareParameters(); |
| } |
| |
| bool CurrentThreadIsRenderingThread() override { |
| return output_device_->CurrentThreadIsRenderingThread(); |
| } |
| |
| void SwitchOutputDevice(const std::string& device_id, |
| ::media::OutputDeviceStatusCB callback) override { |
| LOG(ERROR) << __func__ << " is not suported."; |
| std::move(callback).Run(::media::OUTPUT_DEVICE_STATUS_ERROR_INTERNAL); |
| } |
| |
| void Flush() override { output_device_->Flush(); } |
| |
| protected: |
| ~NonSwitchableAudioRendererSink() override = default; |
| |
| private: |
| scoped_refptr<::media::AudioOutputDevice> output_device_; |
| }; |
| |
| scoped_refptr<::media::AudioOutputDevice> NewOutputDevice( |
| int render_frame_id, |
| const ::media::AudioSinkParameters& params, |
| base::TimeDelta auth_timeout) { |
| auto device = base::MakeRefCounted<::media::AudioOutputDevice>( |
| content::AudioOutputIPCFactory::get()->CreateAudioOutputIPC( |
| render_frame_id), |
| content::AudioOutputIPCFactory::get()->io_task_runner(), params, |
| auth_timeout); |
| device->RequestDeviceAuthorization(); |
| return device; |
| } |
| |
| CastAudioDeviceFactory::CastAudioDeviceFactory() |
| : content::AudioDeviceFactory() { |
| DVLOG(1) << "Register CastAudioDeviceFactory"; |
| } |
| |
| CastAudioDeviceFactory::~CastAudioDeviceFactory() { |
| DVLOG(1) << "Unregister CastAudioDeviceFactory"; |
| } |
| |
| scoped_refptr<::media::AudioRendererSink> |
| CastAudioDeviceFactory::CreateFinalAudioRendererSink( |
| int render_frame_id, |
| const ::media::AudioSinkParameters& params, |
| base::TimeDelta auth_timeout) { |
| // Use default implementation. |
| return nullptr; |
| } |
| |
| scoped_refptr<::media::AudioRendererSink> |
| CastAudioDeviceFactory::CreateAudioRendererSink( |
| blink::WebAudioDeviceSourceType source_type, |
| int render_frame_id, |
| const ::media::AudioSinkParameters& params) { |
| // Use default implementation. |
| return nullptr; |
| } |
| |
| scoped_refptr<::media::SwitchableAudioRendererSink> |
| CastAudioDeviceFactory::CreateSwitchableAudioRendererSink( |
| blink::WebAudioDeviceSourceType source_type, |
| int render_frame_id, |
| const ::media::AudioSinkParameters& params) { |
| return base::MakeRefCounted<NonSwitchableAudioRendererSink>(NewOutputDevice( |
| render_frame_id, params, base::TimeDelta::FromSeconds(100))); |
| } |
| |
| scoped_refptr<::media::AudioCapturerSource> |
| CastAudioDeviceFactory::CreateAudioCapturerSource( |
| int render_frame_id, |
| const ::media::AudioSourceParameters& params) { |
| // Use default implementation. |
| return nullptr; |
| } |
| |
| } // namespace media |
| } // namespace chromecast |