devices.c revision 6e7e174807fc639c49125ced8962aa369370fbf0
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 21static 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 35const struct AudioInput_id_descriptor AudioInput_id_descriptors[] = { 36 {SL_DEFAULTDEVICEID_AUDIOINPUT, &AudioInputDescriptor_mic}, 37 {0, NULL} 38}; 39 40static 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 54static 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 68static 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 82const 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 89static const SLLEDDescriptor SLLEDDescriptor_default = { 90 32, // ledCount 91 0, // primaryLED 92 ~0 // colorMask 93}; 94 95const struct LED_id_descriptor LED_id_descriptors[] = { 96 {SL_DEFAULTDEVICEID_LED, &SLLEDDescriptor_default}, 97 {0, NULL} 98}; 99 100static const SLVibraDescriptor SLVibraDescriptor_default = { 101 SL_BOOLEAN_TRUE, // supportsFrequency 102 SL_BOOLEAN_TRUE, // supportsIntensity 103 20000, // minFrequency 104 100000 // maxFrequency 105}; 106 107const 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 114static 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 126const SLuint32 *Decoder_IDs = Codec_IDs; 127const SLuint32 *Encoder_IDs = Codec_IDs; 128 129static 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 142const SLuint32 *VideoDecoderIds = VideoCodecIds; 143 144const XAuint32 kMaxVideoDecoders = sizeof(VideoCodecIds) / sizeof(VideoCodecIds[0]); 145 146static 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 158static 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 178const 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 191const 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 207SLresult 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