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-2020 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) < 1 \ 103 ? 0 \ 104 : ( (enc) & MPG123_ENC_8 \ 105 ? 1 \ 106 : ( (enc) & MPG123_ENC_16 \ 107 ? 2 \ 108 : ( (enc) & MPG123_ENC_24 \ 109 ? 3 \ 110 : ( ( (enc) & MPG123_ENC_32 \ 111 || (enc) == MPG123_ENC_FLOAT_32 ) \ 112 ? 4 \ 113 : ( (enc) == MPG123_ENC_FLOAT_64 \ 114 ? 8 \ 115 : 0 \ 116 ) ) ) ) ) ) 117 118 /** Representation of zero in differing encodings. 119 * This exists to define proper silence in various encodings without 120 * having to link to libsyn123 to do actual conversions at runtime. 121 * You have to handle big/little endian order yourself, though. 122 * This takes the shortcut that any signed encoding has a zero with 123 * all-zero bits. Unsigned linear encodings just have the highest bit set 124 * (2^(n-1) for n bits), while the nonlinear 8-bit ones are special. 125 * \param enc the encoding (mpg123_enc_enum value) 126 * \param siz bytes per sample (return value of MPG123_SAMPLESIZE(enc)) 127 * \param off byte (octet) offset counted from LSB 128 * \return unsigned byte value for the designated octet 129 */ 130 #define MPG123_ZEROSAMPLE(enc, siz, off) ( \ 131 (enc) == MPG123_ENC_ULAW_8 \ 132 ? (off == 0 ? 0xff : 0x00) \ 133 : ( (enc) == MPG123_ENC_ALAW_8 \ 134 ? (off == 0 ? 0xd5 : 0x00) \ 135 : ( (((enc) & (MPG123_ENC_SIGNED|MPG123_ENC_FLOAT)) || (siz) != ((off)+1)) \ 136 ? 0x00 \ 137 : 0x80 \ 138 ) ) ) 139 140 /** Structure defining an audio format. 141 * Providing the members as individual function arguments to define a certain 142 * output format is easy enough. This struct makes is more comfortable to deal 143 * with a list of formats. 144 * Negative values for the members might be used to communicate use of default 145 * values. 146 */ 147 struct mpg123_fmt 148 { 149 long rate; /**< sampling rate in Hz */ 150 int channels; /**< channel count */ 151 /** encoding code, can be single value or bitwise or of members of 152 * mpg123_enc_enum */ 153 int encoding; 154 }; 155 156 /* @} */ 157 158 #endif 159 160