1 /*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifndef ANDROID_MEDIA_AUDIOFORMAT_H
18 #define ANDROID_MEDIA_AUDIOFORMAT_H
19
20 #include <system/audio.h>
21
22 // keep these values in sync with AudioFormat.java
23 #define ENCODING_PCM_16BIT 2
24 #define ENCODING_PCM_8BIT 3
25 #define ENCODING_PCM_FLOAT 4
26 #define ENCODING_AC3 5
27 #define ENCODING_E_AC3 6
28 #define ENCODING_DTS 7
29 #define ENCODING_DTS_HD 8
30 #define ENCODING_MP3 9
31 #define ENCODING_AAC_LC 10
32 #define ENCODING_AAC_HE_V1 11
33 #define ENCODING_AAC_HE_V2 12
34 #define ENCODING_IEC61937 13
35 #define ENCODING_DOLBY_TRUEHD 14
36 #define ENCODING_AAC_ELD 15
37 #define ENCODING_AAC_XHE 16
38 #define ENCODING_AC4 17
39 #define ENCODING_E_AC3_JOC 18
40 #define ENCODING_DOLBY_MAT 19
41 #define ENCODING_OPUS 20
42 #define ENCODING_PCM_24BIT_PACKED 21
43 #define ENCODING_PCM_32BIT 22
44 #define ENCODING_MPEGH_BL_L3 23
45 #define ENCODING_MPEGH_BL_L4 24
46 #define ENCODING_MPEGH_LC_L3 25
47 #define ENCODING_MPEGH_LC_L4 26
48 #define ENCODING_DTS_UHD_P1 27
49 #define ENCODING_DRA 28
50 #define ENCODING_DTS_HD_MA 29
51 #define ENCODING_DTS_UHD_P2 30
52 #define ENCODING_DSD 31
53 #define ENCODING_AC4_L4 32
54 #define ENCODING_IAMF_SIMPLE_PROFILE_OPUS 33
55 #define ENCODING_IAMF_SIMPLE_PROFILE_AAC 34
56 #define ENCODING_IAMF_SIMPLE_PROFILE_FLAC 35
57 #define ENCODING_IAMF_SIMPLE_PROFILE_PCM 36
58 #define ENCODING_IAMF_BASE_PROFILE_OPUS 37
59 #define ENCODING_IAMF_BASE_PROFILE_AAC 38
60 #define ENCODING_IAMF_BASE_PROFILE_FLAC 39
61 #define ENCODING_IAMF_BASE_PROFILE_PCM 40
62 #define ENCODING_IAMF_BASE_ENHANCED_PROFILE_OPUS 41
63 #define ENCODING_IAMF_BASE_ENHANCED_PROFILE_AAC 42
64 #define ENCODING_IAMF_BASE_ENHANCED_PROFILE_FLAC 43
65 #define ENCODING_IAMF_BASE_ENHANCED_PROFILE_PCM 44
66
67 #define ENCODING_INVALID 0
68 #define ENCODING_DEFAULT 1
69
70
71
72 #define CHANNEL_INVALID 0
73 #define CHANNEL_OUT_DEFAULT 1
74 #define CHANNEL_IN_DEFAULT 1
75
audioFormatToNative(int audioFormat)76 static inline audio_format_t audioFormatToNative(int audioFormat)
77 {
78 switch (audioFormat) {
79 case ENCODING_PCM_16BIT:
80 return AUDIO_FORMAT_PCM_16_BIT;
81 case ENCODING_PCM_8BIT:
82 return AUDIO_FORMAT_PCM_8_BIT;
83 case ENCODING_PCM_FLOAT:
84 return AUDIO_FORMAT_PCM_FLOAT;
85 case ENCODING_AC3:
86 return AUDIO_FORMAT_AC3;
87 case ENCODING_E_AC3:
88 return AUDIO_FORMAT_E_AC3;
89 case ENCODING_DTS:
90 return AUDIO_FORMAT_DTS;
91 case ENCODING_DTS_HD:
92 return AUDIO_FORMAT_DTS_HD;
93 case ENCODING_MP3:
94 return AUDIO_FORMAT_MP3;
95 case ENCODING_AAC_LC:
96 return AUDIO_FORMAT_AAC_LC;
97 case ENCODING_AAC_HE_V1:
98 return AUDIO_FORMAT_AAC_HE_V1;
99 case ENCODING_AAC_HE_V2:
100 return AUDIO_FORMAT_AAC_HE_V2;
101 case ENCODING_IEC61937:
102 return AUDIO_FORMAT_IEC61937;
103 case ENCODING_DOLBY_TRUEHD:
104 return AUDIO_FORMAT_DOLBY_TRUEHD;
105 case ENCODING_AAC_ELD:
106 return AUDIO_FORMAT_AAC_ELD;
107 case ENCODING_AAC_XHE:
108 return AUDIO_FORMAT_AAC_XHE;
109 case ENCODING_AC4:
110 return AUDIO_FORMAT_AC4;
111 case ENCODING_AC4_L4:
112 return AUDIO_FORMAT_AC4_L4;
113 case ENCODING_E_AC3_JOC:
114 return AUDIO_FORMAT_E_AC3_JOC;
115 case ENCODING_DEFAULT:
116 return AUDIO_FORMAT_DEFAULT;
117 case ENCODING_DOLBY_MAT:
118 return AUDIO_FORMAT_MAT;
119 case ENCODING_OPUS:
120 return AUDIO_FORMAT_OPUS;
121 case ENCODING_PCM_24BIT_PACKED:
122 return AUDIO_FORMAT_PCM_24_BIT_PACKED;
123 case ENCODING_PCM_32BIT:
124 return AUDIO_FORMAT_PCM_32_BIT;
125 case ENCODING_MPEGH_BL_L3:
126 return AUDIO_FORMAT_MPEGH_BL_L3;
127 case ENCODING_MPEGH_BL_L4:
128 return AUDIO_FORMAT_MPEGH_BL_L4;
129 case ENCODING_MPEGH_LC_L3:
130 return AUDIO_FORMAT_MPEGH_LC_L3;
131 case ENCODING_MPEGH_LC_L4:
132 return AUDIO_FORMAT_MPEGH_LC_L4;
133 case ENCODING_DTS_UHD_P1:
134 return AUDIO_FORMAT_DTS_UHD;
135 case ENCODING_DRA:
136 return AUDIO_FORMAT_DRA;
137 case ENCODING_DTS_HD_MA:
138 return AUDIO_FORMAT_DTS_HD_MA;
139 case ENCODING_DTS_UHD_P2:
140 return AUDIO_FORMAT_DTS_UHD_P2;
141 case ENCODING_DSD:
142 return AUDIO_FORMAT_DSD;
143 case ENCODING_IAMF_SIMPLE_PROFILE_OPUS:
144 return AUDIO_FORMAT_IAMF_SIMPLE_OPUS;
145 case ENCODING_IAMF_SIMPLE_PROFILE_AAC:
146 return AUDIO_FORMAT_IAMF_SIMPLE_AAC;
147 case ENCODING_IAMF_SIMPLE_PROFILE_FLAC:
148 return AUDIO_FORMAT_IAMF_SIMPLE_FLAC;
149 case ENCODING_IAMF_SIMPLE_PROFILE_PCM:
150 return AUDIO_FORMAT_IAMF_SIMPLE_PCM;
151 case ENCODING_IAMF_BASE_PROFILE_OPUS:
152 return AUDIO_FORMAT_IAMF_BASE_OPUS;
153 case ENCODING_IAMF_BASE_PROFILE_AAC:
154 return AUDIO_FORMAT_IAMF_BASE_AAC;
155 case ENCODING_IAMF_BASE_PROFILE_FLAC:
156 return AUDIO_FORMAT_IAMF_BASE_FLAC;
157 case ENCODING_IAMF_BASE_PROFILE_PCM:
158 return AUDIO_FORMAT_IAMF_BASE_PCM;
159 case ENCODING_IAMF_BASE_ENHANCED_PROFILE_OPUS:
160 return AUDIO_FORMAT_IAMF_BASE_ENHANCED_OPUS;
161 case ENCODING_IAMF_BASE_ENHANCED_PROFILE_AAC:
162 return AUDIO_FORMAT_IAMF_BASE_ENHANCED_AAC;
163 case ENCODING_IAMF_BASE_ENHANCED_PROFILE_FLAC:
164 return AUDIO_FORMAT_IAMF_BASE_ENHANCED_FLAC;
165 case ENCODING_IAMF_BASE_ENHANCED_PROFILE_PCM:
166 return AUDIO_FORMAT_IAMF_BASE_ENHANCED_PCM;
167 default:
168 return AUDIO_FORMAT_INVALID;
169 }
170 }
171
audioFormatFromNative(audio_format_t nativeFormat)172 static inline int audioFormatFromNative(audio_format_t nativeFormat)
173 {
174 switch (nativeFormat) {
175 case AUDIO_FORMAT_PCM_16_BIT:
176 return ENCODING_PCM_16BIT;
177 case AUDIO_FORMAT_PCM_8_BIT:
178 return ENCODING_PCM_8BIT;
179 case AUDIO_FORMAT_PCM_FLOAT:
180 return ENCODING_PCM_FLOAT;
181
182 // As of S, these extend integer precision formats now return more specific values
183 // than ENCODING_PCM_FLOAT.
184 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
185 return ENCODING_PCM_24BIT_PACKED;
186 case AUDIO_FORMAT_PCM_32_BIT:
187 return ENCODING_PCM_32BIT;
188
189 // map this to ENCODING_PCM_FLOAT
190 case AUDIO_FORMAT_PCM_8_24_BIT:
191 return ENCODING_PCM_FLOAT;
192
193 case AUDIO_FORMAT_AC3:
194 return ENCODING_AC3;
195 case AUDIO_FORMAT_E_AC3:
196 return ENCODING_E_AC3;
197 case AUDIO_FORMAT_DTS:
198 return ENCODING_DTS;
199 case AUDIO_FORMAT_DTS_HD:
200 return ENCODING_DTS_HD;
201 case AUDIO_FORMAT_MP3:
202 return ENCODING_MP3;
203 case AUDIO_FORMAT_AAC_LC:
204 return ENCODING_AAC_LC;
205 case AUDIO_FORMAT_AAC_HE_V1:
206 return ENCODING_AAC_HE_V1;
207 case AUDIO_FORMAT_AAC_HE_V2:
208 return ENCODING_AAC_HE_V2;
209 case AUDIO_FORMAT_IEC61937:
210 return ENCODING_IEC61937;
211 case AUDIO_FORMAT_DOLBY_TRUEHD:
212 return ENCODING_DOLBY_TRUEHD;
213 case AUDIO_FORMAT_AAC_ELD:
214 return ENCODING_AAC_ELD;
215 case AUDIO_FORMAT_AAC_XHE:
216 return ENCODING_AAC_XHE;
217 case AUDIO_FORMAT_AC4:
218 return ENCODING_AC4;
219 case AUDIO_FORMAT_AC4_L4:
220 return ENCODING_AC4_L4;
221 case AUDIO_FORMAT_E_AC3_JOC:
222 return ENCODING_E_AC3_JOC;
223 case AUDIO_FORMAT_MAT:
224 case AUDIO_FORMAT_MAT_1_0:
225 case AUDIO_FORMAT_MAT_2_0:
226 case AUDIO_FORMAT_MAT_2_1:
227 return ENCODING_DOLBY_MAT;
228 case AUDIO_FORMAT_OPUS:
229 return ENCODING_OPUS;
230 case AUDIO_FORMAT_MPEGH_BL_L3:
231 return ENCODING_MPEGH_BL_L3;
232 case AUDIO_FORMAT_MPEGH_BL_L4:
233 return ENCODING_MPEGH_BL_L4;
234 case AUDIO_FORMAT_MPEGH_LC_L3:
235 return ENCODING_MPEGH_LC_L3;
236 case AUDIO_FORMAT_MPEGH_LC_L4:
237 return ENCODING_MPEGH_LC_L4;
238 case AUDIO_FORMAT_DTS_UHD:
239 return ENCODING_DTS_UHD_P1;
240 case AUDIO_FORMAT_DRA:
241 return ENCODING_DRA;
242 case AUDIO_FORMAT_DTS_HD_MA:
243 return ENCODING_DTS_HD_MA;
244 case AUDIO_FORMAT_DTS_UHD_P2:
245 return ENCODING_DTS_UHD_P2;
246 case AUDIO_FORMAT_DEFAULT:
247 return ENCODING_DEFAULT;
248 case AUDIO_FORMAT_DSD:
249 return ENCODING_DSD;
250 case AUDIO_FORMAT_IAMF_SIMPLE_OPUS:
251 return ENCODING_IAMF_SIMPLE_PROFILE_OPUS;
252 case AUDIO_FORMAT_IAMF_SIMPLE_AAC:
253 return ENCODING_IAMF_SIMPLE_PROFILE_AAC;
254 case AUDIO_FORMAT_IAMF_SIMPLE_FLAC:
255 return ENCODING_IAMF_SIMPLE_PROFILE_FLAC;
256 case AUDIO_FORMAT_IAMF_SIMPLE_PCM:
257 return ENCODING_IAMF_SIMPLE_PROFILE_PCM;
258 case AUDIO_FORMAT_IAMF_BASE_OPUS:
259 return ENCODING_IAMF_BASE_PROFILE_OPUS;
260 case AUDIO_FORMAT_IAMF_BASE_AAC:
261 return ENCODING_IAMF_BASE_PROFILE_AAC;
262 case AUDIO_FORMAT_IAMF_BASE_FLAC:
263 return ENCODING_IAMF_BASE_PROFILE_FLAC;
264 case AUDIO_FORMAT_IAMF_BASE_PCM:
265 return ENCODING_IAMF_BASE_PROFILE_PCM;
266 case AUDIO_FORMAT_IAMF_BASE_ENHANCED_OPUS:
267 return ENCODING_IAMF_BASE_ENHANCED_PROFILE_OPUS;
268 case AUDIO_FORMAT_IAMF_BASE_ENHANCED_AAC:
269 return ENCODING_IAMF_BASE_ENHANCED_PROFILE_AAC;
270 case AUDIO_FORMAT_IAMF_BASE_ENHANCED_FLAC:
271 return ENCODING_IAMF_BASE_ENHANCED_PROFILE_FLAC;
272 case AUDIO_FORMAT_IAMF_BASE_ENHANCED_PCM:
273 return ENCODING_IAMF_BASE_ENHANCED_PROFILE_PCM;
274 default:
275 return ENCODING_INVALID;
276 }
277 }
278
279 // This function converts Java channel masks to a native channel mask.
280 // validity should be checked with audio_is_output_channel().
nativeChannelMaskFromJavaChannelMasks(jint channelPositionMask,jint channelIndexMask)281 static inline audio_channel_mask_t nativeChannelMaskFromJavaChannelMasks(
282 jint channelPositionMask, jint channelIndexMask)
283 {
284 // 0 is the java android.media.AudioFormat.CHANNEL_INVALID value
285 if (channelIndexMask != 0) { // channel index mask takes priority
286 // To convert to a native channel mask, the Java channel index mask
287 // requires adding the index representation.
288 return audio_channel_mask_from_representation_and_bits(
289 AUDIO_CHANNEL_REPRESENTATION_INDEX,
290 channelIndexMask);
291 }
292 // To convert to a native channel mask, the Java channel position mask
293 // requires a shift by 2 to skip the two deprecated channel
294 // configurations "default" and "mono".
295 return (audio_channel_mask_t)((uint32_t)channelPositionMask >> 2);
296 }
297
outChannelMaskToNative(int channelMask)298 static inline audio_channel_mask_t outChannelMaskToNative(int channelMask)
299 {
300 switch (channelMask) {
301 case CHANNEL_OUT_DEFAULT:
302 case CHANNEL_INVALID:
303 return AUDIO_CHANNEL_NONE;
304 default:
305 return (audio_channel_mask_t)(channelMask>>2);
306 }
307 }
308
outChannelMaskFromNative(audio_channel_mask_t nativeMask)309 static inline int outChannelMaskFromNative(audio_channel_mask_t nativeMask)
310 {
311 switch (nativeMask) {
312 case AUDIO_CHANNEL_NONE:
313 return CHANNEL_OUT_DEFAULT;
314 default:
315 return (int)nativeMask<<2;
316 }
317 }
318
inChannelMaskToNative(int channelMask)319 static inline audio_channel_mask_t inChannelMaskToNative(int channelMask)
320 {
321 switch (channelMask) {
322 case CHANNEL_IN_DEFAULT:
323 return AUDIO_CHANNEL_NONE;
324 default:
325 return (audio_channel_mask_t)channelMask;
326 }
327 }
328
inChannelMaskFromNative(audio_channel_mask_t nativeMask)329 static inline int inChannelMaskFromNative(audio_channel_mask_t nativeMask)
330 {
331 switch (nativeMask) {
332 case AUDIO_CHANNEL_NONE:
333 return CHANNEL_IN_DEFAULT;
334 default:
335 return (int)nativeMask;
336 }
337 }
338
339 #endif // ANDROID_MEDIA_AUDIOFORMAT_H
340