xref: /aosp_15_r20/external/tinyalsa_new/include/tinyalsa/pcm.h (revision 02e95f1a335b55495d41ca67eaf42361f13704fa)
1*02e95f1aSMarcin Radomski /* pcm.h
2*02e95f1aSMarcin Radomski **
3*02e95f1aSMarcin Radomski ** Copyright 2011, The Android Open Source Project
4*02e95f1aSMarcin Radomski **
5*02e95f1aSMarcin Radomski ** Redistribution and use in source and binary forms, with or without
6*02e95f1aSMarcin Radomski ** modification, are permitted provided that the following conditions are met:
7*02e95f1aSMarcin Radomski **     * Redistributions of source code must retain the above copyright
8*02e95f1aSMarcin Radomski **       notice, this list of conditions and the following disclaimer.
9*02e95f1aSMarcin Radomski **     * Redistributions in binary form must reproduce the above copyright
10*02e95f1aSMarcin Radomski **       notice, this list of conditions and the following disclaimer in the
11*02e95f1aSMarcin Radomski **       documentation and/or other materials provided with the distribution.
12*02e95f1aSMarcin Radomski **     * Neither the name of The Android Open Source Project nor the names of
13*02e95f1aSMarcin Radomski **       its contributors may be used to endorse or promote products derived
14*02e95f1aSMarcin Radomski **       from this software without specific prior written permission.
15*02e95f1aSMarcin Radomski **
16*02e95f1aSMarcin Radomski ** THIS SOFTWARE IS PROVIDED BY The Android Open Source Project ``AS IS'' AND
17*02e95f1aSMarcin Radomski ** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*02e95f1aSMarcin Radomski ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*02e95f1aSMarcin Radomski ** ARE DISCLAIMED. IN NO EVENT SHALL The Android Open Source Project BE LIABLE
20*02e95f1aSMarcin Radomski ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*02e95f1aSMarcin Radomski ** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22*02e95f1aSMarcin Radomski ** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23*02e95f1aSMarcin Radomski ** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*02e95f1aSMarcin Radomski ** LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*02e95f1aSMarcin Radomski ** OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
26*02e95f1aSMarcin Radomski ** DAMAGE.
27*02e95f1aSMarcin Radomski */
28*02e95f1aSMarcin Radomski 
29*02e95f1aSMarcin Radomski /** @file */
30*02e95f1aSMarcin Radomski 
31*02e95f1aSMarcin Radomski /** @defgroup libtinyalsa-pcm PCM Interface
32*02e95f1aSMarcin Radomski  * @brief All macros, structures and functions that make up the PCM interface.
33*02e95f1aSMarcin Radomski  */
34*02e95f1aSMarcin Radomski 
35*02e95f1aSMarcin Radomski #ifndef TINYALSA_PCM_H
36*02e95f1aSMarcin Radomski #define TINYALSA_PCM_H
37*02e95f1aSMarcin Radomski 
38*02e95f1aSMarcin Radomski #include <tinyalsa/attributes.h>
39*02e95f1aSMarcin Radomski 
40*02e95f1aSMarcin Radomski #include <sys/time.h>
41*02e95f1aSMarcin Radomski #include <stddef.h>
42*02e95f1aSMarcin Radomski 
43*02e95f1aSMarcin Radomski /** A flag that specifies that the PCM is an output.
44*02e95f1aSMarcin Radomski  * May not be bitwise AND'd with @ref PCM_IN.
45*02e95f1aSMarcin Radomski  * Used in @ref pcm_open.
46*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
47*02e95f1aSMarcin Radomski  */
48*02e95f1aSMarcin Radomski #define PCM_OUT 0x00000000
49*02e95f1aSMarcin Radomski 
50*02e95f1aSMarcin Radomski /** Specifies that the PCM is an input.
51*02e95f1aSMarcin Radomski  * May not be bitwise AND'd with @ref PCM_OUT.
52*02e95f1aSMarcin Radomski  * Used in @ref pcm_open.
53*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
54*02e95f1aSMarcin Radomski  */
55*02e95f1aSMarcin Radomski #define PCM_IN 0x10000000
56*02e95f1aSMarcin Radomski 
57*02e95f1aSMarcin Radomski /** Specifies that the PCM will use mmap read and write methods.
58*02e95f1aSMarcin Radomski  * Used in @ref pcm_open.
59*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
60*02e95f1aSMarcin Radomski  */
61*02e95f1aSMarcin Radomski #define PCM_MMAP 0x00000001
62*02e95f1aSMarcin Radomski 
63*02e95f1aSMarcin Radomski /** Specifies no interrupt requests.
64*02e95f1aSMarcin Radomski  * May only be bitwise AND'd with @ref PCM_MMAP.
65*02e95f1aSMarcin Radomski  * Used in @ref pcm_open.
66*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
67*02e95f1aSMarcin Radomski  */
68*02e95f1aSMarcin Radomski #define PCM_NOIRQ 0x00000002
69*02e95f1aSMarcin Radomski 
70*02e95f1aSMarcin Radomski /** When set, calls to @ref pcm_write
71*02e95f1aSMarcin Radomski  * for a playback stream will not attempt
72*02e95f1aSMarcin Radomski  * to restart the stream in the case of an
73*02e95f1aSMarcin Radomski  * underflow, but will return -EPIPE instead.
74*02e95f1aSMarcin Radomski  * After the first -EPIPE error, the stream
75*02e95f1aSMarcin Radomski  * is considered to be stopped, and a second
76*02e95f1aSMarcin Radomski  * call to pcm_write will attempt to restart
77*02e95f1aSMarcin Radomski  * the stream.
78*02e95f1aSMarcin Radomski  * Used in @ref pcm_open.
79*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
80*02e95f1aSMarcin Radomski  */
81*02e95f1aSMarcin Radomski #define PCM_NORESTART 0x00000004
82*02e95f1aSMarcin Radomski 
83*02e95f1aSMarcin Radomski /** Specifies monotonic timestamps.
84*02e95f1aSMarcin Radomski  * Used in @ref pcm_open.
85*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
86*02e95f1aSMarcin Radomski  */
87*02e95f1aSMarcin Radomski #define PCM_MONOTONIC 0x00000008
88*02e95f1aSMarcin Radomski 
89*02e95f1aSMarcin Radomski /** If used with @ref pcm_open and @ref pcm_params_get,
90*02e95f1aSMarcin Radomski  * it will not cause the function to block if
91*02e95f1aSMarcin Radomski  * the PCM is not available. It will also cause
92*02e95f1aSMarcin Radomski  * the functions @ref pcm_readi and @ref pcm_writei
93*02e95f1aSMarcin Radomski  * to exit if they would cause the caller to wait.
94*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
95*02e95f1aSMarcin Radomski  * */
96*02e95f1aSMarcin Radomski #define PCM_NONBLOCK 0x00000010
97*02e95f1aSMarcin Radomski 
98*02e95f1aSMarcin Radomski /** Means a PCM is opened
99*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
100*02e95f1aSMarcin Radomski  */
101*02e95f1aSMarcin Radomski #define PCM_STATE_OPEN 0x00
102*02e95f1aSMarcin Radomski 
103*02e95f1aSMarcin Radomski /** Means a PCM HW_PARAMS is set
104*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
105*02e95f1aSMarcin Radomski  */
106*02e95f1aSMarcin Radomski #define PCM_STATE_SETUP 0x01
107*02e95f1aSMarcin Radomski 
108*02e95f1aSMarcin Radomski /** Means a PCM is prepared
109*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
110*02e95f1aSMarcin Radomski  */
111*02e95f1aSMarcin Radomski #define PCM_STATE_PREPARED 0x02
112*02e95f1aSMarcin Radomski 
113*02e95f1aSMarcin Radomski /** For inputs, this means the PCM is recording audio samples.
114*02e95f1aSMarcin Radomski  * For outputs, this means the PCM is playing audio samples.
115*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
116*02e95f1aSMarcin Radomski  */
117*02e95f1aSMarcin Radomski #define PCM_STATE_RUNNING 0x03
118*02e95f1aSMarcin Radomski 
119*02e95f1aSMarcin Radomski /** For inputs, this means an overrun occured.
120*02e95f1aSMarcin Radomski  * For outputs, this means an underrun occured.
121*02e95f1aSMarcin Radomski  */
122*02e95f1aSMarcin Radomski #define PCM_STATE_XRUN 0x04
123*02e95f1aSMarcin Radomski 
124*02e95f1aSMarcin Radomski /** For outputs, this means audio samples are played.
125*02e95f1aSMarcin Radomski  * A PCM is in a draining state when it is coming to a stop.
126*02e95f1aSMarcin Radomski  */
127*02e95f1aSMarcin Radomski #define PCM_STATE_DRAINING 0x05
128*02e95f1aSMarcin Radomski 
129*02e95f1aSMarcin Radomski /** Means a PCM is suspended.
130*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
131*02e95f1aSMarcin Radomski  */
132*02e95f1aSMarcin Radomski #define PCM_STATE_SUSPENDED 0x07
133*02e95f1aSMarcin Radomski 
134*02e95f1aSMarcin Radomski /** Means a PCM has been disconnected.
135*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
136*02e95f1aSMarcin Radomski  */
137*02e95f1aSMarcin Radomski #define PCM_STATE_DISCONNECTED 0x08
138*02e95f1aSMarcin Radomski 
139*02e95f1aSMarcin Radomski #if defined(__cplusplus)
140*02e95f1aSMarcin Radomski extern "C" {
141*02e95f1aSMarcin Radomski #endif
142*02e95f1aSMarcin Radomski 
143*02e95f1aSMarcin Radomski /** Audio sample format of a PCM.
144*02e95f1aSMarcin Radomski  * The first letter specifiers whether the sample is signed or unsigned.
145*02e95f1aSMarcin Radomski  * The letter 'S' means signed. The letter 'U' means unsigned.
146*02e95f1aSMarcin Radomski  * The following number is the amount of bits that the sample occupies in memory.
147*02e95f1aSMarcin Radomski  * Following the underscore, specifiers whether the sample is big endian or little endian.
148*02e95f1aSMarcin Radomski  * The letters 'LE' mean little endian.
149*02e95f1aSMarcin Radomski  * The letters 'BE' mean big endian.
150*02e95f1aSMarcin Radomski  * This enumeration is used in the @ref pcm_config structure.
151*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
152*02e95f1aSMarcin Radomski  */
153*02e95f1aSMarcin Radomski enum pcm_format {
154*02e95f1aSMarcin Radomski 
155*02e95f1aSMarcin Radomski /* Note: This section must stay in the same
156*02e95f1aSMarcin Radomski  * order for binary compatibility with older
157*02e95f1aSMarcin Radomski  * versions of TinyALSA. */
158*02e95f1aSMarcin Radomski 
159*02e95f1aSMarcin Radomski     PCM_FORMAT_INVALID = -1,
160*02e95f1aSMarcin Radomski     /** Signed 16-bit, little endian */
161*02e95f1aSMarcin Radomski     PCM_FORMAT_S16_LE = 0,
162*02e95f1aSMarcin Radomski     /** Signed, 32-bit, little endian */
163*02e95f1aSMarcin Radomski     PCM_FORMAT_S32_LE,
164*02e95f1aSMarcin Radomski     /** Signed, 8-bit */
165*02e95f1aSMarcin Radomski     PCM_FORMAT_S8,
166*02e95f1aSMarcin Radomski     /** Signed, 24-bit (32-bit in memory), little endian */
167*02e95f1aSMarcin Radomski     PCM_FORMAT_S24_LE,
168*02e95f1aSMarcin Radomski     /** Signed, 24-bit, little endian */
169*02e95f1aSMarcin Radomski     PCM_FORMAT_S24_3LE,
170*02e95f1aSMarcin Radomski 
171*02e95f1aSMarcin Radomski /* End of compatibility section. */
172*02e95f1aSMarcin Radomski 
173*02e95f1aSMarcin Radomski     /** Signed, 16-bit, big endian */
174*02e95f1aSMarcin Radomski     PCM_FORMAT_S16_BE,
175*02e95f1aSMarcin Radomski     /** Signed, 24-bit (32-bit in memory), big endian */
176*02e95f1aSMarcin Radomski     PCM_FORMAT_S24_BE,
177*02e95f1aSMarcin Radomski     /** Signed, 24-bit, big endian */
178*02e95f1aSMarcin Radomski     PCM_FORMAT_S24_3BE,
179*02e95f1aSMarcin Radomski     /** Signed, 32-bit, big endian */
180*02e95f1aSMarcin Radomski     PCM_FORMAT_S32_BE,
181*02e95f1aSMarcin Radomski     /** 32-bit float, little endian */
182*02e95f1aSMarcin Radomski     PCM_FORMAT_FLOAT_LE,
183*02e95f1aSMarcin Radomski     /** 32-bit float, big endian */
184*02e95f1aSMarcin Radomski     PCM_FORMAT_FLOAT_BE,
185*02e95f1aSMarcin Radomski     /** Max of the enumeration list, not an actual format. */
186*02e95f1aSMarcin Radomski     PCM_FORMAT_MAX
187*02e95f1aSMarcin Radomski };
188*02e95f1aSMarcin Radomski 
189*02e95f1aSMarcin Radomski /** A bit mask of 256 bits (32 bytes) that describes some hardware parameters of a PCM */
190*02e95f1aSMarcin Radomski struct pcm_mask {
191*02e95f1aSMarcin Radomski     /** bits of the bit mask */
192*02e95f1aSMarcin Radomski     unsigned int bits[32 / sizeof(unsigned int)];
193*02e95f1aSMarcin Radomski };
194*02e95f1aSMarcin Radomski 
195*02e95f1aSMarcin Radomski /** Encapsulates the hardware and software parameters of a PCM.
196*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
197*02e95f1aSMarcin Radomski  */
198*02e95f1aSMarcin Radomski struct pcm_config {
199*02e95f1aSMarcin Radomski     /** The number of channels in a frame */
200*02e95f1aSMarcin Radomski     unsigned int channels;
201*02e95f1aSMarcin Radomski     /** The number of frames per second */
202*02e95f1aSMarcin Radomski     unsigned int rate;
203*02e95f1aSMarcin Radomski     /** The number of frames in a period */
204*02e95f1aSMarcin Radomski     unsigned int period_size;
205*02e95f1aSMarcin Radomski     /** The number of periods in a PCM */
206*02e95f1aSMarcin Radomski     unsigned int period_count;
207*02e95f1aSMarcin Radomski     /** The sample format of a PCM */
208*02e95f1aSMarcin Radomski     enum pcm_format format;
209*02e95f1aSMarcin Radomski     /* Values to use for the ALSA start, stop and silence thresholds, and
210*02e95f1aSMarcin Radomski      * silence size.  Setting any one of these values to 0 will cause the
211*02e95f1aSMarcin Radomski      * default tinyalsa values to be used instead.
212*02e95f1aSMarcin Radomski      * Tinyalsa defaults are as follows.
213*02e95f1aSMarcin Radomski      *
214*02e95f1aSMarcin Radomski      * start_threshold   : period_count * period_size
215*02e95f1aSMarcin Radomski      * stop_threshold    : period_count * period_size
216*02e95f1aSMarcin Radomski      * silence_threshold : 0
217*02e95f1aSMarcin Radomski      * silence_size      : 0
218*02e95f1aSMarcin Radomski      */
219*02e95f1aSMarcin Radomski     /** The minimum number of frames required to start the PCM */
220*02e95f1aSMarcin Radomski     unsigned long start_threshold;
221*02e95f1aSMarcin Radomski     /** The minimum number of frames required to stop the PCM */
222*02e95f1aSMarcin Radomski     unsigned long stop_threshold;
223*02e95f1aSMarcin Radomski     /** The minimum number of frames to silence the PCM */
224*02e95f1aSMarcin Radomski     unsigned long silence_threshold;
225*02e95f1aSMarcin Radomski     /** The number of frames to overwrite the playback buffer when the playback underrun is greater
226*02e95f1aSMarcin Radomski      * than the silence threshold */
227*02e95f1aSMarcin Radomski     unsigned long silence_size;
228*02e95f1aSMarcin Radomski 
229*02e95f1aSMarcin Radomski     unsigned long avail_min;
230*02e95f1aSMarcin Radomski };
231*02e95f1aSMarcin Radomski 
232*02e95f1aSMarcin Radomski /** Enumeration of a PCM's hardware parameters.
233*02e95f1aSMarcin Radomski  * Each of these parameters is either a mask or an interval.
234*02e95f1aSMarcin Radomski  * @ingroup libtinyalsa-pcm
235*02e95f1aSMarcin Radomski  */
236*02e95f1aSMarcin Radomski enum pcm_param
237*02e95f1aSMarcin Radomski {
238*02e95f1aSMarcin Radomski     /** A mask that represents the type of read or write method available (e.g. interleaved, mmap). */
239*02e95f1aSMarcin Radomski     PCM_PARAM_ACCESS,
240*02e95f1aSMarcin Radomski     /** A mask that represents the @ref pcm_format available (e.g. @ref PCM_FORMAT_S32_LE) */
241*02e95f1aSMarcin Radomski     PCM_PARAM_FORMAT,
242*02e95f1aSMarcin Radomski     /** A mask that represents the subformat available */
243*02e95f1aSMarcin Radomski     PCM_PARAM_SUBFORMAT,
244*02e95f1aSMarcin Radomski     /** An interval representing the range of sample bits available (e.g. 8 to 32) */
245*02e95f1aSMarcin Radomski     PCM_PARAM_SAMPLE_BITS,
246*02e95f1aSMarcin Radomski     /** An interval representing the range of frame bits available (e.g. 8 to 64) */
247*02e95f1aSMarcin Radomski     PCM_PARAM_FRAME_BITS,
248*02e95f1aSMarcin Radomski     /** An interval representing the range of channels available (e.g. 1 to 2) */
249*02e95f1aSMarcin Radomski     PCM_PARAM_CHANNELS,
250*02e95f1aSMarcin Radomski     /** An interval representing the range of rates available (e.g. 44100 to 192000) */
251*02e95f1aSMarcin Radomski     PCM_PARAM_RATE,
252*02e95f1aSMarcin Radomski     PCM_PARAM_PERIOD_TIME,
253*02e95f1aSMarcin Radomski     /** The number of frames in a period */
254*02e95f1aSMarcin Radomski     PCM_PARAM_PERIOD_SIZE,
255*02e95f1aSMarcin Radomski     /** The number of bytes in a period */
256*02e95f1aSMarcin Radomski     PCM_PARAM_PERIOD_BYTES,
257*02e95f1aSMarcin Radomski     /** The number of periods for a PCM */
258*02e95f1aSMarcin Radomski     PCM_PARAM_PERIODS,
259*02e95f1aSMarcin Radomski     PCM_PARAM_BUFFER_TIME,
260*02e95f1aSMarcin Radomski     PCM_PARAM_BUFFER_SIZE,
261*02e95f1aSMarcin Radomski     PCM_PARAM_BUFFER_BYTES,
262*02e95f1aSMarcin Radomski     PCM_PARAM_TICK_TIME,
263*02e95f1aSMarcin Radomski }; /* enum pcm_param */
264*02e95f1aSMarcin Radomski 
265*02e95f1aSMarcin Radomski struct pcm_params;
266*02e95f1aSMarcin Radomski 
267*02e95f1aSMarcin Radomski struct pcm_params *pcm_params_get(unsigned int card, unsigned int device,
268*02e95f1aSMarcin Radomski                                   unsigned int flags);
269*02e95f1aSMarcin Radomski 
270*02e95f1aSMarcin Radomski void pcm_params_free(struct pcm_params *pcm_params);
271*02e95f1aSMarcin Radomski 
272*02e95f1aSMarcin Radomski const struct pcm_mask *pcm_params_get_mask(const struct pcm_params *pcm_params, enum pcm_param param);
273*02e95f1aSMarcin Radomski 
274*02e95f1aSMarcin Radomski unsigned int pcm_params_get_min(const struct pcm_params *pcm_params, enum pcm_param param);
275*02e95f1aSMarcin Radomski 
276*02e95f1aSMarcin Radomski unsigned int pcm_params_get_max(const struct pcm_params *pcm_params, enum pcm_param param);
277*02e95f1aSMarcin Radomski 
278*02e95f1aSMarcin Radomski /* Converts the pcm parameters to a human readable string.
279*02e95f1aSMarcin Radomski  * The string parameter is a caller allocated buffer of size bytes,
280*02e95f1aSMarcin Radomski  * which is then filled up to size - 1 and null terminated,
281*02e95f1aSMarcin Radomski  * if size is greater than zero.
282*02e95f1aSMarcin Radomski  * The return value is the number of bytes copied to string
283*02e95f1aSMarcin Radomski  * (not including null termination) if less than size; otherwise,
284*02e95f1aSMarcin Radomski  * the number of bytes required for the buffer.
285*02e95f1aSMarcin Radomski  */
286*02e95f1aSMarcin Radomski int pcm_params_to_string(struct pcm_params *params, char *string, unsigned int size);
287*02e95f1aSMarcin Radomski 
288*02e95f1aSMarcin Radomski /* Returns 1 if the pcm_format is present (format bit set) in
289*02e95f1aSMarcin Radomski  * the pcm_params structure; 0 otherwise, or upon unrecognized format.
290*02e95f1aSMarcin Radomski  */
291*02e95f1aSMarcin Radomski int pcm_params_format_test(struct pcm_params *params, enum pcm_format format);
292*02e95f1aSMarcin Radomski 
293*02e95f1aSMarcin Radomski struct pcm;
294*02e95f1aSMarcin Radomski 
295*02e95f1aSMarcin Radomski struct pcm *pcm_open(unsigned int card,
296*02e95f1aSMarcin Radomski                      unsigned int device,
297*02e95f1aSMarcin Radomski                      unsigned int flags,
298*02e95f1aSMarcin Radomski                      const struct pcm_config *config);
299*02e95f1aSMarcin Radomski 
300*02e95f1aSMarcin Radomski struct pcm *pcm_open_by_name(const char *name,
301*02e95f1aSMarcin Radomski                              unsigned int flags,
302*02e95f1aSMarcin Radomski                              const struct pcm_config *config);
303*02e95f1aSMarcin Radomski 
304*02e95f1aSMarcin Radomski int pcm_close(struct pcm *pcm);
305*02e95f1aSMarcin Radomski 
306*02e95f1aSMarcin Radomski int pcm_is_ready(const struct pcm *pcm);
307*02e95f1aSMarcin Radomski 
308*02e95f1aSMarcin Radomski unsigned int pcm_get_channels(const struct pcm *pcm);
309*02e95f1aSMarcin Radomski 
310*02e95f1aSMarcin Radomski const struct pcm_config * pcm_get_config(const struct pcm *pcm);
311*02e95f1aSMarcin Radomski 
312*02e95f1aSMarcin Radomski unsigned int pcm_get_rate(const struct pcm *pcm);
313*02e95f1aSMarcin Radomski 
314*02e95f1aSMarcin Radomski enum pcm_format pcm_get_format(const struct pcm *pcm);
315*02e95f1aSMarcin Radomski 
316*02e95f1aSMarcin Radomski int pcm_get_file_descriptor(const struct pcm *pcm);
317*02e95f1aSMarcin Radomski 
318*02e95f1aSMarcin Radomski const char *pcm_get_error(const struct pcm *pcm);
319*02e95f1aSMarcin Radomski 
320*02e95f1aSMarcin Radomski int pcm_set_config(struct pcm *pcm, const struct pcm_config *config);
321*02e95f1aSMarcin Radomski 
322*02e95f1aSMarcin Radomski unsigned int pcm_format_to_bits(enum pcm_format format);
323*02e95f1aSMarcin Radomski 
324*02e95f1aSMarcin Radomski unsigned int pcm_get_buffer_size(const struct pcm *pcm);
325*02e95f1aSMarcin Radomski 
326*02e95f1aSMarcin Radomski unsigned int pcm_frames_to_bytes(const struct pcm *pcm, unsigned int frames);
327*02e95f1aSMarcin Radomski 
328*02e95f1aSMarcin Radomski unsigned int pcm_bytes_to_frames(const struct pcm *pcm, unsigned int bytes);
329*02e95f1aSMarcin Radomski 
330*02e95f1aSMarcin Radomski int pcm_get_htimestamp(struct pcm *pcm, unsigned int *avail, struct timespec *tstamp);
331*02e95f1aSMarcin Radomski 
332*02e95f1aSMarcin Radomski unsigned int pcm_get_subdevice(const struct pcm *pcm);
333*02e95f1aSMarcin Radomski 
334*02e95f1aSMarcin Radomski int pcm_writei(struct pcm *pcm, const void *data, unsigned int frame_count) TINYALSA_WARN_UNUSED_RESULT;
335*02e95f1aSMarcin Radomski 
336*02e95f1aSMarcin Radomski int pcm_readi(struct pcm *pcm, void *data, unsigned int frame_count) TINYALSA_WARN_UNUSED_RESULT;
337*02e95f1aSMarcin Radomski 
338*02e95f1aSMarcin Radomski int pcm_write(struct pcm *pcm, const void *data, unsigned int count) TINYALSA_DEPRECATED;
339*02e95f1aSMarcin Radomski 
340*02e95f1aSMarcin Radomski int pcm_read(struct pcm *pcm, void *data, unsigned int count) TINYALSA_DEPRECATED;
341*02e95f1aSMarcin Radomski 
342*02e95f1aSMarcin Radomski int pcm_mmap_write(struct pcm *pcm, const void *data, unsigned int count) TINYALSA_DEPRECATED;
343*02e95f1aSMarcin Radomski 
344*02e95f1aSMarcin Radomski int pcm_mmap_read(struct pcm *pcm, void *data, unsigned int count) TINYALSA_DEPRECATED;
345*02e95f1aSMarcin Radomski 
346*02e95f1aSMarcin Radomski int pcm_mmap_begin(struct pcm *pcm, void **areas, unsigned int *offset, unsigned int *frames);
347*02e95f1aSMarcin Radomski 
348*02e95f1aSMarcin Radomski int pcm_mmap_commit(struct pcm *pcm, unsigned int offset, unsigned int frames);
349*02e95f1aSMarcin Radomski 
350*02e95f1aSMarcin Radomski int pcm_mmap_avail(struct pcm *pcm);
351*02e95f1aSMarcin Radomski 
352*02e95f1aSMarcin Radomski int pcm_mmap_get_hw_ptr(struct pcm* pcm, unsigned int *hw_ptr, struct timespec *tstamp);
353*02e95f1aSMarcin Radomski 
354*02e95f1aSMarcin Radomski int pcm_get_poll_fd(struct pcm *pcm);
355*02e95f1aSMarcin Radomski 
356*02e95f1aSMarcin Radomski int pcm_link(struct pcm *pcm1, struct pcm *pcm2);
357*02e95f1aSMarcin Radomski 
358*02e95f1aSMarcin Radomski int pcm_unlink(struct pcm *pcm);
359*02e95f1aSMarcin Radomski 
360*02e95f1aSMarcin Radomski int pcm_prepare(struct pcm *pcm);
361*02e95f1aSMarcin Radomski 
362*02e95f1aSMarcin Radomski int pcm_start(struct pcm *pcm);
363*02e95f1aSMarcin Radomski 
364*02e95f1aSMarcin Radomski int pcm_drain(struct pcm *pcm);
365*02e95f1aSMarcin Radomski 
366*02e95f1aSMarcin Radomski int pcm_stop(struct pcm *pcm);
367*02e95f1aSMarcin Radomski 
368*02e95f1aSMarcin Radomski int pcm_wait(struct pcm *pcm, int timeout);
369*02e95f1aSMarcin Radomski 
370*02e95f1aSMarcin Radomski long pcm_get_delay(struct pcm *pcm);
371*02e95f1aSMarcin Radomski 
372*02e95f1aSMarcin Radomski int pcm_ioctl(struct pcm *pcm, int code, ...) TINYALSA_DEPRECATED;
373*02e95f1aSMarcin Radomski 
374*02e95f1aSMarcin Radomski #if defined(__cplusplus)
375*02e95f1aSMarcin Radomski }  /* extern "C" */
376*02e95f1aSMarcin Radomski #endif
377*02e95f1aSMarcin Radomski 
378*02e95f1aSMarcin Radomski #endif
379*02e95f1aSMarcin Radomski 
380