audio_manager_cras.cc revision 58537e28ecd584eab876aee8be7156509866d23a
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "media/audio/cras/audio_manager_cras.h" 6 7#include "base/command_line.h" 8#include "base/environment.h" 9#include "base/logging.h" 10#include "base/nix/xdg_util.h" 11#include "base/stl_util.h" 12#include "media/audio/audio_util.h" 13#include "media/audio/cras/cras_input.h" 14#include "media/audio/cras/cras_unified.h" 15#include "media/base/channel_layout.h" 16 17namespace media { 18 19// Maximum number of output streams that can be open simultaneously. 20static const int kMaxOutputStreams = 50; 21 22// Default sample rate for input and output streams. 23static const int kDefaultSampleRate = 48000; 24 25const char AudioManagerCras::kLoopbackDeviceId[] = "loopback"; 26 27bool AudioManagerCras::HasAudioOutputDevices() { 28 return true; 29} 30 31bool AudioManagerCras::HasAudioInputDevices() { 32 return true; 33} 34 35AudioManagerCras::AudioManagerCras() { 36 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 37} 38 39AudioManagerCras::~AudioManagerCras() { 40 Shutdown(); 41} 42 43void AudioManagerCras::ShowAudioInputSettings() { 44 NOTIMPLEMENTED(); 45} 46 47void AudioManagerCras::GetAudioInputDeviceNames( 48 media::AudioDeviceNames* device_names) { 49 DCHECK(device_names->empty()); 50 GetCrasAudioInputDevices(device_names); 51 return; 52} 53 54AudioParameters AudioManagerCras::GetInputStreamParameters( 55 const std::string& device_id) { 56 static const int kDefaultInputBufferSize = 1024; 57 // TODO(hshi): Fine-tune audio parameters based on |device_id|. The optimal 58 // parameters for the loopback stream may differ from the default. 59 return AudioParameters( 60 AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 61 kDefaultSampleRate, 16, kDefaultInputBufferSize); 62} 63 64void AudioManagerCras::GetCrasAudioInputDevices( 65 media::AudioDeviceNames* device_names) { 66 // Cras will route audio from a proper physical device automatically. 67 device_names->push_back( 68 AudioDeviceName(AudioManagerBase::kDefaultDeviceName, 69 AudioManagerBase::kDefaultDeviceId)); 70} 71 72AudioOutputStream* AudioManagerCras::MakeLinearOutputStream( 73 const AudioParameters& params) { 74 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); 75 return MakeOutputStream(params); 76} 77 78AudioOutputStream* AudioManagerCras::MakeLowLatencyOutputStream( 79 const AudioParameters& params, 80 const std::string& device_id, 81 const std::string& input_device_id) { 82 DLOG_IF(ERROR, !device_id.empty()) << "Not implemented!"; 83 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); 84 // TODO(dgreid): Open the correct input device for unified IO. 85 return MakeOutputStream(params); 86} 87 88AudioInputStream* AudioManagerCras::MakeLinearInputStream( 89 const AudioParameters& params, const std::string& device_id) { 90 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); 91 return MakeInputStream(params, device_id); 92} 93 94AudioInputStream* AudioManagerCras::MakeLowLatencyInputStream( 95 const AudioParameters& params, const std::string& device_id) { 96 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); 97 return MakeInputStream(params, device_id); 98} 99 100AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters( 101 const std::string& output_device_id, 102 const AudioParameters& input_params) { 103 // TODO(tommi): Support |output_device_id|. 104 DLOG_IF(ERROR, !output_device_id.empty()) << "Not implemented!"; 105 static const int kDefaultOutputBufferSize = 512; 106 107 ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 108 int sample_rate = kDefaultSampleRate; 109 int buffer_size = kDefaultOutputBufferSize; 110 int bits_per_sample = 16; 111 int input_channels = 0; 112 if (input_params.IsValid()) { 113 sample_rate = input_params.sample_rate(); 114 bits_per_sample = input_params.bits_per_sample(); 115 channel_layout = input_params.channel_layout(); 116 input_channels = input_params.input_channels(); 117 buffer_size = input_params.frames_per_buffer(); 118 } 119 120 int user_buffer_size = GetUserBufferSize(); 121 if (user_buffer_size) 122 buffer_size = user_buffer_size; 123 124 return AudioParameters( 125 AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels, 126 sample_rate, bits_per_sample, buffer_size); 127} 128 129AudioOutputStream* AudioManagerCras::MakeOutputStream( 130 const AudioParameters& params) { 131 return new CrasUnifiedStream(params, this); 132} 133 134AudioInputStream* AudioManagerCras::MakeInputStream( 135 const AudioParameters& params, const std::string& device_id) { 136 return new CrasInputStream(params, this, device_id); 137} 138 139} // namespace media 140