| 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_wrapper.h" | 5 #include "media/audio/linux/alsa_wrapper.h" |
| 6 | 6 |
| 7 #include <alsa/asoundlib.h> | 7 #include <alsa/asoundlib.h> |
| 8 | 8 |
| 9 namespace media { | 9 namespace media { |
| 10 | 10 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 } | 64 } |
| 65 | 65 |
| 66 int AlsaWrapper::PcmRecover(snd_pcm_t* handle, int err, int silent) { | 66 int AlsaWrapper::PcmRecover(snd_pcm_t* handle, int err, int silent) { |
| 67 return snd_pcm_recover(handle, err, silent); | 67 return snd_pcm_recover(handle, err, silent); |
| 68 } | 68 } |
| 69 | 69 |
| 70 const char* AlsaWrapper::PcmName(snd_pcm_t* handle) { | 70 const char* AlsaWrapper::PcmName(snd_pcm_t* handle) { |
| 71 return snd_pcm_name(handle); | 71 return snd_pcm_name(handle); |
| 72 } | 72 } |
| 73 | 73 |
| 74 int AlsaWrapper::ConfigureHwParams(snd_pcm_t* handle, | |
| 75 snd_pcm_hw_params_t* hw_params, | |
| 76 snd_pcm_format_t format, | |
| 77 snd_pcm_access_t access, | |
| 78 unsigned int channels, | |
| 79 unsigned int rate, | |
| 80 int soft_resample, | |
| 81 unsigned int latency) { | |
| 82 int err = 0; | |
| 83 if ((err = snd_pcm_hw_params_any(handle, hw_params)) < 0) | |
| 84 return err; | |
| 85 | |
| 86 if ((err = snd_pcm_hw_params_set_rate_resample(handle, hw_params, | |
| 87 soft_resample)) < 0) { | |
| 88 return err; | |
| 89 } | |
| 90 | |
| 91 if ((err = snd_pcm_hw_params_set_format(handle, hw_params, format)) < 0) | |
| 92 return err; | |
| 93 | |
| 94 int dir = 0; | |
| 95 unsigned new_rate = rate; | |
| 96 if ((err = snd_pcm_hw_params_set_rate_near(handle, hw_params, | |
| 97 &new_rate, &dir)) < 0) { | |
| 98 return err; | |
| 99 } | |
| 100 | |
| 101 if ((err = snd_pcm_hw_params_set_access(handle, hw_params, access)) < 0) | |
| 102 return err; | |
| 103 | |
| 104 if ((err = snd_pcm_hw_params_set_channels(handle, hw_params, channels)) < 0) | |
| 105 return err; | |
| 106 | |
| 107 unsigned buffer_time = latency; | |
| 108 if (buffer_time == 0) { | |
| 109 if ((err = snd_pcm_hw_params_get_buffer_time_max(hw_params, | |
| 110 &buffer_time, 0)) < 0) { | |
| 111 return err; | |
| 112 } | |
| 113 if (buffer_time > 500000) | |
| 114 buffer_time = 500000; | |
| 115 } | |
| 116 | |
| 117 unsigned period_time = buffer_time / 4; | |
| 118 if ((err = snd_pcm_hw_params_set_period_time_near(handle, hw_params, | |
| 119 &period_time, 0)) < 0) { | |
| 120 return err; | |
| 121 } | |
| 122 | |
| 123 err = snd_pcm_hw_params_set_buffer_time_near(handle, hw_params, | |
| 124 &buffer_time, 0); | |
| 125 return err; | |
| 126 } | |
| 127 | |
| 128 int AlsaWrapper::PcmSetParams(snd_pcm_t* handle, snd_pcm_format_t format, | 74 int AlsaWrapper::PcmSetParams(snd_pcm_t* handle, snd_pcm_format_t format, |
| 129 snd_pcm_access_t access, unsigned int channels, | 75 snd_pcm_access_t access, unsigned int channels, |
| 130 unsigned int rate, int soft_resample, | 76 unsigned int rate, int soft_resample, |
| 131 unsigned int latency) { | 77 unsigned int latency) { |
| 132 int err = 0; | 78 return snd_pcm_set_params(handle, |
| 133 snd_pcm_hw_params_t* hw_params; | 79 format, |
| 134 if ((err = snd_pcm_hw_params_malloc(&hw_params)) < 0) | 80 access, |
| 135 return err; | 81 channels, |
| 136 | 82 rate, |
| 137 if ((err = ConfigureHwParams(handle, hw_params, format, access, channels, | 83 soft_resample, |
| 138 rate, soft_resample, latency)) >= 0) { | 84 latency); |
| 139 err = snd_pcm_hw_params(handle, hw_params); | |
| 140 } | |
| 141 | |
| 142 snd_pcm_hw_params_free(hw_params); | |
| 143 return err; | |
| 144 } | 85 } |
| 145 | 86 |
| 146 int AlsaWrapper::PcmGetParams(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_size, | 87 int AlsaWrapper::PcmGetParams(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_size, |
| 147 snd_pcm_uframes_t* period_size) { | 88 snd_pcm_uframes_t* period_size) { |
| 148 return snd_pcm_get_params(handle, buffer_size, period_size); | 89 return snd_pcm_get_params(handle, buffer_size, period_size); |
| 149 } | 90 } |
| 150 | 91 |
| 151 snd_pcm_sframes_t AlsaWrapper::PcmAvailUpdate(snd_pcm_t* handle) { | 92 snd_pcm_sframes_t AlsaWrapper::PcmAvailUpdate(snd_pcm_t* handle) { |
| 152 return snd_pcm_avail_update(handle); | 93 return snd_pcm_avail_update(handle); |
| 153 } | 94 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 int AlsaWrapper::MixerSelemHasCaptureVolume(snd_mixer_elem_t* elem) { | 164 int AlsaWrapper::MixerSelemHasCaptureVolume(snd_mixer_elem_t* elem) { |
| 224 return snd_mixer_selem_has_capture_volume(elem); | 165 return snd_mixer_selem_has_capture_volume(elem); |
| 225 } | 166 } |
| 226 | 167 |
| 227 int AlsaWrapper::MixerSelemGetCaptureVolumeRange(snd_mixer_elem_t* elem, | 168 int AlsaWrapper::MixerSelemGetCaptureVolumeRange(snd_mixer_elem_t* elem, |
| 228 long* min, long* max) { | 169 long* min, long* max) { |
| 229 return snd_mixer_selem_get_capture_volume_range(elem, min, max); | 170 return snd_mixer_selem_get_capture_volume_range(elem, min, max); |
| 230 } | 171 } |
| 231 | 172 |
| 232 } // namespace media | 173 } // namespace media |
| OLD | NEW |