/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "sles_allinclusive.h" /* Device table (change this when you port!) */ static const SLAudioInputDescriptor AudioInputDescriptor_mic = { (SLchar *) "mic", // deviceName SL_DEVCONNECTION_INTEGRATED, // deviceConnection SL_DEVSCOPE_ENVIRONMENT, // deviceScope SL_DEVLOCATION_HANDSET, // deviceLocation SL_BOOLEAN_TRUE, // isForTelephony SL_SAMPLINGRATE_44_1, // minSampleRate SL_SAMPLINGRATE_44_1, // maxSampleRate SL_BOOLEAN_TRUE, // isFreqRangeContinuous NULL, // samplingRatesSupported 0, // numOfSamplingRatesSupported 1 // maxChannels }; const struct AudioInput_id_descriptor AudioInput_id_descriptors[] = { {SL_DEFAULTDEVICEID_AUDIOINPUT, &AudioInputDescriptor_mic}, {0, NULL} }; static const SLAudioOutputDescriptor AudioOutputDescriptor_speaker = { (SLchar *) "speaker", // deviceName SL_DEVCONNECTION_INTEGRATED, // deviceConnection SL_DEVSCOPE_USER, // deviceScope SL_DEVLOCATION_HEADSET, // deviceLocation SL_BOOLEAN_TRUE, // isForTelephony SL_SAMPLINGRATE_44_1, // minSamplingRate SL_SAMPLINGRATE_44_1, // maxSamplingRate SL_BOOLEAN_TRUE, // isFreqRangeContinuous NULL, // samplingRatesSupported 0, // numOfSamplingRatesSupported 2 // maxChannels }; static const SLAudioOutputDescriptor AudioOutputDescriptor_headset = { (SLchar *) "headset", SL_DEVCONNECTION_ATTACHED_WIRED, SL_DEVSCOPE_USER, SL_DEVLOCATION_HEADSET, SL_BOOLEAN_FALSE, SL_SAMPLINGRATE_44_1, SL_SAMPLINGRATE_44_1, SL_BOOLEAN_TRUE, NULL, 0, 2 }; static const SLAudioOutputDescriptor AudioOutputDescriptor_handsfree = { (SLchar *) "handsfree", SL_DEVCONNECTION_INTEGRATED, SL_DEVSCOPE_ENVIRONMENT, SL_DEVLOCATION_HANDSET, SL_BOOLEAN_FALSE, SL_SAMPLINGRATE_44_1, SL_SAMPLINGRATE_44_1, SL_BOOLEAN_TRUE, NULL, 0, 2 }; const struct AudioOutput_id_descriptor AudioOutput_id_descriptors[] = { {SL_DEFAULTDEVICEID_AUDIOOUTPUT, &AudioOutputDescriptor_speaker}, {DEVICE_ID_HEADSET, &AudioOutputDescriptor_headset}, {DEVICE_ID_HANDSFREE, &AudioOutputDescriptor_handsfree}, {0, NULL} }; static const SLLEDDescriptor SLLEDDescriptor_default = { 32, // ledCount 0, // primaryLED ~0 // colorMask }; const struct LED_id_descriptor LED_id_descriptors[] = { {SL_DEFAULTDEVICEID_LED, &SLLEDDescriptor_default}, {0, NULL} }; static const SLVibraDescriptor SLVibraDescriptor_default = { SL_BOOLEAN_TRUE, // supportsFrequency SL_BOOLEAN_TRUE, // supportsIntensity 20000, // minFrequency 100000 // maxFrequency }; const struct Vibra_id_descriptor Vibra_id_descriptors[] = { {SL_DEFAULTDEVICEID_VIBRA, &SLVibraDescriptor_default}, {0, NULL} }; // should build this table from Caps table below static const SLuint32 Codec_IDs[] = { SL_AUDIOCODEC_PCM, SL_AUDIOCODEC_MP3, SL_AUDIOCODEC_AMR, SL_AUDIOCODEC_AMRWB, SL_AUDIOCODEC_AMRWBPLUS, SL_AUDIOCODEC_AAC, SL_AUDIOCODEC_WMA, SL_AUDIOCODEC_REAL, SL_AUDIOCODEC_VORBIS }; const SLuint32 * const Decoder_IDs = Codec_IDs; const SLuint32 * const Encoder_IDs = Codec_IDs; // for ANDROID, must match size and order of kVideoMimeTypes static const SLuint32 VideoCodecIds[] = { XA_VIDEOCODEC_MPEG2, XA_VIDEOCODEC_H263, XA_VIDEOCODEC_MPEG4, XA_VIDEOCODEC_AVC, #ifndef ANDROID XA_VIDEOCODEC_VC1, #endif #ifdef ANDROID XA_ANDROID_VIDEOCODEC_VP8 #endif }; const SLuint32 * const VideoDecoderIds = VideoCodecIds; // for ANDROID, must == kNbVideoMimeTypes const XAuint32 kMaxVideoDecoders = sizeof(VideoCodecIds) / sizeof(VideoCodecIds[0]); static const SLmilliHertz SamplingRates_A[] = { SL_SAMPLINGRATE_8, SL_SAMPLINGRATE_11_025, SL_SAMPLINGRATE_12, SL_SAMPLINGRATE_16, SL_SAMPLINGRATE_22_05, SL_SAMPLINGRATE_24, SL_SAMPLINGRATE_32, SL_SAMPLINGRATE_44_1, SL_SAMPLINGRATE_48 }; static const SLAudioCodecDescriptor CodecDescriptor_A = { 2, // maxChannels 8, // minBitsPerSample 16, // maxBitsPerSample SL_SAMPLINGRATE_8, // minSampleRate SL_SAMPLINGRATE_48, // maxSampleRate SL_BOOLEAN_FALSE, // isFreqRangeContinuous (SLmilliHertz *) SamplingRates_A, // pSampleRatesSupported; sizeof(SamplingRates_A) / sizeof(SamplingRates_A[0]), // numSampleRatesSupported 1, // minBitRate ~0, // maxBitRate SL_BOOLEAN_TRUE, // isBitrateRangeContinuous NULL, // pBitratesSupported 0, // numBitratesSupported SL_AUDIOPROFILE_PCM, // profileSetting 0 // modeSetting }; const CodecDescriptor DecoderDescriptors[] = { {SL_AUDIOCODEC_PCM, &CodecDescriptor_A}, {SL_AUDIOCODEC_MP3, &CodecDescriptor_A}, {SL_AUDIOCODEC_AMR, &CodecDescriptor_A}, {SL_AUDIOCODEC_AMRWB, &CodecDescriptor_A}, {SL_AUDIOCODEC_AMRWBPLUS, &CodecDescriptor_A}, {SL_AUDIOCODEC_AAC, &CodecDescriptor_A}, {SL_AUDIOCODEC_WMA, &CodecDescriptor_A}, {SL_AUDIOCODEC_REAL, &CodecDescriptor_A}, {SL_AUDIOCODEC_VORBIS, &CodecDescriptor_A}, {SL_AUDIOCODEC_NULL, NULL} }; const CodecDescriptor EncoderDescriptors[] = { {SL_AUDIOCODEC_PCM, &CodecDescriptor_A}, {SL_AUDIOCODEC_MP3, &CodecDescriptor_A}, {SL_AUDIOCODEC_AMR, &CodecDescriptor_A}, {SL_AUDIOCODEC_AMRWB, &CodecDescriptor_A}, {SL_AUDIOCODEC_AMRWBPLUS, &CodecDescriptor_A}, {SL_AUDIOCODEC_AAC, &CodecDescriptor_A}, {SL_AUDIOCODEC_WMA, &CodecDescriptor_A}, {SL_AUDIOCODEC_REAL, &CodecDescriptor_A}, {SL_AUDIOCODEC_VORBIS, &CodecDescriptor_A}, {SL_AUDIOCODEC_NULL, NULL} }; /** \brief Helper shared by decoder and encoder */ SLresult GetCodecCapabilities(SLuint32 codecId, SLuint32 *pIndex, SLAudioCodecDescriptor *pDescriptor, const CodecDescriptor *codecDescriptors) { if (NULL == pIndex) { return SL_RESULT_PARAMETER_INVALID; } const CodecDescriptor *cd = codecDescriptors; SLuint32 index; if (NULL == pDescriptor) { for (index = 0 ; NULL != cd->mDescriptor; ++cd) { if (cd->mCodecID == codecId) { ++index; } } *pIndex = index; return SL_RESULT_SUCCESS; } index = *pIndex; for ( ; NULL != cd->mDescriptor; ++cd) { if (cd->mCodecID == codecId) { if (0 == index) { *pDescriptor = *cd->mDescriptor; #if 0 // Temporary workaround for Khronos bug 6331 if (0 < pDescriptor->numSampleRatesSupported) { // The malloc is not in the 1.0.1 specification SLmilliHertz *temp = (SLmilliHertz *) malloc(sizeof(SLmilliHertz) * pDescriptor->numSampleRatesSupported); assert(NULL != temp); memcpy(temp, pDescriptor->pSampleRatesSupported, sizeof(SLmilliHertz) * pDescriptor->numSampleRatesSupported); pDescriptor->pSampleRatesSupported = temp; } else { pDescriptor->pSampleRatesSupported = NULL; } #endif return SL_RESULT_SUCCESS; } --index; } } return SL_RESULT_PARAMETER_INVALID; }