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