1 /* Simple Plugin API 2 * 3 * Copyright © 2018 Wim Taymans 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24 25 #ifndef SPA_AUDIO_RAW_H 26 #define SPA_AUDIO_RAW_H 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 #include <stdint.h> 33 34 #ifndef __FreeBSD__ 35 #include <endian.h> 36 #endif 37 38 #define SPA_AUDIO_MAX_CHANNELS 64u 39 40 enum spa_audio_format { 41 SPA_AUDIO_FORMAT_UNKNOWN, 42 SPA_AUDIO_FORMAT_ENCODED, 43 44 /* interleaved formats */ 45 SPA_AUDIO_FORMAT_START_Interleaved = 0x100, 46 SPA_AUDIO_FORMAT_S8, 47 SPA_AUDIO_FORMAT_U8, 48 SPA_AUDIO_FORMAT_S16_LE, 49 SPA_AUDIO_FORMAT_S16_BE, 50 SPA_AUDIO_FORMAT_U16_LE, 51 SPA_AUDIO_FORMAT_U16_BE, 52 SPA_AUDIO_FORMAT_S24_32_LE, 53 SPA_AUDIO_FORMAT_S24_32_BE, 54 SPA_AUDIO_FORMAT_U24_32_LE, 55 SPA_AUDIO_FORMAT_U24_32_BE, 56 SPA_AUDIO_FORMAT_S32_LE, 57 SPA_AUDIO_FORMAT_S32_BE, 58 SPA_AUDIO_FORMAT_U32_LE, 59 SPA_AUDIO_FORMAT_U32_BE, 60 SPA_AUDIO_FORMAT_S24_LE, 61 SPA_AUDIO_FORMAT_S24_BE, 62 SPA_AUDIO_FORMAT_U24_LE, 63 SPA_AUDIO_FORMAT_U24_BE, 64 SPA_AUDIO_FORMAT_S20_LE, 65 SPA_AUDIO_FORMAT_S20_BE, 66 SPA_AUDIO_FORMAT_U20_LE, 67 SPA_AUDIO_FORMAT_U20_BE, 68 SPA_AUDIO_FORMAT_S18_LE, 69 SPA_AUDIO_FORMAT_S18_BE, 70 SPA_AUDIO_FORMAT_U18_LE, 71 SPA_AUDIO_FORMAT_U18_BE, 72 SPA_AUDIO_FORMAT_F32_LE, 73 SPA_AUDIO_FORMAT_F32_BE, 74 SPA_AUDIO_FORMAT_F64_LE, 75 SPA_AUDIO_FORMAT_F64_BE, 76 77 /* planar formats */ 78 SPA_AUDIO_FORMAT_START_Planar = 0x200, 79 SPA_AUDIO_FORMAT_U8P, 80 SPA_AUDIO_FORMAT_S16P, 81 SPA_AUDIO_FORMAT_S24_32P, 82 SPA_AUDIO_FORMAT_S32P, 83 SPA_AUDIO_FORMAT_S24P, 84 SPA_AUDIO_FORMAT_F32P, 85 SPA_AUDIO_FORMAT_F64P, 86 87 /* other formats start here */ 88 SPA_AUDIO_FORMAT_START_Other = 0x400, 89 90 /* Aliases */ 91 92 /* DSP formats */ 93 SPA_AUDIO_FORMAT_DSP_S32 = SPA_AUDIO_FORMAT_S24_32P, 94 SPA_AUDIO_FORMAT_DSP_F32 = SPA_AUDIO_FORMAT_F32P, 95 SPA_AUDIO_FORMAT_DSP_F64 = SPA_AUDIO_FORMAT_F64P, 96 97 /* native endian */ 98 #if __BYTE_ORDER == __BIG_ENDIAN 99 SPA_AUDIO_FORMAT_S16 = SPA_AUDIO_FORMAT_S16_BE, 100 SPA_AUDIO_FORMAT_U16 = SPA_AUDIO_FORMAT_U16_BE, 101 SPA_AUDIO_FORMAT_S24_32 = SPA_AUDIO_FORMAT_S24_32_BE, 102 SPA_AUDIO_FORMAT_U24_32 = SPA_AUDIO_FORMAT_U24_32_BE, 103 SPA_AUDIO_FORMAT_S32 = SPA_AUDIO_FORMAT_S32_BE, 104 SPA_AUDIO_FORMAT_U32 = SPA_AUDIO_FORMAT_U32_BE, 105 SPA_AUDIO_FORMAT_S24 = SPA_AUDIO_FORMAT_S24_BE, 106 SPA_AUDIO_FORMAT_U24 = SPA_AUDIO_FORMAT_U24_BE, 107 SPA_AUDIO_FORMAT_S20 = SPA_AUDIO_FORMAT_S20_BE, 108 SPA_AUDIO_FORMAT_U20 = SPA_AUDIO_FORMAT_U20_BE, 109 SPA_AUDIO_FORMAT_S18 = SPA_AUDIO_FORMAT_S18_BE, 110 SPA_AUDIO_FORMAT_U18 = SPA_AUDIO_FORMAT_U18_BE, 111 SPA_AUDIO_FORMAT_F32 = SPA_AUDIO_FORMAT_F32_BE, 112 SPA_AUDIO_FORMAT_F64 = SPA_AUDIO_FORMAT_F64_BE, 113 SPA_AUDIO_FORMAT_S16_OE = SPA_AUDIO_FORMAT_S16_LE, 114 SPA_AUDIO_FORMAT_U16_OE = SPA_AUDIO_FORMAT_U16_LE, 115 SPA_AUDIO_FORMAT_S24_32_OE = SPA_AUDIO_FORMAT_S24_32_LE, 116 SPA_AUDIO_FORMAT_U24_32_OE = SPA_AUDIO_FORMAT_U24_32_LE, 117 SPA_AUDIO_FORMAT_S32_OE = SPA_AUDIO_FORMAT_S32_LE, 118 SPA_AUDIO_FORMAT_U32_OE = SPA_AUDIO_FORMAT_U32_LE, 119 SPA_AUDIO_FORMAT_S24_OE = SPA_AUDIO_FORMAT_S24_LE, 120 SPA_AUDIO_FORMAT_U24_OE = SPA_AUDIO_FORMAT_U24_LE, 121 SPA_AUDIO_FORMAT_S20_OE = SPA_AUDIO_FORMAT_S20_LE, 122 SPA_AUDIO_FORMAT_U20_OE = SPA_AUDIO_FORMAT_U20_LE, 123 SPA_AUDIO_FORMAT_S18_OE = SPA_AUDIO_FORMAT_S18_LE, 124 SPA_AUDIO_FORMAT_U18_OE = SPA_AUDIO_FORMAT_U18_LE, 125 SPA_AUDIO_FORMAT_F32_OE = SPA_AUDIO_FORMAT_F32_LE, 126 SPA_AUDIO_FORMAT_F64_OE = SPA_AUDIO_FORMAT_F64_LE, 127 #elif __BYTE_ORDER == __LITTLE_ENDIAN 128 SPA_AUDIO_FORMAT_S16 = SPA_AUDIO_FORMAT_S16_LE, 129 SPA_AUDIO_FORMAT_U16 = SPA_AUDIO_FORMAT_U16_LE, 130 SPA_AUDIO_FORMAT_S24_32 = SPA_AUDIO_FORMAT_S24_32_LE, 131 SPA_AUDIO_FORMAT_U24_32 = SPA_AUDIO_FORMAT_U24_32_LE, 132 SPA_AUDIO_FORMAT_S32 = SPA_AUDIO_FORMAT_S32_LE, 133 SPA_AUDIO_FORMAT_U32 = SPA_AUDIO_FORMAT_U32_LE, 134 SPA_AUDIO_FORMAT_S24 = SPA_AUDIO_FORMAT_S24_LE, 135 SPA_AUDIO_FORMAT_U24 = SPA_AUDIO_FORMAT_U24_LE, 136 SPA_AUDIO_FORMAT_S20 = SPA_AUDIO_FORMAT_S20_LE, 137 SPA_AUDIO_FORMAT_U20 = SPA_AUDIO_FORMAT_U20_LE, 138 SPA_AUDIO_FORMAT_S18 = SPA_AUDIO_FORMAT_S18_LE, 139 SPA_AUDIO_FORMAT_U18 = SPA_AUDIO_FORMAT_U18_LE, 140 SPA_AUDIO_FORMAT_F32 = SPA_AUDIO_FORMAT_F32_LE, 141 SPA_AUDIO_FORMAT_F64 = SPA_AUDIO_FORMAT_F64_LE, 142 SPA_AUDIO_FORMAT_S16_OE = SPA_AUDIO_FORMAT_S16_BE, 143 SPA_AUDIO_FORMAT_U16_OE = SPA_AUDIO_FORMAT_U16_BE, 144 SPA_AUDIO_FORMAT_S24_32_OE = SPA_AUDIO_FORMAT_S24_32_BE, 145 SPA_AUDIO_FORMAT_U24_32_OE = SPA_AUDIO_FORMAT_U24_32_BE, 146 SPA_AUDIO_FORMAT_S32_OE = SPA_AUDIO_FORMAT_S32_BE, 147 SPA_AUDIO_FORMAT_U32_OE = SPA_AUDIO_FORMAT_U32_BE, 148 SPA_AUDIO_FORMAT_S24_OE = SPA_AUDIO_FORMAT_S24_BE, 149 SPA_AUDIO_FORMAT_U24_OE = SPA_AUDIO_FORMAT_U24_BE, 150 SPA_AUDIO_FORMAT_S20_OE = SPA_AUDIO_FORMAT_S20_BE, 151 SPA_AUDIO_FORMAT_U20_OE = SPA_AUDIO_FORMAT_U20_BE, 152 SPA_AUDIO_FORMAT_S18_OE = SPA_AUDIO_FORMAT_S18_BE, 153 SPA_AUDIO_FORMAT_U18_OE = SPA_AUDIO_FORMAT_U18_BE, 154 SPA_AUDIO_FORMAT_F32_OE = SPA_AUDIO_FORMAT_F32_BE, 155 SPA_AUDIO_FORMAT_F64_OE = SPA_AUDIO_FORMAT_F64_BE, 156 #endif 157 }; 158 159 #define SPA_AUDIO_FORMAT_IS_INTERLEAVED(fmt) ((fmt) > SPA_AUDIO_FORMAT_START_Interleaved && (fmt) < SPA_AUDIO_FORMAT_START_Planar) 160 #define SPA_AUDIO_FORMAT_IS_PLANAR(fmt) ((fmt) > SPA_AUDIO_FORMAT_START_Planar && (fmt) < SPA_AUDIO_FORMAT_START_Other) 161 162 enum spa_audio_channel { 163 SPA_AUDIO_CHANNEL_UNKNOWN, /**< unspecified */ 164 SPA_AUDIO_CHANNEL_NA, /**< N/A, silent */ 165 166 SPA_AUDIO_CHANNEL_MONO, /**< mono stream */ 167 168 SPA_AUDIO_CHANNEL_FL, /**< front left */ 169 SPA_AUDIO_CHANNEL_FR, /**< front right */ 170 SPA_AUDIO_CHANNEL_FC, /**< front center */ 171 SPA_AUDIO_CHANNEL_LFE, /**< LFE */ 172 SPA_AUDIO_CHANNEL_SL, /**< side left */ 173 SPA_AUDIO_CHANNEL_SR, /**< side right */ 174 SPA_AUDIO_CHANNEL_FLC, /**< front left center */ 175 SPA_AUDIO_CHANNEL_FRC, /**< front right center */ 176 SPA_AUDIO_CHANNEL_RC, /**< rear center */ 177 SPA_AUDIO_CHANNEL_RL, /**< rear left */ 178 SPA_AUDIO_CHANNEL_RR, /**< rear right */ 179 SPA_AUDIO_CHANNEL_TC, /**< top center */ 180 SPA_AUDIO_CHANNEL_TFL, /**< top front left */ 181 SPA_AUDIO_CHANNEL_TFC, /**< top front center */ 182 SPA_AUDIO_CHANNEL_TFR, /**< top front right */ 183 SPA_AUDIO_CHANNEL_TRL, /**< top rear left */ 184 SPA_AUDIO_CHANNEL_TRC, /**< top rear center */ 185 SPA_AUDIO_CHANNEL_TRR, /**< top rear right */ 186 SPA_AUDIO_CHANNEL_RLC, /**< rear left center */ 187 SPA_AUDIO_CHANNEL_RRC, /**< rear right center */ 188 SPA_AUDIO_CHANNEL_FLW, /**< front left wide */ 189 SPA_AUDIO_CHANNEL_FRW, /**< front right wide */ 190 SPA_AUDIO_CHANNEL_LFE2, /**< LFE 2 */ 191 SPA_AUDIO_CHANNEL_FLH, /**< front left high */ 192 SPA_AUDIO_CHANNEL_FCH, /**< front center high */ 193 SPA_AUDIO_CHANNEL_FRH, /**< front right high */ 194 SPA_AUDIO_CHANNEL_TFLC, /**< top front left center */ 195 SPA_AUDIO_CHANNEL_TFRC, /**< top front right center */ 196 SPA_AUDIO_CHANNEL_TSL, /**< top side left */ 197 SPA_AUDIO_CHANNEL_TSR, /**< top side right */ 198 SPA_AUDIO_CHANNEL_LLFE, /**< left LFE */ 199 SPA_AUDIO_CHANNEL_RLFE, /**< right LFE */ 200 SPA_AUDIO_CHANNEL_BC, /**< bottom center */ 201 SPA_AUDIO_CHANNEL_BLC, /**< bottom left center */ 202 SPA_AUDIO_CHANNEL_BRC, /**< bottom right center */ 203 204 SPA_AUDIO_CHANNEL_CUSTOM_START = 0x10000, 205 }; 206 207 /** Extra audio flags */ 208 #define SPA_AUDIO_FLAG_NONE (0) /*< no valid flag */ 209 #define SPA_AUDIO_FLAG_UNPOSITIONED (1 << 0) /*< the position array explicitly 210 * contains unpositioned channels. */ 211 /** Audio information description */ 212 struct spa_audio_info_raw { 213 enum spa_audio_format format; /*< format, one of enum spa_audio_format */ 214 uint32_t flags; /*< extra flags */ 215 uint32_t rate; /*< sample rate */ 216 uint32_t channels; /*< number of channels */ 217 uint32_t position[SPA_AUDIO_MAX_CHANNELS]; /*< channel position from enum spa_audio_channel */ 218 }; 219 220 #define SPA_AUDIO_INFO_RAW_INIT(...) (struct spa_audio_info_raw) { __VA_ARGS__ } 221 222 #define SPA_KEY_AUDIO_CHANNEL "audio.channel" /**< an audio channel as string, 223 * Ex. "FL" */ 224 #define SPA_KEY_AUDIO_CHANNELS "audio.channels" /**< an audio channel count as int */ 225 #define SPA_KEY_AUDIO_RATE "audio.rate" /**< an audio sample rate as int */ 226 227 struct spa_audio_info_dsp { 228 enum spa_audio_format format; /*< format, one of the DSP formats in enum spa_audio_format_dsp */ 229 }; 230 231 #define SPA_AUDIO_INFO_DSP_INIT(...) (struct spa_audio_info_dsp) { __VA_ARGS__ } 232 233 #ifdef __cplusplus 234 } /* extern "C" */ 235 #endif 236 237 #endif /* SPA_AUDIO_RAW_H */ 238