1 /*
2  * Copyright (C) 2010 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 #include "math.h"
18 
19 #include <system/audio.h>
20 
21 //-----------------------------------------------------------------------------
22 // Android to OpenSL ES
23 //----------------------
android_to_sles_streamType(int type)24 static inline SLuint32 android_to_sles_streamType(int type) {
25     return (SLuint32) type;
26 }
27 
28 
android_to_sles_sampleRate(uint32_t srHz)29 static inline SLuint32 android_to_sles_sampleRate(uint32_t srHz) {
30     // convert to milliHertz
31     return (SLuint32) srHz*1000;
32 }
33 
34 
35 //-----------------------------------------------------------------------------
36 // OpenSL ES to Android
37 //----------------------
sles_to_android_streamType(SLuint32 type)38 static inline int sles_to_android_streamType(SLuint32 type) {
39     return (int)type;
40 }
41 
42 
sles_to_android_sampleRate(SLuint32 sampleRateMilliHertz)43 static inline uint32_t sles_to_android_sampleRate(SLuint32 sampleRateMilliHertz) {
44     return (uint32_t)(sampleRateMilliHertz / 1000);
45 }
46 
sles_to_android_sampleFormat(const SLDataFormat_PCM * df_pcm)47 static inline audio_format_t sles_to_android_sampleFormat(const SLDataFormat_PCM *df_pcm) {
48     switch (df_pcm->formatType) {
49     case SL_DATAFORMAT_PCM:
50         switch (df_pcm->containerSize) {
51             case 8:
52                 return AUDIO_FORMAT_PCM_8_BIT;
53             case 16:
54                 return AUDIO_FORMAT_PCM_16_BIT;
55             case 24:
56                 return AUDIO_FORMAT_PCM_24_BIT_PACKED;
57             case 32:
58                 return AUDIO_FORMAT_PCM_32_BIT;
59             default:
60                 return AUDIO_FORMAT_INVALID;
61         }
62     case SL_ANDROID_DATAFORMAT_PCM_EX:
63         switch (((SLAndroidDataFormat_PCM_EX *)df_pcm)->representation) {
64         case SL_ANDROID_PCM_REPRESENTATION_UNSIGNED_INT:
65             switch (df_pcm->containerSize) {
66             case 8:
67                 return AUDIO_FORMAT_PCM_8_BIT;
68             default:
69                 return AUDIO_FORMAT_INVALID;
70             }
71         case SL_ANDROID_PCM_REPRESENTATION_SIGNED_INT:
72             switch (df_pcm->containerSize) {
73             case 16:
74                 return AUDIO_FORMAT_PCM_16_BIT;
75             case 24:
76                 return AUDIO_FORMAT_PCM_24_BIT_PACKED;
77             case 32:
78                 return AUDIO_FORMAT_PCM_32_BIT;
79             default:
80                 return AUDIO_FORMAT_INVALID;
81             }
82         case SL_ANDROID_PCM_REPRESENTATION_FLOAT:
83             switch (df_pcm->containerSize) {
84             case 32:
85                 return AUDIO_FORMAT_PCM_FLOAT;
86             default:
87                 return AUDIO_FORMAT_INVALID;
88             }
89         default:
90             return AUDIO_FORMAT_INVALID;
91         }
92     default:
93         return AUDIO_FORMAT_INVALID;
94     }
95 }
96 
97 
sles_to_android_channelMaskIn(SLuint32 nbChannels,SLuint32 channelMask)98 static inline audio_channel_mask_t sles_to_android_channelMaskIn(SLuint32 nbChannels,
99         SLuint32 channelMask) {
100     // FIXME handle channel mask mapping between SL ES and Android
101     return audio_channel_in_mask_from_count(nbChannels);
102 }
103 
104 
sles_to_android_channelMaskOut(SLuint32 nbChannels,SLuint32 channelMask)105 static inline audio_channel_mask_t sles_to_android_channelMaskOut(SLuint32 nbChannels,
106         SLuint32 channelMask) {
107     // FIXME handle channel mask mapping between SL ES and Android
108     return audio_channel_out_mask_from_count(nbChannels);
109 }
110 
111 
sles_to_android_amplification(SLmillibel level)112 static inline float sles_to_android_amplification(SLmillibel level) {
113     // FIXME use the FX Framework conversions
114     return pow(10, (float)level/2000);
115 }
116 
117 
channelCountToMask(uint32_t channelCount)118 static inline uint32_t channelCountToMask(uint32_t channelCount)
119 {
120     // FIXME channel mask is not yet implemented by Stagefright, so use a reasonable default
121     //       that is computed from the channel count
122     uint32_t channelMask;
123     switch (channelCount) {
124     case 1:
125         // see explanation in data.c re: default channel mask for mono
126         return SL_SPEAKER_FRONT_LEFT;
127     case 2:
128         return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
129     // Android-specific
130     case 4:
131         return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT
132                | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT;
133     case 6:
134         return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT| SL_SPEAKER_FRONT_CENTER
135                | SL_SPEAKER_LOW_FREQUENCY
136                | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT;
137     case 8:
138         return SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT | SL_SPEAKER_FRONT_CENTER
139                | SL_SPEAKER_LOW_FREQUENCY
140                | SL_SPEAKER_BACK_LEFT | SL_SPEAKER_BACK_RIGHT
141                | SL_SPEAKER_SIDE_LEFT |SL_SPEAKER_SIDE_RIGHT;
142     default:
143         return UNKNOWN_CHANNELMASK;
144     }
145 }
146