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