IAndroidEffectSend.cpp revision ad79bbfd16ba81a45842179178332fbd06ad365e
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 27ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi //if (!((SL_MILLIBEL_MIN <= initialLevel) && (initialLevel <= 0))) { 28ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi // comparison (SL_MILLIBEL_MIN <= initialLevel) is always true due to range of SLmillibel 29ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi if (!(initialLevel <= 0)) { 30fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 31fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 32bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 33bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 34fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // is SLAndroidEffectSendItf on an AudioPlayer? 35bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ? 36bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten (CAudioPlayer *) thiz->mThis : NULL; 37fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap) { 38fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 39fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 40fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 41f51dba65751107c930759938775b75531ec1f330Glenn Kasten COutputMix *outputMix = CAudioPlayer_GetOutputMix(ap); 42ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // the initial send level set here is the total energy on the aux bus, 43ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // so it must take into account the player volume level 44ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi result = android_fxSend_attachToAux(ap, effectImplementationId, enable, 45ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi initialLevel + ap->mVolume.mLevel); 46f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (SL_RESULT_SUCCESS == result) { 47f51dba65751107c930759938775b75531ec1f330Glenn Kasten // there currently is support for only one send bus, so there is a single send 48f51dba65751107c930759938775b75531ec1f330Glenn Kasten // level and a single enable flag 49bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSendLevel = initialLevel; 50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnabled = enable; 51fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 52fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 53bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 54fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 55fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 56fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 57fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 58fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 59fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 60fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_IsEnabled(SLAndroidEffectSendItf self, 61fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLboolean *pEnable) 62fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 63fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 64fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 65fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == pEnable) { 66fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 67fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 68bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 69bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_shared(thiz); 70fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // there currently is support for only one send bus, so there is a single enable flag 71bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten SLboolean enable = thiz->mEnabled; 72bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_shared(thiz); 73fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi *pEnable = enable; 74fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 75fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 76fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 77fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 78fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 79fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 80fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 81fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_SetDirectLevel(SLAndroidEffectSendItf self, 82fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLmillibel directLevel) 83fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 84fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 85fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 86ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi //if (!((SL_MILLIBEL_MIN <= directLevel) && (directLevel <= 0))) { 87ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi // comparison (SL_MILLIBEL_MIN <= directLevel) is always true due to range of SLmillibel 88ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi if (!(directLevel <= 0)) { 89ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 90ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi } else { 91ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 92ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi interface_lock_exclusive(thiz); 93ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ? 94ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi (CAudioPlayer *) thiz->mThis : NULL; 95ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi if (NULL != ap) { 96ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi SLmillibel oldDirectLevel = ap->mDirectLevel; 97ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi if (oldDirectLevel != directLevel) { 98ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi ap->mDirectLevel = directLevel; 99ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi ap->mAmplFromDirectLevel = sles_to_android_amplification(directLevel); 100ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi interface_unlock_exclusive_attributes(thiz, ATTR_GAIN); 101ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi } else { 102ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi interface_unlock_exclusive(thiz); 103ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi } 104ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi result = SL_RESULT_SUCCESS; 105ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi } else { 106ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi interface_unlock_exclusive(thiz); 107ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 108ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 109ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi } 110ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi } 111fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 112fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 113fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 114fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 115fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 116fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_GetDirectLevel(SLAndroidEffectSendItf self, 117fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLmillibel *pDirectLevel) 118fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 119fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 120fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 121fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == pDirectLevel) { 122fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 123fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 124bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_peek(thiz); 126bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ? 127bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten (CAudioPlayer *) thiz->mThis : NULL; 128fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL != ap) { 129fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi *pDirectLevel = ap->mDirectLevel; 130fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_SUCCESS; 131fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 132fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 133fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 134fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 135bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_peek(thiz); 136fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 137fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 138fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 139fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 140fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 141fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 142fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_SetSendLevel(SLAndroidEffectSendItf self, 143fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLmillibel sendLevel) 144fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 145fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 146fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 147ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi //if (!((SL_MILLIBEL_MIN <= sendLevel) && (sendLevel <= 0))) { 148ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi // comparison (SL_MILLIBEL_MIN <= sendLevel) is always true due to range of SLmillibel 149ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi if (!(sendLevel <= 0)) { 150fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 151fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 152bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 154f51dba65751107c930759938775b75531ec1f330Glenn Kasten // is SLAndroidEffectSendItf on an AudioPlayer? 155bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ? 156bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten (CAudioPlayer *) thiz->mThis : NULL; 157f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (NULL == ap) { 158f51dba65751107c930759938775b75531ec1f330Glenn Kasten SL_LOGE("invalid interface: not attached to an AudioPlayer"); 159f51dba65751107c930759938775b75531ec1f330Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 160f51dba65751107c930759938775b75531ec1f330Glenn Kasten } else { 161f51dba65751107c930759938775b75531ec1f330Glenn Kasten COutputMix *outputMix = CAudioPlayer_GetOutputMix(ap); 162f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (android_genericFx_hasEffect(&outputMix->mAndroidEffect, effectImplementationId)) { 163ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // the send level set here is the total energy on the aux bus, so it must take 164ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi // into account the player volume level 165ca325fa86f9e52d8300490eee102a3c1188f6bdcJean-Michel Trivi result = android_fxSend_setSendLevel(ap, sendLevel + ap->mVolume.mLevel); 166f51dba65751107c930759938775b75531ec1f330Glenn Kasten } else { 167f51dba65751107c930759938775b75531ec1f330Glenn Kasten SL_LOGE("trying to send to an effect not on this AudioPlayer's OutputMix"); 168f51dba65751107c930759938775b75531ec1f330Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 169f51dba65751107c930759938775b75531ec1f330Glenn Kasten } 170f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (SL_RESULT_SUCCESS == result) { 171f51dba65751107c930759938775b75531ec1f330Glenn Kasten // there currently is support for only one send bus, so there is a single send 172f51dba65751107c930759938775b75531ec1f330Glenn Kasten // level 173bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSendLevel = sendLevel; 174f51dba65751107c930759938775b75531ec1f330Glenn Kasten } 175f51dba65751107c930759938775b75531ec1f330Glenn Kasten } 176bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 177fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 178fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 179fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 180fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 181fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 182fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 183fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic SLresult IAndroidEffectSend_GetSendLevel(SLAndroidEffectSendItf self, 184fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SLInterfaceID effectImplementationId, SLmillibel *pSendLevel) 185fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 186fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_ENTER_INTERFACE 187fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 188fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == pSendLevel) { 189fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 190fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 191bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 192bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_lock_exclusive(thiz); 193fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi // is SLAndroidEffectSendItf on an AudioPlayer? 194bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten CAudioPlayer *ap = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(thiz)) ? 195bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten (CAudioPlayer *) thiz->mThis : NULL; 196fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi if (NULL == ap) { 197fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LOGE("invalid interface: not attached to an AudioPlayer"); 198fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 199fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } else { 200f51dba65751107c930759938775b75531ec1f330Glenn Kasten COutputMix *outputMix = CAudioPlayer_GetOutputMix(ap); 201f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (android_genericFx_hasEffect(&outputMix->mAndroidEffect, effectImplementationId)) { 202f51dba65751107c930759938775b75531ec1f330Glenn Kasten result = SL_RESULT_SUCCESS; 203f51dba65751107c930759938775b75531ec1f330Glenn Kasten } else { 204f51dba65751107c930759938775b75531ec1f330Glenn Kasten SL_LOGE("trying to retrieve send level on an effect not on this AudioPlayer's \ 205fef6033d852daec8d88060b252e72f322724dca1Jean-Michel TriviOutputMix"); 206f51dba65751107c930759938775b75531ec1f330Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 207fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 208f51dba65751107c930759938775b75531ec1f330Glenn Kasten if (SL_RESULT_SUCCESS == result) { 209f51dba65751107c930759938775b75531ec1f330Glenn Kasten // there currently is support for only one send bus, so there is a single send 210f51dba65751107c930759938775b75531ec1f330Glenn Kasten // level 211bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten *pSendLevel = thiz->mSendLevel; 212fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 213fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 214bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten interface_unlock_exclusive(thiz); 215fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi } 216fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 217fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi SL_LEAVE_INTERFACE 218fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 219fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 220fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 221fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivistatic const struct SLAndroidEffectSendItf_ IAndroidEffectSend_Itf = { 222fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_EnableEffectSend, 223fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_IsEnabled, 224fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_SetDirectLevel, 225fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_GetDirectLevel, 226fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_SetSendLevel, 227fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi IAndroidEffectSend_GetSendLevel 228fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi}; 229fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi 230fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivivoid IAndroidEffectSend_init(void *self) 231fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi{ 232bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten IAndroidEffectSend *thiz = (IAndroidEffectSend *) self; 233bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mItf = &IAndroidEffectSend_Itf; 234bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mEnabled = SL_BOOLEAN_FALSE; 235bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten thiz->mSendLevel = SL_MILLIBEL_MIN; 236fef6033d852daec8d88060b252e72f322724dca1Jean-Michel Trivi} 237