| /* |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /* Android Effect implementation */ |
| |
| #include "sles_allinclusive.h" |
| |
| #include <system/audio.h> |
| |
| static SLresult IAndroidEffect_CreateEffect(SLAndroidEffectItf self, |
| SLInterfaceID effectImplementationId) { |
| |
| SL_ENTER_INTERFACE |
| |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| if (SL_OBJECTID_AUDIOPLAYER == IObjectToObjectID(thiz->mThis)) { |
| CAudioPlayer *ap = (CAudioPlayer *)thiz->mThis; |
| if (ap->mAudioTrack != 0) { |
| result = android_genericFx_createEffect(thiz, effectImplementationId, ap->mSessionId); |
| } else { |
| result = SL_RESULT_RESOURCE_ERROR; |
| } |
| } else if (SL_OBJECTID_OUTPUTMIX == IObjectToObjectID(thiz->mThis)) { |
| result = android_genericFx_createEffect(thiz, effectImplementationId, |
| AUDIO_SESSION_OUTPUT_MIX); |
| } else { |
| // the interface itself is invalid because it is not attached to an AudioPlayer or |
| // an OutputMix |
| result = SL_RESULT_PARAMETER_INVALID; |
| } |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static SLresult IAndroidEffect_ReleaseEffect(SLAndroidEffectItf self, |
| SLInterfaceID effectImplementationId) { |
| |
| SL_ENTER_INTERFACE |
| |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| result = android_genericFx_releaseEffect(thiz, effectImplementationId); |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static SLresult IAndroidEffect_SetEnabled(SLAndroidEffectItf self, |
| SLInterfaceID effectImplementationId, SLboolean enabled) { |
| |
| SL_ENTER_INTERFACE |
| |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| result = android_genericFx_setEnabled(thiz, effectImplementationId, enabled); |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static SLresult IAndroidEffect_IsEnabled(SLAndroidEffectItf self, |
| SLInterfaceID effectImplementationId, SLboolean * pEnabled) { |
| |
| SL_ENTER_INTERFACE |
| |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| result = android_genericFx_isEnabled(thiz, effectImplementationId, pEnabled); |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static SLresult IAndroidEffect_SendCommand(SLAndroidEffectItf self, |
| SLInterfaceID effectImplementationId, SLuint32 command, SLuint32 commandSize, |
| void* pCommand, SLuint32 *replySize, void *pReply) { |
| |
| SL_ENTER_INTERFACE |
| |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| result = android_genericFx_sendCommand(thiz, effectImplementationId, command, commandSize, |
| pCommand, replySize, pReply); |
| |
| SL_LEAVE_INTERFACE |
| } |
| |
| |
| static const struct SLAndroidEffectItf_ IAndroidEffect_Itf = { |
| IAndroidEffect_CreateEffect, |
| IAndroidEffect_ReleaseEffect, |
| IAndroidEffect_SetEnabled, |
| IAndroidEffect_IsEnabled, |
| IAndroidEffect_SendCommand |
| }; |
| |
| void IAndroidEffect_init(void *self) |
| { |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| thiz->mItf = &IAndroidEffect_Itf; |
| thiz->mEffects = new android::KeyedVector<SLuint32, android::AudioEffect* >(); |
| } |
| |
| void IAndroidEffect_deinit(void *self) |
| { |
| IAndroidEffect *thiz = (IAndroidEffect *) self; |
| if (NULL != thiz->mEffects) { |
| if (!thiz->mEffects->isEmpty()) { |
| for (size_t i = 0 ; i < thiz->mEffects->size() ; i++) { |
| delete thiz->mEffects->valueAt(i); |
| } |
| thiz->mEffects->clear(); |
| } |
| delete thiz->mEffects; |
| thiz->mEffects = NULL; |
| } |
| } |