Index: chromecast/media/audio/cast_audio_manager.cc |
diff --git a/chromecast/media/audio/cast_audio_manager.cc b/chromecast/media/audio/cast_audio_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2759f0de6a3337c6e0a0306f04f6d0b395475b05 |
--- /dev/null |
+++ b/chromecast/media/audio/cast_audio_manager.cc |
@@ -0,0 +1,125 @@ |
+// Copyright 2015 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_manager.h" |
+ |
+#include "base/logging.h" |
+#include "chromecast/base/task_runner_impl.h" |
+#include "chromecast/media/audio/chromecast_device_audio_output_stream.h" |
+#include "chromecast/media/base/converters.h" |
+#include "chromecast/public/media/cast_audio_output_device.h" |
+#include "chromecast/public/media/cast_audio_output_stream.h" |
+ |
+namespace chromecast { |
+namespace media { |
+ |
+namespace { |
+ |
+// Default parameters to provide for input stream. |
+const int kDefaultBitsPerSample = 16; |
+const int kDefaultInputBufferSize = 1024; |
+const int kDefaultSampleRate = 32000; |
+ |
+} // namespace |
+ |
+CastAudioManager::CastAudioManager(::media::AudioLogFactory* audio_log_factory, |
+ CastAudioOutputDevice* output_device) |
+ : ::media::AudioManagerBase(audio_log_factory), |
+ audio_output_device_(output_device) { |
+ CHECK(audio_output_device_); |
+ SetMaxOutputStreamsAllowed( |
+ audio_output_device_->GetMaximumOutputStreamsAllowed()); |
+} |
+ |
+CastAudioManager::~CastAudioManager() { |
+ Shutdown(); |
+} |
+ |
+bool CastAudioManager::HasAudioOutputDevices() { |
+ return true; |
+} |
+ |
+bool CastAudioManager::HasAudioInputDevices() { |
+ return false; |
+} |
+ |
+void CastAudioManager::ShowAudioInputSettings() { |
+ LOG(WARNING) << "No support for input audio devices."; |
+} |
+ |
+void CastAudioManager::GetAudioInputDeviceNames( |
+ ::media::AudioDeviceNames* device_names) { |
+ LOG(WARNING) << "No support for input audio devices."; |
+} |
+ |
+::media::AudioParameters CastAudioManager::GetInputStreamParameters( |
+ const std::string& device_id) { |
+ // TODO(slan): Providing the invalid parameters impacts also the output |
+ // parameter selection during WebAudio playback (and it fails). (b/20630187). |
+ LOG(WARNING) << "No support for input audio devices."; |
+ return ::media::AudioParameters( |
+ ::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, |
+ ::media::CHANNEL_LAYOUT_STEREO, |
+ kDefaultSampleRate, |
+ kDefaultBitsPerSample, |
+ kDefaultInputBufferSize); |
+} |
+ |
+::media::AudioInputStream* CastAudioManager::MakeLinearInputStream( |
+ const ::media::AudioParameters& params, |
+ const std::string& device_id) { |
+ LOG(WARNING) << "No support for input audio devices"; |
+ return nullptr; |
+} |
+ |
+::media::AudioInputStream* CastAudioManager::MakeLowLatencyInputStream( |
+ const ::media::AudioParameters& params, |
+ const std::string& device_id) { |
+ LOG(WARNING) << "No support for input audio devices"; |
+ return nullptr; |
+} |
+ |
+::media::AudioOutputStream* CastAudioManager::MakeLinearOutputStream( |
+ const ::media::AudioParameters& params) { |
+ DCHECK_EQ(::media::AudioParameters::AUDIO_PCM_LINEAR, params.format()); |
+ return MakeCastOutputStream(params); |
+} |
+ |
+::media::AudioOutputStream* CastAudioManager::MakeLowLatencyOutputStream( |
+ const ::media::AudioParameters& params, |
+ const std::string& device_id) { |
+ DCHECK_EQ(::media::AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); |
+ return MakeCastOutputStream(params); |
+} |
+ |
+::media::AudioParameters CastAudioManager::GetPreferredOutputStreamParameters( |
+ const std::string& output_device_id, |
+ const ::media::AudioParameters& suggested) { |
+ // Convert the suggested params into the chromecast variety. |
+ AudioParameters params = FromChromiumParams(suggested); |
+ |
+ // Get the preferences. Convert them back to Chromium params and return. |
+ params = audio_output_device_->GetPreferredOutputStreamParameters(params); |
+ return FromChromecastParams(params); |
+} |
+ |
+::media::AudioOutputStream* CastAudioManager::MakeCastOutputStream( |
+ const ::media::AudioParameters& params) { |
+ // Get the Cast output stream. |
+ AudioParameters chromecast_params = FromChromiumParams(params); |
+ CastAudioOutputStream* stream = audio_output_device_->MakeOutputStream( |
+ chromecast_params, new TaskRunnerImpl()); |
+ if (!stream) |
+ return nullptr; |
+ |
+ // Note: The caller of this method does not own the returned instance of the |
+ // stream. The stream MUST call AudioManagerBase::ReleaseOutputStream() as |
+ // the last line of its Close() method to avoid a leak. This pattern is not |
+ // favorable, but is currently required by AudioManagerBase. Please see |
+ // ChromecastDeviceAudioOutputStream::Close() before changing this behavior. |
+ return new ChromecastDeviceAudioOutputStream(stream, chromecast_params, this); |
+} |
+ |
+} // namespace media |
+} // namespace chromecast |