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