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