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