/*
* 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
(SLuint32) ~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
(SLuint32) ~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;
}