182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/*
282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Copyright (C) 2010 The Android Open Source Project
382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *
482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License");
582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * you may not use this file except in compliance with the License.
682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * You may obtain a copy of the License at
782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *
882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *      http://www.apache.org/licenses/LICENSE-2.0
982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten *
1082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * Unless required by applicable law or agreed to in writing, software
1182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS,
1282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * See the License for the specific language governing permissions and
1482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten * limitations under the License.
1582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten */
1682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
1782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten/* EnvironmentalReverb implementation */
1882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
1982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten#include "sles_allinclusive.h"
2062b90b5c5b8495c12900c5d759fa341319e661b3Jean-Michel Trivi#ifdef ANDROID
2196309256bf532b3ce5ad706d7eb60b1dd70bf4b3Eric Laurent#include <audio_effects/effect_environmentalreverb.h>
2262b90b5c5b8495c12900c5d759fa341319e661b3Jean-Michel Trivi#endif
2382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
2482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten// Note: all Set operations use exclusive not poke,
2582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten// because SetEnvironmentalReverbProperties is exclusive.
2682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten// It is safe for the Get operations to use peek,
2782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten// on the assumption that the block copy will atomically
2882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten// replace each word of the block.
2982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
30f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
310b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID)
32dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi/**
33dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi * returns true if this interface is not associated with an initialized EnvironmentalReverb effect
34dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi */
35dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivistatic inline bool NO_ENVREVERB(IEnvironmentalReverb* ier) {
36dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi    return (ier->mEnvironmentalReverbEffect == 0);
37dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi}
38dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
39dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
40dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
41437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IEnvironmentalReverb_SetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel room)
4282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
43f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
44f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
45a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= room && room <= 0)) {
46a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= room) is always true due to range of SLmillibel
47a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    if (!(room <= 0)) {
48f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
49f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
5050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
5150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
5250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.roomLevel = room;
530b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
54f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
55dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
5650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
57dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
58dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
5950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
60dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_ROOM_LEVEL, &room);
61dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
62dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
63dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
6450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
65f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
66f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
67f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
6882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
6982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
70f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
71437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IEnvironmentalReverb_GetRoomLevel(SLEnvironmentalReverbItf self, SLmillibel *pRoom)
7282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
73f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
74f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
75f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pRoom) {
76f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
77f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
7850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
7949b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
800b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
81f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
82dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
8350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
84dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
85dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
8650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
8750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_ROOM_LEVEL, &thiz->mProperties.roomLevel);
88dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
89dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
90dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
9150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pRoom = thiz->mProperties.roomLevel;
92dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
9349b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
94dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
95f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
96f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
97f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
9882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
9982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
100f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
10182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetRoomHFLevel(
10282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillibel roomHF)
10382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
104f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
105f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
106a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= roomHF && roomHF <= 0)) {
107a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= roomHF) is always true due to range of SLmillibel
108a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    if (!(roomHF <= 0)) {
109f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
110f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
11150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
11250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
11350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.roomHFLevel = roomHF;
1140b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
115f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
116dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
11750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
118dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
119dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
12050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
121dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_ROOM_HF_LEVEL, &roomHF);
122dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
123dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
124dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
12550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
126f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
127f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
128f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
12982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
13082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
131f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
13282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetRoomHFLevel(
13382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillibel *pRoomHF)
13482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
135f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
136f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
137f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pRoomHF) {
138f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
139f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
14050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
14149b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
1420b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
143f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
144dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
14550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
146dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
147dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
14850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
14950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_ROOM_HF_LEVEL, &thiz->mProperties.roomHFLevel);
150dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
151dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
152dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
15350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pRoomHF = thiz->mProperties.roomHFLevel;
154dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
15549b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
156f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
157f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
158f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
15982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
16082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
161f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
16282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetDecayTime(
16382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond decayTime)
16482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
165f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
166f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
167f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(100 <= decayTime && decayTime <= 20000)) {
168f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
169f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
17050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
17150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
17250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.decayTime = decayTime;
1730b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
174f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
175dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
17650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
177dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
178dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
17950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
180dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_DECAY_TIME, &decayTime);
181dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
182dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
183dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
18450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
185f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
186f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
187f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
18882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
18982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
190f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
19182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetDecayTime(
19282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond *pDecayTime)
19382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
194f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
195f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
196f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pDecayTime) {
197f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
198f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
19950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
20049b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
2010b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
202f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
203dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
20450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
205dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
206dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
20750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
20850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_DECAY_TIME, &thiz->mProperties.decayTime);
209dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
210dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
211dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
21250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pDecayTime = thiz->mProperties.decayTime;
213dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
21449b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
215f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
216f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
217f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
21882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
21982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
220f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
22182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetDecayHFRatio(
22282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLpermille decayHFRatio)
22382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
224f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
225f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
226f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(100 <= decayHFRatio && decayHFRatio <= 2000)) {
227f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
228f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
22950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
23050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
23150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.decayHFRatio = decayHFRatio;
2320b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
233f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
234dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
23550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
236dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
237dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
23850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
239dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_DECAY_HF_RATIO, &decayHFRatio);
240dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
241dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
242dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
24350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
244f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
245f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
246f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
24782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
24882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
249f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
25082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetDecayHFRatio(
25182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLpermille *pDecayHFRatio)
25282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
253f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
254f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
255f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pDecayHFRatio) {
256f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
257f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
25850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
25949b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
2600b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
261f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
262dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
26350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
264dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
265dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
26650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
26750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_DECAY_HF_RATIO, &thiz->mProperties.decayHFRatio);
268dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
269dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
270dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
27150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pDecayHFRatio = thiz->mProperties.decayHFRatio;
272dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
27349b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
274f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
275f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
276f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
27782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
27882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
279f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
28082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetReflectionsLevel(
28182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillibel reflectionsLevel)
28282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
283f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
284f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
285a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= reflectionsLevel && reflectionsLevel <= 1000)) {
286a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= reflectionsLevel) is always true due to range of SLmillibel
287a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    if (!(reflectionsLevel <= 1000)) {
288f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
289f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
29050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
29150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
29250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.reflectionsLevel = reflectionsLevel;
2930b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
294f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
295dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
29650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
297dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
298dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
29950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
300dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_REFLECTIONS_LEVEL, &reflectionsLevel);
301dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
302dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
303dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
30450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
305f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
306f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
307f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
30882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
30982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
310f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
31182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetReflectionsLevel(
31282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillibel *pReflectionsLevel)
31382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
314f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
315f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
316f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pReflectionsLevel) {
317f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
318f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
31950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
32049b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
3210b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
322f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
323dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
32450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
325dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
326dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
32750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
32850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_REFLECTIONS_LEVEL, &thiz->mProperties.reflectionsLevel);
329dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
330dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
331dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
33250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pReflectionsLevel = thiz->mProperties.reflectionsLevel;
333dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
33449b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
335f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
336f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
337f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
33882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
33982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
340f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
34182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetReflectionsDelay(
34282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond reflectionsDelay)
34382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
344f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
345f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
346f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(/* 0 <= reflectionsDelay && */ reflectionsDelay <= 300)) {
347f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
348f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
34950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
35050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
35150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.reflectionsDelay = reflectionsDelay;
3520b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
353f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
354dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
35550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
356dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
357dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
35850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
359dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_REFLECTIONS_DELAY, &reflectionsDelay);
360dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
361dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
362dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
36350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
364f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
365f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
366f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
36782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
36882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
369f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
37082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetReflectionsDelay(
37182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond *pReflectionsDelay)
37282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
373f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
374f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
375f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pReflectionsDelay) {
376f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
377f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
37850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
37949b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
3800b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
381f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
382dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
38350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
384dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
385dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
38650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
38750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_REFLECTIONS_DELAY, &thiz->mProperties.reflectionsDelay);
388dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
389dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
390dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
39150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pReflectionsDelay = thiz->mProperties.reflectionsDelay;
392dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
39349b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
394f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
395f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
396f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
39782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
39882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
399f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
40082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetReverbLevel(
40182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillibel reverbLevel)
40282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
403f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
404f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
405a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    //if (!(SL_MILLIBEL_MIN <= reverbLevel && reverbLevel <= 2000)) {
406a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    // comparison (SL_MILLIBEL_MIN <= reverbLevel) is always true due to range of SLmillibel
407a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    if (!(reverbLevel <= 2000)) {
408f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
409f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
41050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
41150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
41250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.reverbLevel = reverbLevel;
4130b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
414f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
415dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
41650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
417dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
418dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
41950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
420dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_REVERB_LEVEL, &reverbLevel);
421dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
422dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
423dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
42450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
425f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
426f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
427f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
42882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
42982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
430f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
43182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetReverbLevel(
43282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillibel *pReverbLevel)
43382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
434f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
435f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
436f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pReverbLevel) {
437f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
438f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
43950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
44049b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
4410b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
442f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
443dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
44450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
445dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
446dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
44750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
44850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_REVERB_LEVEL, &thiz->mProperties.reverbLevel);
449dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
450dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
451dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
45250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pReverbLevel = thiz->mProperties.reverbLevel;
453dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
45449b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
455f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
456f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
457f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
45882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
45982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
460f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
46182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetReverbDelay(
46282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond reverbDelay)
46382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
464f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
465f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
466f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(/* 0 <= reverbDelay && */ reverbDelay <= 100)) {
467f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
468f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
46950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
47050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
47150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.reverbDelay = reverbDelay;
4720b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
473f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
474dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
47550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
476dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
477dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
47850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
479dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_REVERB_DELAY, &reverbDelay);
480dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
481dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
482dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
48350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
484f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
485f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
486f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
48782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
48882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
489f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
49082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetReverbDelay(
49182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLmillisecond *pReverbDelay)
49282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
493f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
494f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
495f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pReverbDelay) {
496f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
497f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
49850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
49949b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
5000b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
501f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
502dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
50350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
504dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
505dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
50650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
50750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_REVERB_DELAY, &thiz->mProperties.reverbDelay);
508dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
509dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
510dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
51150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pReverbDelay = thiz->mProperties.reverbDelay;
512dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
51349b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
514f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
515f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
516f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
51782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
51882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
519f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
52082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetDiffusion(
52182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLpermille diffusion)
52282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
523f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
524f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
525f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(0 <= diffusion && diffusion <= 1000)) {
526f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
527f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
52850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
52950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
53050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties.diffusion = diffusion;
5310b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
532f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
533dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
53450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
535dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
536dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
53750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
538dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_DIFFUSION, &diffusion);
539dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
540dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
541dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
54250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
543f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
544f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
545f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
54682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
54782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
548f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
54982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetDiffusion(SLEnvironmentalReverbItf self,
55082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten     SLpermille *pDiffusion)
55182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
552f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
553f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
554f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pDiffusion) {
555f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
556f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
55750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
55849b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
5590b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
560f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
561dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
56250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
563dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
564dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
56550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
56650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_DIFFUSION, &thiz->mProperties.diffusion);
567dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
568dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
569dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
57050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pDiffusion = thiz->mProperties.diffusion;
571dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
57249b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
573f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
574f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
575f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
57682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
57782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
578f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
57982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_SetDensity(SLEnvironmentalReverbItf self,
58082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLpermille density)
58182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
582f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
583f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
584f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (!(0 <= density && density <= 1000)) {
585f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
586f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
58750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
58850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
589f280d9aebcc747d7bce039a6afc6bf83cd37986dGlenn Kasten        thiz->mProperties.density = density;
5900b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
591dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        result = SL_RESULT_SUCCESS;
592dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
59350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
594dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
595dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
59650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
597dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_DENSITY, &density);
598dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
599dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
600dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
60150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
602f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
603f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
604f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
60582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
60682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
607f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
60882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetDensity(SLEnvironmentalReverbItf self,
60982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLpermille *pDensity)
61082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
611f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
612f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
613f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pDensity) {
614f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
615f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
61650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
61749b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_lock_shared(thiz);
6180b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
619f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
620dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
62150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
622dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
623dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
62450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
62550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_DENSITY, &thiz->mProperties.density);
626dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
627dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
628dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
62950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pDensity = thiz->mProperties.density;
630dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
63149b757f033c398a9a5917fa9677a7075c4c85d93Glenn Kasten        interface_unlock_shared(thiz);
632f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
633f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
634f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
63582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
63682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
637f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
638437f9ab9914ea61112aa496a047162a0d22194cdGlenn Kastenstatic SLresult IEnvironmentalReverb_SetEnvironmentalReverbProperties(SLEnvironmentalReverbItf self,
63982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    const SLEnvironmentalReverbSettings *pProperties)
64082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
641f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
642f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
643a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    // note that it's unnecessary to verify that any level stored inside the "properties" struct
644a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi    //  is >= SL_MILLIBEL_MIN before using it, due to range of SLmillibel
645a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi
646f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    result = SL_RESULT_PARAMETER_INVALID;
647f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    do {
648f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (NULL == pProperties)
649f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
650f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        SLEnvironmentalReverbSettings properties = *pProperties;
651a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi        if (!(properties.roomLevel <= 0))
652f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
653a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi        if (!(properties.roomHFLevel <= 0))
654f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
655f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (!(100 <= properties.decayTime && properties.decayTime <= 20000))
656f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
657f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (!(100 <= properties.decayHFRatio && properties.decayHFRatio <= 2000))
658f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
659a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi        if (!(properties.reflectionsLevel <= 1000))
660f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
661f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (!(/* 0 <= properties.reflectionsDelay && */ properties.reflectionsDelay <= 300))
662f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
663a49076b1d6f829322021ac4eb4dc751b4670cdc2Jean-Michel Trivi        if (!(properties.reverbLevel <= 2000))
664f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
665f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (!(/* 0 <= properties.reverbDelay && */ properties.reverbDelay <= 100))
666f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
667f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (!(0 <= properties.diffusion && properties.diffusion <= 1000))
668f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
669f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        if (!(0 <= properties.density && properties.density <= 1000))
670f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten            break;
67150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
67250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_exclusive(thiz);
67350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        thiz->mProperties = properties;
6740b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
675f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
676dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
67750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
678dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
679dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
68050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_setParam(thiz->mEnvironmentalReverbEffect,
681dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi                    REVERB_PARAM_PROPERTIES, &properties);
682dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
683dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
684dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
68550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_exclusive(thiz);
686f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } while (0);
687f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
688f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
68982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
69082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
691f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
69282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic SLresult IEnvironmentalReverb_GetEnvironmentalReverbProperties(
69382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SLEnvironmentalReverbItf self, SLEnvironmentalReverbSettings *pProperties)
69482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
695f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_ENTER_INTERFACE
696f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
697f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    if (NULL == pProperties) {
698f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_PARAMETER_INVALID;
699f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    } else {
70050bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
70150bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_lock_shared(thiz);
7020b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if !defined(ANDROID)
703f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten        result = SL_RESULT_SUCCESS;
704dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#else
70550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        if (NO_ENVREVERB(thiz)) {
706dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = SL_RESULT_CONTROL_LOST;
707dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        } else {
70850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            android::status_t status = android_erev_getParam(thiz->mEnvironmentalReverbEffect,
70950bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten                    REVERB_PARAM_PROPERTIES, &thiz->mProperties);
710dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi            result = android_fx_statusToResult(status);
711dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        }
712dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
71350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        *pProperties = thiz->mProperties;
714dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
71550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten        interface_unlock_shared(thiz);
716f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    }
717f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
718f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten    SL_LEAVE_INTERFACE
71982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
72082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
721f156301680273e71e56e898f98798f5b5b2431f6Glenn Kasten
72282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic const struct SLEnvironmentalReverbItf_ IEnvironmentalReverb_Itf = {
72382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetRoomLevel,
72482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetRoomLevel,
72582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetRoomHFLevel,
72682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetRoomHFLevel,
72782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetDecayTime,
72882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetDecayTime,
72982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetDecayHFRatio,
73082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetDecayHFRatio,
73182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetReflectionsLevel,
73282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetReflectionsLevel,
73382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetReflectionsDelay,
73482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetReflectionsDelay,
73582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetReverbLevel,
73682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetReverbLevel,
73782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetReverbDelay,
73882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetReverbDelay,
73982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetDiffusion,
74082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetDiffusion,
74182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetDensity,
74282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetDensity,
74382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_SetEnvironmentalReverbProperties,
74482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    IEnvironmentalReverb_GetEnvironmentalReverbProperties
74582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten};
74682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
74782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenstatic const SLEnvironmentalReverbSettings IEnvironmentalReverb_default = {
74882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SL_MILLIBEL_MIN, // roomLevel
74982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    0,               // roomHFLevel
75082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    1000,            // decayTime
75182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    500,             // decayHFRatio
75282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SL_MILLIBEL_MIN, // reflectionsLevel
75382b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    20,              // reflectionsDelay
75482b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    SL_MILLIBEL_MIN, // reverbLevel
75582b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    40,              // reverbDelay
75682b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    1000,            // diffusion
75782b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten    1000             // density
75882b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten};
75982b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten
76082b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kastenvoid IEnvironmentalReverb_init(void *self)
76182b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten{
76250bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
76350bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mItf = &IEnvironmentalReverb_Itf;
76450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mProperties = IEnvironmentalReverb_default;
7650b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID)
76650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    memset(&thiz->mEnvironmentalReverbDescriptor, 0, sizeof(effect_descriptor_t));
7672a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    // placement new (explicit constructor)
76850bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    (void) new (&thiz->mEnvironmentalReverbEffect) android::sp<android::AudioEffect>();
7692a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif
7702a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten}
771dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi
7722a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kastenvoid IEnvironmentalReverb_deinit(void *self)
7732a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten{
7740b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID)
77550bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
7762a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    // explicit destructor
77750bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    thiz->mEnvironmentalReverbEffect.~sp();
7782a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten#endif
7792a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten}
7802a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten
7812a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kastenbool IEnvironmentalReverb_Expose(void *self)
7822a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten{
7830b718abd78bd3e4022008fe0492fb76b265d26d1Glenn Kasten#if defined(ANDROID)
78450bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten    IEnvironmentalReverb *thiz = (IEnvironmentalReverb *) self;
785dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi    if (!android_fx_initEffectDescriptor(SL_IID_ENVIRONMENTALREVERB,
78650bccde01980ae803b8656e8b08ecacb65540f50Glenn Kasten            &thiz->mEnvironmentalReverbDescriptor)) {
787dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi        SL_LOGE("EnvironmentalReverb initialization failed.");
7882a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten        return false;
789dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi    }
790dffefbd7b3b885526df4e9df09b0e089ed422027Jean-Michel Trivi#endif
7912a25d97e40dbd5dd9195195a3a269095a4932097Glenn Kasten    return true;
79282b1fcaca1b9c870c1a7978f0986fdad2fe7d06eGlenn Kasten}
793