1a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/*
2a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Copyright (C) 2010 The Android Open Source Project
3a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
4a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
5a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * you may not use this file except in compliance with the License.
6a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * You may obtain a copy of the License at
7a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
8a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
9a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten *
10a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * Unless required by applicable law or agreed to in writing, software
11a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
12a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * See the License for the specific language governing permissions and
14a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten * limitations under the License.
15a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten */
16a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
17a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten/* EnvironmentalReverb implementation */
18a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
19a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten#include "sles_allinclusive.h"
2063c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#ifdef ANDROID
21ea429ee1007c36ade812199ad365c0e659e8053fEric Laurent#include <audio_effects/effect_environmentalreverb.h>
2263c002ab68761be0eace98f28320d8eb2f3f7695Jean-Michel Trivi#endif
23a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
24a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// Note: all Set operations use exclusive not poke,
25a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// because SetEnvironmentalReverbProperties is exclusive.
26a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// It is safe for the Get operations to use peek,
27a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// on the assumption that the block copy will atomically
28a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten// replace each word of the block.
29a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
30ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
31faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
32f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi/**
33f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi * returns true if this interface is not associated with an initialized EnvironmentalReverb effect
34f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi */
35f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivistatic inline bool NO_ENVREVERB(IEnvironmentalReverb* ier) {
36f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    return (ier->mEnvironmentalReverbEffect == 0);
37f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi}
38f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
39f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
40f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
41d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEnvironmentalReverb_SetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel room)
42a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
43ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
44ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
45ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= room && room <= 0)) {
46ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= room) is always true due to range of SLmillibel
47ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    if (!(room <= 0)) {
48ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
49ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
50bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
51bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
52bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.roomLevel = room;
53faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
54ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
55f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
56bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
57f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
58f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
59bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
60f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_ROOM_LEVEL, &room);
61f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
62f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
63f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
64bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
65ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
66ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
67ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
68a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
69a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
70ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
71d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEnvironmentalReverb_GetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel *pRoom)
72a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
73ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
74ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
75ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pRoom) {
76ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
77ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
78bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
79b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
807d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
81ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
82f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
83bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
84f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
85f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
86bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
87bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_ROOM_LEVEL, &thiz->mProperties.roomLevel);
88f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
89f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
90f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
91bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pRoom = thiz->mProperties.roomLevel;
92f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
93b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
94f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
95ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
96ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
97ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
98a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
99a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
100ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
101a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetRoomHFLevel(
102a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillibel roomHF)
103a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
104ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
105ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
106ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= roomHF && roomHF <= 0)) {
107ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= roomHF) is always true due to range of SLmillibel
108ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    if (!(roomHF <= 0)) {
109ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
110ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
111bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
112bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
113bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.roomHFLevel = roomHF;
114faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
115ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
116f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
117bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
118f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
119f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
120bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
121f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_ROOM_HF_LEVEL, &roomHF);
122f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
123f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
124f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
125bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
126ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
127ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
128ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
129a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
130a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
131ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
132a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetRoomHFLevel(
133a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillibel *pRoomHF)
134a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
135ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
136ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
137ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pRoomHF) {
138ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
139ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
140bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
141b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
1427d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
143ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
144f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
145bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
146f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
147f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
148bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
149bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_ROOM_HF_LEVEL, &thiz->mProperties.roomHFLevel);
150f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
151f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
152f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
153bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pRoomHF = thiz->mProperties.roomHFLevel;
154f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
155b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
156ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
157ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
158ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
159a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
160a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
161ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
162a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDecayTime(
163a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond decayTime)
164a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
165ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
166ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
167ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(100 <= decayTime && decayTime <= 20000)) {
168ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
169ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
170bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
171bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
172bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.decayTime = decayTime;
1737d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
174ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
175f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
176bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
177f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
178f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
179bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
180f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_DECAY_TIME, &decayTime);
181f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
182f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
183f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
184bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
185ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
186ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
187ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
188a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
189a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
190ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
191a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDecayTime(
192a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond *pDecayTime)
193a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
194ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
195ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
196ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pDecayTime) {
197ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
198ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
199bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
200b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
2017d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
202ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
203f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
204bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
205f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
206f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
207bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
208bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_DECAY_TIME, &thiz->mProperties.decayTime);
209f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
210f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
211f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
212bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pDecayTime = thiz->mProperties.decayTime;
213f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
214b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
215ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
216ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
217ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
218a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
219a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
220ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
221a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDecayHFRatio(
222a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLpermille decayHFRatio)
223a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
224ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
225ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
226ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(100 <= decayHFRatio && decayHFRatio <= 2000)) {
227ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
228ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
229bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
230bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
231bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.decayHFRatio = decayHFRatio;
232faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
233ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
234f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
235bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
236f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
237f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
238bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
239f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_DECAY_HF_RATIO, &decayHFRatio);
240f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
241f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
242f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
243bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
244ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
245ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
246ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
247a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
248a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
249ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
250a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDecayHFRatio(
251a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLpermille *pDecayHFRatio)
252a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
253ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
254ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
255ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pDecayHFRatio) {
256ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
257ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
258bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
259b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
2607d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
261ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
262f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
263bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
264f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
265f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
266bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
267bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_DECAY_HF_RATIO, &thiz->mProperties.decayHFRatio);
268f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
269f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
270f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
271bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pDecayHFRatio = thiz->mProperties.decayHFRatio;
272f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
273b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
274ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
275ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
276ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
277a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
278a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
279ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
280a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReflectionsLevel(
281a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillibel reflectionsLevel)
282a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
283ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
284ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
285ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= reflectionsLevel && reflectionsLevel <= 1000)) {
286ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= reflectionsLevel) is always true due to range of SLmillibel
287ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    if (!(reflectionsLevel <= 1000)) {
288ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
289ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
290bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
291bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
292bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.reflectionsLevel = reflectionsLevel;
293faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
294ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
295f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
296bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
297f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
298f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
299bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
300f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_REFLECTIONS_LEVEL, &reflectionsLevel);
301f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
302f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
303f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
304bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
305ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
306ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
307ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
308a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
309a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
310ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
311a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReflectionsLevel(
312a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillibel *pReflectionsLevel)
313a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
314ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
315ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
316ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pReflectionsLevel) {
317ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
318ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
319bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
320b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
3217d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
322ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
323f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
324bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
325f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
326f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
327bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
328bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_REFLECTIONS_LEVEL, &thiz->mProperties.reflectionsLevel);
329f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
330f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
331f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
332bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pReflectionsLevel = thiz->mProperties.reflectionsLevel;
333f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
334b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
335ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
336ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
337ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
338a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
339a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
340ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
341a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReflectionsDelay(
342a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond reflectionsDelay)
343a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
344ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
345ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
346ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(/* 0 <= reflectionsDelay && */ reflectionsDelay <= 300)) {
347ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
348ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
349bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
350bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
351bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.reflectionsDelay = reflectionsDelay;
352faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
353ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
354f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
355bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
356f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
357f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
358bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
359f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_REFLECTIONS_DELAY, &reflectionsDelay);
360f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
361f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
362f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
363bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
364ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
365ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
366ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
367a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
368a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
369ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
370a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReflectionsDelay(
371a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond *pReflectionsDelay)
372a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
373ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
374ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
375ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pReflectionsDelay) {
376ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
377ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
378bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
379b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
3807d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
381ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
382f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
383bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
384f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
385f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
386bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
387bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_REFLECTIONS_DELAY, &thiz->mProperties.reflectionsDelay);
388f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
389f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
390f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
391bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pReflectionsDelay = thiz->mProperties.reflectionsDelay;
392f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
393b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
394ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
395ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
396ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
397a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
398a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
399ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
400a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReverbLevel(
401a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillibel reverbLevel)
402a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
403ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
404ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
405ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= reverbLevel && reverbLevel <= 2000)) {
406ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= reverbLevel) is always true due to range of SLmillibel
407ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    if (!(reverbLevel <= 2000)) {
408ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
409ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
410bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
411bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
412bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.reverbLevel = reverbLevel;
413faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
414ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
415f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
416bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
417f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
418f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
419bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
420f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_REVERB_LEVEL, &reverbLevel);
421f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
422f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
423f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
424bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
425ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
426ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
427ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
428a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
429a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
430ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
431a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReverbLevel(
432a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillibel *pReverbLevel)
433a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
434ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
435ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
436ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pReverbLevel) {
437ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
438ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
439bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
440b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
4417d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
442ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
443f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
444bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
445f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
446f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
447bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
448bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_REVERB_LEVEL, &thiz->mProperties.reverbLevel);
449f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
450f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
451f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
452bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pReverbLevel = thiz->mProperties.reverbLevel;
453f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
454b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
455ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
456ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
457ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
458a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
459a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
460ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
461a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetReverbDelay(
462a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond reverbDelay)
463a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
464ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
465ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
466ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(/* 0 <= reverbDelay && */ reverbDelay <= 100)) {
467ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
468ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
469bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
470bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
471bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.reverbDelay = reverbDelay;
472faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
473ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
474f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
475bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
476f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
477f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
478bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
479f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_REVERB_DELAY, &reverbDelay);
480f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
481f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
482f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
483bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
484ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
485ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
486ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
487a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
488a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
489ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
490a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetReverbDelay(
491a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond *pReverbDelay)
492a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
493ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
494ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
495ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pReverbDelay) {
496ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
497ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
498bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
499b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
5007d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
501ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
502f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
503bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
504f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
505f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
506bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
507bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_REVERB_DELAY, &thiz->mProperties.reverbDelay);
508f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
509f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
510f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
511bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pReverbDelay = thiz->mProperties.reverbDelay;
512f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
513b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
514ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
515ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
516ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
517a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
518a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
519ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
520a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDiffusion(
521a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLpermille diffusion)
522a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
523ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
524ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
525ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(0 <= diffusion && diffusion <= 1000)) {
526ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
527ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
528bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
529bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
530bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties.diffusion = diffusion;
531faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
532ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
533f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
534bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
535f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
536f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
537bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
538f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_DIFFUSION, &diffusion);
539f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
540f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
541f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
542bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
543ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
544ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
545ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
546a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
547a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
548ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
549a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDiffusion(SLEnvironmentalReverbItf self,
550a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten     SLpermille *pDiffusion)
551a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
552ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
553ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
554ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pDiffusion) {
555ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
556ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
557bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
558b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
5597d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
560ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
561f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
562bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
563f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
564f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
565bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
566bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_DIFFUSION, &thiz->mProperties.diffusion);
567f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
568f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
569f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
570bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pDiffusion = thiz->mProperties.diffusion;
571f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
572b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
573ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
574ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
575ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
576a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
577a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
578ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
579a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_SetDensity(SLEnvironmentalReverbItf self,
580a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLpermille density)
581a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
582ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
583ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
584ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (!(0 <= density && density <= 1000)) {
585ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
586ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
587bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
588bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
5898a9cb417dff7359e6665c76e85af01d8527ecbd2Glenn Kasten        thiz->mProperties.density = density;
590faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
591f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        result = SL_RESULT_SUCCESS;
592f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
593bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
594f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
595f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
596bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
597f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_DENSITY, &density);
598f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
599f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
600f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
601bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
602ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
603ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
604ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
605a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
606a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
607ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
608a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetDensity(SLEnvironmentalReverbItf self,
609a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLpermille *pDensity)
610a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
611ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
612ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
613ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pDensity) {
614ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
615ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
616bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
617b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_lock_shared(thiz);
6187d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
619ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
620f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
621bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
622f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
623f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
624bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
625bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_DENSITY, &thiz->mProperties.density);
626f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
627f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
628f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
629bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pDensity = thiz->mProperties.density;
630f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
631b566926611b2105a46c4ff98238ad06aca54104dGlenn Kasten        interface_unlock_shared(thiz);
632ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
633ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
634ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
635a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
636a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
637ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
638d2a7f0d6883a6d3835642e7b282f05ed1c54fe63Glenn Kastenstatic SLresult IEnvironmentalReverb_SetEnvironmentalReverbProperties(SLEnvironmentalReverbItf self,
639a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    const SLEnvironmentalReverbSettings *pProperties)
640a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
641ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
642ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
643ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    // note that it's unnecessary to verify that any level stored inside the "properties" struct
644ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi    //  is >= SL_MILLIBEL_MIN before using it, due to range of SLmillibel
645ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi
646ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    result = SL_RESULT_PARAMETER_INVALID;
647ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    do {
648ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (NULL == pProperties)
649ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
650ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        SLEnvironmentalReverbSettings properties = *pProperties;
651ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi        if (!(properties.roomLevel <= 0))
652ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
653ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi        if (!(properties.roomHFLevel <= 0))
654ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
655ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(100 <= properties.decayTime && properties.decayTime <= 20000))
656ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
657ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(100 <= properties.decayHFRatio && properties.decayHFRatio <= 2000))
658ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
659ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi        if (!(properties.reflectionsLevel <= 1000))
660ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
661ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(/* 0 <= properties.reflectionsDelay && */ properties.reflectionsDelay <= 300))
662ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
663ad79bbfd16ba81a45842179178332fbd06ad365eJean-Michel Trivi        if (!(properties.reverbLevel <= 2000))
664ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
665ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(/* 0 <= properties.reverbDelay && */ properties.reverbDelay <= 100))
666ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
667ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(0 <= properties.diffusion && properties.diffusion <= 1000))
668ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
669ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        if (!(0 <= properties.density && properties.density <= 1000))
670ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten            break;
671bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
672bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_exclusive(thiz);
673bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        thiz->mProperties = properties;
674faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if !defined(ANDROID)
675ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
676f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
677bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
678f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
679f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
680bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
681f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                    REVERB_PARAM_PROPERTIES, &properties);
682f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
683f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
684f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
685bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_exclusive(thiz);
686ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } while (0);
687ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
688ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
689a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
690a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
691ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
692a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic SLresult IEnvironmentalReverb_GetEnvironmentalReverbProperties(
693a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SLEnvironmentalReverbItf self, SLEnvironmentalReverbSettings *pProperties)
694a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
695ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_ENTER_INTERFACE
696ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
697ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    if (NULL == pProperties) {
698ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
699ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    } else {
700bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
701bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_lock_shared(thiz);
7027d77f0aed328363b188d2caa829bb836ba1abcc8Glenn Kasten#if 1 // !defined(ANDROID)
703ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten        result = SL_RESULT_SUCCESS;
704f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#else
705bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        if (NO_ENVREVERB(thiz)) {
706f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
707f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        } else {
708bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
709bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten                    REVERB_PARAM_PROPERTIES, &thiz->mProperties);
710f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            result = android_fx_statusToResult(status);
711f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        }
712f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
713bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        *pProperties = thiz->mProperties;
714f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
715bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten        interface_unlock_shared(thiz);
716ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    }
717ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
718ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten    SL_LEAVE_INTERFACE
719a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
720a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
721ed46c29d6a09112dbbf584c82953f63289596fd6Glenn Kasten
722a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const struct SLEnvironmentalReverbItf_ IEnvironmentalReverb_Itf = {
723a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetRoomLevel,
724a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetRoomLevel,
725a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetRoomHFLevel,
726a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetRoomHFLevel,
727a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetDecayTime,
728a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetDecayTime,
729a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetDecayHFRatio,
730a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetDecayHFRatio,
731a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetReflectionsLevel,
732a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetReflectionsLevel,
733a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetReflectionsDelay,
734a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetReflectionsDelay,
735a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetReverbLevel,
736a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetReverbLevel,
737a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetReverbDelay,
738a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetReverbDelay,
739a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetDiffusion,
740a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetDiffusion,
741a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetDensity,
742a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetDensity,
743a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_SetEnvironmentalReverbProperties,
744a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    IEnvironmentalReverb_GetEnvironmentalReverbProperties
745a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
746a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
747a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenstatic const SLEnvironmentalReverbSettings IEnvironmentalReverb_default = {
748a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_MILLIBEL_MIN, // roomLevel
749a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    0,               // roomHFLevel
750a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    1000,            // decayTime
751a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    500,             // decayHFRatio
752a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_MILLIBEL_MIN, // reflectionsLevel
753a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    20,              // reflectionsDelay
754a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    SL_MILLIBEL_MIN, // reverbLevel
755a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    40,              // reverbDelay
756a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    1000,            // diffusion
757a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten    1000             // density
758a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten};
759a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten
760a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kastenvoid IEnvironmentalReverb_init(void *self)
761a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten{
762bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
763bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mItf = &IEnvironmentalReverb_Itf;
764bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mProperties = IEnvironmentalReverb_default;
765faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
766bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    memset(&thiz->mEnvironmentalReverbDescriptor, 0, sizeof(effect_descriptor_t));
767a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // placement new (explicit constructor)
768bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    (void) new (&thiz->mEnvironmentalReverbEffect) android::sp<android::AudioEffect>();
769a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
770a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
771f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
772a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenvoid IEnvironmentalReverb_deinit(void *self)
773a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
774faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
775bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
776a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    // explicit destructor
777bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    thiz->mEnvironmentalReverbEffect.~sp();
778a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten#endif
779a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten}
780a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten
781a9a70a4451545034c9263dd55b181f2912534c37Glenn Kastenbool IEnvironmentalReverb_Expose(void *self)
782a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten{
783faf90312d2156acbf27c62e114fd180708aa7654Glenn Kasten#if defined(ANDROID)
784bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten    IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
785f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    if (!android_fx_initEffectDescriptor(SL_IID_ENVIRONMENTALREVERB,
786bcc5c7225e3b7a1dbf2e9e830987f69167acf06fGlenn Kasten            &thiz->mEnvironmentalReverbDescriptor)) {
787f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        SL_LOGE("EnvironmentalReverb initialization failed.");
788a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten        return false;
789f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    }
790f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi#endif
791a9a70a4451545034c9263dd55b181f2912534c37Glenn Kasten    return true;
792a6d984c32855a239f7f79a3d3b7f2ddfb8cb9697Glenn Kasten}
793