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