blob: 8bbb7605028186db68ead02696fa2772a3275cb3 [file] [log] [blame]
Glenn Kastenfe834d32014-01-08 14:49:08 -08001/*
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
Eric Laurentb4fae5b2016-07-07 18:58:11 -070023#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
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -080036#define ENCODING_AAC_ELD 15
37#define ENCODING_AAC_XHE 16
Jean-Michel Trivi5c2aae02018-01-19 17:53:40 -080038#define ENCODING_AC4 17
Mikhail Naganov43a8ebb2018-01-24 09:21:38 -080039#define ENCODING_E_AC3_JOC 18
Mikhail Naganov98dbab12018-11-02 15:11:06 -070040#define ENCODING_DOLBY_MAT 19
Kevin Rocard3ae06322019-12-19 12:18:57 +000041#define ENCODING_OPUS 20
Eric Laurentb4fae5b2016-07-07 18:58:11 -070042
Preetam Singh Ranawat78c44872015-08-11 10:32:57 -070043#define ENCODING_AMR_NB 100
44#define ENCODING_AMR_WB 101
45#define ENCODING_EVRC 102
46#define ENCODING_EVRC_B 103
47#define ENCODING_EVRC_WB 104
48#define ENCODING_EVRC_NW 105
49
Eric Laurentff0d9f02014-06-09 17:23:02 -070050#define ENCODING_INVALID 0
51#define ENCODING_DEFAULT 1
52
53
Eric Laurentb69681c2014-05-19 19:02:51 -070054
55#define CHANNEL_INVALID 0
56#define CHANNEL_OUT_DEFAULT 1
Hayden Gomese2ba47f2020-06-12 13:43:08 -070057#define CHANNEL_IN_DEFAULT 1
Glenn Kastenfe834d32014-01-08 14:49:08 -080058
59static inline audio_format_t audioFormatToNative(int audioFormat)
60{
61 switch (audioFormat) {
62 case ENCODING_PCM_16BIT:
63 return AUDIO_FORMAT_PCM_16_BIT;
64 case ENCODING_PCM_8BIT:
65 return AUDIO_FORMAT_PCM_8_BIT;
Glenn Kasten313f5982014-04-30 18:02:08 -070066 case ENCODING_PCM_FLOAT:
67 return AUDIO_FORMAT_PCM_FLOAT;
Eric Laurentff0d9f02014-06-09 17:23:02 -070068 case ENCODING_AC3:
69 return AUDIO_FORMAT_AC3;
70 case ENCODING_E_AC3:
71 return AUDIO_FORMAT_E_AC3;
Phil Burke12189d2015-03-31 14:38:30 -070072 case ENCODING_DTS:
73 return AUDIO_FORMAT_DTS;
74 case ENCODING_DTS_HD:
75 return AUDIO_FORMAT_DTS_HD;
Eric Laurentcae34662015-05-19 16:46:52 -070076 case ENCODING_MP3:
77 return AUDIO_FORMAT_MP3;
78 case ENCODING_AAC_LC:
79 return AUDIO_FORMAT_AAC_LC;
80 case ENCODING_AAC_HE_V1:
81 return AUDIO_FORMAT_AAC_HE_V1;
82 case ENCODING_AAC_HE_V2:
83 return AUDIO_FORMAT_AAC_HE_V2;
Phil Burk43f4b272016-01-27 15:35:20 -080084 case ENCODING_IEC61937:
85 return AUDIO_FORMAT_IEC61937;
Mikhail Naganov09725652018-10-11 15:39:40 -070086 case ENCODING_DOLBY_TRUEHD:
87 return AUDIO_FORMAT_DOLBY_TRUEHD;
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -080088 case ENCODING_AAC_ELD:
89 return AUDIO_FORMAT_AAC_ELD;
90 case ENCODING_AAC_XHE:
Jean-Michel Trivief884502018-03-07 15:02:44 -080091 return AUDIO_FORMAT_AAC_XHE;
Jean-Michel Trivi5c2aae02018-01-19 17:53:40 -080092 case ENCODING_AC4:
93 return AUDIO_FORMAT_AC4;
Mikhail Naganov43a8ebb2018-01-24 09:21:38 -080094 // case ENCODING_E_AC3_JOC: // FIXME Not defined on the native side yet
95 // return AUDIO_FORMAT_E_AC3_JOC;
Preetam Singh Ranawat78c44872015-08-11 10:32:57 -070096 case ENCODING_AMR_NB:
97 return AUDIO_FORMAT_AMR_NB;
98 case ENCODING_AMR_WB:
99 return AUDIO_FORMAT_AMR_WB;
100 case ENCODING_EVRC:
101 return AUDIO_FORMAT_EVRC;
102 case ENCODING_EVRC_B:
103 return AUDIO_FORMAT_EVRCB;
104 case ENCODING_EVRC_WB:
105 return AUDIO_FORMAT_EVRCWB;
106 case ENCODING_EVRC_NW:
107 return AUDIO_FORMAT_EVRCNW;
Mikhail Naganov6d0c5f62018-03-06 17:37:32 -0800108 case ENCODING_E_AC3_JOC:
109 return AUDIO_FORMAT_E_AC3_JOC;
Eric Laurentb69681c2014-05-19 19:02:51 -0700110 case ENCODING_DEFAULT:
111 return AUDIO_FORMAT_DEFAULT;
Mikhail Naganov98dbab12018-11-02 15:11:06 -0700112 case ENCODING_DOLBY_MAT:
113 return AUDIO_FORMAT_MAT;
Kevin Rocard3ae06322019-12-19 12:18:57 +0000114 case ENCODING_OPUS:
115 return AUDIO_FORMAT_OPUS;
Glenn Kastenfe834d32014-01-08 14:49:08 -0800116 default:
117 return AUDIO_FORMAT_INVALID;
118 }
119}
120
Eric Laurentb69681c2014-05-19 19:02:51 -0700121static inline int audioFormatFromNative(audio_format_t nativeFormat)
122{
123 switch (nativeFormat) {
124 case AUDIO_FORMAT_PCM_16_BIT:
125 return ENCODING_PCM_16BIT;
126 case AUDIO_FORMAT_PCM_8_BIT:
127 return ENCODING_PCM_8BIT;
128 case AUDIO_FORMAT_PCM_FLOAT:
129 return ENCODING_PCM_FLOAT;
Paul McLean4e5e9e92015-06-17 10:10:11 -0700130
131 // map these to ENCODING_PCM_FLOAT
132 case AUDIO_FORMAT_PCM_8_24_BIT:
133 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
134 case AUDIO_FORMAT_PCM_32_BIT:
135 return ENCODING_PCM_FLOAT;
136
Eric Laurentff0d9f02014-06-09 17:23:02 -0700137 case AUDIO_FORMAT_AC3:
138 return ENCODING_AC3;
139 case AUDIO_FORMAT_E_AC3:
140 return ENCODING_E_AC3;
Phil Burke12189d2015-03-31 14:38:30 -0700141 case AUDIO_FORMAT_DTS:
142 return ENCODING_DTS;
143 case AUDIO_FORMAT_DTS_HD:
144 return ENCODING_DTS_HD;
Eric Laurentcae34662015-05-19 16:46:52 -0700145 case AUDIO_FORMAT_MP3:
146 return ENCODING_MP3;
147 case AUDIO_FORMAT_AAC_LC:
148 return ENCODING_AAC_LC;
149 case AUDIO_FORMAT_AAC_HE_V1:
150 return ENCODING_AAC_HE_V1;
151 case AUDIO_FORMAT_AAC_HE_V2:
152 return ENCODING_AAC_HE_V2;
Phil Burk43f4b272016-01-27 15:35:20 -0800153 case AUDIO_FORMAT_IEC61937:
154 return ENCODING_IEC61937;
Eric Laurentb4fae5b2016-07-07 18:58:11 -0700155 case AUDIO_FORMAT_DOLBY_TRUEHD:
156 return ENCODING_DOLBY_TRUEHD;
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -0800157 case AUDIO_FORMAT_AAC_ELD:
Jean-Michel Trivi03f51392018-08-31 15:47:13 -0700158 return ENCODING_AAC_ELD;
159 case AUDIO_FORMAT_AAC_XHE:
160 return ENCODING_AAC_XHE;
Jean-Michel Trivi5c2aae02018-01-19 17:53:40 -0800161 case AUDIO_FORMAT_AC4:
162 return ENCODING_AC4;
Mikhail Naganov43a8ebb2018-01-24 09:21:38 -0800163 // case AUDIO_FORMAT_E_AC3_JOC: // FIXME Not defined on the native side yet
164 // return ENCODING_E_AC3_JOC;
Preetam Singh Ranawat78c44872015-08-11 10:32:57 -0700165 case AUDIO_FORMAT_AMR_NB:
166 return ENCODING_AMR_NB;
167 case AUDIO_FORMAT_AMR_WB:
168 return ENCODING_AMR_WB;
169 case AUDIO_FORMAT_EVRC:
170 return ENCODING_EVRC;
171 case AUDIO_FORMAT_EVRCB:
172 return ENCODING_EVRC_B;
173 case AUDIO_FORMAT_EVRCWB:
174 return ENCODING_EVRC_WB;
175 case AUDIO_FORMAT_EVRCNW:
176 return ENCODING_EVRC_NW;
Mikhail Naganov6d0c5f62018-03-06 17:37:32 -0800177 case AUDIO_FORMAT_E_AC3_JOC:
178 return ENCODING_E_AC3_JOC;
Mikhail Naganov98dbab12018-11-02 15:11:06 -0700179 case AUDIO_FORMAT_MAT:
180 case AUDIO_FORMAT_MAT_1_0:
181 case AUDIO_FORMAT_MAT_2_0:
182 case AUDIO_FORMAT_MAT_2_1:
183 return ENCODING_DOLBY_MAT;
Kevin Rocard3ae06322019-12-19 12:18:57 +0000184 case AUDIO_FORMAT_OPUS:
185 return ENCODING_OPUS;
Eric Laurentb69681c2014-05-19 19:02:51 -0700186 case AUDIO_FORMAT_DEFAULT:
187 return ENCODING_DEFAULT;
188 default:
189 return ENCODING_INVALID;
190 }
191}
192
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -0800193// This function converts Java channel masks to a native channel mask.
194// validity should be checked with audio_is_output_channel().
195static inline audio_channel_mask_t nativeChannelMaskFromJavaChannelMasks(
196 jint channelPositionMask, jint channelIndexMask)
197{
198 // 0 is the java android.media.AudioFormat.CHANNEL_INVALID value
199 if (channelIndexMask != 0) { // channel index mask takes priority
200 // To convert to a native channel mask, the Java channel index mask
201 // requires adding the index representation.
202 return audio_channel_mask_from_representation_and_bits(
203 AUDIO_CHANNEL_REPRESENTATION_INDEX,
204 channelIndexMask);
205 }
206 // To convert to a native channel mask, the Java channel position mask
207 // requires a shift by 2 to skip the two deprecated channel
208 // configurations "default" and "mono".
209 return (audio_channel_mask_t)((uint32_t)channelPositionMask >> 2);
210}
211
Eric Laurentb69681c2014-05-19 19:02:51 -0700212static inline audio_channel_mask_t outChannelMaskToNative(int channelMask)
213{
214 switch (channelMask) {
215 case CHANNEL_OUT_DEFAULT:
216 case CHANNEL_INVALID:
217 return AUDIO_CHANNEL_NONE;
218 default:
219 return (audio_channel_mask_t)(channelMask>>2);
220 }
221}
222
223static inline int outChannelMaskFromNative(audio_channel_mask_t nativeMask)
224{
225 switch (nativeMask) {
226 case AUDIO_CHANNEL_NONE:
227 return CHANNEL_OUT_DEFAULT;
228 default:
229 return (int)nativeMask<<2;
230 }
231}
232
233static inline audio_channel_mask_t inChannelMaskToNative(int channelMask)
234{
Hayden Gomese2ba47f2020-06-12 13:43:08 -0700235 switch (channelMask) {
236 case CHANNEL_IN_DEFAULT:
237 return AUDIO_CHANNEL_NONE;
238 default:
239 return (audio_channel_mask_t)channelMask;
240 }
Eric Laurentb69681c2014-05-19 19:02:51 -0700241}
242
243static inline int inChannelMaskFromNative(audio_channel_mask_t nativeMask)
244{
Hayden Gomese2ba47f2020-06-12 13:43:08 -0700245 switch (nativeMask) {
246 case AUDIO_CHANNEL_NONE:
247 return CHANNEL_IN_DEFAULT;
248 default:
249 return (int)nativeMask;
250 }
Eric Laurentb69681c2014-05-19 19:02:51 -0700251}
252
Glenn Kastenfe834d32014-01-08 14:49:08 -0800253#endif // ANDROID_MEDIA_AUDIOFORMAT_H