IEngine.c revision 8db0b106cdce5f5216b1535492de7930ad738aed
10b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* 20b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Copyright (C) 2010 The Android Open Source Project 30b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 40b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 50b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * you may not use this file except in compliance with the License. 60b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * You may obtain a copy of the License at 70b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 80b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 90b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * 100b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * Unless required by applicable law or agreed to in writing, software 110b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 120b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * See the License for the specific language governing permissions and 140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten * limitations under the License. 150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten */ 160b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten/* Engine implementation */ 180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 19979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten#include "sles_allinclusive.h" 20979a3f8743646af9999a89dff9e13b972b7efd87Glenn Kasten 21ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 22daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IEngine_CreateLEDDevice(SLEngineItf self, SLObjectItf *pDevice, SLuint32 deviceID, 23daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 25ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 26ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 27a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL 28928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if ((NULL == pDevice) || (SL_DEFAULTDEVICEID_LED != deviceID)) { 29ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 31ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDevice = NULL; 32ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 33ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCLEDDevice_class = objectIDtoClass(SL_OBJECTID_LEDDEVICE); 34c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pCLEDDevice_class) { 35c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 36c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 37c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pCLEDDevice_class, numInterfaces, pInterfaceIds, 38c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceRequired, &exposedMask); 39c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 40ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 41ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CLEDDevice *this = (CLEDDevice *) construct(pCLEDDevice_class, exposedMask, self); 42ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 45ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mDeviceID = deviceID; 46f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 47f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new LED object 48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDevice = &this->mObject.mItf; 49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 50ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 51ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 527a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 537a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 547a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 55ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 56ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 570b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 580b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 59ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 60daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kastenstatic SLresult IEngine_CreateVibraDevice(SLEngineItf self, SLObjectItf *pDevice, SLuint32 deviceID, 61daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 620b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 63ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 64ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 65a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_OPTIONAL 66928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if ((NULL == pDevice) || (SL_DEFAULTDEVICEID_VIBRA != deviceID)) { 67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 68ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 69ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDevice = NULL; 70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 71ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCVibraDevice_class = objectIDtoClass(SL_OBJECTID_VIBRADEVICE); 72c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pCVibraDevice_class) { 73c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 74c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 75c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pCVibraDevice_class, numInterfaces, 76c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 77c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 78ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 79ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CVibraDevice *this = (CVibraDevice *) construct(pCVibraDevice_class, exposedMask, self); 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mDeviceID = deviceID; 84f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 85f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new vibra object 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDevice = &this->mObject.mItf; 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 907a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 917a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 927a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 950b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 960b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 980b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_CreateAudioPlayer(SLEngineItf self, SLObjectItf *pPlayer, 990b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLDataSource *pAudioSrc, SLDataSink *pAudioSnk, SLuint32 numInterfaces, 1000b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 1010b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 102ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 103ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pPlayer) { 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pPlayer = NULL; 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCAudioPlayer_class = objectIDtoClass(SL_OBJECTID_AUDIOPLAYER); 110c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten assert(NULL != pCAudioPlayer_class); 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = checkInterfaces(pCAudioPlayer_class, numInterfaces, 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Construct our new AudioPlayer instance 116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CAudioPlayer *this = (CAudioPlayer *) construct(pCAudioPlayer_class, exposedMask, self); 117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 120b91e32605ecf39e34ad39936b1ee193bb4e30225Glenn Kasten 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten do { 122daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Initialize private fields not associated with an interface 124a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 125a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Default data source in case of failure in checkDataSource 126a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSource.mLocator.mLocatorType = SL_DATALOCATOR_NULL; 127a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSource.mFormat.mFormatType = SL_DATAFORMAT_NULL; 128a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 129a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Default data sink in case of failure in checkDataSink 130a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSink.mLocator.mLocatorType = SL_DATALOCATOR_NULL; 131a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSink.mFormat.mFormatType = SL_DATAFORMAT_NULL; 132a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 133a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Default is no per-channel mute or solo 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mMuteMask = 0; 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mSoloMask = 0; 136a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 137f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // Will be set soon for PCM buffer queues, or later by platform-specific code 138f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // during Realize or Prefetch 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mNumChannels = 0; 140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mSampleRateMilliHz = 0; 141daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 142a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // More default values, in case destructor needs to be called early 143a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDirectLevel = 0; 144a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#ifdef USE_OUTPUTMIXEXT 145a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mTrack = NULL; 146a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mGains[0] = 1.0f; 147a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mGains[1] = 1.0f; 148a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDestroyRequested = SL_BOOLEAN_FALSE; 149a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 150a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#ifdef USE_SNDFILE 151a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mSndFile.mPathname = NULL; 152a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mSndFile.mSNDFILE = NULL; 153a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten memset(&this->mSndFile.mSfInfo, 0, sizeof(SF_INFO)); 154a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten memset(&this->mSndFile.mMutex, 0, sizeof(pthread_mutex_t)); 155a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mSndFile.mEOF = SL_BOOLEAN_FALSE; 156a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mSndFile.mWhich = 0; 157a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten memset(this->mSndFile.mBuffer, 0, sizeof(this->mSndFile.mBuffer)); 158a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 159a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#ifdef ANDROID 160a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // extra safe initializations of pointers, in case of incomplete construction 161a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mpLock = NULL; 162a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mAudioTrack = NULL; 163a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // placement new (explicit constructor) 164a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten (void) new (&this->mSfPlayer) android::sp<android::SfPlayer>(); 165f7b852d914faa49d3e4b7d02bb5d9d254762c0b7Jean-Michel Trivi (void) new (&this->mAuxEffect) android::sp<android::AudioEffect>(); 166a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif 167a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Check the source and sink parameters against generic constraints, 169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // and make a local copy of all parameters in case other application threads 170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // change memory concurrently. 171daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = checkDataSource(pAudioSrc, &this->mDataSource); 1733c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 1743c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi break; 1753c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 1763c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi 177f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten result = checkDataSink(pAudioSnk, &this->mDataSink, SL_OBJECTID_AUDIOPLAYER); 1783c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 1803c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 181daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 182f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // It would be unsafe to ever refer to the application pointers again 183f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten pAudioSrc = NULL; 184f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten pAudioSnk = NULL; 185f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten 186f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // Check that the requested interfaces are compatible with the data source 187f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten result = checkSourceFormatVsInterfacesCompatibility(&this->mDataSource, 188104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten pCAudioPlayer_class, exposedMask); 1893c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 1913c170255cc71942f310b676d968cf73328aa5d70Jean-Michel Trivi } 192daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 1934b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten // copy the buffer queue count from source locator to the buffer queue interface 19418abcc4b70fab1f84d6fbebac3a8e34480a6c4d3Glenn Kasten // we have already range-checked the value down to a smaller width 1954b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 196f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten switch (this->mDataSource.mLocator.mLocatorType) { 19701e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten case SL_DATALOCATOR_BUFFERQUEUE: 19801e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#ifdef ANDROID 19901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten case SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE: 20001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten#endif 201f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mBufferQueue.mNumBuffers = 202f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten (SLuint16) this->mDataSource.mLocator.mBufferQueue.numBuffers; 203f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten assert(SL_DATAFORMAT_PCM == this->mDataSource.mFormat.mFormatType); 204f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mNumChannels = this->mDataSource.mFormat.mPCM.numChannels; 205f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mSampleRateMilliHz = this->mDataSource.mFormat.mPCM.samplesPerSec; 20601e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten break; 20701e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten default: 20801e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten this->mBufferQueue.mNumBuffers = 0; 20901e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten break; 21001e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten } 2114b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 212ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // check the audio source and sink parameters against platform support 213ef8931ae547cd703e69df9ad350d69825da0f546Jean-Michel Trivi#ifdef ANDROID 214d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi result = android_audioPlayer_checkSourceSink(this); 215928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if (SL_RESULT_SUCCESS != result) { 216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 217928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 2180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 219acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 2200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifdef USE_SNDFILE 221ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SndFile_checkAudioPlayerSourceSink(this); 222928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if (SL_RESULT_SUCCESS != result) { 223ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 224928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 2250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#endif 2260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten#ifdef USE_OUTPUTMIXEXT 228ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = IOutputMixExt_checkAudioPlayerSourceSink(this); 229928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if (SL_RESULT_SUCCESS != result) { 230ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 231928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 232daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten#endif 2330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 2343af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // FIXME move to dedicated function 235ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Allocate memory for buffer queue 2364b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten 237ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten //if (0 != this->mBufferQueue.mNumBuffers) { 238ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // inline allocation of circular mArray, up to a typical max 239ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (BUFFER_HEADER_TYPICAL >= this->mBufferQueue.mNumBuffers) { 240ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mBufferQueue.mArray = this->mBufferQueue.mTypical; 241ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 242ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Avoid possible integer overflow during multiplication; this arbitrary 243ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // maximum is big enough to not interfere with real applications, but 244ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // small enough to not overflow. 245ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (this->mBufferQueue.mNumBuffers >= 256) { 246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 247ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 248ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 249ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mBufferQueue.mArray = (BufferHeader *) malloc((this->mBufferQueue. 250ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten mNumBuffers + 1) * sizeof(BufferHeader)); 251ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this->mBufferQueue.mArray) { 252ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 253ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 254ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 255ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 256ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mBufferQueue.mFront = this->mBufferQueue.mArray; 257ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mBufferQueue.mRear = this->mBufferQueue.mArray; 258ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten //} 259ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 260ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // used to store the data source of our audio player 261ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mDynamicSource.mDataSource = &this->mDataSource.u.mSource; 262ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 263ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // platform-specific initialization 264ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#ifdef ANDROID 265d739e18bea1deaf7c487f99a512c0ae7649615c2Jean-Michel Trivi android_audioPlayer_create(this); 266ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten#endif 2670b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 268ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } while (0); 269daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 270e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten if (SL_RESULT_SUCCESS != result) { 271f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Destroy(&this->mObject.mItf); 272f51dba65751107c930759938775b75531ec1f330Glenn Kasten } else { 273f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 274f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new audio player object 275f51dba65751107c930759938775b75531ec1f330Glenn Kasten *pPlayer = &this->mObject.mItf; 276e5d006b298ce7683d66f7ec86136403cf5fb20d6Glenn Kasten } 277daf661248ff6ea2e21799e5114c78b7c1d49630eGlenn Kasten 278ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 279ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 280acd88797a1d3b8225bab888d29036e245f275be5Glenn Kasten 281ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 282ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 283ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 2840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 2850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 286ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 287ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastenstatic SLresult IEngine_CreateAudioRecorder(SLEngineItf self, SLObjectItf *pRecorder, 288ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten SLDataSource *pAudioSrc, SLDataSink *pAudioSnk, SLuint32 numInterfaces, 289ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 2900b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 291ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 292ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 293a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if (USE_PROFILES & USE_PROFILES_OPTIONAL) || defined(ANDROID) 294ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pRecorder) { 295ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 296ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 297ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pRecorder = NULL; 298ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 299ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCAudioRecorder_class = objectIDtoClass(SL_OBJECTID_AUDIORECORDER); 300c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pCAudioRecorder_class) { 301c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 302c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 303c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pCAudioRecorder_class, numInterfaces, 304c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 305c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 3063af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 307ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 308ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 309ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Construct our new AudioRecorder instance 310ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CAudioRecorder *this = (CAudioRecorder *) construct(pCAudioRecorder_class, exposedMask, 3113af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi self); 312ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 313ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 314ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 315ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 316ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten do { 317f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten 318f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // Initialize fields not associated with any interface 319f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten 320a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Default data source in case of failure in checkDataSource 321a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSource.mLocator.mLocatorType = SL_DATALOCATOR_NULL; 322a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSource.mFormat.mFormatType = SL_DATAFORMAT_NULL; 323a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 324a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Default data sink in case of failure in checkDataSink 325a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSink.mLocator.mLocatorType = SL_DATALOCATOR_NULL; 326a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten this->mDataSink.mFormat.mFormatType = SL_DATAFORMAT_NULL; 327a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 328f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // These fields are set to real values by 329f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // android_audioRecorder_checkSourceSinkSupport. Note that the data sink is 330f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // always PCM buffer queue, so we know the channel count and sample rate early. 331712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi this->mNumChannels = 0; 332712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi this->mSampleRateMilliHz = 0; 333f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten#ifdef ANDROID 334f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mAudioRecord = NULL; 335f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mRecordSource = android::AUDIO_SOURCE_DEFAULT; 336f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten#endif 337712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi 338ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // Check the source and sink parameters, and make a local copy of all parameters 339ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = checkDataSource(pAudioSrc, &this->mDataSource); 340928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if (SL_RESULT_SUCCESS != result) { 341ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 342928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 343712b490060e4164fbe47986be1d2584d1610d8ddJean-Michel Trivi result = checkDataSink(pAudioSnk, &this->mDataSink, SL_OBJECTID_AUDIORECORDER); 344928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if (SL_RESULT_SUCCESS != result) { 345ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 346928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 347ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 348f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten // It would be unsafe to ever refer to the application pointers again 349f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten pAudioSrc = NULL; 350f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten pAudioSnk = NULL; 351f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten 3523af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // check the audio source and sink parameters against platform support 3533af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 3543af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi result = android_audioRecorder_checkSourceSinkSupport(this); 3553af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi if (SL_RESULT_SUCCESS != result) { 356a7b79e766ec6d95e9236168c27461c2ebaef4659Glenn Kasten SL_LOGE("Cannot create AudioRecorder: invalid source or sink"); 3573af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi break; 3583af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi } 3593af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 3603af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 3614b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#ifdef ANDROID 3629e60b0a390d780539459f41c2bf4a45a326a7b62Glenn Kasten // Allocate memory for buffer queue 363f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten SLuint32 locatorType = this->mDataSink.mLocator.mLocatorType; 36401e9f5fa4698856f92bcfd88188ee4c8397b22dbGlenn Kasten if (locatorType == SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE) { 365f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mBufferQueue.mNumBuffers = 366f6f5ceb363286d5ebef2c2e70c8a5aa135d5d1eeGlenn Kasten this->mDataSink.mLocator.mBufferQueue.numBuffers; 3673af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // inline allocation of circular Buffer Queue mArray, up to a typical max 3683af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi if (BUFFER_HEADER_TYPICAL >= this->mBufferQueue.mNumBuffers) { 3693af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi this->mBufferQueue.mArray = this->mBufferQueue.mTypical; 3703af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi } else { 3713af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // Avoid possible integer overflow during multiplication; this arbitrary 3723af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // maximum is big enough to not interfere with real applications, but 3733af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // small enough to not overflow. 3743af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi if (this->mBufferQueue.mNumBuffers >= 256) { 3753af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi result = SL_RESULT_MEMORY_FAILURE; 3763af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi break; 3773af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi } 3783af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi this->mBufferQueue.mArray = (BufferHeader *) malloc((this->mBufferQueue. 3793af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi mNumBuffers + 1) * sizeof(BufferHeader)); 3803af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi if (NULL == this->mBufferQueue.mArray) { 3813af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi result = SL_RESULT_MEMORY_FAILURE; 3823af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi break; 3833af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi } 3843af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi } 3853af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi this->mBufferQueue.mFront = this->mBufferQueue.mArray; 3863af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi this->mBufferQueue.mRear = this->mBufferQueue.mArray; 3873af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi } 3884b65ef9efdf5aba01bea89d8cdd64f500560a28dGlenn Kasten#endif 3893af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi 3903af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi // platform-specific initialization 3913af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#ifdef ANDROID 3923af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi android_audioRecorder_create(this); 3933af2a8dd03f3113d5da1000dd79c143a9f0c4f36Jean-Michel Trivi#endif 394ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 395ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } while (0); 396ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 397928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if (SL_RESULT_SUCCESS != result) { 398f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Destroy(&this->mObject.mItf); 399f51dba65751107c930759938775b75531ec1f330Glenn Kasten } else { 400f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 401f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new audio recorder object 402f51dba65751107c930759938775b75531ec1f330Glenn Kasten *pRecorder = &this->mObject.mItf; 403928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 404ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 405ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 406ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 407ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 408ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 4097a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 4107a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 4117a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 412ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 413ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 4140b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 4150b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 416ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 4170b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_CreateMidiPlayer(SLEngineItf self, SLObjectItf *pPlayer, 4180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLDataSource *pMIDISrc, SLDataSource *pBankSrc, SLDataSink *pAudioOutput, 4190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLDataSink *pVibra, SLDataSink *pLEDArray, SLuint32 numInterfaces, 4200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 4210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 422ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 423ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 424a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_PHONE) 425928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten if ((NULL == pPlayer) || (NULL == pMIDISrc) || (NULL == pAudioOutput)) { 426ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 427ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 428ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pPlayer = NULL; 429ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 430ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCMidiPlayer_class = objectIDtoClass(SL_OBJECTID_MIDIPLAYER); 431c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pCMidiPlayer_class) { 432c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 433c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 434c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pCMidiPlayer_class, numInterfaces, 435c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 436c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 437ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 438ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CMidiPlayer *this = (CMidiPlayer *) construct(pCMidiPlayer_class, exposedMask, self); 439ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 440ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 441ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 442928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten // FIXME a fake value - why not use value from IPlay_init? what does CT check for? 4433d81b8ca5d3cee893672beb76e00849d4f3fa8b8Glenn Kasten this->mPlay.mDuration = 0; 444f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 445f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new MIDI player object 446f51dba65751107c930759938775b75531ec1f330Glenn Kasten *pPlayer = &this->mObject.mItf; 447ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 448ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 449ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 4507a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 4517a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 4527a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 453ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 454ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 4550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 4560b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 457ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 4580b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_CreateListener(SLEngineItf self, SLObjectItf *pListener, 459d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 4600b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 461ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 462ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 463a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_GAME 464ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pListener) { 465ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 466ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 467ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pListener = NULL; 468ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 469ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCListener_class = objectIDtoClass(SL_OBJECTID_LISTENER); 470c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pCListener_class) { 471c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 472c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 473c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pCListener_class, numInterfaces, 474c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 475c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 476ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 477ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CListener *this = (CListener *) construct(pCListener_class, exposedMask, self); 478ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 479ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 480ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 481f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 482f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new 3D listener object 483ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pListener = &this->mObject.mItf; 484ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 485ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 486ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 4877a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 4887a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 4897a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 490ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 491ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 4920b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 4930b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 494ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 495d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEngine_Create3DGroup(SLEngineItf self, SLObjectItf *pGroup, SLuint32 numInterfaces, 496d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 4970b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 498ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 499ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 500a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & USE_PROFILES_GAME 501ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pGroup) { 502ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 503ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 504ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pGroup = NULL; 505ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 506ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pC3DGroup_class = objectIDtoClass(SL_OBJECTID_3DGROUP); 507c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pC3DGroup_class) { 508c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 509c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 510c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pC3DGroup_class, numInterfaces, 511c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 512c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 513ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 514ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten C3DGroup *this = (C3DGroup *) construct(pC3DGroup_class, exposedMask, self); 515ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 516ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 517ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 518ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mMemberMask = 0; 519f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 520f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new 3D group object 521ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pGroup = &this->mObject.mItf; 522ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 523ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 524ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 5257a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 5267a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 5277a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 528ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 529ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 5300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 5310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 532ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 53300d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kastenstatic SLresult IEngine_CreateOutputMix(SLEngineItf self, SLObjectItf *pMix, SLuint32 numInterfaces, 53400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 5350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 536ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 537ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 538ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMix) { 539ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 540ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 541ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMix = NULL; 542ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 543ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCOutputMix_class = objectIDtoClass(SL_OBJECTID_OUTPUTMIX); 544c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten assert(NULL != pCOutputMix_class); 545ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = checkInterfaces(pCOutputMix_class, numInterfaces, 546ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 547ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 548ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten COutputMix *this = (COutputMix *) construct(pCOutputMix_class, exposedMask, self); 549ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 550ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 551ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 55243e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi#ifdef ANDROID 55343e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi android_outputMix_create(this); 55443e7743b5297cc5afcb246a7e2b5d825a607f8afJean-Michel Trivi#endif 555f51dba65751107c930759938775b75531ec1f330Glenn Kasten#ifdef USE_SDL 556b0ab2dee391dd2cb257faeaba252ee6ecccc5f03Glenn Kasten IEngine *thisEngine = &this->mObject.mEngine->mEngine; 557f51dba65751107c930759938775b75531ec1f330Glenn Kasten interface_lock_exclusive(thisEngine); 558f51dba65751107c930759938775b75531ec1f330Glenn Kasten bool unpause = false; 559f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (NULL == thisEngine->mOutputMix) { 560f51dba65751107c930759938775b75531ec1f330Glenn Kasten thisEngine->mOutputMix = this; 561f51dba65751107c930759938775b75531ec1f330Glenn Kasten unpause = true; 562f51dba65751107c930759938775b75531ec1f330Glenn Kasten } 563f51dba65751107c930759938775b75531ec1f330Glenn Kasten interface_unlock_exclusive(thisEngine); 564f51dba65751107c930759938775b75531ec1f330Glenn Kasten#endif 565f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 566f51dba65751107c930759938775b75531ec1f330Glenn Kasten#ifdef USE_SDL 567f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (unpause) { 568f51dba65751107c930759938775b75531ec1f330Glenn Kasten // Enable SDL_callback to be called periodically by SDL's internal thread 569f51dba65751107c930759938775b75531ec1f330Glenn Kasten SDL_PauseAudio(0); 570f51dba65751107c930759938775b75531ec1f330Glenn Kasten } 571f51dba65751107c930759938775b75531ec1f330Glenn Kasten#endif 572f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new output mix object 573ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMix = &this->mObject.mItf; 574ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 575ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 576ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 577ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 578ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 5790b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 5800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 581ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 582d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEngine_CreateMetadataExtractor(SLEngineItf self, SLObjectItf *pMetadataExtractor, 583d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten SLDataSource *pDataSource, SLuint32 numInterfaces, const SLInterfaceID *pInterfaceIds, 5840b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const SLboolean *pInterfaceRequired) 5850b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 586ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 587ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 588a3080daa505f91df51a808c85ddb37c48745bf7cGlenn Kasten#if USE_PROFILES & (USE_PROFILES_GAME | USE_PROFILES_MUSIC) 589ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pMetadataExtractor) { 590ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 591ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 592ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMetadataExtractor = NULL; 593ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten unsigned exposedMask; 594ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *pCMetadataExtractor_class = 595ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten objectIDtoClass(SL_OBJECTID_METADATAEXTRACTOR); 596c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten if (NULL == pCMetadataExtractor_class) { 597c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 598c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } else { 599c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten result = checkInterfaces(pCMetadataExtractor_class, numInterfaces, 600c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten pInterfaceIds, pInterfaceRequired, &exposedMask); 601c2b9d79c4b59caff965076f445f5a735a360b084Glenn Kasten } 602ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (SL_RESULT_SUCCESS == result) { 603ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten CMetadataExtractor *this = (CMetadataExtractor *) 604ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten construct(pCMetadataExtractor_class, exposedMask, self); 605ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == this) { 606ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_MEMORY_FAILURE; 607ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 608f51dba65751107c930759938775b75531ec1f330Glenn Kasten IObject_Publish(&this->mObject); 609f51dba65751107c930759938775b75531ec1f330Glenn Kasten // return the new metadata extractor object 610ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pMetadataExtractor = &this->mObject.mItf; 611ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 612ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 613ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 614ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 6157a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#else 6167a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 6177a79f519d89eb0e1a5b3f4005484b16d6854d7e2Glenn Kasten#endif 618ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 619ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 6200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 6210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 622ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 623d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEngine_CreateExtensionObject(SLEngineItf self, SLObjectItf *pObject, 624d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten void *pParameters, SLuint32 objectID, SLuint32 numInterfaces, 625d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten const SLInterfaceID *pInterfaceIds, const SLboolean *pInterfaceRequired) 6260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 627ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 628ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 629ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pObject) { 630ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 631ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 632ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pObject = NULL; 633ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 634ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 635ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 636ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 6370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 6380b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 639ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 6400b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_QueryNumSupportedInterfaces(SLEngineItf self, 6410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 objectID, SLuint32 *pNumSupportedInterfaces) 6420b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 643ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 644ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 645ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumSupportedInterfaces) { 646ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 647ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 648ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *class__ = objectIDtoClass(objectID); 649ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == class__) { 650ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 651ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 652ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLuint32 count = 0; 653ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLuint32 i; 654c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten for (i = 0; i < class__->mInterfaceCount; ++i) { 655c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten switch (class__->mInterfaces[i].mInterface) { 656c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_IMPLICIT: 657104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten case INTERFACE_IMPLICIT_PREREALIZE: 658c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_EXPLICIT: 6595e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten case INTERFACE_EXPLICIT_PREREALIZE: 660c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_DYNAMIC: 661ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten ++count; 662c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten break; 663c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_UNAVAILABLE: 664c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten break; 665c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten default: 666c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten assert(false); 667c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten break; 668c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten } 669c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten } 670ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pNumSupportedInterfaces = count; 671ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 672ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 673ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 674ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 675ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE; 6760b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 6770b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 678ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 6790b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_QuerySupportedInterfaces(SLEngineItf self, 6800b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 objectID, SLuint32 index, SLInterfaceID *pInterfaceId) 6810b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 682ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 683ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 684ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pInterfaceId) { 685ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 686ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 687ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pInterfaceId = NULL; 688ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten const ClassTable *class__ = objectIDtoClass(objectID); 689ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == class__) { 690ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 691ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 692ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; // will be reset later 693ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLuint32 i; 694ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten for (i = 0; i < class__->mInterfaceCount; ++i) { 695c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten switch (class__->mInterfaces[i].mInterface) { 696c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_IMPLICIT: 697104c000a6f36b871ca11e0394db1e5217f374cafGlenn Kasten case INTERFACE_IMPLICIT_PREREALIZE: 698c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_EXPLICIT: 6995e3b06982dbf1eae237cc74326e66d51d3cdd664Glenn Kasten case INTERFACE_EXPLICIT_PREREALIZE: 700c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_DYNAMIC: 701c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten break; 702c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten case INTERFACE_UNAVAILABLE: 703ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten continue; 704c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten default: 705c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten assert(false); 706c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten break; 707c3845706778edec308bd9ced559cec0a456608bdGlenn Kasten } 708ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (index == 0) { 709ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pInterfaceId = &SL_IID_array[class__->mInterfaces[i].mMPH]; 710ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 711ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten break; 712ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 713ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten --index; 714ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 715a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten } 716a438eb1cf1ae602afab00336528dd230bd929206Glenn Kasten } 717ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 718ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7190b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 7200b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 721ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 722b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kastenstatic const char * const extensionNames[] = { 723b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten#ifdef ANDROID 724b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten "ANDROID_SDK_LEVEL_9", // Android 2.3 aka "Gingerbread" 7258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten "ANDROID_SDK_LEVEL_10", // Android 3.0 aka "Honeycomb" 726b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten // in the future, add more entries for each SDK level here, and 727b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten // don't delete the entries for previous SDK levels unless support is removed 728b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten#else 729b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten "WILHELM_DESKTOP", 730b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten#endif 731b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten}; 732b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten 733b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten 734ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kastenstatic SLresult IEngine_QueryNumSupportedExtensions(SLEngineItf self, SLuint32 *pNumExtensions) 7350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 736ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 737ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 738ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pNumExtensions) { 739ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 740ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 741b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten *pNumExtensions = sizeof(extensionNames) / sizeof(extensionNames[0]); 742ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 743ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 744ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 745ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7460b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 7470b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 748ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 7490b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_QuerySupportedExtension(SLEngineItf self, 7500b167267bda99b68346045ccab14e810121d5de4Glenn Kasten SLuint32 index, SLchar *pExtensionName, SLint16 *pNameLength) 7510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 752ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 753ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 754b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (NULL == pNameLength) { 755b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 756b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } else { 757b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten size_t actualNameLength; 758b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten unsigned numExtensions = sizeof(extensionNames) / sizeof(extensionNames[0]); 759b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (index >= numExtensions) { 760b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten actualNameLength = 0; 761b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 762b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } else { 763b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten const char *extensionName = extensionNames[index]; 764b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten actualNameLength = strlen(extensionName) + 1; 765b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (NULL == pExtensionName) { 766b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten // application is querying the name length in order to allocate a buffer 767b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_SUCCESS; 768b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } else { 769b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten SLint16 availableNameLength = *pNameLength; 770b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (0 >= availableNameLength) { 771b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten // there is not even room for the terminating NUL 772b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 773b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } else if (actualNameLength > (size_t) availableNameLength) { 774b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten // "no invalid strings are written. That is, the null-terminator always exists" 775b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten memcpy(pExtensionName, extensionName, (size_t) availableNameLength - 1); 776b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten pExtensionName[(size_t) availableNameLength - 1] = '\0'; 777b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_BUFFER_INSUFFICIENT; 778b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } else { 779b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten memcpy(pExtensionName, extensionName, actualNameLength); 780b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_SUCCESS; 781b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 782b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 783b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 784b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten *pNameLength = actualNameLength; 785b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 786ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 787ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 7880b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 7890b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 790ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 7910b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic SLresult IEngine_IsExtensionSupported(SLEngineItf self, 7920b167267bda99b68346045ccab14e810121d5de4Glenn Kasten const SLchar *pExtensionName, SLboolean *pSupported) 7930b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 794ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 795ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 796b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (NULL == pSupported) { 797ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 798ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 799b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten SLboolean isSupported = SL_BOOLEAN_FALSE; 800b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (NULL == pExtensionName) { 801b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 802b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } else { 803b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten unsigned numExtensions = sizeof(extensionNames) / sizeof(extensionNames[0]); 804b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten unsigned i; 805b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten for (i = 0; i < numExtensions; ++i) { 806b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten if (!strcmp((const char *) pExtensionName, extensionNames[i])) { 807b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten isSupported = SL_BOOLEAN_TRUE; 808b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten break; 809b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 810b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 811b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten result = SL_RESULT_SUCCESS; 812b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten } 813b52bc98b576a9b56e82eca435849bd55e54b6bc1Glenn Kasten *pSupported = isSupported; 814ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 815ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 816ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 8170b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 8180b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 819ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 8200b167267bda99b68346045ccab14e810121d5de4Glenn Kastenstatic const struct SLEngineItf_ IEngine_Itf = { 8210b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateLEDDevice, 8220b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateVibraDevice, 8230b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateAudioPlayer, 8240b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateAudioRecorder, 8250b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateMidiPlayer, 8260b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateListener, 8270b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_Create3DGroup, 8280b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateOutputMix, 8290b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateMetadataExtractor, 8300b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_CreateExtensionObject, 8310b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_QueryNumSupportedInterfaces, 8320b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_QuerySupportedInterfaces, 8330b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_QueryNumSupportedExtensions, 8340b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_QuerySupportedExtension, 8350b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine_IsExtensionSupported 8360b167267bda99b68346045ccab14e810121d5de4Glenn Kasten}; 8370b167267bda99b68346045ccab14e810121d5de4Glenn Kasten 8380b167267bda99b68346045ccab14e810121d5de4Glenn Kastenvoid IEngine_init(void *self) 8390b167267bda99b68346045ccab14e810121d5de4Glenn Kasten{ 8400b167267bda99b68346045ccab14e810121d5de4Glenn Kasten IEngine *this = (IEngine *) self; 8410b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mItf = &IEngine_Itf; 842a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // mLossOfControlGlobal is initialized in slCreateEngine 84300d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#ifdef USE_SDL 84400d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten this->mOutputMix = NULL; 84500d2d554e04ac369367c903dbf53b975355d1bcdGlenn Kasten#endif 846ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten this->mInstanceCount = 1; // ourself 847ccdf07b17f23b4c040dd3f62478d0965eba804e3Glenn Kasten this->mInstanceMask = 0; 848e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten this->mChangedMask = 0; 8490b167267bda99b68346045ccab14e810121d5de4Glenn Kasten unsigned i; 850928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten for (i = 0; i < MAX_INSTANCE; ++i) { 8510b167267bda99b68346045ccab14e810121d5de4Glenn Kasten this->mInstances[i] = NULL; 852928ea4ffff40c82987cfb1ac9e3095fdc6968709Glenn Kasten } 853d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kasten this->mShutdown = SL_BOOLEAN_FALSE; 8544597a7427b697df31d0bbf4c2040806d0c27b6e0Glenn Kasten this->mShutdownAck = SL_BOOLEAN_FALSE; 8550b167267bda99b68346045ccab14e810121d5de4Glenn Kasten} 856a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 857a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IEngine_deinit(void *self) 858a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 859a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 8608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten// OpenMAX AL Engine 8638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IEngine_CreateCameraDevice(XAEngineItf self, XAObjectItf *pDevice, 8668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 deviceID, XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 8678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 8688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 8698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_INTERFACE 8708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten //IXAEngine *this = (IXAEngine *) self; 8728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 8738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_INTERFACE 8758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 8768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IEngine_CreateRadioDevice(XAEngineItf self, XAObjectItf *pDevice, 8798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 8808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 8818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 8828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_INTERFACE 8838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten //IXAEngine *this = (IXAEngine *) self; 8858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 8868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_INTERFACE 8888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 8898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 8918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_CreateLEDDevice(XAEngineItf self, XAObjectItf *pDevice, XAuint32 deviceID, 8928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 8938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 8948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 8958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 8968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_CreateLEDDevice(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 8978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (SLObjectItf *) pDevice, deviceID, numInterfaces, (const SLInterfaceID *) pInterfaceIds, 8988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLboolean *) pInterfaceRequired); 8998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9028db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_CreateVibraDevice(XAEngineItf self, XAObjectItf *pDevice, 9038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 deviceID, XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 9048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 9058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 9078db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_CreateVibraDevice(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 9088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (SLObjectItf *) pDevice, deviceID, numInterfaces, (const SLInterfaceID *) pInterfaceIds, 9098db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLboolean *) pInterfaceRequired); 9108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IEngine_CreateMediaPlayer(XAEngineItf self, XAObjectItf *pPlayer, 9148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XADataSource *pDataSrc, XADataSource *pBankSrc, XADataSink *pAudioSnk, 9158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XADataSink *pImageVideoSnk, XADataSink *pVibra, XADataSink *pLEDArray, 9168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 9178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 9188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_INTERFACE 9208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten //IXAEngine *this = (IXAEngine *) self; 9228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 9238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_INTERFACE 9258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IEngine_CreateMediaRecorder(XAEngineItf self, XAObjectItf *pRecorder, 9298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XADataSource *pAudioSrc, XADataSource *pImageVideoSrc, 9308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XADataSink *pDataSnk, XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 9318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 9328db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_INTERFACE 9348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten //IXAEngine *this = (IXAEngine *) self; 9368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 9378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_INTERFACE 9398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_CreateOutputMix(XAEngineItf self, XAObjectItf *pMix, 9438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 numInterfaces, const XAInterfaceID *pInterfaceIds, 9448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAboolean *pInterfaceRequired) 9458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 9478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_CreateOutputMix(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 9488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (SLObjectItf *) pMix, numInterfaces, (const SLInterfaceID *) pInterfaceIds, 9498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLboolean *) pInterfaceRequired); 9508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9518db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_CreateMetadataExtractor(XAEngineItf self, XAObjectItf *pMetadataExtractor, 9548db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XADataSource *pDataSource, XAuint32 numInterfaces, 9558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAInterfaceID *pInterfaceIds, const XAboolean *pInterfaceRequired) 9568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 9588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_CreateMetadataExtractor(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 9598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (SLObjectItf *) pMetadataExtractor, (SLDataSource *) pDataSource, numInterfaces, 9608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLInterfaceID *) pInterfaceIds, (const SLboolean *) pInterfaceRequired); 9618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_CreateExtensionObject(XAEngineItf self, XAObjectItf *pObject, 9658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten void *pParameters, XAuint32 objectID, XAuint32 numInterfaces, 9668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten const XAInterfaceID *pInterfaceIds, const XAboolean *pInterfaceRequired) 9678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 9698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_CreateExtensionObject(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 9708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (SLObjectItf *) pObject, pParameters, objectID, numInterfaces, 9718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (const SLInterfaceID *) pInterfaceIds, (const SLboolean *) pInterfaceRequired); 9728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IEngine_GetImplementationInfo(XAEngineItf self, XAuint32 *pMajor, XAuint32 *pMinor, 9768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 *pStep, /* XAuint32 nImplementationTextSize, */ const XAchar *pImplementationText) 9778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_INTERFACE 9798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten //IXAEngine *this = (IXAEngine *) self; 9818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = SL_RESULT_FEATURE_UNSUPPORTED; 9828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_INTERFACE 9848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 9858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QuerySupportedProfiles(XAEngineItf self, XAint16 *pProfilesSupported) 9888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 9898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_ENTER_INTERFACE 9908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 9918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten if (NULL == pProfilesSupported) { 9928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = XA_RESULT_PARAMETER_INVALID; 9938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } else { 9948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#if 1 9958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten *pProfilesSupported = 0; 9968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // FIXME the code below was copied from OpenSL ES and needs to be adapted for OpenMAX AL. 9978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#else 9988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // The generic implementation doesn't implement any of the profiles, they shouldn't be 9998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // declared as supported. Also exclude the fake profiles BASE and OPTIONAL. 10008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten *pProfilesSupported = USE_PROFILES & 10018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (USE_PROFILES_GAME | USE_PROFILES_MUSIC | USE_PROFILES_PHONE); 10028db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten#endif 10038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten result = XA_RESULT_SUCCESS; 10048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten } 10058db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10068db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XA_LEAVE_INTERFACE 10078db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10088db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10098db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10108db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QueryNumSupportedInterfaces(XAEngineItf self, XAuint32 objectID, 10118db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 *pNumSupportedInterfaces) 10128db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10138db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 10148db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_QueryNumSupportedInterfaces( 10158db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, objectID, 10168db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten pNumSupportedInterfaces); 10178db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10188db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10198db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10208db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QuerySupportedInterfaces(XAEngineItf self, XAuint32 objectID, 10218db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 index, XAInterfaceID *pInterfaceId) 10228db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10238db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 10248db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_QuerySupportedInterfaces( 10258db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, objectID, index, 10268db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten (SLInterfaceID *) pInterfaceId); 10278db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10288db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10298db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10308db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QueryNumSupportedExtensions(XAEngineItf self, XAuint32 *pNumExtensions) 10318db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10328db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 10338db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_QueryNumSupportedExtensions( 10348db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten &((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, pNumExtensions); 10358db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10368db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10378db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10388db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QuerySupportedExtension(XAEngineItf self, XAuint32 index, 10398db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAchar *pExtensionName, XAint16 *pNameLength) 10408db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10418db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 10428db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_QuerySupportedExtension(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 10438db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten index, pExtensionName, (SLint16 *) pNameLength); 10448db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10458db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10468db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10478db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_IsExtensionSupported(XAEngineItf self, const XAchar *pExtensionName, 10488db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAboolean *pSupported) 10498db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10508db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES 10518db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return IEngine_IsExtensionSupported(&((CEngine *) ((IXAEngine *) self)->mThis)->mEngine.mItf, 10528db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten pExtensionName, pSupported); 10538db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10548db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10558db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10568db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QueryLEDCapabilities(XAEngineItf self, XAuint32 *pIndex, 10578db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 *pLEDDeviceID, XALEDDescriptor *pDescriptor) 10588db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10598db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES EngineCapabilities 10608db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return (XAresult) IEngineCapabilities_QueryLEDCapabilities( 10618db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten &((CEngine *) ((IXAEngine *) self)->mThis)->mEngineCapabilities.mItf, pIndex, 10628db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten pLEDDeviceID, (SLLEDDescriptor *) pDescriptor); 10638db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10648db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10658db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10668db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic XAresult IXAEngine_QueryVibraCapabilities(XAEngineItf self, XAuint32 *pIndex, 10678db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten XAuint32 *pVibraDeviceID, XAVibraDescriptor *pDescriptor) 10688db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 10698db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten // forward to OpenSL ES EngineCapabilities 10708db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten return (XAresult) IEngineCapabilities_QueryVibraCapabilities( 10718db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten &((CEngine *) ((IXAEngine *) self)->mThis)->mEngineCapabilities.mItf, pIndex, 10728db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten pVibraDeviceID, (SLVibraDescriptor *) pDescriptor); 10738db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 10748db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10758db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10768db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten// OpenMAX AL engine v-table 10778db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10788db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenstatic const struct XAEngineItf_ IXAEngine_Itf = { 10798db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IEngine_CreateCameraDevice, 10808db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IEngine_CreateRadioDevice, 10818db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_CreateLEDDevice, 10828db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_CreateVibraDevice, 10838db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IEngine_CreateMediaPlayer, 10848db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IEngine_CreateMediaRecorder, 10858db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_CreateOutputMix, 10868db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_CreateMetadataExtractor, 10878db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_CreateExtensionObject, 10888db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IEngine_GetImplementationInfo, 10898db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QuerySupportedProfiles, 10908db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QueryNumSupportedInterfaces, 10918db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QuerySupportedInterfaces, 10928db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QueryNumSupportedExtensions, 10938db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QuerySupportedExtension, 10948db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_IsExtensionSupported, 10958db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QueryLEDCapabilities, 10968db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine_QueryVibraCapabilities 10978db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten}; 10988db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 10998db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten 11008db0b106cdce5f5216b1535492de7930ad738aedGlenn Kastenvoid IXAEngine_init(void *self) 11018db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten{ 11028db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten IXAEngine *this = (IXAEngine *) self; 11038db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten this->mItf = &IXAEngine_Itf; 11048db0b106cdce5f5216b1535492de7930ad738aedGlenn Kasten} 1105