Subversion Repositories Games.Prince of Persia

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.  
  136.