Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 1 | pmbaty | 1 | /* | 
        
| 2 |         libmpg123: MPEG Audio Decoder library | 
        ||
| 3 | |||
| 4 |         separate header just for audio format definitions not tied to | 
        ||
| 5 |         library code | 
        ||
| 6 | |||
| 7 |         copyright 1995-2015 by the mpg123 project | 
        ||
| 8 |         free software under the terms of the LGPL 2.1 | 
        ||
| 9 |         see COPYING and AUTHORS files in distribution or http://mpg123.org | 
        ||
| 10 | */ | 
        ||
| 11 | |||
| 12 | #ifndef MPG123_ENC_H | 
        ||
| 13 | #define MPG123_ENC_H | 
        ||
| 14 | |||
| 15 | /** \file fmt123.h Audio format definitions. */ | 
        ||
| 16 | |||
| 17 | /** \defgroup mpg123_enc mpg123 PCM sample encodings | 
        ||
| 18 |  *  These are definitions for audio formats used by libmpg123 and | 
        ||
| 19 |  *  libout123. | 
        ||
| 20 |  * | 
        ||
| 21 |  * @{ | 
        ||
| 22 |  */ | 
        ||
| 23 | |||
| 24 | /** An enum over all sample types possibly known to mpg123. | 
        ||
| 25 |  *  The values are designed as bit flags to allow bitmasking for encoding | 
        ||
| 26 |  *  families. | 
        ||
| 27 |  *  This is also why the enum is not used as type for actual encoding variables, | 
        ||
| 28 |  *  plain integers (at least 16 bit, 15 bit being used) cover the possible | 
        ||
| 29 |  *  combinations of these flags. | 
        ||
| 30 |  * | 
        ||
| 31 |  *  Note that (your build of) libmpg123 does not necessarily support all these. | 
        ||
| 32 |  *  Usually, you can expect the 8bit encodings and signed 16 bit. | 
        ||
| 33 |  *  Also 32bit float will be usual beginning with mpg123-1.7.0 . | 
        ||
| 34 |  *  What you should bear in mind is that (SSE, etc) optimized routines may be | 
        ||
| 35 |  *  absent for some formats. We do have SSE for 16, 32 bit and float, though. | 
        ||
| 36 |  *  24 bit integer is done via postprocessing of 32 bit output -- just cutting | 
        ||
| 37 |  *  the last byte, no rounding, even. If you want better, do it yourself. | 
        ||
| 38 |  * | 
        ||
| 39 |  *  All formats are in native byte order. If you need different endinaness, you | 
        ||
| 40 |  *  can simply postprocess the output buffers (libmpg123 wouldn't do anything | 
        ||
| 41 |  * else). The macro MPG123_SAMPLESIZE() can be helpful there. | 
        ||
| 42 |  */ | 
        ||
| 43 | enum mpg123_enc_enum | 
        ||
| 44 | { | 
        ||
| 45 | /* 0000 0000 0000 1111 Some 8 bit  integer encoding. */ | 
        ||
| 46 | MPG123_ENC_8 = 0x00f  | 
        ||
| 47 | /* 0000 0000 0100 0000 Some 16 bit integer encoding. */ | 
        ||
| 48 | , MPG123_ENC_16 = 0x040  | 
        ||
| 49 | /* 0100 0000 0000 0000 Some 24 bit integer encoding. */ | 
        ||
| 50 | , MPG123_ENC_24 = 0x4000  | 
        ||
| 51 | /* 0000 0001 0000 0000 Some 32 bit integer encoding. */ | 
        ||
| 52 | , MPG123_ENC_32 = 0x100  | 
        ||
| 53 | /* 0000 0000 1000 0000 Some signed integer encoding. */ | 
        ||
| 54 | , MPG123_ENC_SIGNED = 0x080  | 
        ||
| 55 | /* 0000 1110 0000 0000 Some float encoding. */ | 
        ||
| 56 | , MPG123_ENC_FLOAT = 0xe00  | 
        ||
| 57 | /* 0000 0000 1101 0000 signed 16 bit */ | 
        ||
| 58 | , MPG123_ENC_SIGNED_16 = (MPG123_ENC_16|MPG123_ENC_SIGNED|0x10)  | 
        ||
| 59 | /* 0000 0000 0110 0000 unsigned 16 bit */ | 
        ||
| 60 | , MPG123_ENC_UNSIGNED_16 = (MPG123_ENC_16|0x20)  | 
        ||
| 61 | /* 0000 0000 0000 0001 unsigned 8 bit */ | 
        ||
| 62 | , MPG123_ENC_UNSIGNED_8 = 0x01  | 
        ||
| 63 | /* 0000 0000 1000 0010 signed 8 bit */ | 
        ||
| 64 | , MPG123_ENC_SIGNED_8 = (MPG123_ENC_SIGNED|0x02)  | 
        ||
| 65 | /* 0000 0000 0000 0100 ulaw 8 bit */ | 
        ||
| 66 | , MPG123_ENC_ULAW_8 = 0x04  | 
        ||
| 67 | /* 0000 0000 0000 1000 alaw 8 bit */ | 
        ||
| 68 | , MPG123_ENC_ALAW_8 = 0x08  | 
        ||
| 69 | /* 0001 0001 1000 0000 signed 32 bit */ | 
        ||
| 70 | , MPG123_ENC_SIGNED_32 = MPG123_ENC_32|MPG123_ENC_SIGNED|0x1000  | 
        ||
| 71 | /* 0010 0001 0000 0000 unsigned 32 bit */ | 
        ||
| 72 | , MPG123_ENC_UNSIGNED_32 = MPG123_ENC_32|0x2000  | 
        ||
| 73 | /* 0101 0000 1000 0000 signed 24 bit */ | 
        ||
| 74 | , MPG123_ENC_SIGNED_24 = MPG123_ENC_24|MPG123_ENC_SIGNED|0x1000  | 
        ||
| 75 | /* 0110 0000 0000 0000 unsigned 24 bit */ | 
        ||
| 76 | , MPG123_ENC_UNSIGNED_24 = MPG123_ENC_24|0x2000  | 
        ||
| 77 | /* 0000 0010 0000 0000 32bit float */ | 
        ||
| 78 | , MPG123_ENC_FLOAT_32 = 0x200  | 
        ||
| 79 | /* 0000 0100 0000 0000 64bit float */ | 
        ||
| 80 | , MPG123_ENC_FLOAT_64 = 0x400  | 
        ||
| 81 | /* Any possibly known encoding from the list above. */ | 
        ||
| 82 | , MPG123_ENC_ANY = ( MPG123_ENC_SIGNED_16 | MPG123_ENC_UNSIGNED_16  | 
        ||
| 83 | | MPG123_ENC_UNSIGNED_8 | MPG123_ENC_SIGNED_8  | 
        ||
| 84 | | MPG123_ENC_ULAW_8 | MPG123_ENC_ALAW_8  | 
        ||
| 85 | | MPG123_ENC_SIGNED_32 | MPG123_ENC_UNSIGNED_32  | 
        ||
| 86 | | MPG123_ENC_SIGNED_24 | MPG123_ENC_UNSIGNED_24  | 
        ||
| 87 | | MPG123_ENC_FLOAT_32 | MPG123_ENC_FLOAT_64 )  | 
        ||
| 88 | };  | 
        ||
