audio_manager_cras.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
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/process_util.h" 12#include "base/stl_util.h" 13#include "media/audio/audio_util.h" 14#include "media/audio/cras/cras_input.h" 15#include "media/audio/cras/cras_output.h" 16#include "media/base/channel_layout.h" 17 18namespace media { 19 20// Maximum number of output streams that can be open simultaneously. 21static const int kMaxOutputStreams = 50; 22 23// Default sample rate for input and output streams. 24static const int kDefaultSampleRate = 48000; 25 26static const char kCrasAutomaticDeviceName[] = "Automatic"; 27static const char kCrasAutomaticDeviceId[] = "automatic"; 28 29bool AudioManagerCras::HasAudioOutputDevices() { 30 return true; 31} 32 33bool AudioManagerCras::HasAudioInputDevices() { 34 return true; 35} 36 37AudioManagerCras::AudioManagerCras() { 38 SetMaxOutputStreamsAllowed(kMaxOutputStreams); 39} 40 41AudioManagerCras::~AudioManagerCras() { 42 Shutdown(); 43} 44 45void AudioManagerCras::ShowAudioInputSettings() { 46 NOTIMPLEMENTED(); 47} 48 49void AudioManagerCras::GetAudioInputDeviceNames( 50 media::AudioDeviceNames* device_names) { 51 DCHECK(device_names->empty()); 52 GetCrasAudioInputDevices(device_names); 53 return; 54} 55 56AudioParameters AudioManagerCras::GetInputStreamParameters( 57 const std::string& device_id) { 58 static const int kDefaultInputBufferSize = 1024; 59 60 return AudioParameters( 61 AudioParameters::AUDIO_PCM_LOW_LATENCY, CHANNEL_LAYOUT_STEREO, 62 kDefaultSampleRate, 16, kDefaultInputBufferSize); 63} 64 65void AudioManagerCras::GetCrasAudioInputDevices( 66 media::AudioDeviceNames* device_names) { 67 // Cras will route audio from a proper physical device automatically. 68 device_names->push_back(media::AudioDeviceName( 69 kCrasAutomaticDeviceName, kCrasAutomaticDeviceId)); 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 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); 81 return MakeOutputStream(params); 82} 83 84AudioInputStream* AudioManagerCras::MakeLinearInputStream( 85 const AudioParameters& params, const std::string& device_id) { 86 DCHECK_EQ(AudioParameters::AUDIO_PCM_LINEAR, params.format()); 87 return MakeInputStream(params, device_id); 88} 89 90AudioInputStream* AudioManagerCras::MakeLowLatencyInputStream( 91 const AudioParameters& params, const std::string& device_id) { 92 DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); 93 return MakeInputStream(params, device_id); 94} 95 96AudioParameters AudioManagerCras::GetPreferredOutputStreamParameters( 97 const AudioParameters& input_params) { 98 static const int kDefaultOutputBufferSize = 512; 99 100 ChannelLayout channel_layout = CHANNEL_LAYOUT_STEREO; 101 int sample_rate = kDefaultSampleRate; 102 int buffer_size = kDefaultOutputBufferSize; 103 int bits_per_sample = 16; 104 int input_channels = 0; 105 if (input_params.IsValid()) { 106 sample_rate = input_params.sample_rate(); 107 bits_per_sample = input_params.bits_per_sample(); 108 channel_layout = input_params.channel_layout(); 109 input_channels = input_params.input_channels(); 110 buffer_size = input_params.frames_per_buffer(); 111 } 112 113 int user_buffer_size = GetUserBufferSize(); 114 if (user_buffer_size) 115 buffer_size = user_buffer_size; 116 117 return AudioParameters( 118 AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, input_channels, 119 sample_rate, bits_per_sample, buffer_size); 120} 121 122AudioOutputStream* AudioManagerCras::MakeOutputStream( 123 const AudioParameters& params) { 124 return new CrasOutputStream(params, this); 125} 126 127AudioInputStream* AudioManagerCras::MakeInputStream( 128 const AudioParameters& params, const std::string& device_id) { 129 return new CrasInputStream(params, this); 130} 131 132} // namespace media 133