Index: media/audio/linux/alsa_util.cc |
diff --git a/media/audio/linux/alsa_util.cc b/media/audio/linux/alsa_util.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c3811798bee6c04cf8befc15386d4ad540bbb746 |
--- /dev/null |
+++ b/media/audio/linux/alsa_util.cc |
@@ -0,0 +1,101 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "media/audio/linux/alsa_util.h" |
+ |
+#include <string> |
+ |
+#include "base/logging.h" |
+#include "media/audio/linux/alsa_wrapper.h" |
+ |
+namespace { |
+ |
+snd_pcm_t* OpenDevice(AlsaWrapper* wrapper, |
+ const char* device_name, |
+ snd_pcm_stream_t type, |
+ int channels, |
+ int sample_rate, |
+ snd_pcm_format_t pcm_format, |
+ int latency_us) { |
+ snd_pcm_t* handle = NULL; |
+ int error = wrapper->PcmOpen(&handle, device_name, type, SND_PCM_NONBLOCK); |
+ if (error < 0) { |
+ LOG(WARNING) << "PcmOpen: " << device_name << "," |
+ << wrapper->StrError(error); |
+ return NULL; |
+ } |
+ |
+ error = wrapper->PcmSetParams(handle, pcm_format, |
+ SND_PCM_ACCESS_RW_INTERLEAVED, channels, |
+ sample_rate, 1, latency_us); |
+ if (error < 0) { |
+ LOG(WARNING) << "PcmSetParams: " << device_name << ", " |
+ << wrapper->StrError(error) << " - Format: " << pcm_format |
+ << " Channels: " << channels << " Latency: " << latency_us; |
+ if (!alsa_util::CloseDevice(wrapper, handle)) { |
+ // TODO(ajwong): Retry on certain errors? |
+ LOG(WARNING) << "Unable to close audio device. Leaking handle."; |
+ } |
+ return NULL; |
+ } |
+ |
+ return handle; |
+} |
+ |
+} |
awong
2010/09/02 21:16:08
// namespace
|
+ |
+namespace alsa_util { |
+ |
+snd_pcm_format_t BitsToFormat(int bits_per_sample) { |
+ switch (bits_per_sample) { |
+ case 8: |
+ return SND_PCM_FORMAT_U8; |
+ |
+ case 16: |
+ return SND_PCM_FORMAT_S16; |
+ |
+ case 24: |
+ return SND_PCM_FORMAT_S24; |
+ |
+ case 32: |
+ return SND_PCM_FORMAT_S32; |
+ |
+ default: |
+ return SND_PCM_FORMAT_UNKNOWN; |
+ } |
+} |
+ |
+int CloseDevice(AlsaWrapper* wrapper, snd_pcm_t* handle) { |
+ std::string device_name = wrapper->PcmName(handle); |
+ int error = wrapper->PcmClose(handle); |
+ if (error < 0) { |
+ LOG(ERROR) << "PcmClose: " << device_name << ", " |
+ << wrapper->StrError(error); |
+ } |
+ |
+ return error; |
+} |
+ |
+snd_pcm_t* OpenCaptureDevice(AlsaWrapper* wrapper, |
+ const char* device_name, |
+ int channels, |
+ int sample_rate, |
+ snd_pcm_format_t pcm_format, |
+ int latency_us) { |
+ return OpenDevice(wrapper, device_name, SND_PCM_STREAM_CAPTURE, channels, |
+ sample_rate, pcm_format, latency_us); |
+} |
+ |
+snd_pcm_t* OpenPlaybackDevice(AlsaWrapper* wrapper, |
+ const char* device_name, |
+ int channels, |
+ int sample_rate, |
+ snd_pcm_format_t pcm_format, |
+ int latency_us) { |
+ return OpenDevice(wrapper, device_name, SND_PCM_STREAM_PLAYBACK, channels, |
+ sample_rate, pcm_format, latency_us); |
+} |
+ |
+} |
awong
2010/09/02 21:16:08
// namespace alsa_util
remove extra newline.
|
+ |