IAndroidEffectSend.cpp revision fef6033d852daec8d88060b252e72f322724dca1
1fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi/* 2fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project 3fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * 4fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 5fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * you may not use this file except in compliance with the License. 6fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * You may obtain a copy of the License at 7fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * 8fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 9fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * 10fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 11fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 12fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * See the License for the specific language governing permissions and 14fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi * limitations under the License. 15fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi */ 16fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 17fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi/* AndroidEffectSend implementation */ 18fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 19fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#include "sles_allinclusive.h" 20fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 21fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 22fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_EnableEffectSend(SLAndroidEffectSendItf self, 23fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLboolean enable, SLmillibel initialLevel) 24fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 25fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 26fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 27fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (!((SL_MILLIBEL_MIN <= initialLevel) && (initialLevel <= 0))) { 28fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 29fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 30fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 31fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_lock_exclusive(this); 32fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // is SLAndroidEffectSendItf on an AudioPlayer? 33fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ? 34fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi (CAudioPlayer *) this->mThis : NULL; 35fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap) { 36fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 37fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 38fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 39fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // does this AudioPlayer have an OutputMix? 40fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap->mOutputMix) { 41fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: AudioPlayer doesn't have an OutputMix"); 42fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 43fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 44fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#if !defined(ANDROID) || defined(USE_BACKPORT) 45fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 46fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#else 47fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = android_fxSend_attachToAux(ap, effectImplementationId, enable, 48fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi initialLevel); 49fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#endif 50fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (SL_RESULT_SUCCESS == result) { 51fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // there currently is support for only one send bus, so there is a single send 52fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // level and a single enable flag 53fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi this->mSendLevel = initialLevel; 54fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi this->mEnabled = enable; 55fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 56fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 57fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 58fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive(this); 59fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 60fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 61fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 62fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 63fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 64fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 65fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_IsEnabled(SLAndroidEffectSendItf self, 66fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLboolean *pEnable) 67fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 68fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 69fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 70fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == pEnable) { 71fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 72fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 73fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 74fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_lock_shared(this); 75fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // there currently is support for only one send bus, so there is a single enable flag 76fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLboolean enable = this->mEnabled; 77fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_shared(this); 78fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi *pEnable = enable; 79fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 80fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 81fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 82fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 83fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 84fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 85fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 86fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_SetDirectLevel(SLAndroidEffectSendItf self, 87fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLmillibel directLevel) 88fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 89fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 90fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 91fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (!((SL_MILLIBEL_MIN <= directLevel) && (directLevel <= 0))) { 92fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 93fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 94fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 95fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_lock_exclusive(this); 96fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ? 97fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi (CAudioPlayer *) this->mThis : NULL; 98fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL != ap) { 99fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLmillibel oldDirectLevel = ap->mDirectLevel; 100fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (oldDirectLevel != directLevel) { 101fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi ap->mDirectLevel = directLevel; 102fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi #if defined(ANDROID) 103fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi ap->mAmplFromDirectLevel = sles_to_android_amplification(directLevel); 104fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive_attributes(this, ATTR_GAIN); 105fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi #endif 106fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 107fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive(this); 108fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 109fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 110fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 111fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive(this); 112fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 113fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 114fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 115fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 116fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 117fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 118fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 119fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 120fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 121fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_GetDirectLevel(SLAndroidEffectSendItf self, 122fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLmillibel *pDirectLevel) 123fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 124fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 125fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 126fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == pDirectLevel) { 127fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 128fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 129fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 130fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_lock_peek(this); 131fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ? 132fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi (CAudioPlayer *) this->mThis : NULL; 133fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL != ap) { 134fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi *pDirectLevel = ap->mDirectLevel; 135fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 136fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 137fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 138fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 139fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 140fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive(this); 141fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 142fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 143fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 144fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 145fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 146fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 147fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_SetSendLevel(SLAndroidEffectSendItf self, 148fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLmillibel sendLevel) 149fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 150fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 151fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 152fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (!((SL_MILLIBEL_MIN <= sendLevel) && (sendLevel <= 0))) { 153fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 154fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 155fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 156fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_lock_exclusive(this); 157fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // is SLAndroidEffectSendItf on an AudioPlayer? 158fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ? 159fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi (CAudioPlayer *) this->mThis : NULL; 160fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap) { 161fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 162fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 163fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 164fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // does this AudioPlayer have an OutputMix? 165fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap->mOutputMix) { 166fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: AudioPlayer doesn't have an OutputMix"); 167fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 168fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 169fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi #if !defined(ANDROID) || defined(USE_BACKPORT) 170fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 171fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi #else 172fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (android_genericFx_hasEffect(&ap->mOutputMix->mAndroidEffect, 173fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi effectImplementationId)) { 174fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = android_fxSend_setSendLevel(ap, sendLevel); 175fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 176fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("trying to send to an effect not on this AudioPlayer's OutputMix"); 177fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 178fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 179fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi #endif 180fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (SL_RESULT_SUCCESS == result) { 181fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // there currently is support for only one send bus, so there is a single send 182fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // level 183fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi this->mSendLevel = sendLevel; 184fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 185fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 186fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 187fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive(this); 188fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 189fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 190fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 191fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 192fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 193fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 194fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_GetSendLevel(SLAndroidEffectSendItf self, 195fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLmillibel *pSendLevel) 196fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 197fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 198fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 199fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == pSendLevel) { 200fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 201fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 202fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 203fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_lock_exclusive(this); 204fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // is SLAndroidEffectSendItf on an AudioPlayer? 205fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ? 206fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi (CAudioPlayer *) this->mThis : NULL; 207fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap) { 208fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 209fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 210fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 211fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // does this AudioPlayer have an OutputMix? 212fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap->mOutputMix) { 213fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: AudioPlayer doesn't have an OutputMix"); 214fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 215fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 216fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#if !defined(ANDROID) || defined(USE_BACKPORT) 217fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 218fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#else 219fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (android_genericFx_hasEffect(&ap->mOutputMix->mAndroidEffect, 220fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi effectImplementationId)) { 221fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 222fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 223fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("trying to retrieve send level on an effect not on this AudioPlayer's \ 224fef6033d852daec8d88060b252e72f322724dca1Jean-Michel TriviOutputMix"); 225fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 226fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 227fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi#endif 228fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (SL_RESULT_SUCCESS == result) { 229fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // there currently is support for only one send bus, so there is a single send 230fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // level 231fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi *pSendLevel = this->mSendLevel; 232fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 233fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 234fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 235fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi interface_unlock_exclusive(this); 236fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 237fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 238fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 239fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 240fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 241fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 242fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic const struct SLAndroidEffectSendItf_ IAndroidEffectSend_Itf = { 243fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_EnableEffectSend, 244fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_IsEnabled, 245fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_SetDirectLevel, 246fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_GetDirectLevel, 247fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_SetSendLevel, 248fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_GetSendLevel 249fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi}; 250fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 251fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivivoid IAndroidEffectSend_init(void *self) 252fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 253fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend *this = (IAndroidEffectSend *) self; 254fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi this->mItf = &IAndroidEffectSend_Itf; 255fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi this->mEnabled = SL_BOOLEAN_FALSE; 256fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi this->mSendLevel = SL_MILLIBEL_MIN; 257fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 258