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 "sles_allinclusive.h"
18
19 /* Device table (change this when you port!) */
20
21 static const SLAudioInputDescriptor AudioInputDescriptor_mic = {
22 (SLchar *) "mic", // deviceName
23 SL_DEVCONNECTION_INTEGRATED, // deviceConnection
24 SL_DEVSCOPE_ENVIRONMENT, // deviceScope
25 SL_DEVLOCATION_HANDSET, // deviceLocation
26 SL_BOOLEAN_TRUE, // isForTelephony
27 SL_SAMPLINGRATE_44_1, // minSampleRate
28 SL_SAMPLINGRATE_44_1, // maxSampleRate
29 SL_BOOLEAN_TRUE, // isFreqRangeContinuous
30 NULL, // samplingRatesSupported
31 0, // numOfSamplingRatesSupported
32 1 // maxChannels
33 };
34
35 const struct AudioInput_id_descriptor AudioInput_id_descriptors[] = {
36 {SL_DEFAULTDEVICEID_AUDIOINPUT, &AudioInputDescriptor_mic},
37 {0, NULL}
38 };
39
40 static const SLAudioOutputDescriptor AudioOutputDescriptor_speaker = {
41 (SLchar *) "speaker", // deviceName
42 SL_DEVCONNECTION_INTEGRATED, // deviceConnection
43 SL_DEVSCOPE_USER, // deviceScope
44 SL_DEVLOCATION_HEADSET, // deviceLocation
45 SL_BOOLEAN_TRUE, // isForTelephony
46 SL_SAMPLINGRATE_44_1, // minSamplingRate
47 SL_SAMPLINGRATE_44_1, // maxSamplingRate
48 SL_BOOLEAN_TRUE, // isFreqRangeContinuous
49 NULL, // samplingRatesSupported
50 0, // numOfSamplingRatesSupported
51 2 // maxChannels
52 };
53
54 static const SLAudioOutputDescriptor AudioOutputDescriptor_headset = {
55 (SLchar *) "headset",
56 SL_DEVCONNECTION_ATTACHED_WIRED,
57 SL_DEVSCOPE_USER,
58 SL_DEVLOCATION_HEADSET,
59 SL_BOOLEAN_FALSE,
60 SL_SAMPLINGRATE_44_1,
61 SL_SAMPLINGRATE_44_1,
62 SL_BOOLEAN_TRUE,
63 NULL,
64 0,
65 2
66 };
67
68 static const SLAudioOutputDescriptor AudioOutputDescriptor_handsfree = {
69 (SLchar *) "handsfree",
70 SL_DEVCONNECTION_INTEGRATED,
71 SL_DEVSCOPE_ENVIRONMENT,
72 SL_DEVLOCATION_HANDSET,
73 SL_BOOLEAN_FALSE,
74 SL_SAMPLINGRATE_44_1,
75 SL_SAMPLINGRATE_44_1,
76 SL_BOOLEAN_TRUE,
77 NULL,
78 0,
79 2
80 };
81
82 const struct AudioOutput_id_descriptor AudioOutput_id_descriptors[] = {
83 {SL_DEFAULTDEVICEID_AUDIOOUTPUT, &AudioOutputDescriptor_speaker},
84 {DEVICE_ID_HEADSET, &AudioOutputDescriptor_headset},
85 {DEVICE_ID_HANDSFREE, &AudioOutputDescriptor_handsfree},
86 {0, NULL}
87 };
88
89 static const SLLEDDescriptor SLLEDDescriptor_default = {
90 32, // ledCount
91 0, // primaryLED
92 ~0 // colorMask
93 };
94
95 const struct LED_id_descriptor LED_id_descriptors[] = {
96 {SL_DEFAULTDEVICEID_LED, &SLLEDDescriptor_default},
97 {0, NULL}
98 };
99
100 static const SLVibraDescriptor SLVibraDescriptor_default = {
101 SL_BOOLEAN_TRUE, // supportsFrequency
102 SL_BOOLEAN_TRUE, // supportsIntensity
103 20000, // minFrequency
104 100000 // maxFrequency
105 };
106
107 const struct Vibra_id_descriptor Vibra_id_descriptors[] = {
108 {SL_DEFAULTDEVICEID_VIBRA, &SLVibraDescriptor_default},
109 {0, NULL}
110 };
111
112 // should build this table from Caps table below
113
114 static const SLuint32 Codec_IDs[] = {
115 SL_AUDIOCODEC_PCM,
116 SL_AUDIOCODEC_MP3,
117 SL_AUDIOCODEC_AMR,
118 SL_AUDIOCODEC_AMRWB,
119 SL_AUDIOCODEC_AMRWBPLUS,
120 SL_AUDIOCODEC_AAC,
121 SL_AUDIOCODEC_WMA,
122 SL_AUDIOCODEC_REAL,
123 SL_AUDIOCODEC_VORBIS
124 };
125
126 const SLuint32 *Decoder_IDs = Codec_IDs;
127 const SLuint32 *Encoder_IDs = Codec_IDs;
128
129 static const SLuint32 VideoCodecIds[] = {
130 XA_VIDEOCODEC_MPEG2,
131 XA_VIDEOCODEC_H263,
132 XA_VIDEOCODEC_MPEG4,
133 XA_VIDEOCODEC_AVC,
134 #ifndef ANDROID
135 XA_VIDEOCODEC_VC1,
136 #endif
137 #ifdef ANDROID
138 XA_ANDROID_VIDEOCODEC_VP8
139 #endif
140 };
141
142 const SLuint32 *VideoDecoderIds = VideoCodecIds;
143
144 const XAuint32 kMaxVideoDecoders = sizeof(VideoCodecIds) / sizeof(VideoCodecIds[0]);
145
146 static const SLmilliHertz SamplingRates_A[] = {
147 SL_SAMPLINGRATE_8,
148 SL_SAMPLINGRATE_11_025,
149 SL_SAMPLINGRATE_12,
150 SL_SAMPLINGRATE_16,
151 SL_SAMPLINGRATE_22_05,
152 SL_SAMPLINGRATE_24,
153 SL_SAMPLINGRATE_32,
154 SL_SAMPLINGRATE_44_1,
155 SL_SAMPLINGRATE_48
156 };
157
158 static const SLAudioCodecDescriptor CodecDescriptor_A = {
159 2, // maxChannels
160 8, // minBitsPerSample
161 16, // maxBitsPerSample
162 SL_SAMPLINGRATE_8, // minSampleRate
163 SL_SAMPLINGRATE_48, // maxSampleRate
164 SL_BOOLEAN_FALSE, // isFreqRangeContinuous
165 (SLmilliHertz *) SamplingRates_A,
166 // pSampleRatesSupported;
167 sizeof(SamplingRates_A) / sizeof(SamplingRates_A[0]),
168 // numSampleRatesSupported
169 1, // minBitRate
170 ~0, // maxBitRate
171 SL_BOOLEAN_TRUE, // isBitrateRangeContinuous
172 NULL, // pBitratesSupported
173 0, // numBitratesSupported
174 SL_AUDIOPROFILE_PCM, // profileSetting
175 0 // modeSetting
176 };
177
178 const CodecDescriptor DecoderDescriptors[] = {
179 {SL_AUDIOCODEC_PCM, &CodecDescriptor_A},
180 {SL_AUDIOCODEC_MP3, &CodecDescriptor_A},
181 {SL_AUDIOCODEC_AMR, &CodecDescriptor_A},
182 {SL_AUDIOCODEC_AMRWB, &CodecDescriptor_A},
183 {SL_AUDIOCODEC_AMRWBPLUS, &CodecDescriptor_A},
184 {SL_AUDIOCODEC_AAC, &CodecDescriptor_A},
185 {SL_AUDIOCODEC_WMA, &CodecDescriptor_A},
186 {SL_AUDIOCODEC_REAL, &CodecDescriptor_A},
187 {SL_AUDIOCODEC_VORBIS, &CodecDescriptor_A},
188 {SL_AUDIOCODEC_NULL, NULL}
189 };
190
191 const CodecDescriptor EncoderDescriptors[] = {
192 {SL_AUDIOCODEC_PCM, &CodecDescriptor_A},
193 {SL_AUDIOCODEC_MP3, &CodecDescriptor_A},
194 {SL_AUDIOCODEC_AMR, &CodecDescriptor_A},
195 {SL_AUDIOCODEC_AMRWB, &CodecDescriptor_A},
196 {SL_AUDIOCODEC_AMRWBPLUS, &CodecDescriptor_A},
197 {SL_AUDIOCODEC_AAC, &CodecDescriptor_A},
198 {SL_AUDIOCODEC_WMA, &CodecDescriptor_A},
199 {SL_AUDIOCODEC_REAL, &CodecDescriptor_A},
200 {SL_AUDIOCODEC_VORBIS, &CodecDescriptor_A},
201 {SL_AUDIOCODEC_NULL, NULL}
202 };
203
204
205 /** \brief Helper shared by decoder and encoder */
206
GetCodecCapabilities(SLuint32 codecId,SLuint32 * pIndex,SLAudioCodecDescriptor * pDescriptor,const CodecDescriptor * codecDescriptors)207 SLresult GetCodecCapabilities(SLuint32 codecId, SLuint32 *pIndex,
208 SLAudioCodecDescriptor *pDescriptor, const CodecDescriptor *codecDescriptors)
209 {
210 if (NULL == pIndex) {
211 return SL_RESULT_PARAMETER_INVALID;
212 }
213 const CodecDescriptor *cd = codecDescriptors;
214 SLuint32 index;
215 if (NULL == pDescriptor) {
216 for (index = 0 ; NULL != cd->mDescriptor; ++cd) {
217 if (cd->mCodecID == codecId) {
218 ++index;
219 }
220 }
221 *pIndex = index;
222 return SL_RESULT_SUCCESS;
223 }
224 index = *pIndex;
225 for ( ; NULL != cd->mDescriptor; ++cd) {
226 if (cd->mCodecID == codecId) {
227 if (0 == index) {
228 *pDescriptor = *cd->mDescriptor;
229 #if 0 // Temporary workaround for Khronos bug 6331
230 if (0 < pDescriptor->numSampleRatesSupported) {
231 // The malloc is not in the 1.0.1 specification
232 SLmilliHertz *temp = (SLmilliHertz *) malloc(sizeof(SLmilliHertz) *
233 pDescriptor->numSampleRatesSupported);
234 assert(NULL != temp);
235 memcpy(temp, pDescriptor->pSampleRatesSupported, sizeof(SLmilliHertz) *
236 pDescriptor->numSampleRatesSupported);
237 pDescriptor->pSampleRatesSupported = temp;
238 } else {
239 pDescriptor->pSampleRatesSupported = NULL;
240 }
241 #endif
242 return SL_RESULT_SUCCESS;
243 }
244 --index;
245 }
246 }
247 return SL_RESULT_PARAMETER_INVALID;
248 }
249