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