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