audio_manager_cras.cc revision a3f7b4e666c476898878fa745f637129375cd889
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 25bool AudioManagerCras::HasAudioOutputDevices() { 26 return true; 27} 28 29bool AudioManagerCras::HasAudioInputDevices() { 30 return true; 31} 32 33AudioManagerCras::AudioManagerCras() { 34 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 35} 36 37AudioManagerCras::~AudioManagerCras() { 38 Shutdown(); 39} 40 41void AudioManagerCras::ShowAudioInputSettings() { 42 NOTIMPLEMENTED(); 43} 44 45void AudioManagerCras::GetAudioInputDeviceNames( 46 media::AudioDeviceNames* device_names) { 47 DCHECK(device_names->empty()); 48 GetCrasAudioInputDevices(device_names); 49 return; 50} 51 52AudioParameters AudioManagerCras::GetInputStreamParameters( 53 const std::string& device_id) { 54 static const int kDefaultInputBufferSize = 1024; 55 56 return AudioParameters( 57 AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 58 kDefaultSampleRate, 16, kDefaultInputBufferSize); 59} 60 61void AudioManagerCras::GetCrasAudioInputDevices( 62 media::AudioDeviceNames* device_names) { 63 // Cras will route audio from a proper physical device automatically. 64 device_names->push_back( 65 AudioDeviceName(AudioManagerBase::kDefaultDeviceName, 66 AudioManagerBase::kDefaultDeviceId)); 67} 68 69AudioOutputStream* AudioManagerCras::MakeLinearOutputStream( 70 const AudioParameters& params) { 71 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); 72 return MakeOutputStream(params); 73} 74 75AudioOutputStream* AudioManagerCras::MakeLowLatencyOutputStream( 76 const AudioParameters& params, const std::string& input_device_id) { 77 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); 78 // TODO(dgreid): Open the correct input device for unified IO. 79 return MakeOutputStream(params); 80} 81 82AudioInputStream* AudioManagerCras::MakeLinearInputStream( 83 const AudioParameters& params, const std::string& device_id) { 84 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); 85 return MakeInputStream(params, device_id); 86} 87 88AudioInputStream* AudioManagerCras::MakeLowLatencyInputStream( 89 const AudioParameters& params, const std::string& device_id) { 90 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); 91 return MakeInputStream(params, device_id); 92} 93 94AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters( 95 const AudioParameters& input_params) { 96 static const int kDefaultOutputBufferSize = 512; 97 98 ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 99 int sample_rate = kDefaultSampleRate; 100 int buffer_size = kDefaultOutputBufferSize; 101 int bits_per_sample = 16; 102 int input_channels = 0; 103 if (input_params.IsValid()) { 104 sample_rate = input_params.sample_rate(); 105 bits_per_sample = input_params.bits_per_sample(); 106 channel_layout = input_params.channel_layout(); 107 input_channels = input_params.input_channels(); 108 buffer_size = input_params.frames_per_buffer(); 109 } 110 111 int user_buffer_size = GetUserBufferSize(); 112 if (user_buffer_size) 113 buffer_size = user_buffer_size; 114 115 return AudioParameters( 116 AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels, 117 sample_rate, bits_per_sample, buffer_size); 118} 119 120AudioOutputStream* AudioManagerCras::MakeOutputStream( 121 const AudioParameters& params) { 122 return new CrasUnifiedStream(params, this); 123} 124 125AudioInputStream* AudioManagerCras::MakeInputStream( 126 const AudioParameters& params, const std::string& device_id) { 127 return new CrasInputStream(params, this); 128} 129 130} // namespace media 131