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 27
49 #define ENCODING_DRA 28
50
51 #define ENCODING_INVALID 0
52 #define ENCODING_DEFAULT 1
53
54
55
56 #define CHANNEL_INVALID 0
57 #define CHANNEL_OUT_DEFAULT 1
58 #define CHANNEL_IN_DEFAULT 1
59
audioFormatToNative(int audioFormat)60 static inline audio_format_t audioFormatToNative(int audioFormat)
61 {
62 switch (audioFormat) {
63 case ENCODING_PCM_16BIT:
64 return AUDIO_FORMAT_PCM_16_BIT;
65 case ENCODING_PCM_8BIT:
66 return AUDIO_FORMAT_PCM_8_BIT;
67 case ENCODING_PCM_FLOAT:
68 return AUDIO_FORMAT_PCM_FLOAT;
69 case ENCODING_AC3:
70 return AUDIO_FORMAT_AC3;
71 case ENCODING_E_AC3:
72 return AUDIO_FORMAT_E_AC3;
73 case ENCODING_DTS:
74 return AUDIO_FORMAT_DTS;
75 case ENCODING_DTS_HD:
76 return AUDIO_FORMAT_DTS_HD;
77 case ENCODING_MP3:
78 return AUDIO_FORMAT_MP3;
79 case ENCODING_AAC_LC:
80 return AUDIO_FORMAT_AAC_LC;
81 case ENCODING_AAC_HE_V1:
82 return AUDIO_FORMAT_AAC_HE_V1;
83 case ENCODING_AAC_HE_V2:
84 return AUDIO_FORMAT_AAC_HE_V2;
85 case ENCODING_IEC61937:
86 return AUDIO_FORMAT_IEC61937;
87 case ENCODING_DOLBY_TRUEHD:
88 return AUDIO_FORMAT_DOLBY_TRUEHD;
89 case ENCODING_AAC_ELD:
90 return AUDIO_FORMAT_AAC_ELD;
91 case ENCODING_AAC_XHE:
92 return AUDIO_FORMAT_AAC_XHE;
93 case ENCODING_AC4:
94 return AUDIO_FORMAT_AC4;
95 case ENCODING_E_AC3_JOC:
96 return AUDIO_FORMAT_E_AC3_JOC;
97 case ENCODING_DEFAULT:
98 return AUDIO_FORMAT_DEFAULT;
99 case ENCODING_DOLBY_MAT:
100 return AUDIO_FORMAT_MAT;
101 case ENCODING_OPUS:
102 return AUDIO_FORMAT_OPUS;
103 case ENCODING_PCM_24BIT_PACKED:
104 return AUDIO_FORMAT_PCM_24_BIT_PACKED;
105 case ENCODING_PCM_32BIT:
106 return AUDIO_FORMAT_PCM_32_BIT;
107 case ENCODING_MPEGH_BL_L3:
108 return AUDIO_FORMAT_MPEGH_BL_L3;
109 case ENCODING_MPEGH_BL_L4:
110 return AUDIO_FORMAT_MPEGH_BL_L4;
111 case ENCODING_MPEGH_LC_L3:
112 return AUDIO_FORMAT_MPEGH_LC_L3;
113 case ENCODING_MPEGH_LC_L4:
114 return AUDIO_FORMAT_MPEGH_LC_L4;
115 case ENCODING_DTS_UHD:
116 return AUDIO_FORMAT_DTS_UHD;
117 case ENCODING_DRA:
118 return AUDIO_FORMAT_DRA;
119 default:
120 return AUDIO_FORMAT_INVALID;
121 }
122 }
123
audioFormatFromNative(audio_format_t nativeFormat)124 static inline int audioFormatFromNative(audio_format_t nativeFormat)
125 {
126 switch (nativeFormat) {
127 case AUDIO_FORMAT_PCM_16_BIT:
128 return ENCODING_PCM_16BIT;
129 case AUDIO_FORMAT_PCM_8_BIT:
130 return ENCODING_PCM_8BIT;
131 case AUDIO_FORMAT_PCM_FLOAT:
132 return ENCODING_PCM_FLOAT;
133
134 // As of S, these extend integer precision formats now return more specific values
135 // than ENCODING_PCM_FLOAT.
136 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
137 return ENCODING_PCM_24BIT_PACKED;
138 case AUDIO_FORMAT_PCM_32_BIT:
139 return ENCODING_PCM_32BIT;
140
141 // map this to ENCODING_PCM_FLOAT
142 case AUDIO_FORMAT_PCM_8_24_BIT:
143 return ENCODING_PCM_FLOAT;
144
145 case AUDIO_FORMAT_AC3:
146 return ENCODING_AC3;
147 case AUDIO_FORMAT_E_AC3:
148 return ENCODING_E_AC3;
149 case AUDIO_FORMAT_DTS:
150 return ENCODING_DTS;
151 case AUDIO_FORMAT_DTS_HD:
152 return ENCODING_DTS_HD;
153 case AUDIO_FORMAT_MP3:
154 return ENCODING_MP3;
155 case AUDIO_FORMAT_AAC_LC:
156 return ENCODING_AAC_LC;
157 case AUDIO_FORMAT_AAC_HE_V1:
158 return ENCODING_AAC_HE_V1;
159 case AUDIO_FORMAT_AAC_HE_V2:
160 return ENCODING_AAC_HE_V2;
161 case AUDIO_FORMAT_IEC61937:
162 return ENCODING_IEC61937;
163 case AUDIO_FORMAT_DOLBY_TRUEHD:
164 return ENCODING_DOLBY_TRUEHD;
165 case AUDIO_FORMAT_AAC_ELD:
166 return ENCODING_AAC_ELD;
167 case AUDIO_FORMAT_AAC_XHE:
168 return ENCODING_AAC_XHE;
169 case AUDIO_FORMAT_AC4:
170 return ENCODING_AC4;
171 case AUDIO_FORMAT_E_AC3_JOC:
172 return ENCODING_E_AC3_JOC;
173 case AUDIO_FORMAT_MAT:
174 case AUDIO_FORMAT_MAT_1_0:
175 case AUDIO_FORMAT_MAT_2_0:
176 case AUDIO_FORMAT_MAT_2_1:
177 return ENCODING_DOLBY_MAT;
178 case AUDIO_FORMAT_OPUS:
179 return ENCODING_OPUS;
180 case AUDIO_FORMAT_MPEGH_BL_L3:
181 return ENCODING_MPEGH_BL_L3;
182 case AUDIO_FORMAT_MPEGH_BL_L4:
183 return ENCODING_MPEGH_BL_L4;
184 case AUDIO_FORMAT_MPEGH_LC_L3:
185 return ENCODING_MPEGH_LC_L3;
186 case AUDIO_FORMAT_MPEGH_LC_L4:
187 return ENCODING_MPEGH_LC_L4;
188 case AUDIO_FORMAT_DTS_UHD:
189 return ENCODING_DTS_UHD;
190 case AUDIO_FORMAT_DRA:
191 return ENCODING_DRA;
192 case AUDIO_FORMAT_DEFAULT:
193 return ENCODING_DEFAULT;
194 default:
195 return ENCODING_INVALID;
196 }
197 }
198
199 // This function converts Java channel masks to a native channel mask.
200 // validity should be checked with audio_is_output_channel().
nativeChannelMaskFromJavaChannelMasks(jint channelPositionMask,jint channelIndexMask)201 static inline audio_channel_mask_t nativeChannelMaskFromJavaChannelMasks(
202 jint channelPositionMask, jint channelIndexMask)
203 {
204 // 0 is the java android.media.AudioFormat.CHANNEL_INVALID value
205 if (channelIndexMask != 0) { // channel index mask takes priority
206 // To convert to a native channel mask, the Java channel index mask
207 // requires adding the index representation.
208 return audio_channel_mask_from_representation_and_bits(
209 AUDIO_CHANNEL_REPRESENTATION_INDEX,
210 channelIndexMask);
211 }
212 // To convert to a native channel mask, the Java channel position mask
213 // requires a shift by 2 to skip the two deprecated channel
214 // configurations "default" and "mono".
215 return (audio_channel_mask_t)((uint32_t)channelPositionMask >> 2);
216 }
217
outChannelMaskToNative(int channelMask)218 static inline audio_channel_mask_t outChannelMaskToNative(int channelMask)
219 {
220 switch (channelMask) {
221 case CHANNEL_OUT_DEFAULT:
222 case CHANNEL_INVALID:
223 return AUDIO_CHANNEL_NONE;
224 default:
225 return (audio_channel_mask_t)(channelMask>>2);
226 }
227 }
228
outChannelMaskFromNative(audio_channel_mask_t nativeMask)229 static inline int outChannelMaskFromNative(audio_channel_mask_t nativeMask)
230 {
231 switch (nativeMask) {
232 case AUDIO_CHANNEL_NONE:
233 return CHANNEL_OUT_DEFAULT;
234 default:
235 return (int)nativeMask<<2;
236 }
237 }
238
inChannelMaskToNative(int channelMask)239 static inline audio_channel_mask_t inChannelMaskToNative(int channelMask)
240 {
241 switch (channelMask) {
242 case CHANNEL_IN_DEFAULT:
243 return AUDIO_CHANNEL_NONE;
244 default:
245 return (audio_channel_mask_t)channelMask;
246 }
247 }
248
inChannelMaskFromNative(audio_channel_mask_t nativeMask)249 static inline int inChannelMaskFromNative(audio_channel_mask_t nativeMask)
250 {
251 switch (nativeMask) {
252 case AUDIO_CHANNEL_NONE:
253 return CHANNEL_IN_DEFAULT;
254 default:
255 return (int)nativeMask;
256 }
257 }
258
259 #endif // ANDROID_MEDIA_AUDIOFORMAT_H
260