OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/audio/linux/alsa_util.h" | 5 #include "media/audio/linux/alsa_util.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "media/audio/linux/alsa_wrapper.h" | 10 #include "media/audio/linux/alsa_wrapper.h" |
11 | 11 |
12 namespace alsa_util { | 12 namespace alsa_util { |
13 | 13 |
14 static snd_pcm_t* OpenDevice(AlsaWrapper* wrapper, | 14 static snd_pcm_t* OpenDevice(media::AlsaWrapper* wrapper, |
15 const char* device_name, | 15 const char* device_name, |
16 snd_pcm_stream_t type, | 16 snd_pcm_stream_t type, |
17 int channels, | 17 int channels, |
18 int sample_rate, | 18 int sample_rate, |
19 snd_pcm_format_t pcm_format, | 19 snd_pcm_format_t pcm_format, |
20 int latency_us) { | 20 int latency_us) { |
21 snd_pcm_t* handle = NULL; | 21 snd_pcm_t* handle = NULL; |
22 int error = wrapper->PcmOpen(&handle, device_name, type, SND_PCM_NONBLOCK); | 22 int error = wrapper->PcmOpen(&handle, device_name, type, SND_PCM_NONBLOCK); |
23 if (error < 0) { | 23 if (error < 0) { |
24 LOG(WARNING) << "PcmOpen: " << device_name << "," | 24 LOG(WARNING) << "PcmOpen: " << device_name << "," |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 return SND_PCM_FORMAT_S24; | 74 return SND_PCM_FORMAT_S24; |
75 | 75 |
76 case 32: | 76 case 32: |
77 return SND_PCM_FORMAT_S32; | 77 return SND_PCM_FORMAT_S32; |
78 | 78 |
79 default: | 79 default: |
80 return SND_PCM_FORMAT_UNKNOWN; | 80 return SND_PCM_FORMAT_UNKNOWN; |
81 } | 81 } |
82 } | 82 } |
83 | 83 |
84 int CloseDevice(AlsaWrapper* wrapper, snd_pcm_t* handle) { | 84 int CloseDevice(media::AlsaWrapper* wrapper, snd_pcm_t* handle) { |
85 std::string device_name = wrapper->PcmName(handle); | 85 std::string device_name = wrapper->PcmName(handle); |
86 int error = wrapper->PcmClose(handle); | 86 int error = wrapper->PcmClose(handle); |
87 if (error < 0) { | 87 if (error < 0) { |
88 LOG(ERROR) << "PcmClose: " << device_name << ", " | 88 LOG(ERROR) << "PcmClose: " << device_name << ", " |
89 << wrapper->StrError(error); | 89 << wrapper->StrError(error); |
90 } | 90 } |
91 | 91 |
92 return error; | 92 return error; |
93 } | 93 } |
94 | 94 |
95 snd_pcm_t* OpenCaptureDevice(AlsaWrapper* wrapper, | 95 snd_pcm_t* OpenCaptureDevice(media::AlsaWrapper* wrapper, |
96 const char* device_name, | 96 const char* device_name, |
97 int channels, | 97 int channels, |
98 int sample_rate, | 98 int sample_rate, |
99 snd_pcm_format_t pcm_format, | 99 snd_pcm_format_t pcm_format, |
100 int latency_us) { | 100 int latency_us) { |
101 return OpenDevice(wrapper, device_name, SND_PCM_STREAM_CAPTURE, channels, | 101 return OpenDevice(wrapper, device_name, SND_PCM_STREAM_CAPTURE, channels, |
102 sample_rate, pcm_format, latency_us); | 102 sample_rate, pcm_format, latency_us); |
103 } | 103 } |
104 | 104 |
105 snd_pcm_t* OpenPlaybackDevice(AlsaWrapper* wrapper, | 105 snd_pcm_t* OpenPlaybackDevice(media::AlsaWrapper* wrapper, |
106 const char* device_name, | 106 const char* device_name, |
107 int channels, | 107 int channels, |
108 int sample_rate, | 108 int sample_rate, |
109 snd_pcm_format_t pcm_format, | 109 snd_pcm_format_t pcm_format, |
110 int latency_us) { | 110 int latency_us) { |
111 return OpenDevice(wrapper, device_name, SND_PCM_STREAM_PLAYBACK, channels, | 111 return OpenDevice(wrapper, device_name, SND_PCM_STREAM_PLAYBACK, channels, |
112 sample_rate, pcm_format, latency_us); | 112 sample_rate, pcm_format, latency_us); |
113 } | 113 } |
114 | 114 |
115 snd_mixer_t* OpenMixer(AlsaWrapper* wrapper, | 115 snd_mixer_t* OpenMixer(media::AlsaWrapper* wrapper, |
116 const std::string& device_name) { | 116 const std::string& device_name) { |
117 snd_mixer_t* mixer = NULL; | 117 snd_mixer_t* mixer = NULL; |
118 | 118 |
119 int error = wrapper->MixerOpen(&mixer, 0); | 119 int error = wrapper->MixerOpen(&mixer, 0); |
120 if (error < 0) { | 120 if (error < 0) { |
121 LOG(ERROR) << "MixerOpen: " << device_name << ", " | 121 LOG(ERROR) << "MixerOpen: " << device_name << ", " |
122 << wrapper->StrError(error); | 122 << wrapper->StrError(error); |
123 return NULL; | 123 return NULL; |
124 } | 124 } |
125 | 125 |
(...skipping 10 matching lines...) Expand all Loading... |
136 if (error < 0) { | 136 if (error < 0) { |
137 LOG(ERROR) << "MixerElementRegister: " << control_name << ", " | 137 LOG(ERROR) << "MixerElementRegister: " << control_name << ", " |
138 << wrapper->StrError(error); | 138 << wrapper->StrError(error); |
139 alsa_util::CloseMixer(wrapper, mixer, device_name); | 139 alsa_util::CloseMixer(wrapper, mixer, device_name); |
140 return NULL; | 140 return NULL; |
141 } | 141 } |
142 | 142 |
143 return mixer; | 143 return mixer; |
144 } | 144 } |
145 | 145 |
146 void CloseMixer(AlsaWrapper* wrapper, snd_mixer_t* mixer, | 146 void CloseMixer(media::AlsaWrapper* wrapper, snd_mixer_t* mixer, |
147 const std::string& device_name) { | 147 const std::string& device_name) { |
148 if (!mixer) | 148 if (!mixer) |
149 return; | 149 return; |
150 | 150 |
151 wrapper->MixerFree(mixer); | 151 wrapper->MixerFree(mixer); |
152 | 152 |
153 int error = 0; | 153 int error = 0; |
154 if (!device_name.empty()) { | 154 if (!device_name.empty()) { |
155 std::string control_name = DeviceNameToControlName(device_name); | 155 std::string control_name = DeviceNameToControlName(device_name); |
156 error = wrapper->MixerDetach(mixer, control_name.c_str()); | 156 error = wrapper->MixerDetach(mixer, control_name.c_str()); |
157 if (error < 0) { | 157 if (error < 0) { |
158 LOG(WARNING) << "MixerDetach: " << control_name << ", " | 158 LOG(WARNING) << "MixerDetach: " << control_name << ", " |
159 << wrapper->StrError(error); | 159 << wrapper->StrError(error); |
160 } | 160 } |
161 } | 161 } |
162 | 162 |
163 error = wrapper->MixerClose(mixer); | 163 error = wrapper->MixerClose(mixer); |
164 if (error < 0) { | 164 if (error < 0) { |
165 LOG(WARNING) << "MixerClose: " << wrapper->StrError(error); | 165 LOG(WARNING) << "MixerClose: " << wrapper->StrError(error); |
166 } | 166 } |
167 } | 167 } |
168 | 168 |
169 snd_mixer_elem_t* LoadCaptureMixerElement(AlsaWrapper* wrapper, | 169 snd_mixer_elem_t* LoadCaptureMixerElement(media::AlsaWrapper* wrapper, |
170 snd_mixer_t* mixer) { | 170 snd_mixer_t* mixer) { |
171 if (!mixer) | 171 if (!mixer) |
172 return NULL; | 172 return NULL; |
173 | 173 |
174 int error = wrapper->MixerLoad(mixer); | 174 int error = wrapper->MixerLoad(mixer); |
175 if (error < 0) { | 175 if (error < 0) { |
176 LOG(ERROR) << "MixerLoad: " << wrapper->StrError(error); | 176 LOG(ERROR) << "MixerLoad: " << wrapper->StrError(error); |
177 return NULL; | 177 return NULL; |
178 } | 178 } |
179 | 179 |
(...skipping 11 matching lines...) Expand all Loading... |
191 else if (strcmp(elem_name, kMicElemName) == 0) | 191 else if (strcmp(elem_name, kMicElemName) == 0) |
192 mic_elem = elem; | 192 mic_elem = elem; |
193 } | 193 } |
194 } | 194 } |
195 | 195 |
196 // Did not find any Capture handle, use the Mic handle. | 196 // Did not find any Capture handle, use the Mic handle. |
197 return mic_elem; | 197 return mic_elem; |
198 } | 198 } |
199 | 199 |
200 } // namespace alsa_util | 200 } // namespace alsa_util |
OLD | NEW |