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 /** 39 * \addtogroup spa_param 40 * \{ 41 */ 42 43 #define SPA_AUDIO_MAX_CHANNELS 64u 44 45 enum spa_audio_format { 46 SPA_AUDIO_FORMAT_UNKNOWN, 47 SPA_AUDIO_FORMAT_ENCODED, 48 49 /* interleaved formats */ 50 SPA_AUDIO_FORMAT_START_Interleaved = 0x100, 51 SPA_AUDIO_FORMAT_S8, 52 SPA_AUDIO_FORMAT_U8, 53 SPA_AUDIO_FORMAT_S16_LE, 54 SPA_AUDIO_FORMAT_S16_BE, 55 SPA_AUDIO_FORMAT_U16_LE, 56 SPA_AUDIO_FORMAT_U16_BE, 57 SPA_AUDIO_FORMAT_S24_32_LE, 58 SPA_AUDIO_FORMAT_S24_32_BE, 59 SPA_AUDIO_FORMAT_U24_32_LE, 60 SPA_AUDIO_FORMAT_U24_32_BE, 61 SPA_AUDIO_FORMAT_S32_LE, 62 SPA_AUDIO_FORMAT_S32_BE, 63 SPA_AUDIO_FORMAT_U32_LE, 64 SPA_AUDIO_FORMAT_U32_BE, 65 SPA_AUDIO_FORMAT_S24_LE, 66 SPA_AUDIO_FORMAT_S24_BE, 67 SPA_AUDIO_FORMAT_U24_LE, 68 SPA_AUDIO_FORMAT_U24_BE, 69 SPA_AUDIO_FORMAT_S20_LE, 70 SPA_AUDIO_FORMAT_S20_BE, 71 SPA_AUDIO_FORMAT_U20_LE, 72 SPA_AUDIO_FORMAT_U20_BE, 73 SPA_AUDIO_FORMAT_S18_LE, 74 SPA_AUDIO_FORMAT_S18_BE, 75 SPA_AUDIO_FORMAT_U18_LE, 76 SPA_AUDIO_FORMAT_U18_BE, 77 SPA_AUDIO_FORMAT_F32_LE, 78 SPA_AUDIO_FORMAT_F32_BE, 79 SPA_AUDIO_FORMAT_F64_LE, 80 SPA_AUDIO_FORMAT_F64_BE, 81 82 SPA_AUDIO_FORMAT_ULAW, 83 SPA_AUDIO_FORMAT_ALAW, 84 85 /* planar formats */ 86 SPA_AUDIO_FORMAT_START_Planar = 0x200, 87 SPA_AUDIO_FORMAT_U8P, 88 SPA_AUDIO_FORMAT_S16P, 89 SPA_AUDIO_FORMAT_S24_32P, 90 SPA_AUDIO_FORMAT_S32P, 91 SPA_AUDIO_FORMAT_S24P, 92 SPA_AUDIO_FORMAT_F32P, 93 SPA_AUDIO_FORMAT_F64P, 94 SPA_AUDIO_FORMAT_S8P, 95 96 /* other formats start here */ 97 SPA_AUDIO_FORMAT_START_Other = 0x400, 98 99 /* Aliases */ 100 101 /* DSP formats */ 102 SPA_AUDIO_FORMAT_DSP_S32 = SPA_AUDIO_FORMAT_S24_32P, 103 SPA_AUDIO_FORMAT_DSP_F32 = SPA_AUDIO_FORMAT_F32P, 104 SPA_AUDIO_FORMAT_DSP_F64 = SPA_AUDIO_FORMAT_F64P, 105 106 /* native endian */ 107 #if __BYTE_ORDER == __BIG_ENDIAN 108 SPA_AUDIO_FORMAT_S16 = SPA_AUDIO_FORMAT_S16_BE, 109 SPA_AUDIO_FORMAT_U16 = SPA_AUDIO_FORMAT_U16_BE, 110 SPA_AUDIO_FORMAT_S24_32 = SPA_AUDIO_FORMAT_S24_32_BE, 111 SPA_AUDIO_FORMAT_U24_32 = SPA_AUDIO_FORMAT_U24_32_BE, 112 SPA_AUDIO_FORMAT_S32 = SPA_AUDIO_FORMAT_S32_BE, 113 SPA_AUDIO_FORMAT_U32 = SPA_AUDIO_FORMAT_U32_BE, 114 SPA_AUDIO_FORMAT_S24 = SPA_AUDIO_FORMAT_S24_BE, 115 SPA_AUDIO_FORMAT_U24 = SPA_AUDIO_FORMAT_U24_BE, 116 SPA_AUDIO_FORMAT_S20 = SPA_AUDIO_FORMAT_S20_BE, 117 SPA_AUDIO_FORMAT_U20 = SPA_AUDIO_FORMAT_U20_BE, 118 SPA_AUDIO_FORMAT_S18 = SPA_AUDIO_FORMAT_S18_BE, 119 SPA_AUDIO_FORMAT_U18 = SPA_AUDIO_FORMAT_U18_BE, 120 SPA_AUDIO_FORMAT_F32 = SPA_AUDIO_FORMAT_F32_BE, 121 SPA_AUDIO_FORMAT_F64 = SPA_AUDIO_FORMAT_F64_BE, 122 SPA_AUDIO_FORMAT_S16_OE = SPA_AUDIO_FORMAT_S16_LE, 123 SPA_AUDIO_FORMAT_U16_OE = SPA_AUDIO_FORMAT_U16_LE, 124 SPA_AUDIO_FORMAT_S24_32_OE = SPA_AUDIO_FORMAT_S24_32_LE, 125 SPA_AUDIO_FORMAT_U24_32_OE = SPA_AUDIO_FORMAT_U24_32_LE, 126 SPA_AUDIO_FORMAT_S32_OE = SPA_AUDIO_FORMAT_S32_LE, 127 SPA_AUDIO_FORMAT_U32_OE = SPA_AUDIO_FORMAT_U32_LE, 128 SPA_AUDIO_FORMAT_S24_OE = SPA_AUDIO_FORMAT_S24_LE, 129 SPA_AUDIO_FORMAT_U24_OE = SPA_AUDIO_FORMAT_U24_LE, 130 SPA_AUDIO_FORMAT_S20_OE = SPA_AUDIO_FORMAT_S20_LE, 131 SPA_AUDIO_FORMAT_U20_OE = SPA_AUDIO_FORMAT_U20_LE, 132 SPA_AUDIO_FORMAT_S18_OE = SPA_AUDIO_FORMAT_S18_LE, 133 SPA_AUDIO_FORMAT_U18_OE = SPA_AUDIO_FORMAT_U18_LE, 134 SPA_AUDIO_FORMAT_F32_OE = SPA_AUDIO_FORMAT_F32_LE, 135 SPA_AUDIO_FORMAT_F64_OE = SPA_AUDIO_FORMAT_F64_LE, 136 #elif __BYTE_ORDER == __LITTLE_ENDIAN 137 SPA_AUDIO_FORMAT_S16 = SPA_AUDIO_FORMAT_S16_LE, 138 SPA_AUDIO_FORMAT_U16 = SPA_AUDIO_FORMAT_U16_LE, 139 SPA_AUDIO_FORMAT_S24_32 = SPA_AUDIO_FORMAT_S24_32_LE, 140 SPA_AUDIO_FORMAT_U24_32 = SPA_AUDIO_FORMAT_U24_32_LE, 141 SPA_AUDIO_FORMAT_S32 = SPA_AUDIO_FORMAT_S32_LE, 142 SPA_AUDIO_FORMAT_U32 = SPA_AUDIO_FORMAT_U32_LE, 143 SPA_AUDIO_FORMAT_S24 = SPA_AUDIO_FORMAT_S24_LE, 144 SPA_AUDIO_FORMAT_U24 = SPA_AUDIO_FORMAT_U24_LE, 145 SPA_AUDIO_FORMAT_S20 = SPA_AUDIO_FORMAT_S20_LE, 146 SPA_AUDIO_FORMAT_U20 = SPA_AUDIO_FORMAT_U20_LE, 147 SPA_AUDIO_FORMAT_S18 = SPA_AUDIO_FORMAT_S18_LE, 148 SPA_AUDIO_FORMAT_U18 = SPA_AUDIO_FORMAT_U18_LE, 149 SPA_AUDIO_FORMAT_F32 = SPA_AUDIO_FORMAT_F32_LE, 150 SPA_AUDIO_FORMAT_F64 = SPA_AUDIO_FORMAT_F64_LE, 151 SPA_AUDIO_FORMAT_S16_OE = SPA_AUDIO_FORMAT_S16_BE, 152 SPA_AUDIO_FORMAT_U16_OE = SPA_AUDIO_FORMAT_U16_BE, 153 SPA_AUDIO_FORMAT_S24_32_OE = SPA_AUDIO_FORMAT_S24_32_BE, 154 SPA_AUDIO_FORMAT_U24_32_OE = SPA_AUDIO_FORMAT_U24_32_BE, 155 SPA_AUDIO_FORMAT_S32_OE = SPA_AUDIO_FORMAT_S32_BE, 156 SPA_AUDIO_FORMAT_U32_OE = SPA_AUDIO_FORMAT_U32_BE, 157 SPA_AUDIO_FORMAT_S24_OE = SPA_AUDIO_FORMAT_S24_BE, 158 SPA_AUDIO_FORMAT_U24_OE = SPA_AUDIO_FORMAT_U24_BE, 159 SPA_AUDIO_FORMAT_S20_OE = SPA_AUDIO_FORMAT_S20_BE, 160 SPA_AUDIO_FORMAT_U20_OE = SPA_AUDIO_FORMAT_U20_BE, 161 SPA_AUDIO_FORMAT_S18_OE = SPA_AUDIO_FORMAT_S18_BE, 162 SPA_AUDIO_FORMAT_U18_OE = SPA_AUDIO_FORMAT_U18_BE, 163 SPA_AUDIO_FORMAT_F32_OE = SPA_AUDIO_FORMAT_F32_BE, 164 SPA_AUDIO_FORMAT_F64_OE = SPA_AUDIO_FORMAT_F64_BE, 165 #endif 166 }; 167 168 #define SPA_AUDIO_FORMAT_IS_INTERLEAVED(fmt) ((fmt) > SPA_AUDIO_FORMAT_START_Interleaved && (fmt) < SPA_AUDIO_FORMAT_START_Planar) 169 #define SPA_AUDIO_FORMAT_IS_PLANAR(fmt) ((fmt) > SPA_AUDIO_FORMAT_START_Planar && (fmt) < SPA_AUDIO_FORMAT_START_Other) 170 171 enum spa_audio_channel { 172 SPA_AUDIO_CHANNEL_UNKNOWN, /**< unspecified */ 173 SPA_AUDIO_CHANNEL_NA, /**< N/A, silent */ 174 175 SPA_AUDIO_CHANNEL_MONO, /**< mono stream */ 176 177 SPA_AUDIO_CHANNEL_FL, /**< front left */ 178 SPA_AUDIO_CHANNEL_FR, /**< front right */ 179 SPA_AUDIO_CHANNEL_FC, /**< front center */ 180 SPA_AUDIO_CHANNEL_LFE, /**< LFE */ 181 SPA_AUDIO_CHANNEL_SL, /**< side left */ 182 SPA_AUDIO_CHANNEL_SR, /**< side right */ 183 SPA_AUDIO_CHANNEL_FLC, /**< front left center */ 184 SPA_AUDIO_CHANNEL_FRC, /**< front right center */ 185 SPA_AUDIO_CHANNEL_RC, /**< rear center */ 186 SPA_AUDIO_CHANNEL_RL, /**< rear left */ 187 SPA_AUDIO_CHANNEL_RR, /**< rear right */ 188 SPA_AUDIO_CHANNEL_TC, /**< top center */ 189 SPA_AUDIO_CHANNEL_TFL, /**< top front left */ 190 SPA_AUDIO_CHANNEL_TFC, /**< top front center */ 191 SPA_AUDIO_CHANNEL_TFR, /**< top front right */ 192 SPA_AUDIO_CHANNEL_TRL, /**< top rear left */ 193 SPA_AUDIO_CHANNEL_TRC, /**< top rear center */ 194 SPA_AUDIO_CHANNEL_TRR, /**< top rear right */ 195 SPA_AUDIO_CHANNEL_RLC, /**< rear left center */ 196 SPA_AUDIO_CHANNEL_RRC, /**< rear right center */ 197 SPA_AUDIO_CHANNEL_FLW, /**< front left wide */ 198 SPA_AUDIO_CHANNEL_FRW, /**< front right wide */ 199 SPA_AUDIO_CHANNEL_LFE2, /**< LFE 2 */ 200 SPA_AUDIO_CHANNEL_FLH, /**< front left high */ 201 SPA_AUDIO_CHANNEL_FCH, /**< front center high */ 202 SPA_AUDIO_CHANNEL_FRH, /**< front right high */ 203 SPA_AUDIO_CHANNEL_TFLC, /**< top front left center */ 204 SPA_AUDIO_CHANNEL_TFRC, /**< top front right center */ 205 SPA_AUDIO_CHANNEL_TSL, /**< top side left */ 206 SPA_AUDIO_CHANNEL_TSR, /**< top side right */ 207 SPA_AUDIO_CHANNEL_LLFE, /**< left LFE */ 208 SPA_AUDIO_CHANNEL_RLFE, /**< right LFE */ 209 SPA_AUDIO_CHANNEL_BC, /**< bottom center */ 210 SPA_AUDIO_CHANNEL_BLC, /**< bottom left center */ 211 SPA_AUDIO_CHANNEL_BRC, /**< bottom right center */ 212 213 SPA_AUDIO_CHANNEL_START_Aux = 0x1000, /**< aux channels */ 214 SPA_AUDIO_CHANNEL_AUX0 = SPA_AUDIO_CHANNEL_START_Aux, 215 SPA_AUDIO_CHANNEL_AUX1, 216 SPA_AUDIO_CHANNEL_AUX2, 217 SPA_AUDIO_CHANNEL_AUX3, 218 SPA_AUDIO_CHANNEL_AUX4, 219 SPA_AUDIO_CHANNEL_AUX5, 220 SPA_AUDIO_CHANNEL_AUX6, 221 SPA_AUDIO_CHANNEL_AUX7, 222 SPA_AUDIO_CHANNEL_AUX8, 223 SPA_AUDIO_CHANNEL_AUX9, 224 SPA_AUDIO_CHANNEL_AUX10, 225 SPA_AUDIO_CHANNEL_AUX11, 226 SPA_AUDIO_CHANNEL_AUX12, 227 SPA_AUDIO_CHANNEL_AUX13, 228 SPA_AUDIO_CHANNEL_AUX14, 229 SPA_AUDIO_CHANNEL_AUX15, 230 SPA_AUDIO_CHANNEL_AUX16, 231 SPA_AUDIO_CHANNEL_AUX17, 232 SPA_AUDIO_CHANNEL_AUX18, 233 SPA_AUDIO_CHANNEL_AUX19, 234 SPA_AUDIO_CHANNEL_AUX20, 235 SPA_AUDIO_CHANNEL_AUX21, 236 SPA_AUDIO_CHANNEL_AUX22, 237 SPA_AUDIO_CHANNEL_AUX23, 238 SPA_AUDIO_CHANNEL_AUX24, 239 SPA_AUDIO_CHANNEL_AUX25, 240 SPA_AUDIO_CHANNEL_AUX26, 241 SPA_AUDIO_CHANNEL_AUX27, 242 SPA_AUDIO_CHANNEL_AUX28, 243 SPA_AUDIO_CHANNEL_AUX29, 244 SPA_AUDIO_CHANNEL_AUX30, 245 SPA_AUDIO_CHANNEL_AUX31, 246 SPA_AUDIO_CHANNEL_AUX32, 247 SPA_AUDIO_CHANNEL_AUX33, 248 SPA_AUDIO_CHANNEL_AUX34, 249 SPA_AUDIO_CHANNEL_AUX35, 250 SPA_AUDIO_CHANNEL_AUX36, 251 SPA_AUDIO_CHANNEL_AUX37, 252 SPA_AUDIO_CHANNEL_AUX38, 253 SPA_AUDIO_CHANNEL_AUX39, 254 SPA_AUDIO_CHANNEL_AUX40, 255 SPA_AUDIO_CHANNEL_AUX41, 256 SPA_AUDIO_CHANNEL_AUX42, 257 SPA_AUDIO_CHANNEL_AUX43, 258 SPA_AUDIO_CHANNEL_AUX44, 259 SPA_AUDIO_CHANNEL_AUX45, 260 SPA_AUDIO_CHANNEL_AUX46, 261 SPA_AUDIO_CHANNEL_AUX47, 262 SPA_AUDIO_CHANNEL_AUX48, 263 SPA_AUDIO_CHANNEL_AUX49, 264 SPA_AUDIO_CHANNEL_AUX50, 265 SPA_AUDIO_CHANNEL_AUX51, 266 SPA_AUDIO_CHANNEL_AUX52, 267 SPA_AUDIO_CHANNEL_AUX53, 268 SPA_AUDIO_CHANNEL_AUX54, 269 SPA_AUDIO_CHANNEL_AUX55, 270 SPA_AUDIO_CHANNEL_AUX56, 271 SPA_AUDIO_CHANNEL_AUX57, 272 SPA_AUDIO_CHANNEL_AUX58, 273 SPA_AUDIO_CHANNEL_AUX59, 274 SPA_AUDIO_CHANNEL_AUX60, 275 SPA_AUDIO_CHANNEL_AUX61, 276 SPA_AUDIO_CHANNEL_AUX62, 277 SPA_AUDIO_CHANNEL_AUX63, 278 279 SPA_AUDIO_CHANNEL_LAST_Aux = 0x1fff, /**< aux channels */ 280 281 SPA_AUDIO_CHANNEL_START_Custom = 0x10000, 282 }; 283 284 /** Extra audio flags */ 285 #define SPA_AUDIO_FLAG_NONE (0) /*< no valid flag */ 286 #define SPA_AUDIO_FLAG_UNPOSITIONED (1 << 0) /*< the position array explicitly 287 * contains unpositioned channels. */ 288 /** Audio information description */ 289 struct spa_audio_info_raw { 290 enum spa_audio_format format; /*< format, one of enum spa_audio_format */ 291 uint32_t flags; /*< extra flags */ 292 uint32_t rate; /*< sample rate */ 293 uint32_t channels; /*< number of channels */ 294 uint32_t position[SPA_AUDIO_MAX_CHANNELS]; /*< channel position from enum spa_audio_channel */ 295 }; 296 297 #define SPA_AUDIO_INFO_RAW_INIT(...) (struct spa_audio_info_raw) { __VA_ARGS__ } 298 299 #define SPA_KEY_AUDIO_FORMAT "audio.format" /**< an audio format as string, 300 * Ex. "S16LE" */ 301 #define SPA_KEY_AUDIO_CHANNEL "audio.channel" /**< an audio channel as string, 302 * Ex. "FL" */ 303 #define SPA_KEY_AUDIO_CHANNELS "audio.channels" /**< an audio channel count as int */ 304 #define SPA_KEY_AUDIO_RATE "audio.rate" /**< an audio sample rate as int */ 305 #define SPA_KEY_AUDIO_POSITION "audio.position" /**< channel positions as comma separated list 306 * of channels ex. "FL,FR" */ 307 #define SPA_KEY_AUDIO_ALLOWED_RATES "audio.allowed-rates" /**< a list of allowed samplerates 308 * ex. "[ 44100 48000 ]" */ 309 310 struct spa_audio_info_dsp { 311 enum spa_audio_format format; /*< format, one of the DSP formats in enum spa_audio_format_dsp */ 312 }; 313 314 #define SPA_AUDIO_INFO_DSP_INIT(...) (struct spa_audio_info_dsp) { __VA_ARGS__ } 315 316 /** 317 * \} 318 */ 319 320 #ifdef __cplusplus 321 } /* extern "C" */ 322 #endif 323 324 #endif /* SPA_AUDIO_RAW_H */ 325