| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chromecast/media/audio/cast_audio_manager.h" | 5 #include "chromecast/media/audio/cast_audio_manager.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| 11 #include "base/memory/ptr_util.h" |
| 11 #include "chromecast/media/audio/cast_audio_mixer.h" | 12 #include "chromecast/media/audio/cast_audio_mixer.h" |
| 12 #include "chromecast/media/audio/cast_audio_output_stream.h" | 13 #include "chromecast/media/audio/cast_audio_output_stream.h" |
| 13 #include "chromecast/media/cma/backend/media_pipeline_backend_manager.h" | 14 #include "chromecast/media/cma/backend/media_pipeline_backend_factory.h" |
| 15 #include "chromecast/public/media/media_pipeline_backend.h" |
| 14 | 16 |
| 15 namespace { | 17 namespace { |
| 16 // TODO(alokp): Query the preferred value from media backend. | 18 // TODO(alokp): Query the preferred value from media backend. |
| 17 const int kDefaultSampleRate = 48000; | 19 const int kDefaultSampleRate = 48000; |
| 18 | 20 |
| 19 // Define bounds for the output buffer size (in frames). | 21 // Define bounds for the output buffer size (in frames). |
| 20 // Note: These values are copied from AudioManagerPulse implementation. | 22 // Note: These values are copied from AudioManagerPulse implementation. |
| 21 // TODO(alokp): Query the preferred value from media backend. | 23 // TODO(alokp): Query the preferred value from media backend. |
| 22 static const int kMinimumOutputBufferSize = 512; | 24 static const int kMinimumOutputBufferSize = 512; |
| 23 static const int kMaximumOutputBufferSize = 8192; | 25 static const int kMaximumOutputBufferSize = 8192; |
| 24 static const int kDefaultOutputBufferSize = 2048; | 26 static const int kDefaultOutputBufferSize = 2048; |
| 25 } // namespace | 27 } // namespace |
| 26 | 28 |
| 27 namespace chromecast { | 29 namespace chromecast { |
| 28 namespace media { | 30 namespace media { |
| 29 | 31 |
| 30 CastAudioManager::CastAudioManager( | 32 CastAudioManager::CastAudioManager( |
| 31 std::unique_ptr<::media::AudioThread> audio_thread, | 33 std::unique_ptr<::media::AudioThread> audio_thread, |
| 32 ::media::AudioLogFactory* audio_log_factory, | 34 ::media::AudioLogFactory* audio_log_factory, |
| 33 MediaPipelineBackendManager* backend_manager) | 35 std::unique_ptr<MediaPipelineBackendFactory> backend_factory, |
| 34 : CastAudioManager(std::move(audio_thread), | 36 scoped_refptr<base::SingleThreadTaskRunner> backend_task_runner, |
| 35 audio_log_factory, | 37 bool use_mixer) |
| 36 backend_manager, | |
| 37 new CastAudioMixer( | |
| 38 base::Bind(&CastAudioManager::MakeMixerOutputStream, | |
| 39 base::Unretained(this)))) {} | |
| 40 | |
| 41 CastAudioManager::CastAudioManager( | |
| 42 std::unique_ptr<::media::AudioThread> audio_thread, | |
| 43 ::media::AudioLogFactory* audio_log_factory, | |
| 44 MediaPipelineBackendManager* backend_manager, | |
| 45 CastAudioMixer* audio_mixer) | |
| 46 : AudioManagerBase(std::move(audio_thread), audio_log_factory), | 38 : AudioManagerBase(std::move(audio_thread), audio_log_factory), |
| 47 backend_manager_(backend_manager), | 39 backend_factory_(std::move(backend_factory)), |
| 48 mixer_(audio_mixer) {} | 40 backend_task_runner_(std::move(backend_task_runner)) { |
| 41 if (use_mixer) |
| 42 mixer_ = base::MakeUnique<CastAudioMixer>(this); |
| 43 } |
| 49 | 44 |
| 50 CastAudioManager::~CastAudioManager() = default; | 45 CastAudioManager::~CastAudioManager() = default; |
| 51 | 46 |
| 52 bool CastAudioManager::HasAudioOutputDevices() { | 47 bool CastAudioManager::HasAudioOutputDevices() { |
| 53 return true; | 48 return true; |
| 54 } | 49 } |
| 55 | 50 |
| 56 bool CastAudioManager::HasAudioInputDevices() { | 51 bool CastAudioManager::HasAudioInputDevices() { |
| 57 return false; | 52 return false; |
| 58 } | 53 } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 73 // Need to send a valid AudioParameters object even when it will unused. | 68 // Need to send a valid AudioParameters object even when it will unused. |
| 74 return ::media::AudioParameters( | 69 return ::media::AudioParameters( |
| 75 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, | 70 ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 76 ::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024); | 71 ::media::CHANNEL_LAYOUT_STEREO, 48000, 16, 1024); |
| 77 } | 72 } |
| 78 | 73 |
| 79 const char* CastAudioManager::GetName() { | 74 const char* CastAudioManager::GetName() { |
| 80 return "Cast"; | 75 return "Cast"; |
| 81 } | 76 } |
| 82 | 77 |
| 83 std::unique_ptr<MediaPipelineBackend> | |
| 84 CastAudioManager::CreateMediaPipelineBackend( | |
| 85 const MediaPipelineDeviceParams& params) { | |
| 86 return backend_manager_->CreateMediaPipelineBackend(params); | |
| 87 } | |
| 88 | |
| 89 void CastAudioManager::ReleaseOutputStream(::media::AudioOutputStream* stream) { | 78 void CastAudioManager::ReleaseOutputStream(::media::AudioOutputStream* stream) { |
| 90 // If |stream| is |mixer_output_stream_|, we should not use | 79 // If |stream| is |mixer_output_stream_|, we should not use |
| 91 // AudioManagerBase::ReleaseOutputStream as we do not want the release | 80 // AudioManagerBase::ReleaseOutputStream as we do not want the release |
| 92 // function to decrement |AudioManagerBase::num_output_streams_|. This is | 81 // function to decrement |AudioManagerBase::num_output_streams_|. This is |
| 93 // because the stream generated from MakeMixerOutputStream was not created | 82 // because the stream generated from MakeMixerOutputStream was not created |
| 94 // using AudioManagerBase::MakeAudioOutputStream, which appropriately | 83 // using AudioManagerBase::MakeAudioOutputStream, which appropriately |
| 95 // increments this variable. | 84 // increments this variable. |
| 96 if (mixer_output_stream_.get() == stream) { | 85 if (mixer_output_stream_.get() == stream) { |
| 97 DCHECK(mixer_); // Should only occur if |mixer_| exists | 86 DCHECK(mixer_); // Should only occur if |mixer_| exists |
| 98 mixer_output_stream_.reset(); | 87 mixer_output_stream_.reset(); |
| 99 } else { | 88 } else { |
| 100 AudioManagerBase::ReleaseOutputStream(stream); | 89 AudioManagerBase::ReleaseOutputStream(stream); |
| 101 } | 90 } |
| 102 } | 91 } |
| 103 | 92 |
| 104 ::media::AudioOutputStream* CastAudioManager::MakeLinearOutputStream( | 93 ::media::AudioOutputStream* CastAudioManager::MakeLinearOutputStream( |
| 105 const ::media::AudioParameters& params, | 94 const ::media::AudioParameters& params, |
| 106 const ::media::AudioManager::LogCallback& log_callback) { | 95 const ::media::AudioManager::LogCallback& log_callback) { |
| 107 DCHECK_EQ(::media::AudioParameters::AUDIO_PCM_LINEAR, params.format()); | 96 DCHECK_EQ(::media::AudioParameters::AUDIO_PCM_LINEAR, params.format()); |
| 108 | 97 |
| 109 // If |mixer_| exists, return a mixing stream. | 98 // If |mixer_| exists, return a mixing stream. |
| 110 if (mixer_) | 99 if (mixer_) |
| 111 return mixer_->MakeStream(params, this); | 100 return mixer_->MakeStream(params); |
| 112 else | 101 else |
| 113 return new CastAudioOutputStream(params, this); | 102 return new CastAudioOutputStream(params, this); |
| 114 } | 103 } |
| 115 | 104 |
| 116 ::media::AudioOutputStream* CastAudioManager::MakeLowLatencyOutputStream( | 105 ::media::AudioOutputStream* CastAudioManager::MakeLowLatencyOutputStream( |
| 117 const ::media::AudioParameters& params, | 106 const ::media::AudioParameters& params, |
| 118 const std::string& device_id, | 107 const std::string& device_id, |
| 119 const ::media::AudioManager::LogCallback& log_callback) { | 108 const ::media::AudioManager::LogCallback& log_callback) { |
| 120 DCHECK_EQ(::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); | 109 DCHECK_EQ(::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); |
| 121 | 110 |
| 122 // If |mixer_| exists, return a mixing stream. | 111 // If |mixer_| exists, return a mixing stream. |
| 123 if (mixer_) | 112 if (mixer_) |
| 124 return mixer_->MakeStream(params, this); | 113 return mixer_->MakeStream(params); |
| 125 else | 114 else |
| 126 return new CastAudioOutputStream(params, this); | 115 return new CastAudioOutputStream(params, this); |
| 127 } | 116 } |
| 128 | 117 |
| 129 ::media::AudioInputStream* CastAudioManager::MakeLinearInputStream( | 118 ::media::AudioInputStream* CastAudioManager::MakeLinearInputStream( |
| 130 const ::media::AudioParameters& params, | 119 const ::media::AudioParameters& params, |
| 131 const std::string& device_id, | 120 const std::string& device_id, |
| 132 const ::media::AudioManager::LogCallback& log_callback) { | 121 const ::media::AudioManager::LogCallback& log_callback) { |
| 133 LOG(WARNING) << "No support for input audio devices"; | 122 LOG(WARNING) << "No support for input audio devices"; |
| 134 return nullptr; | 123 return nullptr; |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 172 DCHECK(!mixer_output_stream_); // Only allow 1 |mixer_output_stream_|. | 161 DCHECK(!mixer_output_stream_); // Only allow 1 |mixer_output_stream_|. |
| 173 | 162 |
| 174 // Keep a reference to this stream for proper behavior on | 163 // Keep a reference to this stream for proper behavior on |
| 175 // CastAudioManager::ReleaseOutputStream. | 164 // CastAudioManager::ReleaseOutputStream. |
| 176 mixer_output_stream_.reset(new CastAudioOutputStream(params, this)); | 165 mixer_output_stream_.reset(new CastAudioOutputStream(params, this)); |
| 177 return mixer_output_stream_.get(); | 166 return mixer_output_stream_.get(); |
| 178 } | 167 } |
| 179 | 168 |
| 180 } // namespace media | 169 } // namespace media |
| 181 } // namespace chromecast | 170 } // namespace chromecast |
| OLD | NEW |