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