1fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten/*
2fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * Copyright (C) 2014 The Android Open Source Project
3fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten *
4fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * you may not use this file except in compliance with the License.
6fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * You may obtain a copy of the License at
7fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten *
8fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten *
10fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * See the License for the specific language governing permissions and
14fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten * limitations under the License.
15fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten */
16fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten
17fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten#ifndef ANDROID_MEDIA_AUDIOFORMAT_H
18fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten#define ANDROID_MEDIA_AUDIOFORMAT_H
19fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten
20fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten#include <system/audio.h>
21fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten
22fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten// keep these values in sync with AudioFormat.java
23b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_PCM_16BIT      2
24b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_PCM_8BIT       3
25b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_PCM_FLOAT      4
26b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_AC3            5
27b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_E_AC3          6
28b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_DTS            7
29b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_DTS_HD         8
30b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_MP3            9
31b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_AAC_LC         10
32b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_AAC_HE_V1      11
33b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_AAC_HE_V2      12
34b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_IEC61937       13
35b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent#define ENCODING_DOLBY_TRUEHD   14
36b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent
37ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent#define ENCODING_INVALID    0
38ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent#define ENCODING_DEFAULT    1
39ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent
40ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent
41b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent
42b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent#define CHANNEL_INVALID 0
43b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent#define CHANNEL_OUT_DEFAULT 1
44fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten
45fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kastenstatic inline audio_format_t audioFormatToNative(int audioFormat)
46fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten{
47fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten    switch (audioFormat) {
48fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten    case ENCODING_PCM_16BIT:
49fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten        return AUDIO_FORMAT_PCM_16_BIT;
50fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten    case ENCODING_PCM_8BIT:
51fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten        return AUDIO_FORMAT_PCM_8_BIT;
52313f59887b1439fa2f39dbf3578407c52fcbf60dGlenn Kasten    case ENCODING_PCM_FLOAT:
53313f59887b1439fa2f39dbf3578407c52fcbf60dGlenn Kasten        return AUDIO_FORMAT_PCM_FLOAT;
54ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent    case ENCODING_AC3:
55ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent        return AUDIO_FORMAT_AC3;
56ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent    case ENCODING_E_AC3:
57ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent        return AUDIO_FORMAT_E_AC3;
58e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk    case ENCODING_DTS:
59e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk        return AUDIO_FORMAT_DTS;
60e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk    case ENCODING_DTS_HD:
61e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk        return AUDIO_FORMAT_DTS_HD;
62cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case ENCODING_MP3:
63cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return AUDIO_FORMAT_MP3;
64cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case ENCODING_AAC_LC:
65cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return AUDIO_FORMAT_AAC_LC;
66cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case ENCODING_AAC_HE_V1:
67cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return AUDIO_FORMAT_AAC_HE_V1;
68cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case ENCODING_AAC_HE_V2:
69cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return AUDIO_FORMAT_AAC_HE_V2;
70b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent    case ENCODING_DOLBY_TRUEHD:
71b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent        return AUDIO_FORMAT_DOLBY_TRUEHD;
7243f4b276a56e6fb5a3c9637c0e3a6865657e3be7Phil Burk    case ENCODING_IEC61937:
7343f4b276a56e6fb5a3c9637c0e3a6865657e3be7Phil Burk        return AUDIO_FORMAT_IEC61937;
74b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case ENCODING_DEFAULT:
75b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return AUDIO_FORMAT_DEFAULT;
76fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten    default:
77fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten        return AUDIO_FORMAT_INVALID;
78fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten    }
79fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten}
80fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten
81b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurentstatic inline int audioFormatFromNative(audio_format_t nativeFormat)
82b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent{
83b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    switch (nativeFormat) {
84b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case AUDIO_FORMAT_PCM_16_BIT:
85b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return ENCODING_PCM_16BIT;
86b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case AUDIO_FORMAT_PCM_8_BIT:
87b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return ENCODING_PCM_8BIT;
88b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case AUDIO_FORMAT_PCM_FLOAT:
89b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return ENCODING_PCM_FLOAT;
904e5e9e9405dc626a03a653161644841102ad89f1Paul McLean
914e5e9e9405dc626a03a653161644841102ad89f1Paul McLean    // map these to ENCODING_PCM_FLOAT
924e5e9e9405dc626a03a653161644841102ad89f1Paul McLean    case AUDIO_FORMAT_PCM_8_24_BIT:
934e5e9e9405dc626a03a653161644841102ad89f1Paul McLean    case AUDIO_FORMAT_PCM_24_BIT_PACKED:
944e5e9e9405dc626a03a653161644841102ad89f1Paul McLean    case AUDIO_FORMAT_PCM_32_BIT:
954e5e9e9405dc626a03a653161644841102ad89f1Paul McLean        return ENCODING_PCM_FLOAT;
964e5e9e9405dc626a03a653161644841102ad89f1Paul McLean
97ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent    case AUDIO_FORMAT_AC3:
98ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent        return ENCODING_AC3;
99ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent    case AUDIO_FORMAT_E_AC3:
100ff0d9f098e51c54e1a030ed21fd980680cb7b405Eric Laurent        return ENCODING_E_AC3;
101e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk    case AUDIO_FORMAT_DTS:
102e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk        return ENCODING_DTS;
103e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk    case AUDIO_FORMAT_DTS_HD:
104e12189dee6504cf793d37f5689a7bbf0773293c7Phil Burk        return ENCODING_DTS_HD;
105cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case AUDIO_FORMAT_MP3:
106cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return ENCODING_MP3;
107cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case AUDIO_FORMAT_AAC_LC:
108cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return ENCODING_AAC_LC;
109cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case AUDIO_FORMAT_AAC_HE_V1:
110cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return ENCODING_AAC_HE_V1;
111cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent    case AUDIO_FORMAT_AAC_HE_V2:
112cae346633321e237f824f3ca10d7e6fff2307b2fEric Laurent        return ENCODING_AAC_HE_V2;
11343f4b276a56e6fb5a3c9637c0e3a6865657e3be7Phil Burk    case AUDIO_FORMAT_IEC61937:
11443f4b276a56e6fb5a3c9637c0e3a6865657e3be7Phil Burk        return ENCODING_IEC61937;
115b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent    case AUDIO_FORMAT_DOLBY_TRUEHD:
116b4fae5ba3980df1690492c70deb134e31bef5b4dEric Laurent        return ENCODING_DOLBY_TRUEHD;
117b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case AUDIO_FORMAT_DEFAULT:
118b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return ENCODING_DEFAULT;
119b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    default:
120b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return ENCODING_INVALID;
121b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    }
122b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent}
123b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent
124b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurentstatic inline audio_channel_mask_t outChannelMaskToNative(int channelMask)
125b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent{
126b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    switch (channelMask) {
127b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case CHANNEL_OUT_DEFAULT:
128b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case CHANNEL_INVALID:
129b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return AUDIO_CHANNEL_NONE;
130b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    default:
131b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return (audio_channel_mask_t)(channelMask>>2);
132b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    }
133b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent}
134b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent
135b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurentstatic inline int outChannelMaskFromNative(audio_channel_mask_t nativeMask)
136b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent{
137b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    switch (nativeMask) {
138b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    case AUDIO_CHANNEL_NONE:
139b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return CHANNEL_OUT_DEFAULT;
140b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    default:
141b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent        return (int)nativeMask<<2;
142b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    }
143b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent}
144b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent
145b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurentstatic inline audio_channel_mask_t inChannelMaskToNative(int channelMask)
146b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent{
147b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    return (audio_channel_mask_t)channelMask;
148b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent}
149b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent
150b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurentstatic inline int inChannelMaskFromNative(audio_channel_mask_t nativeMask)
151b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent{
152b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent    return (int)nativeMask;
153b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent}
154b69681c894c663e84f2826d9b0c832ceb9b45047Eric Laurent
155fe834d30f4f3f51b754d55fecb36f11279733948Glenn Kasten#endif // ANDROID_MEDIA_AUDIOFORMAT_H
156