devices.c revision 6e7e174807fc639c49125ced8962aa369370fbf0
1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/*
2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License.
6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at
7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and
14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License.
15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */
16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h"
18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* Device table (change this when you port!) */
20a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
21a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLAudioInputDescriptor AudioInputDescriptor_mic = {
22a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    (SLchar *) "mic",            // deviceName
23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVCONNECTION_INTEGRATED, // deviceConnection
24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVSCOPE_ENVIRONMENT,     // deviceScope
25a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVLOCATION_HANDSET,      // deviceLocation
26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE,             // isForTelephony
27a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,        // minSampleRate
28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,        // maxSampleRate
29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE,             // isFreqRangeContinuous
30a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    NULL,                        // samplingRatesSupported
31a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    0,                           // numOfSamplingRatesSupported
32a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    1                            // maxChannels
33a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
34a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
35a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenconst struct AudioInput_id_descriptor AudioInput_id_descriptors[] = {
36a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {SL_DEFAULTDEVICEID_AUDIOINPUT, &AudioInputDescriptor_mic},
37a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {0, NULL}
38a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
39a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
40a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLAudioOutputDescriptor AudioOutputDescriptor_speaker = {
41a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    (SLchar *) "speaker",        // deviceName
42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVCONNECTION_INTEGRATED, // deviceConnection
43a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVSCOPE_USER,            // deviceScope
44a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVLOCATION_HEADSET,      // deviceLocation
45a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE,             // isForTelephony
46a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,        // minSamplingRate
47a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,        // maxSamplingRate
48a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE,             // isFreqRangeContinuous
49a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    NULL,                        // samplingRatesSupported
50a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    0,                           // numOfSamplingRatesSupported
51a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    2                            // maxChannels
52a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
53a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
54a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLAudioOutputDescriptor AudioOutputDescriptor_headset = {
55a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    (SLchar *) "headset",
56a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVCONNECTION_ATTACHED_WIRED,
57a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVSCOPE_USER,
58a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVLOCATION_HEADSET,
59a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_FALSE,
60a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,
61a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,
62a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE,
63a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    NULL,
64a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    0,
65a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    2
66a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
67a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
68a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLAudioOutputDescriptor AudioOutputDescriptor_handsfree = {
69a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    (SLchar *) "handsfree",
70a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVCONNECTION_INTEGRATED,
71a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVSCOPE_ENVIRONMENT,
72a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_DEVLOCATION_HANDSET,
73a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_FALSE,
74a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,
75a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_SAMPLINGRATE_44_1,
76a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE,
77a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    NULL,
78a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    0,
79a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    2
80a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
81a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
82a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenconst struct AudioOutput_id_descriptor AudioOutput_id_descriptors[] = {
83a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {SL_DEFAULTDEVICEID_AUDIOOUTPUT, &AudioOutputDescriptor_speaker},
84a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {DEVICE_ID_HEADSET, &AudioOutputDescriptor_headset},
85a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {DEVICE_ID_HANDSFREE, &AudioOutputDescriptor_handsfree},
86a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {0, NULL}
87a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
88a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
89a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLLEDDescriptor SLLEDDescriptor_default = {
90a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    32, // ledCount
91a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    0,  // primaryLED
92a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    ~0  // colorMask
93a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
94a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
95a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenconst struct LED_id_descriptor LED_id_descriptors[] = {
96a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {SL_DEFAULTDEVICEID_LED, &SLLEDDescriptor_default},
97a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {0, NULL}
98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
100a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLVibraDescriptor SLVibraDescriptor_default = {
101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE, // supportsFrequency
102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_BOOLEAN_TRUE, // supportsIntensity
103a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    20000,           // minFrequency
104a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    100000           // maxFrequency
105a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
106a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
107a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenconst struct Vibra_id_descriptor Vibra_id_descriptors[] = {
108a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {SL_DEFAULTDEVICEID_VIBRA, &SLVibraDescriptor_default},
109a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    {0, NULL}
110a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
11161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1127a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten// should build this table from Caps table below
11361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
11461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const SLuint32 Codec_IDs[] = {
11561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_PCM,
11661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_MP3,
11761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_AMR,
11861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_AMRWB,
11961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_AMRWBPLUS,
12061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_AAC,
12161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_WMA,
12261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_REAL,
12361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOCODEC_VORBIS
12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
12661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenconst SLuint32 *Decoder_IDs = Codec_IDs;
12761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenconst SLuint32 *Encoder_IDs = Codec_IDs;
12861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
1296e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivistatic const SLuint32 VideoCodecIds[] = {
1306e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        XA_VIDEOCODEC_MPEG2,
1316e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        XA_VIDEOCODEC_H263,
1326e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        XA_VIDEOCODEC_MPEG4,
1336e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        XA_VIDEOCODEC_AVC,
1346e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#ifndef ANDROID
1356e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        XA_VIDEOCODEC_VC1,
1366e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#endif
1376e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#ifdef ANDROID
1386e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi        XA_ANDROID_VIDEOCODEC_VP8
1396e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi#endif
1406e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi};
1416e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi
1426e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Triviconst SLuint32 *VideoDecoderIds = VideoCodecIds;
1436e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi
1446e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Triviconst XAuint32 kMaxVideoDecoders = sizeof(VideoCodecIds) / sizeof(VideoCodecIds[0]);
1456e7e174807fc639c49125ced8962aa369370fbf0Jean-Michel Trivi
14661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const SLmilliHertz SamplingRates_A[] = {
14761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_8,
14861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_11_025,
14961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_12,
15061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_16,
15161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_22_05,
15261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_24,
15361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_32,
15461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_44_1,
15561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_48
15661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
15761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
15861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const SLAudioCodecDescriptor CodecDescriptor_A = {
15961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    2,                   // maxChannels
16061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    8,                   // minBitsPerSample
16161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    16,                  // maxBitsPerSample
16261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_8,   // minSampleRate
16361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_SAMPLINGRATE_48,  // maxSampleRate
16461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_BOOLEAN_FALSE,    // isFreqRangeContinuous
16561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    (SLmilliHertz *) SamplingRates_A,
16661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten                         // pSampleRatesSupported;
16761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    sizeof(SamplingRates_A) / sizeof(SamplingRates_A[0]),
16861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten                         // numSampleRatesSupported
16961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    1,                   // minBitRate
17061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    ~0,                  // maxBitRate
17161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_BOOLEAN_TRUE,     // isBitrateRangeContinuous
17261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    NULL,                // pBitratesSupported
17361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    0,                   // numBitratesSupported
17461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    SL_AUDIOPROFILE_PCM, // profileSetting
17561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    0                    // modeSetting
17661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
17761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
178369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kastenconst CodecDescriptor DecoderDescriptors[] = {
17961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    {SL_AUDIOCODEC_PCM, &CodecDescriptor_A},
180a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_MP3, &CodecDescriptor_A},
181a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AMR, &CodecDescriptor_A},
182a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AMRWB, &CodecDescriptor_A},
183a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AMRWBPLUS, &CodecDescriptor_A},
184a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AAC, &CodecDescriptor_A},
185a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_WMA, &CodecDescriptor_A},
186a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_REAL, &CodecDescriptor_A},
187a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_VORBIS, &CodecDescriptor_A},
18861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    {SL_AUDIOCODEC_NULL, NULL}
18961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
19061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten
191369f3138f19f7102bf0f98b890ab84c8df633a93Glenn Kastenconst CodecDescriptor EncoderDescriptors[] = {
19261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    {SL_AUDIOCODEC_PCM, &CodecDescriptor_A},
193a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_MP3, &CodecDescriptor_A},
194a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AMR, &CodecDescriptor_A},
195a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AMRWB, &CodecDescriptor_A},
196a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AMRWBPLUS, &CodecDescriptor_A},
197a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_AAC, &CodecDescriptor_A},
198a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_WMA, &CodecDescriptor_A},
199a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_REAL, &CodecDescriptor_A},
200a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten    {SL_AUDIOCODEC_VORBIS, &CodecDescriptor_A},
20161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten    {SL_AUDIOCODEC_NULL, NULL}
20261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten};
2038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten/** \brief Helper shared by decoder and encoder */
2068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten
2078db0b106cdce5f5216b1535492de7930ad738aedGlenn KastenSLresult GetCodecCapabilities(SLuint32 codecId, SLuint32 *pIndex,
2088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SLAudioCodecDescriptor *pDescriptor, const CodecDescriptor *codecDescriptors)
2098db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{
2108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    if (NULL == pIndex) {
2118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        return SL_RESULT_PARAMETER_INVALID;
2128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    }
2138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    const CodecDescriptor *cd = codecDescriptors;
2148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    SLuint32 index;
2158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    if (NULL == pDescriptor) {
2168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        for (index = 0 ; NULL != cd->mDescriptor; ++cd) {
2178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            if (cd->mCodecID == codecId) {
2188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                ++index;
2198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            }
2208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
2218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        *pIndex = index;
2228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        return SL_RESULT_SUCCESS;
2238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    }
2248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    index = *pIndex;
2258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    for ( ; NULL != cd->mDescriptor; ++cd) {
2268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        if (cd->mCodecID == codecId) {
2278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            if (0 == index) {
2288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                *pDescriptor = *cd->mDescriptor;
2298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#if 0   // Temporary workaround for Khronos bug 6331
2308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                if (0 < pDescriptor->numSampleRatesSupported) {
2318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    // The malloc is not in the 1.0.1 specification
2328db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    SLmilliHertz *temp = (SLmilliHertz *) malloc(sizeof(SLmilliHertz) *
2338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                        pDescriptor->numSampleRatesSupported);
2348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    assert(NULL != temp);
2358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    memcpy(temp, pDescriptor->pSampleRatesSupported, sizeof(SLmilliHertz) *
2368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                        pDescriptor->numSampleRatesSupported);
2378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    pDescriptor->pSampleRatesSupported = temp;
2388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                } else {
2398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                    pDescriptor->pSampleRatesSupported = NULL;
2408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                }
2418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif
2428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten                return SL_RESULT_SUCCESS;
2438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            }
2448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten            --index;
2458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten        }
2468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    }
2478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten    return SL_RESULT_PARAMETER_INVALID;
2488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}
249