| Index: media/audio/linux/alsa_output.cc
|
| diff --git a/media/audio/linux/alsa_output.cc b/media/audio/linux/alsa_output.cc
|
| index e3670d8a1e1f75a84a9f5ab05a79c4bf27f7d464..422f91baa168591182177b0e5c9af61c0fcc5925 100644
|
| --- a/media/audio/linux/alsa_output.cc
|
| +++ b/media/audio/linux/alsa_output.cc
|
| @@ -82,6 +82,7 @@
|
| #include "base/stl_util-inl.h"
|
| #include "base/time.h"
|
| #include "media/audio/audio_util.h"
|
| +#include "media/audio/linux/alsa_util.h"
|
| #include "media/audio/linux/alsa_wrapper.h"
|
| #include "media/audio/linux/audio_manager_linux.h"
|
| #include "media/base/data_buffer.h"
|
| @@ -119,25 +120,6 @@ namespace {
|
| // TODO(fbarchard): Resample audio from higher frequency to 48000.
|
| const int kAlsaMaxSampleRate = 48000;
|
|
|
| -snd_pcm_format_t BitsToFormat(char 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;
|
| - }
|
| -}
|
| -
|
| // While the "default" device may support multi-channel audio, in Alsa, only
|
| // the device names surround40, surround41, surround50, etc, have a defined
|
| // channel mapping according to Lennart:
|
| @@ -243,7 +225,7 @@ AlsaPcmOutputStream::AlsaPcmOutputStream(const std::string& device_name,
|
| MessageLoop* message_loop)
|
| : shared_data_(MessageLoop::current()),
|
| requested_device_name_(device_name),
|
| - pcm_format_(BitsToFormat(params.bits_per_sample)),
|
| + pcm_format_(alsa_util::BitsToFormat(params.bits_per_sample)),
|
| channels_(params.channels),
|
| sample_rate_(params.sample_rate),
|
| bytes_per_sample_(params.bits_per_sample / 8),
|
| @@ -391,7 +373,11 @@ void AlsaPcmOutputStream::OpenTask(uint32 packet_size) {
|
| }
|
| } else {
|
| device_name_ = requested_device_name_;
|
| - playback_handle_ = OpenDevice(device_name_, channels_, latency_micros_);
|
| + playback_handle_ = alsa_util::OpenPlaybackDevice(wrapper_,
|
| + device_name_.c_str(),
|
| + channels_, sample_rate_,
|
| + pcm_format_,
|
| + latency_micros_);
|
| }
|
|
|
| // Finish initializing the stream if the device was opened successfully.
|
| @@ -454,7 +440,8 @@ void AlsaPcmOutputStream::CloseTask() {
|
| DCHECK_EQ(message_loop_, MessageLoop::current());
|
|
|
| // Shutdown the audio device.
|
| - if (playback_handle_ && !CloseDevice(playback_handle_)) {
|
| + if (playback_handle_ &&
|
| + alsa_util::CloseDevice(wrapper_, playback_handle_) < 0) {
|
| LOG(WARNING) << "Unable to close audio device. Leaking handle.";
|
| }
|
| playback_handle_ = NULL;
|
| @@ -727,53 +714,6 @@ std::string AlsaPcmOutputStream::FindDeviceForChannels(uint32 channels) {
|
| return guessed_device;
|
| }
|
|
|
| -snd_pcm_t* AlsaPcmOutputStream::OpenDevice(const std::string& device_name,
|
| - uint32 channels,
|
| - unsigned int latency) {
|
| - snd_pcm_t* handle = NULL;
|
| - int error = wrapper_->PcmOpen(&handle, device_name.c_str(),
|
| - SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK);
|
| - if (error < 0) {
|
| - LOG(ERROR) << "Cannot open audio device (" << device_name << "): "
|
| - << wrapper_->StrError(error);
|
| - return NULL;
|
| - }
|
| -
|
| - // Configure the device for software resampling.
|
| - if ((error = wrapper_->PcmSetParams(handle,
|
| - pcm_format_,
|
| - SND_PCM_ACCESS_RW_INTERLEAVED,
|
| - channels,
|
| - sample_rate_,
|
| - 1, // soft_resample -- let ALSA resample
|
| - latency)) < 0) {
|
| - LOG(ERROR) << "Unable to set PCM parameters for (" << device_name
|
| - << "): " << wrapper_->StrError(error)
|
| - << " -- Format: " << pcm_format_
|
| - << " Channels: " << channels
|
| - << " Latency (us): " << latency;
|
| - if (!CloseDevice(handle)) {
|
| - // TODO(ajwong): Retry on certain errors?
|
| - LOG(WARNING) << "Unable to close audio device. Leaking handle.";
|
| - }
|
| - return NULL;
|
| - }
|
| -
|
| - return handle;
|
| -}
|
| -
|
| -bool AlsaPcmOutputStream::CloseDevice(snd_pcm_t* handle) {
|
| - std::string name = wrapper_->PcmName(handle);
|
| - int error = wrapper_->PcmClose(handle);
|
| - if (error < 0) {
|
| - LOG(ERROR) << "Error closing audio device (" << name << "): "
|
| - << wrapper_->StrError(error);
|
| - return false;
|
| - }
|
| -
|
| - return true;
|
| -}
|
| -
|
| snd_pcm_sframes_t AlsaPcmOutputStream::GetAvailableFrames() {
|
| DCHECK_EQ(message_loop_, MessageLoop::current());
|
|
|
| @@ -812,13 +752,19 @@ snd_pcm_t* AlsaPcmOutputStream::AutoSelectDevice(unsigned int latency) {
|
|
|
| // Step 1.
|
| if (!device_name_.empty()) {
|
| - if ((handle = OpenDevice(device_name_, channels_, latency)) != NULL) {
|
| + if ((handle = alsa_util::OpenPlaybackDevice(wrapper_, device_name_.c_str(),
|
| + channels_, sample_rate_,
|
| + pcm_format_,
|
| + latency)) != NULL) {
|
| return handle;
|
| }
|
|
|
| // Step 2.
|
| device_name_ = kPlugPrefix + device_name_;
|
| - if ((handle = OpenDevice(device_name_, channels_, latency)) != NULL) {
|
| + if ((handle = alsa_util::OpenPlaybackDevice(wrapper_, device_name_.c_str(),
|
| + channels_, sample_rate_,
|
| + pcm_format_,
|
| + latency)) != NULL) {
|
| return handle;
|
| }
|
| }
|
| @@ -837,13 +783,17 @@ snd_pcm_t* AlsaPcmOutputStream::AutoSelectDevice(unsigned int latency) {
|
|
|
| // Step 3.
|
| device_name_ = kDefaultDevice;
|
| - if ((handle = OpenDevice(device_name_, default_channels, latency)) != NULL) {
|
| + if ((handle = alsa_util::OpenPlaybackDevice(wrapper_, device_name_.c_str(),
|
| + default_channels, sample_rate_,
|
| + pcm_format_, latency)) != NULL) {
|
| return handle;
|
| }
|
|
|
| // Step 4.
|
| device_name_ = kPlugPrefix + device_name_;
|
| - if ((handle = OpenDevice(device_name_, default_channels, latency)) != NULL) {
|
| + if ((handle = alsa_util::OpenPlaybackDevice(wrapper_, device_name_.c_str(),
|
| + default_channels, sample_rate_,
|
| + pcm_format_, latency)) != NULL) {
|
| return handle;
|
| }
|
|
|
|
|