1d5ac70f0Sopenharmony_ci/** 2d5ac70f0Sopenharmony_ci * \file pcm/pcm_generic.c 3d5ac70f0Sopenharmony_ci * \ingroup PCM 4d5ac70f0Sopenharmony_ci * \brief PCM Interface 5d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz> 6d5ac70f0Sopenharmony_ci * \date 2004 7d5ac70f0Sopenharmony_ci */ 8d5ac70f0Sopenharmony_ci/* 9d5ac70f0Sopenharmony_ci * PCM - Common generic plugin code 10d5ac70f0Sopenharmony_ci * Copyright (c) 2004 by Jaroslav Kysela <perex@perex.cz> 11d5ac70f0Sopenharmony_ci * 12d5ac70f0Sopenharmony_ci * 13d5ac70f0Sopenharmony_ci * This library is free software; you can redistribute it and/or modify 14d5ac70f0Sopenharmony_ci * it under the terms of the GNU Lesser General Public License as 15d5ac70f0Sopenharmony_ci * published by the Free Software Foundation; either version 2.1 of 16d5ac70f0Sopenharmony_ci * the License, or (at your option) any later version. 17d5ac70f0Sopenharmony_ci * 18d5ac70f0Sopenharmony_ci * This program is distributed in the hope that it will be useful, 19d5ac70f0Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 20d5ac70f0Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21d5ac70f0Sopenharmony_ci * GNU Lesser General Public License for more details. 22d5ac70f0Sopenharmony_ci * 23d5ac70f0Sopenharmony_ci * You should have received a copy of the GNU Lesser General Public 24d5ac70f0Sopenharmony_ci * License along with this library; if not, write to the Free Software 25d5ac70f0Sopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26d5ac70f0Sopenharmony_ci * 27d5ac70f0Sopenharmony_ci */ 28d5ac70f0Sopenharmony_ci 29d5ac70f0Sopenharmony_ci#include "pcm_local.h" 30d5ac70f0Sopenharmony_ci#include "pcm_generic.h" 31d5ac70f0Sopenharmony_ci#include <sys/ioctl.h> 32d5ac70f0Sopenharmony_ci#include <limits.h> 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_ci#ifndef DOC_HIDDEN 35d5ac70f0Sopenharmony_ci 36d5ac70f0Sopenharmony_ciint snd_pcm_generic_close(snd_pcm_t *pcm) 37d5ac70f0Sopenharmony_ci{ 38d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 39d5ac70f0Sopenharmony_ci int err = 0; 40d5ac70f0Sopenharmony_ci if (generic->close_slave) 41d5ac70f0Sopenharmony_ci err = snd_pcm_close(generic->slave); 42d5ac70f0Sopenharmony_ci free(generic); 43d5ac70f0Sopenharmony_ci return err; 44d5ac70f0Sopenharmony_ci} 45d5ac70f0Sopenharmony_ci 46d5ac70f0Sopenharmony_ciint snd_pcm_generic_nonblock(snd_pcm_t *pcm, int nonblock) 47d5ac70f0Sopenharmony_ci{ 48d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 49d5ac70f0Sopenharmony_ci return snd_pcm_nonblock(generic->slave, nonblock); 50d5ac70f0Sopenharmony_ci} 51d5ac70f0Sopenharmony_ci 52d5ac70f0Sopenharmony_ciint snd_pcm_generic_async(snd_pcm_t *pcm, int sig, pid_t pid) 53d5ac70f0Sopenharmony_ci{ 54d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 55d5ac70f0Sopenharmony_ci return snd_pcm_async(generic->slave, sig, pid); 56d5ac70f0Sopenharmony_ci} 57d5ac70f0Sopenharmony_ci 58d5ac70f0Sopenharmony_ciint snd_pcm_generic_poll_descriptors_count(snd_pcm_t *pcm) 59d5ac70f0Sopenharmony_ci{ 60d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 61d5ac70f0Sopenharmony_ci return snd_pcm_poll_descriptors_count(generic->slave); 62d5ac70f0Sopenharmony_ci} 63d5ac70f0Sopenharmony_ci 64d5ac70f0Sopenharmony_ciint snd_pcm_generic_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space) 65d5ac70f0Sopenharmony_ci{ 66d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 67d5ac70f0Sopenharmony_ci return snd_pcm_poll_descriptors(generic->slave, pfds, space); 68d5ac70f0Sopenharmony_ci} 69d5ac70f0Sopenharmony_ci 70d5ac70f0Sopenharmony_ciint snd_pcm_generic_poll_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents) 71d5ac70f0Sopenharmony_ci{ 72d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 73d5ac70f0Sopenharmony_ci return snd_pcm_poll_descriptors_revents(generic->slave, pfds, nfds, revents); 74d5ac70f0Sopenharmony_ci} 75d5ac70f0Sopenharmony_ci 76d5ac70f0Sopenharmony_ciint snd_pcm_generic_info(snd_pcm_t *pcm, snd_pcm_info_t * info) 77d5ac70f0Sopenharmony_ci{ 78d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 79d5ac70f0Sopenharmony_ci return snd_pcm_info(generic->slave, info); 80d5ac70f0Sopenharmony_ci} 81d5ac70f0Sopenharmony_ci 82d5ac70f0Sopenharmony_ciint snd_pcm_generic_hw_free(snd_pcm_t *pcm) 83d5ac70f0Sopenharmony_ci{ 84d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 85d5ac70f0Sopenharmony_ci return snd_pcm_hw_free(generic->slave); 86d5ac70f0Sopenharmony_ci} 87d5ac70f0Sopenharmony_ci 88d5ac70f0Sopenharmony_ciint snd_pcm_generic_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params) 89d5ac70f0Sopenharmony_ci{ 90d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 91d5ac70f0Sopenharmony_ci return snd_pcm_sw_params(generic->slave, params); 92d5ac70f0Sopenharmony_ci} 93d5ac70f0Sopenharmony_ci 94d5ac70f0Sopenharmony_ciint snd_pcm_generic_hw_refine(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) 95d5ac70f0Sopenharmony_ci{ 96d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 97d5ac70f0Sopenharmony_ci return snd_pcm_hw_refine(generic->slave, params); 98d5ac70f0Sopenharmony_ci} 99d5ac70f0Sopenharmony_ci 100d5ac70f0Sopenharmony_ciint snd_pcm_generic_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) 101d5ac70f0Sopenharmony_ci{ 102d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 103d5ac70f0Sopenharmony_ci return _snd_pcm_hw_params_internal(generic->slave, params); 104d5ac70f0Sopenharmony_ci} 105d5ac70f0Sopenharmony_ci 106d5ac70f0Sopenharmony_ciint snd_pcm_generic_prepare(snd_pcm_t *pcm) 107d5ac70f0Sopenharmony_ci{ 108d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 109d5ac70f0Sopenharmony_ci return snd_pcm_prepare(generic->slave); 110d5ac70f0Sopenharmony_ci} 111d5ac70f0Sopenharmony_ci 112d5ac70f0Sopenharmony_ciint snd_pcm_generic_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info) 113d5ac70f0Sopenharmony_ci{ 114d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 115d5ac70f0Sopenharmony_ci if (pcm->mmap_shadow) { 116d5ac70f0Sopenharmony_ci /* No own buffer is required - the plugin won't change 117d5ac70f0Sopenharmony_ci * the data on the buffer, or do safely on-the-place 118d5ac70f0Sopenharmony_ci * conversion 119d5ac70f0Sopenharmony_ci */ 120d5ac70f0Sopenharmony_ci return snd_pcm_channel_info(generic->slave, info); 121d5ac70f0Sopenharmony_ci } else { 122d5ac70f0Sopenharmony_ci /* Allocate own buffer */ 123d5ac70f0Sopenharmony_ci return snd_pcm_channel_info_shm(pcm, info, -1); 124d5ac70f0Sopenharmony_ci } 125d5ac70f0Sopenharmony_ci} 126d5ac70f0Sopenharmony_ci 127d5ac70f0Sopenharmony_ciint snd_pcm_generic_status(snd_pcm_t *pcm, snd_pcm_status_t * status) 128d5ac70f0Sopenharmony_ci{ 129d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 130d5ac70f0Sopenharmony_ci return snd_pcm_status(generic->slave, status); 131d5ac70f0Sopenharmony_ci} 132d5ac70f0Sopenharmony_ci 133d5ac70f0Sopenharmony_cisnd_pcm_state_t snd_pcm_generic_state(snd_pcm_t *pcm) 134d5ac70f0Sopenharmony_ci{ 135d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 136d5ac70f0Sopenharmony_ci return snd_pcm_state(generic->slave); 137d5ac70f0Sopenharmony_ci} 138d5ac70f0Sopenharmony_ci 139d5ac70f0Sopenharmony_ciint snd_pcm_generic_hwsync(snd_pcm_t *pcm) 140d5ac70f0Sopenharmony_ci{ 141d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 142d5ac70f0Sopenharmony_ci return snd_pcm_hwsync(generic->slave); 143d5ac70f0Sopenharmony_ci} 144d5ac70f0Sopenharmony_ci 145d5ac70f0Sopenharmony_ciint snd_pcm_generic_reset(snd_pcm_t *pcm) 146d5ac70f0Sopenharmony_ci{ 147d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 148d5ac70f0Sopenharmony_ci return snd_pcm_reset(generic->slave); 149d5ac70f0Sopenharmony_ci} 150d5ac70f0Sopenharmony_ci 151d5ac70f0Sopenharmony_ciint snd_pcm_generic_start(snd_pcm_t *pcm) 152d5ac70f0Sopenharmony_ci{ 153d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 154d5ac70f0Sopenharmony_ci return snd_pcm_start(generic->slave); 155d5ac70f0Sopenharmony_ci} 156d5ac70f0Sopenharmony_ci 157d5ac70f0Sopenharmony_ciint snd_pcm_generic_drop(snd_pcm_t *pcm) 158d5ac70f0Sopenharmony_ci{ 159d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 160d5ac70f0Sopenharmony_ci return snd_pcm_drop(generic->slave); 161d5ac70f0Sopenharmony_ci} 162d5ac70f0Sopenharmony_ci 163d5ac70f0Sopenharmony_ciint snd_pcm_generic_drain(snd_pcm_t *pcm) 164d5ac70f0Sopenharmony_ci{ 165d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 166d5ac70f0Sopenharmony_ci return snd_pcm_drain(generic->slave); 167d5ac70f0Sopenharmony_ci} 168d5ac70f0Sopenharmony_ci 169d5ac70f0Sopenharmony_ciint snd_pcm_generic_pause(snd_pcm_t *pcm, int enable) 170d5ac70f0Sopenharmony_ci{ 171d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 172d5ac70f0Sopenharmony_ci return snd_pcm_pause(generic->slave, enable); 173d5ac70f0Sopenharmony_ci} 174d5ac70f0Sopenharmony_ci 175d5ac70f0Sopenharmony_ciint snd_pcm_generic_resume(snd_pcm_t *pcm) 176d5ac70f0Sopenharmony_ci{ 177d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 178d5ac70f0Sopenharmony_ci return snd_pcm_resume(generic->slave); 179d5ac70f0Sopenharmony_ci} 180d5ac70f0Sopenharmony_ci 181d5ac70f0Sopenharmony_ciint snd_pcm_generic_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp) 182d5ac70f0Sopenharmony_ci{ 183d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 184d5ac70f0Sopenharmony_ci return snd_pcm_delay(generic->slave, delayp); 185d5ac70f0Sopenharmony_ci} 186d5ac70f0Sopenharmony_ci 187d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_forwardable(snd_pcm_t *pcm) 188d5ac70f0Sopenharmony_ci{ 189d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 190d5ac70f0Sopenharmony_ci return snd_pcm_forwardable(generic->slave); 191d5ac70f0Sopenharmony_ci} 192d5ac70f0Sopenharmony_ci 193d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames) 194d5ac70f0Sopenharmony_ci{ 195d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 196d5ac70f0Sopenharmony_ci return INTERNAL(snd_pcm_forward)(generic->slave, frames); 197d5ac70f0Sopenharmony_ci} 198d5ac70f0Sopenharmony_ci 199d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_rewindable(snd_pcm_t *pcm) 200d5ac70f0Sopenharmony_ci{ 201d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 202d5ac70f0Sopenharmony_ci return snd_pcm_rewindable(generic->slave); 203d5ac70f0Sopenharmony_ci} 204d5ac70f0Sopenharmony_ci 205d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames) 206d5ac70f0Sopenharmony_ci{ 207d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 208d5ac70f0Sopenharmony_ci return snd_pcm_rewind(generic->slave, frames); 209d5ac70f0Sopenharmony_ci} 210d5ac70f0Sopenharmony_ci 211d5ac70f0Sopenharmony_ciint snd_pcm_generic_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2) 212d5ac70f0Sopenharmony_ci{ 213d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm1->private_data; 214d5ac70f0Sopenharmony_ci if (generic->slave->fast_ops->link) 215d5ac70f0Sopenharmony_ci return generic->slave->fast_ops->link(generic->slave->fast_op_arg, pcm2); 216d5ac70f0Sopenharmony_ci return -ENOSYS; 217d5ac70f0Sopenharmony_ci} 218d5ac70f0Sopenharmony_ci 219d5ac70f0Sopenharmony_ciint snd_pcm_generic_link_slaves(snd_pcm_t *pcm, snd_pcm_t *master) 220d5ac70f0Sopenharmony_ci{ 221d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 222d5ac70f0Sopenharmony_ci if (generic->slave->fast_ops->link_slaves) 223d5ac70f0Sopenharmony_ci return generic->slave->fast_ops->link_slaves(generic->slave->fast_op_arg, master); 224d5ac70f0Sopenharmony_ci return -ENOSYS; 225d5ac70f0Sopenharmony_ci} 226d5ac70f0Sopenharmony_ci 227d5ac70f0Sopenharmony_ciint snd_pcm_generic_unlink(snd_pcm_t *pcm) 228d5ac70f0Sopenharmony_ci{ 229d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 230d5ac70f0Sopenharmony_ci if (generic->slave->fast_ops->unlink) 231d5ac70f0Sopenharmony_ci return generic->slave->fast_ops->unlink(generic->slave->fast_op_arg); 232d5ac70f0Sopenharmony_ci return -ENOSYS; 233d5ac70f0Sopenharmony_ci} 234d5ac70f0Sopenharmony_ci 235d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size) 236d5ac70f0Sopenharmony_ci{ 237d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 238d5ac70f0Sopenharmony_ci return _snd_pcm_writei(generic->slave, buffer, size); 239d5ac70f0Sopenharmony_ci} 240d5ac70f0Sopenharmony_ci 241d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size) 242d5ac70f0Sopenharmony_ci{ 243d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 244d5ac70f0Sopenharmony_ci return _snd_pcm_writen(generic->slave, bufs, size); 245d5ac70f0Sopenharmony_ci} 246d5ac70f0Sopenharmony_ci 247d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size) 248d5ac70f0Sopenharmony_ci{ 249d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 250d5ac70f0Sopenharmony_ci return _snd_pcm_readi(generic->slave, buffer, size); 251d5ac70f0Sopenharmony_ci} 252d5ac70f0Sopenharmony_ci 253d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size) 254d5ac70f0Sopenharmony_ci{ 255d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 256d5ac70f0Sopenharmony_ci return _snd_pcm_readn(generic->slave, bufs, size); 257d5ac70f0Sopenharmony_ci} 258d5ac70f0Sopenharmony_ci 259d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_mmap_commit(snd_pcm_t *pcm, 260d5ac70f0Sopenharmony_ci snd_pcm_uframes_t offset, 261d5ac70f0Sopenharmony_ci snd_pcm_uframes_t size) 262d5ac70f0Sopenharmony_ci{ 263d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 264d5ac70f0Sopenharmony_ci return snd_pcm_mmap_commit(generic->slave, offset, size); 265d5ac70f0Sopenharmony_ci} 266d5ac70f0Sopenharmony_ci 267d5ac70f0Sopenharmony_cisnd_pcm_sframes_t snd_pcm_generic_avail_update(snd_pcm_t *pcm) 268d5ac70f0Sopenharmony_ci{ 269d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 270d5ac70f0Sopenharmony_ci return snd_pcm_avail_update(generic->slave); 271d5ac70f0Sopenharmony_ci} 272d5ac70f0Sopenharmony_ci 273d5ac70f0Sopenharmony_ciint snd_pcm_generic_htimestamp(snd_pcm_t *pcm, snd_pcm_uframes_t *avail, 274d5ac70f0Sopenharmony_ci snd_htimestamp_t *tstamp) 275d5ac70f0Sopenharmony_ci{ 276d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 277d5ac70f0Sopenharmony_ci return snd_pcm_htimestamp(generic->slave, avail, tstamp); 278d5ac70f0Sopenharmony_ci} 279d5ac70f0Sopenharmony_ci 280d5ac70f0Sopenharmony_ci/* stand-alone version - similar like snd_pcm_hw_htimestamp but 281d5ac70f0Sopenharmony_ci * taking the tstamp via gettimestamp(). 282d5ac70f0Sopenharmony_ci */ 283d5ac70f0Sopenharmony_ciint snd_pcm_generic_real_htimestamp(snd_pcm_t *pcm, snd_pcm_uframes_t *avail, 284d5ac70f0Sopenharmony_ci snd_htimestamp_t *tstamp) 285d5ac70f0Sopenharmony_ci{ 286d5ac70f0Sopenharmony_ci snd_pcm_sframes_t avail1; 287d5ac70f0Sopenharmony_ci int ok = 0; 288d5ac70f0Sopenharmony_ci 289d5ac70f0Sopenharmony_ci while (1) { 290d5ac70f0Sopenharmony_ci avail1 = __snd_pcm_avail_update(pcm); 291d5ac70f0Sopenharmony_ci if (avail1 < 0) 292d5ac70f0Sopenharmony_ci return avail1; 293d5ac70f0Sopenharmony_ci if (ok && (snd_pcm_uframes_t)avail1 == *avail) 294d5ac70f0Sopenharmony_ci break; 295d5ac70f0Sopenharmony_ci *avail = avail1; 296d5ac70f0Sopenharmony_ci gettimestamp(tstamp, pcm->tstamp_type); 297d5ac70f0Sopenharmony_ci ok = 1; 298d5ac70f0Sopenharmony_ci } 299d5ac70f0Sopenharmony_ci return 0; 300d5ac70f0Sopenharmony_ci} 301d5ac70f0Sopenharmony_ci 302d5ac70f0Sopenharmony_ciint snd_pcm_generic_mmap(snd_pcm_t *pcm) 303d5ac70f0Sopenharmony_ci{ 304d5ac70f0Sopenharmony_ci if (pcm->mmap_shadow) { 305d5ac70f0Sopenharmony_ci /* Copy the slave mmapped buffer data */ 306d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 307d5ac70f0Sopenharmony_ci pcm->mmap_channels = generic->slave->mmap_channels; 308d5ac70f0Sopenharmony_ci pcm->running_areas = generic->slave->running_areas; 309d5ac70f0Sopenharmony_ci pcm->stopped_areas = generic->slave->stopped_areas; 310d5ac70f0Sopenharmony_ci } 311d5ac70f0Sopenharmony_ci return 0; 312d5ac70f0Sopenharmony_ci} 313d5ac70f0Sopenharmony_ci 314d5ac70f0Sopenharmony_ciint snd_pcm_generic_munmap(snd_pcm_t *pcm) 315d5ac70f0Sopenharmony_ci{ 316d5ac70f0Sopenharmony_ci if (pcm->mmap_shadow) { 317d5ac70f0Sopenharmony_ci /* Clean up */ 318d5ac70f0Sopenharmony_ci pcm->mmap_channels = NULL; 319d5ac70f0Sopenharmony_ci pcm->running_areas = NULL; 320d5ac70f0Sopenharmony_ci pcm->stopped_areas = NULL; 321d5ac70f0Sopenharmony_ci } 322d5ac70f0Sopenharmony_ci return 0; 323d5ac70f0Sopenharmony_ci} 324d5ac70f0Sopenharmony_ci 325d5ac70f0Sopenharmony_cisnd_pcm_chmap_query_t **snd_pcm_generic_query_chmaps(snd_pcm_t *pcm) 326d5ac70f0Sopenharmony_ci{ 327d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 328d5ac70f0Sopenharmony_ci return snd_pcm_query_chmaps(generic->slave); 329d5ac70f0Sopenharmony_ci} 330d5ac70f0Sopenharmony_ci 331d5ac70f0Sopenharmony_cisnd_pcm_chmap_t *snd_pcm_generic_get_chmap(snd_pcm_t *pcm) 332d5ac70f0Sopenharmony_ci{ 333d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 334d5ac70f0Sopenharmony_ci return snd_pcm_get_chmap(generic->slave); 335d5ac70f0Sopenharmony_ci} 336d5ac70f0Sopenharmony_ci 337d5ac70f0Sopenharmony_ciint snd_pcm_generic_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map) 338d5ac70f0Sopenharmony_ci{ 339d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 340d5ac70f0Sopenharmony_ci return snd_pcm_set_chmap(generic->slave, map); 341d5ac70f0Sopenharmony_ci} 342d5ac70f0Sopenharmony_ci 343d5ac70f0Sopenharmony_ciint snd_pcm_generic_may_wait_for_avail_min(snd_pcm_t *pcm, snd_pcm_uframes_t avail ATTRIBUTE_UNUSED) 344d5ac70f0Sopenharmony_ci{ 345d5ac70f0Sopenharmony_ci snd_pcm_generic_t *generic = pcm->private_data; 346d5ac70f0Sopenharmony_ci return snd_pcm_may_wait_for_avail_min(generic->slave, snd_pcm_mmap_avail(generic->slave)); 347d5ac70f0Sopenharmony_ci} 348d5ac70f0Sopenharmony_ci 349d5ac70f0Sopenharmony_ci#endif /* DOC_HIDDEN */ 350