| 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..26a2c6caaf4b40ed67956f6c9f7f0bd66ee72b2c
|
| --- /dev/null
|
| +++ b/chromecast/media/audio/cast_audio_manager.cc
|
| @@ -0,0 +1,142 @@
|
| +// 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/media/audio/chromecast_device_audio_output_stream.h"
|
| +#include "chromecast/public/cast_audio_output_device.h"
|
| +#include "chromecast/public/cast_audio_stream.h"
|
| +
|
| +namespace chromecast {
|
| +
|
| +namespace {
|
| +
|
| +// Default parameters to provide for input stream.
|
| +const int kDefaultBitsPerSample = 16;
|
| +const int kDefaultInputBufferSize = 1024;
|
| +const int kDefaultSampleRate = 32000;
|
| +
|
| +// Utility to convert media::AudioParameters to chromecast::AudioParameters.
|
| +// TODO(slan): Move these utilties to a central location.
|
| +chromecast::AudioParameters FromChromiumParams(
|
| + const media::AudioParameters& in_params) {
|
| + chromecast::AudioParameters out_params;
|
| + out_params.sample_rate = in_params.sample_rate();
|
| + out_params.bits_per_sample = in_params.bits_per_sample();
|
| + out_params.frames_per_buffer = in_params.frames_per_buffer();
|
| + out_params.channels = in_params.channels();
|
| + return out_params;
|
| +}
|
| +
|
| +// Utility to convert chromecast::AudioParameters to media::AudioParameters.
|
| +// TODO(slan): Move these utilties to a central location.
|
| +media::AudioParameters FromChromecastParams(
|
| + const chromecast::AudioParameters& in_params) {
|
| + return media::AudioParameters(
|
| + media::AudioParameters::AUDIO_PCM_LINEAR,
|
| + media::GuessChannelLayout(in_params.channels), in_params.sample_rate,
|
| + in_params.bits_per_sample, in_params.frames_per_buffer);
|
| +}
|
| +} // 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) {
|
| + DCHECK(device_names->empty());
|
| + LOG(WARNING) << "No support for input audio devices.";
|
| +}
|
| +
|
| +media::AudioParameters CastAudioManager::GetInputStreamParameters(
|
| + const std::string& device_id) {
|
| + // TODO(damienv): Providing the default AudioParameters
|
| + // (i.e. invalid parameters) impacts also the output parameter selection
|
| + // during WebAudio playback (and it fails).
|
| + // Figure out why.
|
| + 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.
|
| + chromecast::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.
|
| + chromecast::AudioParameters chromecast_params = FromChromiumParams(params);
|
| + chromecast::CastAudioOutputStream* stream =
|
| + audio_output_device_->MakeOutputStream(chromecast_params);
|
| + if (!stream)
|
| + return nullptr;
|
| +
|
| + // Host a pass thru interface to translate calls between the stream and the
|
| + // consumer.
|
| + streams_.push_back(make_linked_ptr(
|
| + new ChromecastDeviceAudioOutputStream(stream, chromecast_params)));
|
| + return streams_.back().get();
|
| +}
|
| +
|
| +} // namespace chromecast
|
|
|