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