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