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