Home | History | Annotate | Download | only in alsa
      1 /**
      2  * \file include/pcm.h
      3  * \brief Application interface library for the ALSA driver
      4  * \author Jaroslav Kysela <perex (at) perex.cz>
      5  * \author Abramo Bagnara <abramo (at) alsa-project.org>
      6  * \author Takashi Iwai <tiwai (at) suse.de>
      7  * \date 1998-2001
      8  *
      9  * Application interface library for the ALSA driver.
     10  * See the \ref pcm page for more details.
     11  */
     12 /*
     13  *   This library is free software; you can redistribute it and/or modify
     14  *   it under the terms of the GNU Lesser General Public License as
     15  *   published by the Free Software Foundation; either version 2.1 of
     16  *   the License, or (at your option) any later version.
     17  *
     18  *   This program is distributed in the hope that it will be useful,
     19  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     20  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     21  *   GNU Lesser General Public License for more details.
     22  *
     23  *   You should have received a copy of the GNU Lesser General Public
     24  *   License along with this library; if not, write to the Free Software
     25  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
     26  *
     27  */
     28 
     29 #ifndef __ALSA_PCM_H
     30 #define __ALSA_PCM_H
     31 
     32 #ifdef __cplusplus
     33 extern "C" {
     34 #endif
     35 
     36 /**
     37  *  \defgroup PCM PCM Interface
     38  *  See the \ref pcm page for more details.
     39  *  \{
     40  */
     41 
     42 /** dlsym version for interface entry callback */
     43 #define SND_PCM_DLSYM_VERSION		_dlsym_pcm_001
     44 
     45 /** PCM generic info container */
     46 typedef struct _snd_pcm_info snd_pcm_info_t;
     47 /** PCM hardware configuration space container */
     48 typedef struct _snd_pcm_hw_params snd_pcm_hw_params_t;
     49 /** PCM software configuration container */
     50 typedef struct _snd_pcm_sw_params snd_pcm_sw_params_t;
     51 /** PCM status container */
     52  typedef struct _snd_pcm_status snd_pcm_status_t;
     53 /** PCM access types mask */
     54 typedef struct _snd_pcm_access_mask snd_pcm_access_mask_t;
     55 /** PCM formats mask */
     56 typedef struct _snd_pcm_format_mask snd_pcm_format_mask_t;
     57 /** PCM subformats mask */
     58 typedef struct _snd_pcm_subformat_mask snd_pcm_subformat_mask_t;
     59 
     60 /** PCM class */
     61 typedef enum _snd_pcm_class {
     62 	/** standard device */
     63 
     64 	SND_PCM_CLASS_GENERIC = 0,
     65 	/** multichannel device */
     66 	SND_PCM_CLASS_MULTI,
     67 	/** software modem device */
     68 	SND_PCM_CLASS_MODEM,
     69 	/** digitizer device */
     70 	SND_PCM_CLASS_DIGITIZER,
     71 	SND_PCM_CLASS_LAST = SND_PCM_CLASS_DIGITIZER
     72 } snd_pcm_class_t;
     73 
     74 /** PCM subclass */
     75 typedef enum _snd_pcm_subclass {
     76 	/** subdevices are mixed together */
     77 	SND_PCM_SUBCLASS_GENERIC_MIX = 0,
     78 	/** multichannel subdevices are mixed together */
     79 	SND_PCM_SUBCLASS_MULTI_MIX,
     80 	SND_PCM_SUBCLASS_LAST = SND_PCM_SUBCLASS_MULTI_MIX
     81 } snd_pcm_subclass_t;
     82 
     83 /** PCM stream (direction) */
     84 typedef enum _snd_pcm_stream {
     85 	/** Playback stream */
     86 	SND_PCM_STREAM_PLAYBACK = 0,
     87 	/** Capture stream */
     88 	SND_PCM_STREAM_CAPTURE,
     89 	SND_PCM_STREAM_LAST = SND_PCM_STREAM_CAPTURE
     90 } snd_pcm_stream_t;
     91 
     92 /** PCM access type */
     93 typedef enum _snd_pcm_access {
     94 	/** mmap access with simple interleaved channels */
     95 	SND_PCM_ACCESS_MMAP_INTERLEAVED = 0,
     96 	/** mmap access with simple non interleaved channels */
     97 	SND_PCM_ACCESS_MMAP_NONINTERLEAVED,
     98 	/** mmap access with complex placement */
     99 	SND_PCM_ACCESS_MMAP_COMPLEX,
    100 	/** snd_pcm_readi/snd_pcm_writei access */
    101 	SND_PCM_ACCESS_RW_INTERLEAVED,
    102 	/** snd_pcm_readn/snd_pcm_writen access */
    103 	SND_PCM_ACCESS_RW_NONINTERLEAVED,
    104 	SND_PCM_ACCESS_LAST = SND_PCM_ACCESS_RW_NONINTERLEAVED
    105 } snd_pcm_access_t;
    106 
    107 /** PCM sample format */
    108 typedef enum _snd_pcm_format {
    109 	/** Unknown */
    110 	SND_PCM_FORMAT_UNKNOWN = -1,
    111 	/** Signed 8 bit */
    112 	SND_PCM_FORMAT_S8 = 0,
    113 	/** Unsigned 8 bit */
    114 	SND_PCM_FORMAT_U8,
    115 	/** Signed 16 bit Little Endian */
    116 	SND_PCM_FORMAT_S16_LE,
    117 	/** Signed 16 bit Big Endian */
    118 	SND_PCM_FORMAT_S16_BE,
    119 	/** Unsigned 16 bit Little Endian */
    120 	SND_PCM_FORMAT_U16_LE,
    121 	/** Unsigned 16 bit Big Endian */
    122 	SND_PCM_FORMAT_U16_BE,
    123 	/** Signed 24 bit Little Endian using low three bytes in 32-bit word */
    124 	SND_PCM_FORMAT_S24_LE,
    125 	/** Signed 24 bit Big Endian using low three bytes in 32-bit word */
    126 	SND_PCM_FORMAT_S24_BE,
    127 	/** Unsigned 24 bit Little Endian using low three bytes in 32-bit word */
    128 	SND_PCM_FORMAT_U24_LE,
    129 	/** Unsigned 24 bit Big Endian using low three bytes in 32-bit word */
    130 	SND_PCM_FORMAT_U24_BE,
    131 	/** Signed 32 bit Little Endian */
    132 	SND_PCM_FORMAT_S32_LE,
    133 	/** Signed 32 bit Big Endian */
    134 	SND_PCM_FORMAT_S32_BE,
    135 	/** Unsigned 32 bit Little Endian */
    136 	SND_PCM_FORMAT_U32_LE,
    137 	/** Unsigned 32 bit Big Endian */
    138 	SND_PCM_FORMAT_U32_BE,
    139 	/** Float 32 bit Little Endian, Range -1.0 to 1.0 */
    140 	SND_PCM_FORMAT_FLOAT_LE,
    141 	/** Float 32 bit Big Endian, Range -1.0 to 1.0 */
    142 	SND_PCM_FORMAT_FLOAT_BE,
    143 	/** Float 64 bit Little Endian, Range -1.0 to 1.0 */
    144 	SND_PCM_FORMAT_FLOAT64_LE,
    145 	/** Float 64 bit Big Endian, Range -1.0 to 1.0 */
    146 	SND_PCM_FORMAT_FLOAT64_BE,
    147 	/** IEC-958 Little Endian */
    148 	SND_PCM_FORMAT_IEC958_SUBFRAME_LE,
    149 	/** IEC-958 Big Endian */
    150 	SND_PCM_FORMAT_IEC958_SUBFRAME_BE,
    151 	/** Mu-Law */
    152 	SND_PCM_FORMAT_MU_LAW,
    153 	/** A-Law */
    154 	SND_PCM_FORMAT_A_LAW,
    155 	/** Ima-ADPCM */
    156 	SND_PCM_FORMAT_IMA_ADPCM,
    157 	/** MPEG */
    158 	SND_PCM_FORMAT_MPEG,
    159 	/** GSM */
    160 	SND_PCM_FORMAT_GSM,
    161 	/** Special */
    162 	SND_PCM_FORMAT_SPECIAL = 31,
    163 	/** Signed 24bit Little Endian in 3bytes format */
    164 	SND_PCM_FORMAT_S24_3LE = 32,
    165 	/** Signed 24bit Big Endian in 3bytes format */
    166 	SND_PCM_FORMAT_S24_3BE,
    167 	/** Unsigned 24bit Little Endian in 3bytes format */
    168 	SND_PCM_FORMAT_U24_3LE,
    169 	/** Unsigned 24bit Big Endian in 3bytes format */
    170 	SND_PCM_FORMAT_U24_3BE,
    171 	/** Signed 20bit Little Endian in 3bytes format */
    172 	SND_PCM_FORMAT_S20_3LE,
    173 	/** Signed 20bit Big Endian in 3bytes format */
    174 	SND_PCM_FORMAT_S20_3BE,
    175 	/** Unsigned 20bit Little Endian in 3bytes format */
    176 	SND_PCM_FORMAT_U20_3LE,
    177 	/** Unsigned 20bit Big Endian in 3bytes format */
    178 	SND_PCM_FORMAT_U20_3BE,
    179 	/** Signed 18bit Little Endian in 3bytes format */
    180 	SND_PCM_FORMAT_S18_3LE,
    181 	/** Signed 18bit Big Endian in 3bytes format */
    182 	SND_PCM_FORMAT_S18_3BE,
    183 	/** Unsigned 18bit Little Endian in 3bytes format */
    184 	SND_PCM_FORMAT_U18_3LE,
    185 	/** Unsigned 18bit Big Endian in 3bytes format */
    186 	SND_PCM_FORMAT_U18_3BE,
    187 	SND_PCM_FORMAT_LAST = SND_PCM_FORMAT_U18_3BE,
    188 
    189 #if __BYTE_ORDER == __LITTLE_ENDIAN
    190 	/** Signed 16 bit CPU endian */
    191 	SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_LE,
    192 	/** Unsigned 16 bit CPU endian */
    193 	SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_LE,
    194 	/** Signed 24 bit CPU endian */
    195 	SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_LE,
    196 	/** Unsigned 24 bit CPU endian */
    197 	SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_LE,
    198 	/** Signed 32 bit CPU endian */
    199 	SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_LE,
    200 	/** Unsigned 32 bit CPU endian */
    201 	SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_LE,
    202 	/** Float 32 bit CPU endian */
    203 	SND_PCM_FORMAT_FLOAT = SND_PCM_FORMAT_FLOAT_LE,
    204 	/** Float 64 bit CPU endian */
    205 	SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_LE,
    206 	/** IEC-958 CPU Endian */
    207 	SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_LE
    208 #elif __BYTE_ORDER == __BIG_ENDIAN
    209 	/** Signed 16 bit CPU endian */
    210 	SND_PCM_FORMAT_S16 = SND_PCM_FORMAT_S16_BE,
    211 	/** Unsigned 16 bit CPU endian */
    212 	SND_PCM_FORMAT_U16 = SND_PCM_FORMAT_U16_BE,
    213 	/** Signed 24 bit CPU endian */
    214 	SND_PCM_FORMAT_S24 = SND_PCM_FORMAT_S24_BE,
    215 	/** Unsigned 24 bit CPU endian */
    216 	SND_PCM_FORMAT_U24 = SND_PCM_FORMAT_U24_BE,
    217 	/** Signed 32 bit CPU endian */
    218 	SND_PCM_FORMAT_S32 = SND_PCM_FORMAT_S32_BE,
    219 	/** Unsigned 32 bit CPU endian */
    220 	SND_PCM_FORMAT_U32 = SND_PCM_FORMAT_U32_BE,
    221 	/** Float 32 bit CPU endian */
    222 	SND_PCM_FORMAT_FLOAT = SND_PCM_FORMAT_FLOAT_BE,
    223 	/** Float 64 bit CPU endian */
    224 	SND_PCM_FORMAT_FLOAT64 = SND_PCM_FORMAT_FLOAT64_BE,
    225 	/** IEC-958 CPU Endian */
    226 	SND_PCM_FORMAT_IEC958_SUBFRAME = SND_PCM_FORMAT_IEC958_SUBFRAME_BE
    227 #else
    228 #error "Unknown endian"
    229 #endif
    230 } snd_pcm_format_t;
    231 
    232 /** PCM sample subformat */
    233 typedef enum _snd_pcm_subformat {
    234 	/** Standard */
    235 	SND_PCM_SUBFORMAT_STD = 0,
    236 	SND_PCM_SUBFORMAT_LAST = SND_PCM_SUBFORMAT_STD
    237 } snd_pcm_subformat_t;
    238 
    239 /** PCM state */
    240 typedef enum _snd_pcm_state {
    241 	/** Open */
    242 	SND_PCM_STATE_OPEN = 0,
    243 	/** Setup installed */
    244 	SND_PCM_STATE_SETUP,
    245 	/** Ready to start */
    246 	SND_PCM_STATE_PREPARED,
    247 	/** Running */
    248 	SND_PCM_STATE_RUNNING,
    249 	/** Stopped: underrun (playback) or overrun (capture) detected */
    250 	SND_PCM_STATE_XRUN,
    251 	/** Draining: running (playback) or stopped (capture) */
    252 	SND_PCM_STATE_DRAINING,
    253 	/** Paused */
    254 	SND_PCM_STATE_PAUSED,
    255 	/** Hardware is suspended */
    256 	SND_PCM_STATE_SUSPENDED,
    257 	/** Hardware is disconnected */
    258 	SND_PCM_STATE_DISCONNECTED,
    259 	SND_PCM_STATE_LAST = SND_PCM_STATE_DISCONNECTED
    260 } snd_pcm_state_t;
    261 
    262 /** PCM start mode */
    263 typedef enum _snd_pcm_start {
    264 	/** Automatic start on data read/write */
    265 	SND_PCM_START_DATA = 0,
    266 	/** Explicit start */
    267 	SND_PCM_START_EXPLICIT,
    268 	SND_PCM_START_LAST = SND_PCM_START_EXPLICIT
    269 } snd_pcm_start_t;
    270 
    271 /** PCM xrun mode */
    272 typedef enum _snd_pcm_xrun {
    273 	/** Xrun detection disabled */
    274 	SND_PCM_XRUN_NONE = 0,
    275 	/** Stop on xrun detection */
    276 	SND_PCM_XRUN_STOP,
    277 	SND_PCM_XRUN_LAST = SND_PCM_XRUN_STOP
    278 } snd_pcm_xrun_t;
    279 
    280 /** PCM timestamp mode */
    281 typedef enum _snd_pcm_tstamp {
    282 	/** No timestamp */
    283 	SND_PCM_TSTAMP_NONE = 0,
    284 	/** Update mmap'ed timestamp */
    285 	SND_PCM_TSTAMP_MMAP,
    286 	SND_PCM_TSTAMP_LAST = SND_PCM_TSTAMP_MMAP
    287 } snd_pcm_tstamp_t;
    288 
    289 /** Unsigned frames quantity */
    290 typedef unsigned long snd_pcm_uframes_t;
    291 /** Signed frames quantity */
    292 typedef long snd_pcm_sframes_t;
    293 
    294 /** Non blocking mode (flag for open mode) \hideinitializer */
    295 #define SND_PCM_NONBLOCK		0x0001
    296 /** Async notification (flag for open mode) \hideinitializer */
    297 #define SND_PCM_ASYNC			0x0002
    298 
    299 /** PCM handle */
    300 typedef struct _snd_pcm snd_pcm_t;
    301 
    302 /** PCM type */
    303 enum _snd_pcm_type {
    304 	/** Kernel level PCM */
    305 	SND_PCM_TYPE_HW = 0,
    306 	/** Hooked PCM */
    307 	SND_PCM_TYPE_HOOKS,
    308 	/** One or more linked PCM with exclusive access to selected
    309 	    channels */
    310 	SND_PCM_TYPE_MULTI,
    311 	/** File writing plugin */
    312 	SND_PCM_TYPE_FILE,
    313 	/** Null endpoint PCM */
    314 	SND_PCM_TYPE_NULL,
    315 	/** Shared memory client PCM */
    316 	SND_PCM_TYPE_SHM,
    317 	/** INET client PCM (not yet implemented) */
    318 	SND_PCM_TYPE_INET,
    319 	/** Copying plugin */
    320 	SND_PCM_TYPE_COPY,
    321 	/** Linear format conversion PCM */
    322 	SND_PCM_TYPE_LINEAR,
    323 	/** A-Law format conversion PCM */
    324 	SND_PCM_TYPE_ALAW,
    325 	/** Mu-Law format conversion PCM */
    326 	SND_PCM_TYPE_MULAW,
    327 	/** IMA-ADPCM format conversion PCM */
    328 	SND_PCM_TYPE_ADPCM,
    329 	/** Rate conversion PCM */
    330 	SND_PCM_TYPE_RATE,
    331 	/** Attenuated static route PCM */
    332 	SND_PCM_TYPE_ROUTE,
    333 	/** Format adjusted PCM */
    334 	SND_PCM_TYPE_PLUG,
    335 	/** Sharing PCM */
    336 	SND_PCM_TYPE_SHARE,
    337 	/** Meter plugin */
    338 	SND_PCM_TYPE_METER,
    339 	/** Mixing PCM */
    340 	SND_PCM_TYPE_MIX,
    341 	/** Attenuated dynamic route PCM (not yet implemented) */
    342 	SND_PCM_TYPE_DROUTE,
    343 	/** Loopback server plugin (not yet implemented) */
    344 	SND_PCM_TYPE_LBSERVER,
    345 	/** Linear Integer <-> Linear Float format conversion PCM */
    346 	SND_PCM_TYPE_LINEAR_FLOAT,
    347 	/** LADSPA integration plugin */
    348 	SND_PCM_TYPE_LADSPA,
    349 	/** Direct Mixing plugin */
    350 	SND_PCM_TYPE_DMIX,
    351 	/** Jack Audio Connection Kit plugin */
    352 	SND_PCM_TYPE_JACK,
    353 	/** Direct Snooping plugin */
    354 	SND_PCM_TYPE_DSNOOP,
    355 	/** Direct Sharing plugin */
    356 	SND_PCM_TYPE_DSHARE,
    357 	/** IEC958 subframe plugin */
    358 	SND_PCM_TYPE_IEC958,
    359 	/** Soft volume plugin */
    360 	SND_PCM_TYPE_SOFTVOL,
    361 	/** External I/O plugin */
    362 	SND_PCM_TYPE_IOPLUG,
    363 	/** External filter plugin */
    364 	SND_PCM_TYPE_EXTPLUG,
    365 	/** Mmap-emulation plugin */
    366 	SND_PCM_TYPE_MMAP_EMUL,
    367 	SND_PCM_TYPE_LAST = SND_PCM_TYPE_MMAP_EMUL
    368 };
    369 
    370 /** PCM type */
    371 typedef enum _snd_pcm_type snd_pcm_type_t;
    372 
    373 /** PCM area specification */
    374 typedef struct _snd_pcm_channel_area {
    375 	/** base address of channel samples */
    376 	void *addr;
    377 	/** offset to first sample in bits */
    378 	unsigned int first;
    379 	/** samples distance in bits */
    380 	unsigned int step;
    381 } snd_pcm_channel_area_t;
    382 
    383 /** PCM synchronization ID */
    384 typedef union _snd_pcm_sync_id {
    385 	/** 8-bit ID */
    386 	unsigned char id[16];
    387 	/** 16-bit ID */
    388 	unsigned short id16[8];
    389 	/** 32-bit ID */
    390 	unsigned int id32[4];
    391 } snd_pcm_sync_id_t;
    392 
    393 /** #SND_PCM_TYPE_METER scope handle */
    394 typedef struct _snd_pcm_scope snd_pcm_scope_t;
    395 
    396 int snd_pcm_open(snd_pcm_t **pcm, const char *name,
    397 		 snd_pcm_stream_t stream, int mode);
    398 int snd_pcm_open_lconf(snd_pcm_t **pcm, const char *name,
    399 		       snd_pcm_stream_t stream, int mode,
    400 		       snd_config_t *lconf);
    401 
    402 int snd_pcm_close(snd_pcm_t *pcm);
    403 const char *snd_pcm_name(snd_pcm_t *pcm);
    404 snd_pcm_type_t snd_pcm_type(snd_pcm_t *pcm);
    405 snd_pcm_stream_t snd_pcm_stream(snd_pcm_t *pcm);
    406 int snd_pcm_poll_descriptors_count(snd_pcm_t *pcm);
    407 int snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space);
    408 int snd_pcm_poll_descriptors_revents(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);
    409 int snd_pcm_nonblock(snd_pcm_t *pcm, int nonblock);
    410 int snd_async_add_pcm_handler(snd_async_handler_t **handler, snd_pcm_t *pcm,
    411 			      snd_async_callback_t callback, void *private_data);
    412 snd_pcm_t *snd_async_handler_get_pcm(snd_async_handler_t *handler);
    413 int snd_pcm_info(snd_pcm_t *pcm, snd_pcm_info_t *info);
    414 int snd_pcm_hw_params_current(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
    415 int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
    416 int snd_pcm_hw_free(snd_pcm_t *pcm);
    417 int snd_pcm_sw_params_current(snd_pcm_t *pcm, snd_pcm_sw_params_t *params);
    418 int snd_pcm_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params);
    419 int snd_pcm_prepare(snd_pcm_t *pcm);
    420 int snd_pcm_reset(snd_pcm_t *pcm);
    421 int snd_pcm_status(snd_pcm_t *pcm, snd_pcm_status_t *status);
    422 int snd_pcm_start(snd_pcm_t *pcm);
    423 int snd_pcm_drop(snd_pcm_t *pcm);
    424 int snd_pcm_drain(snd_pcm_t *pcm);
    425 int snd_pcm_pause(snd_pcm_t *pcm, int enable);
    426 snd_pcm_state_t snd_pcm_state(snd_pcm_t *pcm);
    427 int snd_pcm_hwsync(snd_pcm_t *pcm);
    428 int snd_pcm_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp);
    429 int snd_pcm_resume(snd_pcm_t *pcm);
    430 snd_pcm_sframes_t snd_pcm_avail_update(snd_pcm_t *pcm);
    431 snd_pcm_sframes_t snd_pcm_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
    432 snd_pcm_sframes_t snd_pcm_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames);
    433 snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);
    434 snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size);
    435 snd_pcm_sframes_t snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size);
    436 snd_pcm_sframes_t snd_pcm_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size);
    437 int snd_pcm_wait(snd_pcm_t *pcm, int timeout);
    438 
    439 int snd_pcm_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2);
    440 int snd_pcm_unlink(snd_pcm_t *pcm);
    441 
    442 /*
    443  * application helpers - these functions are implemented on top
    444  * of the basic API
    445  */
    446 
    447 int snd_pcm_recover(snd_pcm_t *pcm, int err, int silent);
    448 int snd_pcm_set_params(snd_pcm_t *pcm,
    449                        snd_pcm_format_t format,
    450                        snd_pcm_access_t access,
    451                        unsigned int channels,
    452                        unsigned int rate,
    453                        int soft_resample,
    454                        unsigned int latency);
    455 int snd_pcm_get_params(snd_pcm_t *pcm,
    456                        snd_pcm_uframes_t *buffer_size,
    457                        snd_pcm_uframes_t *period_size);
    458 
    459 /** \} */
    460 
    461 /**
    462  * \defgroup PCM_Info Stream Information
    463  * \ingroup PCM
    464  * See the \ref pcm page for more details.
    465  * \{
    466  */
    467 
    468 size_t snd_pcm_info_sizeof(void);
    469 /** \hideinitializer
    470  * \brief allocate an invalid #snd_pcm_info_t using standard alloca
    471  * \param ptr returned pointer
    472  */
    473 #define snd_pcm_info_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_info_t *) alloca(snd_pcm_info_sizeof()); memset(*ptr, 0, snd_pcm_info_sizeof()); } while (0)
    474 int snd_pcm_info_malloc(snd_pcm_info_t **ptr);
    475 void snd_pcm_info_free(snd_pcm_info_t *obj);
    476 void snd_pcm_info_copy(snd_pcm_info_t *dst, const snd_pcm_info_t *src);
    477 unsigned int snd_pcm_info_get_device(const snd_pcm_info_t *obj);
    478 unsigned int snd_pcm_info_get_subdevice(const snd_pcm_info_t *obj);
    479 snd_pcm_stream_t snd_pcm_info_get_stream(const snd_pcm_info_t *obj);
    480 int snd_pcm_info_get_card(const snd_pcm_info_t *obj);
    481 const char *snd_pcm_info_get_id(const snd_pcm_info_t *obj);
    482 const char *snd_pcm_info_get_name(const snd_pcm_info_t *obj);
    483 const char *snd_pcm_info_get_subdevice_name(const snd_pcm_info_t *obj);
    484 snd_pcm_class_t snd_pcm_info_get_class(const snd_pcm_info_t *obj);
    485 snd_pcm_subclass_t snd_pcm_info_get_subclass(const snd_pcm_info_t *obj);
    486 unsigned int snd_pcm_info_get_subdevices_count(const snd_pcm_info_t *obj);
    487 unsigned int snd_pcm_info_get_subdevices_avail(const snd_pcm_info_t *obj);
    488 snd_pcm_sync_id_t snd_pcm_info_get_sync(const snd_pcm_info_t *obj);
    489 void snd_pcm_info_set_device(snd_pcm_info_t *obj, unsigned int val);
    490 void snd_pcm_info_set_subdevice(snd_pcm_info_t *obj, unsigned int val);
    491 void snd_pcm_info_set_stream(snd_pcm_info_t *obj, snd_pcm_stream_t val);
    492 
    493 /** \} */
    494 
    495 /**
    496  * \defgroup PCM_HW_Params Hardware Parameters
    497  * \ingroup PCM
    498  * See the \ref pcm page for more details.
    499  * \{
    500  */
    501 
    502 int snd_pcm_hw_params_any(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
    503 
    504 int snd_pcm_hw_params_can_mmap_sample_resolution(const snd_pcm_hw_params_t *params);
    505 int snd_pcm_hw_params_is_double(const snd_pcm_hw_params_t *params);
    506 int snd_pcm_hw_params_is_batch(const snd_pcm_hw_params_t *params);
    507 int snd_pcm_hw_params_is_block_transfer(const snd_pcm_hw_params_t *params);
    508 int snd_pcm_hw_params_can_overrange(const snd_pcm_hw_params_t *params);
    509 int snd_pcm_hw_params_can_pause(const snd_pcm_hw_params_t *params);
    510 int snd_pcm_hw_params_can_resume(const snd_pcm_hw_params_t *params);
    511 int snd_pcm_hw_params_is_half_duplex(const snd_pcm_hw_params_t *params);
    512 int snd_pcm_hw_params_is_joint_duplex(const snd_pcm_hw_params_t *params);
    513 int snd_pcm_hw_params_can_sync_start(const snd_pcm_hw_params_t *params);
    514 int snd_pcm_hw_params_get_rate_numden(const snd_pcm_hw_params_t *params,
    515 				      unsigned int *rate_num,
    516 				      unsigned int *rate_den);
    517 int snd_pcm_hw_params_get_sbits(const snd_pcm_hw_params_t *params);
    518 int snd_pcm_hw_params_get_fifo_size(const snd_pcm_hw_params_t *params);
    519 
    520 #if 0
    521 typedef struct _snd_pcm_hw_strategy snd_pcm_hw_strategy_t;
    522 
    523 /* choices need to be sorted on ascending badness */
    524 typedef struct _snd_pcm_hw_strategy_simple_choices_list {
    525 	unsigned int value;
    526 	unsigned int badness;
    527 } snd_pcm_hw_strategy_simple_choices_list_t;
    528 
    529 int snd_pcm_hw_params_strategy(snd_pcm_t *pcm, snd_pcm_hw_params_t *params,
    530 			       const snd_pcm_hw_strategy_t *strategy,
    531 			       unsigned int badness_min,
    532 			       unsigned int badness_max);
    533 
    534 void snd_pcm_hw_strategy_free(snd_pcm_hw_strategy_t *strategy);
    535 int snd_pcm_hw_strategy_simple(snd_pcm_hw_strategy_t **strategyp,
    536 			       unsigned int badness_min,
    537 			       unsigned int badness_max);
    538 int snd_pcm_hw_params_try_explain_failure(snd_pcm_t *pcm,
    539 					  snd_pcm_hw_params_t *fail,
    540 					  snd_pcm_hw_params_t *success,
    541 					  unsigned int depth,
    542 					  snd_output_t *out);
    543 
    544 #endif
    545 
    546 size_t snd_pcm_hw_params_sizeof(void);
    547 /** \hideinitializer
    548  * \brief allocate an invalid #snd_pcm_hw_params_t using standard alloca
    549  * \param ptr returned pointer
    550  */
    551 #define snd_pcm_hw_params_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_hw_params_t *) alloca(snd_pcm_hw_params_sizeof()); memset(*ptr, 0, snd_pcm_hw_params_sizeof()); } while (0)
    552 int snd_pcm_hw_params_malloc(snd_pcm_hw_params_t **ptr);
    553 void snd_pcm_hw_params_free(snd_pcm_hw_params_t *obj);
    554 void snd_pcm_hw_params_copy(snd_pcm_hw_params_t *dst, const snd_pcm_hw_params_t *src);
    555 
    556 #if !defined(ALSA_LIBRARY_BUILD) && !defined(ALSA_PCM_OLD_HW_PARAMS_API)
    557 
    558 int snd_pcm_hw_params_get_access(const snd_pcm_hw_params_t *params, snd_pcm_access_t *_access);
    559 int snd_pcm_hw_params_test_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access);
    560 int snd_pcm_hw_params_set_access(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t _access);
    561 int snd_pcm_hw_params_set_access_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *_access);
    562 int snd_pcm_hw_params_set_access_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_t *_access);
    563 int snd_pcm_hw_params_set_access_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_access_mask_t *mask);
    564 int snd_pcm_hw_params_get_access_mask(snd_pcm_hw_params_t *params, snd_pcm_access_mask_t *mask);
    565 
    566 int snd_pcm_hw_params_get_format(const snd_pcm_hw_params_t *params, snd_pcm_format_t *val);
    567 int snd_pcm_hw_params_test_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val);
    568 int snd_pcm_hw_params_set_format(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t val);
    569 int snd_pcm_hw_params_set_format_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format);
    570 int snd_pcm_hw_params_set_format_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_t *format);
    571 int snd_pcm_hw_params_set_format_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_format_mask_t *mask);
    572 void snd_pcm_hw_params_get_format_mask(snd_pcm_hw_params_t *params, snd_pcm_format_mask_t *mask);
    573 
    574 int snd_pcm_hw_params_get_subformat(const snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat);
    575 int snd_pcm_hw_params_test_subformat(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t subformat);
    576 int snd_pcm_hw_params_set_subformat(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t subformat);
    577 int snd_pcm_hw_params_set_subformat_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat);
    578 int snd_pcm_hw_params_set_subformat_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_t *subformat);
    579 int snd_pcm_hw_params_set_subformat_mask(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_subformat_mask_t *mask);
    580 void snd_pcm_hw_params_get_subformat_mask(snd_pcm_hw_params_t *params, snd_pcm_subformat_mask_t *mask);
    581 
    582 int snd_pcm_hw_params_get_channels(const snd_pcm_hw_params_t *params, unsigned int *val);
    583 int snd_pcm_hw_params_get_channels_min(const snd_pcm_hw_params_t *params, unsigned int *val);
    584 int snd_pcm_hw_params_get_channels_max(const snd_pcm_hw_params_t *params, unsigned int *val);
    585 int snd_pcm_hw_params_test_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
    586 int snd_pcm_hw_params_set_channels(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
    587 int snd_pcm_hw_params_set_channels_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    588 int snd_pcm_hw_params_set_channels_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    589 int snd_pcm_hw_params_set_channels_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, unsigned int *max);
    590 int snd_pcm_hw_params_set_channels_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    591 int snd_pcm_hw_params_set_channels_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    592 int snd_pcm_hw_params_set_channels_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    593 
    594 int snd_pcm_hw_params_get_rate(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    595 int snd_pcm_hw_params_get_rate_min(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    596 int snd_pcm_hw_params_get_rate_max(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    597 int snd_pcm_hw_params_test_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    598 int snd_pcm_hw_params_set_rate(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    599 int snd_pcm_hw_params_set_rate_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    600 int snd_pcm_hw_params_set_rate_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    601 int snd_pcm_hw_params_set_rate_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir);
    602 int snd_pcm_hw_params_set_rate_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    603 int snd_pcm_hw_params_set_rate_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    604 int snd_pcm_hw_params_set_rate_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    605 int snd_pcm_hw_params_set_rate_resample(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
    606 int snd_pcm_hw_params_get_rate_resample(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    607 int snd_pcm_hw_params_set_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val);
    608 int snd_pcm_hw_params_get_export_buffer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val);
    609 
    610 int snd_pcm_hw_params_get_period_time(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    611 int snd_pcm_hw_params_get_period_time_min(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    612 int snd_pcm_hw_params_get_period_time_max(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    613 int snd_pcm_hw_params_test_period_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    614 int snd_pcm_hw_params_set_period_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    615 int snd_pcm_hw_params_set_period_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    616 int snd_pcm_hw_params_set_period_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    617 int snd_pcm_hw_params_set_period_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir);
    618 int snd_pcm_hw_params_set_period_time_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    619 int snd_pcm_hw_params_set_period_time_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    620 int snd_pcm_hw_params_set_period_time_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    621 
    622 int snd_pcm_hw_params_get_period_size(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir);
    623 int snd_pcm_hw_params_get_period_size_min(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir);
    624 int snd_pcm_hw_params_get_period_size_max(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *frames, int *dir);
    625 int snd_pcm_hw_params_test_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir);
    626 int snd_pcm_hw_params_set_period_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val, int dir);
    627 int snd_pcm_hw_params_set_period_size_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir);
    628 int snd_pcm_hw_params_set_period_size_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir);
    629 int snd_pcm_hw_params_set_period_size_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *min, int *mindir, snd_pcm_uframes_t *max, int *maxdir);
    630 int snd_pcm_hw_params_set_period_size_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir);
    631 int snd_pcm_hw_params_set_period_size_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir);
    632 int snd_pcm_hw_params_set_period_size_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val, int *dir);
    633 int snd_pcm_hw_params_set_period_size_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
    634 
    635 int snd_pcm_hw_params_get_periods(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    636 int snd_pcm_hw_params_get_periods_min(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    637 int snd_pcm_hw_params_get_periods_max(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    638 int snd_pcm_hw_params_test_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    639 int snd_pcm_hw_params_set_periods(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    640 int snd_pcm_hw_params_set_periods_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    641 int snd_pcm_hw_params_set_periods_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    642 int snd_pcm_hw_params_set_periods_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir);
    643 int snd_pcm_hw_params_set_periods_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    644 int snd_pcm_hw_params_set_periods_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    645 int snd_pcm_hw_params_set_periods_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    646 int snd_pcm_hw_params_set_periods_integer(snd_pcm_t *pcm, snd_pcm_hw_params_t *params);
    647 
    648 int snd_pcm_hw_params_get_buffer_time(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    649 int snd_pcm_hw_params_get_buffer_time_min(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    650 int snd_pcm_hw_params_get_buffer_time_max(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    651 int snd_pcm_hw_params_test_buffer_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    652 int snd_pcm_hw_params_set_buffer_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    653 int snd_pcm_hw_params_set_buffer_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    654 int snd_pcm_hw_params_set_buffer_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    655 int snd_pcm_hw_params_set_buffer_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir);
    656 int snd_pcm_hw_params_set_buffer_time_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    657 int snd_pcm_hw_params_set_buffer_time_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    658 int snd_pcm_hw_params_set_buffer_time_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    659 
    660 int snd_pcm_hw_params_get_buffer_size(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    661 int snd_pcm_hw_params_get_buffer_size_min(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    662 int snd_pcm_hw_params_get_buffer_size_max(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    663 int snd_pcm_hw_params_test_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val);
    664 int snd_pcm_hw_params_set_buffer_size(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t val);
    665 int snd_pcm_hw_params_set_buffer_size_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    666 int snd_pcm_hw_params_set_buffer_size_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    667 int snd_pcm_hw_params_set_buffer_size_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *min, snd_pcm_uframes_t *max);
    668 int snd_pcm_hw_params_set_buffer_size_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    669 int snd_pcm_hw_params_set_buffer_size_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    670 int snd_pcm_hw_params_set_buffer_size_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    671 
    672 int snd_pcm_hw_params_get_tick_time(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    673 int snd_pcm_hw_params_get_tick_time_min(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    674 int snd_pcm_hw_params_get_tick_time_max(const snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    675 int snd_pcm_hw_params_test_tick_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    676 int snd_pcm_hw_params_set_tick_time(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int val, int dir);
    677 int snd_pcm_hw_params_set_tick_time_min(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    678 int snd_pcm_hw_params_set_tick_time_max(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    679 int snd_pcm_hw_params_set_tick_time_minmax(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *min, int *mindir, unsigned int *max, int *maxdir);
    680 int snd_pcm_hw_params_set_tick_time_near(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    681 int snd_pcm_hw_params_set_tick_time_first(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    682 int snd_pcm_hw_params_set_tick_time_last(snd_pcm_t *pcm, snd_pcm_hw_params_t *params, unsigned int *val, int *dir);
    683 
    684 #endif /* !ALSA_LIBRARY_BUILD && !ALSA_PCM_OLD_HW_PARAMS_API */
    685 
    686 int snd_pcm_hw_params_get_min_align(const snd_pcm_hw_params_t *params, snd_pcm_uframes_t *val);
    687 
    688 /** \} */
    689 
    690 /**
    691  * \defgroup PCM_SW_Params Software Parameters
    692  * \ingroup PCM
    693  * See the \ref pcm page for more details.
    694  * \{
    695  */
    696 
    697 size_t snd_pcm_sw_params_sizeof(void);
    698 /** \hideinitializer
    699  * \brief allocate an invalid #snd_pcm_sw_params_t using standard alloca
    700  * \param ptr returned pointer
    701  */
    702 #define snd_pcm_sw_params_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_sw_params_t *) alloca(snd_pcm_sw_params_sizeof()); memset(*ptr, 0, snd_pcm_sw_params_sizeof()); } while (0)
    703 int snd_pcm_sw_params_malloc(snd_pcm_sw_params_t **ptr);
    704 void snd_pcm_sw_params_free(snd_pcm_sw_params_t *obj);
    705 void snd_pcm_sw_params_copy(snd_pcm_sw_params_t *dst, const snd_pcm_sw_params_t *src);
    706 int snd_pcm_sw_params_get_boundary(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val);
    707 
    708 #if !defined(ALSA_LIBRARY_BUILD) && !defined(ALSA_PCM_OLD_SW_PARAMS_API)
    709 
    710 int snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_tstamp_t val);
    711 int snd_pcm_sw_params_get_tstamp_mode(const snd_pcm_sw_params_t *params, snd_pcm_tstamp_t *val);
    712 int snd_pcm_sw_params_set_sleep_min(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, unsigned int val);
    713 int snd_pcm_sw_params_get_sleep_min(const snd_pcm_sw_params_t *params, unsigned int *val);
    714 int snd_pcm_sw_params_set_avail_min(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val);
    715 int snd_pcm_sw_params_get_avail_min(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val);
    716 int snd_pcm_sw_params_set_xfer_align(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val);
    717 int snd_pcm_sw_params_get_xfer_align(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val);
    718 int snd_pcm_sw_params_set_start_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val);
    719 int snd_pcm_sw_params_get_start_threshold(const snd_pcm_sw_params_t *paramsm, snd_pcm_uframes_t *val);
    720 int snd_pcm_sw_params_set_stop_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val);
    721 int snd_pcm_sw_params_get_stop_threshold(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val);
    722 int snd_pcm_sw_params_set_silence_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val);
    723 int snd_pcm_sw_params_get_silence_threshold(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val);
    724 int snd_pcm_sw_params_set_silence_size(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_uframes_t val);
    725 int snd_pcm_sw_params_get_silence_size(const snd_pcm_sw_params_t *params, snd_pcm_uframes_t *val);
    726 
    727 #endif /* !ALSA_LIBRARY_BUILD && !ALSA_PCM_OLD_SW_PARAMS_API */
    728 
    729 /** \} */
    730 
    731 /* include old API */
    732 #ifndef ALSA_LIBRARY_BUILD
    733 #if defined(ALSA_PCM_OLD_HW_PARAMS_API) || defined(ALSA_PCM_OLD_SW_PARAMS_API)
    734 #include "pcm_old.h"
    735 #endif
    736 #endif
    737 
    738 /**
    739  * \defgroup PCM_Access Access Mask Functions
    740  * \ingroup PCM
    741  * See the \ref pcm page for more details.
    742  * \{
    743  */
    744 
    745 size_t snd_pcm_access_mask_sizeof(void);
    746 /** \hideinitializer
    747  * \brief allocate an empty #snd_pcm_access_mask_t using standard alloca
    748  * \param ptr returned pointer
    749  */
    750 #define snd_pcm_access_mask_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_access_mask_t *) alloca(snd_pcm_access_mask_sizeof()); memset(*ptr, 0, snd_pcm_access_mask_sizeof()); } while (0)
    751 int snd_pcm_access_mask_malloc(snd_pcm_access_mask_t **ptr);
    752 void snd_pcm_access_mask_free(snd_pcm_access_mask_t *obj);
    753 void snd_pcm_access_mask_copy(snd_pcm_access_mask_t *dst, const snd_pcm_access_mask_t *src);
    754 void snd_pcm_access_mask_none(snd_pcm_access_mask_t *mask);
    755 void snd_pcm_access_mask_any(snd_pcm_access_mask_t *mask);
    756 int snd_pcm_access_mask_test(const snd_pcm_access_mask_t *mask, snd_pcm_access_t val);
    757 int snd_pcm_access_mask_empty(const snd_pcm_access_mask_t *mask);
    758 void snd_pcm_access_mask_set(snd_pcm_access_mask_t *mask, snd_pcm_access_t val);
    759 void snd_pcm_access_mask_reset(snd_pcm_access_mask_t *mask, snd_pcm_access_t val);
    760 
    761 /** \} */
    762 
    763 /**
    764  * \defgroup PCM_Format Format Mask Functions
    765  * \ingroup PCM
    766  * See the \ref pcm page for more details.
    767  * \{
    768  */
    769 
    770 size_t snd_pcm_format_mask_sizeof(void);
    771 /** \hideinitializer
    772  * \brief allocate an empty #snd_pcm_format_mask_t using standard alloca
    773  * \param ptr returned pointer
    774  */
    775 #define snd_pcm_format_mask_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_format_mask_t *) alloca(snd_pcm_format_mask_sizeof()); memset(*ptr, 0, snd_pcm_format_mask_sizeof()); } while (0)
    776 int snd_pcm_format_mask_malloc(snd_pcm_format_mask_t **ptr);
    777 void snd_pcm_format_mask_free(snd_pcm_format_mask_t *obj);
    778 void snd_pcm_format_mask_copy(snd_pcm_format_mask_t *dst, const snd_pcm_format_mask_t *src);
    779 void snd_pcm_format_mask_none(snd_pcm_format_mask_t *mask);
    780 void snd_pcm_format_mask_any(snd_pcm_format_mask_t *mask);
    781 int snd_pcm_format_mask_test(const snd_pcm_format_mask_t *mask, snd_pcm_format_t val);
    782 int snd_pcm_format_mask_empty(const snd_pcm_format_mask_t *mask);
    783 void snd_pcm_format_mask_set(snd_pcm_format_mask_t *mask, snd_pcm_format_t val);
    784 void snd_pcm_format_mask_reset(snd_pcm_format_mask_t *mask, snd_pcm_format_t val);
    785 
    786 /** \} */
    787 
    788 /**
    789  * \defgroup PCM_SubFormat Subformat Mask Functions
    790  * \ingroup PCM
    791  * See the \ref pcm page for more details.
    792  * \{
    793  */
    794 
    795 size_t snd_pcm_subformat_mask_sizeof(void);
    796 /** \hideinitializer
    797  * \brief allocate an empty #snd_pcm_subformat_mask_t using standard alloca
    798  * \param ptr returned pointer
    799  */
    800 #define snd_pcm_subformat_mask_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_subformat_mask_t *) alloca(snd_pcm_subformat_mask_sizeof()); memset(*ptr, 0, snd_pcm_subformat_mask_sizeof()); } while (0)
    801 int snd_pcm_subformat_mask_malloc(snd_pcm_subformat_mask_t **ptr);
    802 void snd_pcm_subformat_mask_free(snd_pcm_subformat_mask_t *obj);
    803 void snd_pcm_subformat_mask_copy(snd_pcm_subformat_mask_t *dst, const snd_pcm_subformat_mask_t *src);
    804 void snd_pcm_subformat_mask_none(snd_pcm_subformat_mask_t *mask);
    805 void snd_pcm_subformat_mask_any(snd_pcm_subformat_mask_t *mask);
    806 int snd_pcm_subformat_mask_test(const snd_pcm_subformat_mask_t *mask, snd_pcm_subformat_t val);
    807 int snd_pcm_subformat_mask_empty(const snd_pcm_subformat_mask_t *mask);
    808 void snd_pcm_subformat_mask_set(snd_pcm_subformat_mask_t *mask, snd_pcm_subformat_t val);
    809 void snd_pcm_subformat_mask_reset(snd_pcm_subformat_mask_t *mask, snd_pcm_subformat_t val);
    810 
    811 /** \} */
    812 
    813 /**
    814  * \defgroup PCM_Status Status Functions
    815  * \ingroup PCM
    816  * See the \ref pcm page for more details.
    817  * \{
    818  */
    819 
    820 size_t snd_pcm_status_sizeof(void);
    821 /** \hideinitializer
    822  * \brief allocate an invalid #snd_pcm_status_t using standard alloca
    823  * \param ptr returned pointer
    824  */
    825 #define snd_pcm_status_alloca(ptr) do { assert(ptr); *ptr = (snd_pcm_status_t *) alloca(snd_pcm_status_sizeof()); memset(*ptr, 0, snd_pcm_status_sizeof()); } while (0)
    826 int snd_pcm_status_malloc(snd_pcm_status_t **ptr);
    827 void snd_pcm_status_free(snd_pcm_status_t *obj);
    828 void snd_pcm_status_copy(snd_pcm_status_t *dst, const snd_pcm_status_t *src);
    829 snd_pcm_state_t snd_pcm_status_get_state(const snd_pcm_status_t *obj);
    830 void snd_pcm_status_get_trigger_tstamp(const snd_pcm_status_t *obj, snd_timestamp_t *ptr);
    831 void snd_pcm_status_get_trigger_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
    832 void snd_pcm_status_get_tstamp(const snd_pcm_status_t *obj, snd_timestamp_t *ptr);
    833 void snd_pcm_status_get_htstamp(const snd_pcm_status_t *obj, snd_htimestamp_t *ptr);
    834 snd_pcm_sframes_t snd_pcm_status_get_delay(const snd_pcm_status_t *obj);
    835 snd_pcm_uframes_t snd_pcm_status_get_avail(const snd_pcm_status_t *obj);
    836 snd_pcm_uframes_t snd_pcm_status_get_avail_max(const snd_pcm_status_t *obj);
    837 snd_pcm_uframes_t snd_pcm_status_get_overrange(const snd_pcm_status_t *obj);
    838 
    839 /** \} */
    840 
    841 /**
    842  * \defgroup PCM_Description Description Functions
    843  * \ingroup PCM
    844  * See the \ref pcm page for more details.
    845  * \{
    846  */
    847 
    848 const char *snd_pcm_type_name(snd_pcm_type_t type);
    849 const char *snd_pcm_stream_name(const snd_pcm_stream_t stream);
    850 const char *snd_pcm_access_name(const snd_pcm_access_t _access);
    851 const char *snd_pcm_format_name(const snd_pcm_format_t format);
    852 const char *snd_pcm_format_description(const snd_pcm_format_t format);
    853 const char *snd_pcm_subformat_name(const snd_pcm_subformat_t subformat);
    854 const char *snd_pcm_subformat_description(const snd_pcm_subformat_t subformat);
    855 snd_pcm_format_t snd_pcm_format_value(const char* name);
    856 const char *snd_pcm_tstamp_mode_name(const snd_pcm_tstamp_t mode);
    857 const char *snd_pcm_state_name(const snd_pcm_state_t state);
    858 
    859 /** \} */
    860 
    861 /**
    862  * \defgroup PCM_Dump Debug Functions
    863  * \ingroup PCM
    864  * See the \ref pcm page for more details.
    865  * \{
    866  */
    867 
    868 int snd_pcm_dump(snd_pcm_t *pcm, snd_output_t *out);
    869 int snd_pcm_dump_hw_setup(snd_pcm_t *pcm, snd_output_t *out);
    870 int snd_pcm_dump_sw_setup(snd_pcm_t *pcm, snd_output_t *out);
    871 int snd_pcm_dump_setup(snd_pcm_t *pcm, snd_output_t *out);
    872 int snd_pcm_hw_params_dump(snd_pcm_hw_params_t *params, snd_output_t *out);
    873 int snd_pcm_sw_params_dump(snd_pcm_sw_params_t *params, snd_output_t *out);
    874 int snd_pcm_status_dump(snd_pcm_status_t *status, snd_output_t *out);
    875 
    876 /** \} */
    877 
    878 /**
    879  * \defgroup PCM_Direct Direct Access (MMAP) Functions
    880  * \ingroup PCM
    881  * See the \ref pcm page for more details.
    882  * \{
    883  */
    884 
    885 int snd_pcm_mmap_begin(snd_pcm_t *pcm,
    886 		       const snd_pcm_channel_area_t **areas,
    887 		       snd_pcm_uframes_t *offset,
    888 		       snd_pcm_uframes_t *frames);
    889 snd_pcm_sframes_t snd_pcm_mmap_commit(snd_pcm_t *pcm,
    890 				      snd_pcm_uframes_t offset,
    891 				      snd_pcm_uframes_t frames);
    892 snd_pcm_sframes_t snd_pcm_mmap_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_uframes_t size);
    893 snd_pcm_sframes_t snd_pcm_mmap_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t size);
    894 snd_pcm_sframes_t snd_pcm_mmap_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size);
    895 snd_pcm_sframes_t snd_pcm_mmap_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t size);
    896 
    897 /** \} */
    898 
    899 /**
    900  * \defgroup PCM_Helpers Helper Functions
    901  * \ingroup PCM
    902  * See the \ref pcm page for more details.
    903  * \{
    904  */
    905 
    906 int snd_pcm_format_signed(snd_pcm_format_t format);
    907 int snd_pcm_format_unsigned(snd_pcm_format_t format);
    908 int snd_pcm_format_linear(snd_pcm_format_t format);
    909 int snd_pcm_format_float(snd_pcm_format_t format);
    910 int snd_pcm_format_little_endian(snd_pcm_format_t format);
    911 int snd_pcm_format_big_endian(snd_pcm_format_t format);
    912 int snd_pcm_format_cpu_endian(snd_pcm_format_t format);
    913 int snd_pcm_format_width(snd_pcm_format_t format);			/* in bits */
    914 int snd_pcm_format_physical_width(snd_pcm_format_t format);		/* in bits */
    915 snd_pcm_format_t snd_pcm_build_linear_format(int width, int pwidth, int unsignd, int big_endian);
    916 ssize_t snd_pcm_format_size(snd_pcm_format_t format, size_t samples);
    917 u_int8_t snd_pcm_format_silence(snd_pcm_format_t format);
    918 u_int16_t snd_pcm_format_silence_16(snd_pcm_format_t format);
    919 u_int32_t snd_pcm_format_silence_32(snd_pcm_format_t format);
    920 u_int64_t snd_pcm_format_silence_64(snd_pcm_format_t format);
    921 int snd_pcm_format_set_silence(snd_pcm_format_t format, void *buf, unsigned int samples);
    922 
    923 snd_pcm_sframes_t snd_pcm_bytes_to_frames(snd_pcm_t *pcm, ssize_t bytes);
    924 ssize_t snd_pcm_frames_to_bytes(snd_pcm_t *pcm, snd_pcm_sframes_t frames);
    925 long snd_pcm_bytes_to_samples(snd_pcm_t *pcm, ssize_t bytes);
    926 ssize_t snd_pcm_samples_to_bytes(snd_pcm_t *pcm, long samples);
    927 
    928 int snd_pcm_area_silence(const snd_pcm_channel_area_t *dst_channel, snd_pcm_uframes_t dst_offset,
    929 			 unsigned int samples, snd_pcm_format_t format);
    930 int snd_pcm_areas_silence(const snd_pcm_channel_area_t *dst_channels, snd_pcm_uframes_t dst_offset,
    931 			  unsigned int channels, snd_pcm_uframes_t frames, snd_pcm_format_t format);
    932 int snd_pcm_area_copy(const snd_pcm_channel_area_t *dst_channel, snd_pcm_uframes_t dst_offset,
    933 		      const snd_pcm_channel_area_t *src_channel, snd_pcm_uframes_t src_offset,
    934 		      unsigned int samples, snd_pcm_format_t format);
    935 int snd_pcm_areas_copy(const snd_pcm_channel_area_t *dst_channels, snd_pcm_uframes_t dst_offset,
    936 		       const snd_pcm_channel_area_t *src_channels, snd_pcm_uframes_t src_offset,
    937 		       unsigned int channels, snd_pcm_uframes_t frames, snd_pcm_format_t format);
    938 
    939 /** \} */
    940 
    941 /**
    942  * \defgroup PCM_Hook Hook Extension
    943  * \ingroup PCM
    944  * See the \ref pcm page for more details.
    945  * \{
    946  */
    947 
    948 /** type of pcm hook */
    949 typedef enum _snd_pcm_hook_type {
    950 	SND_PCM_HOOK_TYPE_HW_PARAMS = 0,
    951 	SND_PCM_HOOK_TYPE_HW_FREE,
    952 	SND_PCM_HOOK_TYPE_CLOSE,
    953 	SND_PCM_HOOK_TYPE_LAST = SND_PCM_HOOK_TYPE_CLOSE
    954 } snd_pcm_hook_type_t;
    955 
    956 /** PCM hook container */
    957 typedef struct _snd_pcm_hook snd_pcm_hook_t;
    958 /** PCM hook callback function */
    959 typedef int (*snd_pcm_hook_func_t)(snd_pcm_hook_t *hook);
    960 snd_pcm_t *snd_pcm_hook_get_pcm(snd_pcm_hook_t *hook);
    961 void *snd_pcm_hook_get_private(snd_pcm_hook_t *hook);
    962 void snd_pcm_hook_set_private(snd_pcm_hook_t *hook, void *private_data);
    963 int snd_pcm_hook_add(snd_pcm_hook_t **hookp, snd_pcm_t *pcm,
    964 		     snd_pcm_hook_type_t type,
    965 		     snd_pcm_hook_func_t func, void *private_data);
    966 int snd_pcm_hook_remove(snd_pcm_hook_t *hook);
    967 
    968 /** \} */
    969 
    970 /**
    971  * \defgroup PCM_Scope Scope Plugin Extension
    972  * \ingroup PCM
    973  * See the \ref pcm page for more details.
    974  * \{
    975  */
    976 
    977 /** #SND_PCM_TYPE_METER scope functions */
    978 typedef struct _snd_pcm_scope_ops {
    979 	/** \brief Enable and prepare it using current params
    980 	 * \param scope scope handle
    981 	 */
    982 	int (*enable)(snd_pcm_scope_t *scope);
    983 	/** \brief Disable
    984 	 * \param scope scope handle
    985 	 */
    986 	void (*disable)(snd_pcm_scope_t *scope);
    987 	/** \brief PCM has been started
    988 	 * \param scope scope handle
    989 	 */
    990 	void (*start)(snd_pcm_scope_t *scope);
    991 	/** \brief PCM has been stopped
    992 	 * \param scope scope handle
    993 	 */
    994 	void (*stop)(snd_pcm_scope_t *scope);
    995 	/** \brief New frames are present
    996 	 * \param scope scope handle
    997 	 */
    998 	void (*update)(snd_pcm_scope_t *scope);
    999 	/** \brief Reset status
   1000 	 * \param scope scope handle
   1001 	 */
   1002 	void (*reset)(snd_pcm_scope_t *scope);
   1003 	/** \brief PCM is closing
   1004 	 * \param scope scope handle
   1005 	 */
   1006 	void (*close)(snd_pcm_scope_t *scope);
   1007 } snd_pcm_scope_ops_t;
   1008 
   1009 snd_pcm_uframes_t snd_pcm_meter_get_bufsize(snd_pcm_t *pcm);
   1010 unsigned int snd_pcm_meter_get_channels(snd_pcm_t *pcm);
   1011 unsigned int snd_pcm_meter_get_rate(snd_pcm_t *pcm);
   1012 snd_pcm_uframes_t snd_pcm_meter_get_now(snd_pcm_t *pcm);
   1013 snd_pcm_uframes_t snd_pcm_meter_get_boundary(snd_pcm_t *pcm);
   1014 int snd_pcm_meter_add_scope(snd_pcm_t *pcm, snd_pcm_scope_t *scope);
   1015 snd_pcm_scope_t *snd_pcm_meter_search_scope(snd_pcm_t *pcm, const char *name);
   1016 int snd_pcm_scope_malloc(snd_pcm_scope_t **ptr);
   1017 void snd_pcm_scope_set_ops(snd_pcm_scope_t *scope, snd_pcm_scope_ops_t *val);
   1018 void snd_pcm_scope_set_name(snd_pcm_scope_t *scope, const char *val);
   1019 const char *snd_pcm_scope_get_name(snd_pcm_scope_t *scope);
   1020 void *snd_pcm_scope_get_callback_private(snd_pcm_scope_t *scope);
   1021 void snd_pcm_scope_set_callback_private(snd_pcm_scope_t *scope, void *val);
   1022 int snd_pcm_scope_s16_open(snd_pcm_t *pcm, const char *name,
   1023 			   snd_pcm_scope_t **scopep);
   1024 int16_t *snd_pcm_scope_s16_get_channel_buffer(snd_pcm_scope_t *scope,
   1025 					      unsigned int channel);
   1026 
   1027 /** \} */
   1028 
   1029 /**
   1030  * \defgroup PCM_Simple Simple setup functions
   1031  * \ingroup PCM
   1032  * See the \ref pcm page for more details.
   1033  * \{
   1034  */
   1035 
   1036 /** Simple PCM latency type */
   1037 typedef enum _snd_spcm_latency {
   1038 	/** standard latency - for standard playback or capture
   1039             (estimated latency in one direction 350ms) */
   1040 	SND_SPCM_LATENCY_STANDARD = 0,
   1041 	/** medium latency - software phones etc.
   1042 	    (estimated latency in one direction maximally 25ms */
   1043 	SND_SPCM_LATENCY_MEDIUM,
   1044 	/** realtime latency - realtime applications (effect processors etc.)
   1045 	    (estimated latency in one direction 5ms and better) */
   1046 	SND_SPCM_LATENCY_REALTIME
   1047 } snd_spcm_latency_t;
   1048 
   1049 /** Simple PCM xrun type */
   1050 typedef enum _snd_spcm_xrun_type {
   1051 	/** driver / library will ignore all xruns, the stream runs forever */
   1052 	SND_SPCM_XRUN_IGNORE = 0,
   1053 	/** driver / library stops the stream when an xrun occurs */
   1054 	SND_SPCM_XRUN_STOP
   1055 } snd_spcm_xrun_type_t;
   1056 
   1057 /** Simple PCM duplex type */
   1058 typedef enum _snd_spcm_duplex_type {
   1059 	/** liberal duplex - the buffer and period sizes might not match */
   1060 	SND_SPCM_DUPLEX_LIBERAL = 0,
   1061 	/** pedantic duplex - the buffer and period sizes MUST match */
   1062 	SND_SPCM_DUPLEX_PEDANTIC
   1063 } snd_spcm_duplex_type_t;
   1064 
   1065 int snd_spcm_init(snd_pcm_t *pcm,
   1066 		  unsigned int rate,
   1067 		  unsigned int channels,
   1068 		  snd_pcm_format_t format,
   1069 		  snd_pcm_subformat_t subformat,
   1070 		  snd_spcm_latency_t latency,
   1071 		  snd_pcm_access_t _access,
   1072 		  snd_spcm_xrun_type_t xrun_type);
   1073 
   1074 int snd_spcm_init_duplex(snd_pcm_t *playback_pcm,
   1075 			 snd_pcm_t *capture_pcm,
   1076 			 unsigned int rate,
   1077 			 unsigned int channels,
   1078 			 snd_pcm_format_t format,
   1079 			 snd_pcm_subformat_t subformat,
   1080 			 snd_spcm_latency_t latency,
   1081 			 snd_pcm_access_t _access,
   1082 			 snd_spcm_xrun_type_t xrun_type,
   1083 			 snd_spcm_duplex_type_t duplex_type);
   1084 
   1085 int snd_spcm_init_get_params(snd_pcm_t *pcm,
   1086 			     unsigned int *rate,
   1087 			     snd_pcm_uframes_t *buffer_size,
   1088 			     snd_pcm_uframes_t *period_size);
   1089 
   1090 /** \} */
   1091 
   1092 /**
   1093  * \defgroup PCM_Deprecated Deprecated Functions
   1094  * \ingroup PCM
   1095  * See the \ref pcm page for more details.
   1096  * \{
   1097  */
   1098 
   1099 /* Deprecated functions, for compatibility */
   1100 const char *snd_pcm_start_mode_name(snd_pcm_start_t mode);
   1101 const char *snd_pcm_xrun_mode_name(snd_pcm_xrun_t mode);
   1102 int snd_pcm_sw_params_set_start_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_start_t val);
   1103 snd_pcm_start_t snd_pcm_sw_params_get_start_mode(const snd_pcm_sw_params_t *params);
   1104 int snd_pcm_sw_params_set_xrun_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params, snd_pcm_xrun_t val);
   1105 snd_pcm_xrun_t snd_pcm_sw_params_get_xrun_mode(const snd_pcm_sw_params_t *params);
   1106 
   1107 /** \} */
   1108 
   1109 #ifdef __cplusplus
   1110 }
   1111 #endif
   1112 
   1113 #endif /* __ALSA_PCM_H */
   1114