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