1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/audio/alsa/alsa_wrapper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <alsa/asoundlib.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AlsaWrapper::AlsaWrapper() {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AlsaWrapper::~AlsaWrapper() {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmOpen(snd_pcm_t** handle, const char* name,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         snd_pcm_stream_t stream, int mode) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_open(handle, name, stream, mode);
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::DeviceNameHint(int card, const char* iface, void*** hints) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_device_name_hint(card, iface, hints);
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char* AlsaWrapper::DeviceNameGetHint(const void* hint, const char* id) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_device_name_get_hint(hint, id);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::DeviceNameFreeHint(void** hints) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_device_name_free_hint(hints);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::CardNext(int* rcard) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_card_next(rcard);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmClose(snd_pcm_t* handle) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_close(handle);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmPrepare(snd_pcm_t* handle) {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_prepare(handle);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmDrop(snd_pcm_t* handle) {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_drop(handle);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmDelay(snd_pcm_t* handle, snd_pcm_sframes_t* delay) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_delay(handle, delay);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)snd_pcm_sframes_t AlsaWrapper::PcmWritei(snd_pcm_t* handle,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const void* buffer,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         snd_pcm_uframes_t size) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_writei(handle, buffer, size);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)snd_pcm_sframes_t AlsaWrapper::PcmReadi(snd_pcm_t* handle,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        void* buffer,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        snd_pcm_uframes_t size) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_readi(handle, buffer, size);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmRecover(snd_pcm_t* handle, int err, int silent) {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_recover(handle, err, silent);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* AlsaWrapper::PcmName(snd_pcm_t* handle) {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_name(handle);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmSetParams(snd_pcm_t* handle, snd_pcm_format_t format,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              snd_pcm_access_t access, unsigned int channels,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              unsigned int rate, int soft_resample,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              unsigned int latency) {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_set_params(handle,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            format,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            access,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            channels,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            rate,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            soft_resample,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            latency);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmGetParams(snd_pcm_t* handle, snd_pcm_uframes_t* buffer_size,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              snd_pcm_uframes_t* period_size) {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_get_params(handle, buffer_size, period_size);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)snd_pcm_sframes_t AlsaWrapper::PcmAvailUpdate(snd_pcm_t* handle) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_avail_update(handle);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)snd_pcm_state_t AlsaWrapper::PcmState(snd_pcm_t* handle) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_state(handle);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* AlsaWrapper::StrError(int errnum) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_strerror(errnum);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::PcmStart(snd_pcm_t* handle) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_pcm_start(handle);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerOpen(snd_mixer_t** mixer, int mode) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_open(mixer, mode);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerAttach(snd_mixer_t* mixer, const char* name) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_attach(mixer, name);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerElementRegister(snd_mixer_t* mixer,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      struct snd_mixer_selem_regopt* options,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      snd_mixer_class_t** classp) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_register(mixer, options, classp);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AlsaWrapper::MixerFree(snd_mixer_t* mixer) {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  snd_mixer_free(mixer);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerDetach(snd_mixer_t* mixer, const char* name) {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_detach(mixer, name);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerClose(snd_mixer_t* mixer) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_close(mixer);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerLoad(snd_mixer_t* mixer) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_load(mixer);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)snd_mixer_elem_t* AlsaWrapper::MixerFirstElem(snd_mixer_t* mixer) {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_first_elem(mixer);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)snd_mixer_elem_t* AlsaWrapper::MixerNextElem(snd_mixer_elem_t* elem) {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_elem_next(elem);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerSelemIsActive(snd_mixer_elem_t* elem) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_is_active(elem);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* AlsaWrapper::MixerSelemName(snd_mixer_elem_t* elem) {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_get_name(elem);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerSelemSetCaptureVolumeAll(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snd_mixer_elem_t* elem, long value) {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_set_capture_volume_all(elem, value);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerSelemGetCaptureVolume(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    snd_mixer_elem_t* elem, snd_mixer_selem_channel_id_t channel, long* value) {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_get_capture_volume(elem, channel, value);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerSelemHasCaptureVolume(snd_mixer_elem_t* elem) {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_has_capture_volume(elem);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int AlsaWrapper::MixerSelemGetCaptureVolumeRange(snd_mixer_elem_t* elem,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 long* min, long* max) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return snd_mixer_selem_get_capture_volume_range(elem, min, max);
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
174