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_INVALID    0
35#define ENCODING_DEFAULT    1
36
37
38
39#define CHANNEL_INVALID 0
40#define CHANNEL_OUT_DEFAULT 1
41
42static inline audio_format_t audioFormatToNative(int audioFormat)
43{
44    switch (audioFormat) {
45    case ENCODING_PCM_16BIT:
46        return AUDIO_FORMAT_PCM_16_BIT;
47    case ENCODING_PCM_8BIT:
48        return AUDIO_FORMAT_PCM_8_BIT;
49    case ENCODING_PCM_FLOAT:
50        return AUDIO_FORMAT_PCM_FLOAT;
51    case ENCODING_AC3:
52        return AUDIO_FORMAT_AC3;
53    case ENCODING_E_AC3:
54        return AUDIO_FORMAT_E_AC3;
55    case ENCODING_DTS:
56        return AUDIO_FORMAT_DTS;
57    case ENCODING_DTS_HD:
58        return AUDIO_FORMAT_DTS_HD;
59    case ENCODING_MP3:
60        return AUDIO_FORMAT_MP3;
61    case ENCODING_AAC_LC:
62        return AUDIO_FORMAT_AAC_LC;
63    case ENCODING_AAC_HE_V1:
64        return AUDIO_FORMAT_AAC_HE_V1;
65    case ENCODING_AAC_HE_V2:
66        return AUDIO_FORMAT_AAC_HE_V2;
67    case ENCODING_DEFAULT:
68        return AUDIO_FORMAT_DEFAULT;
69    default:
70        return AUDIO_FORMAT_INVALID;
71    }
72}
73
74static inline int audioFormatFromNative(audio_format_t nativeFormat)
75{
76    switch (nativeFormat) {
77    case AUDIO_FORMAT_PCM_16_BIT:
78        return ENCODING_PCM_16BIT;
79    case AUDIO_FORMAT_PCM_8_BIT:
80        return ENCODING_PCM_8BIT;
81    case AUDIO_FORMAT_PCM_FLOAT:
82        return ENCODING_PCM_FLOAT;
83
84    // map these to ENCODING_PCM_FLOAT
85    case AUDIO_FORMAT_PCM_8_24_BIT:
86    case AUDIO_FORMAT_PCM_24_BIT_PACKED:
87    case AUDIO_FORMAT_PCM_32_BIT:
88        return ENCODING_PCM_FLOAT;
89
90    case AUDIO_FORMAT_AC3:
91        return ENCODING_AC3;
92    case AUDIO_FORMAT_E_AC3:
93        return ENCODING_E_AC3;
94    case AUDIO_FORMAT_DTS:
95        return ENCODING_DTS;
96    case AUDIO_FORMAT_DTS_HD:
97        return ENCODING_DTS_HD;
98    case AUDIO_FORMAT_MP3:
99        return ENCODING_MP3;
100    case AUDIO_FORMAT_AAC_LC:
101        return ENCODING_AAC_LC;
102    case AUDIO_FORMAT_AAC_HE_V1:
103        return ENCODING_AAC_HE_V1;
104    case AUDIO_FORMAT_AAC_HE_V2:
105        return ENCODING_AAC_HE_V2;
106    case AUDIO_FORMAT_DEFAULT:
107        return ENCODING_DEFAULT;
108    default:
109        return ENCODING_INVALID;
110    }
111}
112
113static inline audio_channel_mask_t outChannelMaskToNative(int channelMask)
114{
115    switch (channelMask) {
116    case CHANNEL_OUT_DEFAULT:
117    case CHANNEL_INVALID:
118        return AUDIO_CHANNEL_NONE;
119    default:
120        return (audio_channel_mask_t)(channelMask>>2);
121    }
122}
123
124static inline int outChannelMaskFromNative(audio_channel_mask_t nativeMask)
125{
126    switch (nativeMask) {
127    case AUDIO_CHANNEL_NONE:
128        return CHANNEL_OUT_DEFAULT;
129    default:
130        return (int)nativeMask<<2;
131    }
132}
133
134static inline audio_channel_mask_t inChannelMaskToNative(int channelMask)
135{
136    return (audio_channel_mask_t)channelMask;
137}
138
139static inline int inChannelMaskFromNative(audio_channel_mask_t nativeMask)
140{
141    return (int)nativeMask;
142}
143
144#endif // ANDROID_MEDIA_AUDIOFORMAT_H
145