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