IEffectSend.cpp revision 343c522ebf4f9c321eef8c3b3b2945f1c1cb8846
161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* 261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Copyright (C) 2010 The Android Open Source Project 361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * you may not use this file except in compliance with the License. 661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * You may obtain a copy of the License at 761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * 1061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * Unless required by applicable law or agreed to in writing, software 1161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 1261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * See the License for the specific language governing permissions and 1461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten * limitations under the License. 1561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten */ 1661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten/* EffectSend implementation */ 1861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 1961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten#include "sles_allinclusive.h" 2061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 21343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten 22343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten/** \brief Maps AUX index to OutputMix interface index */ 23510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 24510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kastenstatic const unsigned char AUX_to_MPH[AUX_MAX] = { 25510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten MPH_ENVIRONMENTALREVERB, 26510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten MPH_PRESETREVERB 27510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten}; 28510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten 29343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten 30343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten/** \brief Private function that validates the effect interface specified by the application */ 31343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten 32d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic struct EnableLevel *getEnableLevel(IEffectSend *this, const void *pAuxEffect) 3361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 34343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten // Make sure this effect send is on an audio player, not a MIDI player 35343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten CAudioPlayer *audioPlayer = (SL_OBJECTID_AUDIOPLAYER == InterfaceToObjectID(this)) ? 36343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten (CAudioPlayer *) this->mThis : NULL; 37343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten if (NULL == audioPlayer) 38343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten return NULL; 3961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten // Make sure the sink for this player is an output mix 40343c522ebf4f9c321eef8c3b3b2945f1c1cb8846Glenn Kasten COutputMix *outputMix = audioPlayer->mOutputMix; 4161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten if (NULL == outputMix) 4261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return NULL; 43510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten unsigned aux; 44510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten if (pAuxEffect == &outputMix->mEnvironmentalReverb.mItf) 45510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten aux = AUX_ENVIRONMENTALREVERB; 46510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten else if (pAuxEffect == &outputMix->mPresetReverb.mItf) 47510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten aux = AUX_PRESETREVERB; 48510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten else 49510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten return NULL; 50510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten assert(aux < AUX_MAX); 51510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten // App couldn't have an interface for effect without exposure 52510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten int index = MPH_to_OutputMix[AUX_to_MPH[aux]]; 53510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten if (0 > index) 54510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten return NULL; 55510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten unsigned mask = 1 << index; 56510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten object_lock_shared(&outputMix->mObject); 57510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten SLuint32 state = outputMix->mObject.mInterfaceStates[index]; 58510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten mask &= outputMix->mObject.mGottenMask; 59510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten object_unlock_shared(&outputMix->mObject); 60510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten switch (state) { 61510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten case INTERFACE_EXPOSED: 62510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten case INTERFACE_ADDED: 63510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten case INTERFACE_SUSPENDED: 64510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten case INTERFACE_SUSPENDING: 65510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten case INTERFACE_RESUMING_1: 66510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten case INTERFACE_RESUMING_2: 67510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten if (mask) 68510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten return &this->mEnableLevels[aux]; 69510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten break; 70510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten default: 71510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten break; 72510f3671f716f6835282e4b0fd0275c20e9dadd8Glenn Kasten } 7361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten return NULL; 7461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 7561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 7761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_EnableEffectSend(SLEffectSendItf self, 7861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten const void *pAuxEffect, SLboolean enable, SLmillibel initialLevel) 7961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 80ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 82ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((SL_MILLIBEL_MIN <= initialLevel) && (initialLevel <= 0))) { 83ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 84ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 85ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEffectSend *this = (IEffectSend *) self; 86ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect); 87ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == enableLevel) { 88ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 89ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 90ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 91ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten enableLevel->mEnable = SL_BOOLEAN_FALSE != enable; // normalize 92ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten enableLevel->mSendLevel = initialLevel; 93ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive(this); 94ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 98ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 9961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 10061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 101ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 10261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic SLresult IEffectSend_IsEnabled(SLEffectSendItf self, 10361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten const void *pAuxEffect, SLboolean *pEnable) 10461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 106ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 107ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pEnable) { 108ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEffectSend *this = (IEffectSend *) self; 111ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect); 112ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == enableLevel) { 113ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 114ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 116ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLboolean enable = enableLevel->mEnable; 117ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 118ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pEnable = enable; 119ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 120ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 121ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 122ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 123ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 12461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 12561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 127d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEffectSend_SetDirectLevel(SLEffectSendItf self, SLmillibel directLevel) 12861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 129ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 130ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((SL_MILLIBEL_MIN <= directLevel) && (directLevel <= 0))) { 132ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 133ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 134ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEffectSend *this = (IEffectSend *) self; 135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_poke(this); 136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten this->mDirectLevel = directLevel; 137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_poke(this); 138ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 140ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 141ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 14261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 14361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 144ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 145d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEffectSend_GetDirectLevel(SLEffectSendItf self, SLmillibel *pDirectLevel) 14661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 147ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 148ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 149ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pDirectLevel) { 150ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 151ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 152ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEffectSend *this = (IEffectSend *) self; 153ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 154ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLmillibel directLevel = this->mDirectLevel; 155ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pDirectLevel = directLevel; 157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 159ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 160ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 16161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 16261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 163ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 164e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IEffectSend_SetSendLevel(SLEffectSendItf self, const void *pAuxEffect, 165e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillibel sendLevel) 16661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (!((SL_MILLIBEL_MIN <= sendLevel) && (sendLevel <= 0))) { 170ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 171ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 172ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEffectSend *this = (IEffectSend *) self; 173ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect); 174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == enableLevel) { 175ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 176ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 177ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten // EnableEffectSend is exclusive, so this has to be also 178ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_exclusive(this); 179ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten enableLevel->mSendLevel = sendLevel; 180ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_exclusive(this); 181ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 182ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 183ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 184ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 18661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 18761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 188ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 189e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kastenstatic SLresult IEffectSend_GetSendLevel(SLEffectSendItf self, const void *pAuxEffect, 190e5bf0d2c9531a7064eb3ddcafaf93ac1b0974037Glenn Kasten SLmillibel *pSendLevel) 19161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 192ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_ENTER_INTERFACE 193ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 194ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == pSendLevel) { 195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 196ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 197ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten IEffectSend *this = (IEffectSend *) self; 198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten struct EnableLevel *enableLevel = getEnableLevel(this, pAuxEffect); 199ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten if (NULL == enableLevel) { 200ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_PARAMETER_INVALID; 201ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } else { 202ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_lock_peek(this); 203ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SLmillibel sendLevel = enableLevel->mSendLevel; 204ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten interface_unlock_peek(this); 205ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten *pSendLevel = sendLevel; 206ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten result = SL_RESULT_SUCCESS; 207ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 208ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten } 209ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 210ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten SL_LEAVE_INTERFACE 21161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 21261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 213ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten 21461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenstatic const struct SLEffectSendItf_ IEffectSend_Itf = { 21561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend_EnableEffectSend, 21661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend_IsEnabled, 21761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend_SetDirectLevel, 21861ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend_GetDirectLevel, 21961ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend_SetSendLevel, 22061ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend_GetSendLevel 22161ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten}; 22261ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten 22361ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kastenvoid IEffectSend_init(void *self) 22461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten{ 22561ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten IEffectSend *this = (IEffectSend *) self; 22661ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mItf = &IEffectSend_Itf; 22761ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten this->mDirectLevel = 0; 2286a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten struct EnableLevel *enableLevel = this->mEnableLevels; 2296a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten unsigned aux; 2306a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten for (aux = 0; aux < AUX_MAX; ++aux, ++enableLevel) { 2316a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten enableLevel->mEnable = SL_BOOLEAN_FALSE; 2326a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten enableLevel->mSendLevel = SL_MILLIBEL_MIN; 2336a357b8fa57b0bc1557cd5ab9f9fb86aabaaa18cGlenn Kasten } 23461ac0ade16f84d877dfd8d0e984eb203d4a2901dGlenn Kasten} 235