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