blob: 99b5f8592e5dfe992e8fefeac6a05b6a684f8708 [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
Eric Laurentb4fae5b2016-07-07 18:58:11 -070041
Eric Laurentff0d9f02014-06-09 17:23:02 -070042#define ENCODING_INVALID 0
43#define ENCODING_DEFAULT 1
44
45
Eric Laurentb69681c2014-05-19 19:02:51 -070046
47#define CHANNEL_INVALID 0
48#define CHANNEL_OUT_DEFAULT 1
Glenn Kastenfe834d32014-01-08 14:49:08 -080049
50static inline audio_format_t audioFormatToNative(int audioFormat)
51{
52 switch (audioFormat) {
53 case ENCODING_PCM_16BIT:
54 return AUDIO_FORMAT_PCM_16_BIT;
55 case ENCODING_PCM_8BIT:
56 return AUDIO_FORMAT_PCM_8_BIT;
Glenn Kasten313f5982014-04-30 18:02:08 -070057 case ENCODING_PCM_FLOAT:
58 return AUDIO_FORMAT_PCM_FLOAT;
Eric Laurentff0d9f02014-06-09 17:23:02 -070059 case ENCODING_AC3:
60 return AUDIO_FORMAT_AC3;
61 case ENCODING_E_AC3:
62 return AUDIO_FORMAT_E_AC3;
Phil Burke12189d2015-03-31 14:38:30 -070063 case ENCODING_DTS:
64 return AUDIO_FORMAT_DTS;
65 case ENCODING_DTS_HD:
66 return AUDIO_FORMAT_DTS_HD;
Eric Laurentcae34662015-05-19 16:46:52 -070067 case ENCODING_MP3:
68 return AUDIO_FORMAT_MP3;
69 case ENCODING_AAC_LC:
70 return AUDIO_FORMAT_AAC_LC;
71 case ENCODING_AAC_HE_V1:
72 return AUDIO_FORMAT_AAC_HE_V1;
73 case ENCODING_AAC_HE_V2:
74 return AUDIO_FORMAT_AAC_HE_V2;
Phil Burk43f4b272016-01-27 15:35:20 -080075 case ENCODING_IEC61937:
76 return AUDIO_FORMAT_IEC61937;
Mikhail Naganov09725652018-10-11 15:39:40 -070077 case ENCODING_DOLBY_TRUEHD:
78 return AUDIO_FORMAT_DOLBY_TRUEHD;
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -080079 case ENCODING_AAC_ELD:
80 return AUDIO_FORMAT_AAC_ELD;
81 case ENCODING_AAC_XHE:
Jean-Michel Trivief884502018-03-07 15:02:44 -080082 return AUDIO_FORMAT_AAC_XHE;
Jean-Michel Trivi5c2aae02018-01-19 17:53:40 -080083 case ENCODING_AC4:
84 return AUDIO_FORMAT_AC4;
Mikhail Naganov6d0c5f62018-03-06 17:37:32 -080085 case ENCODING_E_AC3_JOC:
86 return AUDIO_FORMAT_E_AC3_JOC;
Eric Laurentb69681c2014-05-19 19:02:51 -070087 case ENCODING_DEFAULT:
88 return AUDIO_FORMAT_DEFAULT;
Mikhail Naganov98dbab12018-11-02 15:11:06 -070089 case ENCODING_DOLBY_MAT:
90 return AUDIO_FORMAT_MAT;
Glenn Kastenfe834d32014-01-08 14:49:08 -080091 default:
92 return AUDIO_FORMAT_INVALID;
93 }
94}
95
Eric Laurentb69681c2014-05-19 19:02:51 -070096static inline int audioFormatFromNative(audio_format_t nativeFormat)
97{
98 switch (nativeFormat) {
99 case AUDIO_FORMAT_PCM_16_BIT:
100 return ENCODING_PCM_16BIT;
101 case AUDIO_FORMAT_PCM_8_BIT:
102 return ENCODING_PCM_8BIT;
103 case AUDIO_FORMAT_PCM_FLOAT:
104 return ENCODING_PCM_FLOAT;
Paul McLean4e5e9e92015-06-17 10:10:11 -0700105
106 // map these to ENCODING_PCM_FLOAT
107 case AUDIO_FORMAT_PCM_8_24_BIT:
108 case AUDIO_FORMAT_PCM_24_BIT_PACKED:
109 case AUDIO_FORMAT_PCM_32_BIT:
110 return ENCODING_PCM_FLOAT;
111
Eric Laurentff0d9f02014-06-09 17:23:02 -0700112 case AUDIO_FORMAT_AC3:
113 return ENCODING_AC3;
114 case AUDIO_FORMAT_E_AC3:
115 return ENCODING_E_AC3;
Phil Burke12189d2015-03-31 14:38:30 -0700116 case AUDIO_FORMAT_DTS:
117 return ENCODING_DTS;
118 case AUDIO_FORMAT_DTS_HD:
119 return ENCODING_DTS_HD;
Eric Laurentcae34662015-05-19 16:46:52 -0700120 case AUDIO_FORMAT_MP3:
121 return ENCODING_MP3;
122 case AUDIO_FORMAT_AAC_LC:
123 return ENCODING_AAC_LC;
124 case AUDIO_FORMAT_AAC_HE_V1:
125 return ENCODING_AAC_HE_V1;
126 case AUDIO_FORMAT_AAC_HE_V2:
127 return ENCODING_AAC_HE_V2;
Phil Burk43f4b272016-01-27 15:35:20 -0800128 case AUDIO_FORMAT_IEC61937:
129 return ENCODING_IEC61937;
Eric Laurentb4fae5b2016-07-07 18:58:11 -0700130 case AUDIO_FORMAT_DOLBY_TRUEHD:
131 return ENCODING_DOLBY_TRUEHD;
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -0800132 case AUDIO_FORMAT_AAC_ELD:
Jean-Michel Trivi03f51392018-08-31 15:47:13 -0700133 return ENCODING_AAC_ELD;
134 case AUDIO_FORMAT_AAC_XHE:
135 return ENCODING_AAC_XHE;
Jean-Michel Trivi5c2aae02018-01-19 17:53:40 -0800136 case AUDIO_FORMAT_AC4:
137 return ENCODING_AC4;
Mikhail Naganov6d0c5f62018-03-06 17:37:32 -0800138 case AUDIO_FORMAT_E_AC3_JOC:
139 return ENCODING_E_AC3_JOC;
Mikhail Naganov98dbab12018-11-02 15:11:06 -0700140 case AUDIO_FORMAT_MAT:
141 case AUDIO_FORMAT_MAT_1_0:
142 case AUDIO_FORMAT_MAT_2_0:
143 case AUDIO_FORMAT_MAT_2_1:
144 return ENCODING_DOLBY_MAT;
Eric Laurentb69681c2014-05-19 19:02:51 -0700145 case AUDIO_FORMAT_DEFAULT:
146 return ENCODING_DEFAULT;
147 default:
148 return ENCODING_INVALID;
149 }
150}
151
Jean-Michel Trivi980d38f2018-01-08 15:43:35 -0800152// This function converts Java channel masks to a native channel mask.
153// validity should be checked with audio_is_output_channel().
154static inline audio_channel_mask_t nativeChannelMaskFromJavaChannelMasks(
155 jint channelPositionMask, jint channelIndexMask)
156{
157 // 0 is the java android.media.AudioFormat.CHANNEL_INVALID value
158 if (channelIndexMask != 0) { // channel index mask takes priority
159 // To convert to a native channel mask, the Java channel index mask
160 // requires adding the index representation.
161 return audio_channel_mask_from_representation_and_bits(
162 AUDIO_CHANNEL_REPRESENTATION_INDEX,
163 channelIndexMask);
164 }
165 // To convert to a native channel mask, the Java channel position mask
166 // requires a shift by 2 to skip the two deprecated channel
167 // configurations "default" and "mono".
168 return (audio_channel_mask_t)((uint32_t)channelPositionMask >> 2);
169}
170
Eric Laurentb69681c2014-05-19 19:02:51 -0700171static inline audio_channel_mask_t outChannelMaskToNative(int channelMask)
172{
173 switch (channelMask) {
174 case CHANNEL_OUT_DEFAULT:
175 case CHANNEL_INVALID:
176 return AUDIO_CHANNEL_NONE;
177 default:
178 return (audio_channel_mask_t)(channelMask>>2);
179 }
180}
181
182static inline int outChannelMaskFromNative(audio_channel_mask_t nativeMask)
183{
184 switch (nativeMask) {
185 case AUDIO_CHANNEL_NONE:
186 return CHANNEL_OUT_DEFAULT;
187 default:
188 return (int)nativeMask<<2;
189 }
190}
191
192static inline audio_channel_mask_t inChannelMaskToNative(int channelMask)
193{
194 return (audio_channel_mask_t)channelMask;
195}
196
197static inline int inChannelMaskFromNative(audio_channel_mask_t nativeMask)
198{
199 return (int)nativeMask;
200}
201
Glenn Kastenfe834d32014-01-08 14:49:08 -0800202#endif // ANDROID_MEDIA_AUDIOFORMAT_H