15b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi/* 25b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 35b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * 45b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 55b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * you may not use this file except in compliance with the License. 65b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * You may obtain a copy of the License at 75b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * 85b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 95b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * 105b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 115b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 125b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * See the License for the specific language governing permissions and 145b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi * limitations under the License. 155b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi */ 165b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 175b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi/* Android Effect Capabilities implementation */ 185b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 195b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi#include "sles_allinclusive.h" 205b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 215b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 225b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivistatic SLresult IAndroidEffectCapabilities_QueryNumEffects(SLAndroidEffectCapabilitiesItf self, 235b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SLuint32 * pNumSupportedAudioEffects) { 245b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 255b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SL_ENTER_INTERFACE 265b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 275b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi if (NULL == pNumSupportedAudioEffects) { 285b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 295b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } else { 30bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; 31b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 325b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pNumSupportedAudioEffects = thiz->mNumFx; 345c8bd83295b2752bb7ac34f83dfb19dcdb1be5e5Glenn Kasten result = SL_RESULT_SUCCESS; 355b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 36b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 375b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 385b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 395b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SL_LEAVE_INTERFACE 405b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} 415b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 425b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 435b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivistatic SLresult IAndroidEffectCapabilities_QueryEffect(SLAndroidEffectCapabilitiesItf self, 445b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SLuint32 index, SLInterfaceID *pEffectType, SLInterfaceID *pEffectImplementation, 457fc9e14cb8d840df7242d37b55acff0b58d269c7Jean-Michel Trivi SLchar * pName, SLuint16 *pNameSize) { 465b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 475b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SL_ENTER_INTERFACE 485b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 49bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (index > thiz->mNumFx) { 515b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 525b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } else { 53b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_lock_shared(thiz); 545b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi if (NULL != pEffectType) { 55bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pEffectType = (SLInterfaceID) &thiz->mFxDescriptors[index].type; 565b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 575b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi if (NULL != pEffectImplementation) { 58bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pEffectImplementation = (SLInterfaceID) &thiz->mFxDescriptors[index].uuid; 595b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 605b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi if ((NULL != pName) && (0 < *pNameSize)) { 61bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten int len = strlen(thiz->mFxDescriptors[index].name); 62bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten strncpy((char*)pName, thiz->mFxDescriptors[index].name, 635b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi *pNameSize > len ? len : *pNameSize ); 645b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi *pNameSize = len; 655b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 66b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten interface_unlock_shared(thiz); 675b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi result = SL_RESULT_SUCCESS; 685b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 695b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 705b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi SL_LEAVE_INTERFACE 715b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} 725b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 735b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 745b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivistatic const struct SLAndroidEffectCapabilitiesItf_ IAndroidEffectCapabilities_Itf = { 755b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi IAndroidEffectCapabilities_QueryNumEffects, 765b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi IAndroidEffectCapabilities_QueryEffect 775b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi}; 785b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 795b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivivoid IAndroidEffectCapabilities_init(void *self) 805b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi{ 81bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; 82bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IAndroidEffectCapabilities_Itf; 835b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 84a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // This is the default initialization; fields will be updated when interface is exposed 85bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mNumFx = 0; 86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors = NULL; 87a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 88a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten 89a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenbool IAndroidEffectCapabilities_Expose(void *self) 90a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 91bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; 92a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten SLuint32 numEffects = 0; 93a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten SLresult result = android_genericFx_queryNumEffects(&numEffects); 94a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten if (SL_RESULT_SUCCESS != result) { 95a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGE("android_genericFx_queryNumEffects %u", result); 96a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten return false; 975b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 98bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mNumFx = numEffects; 99a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGV("Effect Capabilities has %d effects", thiz->mNumFx); 100bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (thiz->mNumFx > 0) { 101bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors = (effect_descriptor_t*) new effect_descriptor_t[thiz->mNumFx]; 102bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten for (SLuint32 i = 0 ; i < thiz->mNumFx ; i++) { 103a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten SLresult result2; 104bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten result2 = android_genericFx_queryEffect(i, &thiz->mFxDescriptors[i]); 105a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten if (SL_RESULT_SUCCESS != result2) { 106a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGE("Error (SLresult is %d) querying effect %d", result2, i); 107a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // Remember the first failing result code, but keep going 108a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten if (SL_RESULT_SUCCESS == result) { 109a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten result = result2; 110a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten } 1115b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } else { 112a8179ea15c4ff78db589d742b135649f0eda7ef2Glenn Kasten SL_LOGV("effect %d: type=%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x name=%s", 1135b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi i, 114bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.timeLow, 115bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.timeMid, 116bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.timeHiAndVersion, 117bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.clockSeq, 118bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.node[0], 119bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.node[1], 120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.node[2], 121bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.node[3], 122bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.node[4], 123bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].type.node[5], 124bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors[i].name); 1255b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 1265b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 1275b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi } 128a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten return SL_RESULT_SUCCESS == result; 129a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten} 1305b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi 131a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IAndroidEffectCapabilities_deinit(void *self) 132a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{ 133bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectCapabilities *thiz = (IAndroidEffectCapabilities *) self; 134a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten // free effect library data 135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten if (NULL != thiz->mFxDescriptors) { 136bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten delete[] thiz->mFxDescriptors; 137bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mFxDescriptors = NULL; 138a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten } 1395b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi} 140