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