| 89 | |||
| 90 | /** Get size of one PCM sample with given encoding. | 
        ||
| 91 |  *  This is included both in libmpg123 and libout123. Both offer | 
        ||
| 92 |  *  an API function to provide the macro results from library | 
        ||
| 93 |  *  compile-time, not that of you application. This most likely | 
        ||
| 94 |  *  does not matter as I do not expect any fresh PCM sample | 
        ||
| 95 |  *  encoding to appear. But who knows? Perhaps the encoding type | 
        ||
| 96 |  *  will be abused for funny things in future, not even plain PCM. | 
        ||
| 97 |  *  And, by the way: Thomas really likes the ?: operator. | 
        ||
| 98 |  * \param enc the encoding (mpg123_enc_enum value) | 
        ||
| 99 |  * \return size of one sample in bytes | 
        ||
| 100 |  */ | 
        ||
| 101 | #define MPG123_SAMPLESIZE(enc) ( \ | 
        ||
| 102 |         (enc) & MPG123_ENC_8 \ | 
        ||
| 103 |         ?       1 \ | 
        ||
| 104 |         :       ( (enc) & MPG123_ENC_16 \ | 
        ||
| 105 |                 ?       2 \ | 
        ||
| 106 |                 :       ( (enc) & MPG123_ENC_24 \ | 
        ||
| 107 |                         ?       3 \ | 
        ||
| 108 |                         :       ( (  (enc) & MPG123_ENC_32 \ | 
        ||
| 109 |                                   || (enc) == MPG123_ENC_FLOAT_32 ) \ | 
        ||
| 110 |                                 ?       4 \ | 
        ||
| 111 |                                 :       ( (enc) == MPG123_ENC_FLOAT_64 \ | 
        ||
| 112 |                                         ?       8 \ | 
        ||
| 113 |                                         :       0 \ | 
        ||
| 114 | )       )       )       )       ) | 
        ||
| 115 | |||
| 116 | /** Structure defining an audio format. | 
        ||
| 117 |  *  Providing the members as individual function arguments to define a certain | 
        ||
| 118 |  *  output format is easy enough. This struct makes is more comfortable to deal | 
        ||
| 119 |  *  with a list of formats. | 
        ||
| 120 |  *  Negative values for the members might be used to communicate use of default | 
        ||
| 121 |  *  values. | 
        ||
| 122 |  */ | 
        ||
| 123 | struct mpg123_fmt | 
        ||
| 124 | { | 
        ||
| 125 | long rate; /**< sampling rate in Hz */  | 
        ||
| 126 | int channels; /**< channel count */  | 
        ||
| 127 |         /** encoding code, can be single value or bitwise or of members of | 
        ||
| 128 |          *  mpg123_enc_enum */ | 
        ||
| 129 | int encoding;  | 
        ||
| 130 | };  | 
        ||
| 131 | |||
| 132 | /* @} */ | 
        ||
| 133 | |||
| 134 | #endif | 
        ||
| 135 |