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 /* Engine implementation */
18*bebae9c0SAndroid Build Coastguard Worker
19*bebae9c0SAndroid Build Coastguard Worker #include <endian.h>
20*bebae9c0SAndroid Build Coastguard Worker #include "sles_allinclusive.h"
21*bebae9c0SAndroid Build Coastguard Worker
22*bebae9c0SAndroid Build Coastguard Worker
23*bebae9c0SAndroid Build Coastguard Worker /* Utility functions */
24*bebae9c0SAndroid Build Coastguard Worker
initializeBufferQueueMembers(CAudioPlayer * ap)25*bebae9c0SAndroid Build Coastguard Worker static SLresult initializeBufferQueueMembers(CAudioPlayer *ap) {
26*bebae9c0SAndroid Build Coastguard Worker // inline allocation of circular mArray, up to a typical max
27*bebae9c0SAndroid Build Coastguard Worker if (BUFFER_HEADER_TYPICAL >= ap->mBufferQueue.mNumBuffers) {
28*bebae9c0SAndroid Build Coastguard Worker ap->mBufferQueue.mArray = ap->mBufferQueue.mTypical;
29*bebae9c0SAndroid Build Coastguard Worker } else {
30*bebae9c0SAndroid Build Coastguard Worker // Avoid possible integer overflow during multiplication; this arbitrary
31*bebae9c0SAndroid Build Coastguard Worker // maximum is big enough to not interfere with real applications, but
32*bebae9c0SAndroid Build Coastguard Worker // small enough to not overflow.
33*bebae9c0SAndroid Build Coastguard Worker if (ap->mBufferQueue.mNumBuffers >= 256) {
34*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_MEMORY_FAILURE;
35*bebae9c0SAndroid Build Coastguard Worker }
36*bebae9c0SAndroid Build Coastguard Worker ap->mBufferQueue.mArray = (BufferHeader *)
37*bebae9c0SAndroid Build Coastguard Worker malloc((ap->mBufferQueue.mNumBuffers + 1) * sizeof(BufferHeader));
38*bebae9c0SAndroid Build Coastguard Worker if (NULL == ap->mBufferQueue.mArray) {
39*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_MEMORY_FAILURE;
40*bebae9c0SAndroid Build Coastguard Worker }
41*bebae9c0SAndroid Build Coastguard Worker }
42*bebae9c0SAndroid Build Coastguard Worker ap->mBufferQueue.mFront = ap->mBufferQueue.mArray;
43*bebae9c0SAndroid Build Coastguard Worker ap->mBufferQueue.mRear = ap->mBufferQueue.mArray;
44*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
45*bebae9c0SAndroid Build Coastguard Worker }
46*bebae9c0SAndroid Build Coastguard Worker
47*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
initializeAndroidBufferQueueMembers(CAudioPlayer * ap)48*bebae9c0SAndroid Build Coastguard Worker static SLresult initializeAndroidBufferQueueMembers(CAudioPlayer *ap) {
49*bebae9c0SAndroid Build Coastguard Worker // Avoid possible integer overflow during multiplication; this arbitrary
50*bebae9c0SAndroid Build Coastguard Worker // maximum is big enough to not interfere with real applications, but
51*bebae9c0SAndroid Build Coastguard Worker // small enough to not overflow.
52*bebae9c0SAndroid Build Coastguard Worker if (ap->mAndroidBufferQueue.mNumBuffers >= 256) {
53*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_MEMORY_FAILURE;
54*bebae9c0SAndroid Build Coastguard Worker }
55*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mBufferArray = (AdvancedBufferHeader *)
56*bebae9c0SAndroid Build Coastguard Worker malloc( (ap->mAndroidBufferQueue.mNumBuffers + 1) * sizeof(AdvancedBufferHeader));
57*bebae9c0SAndroid Build Coastguard Worker if (NULL == ap->mAndroidBufferQueue.mBufferArray) {
58*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_MEMORY_FAILURE;
59*bebae9c0SAndroid Build Coastguard Worker } else {
60*bebae9c0SAndroid Build Coastguard Worker
61*bebae9c0SAndroid Build Coastguard Worker // initialize ABQ buffer type
62*bebae9c0SAndroid Build Coastguard Worker // assert below has been checked in android_audioPlayer_checkSourceSink
63*bebae9c0SAndroid Build Coastguard Worker assert(SL_DATAFORMAT_MIME == ap->mDataSource.mFormat.mFormatType);
64*bebae9c0SAndroid Build Coastguard Worker switch (ap->mDataSource.mFormat.mMIME.containerType) {
65*bebae9c0SAndroid Build Coastguard Worker case SL_CONTAINERTYPE_MPEG_TS:
66*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeMpeg2Ts;
67*bebae9c0SAndroid Build Coastguard Worker break;
68*bebae9c0SAndroid Build Coastguard Worker case SL_CONTAINERTYPE_AAC:
69*bebae9c0SAndroid Build Coastguard Worker case SL_CONTAINERTYPE_RAW: {
70*bebae9c0SAndroid Build Coastguard Worker const char* mime = (char*)ap->mDataSource.mFormat.mMIME.mimeType;
71*bebae9c0SAndroid Build Coastguard Worker if ((mime != NULL) && !(strcasecmp(mime, (const char *)SL_ANDROID_MIME_AACADTS) &&
72*bebae9c0SAndroid Build Coastguard Worker strcasecmp(mime, ANDROID_MIME_AACADTS_ANDROID_FRAMEWORK))) {
73*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeAacadts;
74*bebae9c0SAndroid Build Coastguard Worker } else {
75*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeInvalid;
76*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("CreateAudioPlayer: Invalid buffer type in Android Buffer Queue");
77*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_CONTENT_UNSUPPORTED;
78*bebae9c0SAndroid Build Coastguard Worker }
79*bebae9c0SAndroid Build Coastguard Worker } break;
80*bebae9c0SAndroid Build Coastguard Worker default:
81*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeInvalid;
82*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("CreateAudioPlayer: Invalid buffer type in Android Buffer Queue");
83*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_CONTENT_UNSUPPORTED;
84*bebae9c0SAndroid Build Coastguard Worker }
85*bebae9c0SAndroid Build Coastguard Worker
86*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mFront = ap->mAndroidBufferQueue.mBufferArray;
87*bebae9c0SAndroid Build Coastguard Worker ap->mAndroidBufferQueue.mRear = ap->mAndroidBufferQueue.mBufferArray;
88*bebae9c0SAndroid Build Coastguard Worker }
89*bebae9c0SAndroid Build Coastguard Worker
90*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
91*bebae9c0SAndroid Build Coastguard Worker }
92*bebae9c0SAndroid Build Coastguard Worker #endif
93*bebae9c0SAndroid Build Coastguard Worker
94*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateLEDDevice(SLEngineItf self,SLObjectItf * pDevice,SLuint32 deviceID,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)95*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateLEDDevice(SLEngineItf self, SLObjectItf *pDevice, SLuint32 deviceID,
96*bebae9c0SAndroid Build Coastguard Worker SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
97*bebae9c0SAndroid Build Coastguard Worker {
98*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
99*bebae9c0SAndroid Build Coastguard Worker
100*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_OPTIONAL
101*bebae9c0SAndroid Build Coastguard Worker if ((NULL == pDevice) || (SL_DEFAULTDEVICEID_LED != deviceID)) {
102*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
103*bebae9c0SAndroid Build Coastguard Worker } else {
104*bebae9c0SAndroid Build Coastguard Worker *pDevice = NULL;
105*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
106*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCLEDDevice_class = objectIDtoClass(SL_OBJECTID_LEDDEVICE);
107*bebae9c0SAndroid Build Coastguard Worker if (NULL == pCLEDDevice_class) {
108*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
109*bebae9c0SAndroid Build Coastguard Worker } else {
110*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCLEDDevice_class, numInterfaces, pInterfaceIds,
111*bebae9c0SAndroid Build Coastguard Worker pInterfaceRequired, &exposedMask, NULL);
112*bebae9c0SAndroid Build Coastguard Worker }
113*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
114*bebae9c0SAndroid Build Coastguard Worker CLEDDevice *thiz = (CLEDDevice *) construct(pCLEDDevice_class, exposedMask, self);
115*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
116*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
117*bebae9c0SAndroid Build Coastguard Worker } else {
118*bebae9c0SAndroid Build Coastguard Worker thiz->mDeviceID = deviceID;
119*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
120*bebae9c0SAndroid Build Coastguard Worker // return the new LED object
121*bebae9c0SAndroid Build Coastguard Worker *pDevice = &thiz->mObject.mItf;
122*bebae9c0SAndroid Build Coastguard Worker }
123*bebae9c0SAndroid Build Coastguard Worker }
124*bebae9c0SAndroid Build Coastguard Worker }
125*bebae9c0SAndroid Build Coastguard Worker #else
126*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
127*bebae9c0SAndroid Build Coastguard Worker #endif
128*bebae9c0SAndroid Build Coastguard Worker
129*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
130*bebae9c0SAndroid Build Coastguard Worker }
131*bebae9c0SAndroid Build Coastguard Worker
132*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateVibraDevice(SLEngineItf self,SLObjectItf * pDevice,SLuint32 deviceID,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)133*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateVibraDevice(SLEngineItf self, SLObjectItf *pDevice, SLuint32 deviceID,
134*bebae9c0SAndroid Build Coastguard Worker SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
135*bebae9c0SAndroid Build Coastguard Worker {
136*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
137*bebae9c0SAndroid Build Coastguard Worker
138*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_OPTIONAL
139*bebae9c0SAndroid Build Coastguard Worker if ((NULL == pDevice) || (SL_DEFAULTDEVICEID_VIBRA != deviceID)) {
140*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
141*bebae9c0SAndroid Build Coastguard Worker } else {
142*bebae9c0SAndroid Build Coastguard Worker *pDevice = NULL;
143*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
144*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCVibraDevice_class = objectIDtoClass(SL_OBJECTID_VIBRADEVICE);
145*bebae9c0SAndroid Build Coastguard Worker if (NULL == pCVibraDevice_class) {
146*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
147*bebae9c0SAndroid Build Coastguard Worker } else {
148*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCVibraDevice_class, numInterfaces,
149*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
150*bebae9c0SAndroid Build Coastguard Worker }
151*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
152*bebae9c0SAndroid Build Coastguard Worker CVibraDevice *thiz = (CVibraDevice *) construct(pCVibraDevice_class, exposedMask, self);
153*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
154*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
155*bebae9c0SAndroid Build Coastguard Worker } else {
156*bebae9c0SAndroid Build Coastguard Worker thiz->mDeviceID = deviceID;
157*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
158*bebae9c0SAndroid Build Coastguard Worker // return the new vibra object
159*bebae9c0SAndroid Build Coastguard Worker *pDevice = &thiz->mObject.mItf;
160*bebae9c0SAndroid Build Coastguard Worker }
161*bebae9c0SAndroid Build Coastguard Worker }
162*bebae9c0SAndroid Build Coastguard Worker }
163*bebae9c0SAndroid Build Coastguard Worker #else
164*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
165*bebae9c0SAndroid Build Coastguard Worker #endif
166*bebae9c0SAndroid Build Coastguard Worker
167*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
168*bebae9c0SAndroid Build Coastguard Worker }
169*bebae9c0SAndroid Build Coastguard Worker
170*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateAudioPlayer(SLEngineItf self,SLObjectItf * pPlayer,SLDataSource * pAudioSrc,SLDataSink * pAudioSnk,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)171*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateAudioPlayer(SLEngineItf self, SLObjectItf *pPlayer,
172*bebae9c0SAndroid Build Coastguard Worker SLDataSource *pAudioSrc, SLDataSink *pAudioSnk, SLuint32 numInterfaces,
173*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
174*bebae9c0SAndroid Build Coastguard Worker {
175*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
176*bebae9c0SAndroid Build Coastguard Worker
177*bebae9c0SAndroid Build Coastguard Worker if (NULL == pPlayer) {
178*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
179*bebae9c0SAndroid Build Coastguard Worker } else {
180*bebae9c0SAndroid Build Coastguard Worker *pPlayer = NULL;
181*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask, requiredMask;
182*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCAudioPlayer_class = objectIDtoClass(SL_OBJECTID_AUDIOPLAYER);
183*bebae9c0SAndroid Build Coastguard Worker assert(NULL != pCAudioPlayer_class);
184*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCAudioPlayer_class, numInterfaces,
185*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, &requiredMask);
186*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
187*bebae9c0SAndroid Build Coastguard Worker
188*bebae9c0SAndroid Build Coastguard Worker // Construct our new AudioPlayer instance
189*bebae9c0SAndroid Build Coastguard Worker CAudioPlayer *thiz = (CAudioPlayer *) construct(pCAudioPlayer_class, exposedMask, self);
190*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
191*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
192*bebae9c0SAndroid Build Coastguard Worker } else {
193*bebae9c0SAndroid Build Coastguard Worker
194*bebae9c0SAndroid Build Coastguard Worker do {
195*bebae9c0SAndroid Build Coastguard Worker
196*bebae9c0SAndroid Build Coastguard Worker // Initialize private fields not associated with an interface
197*bebae9c0SAndroid Build Coastguard Worker
198*bebae9c0SAndroid Build Coastguard Worker // Default data source in case of failure in checkDataSource
199*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mLocator.mLocatorType = SL_DATALOCATOR_NULL;
200*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mFormat.mFormatType = SL_DATAFORMAT_NULL;
201*bebae9c0SAndroid Build Coastguard Worker
202*bebae9c0SAndroid Build Coastguard Worker // Default data sink in case of failure in checkDataSink
203*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSink.mLocator.mLocatorType = SL_DATALOCATOR_NULL;
204*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSink.mFormat.mFormatType = SL_DATAFORMAT_NULL;
205*bebae9c0SAndroid Build Coastguard Worker
206*bebae9c0SAndroid Build Coastguard Worker // Default is no per-channel mute or solo
207*bebae9c0SAndroid Build Coastguard Worker thiz->mMuteMask = 0;
208*bebae9c0SAndroid Build Coastguard Worker thiz->mSoloMask = 0;
209*bebae9c0SAndroid Build Coastguard Worker
210*bebae9c0SAndroid Build Coastguard Worker // Will be set soon for PCM buffer queues, or later by platform-specific code
211*bebae9c0SAndroid Build Coastguard Worker // during Realize or Prefetch
212*bebae9c0SAndroid Build Coastguard Worker thiz->mNumChannels = UNKNOWN_NUMCHANNELS;
213*bebae9c0SAndroid Build Coastguard Worker thiz->mSampleRateMilliHz = UNKNOWN_SAMPLERATE;
214*bebae9c0SAndroid Build Coastguard Worker
215*bebae9c0SAndroid Build Coastguard Worker // More default values, in case destructor needs to be called early
216*bebae9c0SAndroid Build Coastguard Worker thiz->mDirectLevel = 0; // no attenuation
217*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_OUTPUTMIXEXT
218*bebae9c0SAndroid Build Coastguard Worker thiz->mTrack = NULL;
219*bebae9c0SAndroid Build Coastguard Worker thiz->mGains[0] = 1.0f;
220*bebae9c0SAndroid Build Coastguard Worker thiz->mGains[1] = 1.0f;
221*bebae9c0SAndroid Build Coastguard Worker thiz->mDestroyRequested = SL_BOOLEAN_FALSE;
222*bebae9c0SAndroid Build Coastguard Worker #endif
223*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE
224*bebae9c0SAndroid Build Coastguard Worker thiz->mSndFile.mPathname = NULL;
225*bebae9c0SAndroid Build Coastguard Worker thiz->mSndFile.mSNDFILE = NULL;
226*bebae9c0SAndroid Build Coastguard Worker memset(&thiz->mSndFile.mSfInfo, 0, sizeof(SF_INFO));
227*bebae9c0SAndroid Build Coastguard Worker memset(&thiz->mSndFile.mMutex, 0, sizeof(pthread_mutex_t));
228*bebae9c0SAndroid Build Coastguard Worker thiz->mSndFile.mEOF = SL_BOOLEAN_FALSE;
229*bebae9c0SAndroid Build Coastguard Worker thiz->mSndFile.mWhich = 0;
230*bebae9c0SAndroid Build Coastguard Worker memset(thiz->mSndFile.mBuffer, 0, sizeof(thiz->mSndFile.mBuffer));
231*bebae9c0SAndroid Build Coastguard Worker #endif
232*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
233*bebae9c0SAndroid Build Coastguard Worker // placement new (explicit constructor)
234*bebae9c0SAndroid Build Coastguard Worker // FIXME unnecessary once those fields are encapsulated in one class, rather
235*bebae9c0SAndroid Build Coastguard Worker // than a structure
236*bebae9c0SAndroid Build Coastguard Worker //###(void) new (&thiz->mAudioTrack) android::sp<android::AudioTrack>();
237*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mTrackPlayer) android::sp<android::TrackPlayerBase>();
238*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mCallbackProtector)
239*bebae9c0SAndroid Build Coastguard Worker android::sp<android::CallbackProtector>();
240*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mAuxEffect) android::sp<android::AudioEffect>();
241*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mAPlayer) android::sp<android::GenericPlayer>();
242*bebae9c0SAndroid Build Coastguard Worker // Android-specific POD fields are initialized in android_audioPlayer_create,
243*bebae9c0SAndroid Build Coastguard Worker // and assume calloc or memset 0 during allocation
244*bebae9c0SAndroid Build Coastguard Worker #endif
245*bebae9c0SAndroid Build Coastguard Worker
246*bebae9c0SAndroid Build Coastguard Worker // Check the source and sink parameters against generic constraints,
247*bebae9c0SAndroid Build Coastguard Worker // and make a local copy of all parameters in case other application threads
248*bebae9c0SAndroid Build Coastguard Worker // change memory concurrently.
249*bebae9c0SAndroid Build Coastguard Worker
250*bebae9c0SAndroid Build Coastguard Worker result = checkDataSource("pAudioSrc", pAudioSrc, &thiz->mDataSource,
251*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_URI | DATALOCATOR_MASK_ADDRESS |
252*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_BUFFERQUEUE
253*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
254*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_ANDROIDFD | DATALOCATOR_MASK_ANDROIDSIMPLEBUFFERQUEUE
255*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_ANDROIDBUFFERQUEUE
256*bebae9c0SAndroid Build Coastguard Worker #endif
257*bebae9c0SAndroid Build Coastguard Worker , DATAFORMAT_MASK_MIME | DATAFORMAT_MASK_PCM | DATAFORMAT_MASK_PCM_EX);
258*bebae9c0SAndroid Build Coastguard Worker
259*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
260*bebae9c0SAndroid Build Coastguard Worker break;
261*bebae9c0SAndroid Build Coastguard Worker }
262*bebae9c0SAndroid Build Coastguard Worker
263*bebae9c0SAndroid Build Coastguard Worker result = checkDataSink("pAudioSnk", pAudioSnk, &thiz->mDataSink,
264*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_OUTPUTMIX // for playback
265*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
266*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_ANDROIDSIMPLEBUFFERQUEUE // for decode to a BQ
267*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_BUFFERQUEUE // for decode to a BQ
268*bebae9c0SAndroid Build Coastguard Worker #endif
269*bebae9c0SAndroid Build Coastguard Worker , DATAFORMAT_MASK_NULL
270*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
271*bebae9c0SAndroid Build Coastguard Worker | DATAFORMAT_MASK_PCM | DATAFORMAT_MASK_PCM_EX // for decode to PCM
272*bebae9c0SAndroid Build Coastguard Worker #endif
273*bebae9c0SAndroid Build Coastguard Worker );
274*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
275*bebae9c0SAndroid Build Coastguard Worker break;
276*bebae9c0SAndroid Build Coastguard Worker }
277*bebae9c0SAndroid Build Coastguard Worker
278*bebae9c0SAndroid Build Coastguard Worker // It would be unsafe to ever refer to the application pointers again
279*bebae9c0SAndroid Build Coastguard Worker pAudioSrc = NULL;
280*bebae9c0SAndroid Build Coastguard Worker pAudioSnk = NULL;
281*bebae9c0SAndroid Build Coastguard Worker
282*bebae9c0SAndroid Build Coastguard Worker // Check that the requested interfaces are compatible with data source and sink
283*bebae9c0SAndroid Build Coastguard Worker result = checkSourceSinkVsInterfacesCompatibility(&thiz->mDataSource,
284*bebae9c0SAndroid Build Coastguard Worker &thiz->mDataSink, pCAudioPlayer_class, requiredMask);
285*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
286*bebae9c0SAndroid Build Coastguard Worker break;
287*bebae9c0SAndroid Build Coastguard Worker }
288*bebae9c0SAndroid Build Coastguard Worker
289*bebae9c0SAndroid Build Coastguard Worker // copy the buffer queue count from source locator (for playback) / from the
290*bebae9c0SAndroid Build Coastguard Worker // sink locator (for decode on ANDROID build) to the buffer queue interface
291*bebae9c0SAndroid Build Coastguard Worker // we have already range-checked the value down to a smaller width
292*bebae9c0SAndroid Build Coastguard Worker SLuint16 nbBuffers = 0;
293*bebae9c0SAndroid Build Coastguard Worker bool usesAdvancedBufferHeaders = false;
294*bebae9c0SAndroid Build Coastguard Worker bool usesSimpleBufferQueue = false;
295*bebae9c0SAndroid Build Coastguard Worker // creating an AudioPlayer which decodes AAC ADTS buffers to a PCM buffer queue
296*bebae9c0SAndroid Build Coastguard Worker // will cause usesAdvancedBufferHeaders and usesSimpleBufferQueue to be true
297*bebae9c0SAndroid Build Coastguard Worker switch (thiz->mDataSource.mLocator.mLocatorType) {
298*bebae9c0SAndroid Build Coastguard Worker case SL_DATALOCATOR_BUFFERQUEUE:
299*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
300*bebae9c0SAndroid Build Coastguard Worker case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
301*bebae9c0SAndroid Build Coastguard Worker #endif
302*bebae9c0SAndroid Build Coastguard Worker usesSimpleBufferQueue = true;
303*bebae9c0SAndroid Build Coastguard Worker nbBuffers = (SLuint16) thiz->mDataSource.mLocator.mBufferQueue.numBuffers;
304*bebae9c0SAndroid Build Coastguard Worker assert(SL_DATAFORMAT_PCM == thiz->mDataSource.mFormat.mFormatType
305*bebae9c0SAndroid Build Coastguard Worker || SL_ANDROID_DATAFORMAT_PCM_EX
306*bebae9c0SAndroid Build Coastguard Worker == thiz->mDataSource.mFormat.mFormatType);
307*bebae9c0SAndroid Build Coastguard Worker thiz->mNumChannels = thiz->mDataSource.mFormat.mPCM.numChannels;
308*bebae9c0SAndroid Build Coastguard Worker thiz->mSampleRateMilliHz = thiz->mDataSource.mFormat.mPCM.samplesPerSec;
309*bebae9c0SAndroid Build Coastguard Worker break;
310*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
311*bebae9c0SAndroid Build Coastguard Worker case SL_DATALOCATOR_ANDROIDBUFFERQUEUE:
312*bebae9c0SAndroid Build Coastguard Worker usesAdvancedBufferHeaders = true;
313*bebae9c0SAndroid Build Coastguard Worker nbBuffers = (SLuint16) thiz->mDataSource.mLocator.mABQ.numBuffers;
314*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mNumBuffers = nbBuffers;
315*bebae9c0SAndroid Build Coastguard Worker break;
316*bebae9c0SAndroid Build Coastguard Worker #endif
317*bebae9c0SAndroid Build Coastguard Worker default:
318*bebae9c0SAndroid Build Coastguard Worker nbBuffers = 0;
319*bebae9c0SAndroid Build Coastguard Worker break;
320*bebae9c0SAndroid Build Coastguard Worker }
321*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
322*bebae9c0SAndroid Build Coastguard Worker switch (thiz->mDataSink.mLocator.mLocatorType) {
323*bebae9c0SAndroid Build Coastguard Worker case SL_DATALOCATOR_BUFFERQUEUE:
324*bebae9c0SAndroid Build Coastguard Worker case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE:
325*bebae9c0SAndroid Build Coastguard Worker usesSimpleBufferQueue = true;
326*bebae9c0SAndroid Build Coastguard Worker nbBuffers = thiz->mDataSink.mLocator.mBufferQueue.numBuffers;
327*bebae9c0SAndroid Build Coastguard Worker assert(SL_DATAFORMAT_PCM == thiz->mDataSink.mFormat.mFormatType
328*bebae9c0SAndroid Build Coastguard Worker || SL_ANDROID_DATAFORMAT_PCM_EX
329*bebae9c0SAndroid Build Coastguard Worker == thiz->mDataSink.mFormat.mFormatType);
330*bebae9c0SAndroid Build Coastguard Worker // FIXME The values specified by the app are meaningless. We get the
331*bebae9c0SAndroid Build Coastguard Worker // real values from the decoder. But the data sink checks currently require
332*bebae9c0SAndroid Build Coastguard Worker // that the app specify these useless values. Needs doc/fix.
333*bebae9c0SAndroid Build Coastguard Worker // Instead use the "unknown" values, as needed by prepare completion.
334*bebae9c0SAndroid Build Coastguard Worker // thiz->mNumChannels = thiz->mDataSink.mFormat.mPCM.numChannels;
335*bebae9c0SAndroid Build Coastguard Worker // thiz->mSampleRateMilliHz = thiz->mDataSink.mFormat.mPCM.samplesPerSec;
336*bebae9c0SAndroid Build Coastguard Worker thiz->mNumChannels = UNKNOWN_NUMCHANNELS;
337*bebae9c0SAndroid Build Coastguard Worker thiz->mSampleRateMilliHz = UNKNOWN_SAMPLERATE;
338*bebae9c0SAndroid Build Coastguard Worker break;
339*bebae9c0SAndroid Build Coastguard Worker default:
340*bebae9c0SAndroid Build Coastguard Worker // leave nbBuffers unchanged
341*bebae9c0SAndroid Build Coastguard Worker break;
342*bebae9c0SAndroid Build Coastguard Worker }
343*bebae9c0SAndroid Build Coastguard Worker #endif
344*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferQueue.mNumBuffers = nbBuffers;
345*bebae9c0SAndroid Build Coastguard Worker
346*bebae9c0SAndroid Build Coastguard Worker // check the audio source and sink parameters against platform support
347*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
348*bebae9c0SAndroid Build Coastguard Worker result = android_audioPlayer_checkSourceSink(thiz);
349*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
350*bebae9c0SAndroid Build Coastguard Worker break;
351*bebae9c0SAndroid Build Coastguard Worker }
352*bebae9c0SAndroid Build Coastguard Worker #endif
353*bebae9c0SAndroid Build Coastguard Worker
354*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SNDFILE
355*bebae9c0SAndroid Build Coastguard Worker result = SndFile_checkAudioPlayerSourceSink(thiz);
356*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
357*bebae9c0SAndroid Build Coastguard Worker break;
358*bebae9c0SAndroid Build Coastguard Worker }
359*bebae9c0SAndroid Build Coastguard Worker #endif
360*bebae9c0SAndroid Build Coastguard Worker
361*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_OUTPUTMIXEXT
362*bebae9c0SAndroid Build Coastguard Worker result = IOutputMixExt_checkAudioPlayerSourceSink(thiz);
363*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
364*bebae9c0SAndroid Build Coastguard Worker break;
365*bebae9c0SAndroid Build Coastguard Worker }
366*bebae9c0SAndroid Build Coastguard Worker #endif
367*bebae9c0SAndroid Build Coastguard Worker
368*bebae9c0SAndroid Build Coastguard Worker // Allocate memory for buffer queue
369*bebae9c0SAndroid Build Coastguard Worker if (usesAdvancedBufferHeaders) {
370*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
371*bebae9c0SAndroid Build Coastguard Worker // locator is SL_DATALOCATOR_ANDROIDBUFFERQUEUE
372*bebae9c0SAndroid Build Coastguard Worker result = initializeAndroidBufferQueueMembers(thiz);
373*bebae9c0SAndroid Build Coastguard Worker #else
374*bebae9c0SAndroid Build Coastguard Worker assert(false);
375*bebae9c0SAndroid Build Coastguard Worker #endif
376*bebae9c0SAndroid Build Coastguard Worker }
377*bebae9c0SAndroid Build Coastguard Worker
378*bebae9c0SAndroid Build Coastguard Worker if (usesSimpleBufferQueue) {
379*bebae9c0SAndroid Build Coastguard Worker // locator is SL_DATALOCATOR_BUFFERQUEUE
380*bebae9c0SAndroid Build Coastguard Worker // or SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE
381*bebae9c0SAndroid Build Coastguard Worker result = initializeBufferQueueMembers(thiz);
382*bebae9c0SAndroid Build Coastguard Worker }
383*bebae9c0SAndroid Build Coastguard Worker
384*bebae9c0SAndroid Build Coastguard Worker // used to store the data source of our audio player
385*bebae9c0SAndroid Build Coastguard Worker thiz->mDynamicSource.mDataSource = &thiz->mDataSource.u.mSource;
386*bebae9c0SAndroid Build Coastguard Worker
387*bebae9c0SAndroid Build Coastguard Worker // platform-specific initialization
388*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
389*bebae9c0SAndroid Build Coastguard Worker android_audioPlayer_create(thiz);
390*bebae9c0SAndroid Build Coastguard Worker #endif
391*bebae9c0SAndroid Build Coastguard Worker
392*bebae9c0SAndroid Build Coastguard Worker } while (0);
393*bebae9c0SAndroid Build Coastguard Worker
394*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
395*bebae9c0SAndroid Build Coastguard Worker IObject_Destroy(&thiz->mObject.mItf);
396*bebae9c0SAndroid Build Coastguard Worker } else {
397*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
398*bebae9c0SAndroid Build Coastguard Worker // return the new audio player object
399*bebae9c0SAndroid Build Coastguard Worker *pPlayer = &thiz->mObject.mItf;
400*bebae9c0SAndroid Build Coastguard Worker }
401*bebae9c0SAndroid Build Coastguard Worker
402*bebae9c0SAndroid Build Coastguard Worker }
403*bebae9c0SAndroid Build Coastguard Worker }
404*bebae9c0SAndroid Build Coastguard Worker
405*bebae9c0SAndroid Build Coastguard Worker }
406*bebae9c0SAndroid Build Coastguard Worker
407*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
408*bebae9c0SAndroid Build Coastguard Worker }
409*bebae9c0SAndroid Build Coastguard Worker
410*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateAudioRecorder(SLEngineItf self,SLObjectItf * pRecorder,SLDataSource * pAudioSrc,SLDataSink * pAudioSnk,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)411*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateAudioRecorder(SLEngineItf self, SLObjectItf *pRecorder,
412*bebae9c0SAndroid Build Coastguard Worker SLDataSource *pAudioSrc, SLDataSink *pAudioSnk, SLuint32 numInterfaces,
413*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
414*bebae9c0SAndroid Build Coastguard Worker {
415*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
416*bebae9c0SAndroid Build Coastguard Worker
417*bebae9c0SAndroid Build Coastguard Worker #if (USE_PROFILES & USE_PROFILES_OPTIONAL) || defined(ANDROID)
418*bebae9c0SAndroid Build Coastguard Worker if (NULL == pRecorder) {
419*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
420*bebae9c0SAndroid Build Coastguard Worker } else {
421*bebae9c0SAndroid Build Coastguard Worker *pRecorder = NULL;
422*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
423*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCAudioRecorder_class = objectIDtoClass(SL_OBJECTID_AUDIORECORDER);
424*bebae9c0SAndroid Build Coastguard Worker if (NULL == pCAudioRecorder_class) {
425*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
426*bebae9c0SAndroid Build Coastguard Worker } else {
427*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCAudioRecorder_class, numInterfaces,
428*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
429*bebae9c0SAndroid Build Coastguard Worker }
430*bebae9c0SAndroid Build Coastguard Worker
431*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
432*bebae9c0SAndroid Build Coastguard Worker
433*bebae9c0SAndroid Build Coastguard Worker // Construct our new AudioRecorder instance
434*bebae9c0SAndroid Build Coastguard Worker CAudioRecorder *thiz = (CAudioRecorder *) construct(pCAudioRecorder_class, exposedMask,
435*bebae9c0SAndroid Build Coastguard Worker self);
436*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
437*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
438*bebae9c0SAndroid Build Coastguard Worker } else {
439*bebae9c0SAndroid Build Coastguard Worker
440*bebae9c0SAndroid Build Coastguard Worker do {
441*bebae9c0SAndroid Build Coastguard Worker
442*bebae9c0SAndroid Build Coastguard Worker // Initialize fields not associated with any interface
443*bebae9c0SAndroid Build Coastguard Worker
444*bebae9c0SAndroid Build Coastguard Worker // Default data source in case of failure in checkDataSource
445*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mLocator.mLocatorType = SL_DATALOCATOR_NULL;
446*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mFormat.mFormatType = SL_DATAFORMAT_NULL;
447*bebae9c0SAndroid Build Coastguard Worker
448*bebae9c0SAndroid Build Coastguard Worker // Default data sink in case of failure in checkDataSink
449*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSink.mLocator.mLocatorType = SL_DATALOCATOR_NULL;
450*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSink.mFormat.mFormatType = SL_DATAFORMAT_NULL;
451*bebae9c0SAndroid Build Coastguard Worker
452*bebae9c0SAndroid Build Coastguard Worker // These fields are set to real values by
453*bebae9c0SAndroid Build Coastguard Worker // android_audioRecorder_checkSourceSink. Note that the data sink is
454*bebae9c0SAndroid Build Coastguard Worker // always PCM buffer queue, so we know the channel count and sample rate early.
455*bebae9c0SAndroid Build Coastguard Worker thiz->mNumChannels = UNKNOWN_NUMCHANNELS;
456*bebae9c0SAndroid Build Coastguard Worker thiz->mSampleRateMilliHz = UNKNOWN_SAMPLERATE;
457*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
458*bebae9c0SAndroid Build Coastguard Worker // placement new (explicit constructor)
459*bebae9c0SAndroid Build Coastguard Worker // FIXME unnecessary once those fields are encapsulated in one class, rather
460*bebae9c0SAndroid Build Coastguard Worker // than a structure
461*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mAudioRecord) android::sp<android::AudioRecord>();
462*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mCallbackHandle) android::sp<android::AudioRecordCallback>();
463*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mCallbackProtector)
464*bebae9c0SAndroid Build Coastguard Worker android::sp<android::CallbackProtector>();
465*bebae9c0SAndroid Build Coastguard Worker thiz->mRecordSource = AUDIO_SOURCE_DEFAULT;
466*bebae9c0SAndroid Build Coastguard Worker #endif
467*bebae9c0SAndroid Build Coastguard Worker
468*bebae9c0SAndroid Build Coastguard Worker // Check the source and sink parameters, and make a local copy of all parameters
469*bebae9c0SAndroid Build Coastguard Worker result = checkDataSource("pAudioSrc", pAudioSrc, &thiz->mDataSource,
470*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_IODEVICE, DATAFORMAT_MASK_NULL);
471*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
472*bebae9c0SAndroid Build Coastguard Worker break;
473*bebae9c0SAndroid Build Coastguard Worker }
474*bebae9c0SAndroid Build Coastguard Worker result = checkDataSink("pAudioSnk", pAudioSnk, &thiz->mDataSink,
475*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_URI
476*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
477*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_ANDROIDSIMPLEBUFFERQUEUE
478*bebae9c0SAndroid Build Coastguard Worker #endif
479*bebae9c0SAndroid Build Coastguard Worker , DATAFORMAT_MASK_MIME | DATAFORMAT_MASK_PCM | DATAFORMAT_MASK_PCM_EX
480*bebae9c0SAndroid Build Coastguard Worker );
481*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
482*bebae9c0SAndroid Build Coastguard Worker break;
483*bebae9c0SAndroid Build Coastguard Worker }
484*bebae9c0SAndroid Build Coastguard Worker
485*bebae9c0SAndroid Build Coastguard Worker // It would be unsafe to ever refer to the application pointers again
486*bebae9c0SAndroid Build Coastguard Worker pAudioSrc = NULL;
487*bebae9c0SAndroid Build Coastguard Worker pAudioSnk = NULL;
488*bebae9c0SAndroid Build Coastguard Worker
489*bebae9c0SAndroid Build Coastguard Worker // check the audio source and sink parameters against platform support
490*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
491*bebae9c0SAndroid Build Coastguard Worker result = android_audioRecorder_checkSourceSink(thiz);
492*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
493*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Cannot create AudioRecorder: invalid source or sink");
494*bebae9c0SAndroid Build Coastguard Worker break;
495*bebae9c0SAndroid Build Coastguard Worker }
496*bebae9c0SAndroid Build Coastguard Worker #endif
497*bebae9c0SAndroid Build Coastguard Worker
498*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
499*bebae9c0SAndroid Build Coastguard Worker // Allocate memory for buffer queue
500*bebae9c0SAndroid Build Coastguard Worker SLuint32 locatorType = thiz->mDataSink.mLocator.mLocatorType;
501*bebae9c0SAndroid Build Coastguard Worker if (locatorType == SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE) {
502*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferQueue.mNumBuffers =
503*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSink.mLocator.mBufferQueue.numBuffers;
504*bebae9c0SAndroid Build Coastguard Worker // inline allocation of circular Buffer Queue mArray, up to a typical max
505*bebae9c0SAndroid Build Coastguard Worker if (BUFFER_HEADER_TYPICAL >= thiz->mBufferQueue.mNumBuffers) {
506*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferQueue.mArray = thiz->mBufferQueue.mTypical;
507*bebae9c0SAndroid Build Coastguard Worker } else {
508*bebae9c0SAndroid Build Coastguard Worker // Avoid possible integer overflow during multiplication; this arbitrary
509*bebae9c0SAndroid Build Coastguard Worker // maximum is big enough to not interfere with real applications, but
510*bebae9c0SAndroid Build Coastguard Worker // small enough to not overflow.
511*bebae9c0SAndroid Build Coastguard Worker if (thiz->mBufferQueue.mNumBuffers >= 256) {
512*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
513*bebae9c0SAndroid Build Coastguard Worker break;
514*bebae9c0SAndroid Build Coastguard Worker }
515*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferQueue.mArray = (BufferHeader *) malloc((thiz->mBufferQueue.
516*bebae9c0SAndroid Build Coastguard Worker mNumBuffers + 1) * sizeof(BufferHeader));
517*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz->mBufferQueue.mArray) {
518*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
519*bebae9c0SAndroid Build Coastguard Worker break;
520*bebae9c0SAndroid Build Coastguard Worker }
521*bebae9c0SAndroid Build Coastguard Worker }
522*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferQueue.mFront = thiz->mBufferQueue.mArray;
523*bebae9c0SAndroid Build Coastguard Worker thiz->mBufferQueue.mRear = thiz->mBufferQueue.mArray;
524*bebae9c0SAndroid Build Coastguard Worker }
525*bebae9c0SAndroid Build Coastguard Worker #endif
526*bebae9c0SAndroid Build Coastguard Worker
527*bebae9c0SAndroid Build Coastguard Worker // platform-specific initialization
528*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
529*bebae9c0SAndroid Build Coastguard Worker android_audioRecorder_create(thiz);
530*bebae9c0SAndroid Build Coastguard Worker #endif
531*bebae9c0SAndroid Build Coastguard Worker
532*bebae9c0SAndroid Build Coastguard Worker } while (0);
533*bebae9c0SAndroid Build Coastguard Worker
534*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS != result) {
535*bebae9c0SAndroid Build Coastguard Worker IObject_Destroy(&thiz->mObject.mItf);
536*bebae9c0SAndroid Build Coastguard Worker } else {
537*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
538*bebae9c0SAndroid Build Coastguard Worker // return the new audio recorder object
539*bebae9c0SAndroid Build Coastguard Worker *pRecorder = &thiz->mObject.mItf;
540*bebae9c0SAndroid Build Coastguard Worker }
541*bebae9c0SAndroid Build Coastguard Worker }
542*bebae9c0SAndroid Build Coastguard Worker
543*bebae9c0SAndroid Build Coastguard Worker }
544*bebae9c0SAndroid Build Coastguard Worker
545*bebae9c0SAndroid Build Coastguard Worker }
546*bebae9c0SAndroid Build Coastguard Worker #else
547*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
548*bebae9c0SAndroid Build Coastguard Worker #endif
549*bebae9c0SAndroid Build Coastguard Worker
550*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
551*bebae9c0SAndroid Build Coastguard Worker }
552*bebae9c0SAndroid Build Coastguard Worker
553*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateMidiPlayer(SLEngineItf self,SLObjectItf * pPlayer,SLDataSource * pMIDISrc,SLDataSource * pBankSrc,SLDataSink * pAudioOutput,SLDataSink * pVibra,SLDataSink * pLEDArray,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)554*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateMidiPlayer(SLEngineItf self, SLObjectItf *pPlayer,
555*bebae9c0SAndroid Build Coastguard Worker SLDataSource *pMIDISrc, SLDataSource *pBankSrc, SLDataSink *pAudioOutput,
556*bebae9c0SAndroid Build Coastguard Worker SLDataSink *pVibra, SLDataSink *pLEDArray, SLuint32 numInterfaces,
557*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
558*bebae9c0SAndroid Build Coastguard Worker {
559*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
560*bebae9c0SAndroid Build Coastguard Worker
561*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE)
562*bebae9c0SAndroid Build Coastguard Worker if ((NULL == pPlayer) || (NULL == pMIDISrc) || (NULL == pAudioOutput)) {
563*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
564*bebae9c0SAndroid Build Coastguard Worker } else {
565*bebae9c0SAndroid Build Coastguard Worker *pPlayer = NULL;
566*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
567*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCMidiPlayer_class = objectIDtoClass(SL_OBJECTID_MIDIPLAYER);
568*bebae9c0SAndroid Build Coastguard Worker if (NULL == pCMidiPlayer_class) {
569*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
570*bebae9c0SAndroid Build Coastguard Worker } else {
571*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCMidiPlayer_class, numInterfaces,
572*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
573*bebae9c0SAndroid Build Coastguard Worker }
574*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
575*bebae9c0SAndroid Build Coastguard Worker CMidiPlayer *thiz = (CMidiPlayer *) construct(pCMidiPlayer_class, exposedMask, self);
576*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
577*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
578*bebae9c0SAndroid Build Coastguard Worker } else {
579*bebae9c0SAndroid Build Coastguard Worker #if 0
580*bebae9c0SAndroid Build Coastguard Worker "pMIDISrc", pMIDISrc, URI | MIDIBUFFERQUEUE, NONE
581*bebae9c0SAndroid Build Coastguard Worker "pBankSrc", pBanksrc, NULL | URI | ADDRESS, NULL
582*bebae9c0SAndroid Build Coastguard Worker "pAudioOutput", pAudioOutput, OUTPUTMIX, NULL
583*bebae9c0SAndroid Build Coastguard Worker "pVibra", pVibra, NULL | IODEVICE, NULL
584*bebae9c0SAndroid Build Coastguard Worker "pLEDArray", pLEDArray, NULL | IODEVICE, NULL
585*bebae9c0SAndroid Build Coastguard Worker #endif
586*bebae9c0SAndroid Build Coastguard Worker // a fake value - why not use value from IPlay_init? what does CT check for?
587*bebae9c0SAndroid Build Coastguard Worker thiz->mPlay.mDuration = 0;
588*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
589*bebae9c0SAndroid Build Coastguard Worker // return the new MIDI player object
590*bebae9c0SAndroid Build Coastguard Worker *pPlayer = &thiz->mObject.mItf;
591*bebae9c0SAndroid Build Coastguard Worker }
592*bebae9c0SAndroid Build Coastguard Worker }
593*bebae9c0SAndroid Build Coastguard Worker }
594*bebae9c0SAndroid Build Coastguard Worker #else
595*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
596*bebae9c0SAndroid Build Coastguard Worker #endif
597*bebae9c0SAndroid Build Coastguard Worker
598*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
599*bebae9c0SAndroid Build Coastguard Worker }
600*bebae9c0SAndroid Build Coastguard Worker
601*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateListener(SLEngineItf self,SLObjectItf * pListener,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)602*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateListener(SLEngineItf self, SLObjectItf *pListener,
603*bebae9c0SAndroid Build Coastguard Worker SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
604*bebae9c0SAndroid Build Coastguard Worker {
605*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
606*bebae9c0SAndroid Build Coastguard Worker
607*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_GAME
608*bebae9c0SAndroid Build Coastguard Worker if (NULL == pListener) {
609*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
610*bebae9c0SAndroid Build Coastguard Worker } else {
611*bebae9c0SAndroid Build Coastguard Worker *pListener = NULL;
612*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
613*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCListener_class = objectIDtoClass(SL_OBJECTID_LISTENER);
614*bebae9c0SAndroid Build Coastguard Worker if (NULL == pCListener_class) {
615*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
616*bebae9c0SAndroid Build Coastguard Worker } else {
617*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCListener_class, numInterfaces,
618*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
619*bebae9c0SAndroid Build Coastguard Worker }
620*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
621*bebae9c0SAndroid Build Coastguard Worker CListener *thiz = (CListener *) construct(pCListener_class, exposedMask, self);
622*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
623*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
624*bebae9c0SAndroid Build Coastguard Worker } else {
625*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
626*bebae9c0SAndroid Build Coastguard Worker // return the new 3D listener object
627*bebae9c0SAndroid Build Coastguard Worker *pListener = &thiz->mObject.mItf;
628*bebae9c0SAndroid Build Coastguard Worker }
629*bebae9c0SAndroid Build Coastguard Worker }
630*bebae9c0SAndroid Build Coastguard Worker }
631*bebae9c0SAndroid Build Coastguard Worker #else
632*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
633*bebae9c0SAndroid Build Coastguard Worker #endif
634*bebae9c0SAndroid Build Coastguard Worker
635*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
636*bebae9c0SAndroid Build Coastguard Worker }
637*bebae9c0SAndroid Build Coastguard Worker
638*bebae9c0SAndroid Build Coastguard Worker
IEngine_Create3DGroup(SLEngineItf self,SLObjectItf * pGroup,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)639*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_Create3DGroup(SLEngineItf self, SLObjectItf *pGroup, SLuint32 numInterfaces,
640*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
641*bebae9c0SAndroid Build Coastguard Worker {
642*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
643*bebae9c0SAndroid Build Coastguard Worker
644*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & USE_PROFILES_GAME
645*bebae9c0SAndroid Build Coastguard Worker if (NULL == pGroup) {
646*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
647*bebae9c0SAndroid Build Coastguard Worker } else {
648*bebae9c0SAndroid Build Coastguard Worker *pGroup = NULL;
649*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
650*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pC3DGroup_class = objectIDtoClass(SL_OBJECTID_3DGROUP);
651*bebae9c0SAndroid Build Coastguard Worker if (NULL == pC3DGroup_class) {
652*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
653*bebae9c0SAndroid Build Coastguard Worker } else {
654*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pC3DGroup_class, numInterfaces,
655*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
656*bebae9c0SAndroid Build Coastguard Worker }
657*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
658*bebae9c0SAndroid Build Coastguard Worker C3DGroup *thiz = (C3DGroup *) construct(pC3DGroup_class, exposedMask, self);
659*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
660*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
661*bebae9c0SAndroid Build Coastguard Worker } else {
662*bebae9c0SAndroid Build Coastguard Worker thiz->mMemberMask = 0;
663*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
664*bebae9c0SAndroid Build Coastguard Worker // return the new 3D group object
665*bebae9c0SAndroid Build Coastguard Worker *pGroup = &thiz->mObject.mItf;
666*bebae9c0SAndroid Build Coastguard Worker }
667*bebae9c0SAndroid Build Coastguard Worker }
668*bebae9c0SAndroid Build Coastguard Worker }
669*bebae9c0SAndroid Build Coastguard Worker #else
670*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
671*bebae9c0SAndroid Build Coastguard Worker #endif
672*bebae9c0SAndroid Build Coastguard Worker
673*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
674*bebae9c0SAndroid Build Coastguard Worker }
675*bebae9c0SAndroid Build Coastguard Worker
676*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateOutputMix(SLEngineItf self,SLObjectItf * pMix,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)677*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateOutputMix(SLEngineItf self, SLObjectItf *pMix, SLuint32 numInterfaces,
678*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
679*bebae9c0SAndroid Build Coastguard Worker {
680*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
681*bebae9c0SAndroid Build Coastguard Worker
682*bebae9c0SAndroid Build Coastguard Worker if (NULL == pMix) {
683*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
684*bebae9c0SAndroid Build Coastguard Worker } else {
685*bebae9c0SAndroid Build Coastguard Worker *pMix = NULL;
686*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
687*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCOutputMix_class = objectIDtoClass(SL_OBJECTID_OUTPUTMIX);
688*bebae9c0SAndroid Build Coastguard Worker assert(NULL != pCOutputMix_class);
689*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCOutputMix_class, numInterfaces,
690*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
691*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
692*bebae9c0SAndroid Build Coastguard Worker COutputMix *thiz = (COutputMix *) construct(pCOutputMix_class, exposedMask, self);
693*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
694*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
695*bebae9c0SAndroid Build Coastguard Worker } else {
696*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
697*bebae9c0SAndroid Build Coastguard Worker android_outputMix_create(thiz);
698*bebae9c0SAndroid Build Coastguard Worker #endif
699*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL
700*bebae9c0SAndroid Build Coastguard Worker IEngine *thisEngine = &thiz->mObject.mEngine->mEngine;
701*bebae9c0SAndroid Build Coastguard Worker interface_lock_exclusive(thisEngine);
702*bebae9c0SAndroid Build Coastguard Worker bool unpause = false;
703*bebae9c0SAndroid Build Coastguard Worker if (NULL == thisEngine->mOutputMix) {
704*bebae9c0SAndroid Build Coastguard Worker thisEngine->mOutputMix = thiz;
705*bebae9c0SAndroid Build Coastguard Worker unpause = true;
706*bebae9c0SAndroid Build Coastguard Worker }
707*bebae9c0SAndroid Build Coastguard Worker interface_unlock_exclusive(thisEngine);
708*bebae9c0SAndroid Build Coastguard Worker #endif
709*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
710*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL
711*bebae9c0SAndroid Build Coastguard Worker if (unpause) {
712*bebae9c0SAndroid Build Coastguard Worker // Enable SDL_callback to be called periodically by SDL's internal thread
713*bebae9c0SAndroid Build Coastguard Worker SDL_PauseAudio(0);
714*bebae9c0SAndroid Build Coastguard Worker }
715*bebae9c0SAndroid Build Coastguard Worker #endif
716*bebae9c0SAndroid Build Coastguard Worker // return the new output mix object
717*bebae9c0SAndroid Build Coastguard Worker *pMix = &thiz->mObject.mItf;
718*bebae9c0SAndroid Build Coastguard Worker }
719*bebae9c0SAndroid Build Coastguard Worker }
720*bebae9c0SAndroid Build Coastguard Worker }
721*bebae9c0SAndroid Build Coastguard Worker
722*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
723*bebae9c0SAndroid Build Coastguard Worker }
724*bebae9c0SAndroid Build Coastguard Worker
725*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateMetadataExtractor(SLEngineItf self,SLObjectItf * pMetadataExtractor,SLDataSource * pDataSource,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)726*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateMetadataExtractor(SLEngineItf self, SLObjectItf *pMetadataExtractor,
727*bebae9c0SAndroid Build Coastguard Worker SLDataSource *pDataSource, SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds,
728*bebae9c0SAndroid Build Coastguard Worker const SLboolean *pInterfaceRequired)
729*bebae9c0SAndroid Build Coastguard Worker {
730*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
731*bebae9c0SAndroid Build Coastguard Worker
732*bebae9c0SAndroid Build Coastguard Worker #if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC)
733*bebae9c0SAndroid Build Coastguard Worker if (NULL == pMetadataExtractor) {
734*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
735*bebae9c0SAndroid Build Coastguard Worker } else {
736*bebae9c0SAndroid Build Coastguard Worker *pMetadataExtractor = NULL;
737*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
738*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCMetadataExtractor_class =
739*bebae9c0SAndroid Build Coastguard Worker objectIDtoClass(SL_OBJECTID_METADATAEXTRACTOR);
740*bebae9c0SAndroid Build Coastguard Worker if (NULL == pCMetadataExtractor_class) {
741*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
742*bebae9c0SAndroid Build Coastguard Worker } else {
743*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCMetadataExtractor_class, numInterfaces,
744*bebae9c0SAndroid Build Coastguard Worker pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
745*bebae9c0SAndroid Build Coastguard Worker }
746*bebae9c0SAndroid Build Coastguard Worker if (SL_RESULT_SUCCESS == result) {
747*bebae9c0SAndroid Build Coastguard Worker CMetadataExtractor *thiz = (CMetadataExtractor *)
748*bebae9c0SAndroid Build Coastguard Worker construct(pCMetadataExtractor_class, exposedMask, self);
749*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
750*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
751*bebae9c0SAndroid Build Coastguard Worker } else {
752*bebae9c0SAndroid Build Coastguard Worker #if 0
753*bebae9c0SAndroid Build Coastguard Worker "pDataSource", pDataSource, NONE, NONE
754*bebae9c0SAndroid Build Coastguard Worker #endif
755*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
756*bebae9c0SAndroid Build Coastguard Worker // return the new metadata extractor object
757*bebae9c0SAndroid Build Coastguard Worker *pMetadataExtractor = &thiz->mObject.mItf;
758*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
759*bebae9c0SAndroid Build Coastguard Worker }
760*bebae9c0SAndroid Build Coastguard Worker }
761*bebae9c0SAndroid Build Coastguard Worker }
762*bebae9c0SAndroid Build Coastguard Worker #else
763*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
764*bebae9c0SAndroid Build Coastguard Worker #endif
765*bebae9c0SAndroid Build Coastguard Worker
766*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
767*bebae9c0SAndroid Build Coastguard Worker }
768*bebae9c0SAndroid Build Coastguard Worker
769*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateExtensionObject(SLEngineItf self,SLObjectItf * pObject,void * pParameters,SLuint32 objectID,SLuint32 numInterfaces,const SLInterfaceID * pInterfaceIds,const SLboolean * pInterfaceRequired)770*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_CreateExtensionObject(SLEngineItf self, SLObjectItf *pObject,
771*bebae9c0SAndroid Build Coastguard Worker void *pParameters, SLuint32 objectID, SLuint32 numInterfaces,
772*bebae9c0SAndroid Build Coastguard Worker const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired)
773*bebae9c0SAndroid Build Coastguard Worker {
774*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
775*bebae9c0SAndroid Build Coastguard Worker
776*bebae9c0SAndroid Build Coastguard Worker if (NULL == pObject) {
777*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
778*bebae9c0SAndroid Build Coastguard Worker } else {
779*bebae9c0SAndroid Build Coastguard Worker *pObject = NULL;
780*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
781*bebae9c0SAndroid Build Coastguard Worker }
782*bebae9c0SAndroid Build Coastguard Worker
783*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
784*bebae9c0SAndroid Build Coastguard Worker }
785*bebae9c0SAndroid Build Coastguard Worker
786*bebae9c0SAndroid Build Coastguard Worker
IEngine_QueryNumSupportedInterfaces(SLEngineItf self,SLuint32 objectID,SLuint32 * pNumSupportedInterfaces)787*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_QueryNumSupportedInterfaces(SLEngineItf self,
788*bebae9c0SAndroid Build Coastguard Worker SLuint32 objectID, SLuint32 *pNumSupportedInterfaces)
789*bebae9c0SAndroid Build Coastguard Worker {
790*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
791*bebae9c0SAndroid Build Coastguard Worker
792*bebae9c0SAndroid Build Coastguard Worker if (NULL == pNumSupportedInterfaces) {
793*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
794*bebae9c0SAndroid Build Coastguard Worker } else {
795*bebae9c0SAndroid Build Coastguard Worker const ClassTable *clazz = objectIDtoClass(objectID);
796*bebae9c0SAndroid Build Coastguard Worker if (NULL == clazz) {
797*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
798*bebae9c0SAndroid Build Coastguard Worker } else {
799*bebae9c0SAndroid Build Coastguard Worker SLuint32 count = 0;
800*bebae9c0SAndroid Build Coastguard Worker SLuint32 i;
801*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < clazz->mInterfaceCount; ++i) {
802*bebae9c0SAndroid Build Coastguard Worker switch (clazz->mInterfaces[i].mInterface) {
803*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_IMPLICIT:
804*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_IMPLICIT_PREREALIZE:
805*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_EXPLICIT:
806*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_EXPLICIT_PREREALIZE:
807*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_DYNAMIC:
808*bebae9c0SAndroid Build Coastguard Worker ++count;
809*bebae9c0SAndroid Build Coastguard Worker break;
810*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_UNAVAILABLE:
811*bebae9c0SAndroid Build Coastguard Worker break;
812*bebae9c0SAndroid Build Coastguard Worker default:
813*bebae9c0SAndroid Build Coastguard Worker assert(false);
814*bebae9c0SAndroid Build Coastguard Worker break;
815*bebae9c0SAndroid Build Coastguard Worker }
816*bebae9c0SAndroid Build Coastguard Worker }
817*bebae9c0SAndroid Build Coastguard Worker *pNumSupportedInterfaces = count;
818*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
819*bebae9c0SAndroid Build Coastguard Worker }
820*bebae9c0SAndroid Build Coastguard Worker }
821*bebae9c0SAndroid Build Coastguard Worker
822*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE;
823*bebae9c0SAndroid Build Coastguard Worker }
824*bebae9c0SAndroid Build Coastguard Worker
825*bebae9c0SAndroid Build Coastguard Worker
IEngine_QuerySupportedInterfaces(SLEngineItf self,SLuint32 objectID,SLuint32 index,SLInterfaceID * pInterfaceId)826*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_QuerySupportedInterfaces(SLEngineItf self,
827*bebae9c0SAndroid Build Coastguard Worker SLuint32 objectID, SLuint32 index, SLInterfaceID *pInterfaceId)
828*bebae9c0SAndroid Build Coastguard Worker {
829*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
830*bebae9c0SAndroid Build Coastguard Worker
831*bebae9c0SAndroid Build Coastguard Worker if (NULL == pInterfaceId) {
832*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
833*bebae9c0SAndroid Build Coastguard Worker } else {
834*bebae9c0SAndroid Build Coastguard Worker *pInterfaceId = NULL;
835*bebae9c0SAndroid Build Coastguard Worker const ClassTable *clazz = objectIDtoClass(objectID);
836*bebae9c0SAndroid Build Coastguard Worker if (NULL == clazz) {
837*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
838*bebae9c0SAndroid Build Coastguard Worker } else {
839*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID; // will be reset later
840*bebae9c0SAndroid Build Coastguard Worker SLuint32 i;
841*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < clazz->mInterfaceCount; ++i) {
842*bebae9c0SAndroid Build Coastguard Worker switch (clazz->mInterfaces[i].mInterface) {
843*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_IMPLICIT:
844*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_IMPLICIT_PREREALIZE:
845*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_EXPLICIT:
846*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_EXPLICIT_PREREALIZE:
847*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_DYNAMIC:
848*bebae9c0SAndroid Build Coastguard Worker break;
849*bebae9c0SAndroid Build Coastguard Worker case INTERFACE_UNAVAILABLE:
850*bebae9c0SAndroid Build Coastguard Worker continue;
851*bebae9c0SAndroid Build Coastguard Worker default:
852*bebae9c0SAndroid Build Coastguard Worker assert(false);
853*bebae9c0SAndroid Build Coastguard Worker break;
854*bebae9c0SAndroid Build Coastguard Worker }
855*bebae9c0SAndroid Build Coastguard Worker if (index == 0) {
856*bebae9c0SAndroid Build Coastguard Worker *pInterfaceId = &SL_IID_array[clazz->mInterfaces[i].mMPH];
857*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
858*bebae9c0SAndroid Build Coastguard Worker break;
859*bebae9c0SAndroid Build Coastguard Worker }
860*bebae9c0SAndroid Build Coastguard Worker --index;
861*bebae9c0SAndroid Build Coastguard Worker }
862*bebae9c0SAndroid Build Coastguard Worker }
863*bebae9c0SAndroid Build Coastguard Worker }
864*bebae9c0SAndroid Build Coastguard Worker
865*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
866*bebae9c0SAndroid Build Coastguard Worker };
867*bebae9c0SAndroid Build Coastguard Worker
868*bebae9c0SAndroid Build Coastguard Worker
869*bebae9c0SAndroid Build Coastguard Worker static const char * const extensionNames[] = {
870*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
871*bebae9c0SAndroid Build Coastguard Worker #define _(n) #n
872*bebae9c0SAndroid Build Coastguard Worker #define __(n) _(n)
873*bebae9c0SAndroid Build Coastguard Worker "ANDROID_SDK_LEVEL_" __(PLATFORM_SDK_VERSION),
874*bebae9c0SAndroid Build Coastguard Worker #undef _
875*bebae9c0SAndroid Build Coastguard Worker #undef __
876*bebae9c0SAndroid Build Coastguard Worker #else
877*bebae9c0SAndroid Build Coastguard Worker "WILHELM_DESKTOP",
878*bebae9c0SAndroid Build Coastguard Worker #endif
879*bebae9c0SAndroid Build Coastguard Worker };
880*bebae9c0SAndroid Build Coastguard Worker
881*bebae9c0SAndroid Build Coastguard Worker
IEngine_QueryNumSupportedExtensions(SLEngineItf self,SLuint32 * pNumExtensions)882*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_QueryNumSupportedExtensions(SLEngineItf self, SLuint32 *pNumExtensions)
883*bebae9c0SAndroid Build Coastguard Worker {
884*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
885*bebae9c0SAndroid Build Coastguard Worker
886*bebae9c0SAndroid Build Coastguard Worker if (NULL == pNumExtensions) {
887*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
888*bebae9c0SAndroid Build Coastguard Worker } else {
889*bebae9c0SAndroid Build Coastguard Worker *pNumExtensions = sizeof(extensionNames) / sizeof(extensionNames[0]);
890*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
891*bebae9c0SAndroid Build Coastguard Worker }
892*bebae9c0SAndroid Build Coastguard Worker
893*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
894*bebae9c0SAndroid Build Coastguard Worker }
895*bebae9c0SAndroid Build Coastguard Worker
896*bebae9c0SAndroid Build Coastguard Worker
IEngine_QuerySupportedExtension(SLEngineItf self,SLuint32 index,SLchar * pExtensionName,SLint16 * pNameLength)897*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_QuerySupportedExtension(SLEngineItf self,
898*bebae9c0SAndroid Build Coastguard Worker SLuint32 index, SLchar *pExtensionName, SLint16 *pNameLength)
899*bebae9c0SAndroid Build Coastguard Worker {
900*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
901*bebae9c0SAndroid Build Coastguard Worker
902*bebae9c0SAndroid Build Coastguard Worker if (NULL == pNameLength) {
903*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
904*bebae9c0SAndroid Build Coastguard Worker } else {
905*bebae9c0SAndroid Build Coastguard Worker size_t actualNameLength;
906*bebae9c0SAndroid Build Coastguard Worker unsigned numExtensions = sizeof(extensionNames) / sizeof(extensionNames[0]);
907*bebae9c0SAndroid Build Coastguard Worker if (index >= numExtensions) {
908*bebae9c0SAndroid Build Coastguard Worker actualNameLength = 0;
909*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
910*bebae9c0SAndroid Build Coastguard Worker } else {
911*bebae9c0SAndroid Build Coastguard Worker const char *extensionName = extensionNames[index];
912*bebae9c0SAndroid Build Coastguard Worker actualNameLength = strlen(extensionName) + 1;
913*bebae9c0SAndroid Build Coastguard Worker if (NULL == pExtensionName) {
914*bebae9c0SAndroid Build Coastguard Worker // application is querying the name length in order to allocate a buffer
915*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
916*bebae9c0SAndroid Build Coastguard Worker } else {
917*bebae9c0SAndroid Build Coastguard Worker SLint16 availableNameLength = *pNameLength;
918*bebae9c0SAndroid Build Coastguard Worker if (0 >= availableNameLength) {
919*bebae9c0SAndroid Build Coastguard Worker // there is not even room for the terminating NUL
920*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_BUFFER_INSUFFICIENT;
921*bebae9c0SAndroid Build Coastguard Worker } else if (actualNameLength > (size_t) availableNameLength) {
922*bebae9c0SAndroid Build Coastguard Worker // "no invalid strings are written. That is, the null-terminator always exists"
923*bebae9c0SAndroid Build Coastguard Worker memcpy(pExtensionName, extensionName, (size_t) availableNameLength - 1);
924*bebae9c0SAndroid Build Coastguard Worker pExtensionName[(size_t) availableNameLength - 1] = '\0';
925*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_BUFFER_INSUFFICIENT;
926*bebae9c0SAndroid Build Coastguard Worker } else {
927*bebae9c0SAndroid Build Coastguard Worker memcpy(pExtensionName, extensionName, actualNameLength);
928*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
929*bebae9c0SAndroid Build Coastguard Worker }
930*bebae9c0SAndroid Build Coastguard Worker }
931*bebae9c0SAndroid Build Coastguard Worker }
932*bebae9c0SAndroid Build Coastguard Worker *pNameLength = actualNameLength;
933*bebae9c0SAndroid Build Coastguard Worker }
934*bebae9c0SAndroid Build Coastguard Worker
935*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
936*bebae9c0SAndroid Build Coastguard Worker }
937*bebae9c0SAndroid Build Coastguard Worker
938*bebae9c0SAndroid Build Coastguard Worker
IEngine_IsExtensionSupported(SLEngineItf self,const SLchar * pExtensionName,SLboolean * pSupported)939*bebae9c0SAndroid Build Coastguard Worker static SLresult IEngine_IsExtensionSupported(SLEngineItf self,
940*bebae9c0SAndroid Build Coastguard Worker const SLchar *pExtensionName, SLboolean *pSupported)
941*bebae9c0SAndroid Build Coastguard Worker {
942*bebae9c0SAndroid Build Coastguard Worker SL_ENTER_INTERFACE
943*bebae9c0SAndroid Build Coastguard Worker
944*bebae9c0SAndroid Build Coastguard Worker if (NULL == pSupported) {
945*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
946*bebae9c0SAndroid Build Coastguard Worker } else {
947*bebae9c0SAndroid Build Coastguard Worker SLboolean isSupported = SL_BOOLEAN_FALSE;
948*bebae9c0SAndroid Build Coastguard Worker if (NULL == pExtensionName) {
949*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
950*bebae9c0SAndroid Build Coastguard Worker } else {
951*bebae9c0SAndroid Build Coastguard Worker unsigned numExtensions = sizeof(extensionNames) / sizeof(extensionNames[0]);
952*bebae9c0SAndroid Build Coastguard Worker unsigned i;
953*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < numExtensions; ++i) {
954*bebae9c0SAndroid Build Coastguard Worker if (!strcmp((const char *) pExtensionName, extensionNames[i])) {
955*bebae9c0SAndroid Build Coastguard Worker isSupported = SL_BOOLEAN_TRUE;
956*bebae9c0SAndroid Build Coastguard Worker break;
957*bebae9c0SAndroid Build Coastguard Worker }
958*bebae9c0SAndroid Build Coastguard Worker }
959*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
960*bebae9c0SAndroid Build Coastguard Worker }
961*bebae9c0SAndroid Build Coastguard Worker *pSupported = isSupported;
962*bebae9c0SAndroid Build Coastguard Worker }
963*bebae9c0SAndroid Build Coastguard Worker
964*bebae9c0SAndroid Build Coastguard Worker SL_LEAVE_INTERFACE
965*bebae9c0SAndroid Build Coastguard Worker }
966*bebae9c0SAndroid Build Coastguard Worker
967*bebae9c0SAndroid Build Coastguard Worker
968*bebae9c0SAndroid Build Coastguard Worker static const struct SLEngineItf_ IEngine_Itf = {
969*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateLEDDevice,
970*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateVibraDevice,
971*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateAudioPlayer,
972*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateAudioRecorder,
973*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateMidiPlayer,
974*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateListener,
975*bebae9c0SAndroid Build Coastguard Worker IEngine_Create3DGroup,
976*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateOutputMix,
977*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateMetadataExtractor,
978*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateExtensionObject,
979*bebae9c0SAndroid Build Coastguard Worker IEngine_QueryNumSupportedInterfaces,
980*bebae9c0SAndroid Build Coastguard Worker IEngine_QuerySupportedInterfaces,
981*bebae9c0SAndroid Build Coastguard Worker IEngine_QueryNumSupportedExtensions,
982*bebae9c0SAndroid Build Coastguard Worker IEngine_QuerySupportedExtension,
983*bebae9c0SAndroid Build Coastguard Worker IEngine_IsExtensionSupported
984*bebae9c0SAndroid Build Coastguard Worker };
985*bebae9c0SAndroid Build Coastguard Worker
IEngine_init(void * self)986*bebae9c0SAndroid Build Coastguard Worker void IEngine_init(void *self)
987*bebae9c0SAndroid Build Coastguard Worker {
988*bebae9c0SAndroid Build Coastguard Worker IEngine *thiz = (IEngine *) self;
989*bebae9c0SAndroid Build Coastguard Worker thiz->mItf = &IEngine_Itf;
990*bebae9c0SAndroid Build Coastguard Worker // mLossOfControlGlobal is initialized in slCreateEngine
991*bebae9c0SAndroid Build Coastguard Worker #ifdef USE_SDL
992*bebae9c0SAndroid Build Coastguard Worker thiz->mOutputMix = NULL;
993*bebae9c0SAndroid Build Coastguard Worker #endif
994*bebae9c0SAndroid Build Coastguard Worker thiz->mInstanceCount = 1; // ourself
995*bebae9c0SAndroid Build Coastguard Worker thiz->mInstanceMask = 0;
996*bebae9c0SAndroid Build Coastguard Worker thiz->mChangedMask = 0;
997*bebae9c0SAndroid Build Coastguard Worker unsigned i;
998*bebae9c0SAndroid Build Coastguard Worker for (i = 0; i < MAX_INSTANCE; ++i) {
999*bebae9c0SAndroid Build Coastguard Worker thiz->mInstances[i] = NULL;
1000*bebae9c0SAndroid Build Coastguard Worker }
1001*bebae9c0SAndroid Build Coastguard Worker thiz->mShutdown = SL_BOOLEAN_FALSE;
1002*bebae9c0SAndroid Build Coastguard Worker thiz->mShutdownAck = SL_BOOLEAN_FALSE;
1003*bebae9c0SAndroid Build Coastguard Worker #if _BYTE_ORDER == _BIG_ENDIAN
1004*bebae9c0SAndroid Build Coastguard Worker thiz->mNativeEndianness = SL_BYTEORDER_BIGENDIAN;
1005*bebae9c0SAndroid Build Coastguard Worker #else
1006*bebae9c0SAndroid Build Coastguard Worker thiz->mNativeEndianness = SL_BYTEORDER_LITTLEENDIAN;
1007*bebae9c0SAndroid Build Coastguard Worker #endif
1008*bebae9c0SAndroid Build Coastguard Worker }
1009*bebae9c0SAndroid Build Coastguard Worker
IEngine_deinit(void * self)1010*bebae9c0SAndroid Build Coastguard Worker void IEngine_deinit(void *self)
1011*bebae9c0SAndroid Build Coastguard Worker {
1012*bebae9c0SAndroid Build Coastguard Worker }
1013*bebae9c0SAndroid Build Coastguard Worker
1014*bebae9c0SAndroid Build Coastguard Worker
1015*bebae9c0SAndroid Build Coastguard Worker // OpenMAX AL Engine
1016*bebae9c0SAndroid Build Coastguard Worker
1017*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateCameraDevice(XAEngineItf self,XAObjectItf * pDevice,XAuint32 deviceID,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1018*bebae9c0SAndroid Build Coastguard Worker static XAresult IEngine_CreateCameraDevice(XAEngineItf self, XAObjectItf *pDevice,
1019*bebae9c0SAndroid Build Coastguard Worker XAuint32 deviceID, XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1020*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1021*bebae9c0SAndroid Build Coastguard Worker {
1022*bebae9c0SAndroid Build Coastguard Worker XA_ENTER_INTERFACE
1023*bebae9c0SAndroid Build Coastguard Worker
1024*bebae9c0SAndroid Build Coastguard Worker //IXAEngine *thiz = (IXAEngine *) self;
1025*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
1026*bebae9c0SAndroid Build Coastguard Worker
1027*bebae9c0SAndroid Build Coastguard Worker XA_LEAVE_INTERFACE
1028*bebae9c0SAndroid Build Coastguard Worker }
1029*bebae9c0SAndroid Build Coastguard Worker
1030*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateRadioDevice(XAEngineItf self,XAObjectItf * pDevice,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1031*bebae9c0SAndroid Build Coastguard Worker static XAresult IEngine_CreateRadioDevice(XAEngineItf self, XAObjectItf *pDevice,
1032*bebae9c0SAndroid Build Coastguard Worker XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1033*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1034*bebae9c0SAndroid Build Coastguard Worker {
1035*bebae9c0SAndroid Build Coastguard Worker XA_ENTER_INTERFACE
1036*bebae9c0SAndroid Build Coastguard Worker
1037*bebae9c0SAndroid Build Coastguard Worker //IXAEngine *thiz = (IXAEngine *) self;
1038*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
1039*bebae9c0SAndroid Build Coastguard Worker
1040*bebae9c0SAndroid Build Coastguard Worker XA_LEAVE_INTERFACE
1041*bebae9c0SAndroid Build Coastguard Worker }
1042*bebae9c0SAndroid Build Coastguard Worker
1043*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_CreateLEDDevice(XAEngineItf self,XAObjectItf * pDevice,XAuint32 deviceID,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1044*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_CreateLEDDevice(XAEngineItf self, XAObjectItf *pDevice, XAuint32 deviceID,
1045*bebae9c0SAndroid Build Coastguard Worker XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1046*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1047*bebae9c0SAndroid Build Coastguard Worker {
1048*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1049*bebae9c0SAndroid Build Coastguard Worker return IEngine_CreateLEDDevice(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1050*bebae9c0SAndroid Build Coastguard Worker (SLObjectItf *) pDevice, deviceID, numInterfaces, (const SLInterfaceID *) pInterfaceIds,
1051*bebae9c0SAndroid Build Coastguard Worker (const SLboolean *) pInterfaceRequired);
1052*bebae9c0SAndroid Build Coastguard Worker }
1053*bebae9c0SAndroid Build Coastguard Worker
1054*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_CreateVibraDevice(XAEngineItf self,XAObjectItf * pDevice,XAuint32 deviceID,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1055*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_CreateVibraDevice(XAEngineItf self, XAObjectItf *pDevice,
1056*bebae9c0SAndroid Build Coastguard Worker XAuint32 deviceID, XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1057*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1058*bebae9c0SAndroid Build Coastguard Worker {
1059*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1060*bebae9c0SAndroid Build Coastguard Worker return IEngine_CreateVibraDevice(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1061*bebae9c0SAndroid Build Coastguard Worker (SLObjectItf *) pDevice, deviceID, numInterfaces, (const SLInterfaceID *) pInterfaceIds,
1062*bebae9c0SAndroid Build Coastguard Worker (const SLboolean *) pInterfaceRequired);
1063*bebae9c0SAndroid Build Coastguard Worker }
1064*bebae9c0SAndroid Build Coastguard Worker
1065*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateMediaPlayer(XAEngineItf self,XAObjectItf * pPlayer,XADataSource * pDataSrc,XADataSource * pBankSrc,XADataSink * pAudioSnk,XADataSink * pImageVideoSnk,XADataSink * pVibra,XADataSink * pLEDArray,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1066*bebae9c0SAndroid Build Coastguard Worker static XAresult IEngine_CreateMediaPlayer(XAEngineItf self, XAObjectItf *pPlayer,
1067*bebae9c0SAndroid Build Coastguard Worker XADataSource *pDataSrc, XADataSource *pBankSrc, XADataSink *pAudioSnk,
1068*bebae9c0SAndroid Build Coastguard Worker XADataSink *pImageVideoSnk, XADataSink *pVibra, XADataSink *pLEDArray,
1069*bebae9c0SAndroid Build Coastguard Worker XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1070*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1071*bebae9c0SAndroid Build Coastguard Worker {
1072*bebae9c0SAndroid Build Coastguard Worker XA_ENTER_INTERFACE
1073*bebae9c0SAndroid Build Coastguard Worker
1074*bebae9c0SAndroid Build Coastguard Worker if (NULL == pPlayer) {
1075*bebae9c0SAndroid Build Coastguard Worker result = XA_RESULT_PARAMETER_INVALID;
1076*bebae9c0SAndroid Build Coastguard Worker } else {
1077*bebae9c0SAndroid Build Coastguard Worker *pPlayer = NULL;
1078*bebae9c0SAndroid Build Coastguard Worker unsigned exposedMask;
1079*bebae9c0SAndroid Build Coastguard Worker const ClassTable *pCMediaPlayer_class = objectIDtoClass(XA_OBJECTID_MEDIAPLAYER);
1080*bebae9c0SAndroid Build Coastguard Worker assert(NULL != pCMediaPlayer_class);
1081*bebae9c0SAndroid Build Coastguard Worker result = checkInterfaces(pCMediaPlayer_class, numInterfaces,
1082*bebae9c0SAndroid Build Coastguard Worker (const SLInterfaceID *) pInterfaceIds, pInterfaceRequired, &exposedMask, NULL);
1083*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS == result) {
1084*bebae9c0SAndroid Build Coastguard Worker
1085*bebae9c0SAndroid Build Coastguard Worker // Construct our new MediaPlayer instance
1086*bebae9c0SAndroid Build Coastguard Worker CMediaPlayer *thiz = (CMediaPlayer *) construct(pCMediaPlayer_class, exposedMask,
1087*bebae9c0SAndroid Build Coastguard Worker &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf);
1088*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz) {
1089*bebae9c0SAndroid Build Coastguard Worker result = XA_RESULT_MEMORY_FAILURE;
1090*bebae9c0SAndroid Build Coastguard Worker } else {
1091*bebae9c0SAndroid Build Coastguard Worker
1092*bebae9c0SAndroid Build Coastguard Worker do {
1093*bebae9c0SAndroid Build Coastguard Worker
1094*bebae9c0SAndroid Build Coastguard Worker // Initialize private fields not associated with an interface
1095*bebae9c0SAndroid Build Coastguard Worker
1096*bebae9c0SAndroid Build Coastguard Worker // Default data source in case of failure in checkDataSource
1097*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mLocator.mLocatorType = SL_DATALOCATOR_NULL;
1098*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mFormat.mFormatType = XA_DATAFORMAT_NULL;
1099*bebae9c0SAndroid Build Coastguard Worker
1100*bebae9c0SAndroid Build Coastguard Worker // Default andio and image sink in case of failure in checkDataSink
1101*bebae9c0SAndroid Build Coastguard Worker thiz->mAudioSink.mLocator.mLocatorType = XA_DATALOCATOR_NULL;
1102*bebae9c0SAndroid Build Coastguard Worker thiz->mAudioSink.mFormat.mFormatType = XA_DATAFORMAT_NULL;
1103*bebae9c0SAndroid Build Coastguard Worker thiz->mImageVideoSink.mLocator.mLocatorType = XA_DATALOCATOR_NULL;
1104*bebae9c0SAndroid Build Coastguard Worker thiz->mImageVideoSink.mFormat.mFormatType = XA_DATAFORMAT_NULL;
1105*bebae9c0SAndroid Build Coastguard Worker
1106*bebae9c0SAndroid Build Coastguard Worker // More default values, in case destructor needs to be called early
1107*bebae9c0SAndroid Build Coastguard Worker thiz->mNumChannels = UNKNOWN_NUMCHANNELS;
1108*bebae9c0SAndroid Build Coastguard Worker
1109*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
1110*bebae9c0SAndroid Build Coastguard Worker // placement new (explicit constructor)
1111*bebae9c0SAndroid Build Coastguard Worker // FIXME unnecessary once those fields are encapsulated in one class, rather
1112*bebae9c0SAndroid Build Coastguard Worker // than a structure
1113*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mAVPlayer) android::sp<android::GenericPlayer>();
1114*bebae9c0SAndroid Build Coastguard Worker (void) new (&thiz->mCallbackProtector)
1115*bebae9c0SAndroid Build Coastguard Worker android::sp<android::CallbackProtector>();
1116*bebae9c0SAndroid Build Coastguard Worker // Android-specific POD fields are initialized in android_Player_create,
1117*bebae9c0SAndroid Build Coastguard Worker // and assume calloc or memset 0 during allocation
1118*bebae9c0SAndroid Build Coastguard Worker #endif
1119*bebae9c0SAndroid Build Coastguard Worker
1120*bebae9c0SAndroid Build Coastguard Worker // Check the source and sink parameters against generic constraints
1121*bebae9c0SAndroid Build Coastguard Worker
1122*bebae9c0SAndroid Build Coastguard Worker result = checkDataSource("pDataSrc", (const SLDataSource *) pDataSrc,
1123*bebae9c0SAndroid Build Coastguard Worker &thiz->mDataSource, DATALOCATOR_MASK_URI
1124*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
1125*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_ANDROIDFD
1126*bebae9c0SAndroid Build Coastguard Worker | DATALOCATOR_MASK_ANDROIDBUFFERQUEUE
1127*bebae9c0SAndroid Build Coastguard Worker #endif
1128*bebae9c0SAndroid Build Coastguard Worker , DATAFORMAT_MASK_MIME);
1129*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1130*bebae9c0SAndroid Build Coastguard Worker break;
1131*bebae9c0SAndroid Build Coastguard Worker }
1132*bebae9c0SAndroid Build Coastguard Worker
1133*bebae9c0SAndroid Build Coastguard Worker result = checkDataSource("pBankSrc", (const SLDataSource *) pBankSrc,
1134*bebae9c0SAndroid Build Coastguard Worker &thiz->mBankSource, DATALOCATOR_MASK_NULL | DATALOCATOR_MASK_URI |
1135*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_ADDRESS, DATAFORMAT_MASK_NULL);
1136*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1137*bebae9c0SAndroid Build Coastguard Worker break;
1138*bebae9c0SAndroid Build Coastguard Worker }
1139*bebae9c0SAndroid Build Coastguard Worker
1140*bebae9c0SAndroid Build Coastguard Worker result = checkDataSink("pAudioSnk", (const SLDataSink *) pAudioSnk,
1141*bebae9c0SAndroid Build Coastguard Worker &thiz->mAudioSink, DATALOCATOR_MASK_OUTPUTMIX, DATAFORMAT_MASK_NULL);
1142*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1143*bebae9c0SAndroid Build Coastguard Worker break;
1144*bebae9c0SAndroid Build Coastguard Worker }
1145*bebae9c0SAndroid Build Coastguard Worker
1146*bebae9c0SAndroid Build Coastguard Worker result = checkDataSink("pImageVideoSnk", (const SLDataSink *) pImageVideoSnk,
1147*bebae9c0SAndroid Build Coastguard Worker &thiz->mImageVideoSink,
1148*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_NULL | DATALOCATOR_MASK_NATIVEDISPLAY,
1149*bebae9c0SAndroid Build Coastguard Worker DATAFORMAT_MASK_NULL);
1150*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1151*bebae9c0SAndroid Build Coastguard Worker break;
1152*bebae9c0SAndroid Build Coastguard Worker }
1153*bebae9c0SAndroid Build Coastguard Worker
1154*bebae9c0SAndroid Build Coastguard Worker result = checkDataSink("pVibra", (const SLDataSink *) pVibra, &thiz->mVibraSink,
1155*bebae9c0SAndroid Build Coastguard Worker DATALOCATOR_MASK_NULL | DATALOCATOR_MASK_IODEVICE,
1156*bebae9c0SAndroid Build Coastguard Worker DATAFORMAT_MASK_NULL);
1157*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1158*bebae9c0SAndroid Build Coastguard Worker break;
1159*bebae9c0SAndroid Build Coastguard Worker }
1160*bebae9c0SAndroid Build Coastguard Worker
1161*bebae9c0SAndroid Build Coastguard Worker result = checkDataSink("pLEDArray", (const SLDataSink *) pLEDArray,
1162*bebae9c0SAndroid Build Coastguard Worker &thiz->mLEDArraySink, DATALOCATOR_MASK_NULL | DATALOCATOR_MASK_IODEVICE,
1163*bebae9c0SAndroid Build Coastguard Worker DATAFORMAT_MASK_NULL);
1164*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1165*bebae9c0SAndroid Build Coastguard Worker break;
1166*bebae9c0SAndroid Build Coastguard Worker }
1167*bebae9c0SAndroid Build Coastguard Worker
1168*bebae9c0SAndroid Build Coastguard Worker // Unsafe to ever refer to application pointers again
1169*bebae9c0SAndroid Build Coastguard Worker pDataSrc = NULL;
1170*bebae9c0SAndroid Build Coastguard Worker pBankSrc = NULL;
1171*bebae9c0SAndroid Build Coastguard Worker pAudioSnk = NULL;
1172*bebae9c0SAndroid Build Coastguard Worker pImageVideoSnk = NULL;
1173*bebae9c0SAndroid Build Coastguard Worker pVibra = NULL;
1174*bebae9c0SAndroid Build Coastguard Worker pLEDArray = NULL;
1175*bebae9c0SAndroid Build Coastguard Worker
1176*bebae9c0SAndroid Build Coastguard Worker // Check that the requested interfaces are compatible with the data source
1177*bebae9c0SAndroid Build Coastguard Worker // FIXME implement
1178*bebae9c0SAndroid Build Coastguard Worker
1179*bebae9c0SAndroid Build Coastguard Worker // check the source and sink parameters against platform support
1180*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
1181*bebae9c0SAndroid Build Coastguard Worker result = android_Player_checkSourceSink(thiz);
1182*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1183*bebae9c0SAndroid Build Coastguard Worker break;
1184*bebae9c0SAndroid Build Coastguard Worker }
1185*bebae9c0SAndroid Build Coastguard Worker #endif
1186*bebae9c0SAndroid Build Coastguard Worker
1187*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
1188*bebae9c0SAndroid Build Coastguard Worker // AndroidBufferQueue-specific initialization
1189*bebae9c0SAndroid Build Coastguard Worker if (XA_DATALOCATOR_ANDROIDBUFFERQUEUE ==
1190*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mLocator.mLocatorType) {
1191*bebae9c0SAndroid Build Coastguard Worker XAuint16 nbBuffers = (XAuint16) thiz->mDataSource.mLocator.mABQ.numBuffers;
1192*bebae9c0SAndroid Build Coastguard Worker
1193*bebae9c0SAndroid Build Coastguard Worker // Avoid possible integer overflow during multiplication; this arbitrary
1194*bebae9c0SAndroid Build Coastguard Worker // maximum is big enough to not interfere with real applications, but
1195*bebae9c0SAndroid Build Coastguard Worker // small enough to not overflow.
1196*bebae9c0SAndroid Build Coastguard Worker if (nbBuffers >= 256) {
1197*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
1198*bebae9c0SAndroid Build Coastguard Worker break;
1199*bebae9c0SAndroid Build Coastguard Worker }
1200*bebae9c0SAndroid Build Coastguard Worker
1201*bebae9c0SAndroid Build Coastguard Worker // initialize ABQ buffer type
1202*bebae9c0SAndroid Build Coastguard Worker // assert below has been checked in android_audioPlayer_checkSourceSink
1203*bebae9c0SAndroid Build Coastguard Worker assert(XA_DATAFORMAT_MIME == thiz->mDataSource.mFormat.mFormatType);
1204*bebae9c0SAndroid Build Coastguard Worker if (XA_CONTAINERTYPE_MPEG_TS ==
1205*bebae9c0SAndroid Build Coastguard Worker thiz->mDataSource.mFormat.mMIME.containerType) {
1206*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeMpeg2Ts;
1207*bebae9c0SAndroid Build Coastguard Worker
1208*bebae9c0SAndroid Build Coastguard Worker // Set the container type for the StreamInformation interface
1209*bebae9c0SAndroid Build Coastguard Worker XAMediaContainerInformation *containerInfo =
1210*bebae9c0SAndroid Build Coastguard Worker (XAMediaContainerInformation*)
1211*bebae9c0SAndroid Build Coastguard Worker // always storing container info at index 0, as per spec
1212*bebae9c0SAndroid Build Coastguard Worker &thiz->mStreamInfo.mStreamInfoTable.itemAt(0).containerInfo;
1213*bebae9c0SAndroid Build Coastguard Worker containerInfo->containerType = XA_CONTAINERTYPE_MPEG_TS;
1214*bebae9c0SAndroid Build Coastguard Worker // there are no streams at this stage
1215*bebae9c0SAndroid Build Coastguard Worker containerInfo->numStreams = 0;
1216*bebae9c0SAndroid Build Coastguard Worker
1217*bebae9c0SAndroid Build Coastguard Worker } else {
1218*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mBufferType = kAndroidBufferTypeInvalid;
1219*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Invalid buffer type in Android Buffer Queue");
1220*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_CONTENT_UNSUPPORTED;
1221*bebae9c0SAndroid Build Coastguard Worker }
1222*bebae9c0SAndroid Build Coastguard Worker
1223*bebae9c0SAndroid Build Coastguard Worker // initialize ABQ memory
1224*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mBufferArray = (AdvancedBufferHeader *)
1225*bebae9c0SAndroid Build Coastguard Worker malloc( (nbBuffers + 1) * sizeof(AdvancedBufferHeader));
1226*bebae9c0SAndroid Build Coastguard Worker if (NULL == thiz->mAndroidBufferQueue.mBufferArray) {
1227*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_MEMORY_FAILURE;
1228*bebae9c0SAndroid Build Coastguard Worker break;
1229*bebae9c0SAndroid Build Coastguard Worker } else {
1230*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mFront =
1231*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mBufferArray;
1232*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mRear =
1233*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mBufferArray;
1234*bebae9c0SAndroid Build Coastguard Worker }
1235*bebae9c0SAndroid Build Coastguard Worker
1236*bebae9c0SAndroid Build Coastguard Worker thiz->mAndroidBufferQueue.mNumBuffers = nbBuffers;
1237*bebae9c0SAndroid Build Coastguard Worker
1238*bebae9c0SAndroid Build Coastguard Worker }
1239*bebae9c0SAndroid Build Coastguard Worker #endif
1240*bebae9c0SAndroid Build Coastguard Worker
1241*bebae9c0SAndroid Build Coastguard Worker // used to store the data source of our audio player
1242*bebae9c0SAndroid Build Coastguard Worker thiz->mDynamicSource.mDataSource = &thiz->mDataSource.u.mSource;
1243*bebae9c0SAndroid Build Coastguard Worker
1244*bebae9c0SAndroid Build Coastguard Worker // platform-specific initialization
1245*bebae9c0SAndroid Build Coastguard Worker #ifdef ANDROID
1246*bebae9c0SAndroid Build Coastguard Worker android_Player_create(thiz);
1247*bebae9c0SAndroid Build Coastguard Worker #endif
1248*bebae9c0SAndroid Build Coastguard Worker
1249*bebae9c0SAndroid Build Coastguard Worker } while (0);
1250*bebae9c0SAndroid Build Coastguard Worker
1251*bebae9c0SAndroid Build Coastguard Worker if (XA_RESULT_SUCCESS != result) {
1252*bebae9c0SAndroid Build Coastguard Worker IObject_Destroy(&thiz->mObject.mItf);
1253*bebae9c0SAndroid Build Coastguard Worker } else {
1254*bebae9c0SAndroid Build Coastguard Worker IObject_Publish(&thiz->mObject);
1255*bebae9c0SAndroid Build Coastguard Worker // return the new media player object
1256*bebae9c0SAndroid Build Coastguard Worker *pPlayer = (XAObjectItf) &thiz->mObject.mItf;
1257*bebae9c0SAndroid Build Coastguard Worker }
1258*bebae9c0SAndroid Build Coastguard Worker
1259*bebae9c0SAndroid Build Coastguard Worker }
1260*bebae9c0SAndroid Build Coastguard Worker }
1261*bebae9c0SAndroid Build Coastguard Worker
1262*bebae9c0SAndroid Build Coastguard Worker }
1263*bebae9c0SAndroid Build Coastguard Worker
1264*bebae9c0SAndroid Build Coastguard Worker XA_LEAVE_INTERFACE
1265*bebae9c0SAndroid Build Coastguard Worker }
1266*bebae9c0SAndroid Build Coastguard Worker
1267*bebae9c0SAndroid Build Coastguard Worker
IEngine_CreateMediaRecorder(XAEngineItf self,XAObjectItf * pRecorder,XADataSource * pAudioSrc,XADataSource * pImageVideoSrc,XADataSink * pDataSnk,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1268*bebae9c0SAndroid Build Coastguard Worker static XAresult IEngine_CreateMediaRecorder(XAEngineItf self, XAObjectItf *pRecorder,
1269*bebae9c0SAndroid Build Coastguard Worker XADataSource *pAudioSrc, XADataSource *pImageVideoSrc,
1270*bebae9c0SAndroid Build Coastguard Worker XADataSink *pDataSnk, XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1271*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1272*bebae9c0SAndroid Build Coastguard Worker {
1273*bebae9c0SAndroid Build Coastguard Worker XA_ENTER_INTERFACE
1274*bebae9c0SAndroid Build Coastguard Worker
1275*bebae9c0SAndroid Build Coastguard Worker //IXAEngine *thiz = (IXAEngine *) self;
1276*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
1277*bebae9c0SAndroid Build Coastguard Worker
1278*bebae9c0SAndroid Build Coastguard Worker #if 0
1279*bebae9c0SAndroid Build Coastguard Worker "pAudioSrc", pAudioSrc,
1280*bebae9c0SAndroid Build Coastguard Worker "pImageVideoSrc", pImageVideoSrc,
1281*bebae9c0SAndroid Build Coastguard Worker "pDataSink", pDataSnk,
1282*bebae9c0SAndroid Build Coastguard Worker #endif
1283*bebae9c0SAndroid Build Coastguard Worker
1284*bebae9c0SAndroid Build Coastguard Worker XA_LEAVE_INTERFACE
1285*bebae9c0SAndroid Build Coastguard Worker }
1286*bebae9c0SAndroid Build Coastguard Worker
1287*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_CreateOutputMix(XAEngineItf self,XAObjectItf * pMix,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1288*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_CreateOutputMix(XAEngineItf self, XAObjectItf *pMix,
1289*bebae9c0SAndroid Build Coastguard Worker XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds,
1290*bebae9c0SAndroid Build Coastguard Worker const XAboolean *pInterfaceRequired)
1291*bebae9c0SAndroid Build Coastguard Worker {
1292*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1293*bebae9c0SAndroid Build Coastguard Worker return IEngine_CreateOutputMix(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1294*bebae9c0SAndroid Build Coastguard Worker (SLObjectItf *) pMix, numInterfaces, (const SLInterfaceID *) pInterfaceIds,
1295*bebae9c0SAndroid Build Coastguard Worker (const SLboolean *) pInterfaceRequired);
1296*bebae9c0SAndroid Build Coastguard Worker }
1297*bebae9c0SAndroid Build Coastguard Worker
1298*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_CreateMetadataExtractor(XAEngineItf self,XAObjectItf * pMetadataExtractor,XADataSource * pDataSource,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1299*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_CreateMetadataExtractor(XAEngineItf self, XAObjectItf *pMetadataExtractor,
1300*bebae9c0SAndroid Build Coastguard Worker XADataSource *pDataSource, XAuint32 numInterfaces,
1301*bebae9c0SAndroid Build Coastguard Worker const XAInterfaceID *pInterfaceIds, const XAboolean *pInterfaceRequired)
1302*bebae9c0SAndroid Build Coastguard Worker {
1303*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1304*bebae9c0SAndroid Build Coastguard Worker return IEngine_CreateMetadataExtractor(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1305*bebae9c0SAndroid Build Coastguard Worker (SLObjectItf *) pMetadataExtractor, (SLDataSource *) pDataSource, numInterfaces,
1306*bebae9c0SAndroid Build Coastguard Worker (const SLInterfaceID *) pInterfaceIds, (const SLboolean *) pInterfaceRequired);
1307*bebae9c0SAndroid Build Coastguard Worker }
1308*bebae9c0SAndroid Build Coastguard Worker
1309*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_CreateExtensionObject(XAEngineItf self,XAObjectItf * pObject,void * pParameters,XAuint32 objectID,XAuint32 numInterfaces,const XAInterfaceID * pInterfaceIds,const XAboolean * pInterfaceRequired)1310*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_CreateExtensionObject(XAEngineItf self, XAObjectItf *pObject,
1311*bebae9c0SAndroid Build Coastguard Worker void *pParameters, XAuint32 objectID, XAuint32 numInterfaces,
1312*bebae9c0SAndroid Build Coastguard Worker const XAInterfaceID *pInterfaceIds, const XAboolean *pInterfaceRequired)
1313*bebae9c0SAndroid Build Coastguard Worker {
1314*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1315*bebae9c0SAndroid Build Coastguard Worker return IEngine_CreateExtensionObject(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1316*bebae9c0SAndroid Build Coastguard Worker (SLObjectItf *) pObject, pParameters, objectID, numInterfaces,
1317*bebae9c0SAndroid Build Coastguard Worker (const SLInterfaceID *) pInterfaceIds, (const SLboolean *) pInterfaceRequired);
1318*bebae9c0SAndroid Build Coastguard Worker }
1319*bebae9c0SAndroid Build Coastguard Worker
1320*bebae9c0SAndroid Build Coastguard Worker
IEngine_GetImplementationInfo(XAEngineItf self,XAuint32 * pMajor,XAuint32 * pMinor,XAuint32 * pStep,const XAchar * pImplementationText)1321*bebae9c0SAndroid Build Coastguard Worker static XAresult IEngine_GetImplementationInfo(XAEngineItf self, XAuint32 *pMajor, XAuint32 *pMinor,
1322*bebae9c0SAndroid Build Coastguard Worker XAuint32 *pStep, /* XAuint32 nImplementationTextSize, */ const XAchar *pImplementationText)
1323*bebae9c0SAndroid Build Coastguard Worker {
1324*bebae9c0SAndroid Build Coastguard Worker XA_ENTER_INTERFACE
1325*bebae9c0SAndroid Build Coastguard Worker
1326*bebae9c0SAndroid Build Coastguard Worker //IXAEngine *thiz = (IXAEngine *) self;
1327*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_FEATURE_UNSUPPORTED;
1328*bebae9c0SAndroid Build Coastguard Worker
1329*bebae9c0SAndroid Build Coastguard Worker XA_LEAVE_INTERFACE
1330*bebae9c0SAndroid Build Coastguard Worker }
1331*bebae9c0SAndroid Build Coastguard Worker
1332*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QuerySupportedProfiles(XAEngineItf self,XAint16 * pProfilesSupported)1333*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QuerySupportedProfiles(XAEngineItf self, XAint16 *pProfilesSupported)
1334*bebae9c0SAndroid Build Coastguard Worker {
1335*bebae9c0SAndroid Build Coastguard Worker XA_ENTER_INTERFACE
1336*bebae9c0SAndroid Build Coastguard Worker
1337*bebae9c0SAndroid Build Coastguard Worker if (NULL == pProfilesSupported) {
1338*bebae9c0SAndroid Build Coastguard Worker result = XA_RESULT_PARAMETER_INVALID;
1339*bebae9c0SAndroid Build Coastguard Worker } else {
1340*bebae9c0SAndroid Build Coastguard Worker #if 1
1341*bebae9c0SAndroid Build Coastguard Worker *pProfilesSupported = 0;
1342*bebae9c0SAndroid Build Coastguard Worker // the code below was copied from OpenSL ES and needs to be adapted for OpenMAX AL.
1343*bebae9c0SAndroid Build Coastguard Worker #else
1344*bebae9c0SAndroid Build Coastguard Worker // The generic implementation doesn't implement any of the profiles, they shouldn't be
1345*bebae9c0SAndroid Build Coastguard Worker // declared as supported. Also exclude the fake profiles BASE and OPTIONAL.
1346*bebae9c0SAndroid Build Coastguard Worker *pProfilesSupported = USE_PROFILES &
1347*bebae9c0SAndroid Build Coastguard Worker (USE_PROFILES_GAME | USE_PROFILES_MUSIC | USE_PROFILES_PHONE);
1348*bebae9c0SAndroid Build Coastguard Worker #endif
1349*bebae9c0SAndroid Build Coastguard Worker result = XA_RESULT_SUCCESS;
1350*bebae9c0SAndroid Build Coastguard Worker }
1351*bebae9c0SAndroid Build Coastguard Worker
1352*bebae9c0SAndroid Build Coastguard Worker XA_LEAVE_INTERFACE
1353*bebae9c0SAndroid Build Coastguard Worker }
1354*bebae9c0SAndroid Build Coastguard Worker
1355*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QueryNumSupportedInterfaces(XAEngineItf self,XAuint32 objectID,XAuint32 * pNumSupportedInterfaces)1356*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QueryNumSupportedInterfaces(XAEngineItf self, XAuint32 objectID,
1357*bebae9c0SAndroid Build Coastguard Worker XAuint32 *pNumSupportedInterfaces)
1358*bebae9c0SAndroid Build Coastguard Worker {
1359*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1360*bebae9c0SAndroid Build Coastguard Worker return IEngine_QueryNumSupportedInterfaces(
1361*bebae9c0SAndroid Build Coastguard Worker &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, objectID,
1362*bebae9c0SAndroid Build Coastguard Worker pNumSupportedInterfaces);
1363*bebae9c0SAndroid Build Coastguard Worker }
1364*bebae9c0SAndroid Build Coastguard Worker
1365*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QuerySupportedInterfaces(XAEngineItf self,XAuint32 objectID,XAuint32 index,XAInterfaceID * pInterfaceId)1366*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QuerySupportedInterfaces(XAEngineItf self, XAuint32 objectID,
1367*bebae9c0SAndroid Build Coastguard Worker XAuint32 index, XAInterfaceID *pInterfaceId)
1368*bebae9c0SAndroid Build Coastguard Worker {
1369*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1370*bebae9c0SAndroid Build Coastguard Worker return IEngine_QuerySupportedInterfaces(
1371*bebae9c0SAndroid Build Coastguard Worker &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, objectID, index,
1372*bebae9c0SAndroid Build Coastguard Worker (SLInterfaceID *) pInterfaceId);
1373*bebae9c0SAndroid Build Coastguard Worker }
1374*bebae9c0SAndroid Build Coastguard Worker
1375*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QueryNumSupportedExtensions(XAEngineItf self,XAuint32 * pNumExtensions)1376*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QueryNumSupportedExtensions(XAEngineItf self, XAuint32 *pNumExtensions)
1377*bebae9c0SAndroid Build Coastguard Worker {
1378*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1379*bebae9c0SAndroid Build Coastguard Worker return IEngine_QueryNumSupportedExtensions(
1380*bebae9c0SAndroid Build Coastguard Worker &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, pNumExtensions);
1381*bebae9c0SAndroid Build Coastguard Worker }
1382*bebae9c0SAndroid Build Coastguard Worker
1383*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QuerySupportedExtension(XAEngineItf self,XAuint32 index,XAchar * pExtensionName,XAint16 * pNameLength)1384*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QuerySupportedExtension(XAEngineItf self, XAuint32 index,
1385*bebae9c0SAndroid Build Coastguard Worker XAchar *pExtensionName, XAint16 *pNameLength)
1386*bebae9c0SAndroid Build Coastguard Worker {
1387*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1388*bebae9c0SAndroid Build Coastguard Worker return IEngine_QuerySupportedExtension(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1389*bebae9c0SAndroid Build Coastguard Worker index, pExtensionName, (SLint16 *) pNameLength);
1390*bebae9c0SAndroid Build Coastguard Worker }
1391*bebae9c0SAndroid Build Coastguard Worker
1392*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_IsExtensionSupported(XAEngineItf self,const XAchar * pExtensionName,XAboolean * pSupported)1393*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_IsExtensionSupported(XAEngineItf self, const XAchar *pExtensionName,
1394*bebae9c0SAndroid Build Coastguard Worker XAboolean *pSupported)
1395*bebae9c0SAndroid Build Coastguard Worker {
1396*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES
1397*bebae9c0SAndroid Build Coastguard Worker return IEngine_IsExtensionSupported(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf,
1398*bebae9c0SAndroid Build Coastguard Worker pExtensionName, pSupported);
1399*bebae9c0SAndroid Build Coastguard Worker }
1400*bebae9c0SAndroid Build Coastguard Worker
1401*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QueryLEDCapabilities(XAEngineItf self,XAuint32 * pIndex,XAuint32 * pLEDDeviceID,XALEDDescriptor * pDescriptor)1402*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QueryLEDCapabilities(XAEngineItf self, XAuint32 *pIndex,
1403*bebae9c0SAndroid Build Coastguard Worker XAuint32 *pLEDDeviceID, XALEDDescriptor *pDescriptor)
1404*bebae9c0SAndroid Build Coastguard Worker {
1405*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES EngineCapabilities
1406*bebae9c0SAndroid Build Coastguard Worker return (XAresult) IEngineCapabilities_QueryLEDCapabilities(
1407*bebae9c0SAndroid Build Coastguard Worker &((CEngine *) ((IXAEngine *) self)->mThis)->mEngineCapabilities.mItf, pIndex,
1408*bebae9c0SAndroid Build Coastguard Worker pLEDDeviceID, (SLLEDDescriptor *) pDescriptor);
1409*bebae9c0SAndroid Build Coastguard Worker }
1410*bebae9c0SAndroid Build Coastguard Worker
1411*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_QueryVibraCapabilities(XAEngineItf self,XAuint32 * pIndex,XAuint32 * pVibraDeviceID,XAVibraDescriptor * pDescriptor)1412*bebae9c0SAndroid Build Coastguard Worker static XAresult IXAEngine_QueryVibraCapabilities(XAEngineItf self, XAuint32 *pIndex,
1413*bebae9c0SAndroid Build Coastguard Worker XAuint32 *pVibraDeviceID, XAVibraDescriptor *pDescriptor)
1414*bebae9c0SAndroid Build Coastguard Worker {
1415*bebae9c0SAndroid Build Coastguard Worker // forward to OpenSL ES EngineCapabilities
1416*bebae9c0SAndroid Build Coastguard Worker return (XAresult) IEngineCapabilities_QueryVibraCapabilities(
1417*bebae9c0SAndroid Build Coastguard Worker &((CEngine *) ((IXAEngine *) self)->mThis)->mEngineCapabilities.mItf, pIndex,
1418*bebae9c0SAndroid Build Coastguard Worker pVibraDeviceID, (SLVibraDescriptor *) pDescriptor);
1419*bebae9c0SAndroid Build Coastguard Worker }
1420*bebae9c0SAndroid Build Coastguard Worker
1421*bebae9c0SAndroid Build Coastguard Worker
1422*bebae9c0SAndroid Build Coastguard Worker // OpenMAX AL engine v-table
1423*bebae9c0SAndroid Build Coastguard Worker
1424*bebae9c0SAndroid Build Coastguard Worker static const struct XAEngineItf_ IXAEngine_Itf = {
1425*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateCameraDevice,
1426*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateRadioDevice,
1427*bebae9c0SAndroid Build Coastguard Worker IXAEngine_CreateLEDDevice,
1428*bebae9c0SAndroid Build Coastguard Worker IXAEngine_CreateVibraDevice,
1429*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateMediaPlayer,
1430*bebae9c0SAndroid Build Coastguard Worker IEngine_CreateMediaRecorder,
1431*bebae9c0SAndroid Build Coastguard Worker IXAEngine_CreateOutputMix,
1432*bebae9c0SAndroid Build Coastguard Worker IXAEngine_CreateMetadataExtractor,
1433*bebae9c0SAndroid Build Coastguard Worker IXAEngine_CreateExtensionObject,
1434*bebae9c0SAndroid Build Coastguard Worker IEngine_GetImplementationInfo,
1435*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QuerySupportedProfiles,
1436*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QueryNumSupportedInterfaces,
1437*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QuerySupportedInterfaces,
1438*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QueryNumSupportedExtensions,
1439*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QuerySupportedExtension,
1440*bebae9c0SAndroid Build Coastguard Worker IXAEngine_IsExtensionSupported,
1441*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QueryLEDCapabilities,
1442*bebae9c0SAndroid Build Coastguard Worker IXAEngine_QueryVibraCapabilities
1443*bebae9c0SAndroid Build Coastguard Worker };
1444*bebae9c0SAndroid Build Coastguard Worker
1445*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_init(void * self)1446*bebae9c0SAndroid Build Coastguard Worker void IXAEngine_init(void *self)
1447*bebae9c0SAndroid Build Coastguard Worker {
1448*bebae9c0SAndroid Build Coastguard Worker IXAEngine *thiz = (IXAEngine *) self;
1449*bebae9c0SAndroid Build Coastguard Worker thiz->mItf = &IXAEngine_Itf;
1450*bebae9c0SAndroid Build Coastguard Worker }
1451*bebae9c0SAndroid Build Coastguard Worker
1452*bebae9c0SAndroid Build Coastguard Worker
IXAEngine_deinit(void * self)1453*bebae9c0SAndroid Build Coastguard Worker void IXAEngine_deinit(void *self)
1454*bebae9c0SAndroid Build Coastguard Worker {
1455*bebae9c0SAndroid Build Coastguard Worker }
1456