1391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent/*
2391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * Copyright (C) 2010 The Android Open Source Project
3391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent *
4391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * you may not use this file except in compliance with the License.
6391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * You may obtain a copy of the License at
7391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent *
8391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent *
10391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * Unless required by applicable law or agreed to in writing, software
11391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * See the License for the specific language governing permissions and
14391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * limitations under the License.
15391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent */
16391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
17db6028508c8eb31a0de1dcdfc410ddfe6df7c5adXia Wangpackage com.android.mediaframeworktest.functional.audio;
18391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
19391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport com.android.mediaframeworktest.MediaFrameworkTest;
20391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport com.android.mediaframeworktest.MediaNames;
21db6028508c8eb31a0de1dcdfc410ddfe6df7c5adXia Wangimport com.android.mediaframeworktest.functional.EnergyProbe;
22391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.content.Context;
23391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.content.res.AssetFileDescriptor;
241a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.AudioEffect;
25391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.media.AudioManager;
261a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.EnvironmentalReverb;
271a5149e5d7f2dddc8b324f7695e69fd89af73c52Eric Laurentimport android.media.audiofx.Visualizer;
28391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.media.MediaPlayer;
29391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
30391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.os.Looper;
31391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.test.suitebuilder.annotation.LargeTest;
32391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.test.suitebuilder.annotation.MediumTest;
33391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.test.suitebuilder.annotation.Suppress;
34391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.test.ActivityInstrumentationTestCase2;
35391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport android.util.Log;
36391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
37391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport java.nio.ByteOrder;
38391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport java.nio.ByteBuffer;
39391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentimport java.util.UUID;
40391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
41391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent/**
42391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent * Junit / Instrumentation test case for the media AudioTrack api
43391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
44391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent */
45391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurentpublic class MediaEnvReverbTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
46391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private String TAG = "MediaEnvReverbTest";
47391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // allow +/- 100 millibel difference between set and get gains
48391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private final static int MILLIBEL_TOLERANCE = 100;
49391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // allow +/- 5% tolerance between set and get delays
50391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private final static float DELAY_TOLERANCE = 1.05f;
51391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // allow +/- 5% tolerance between set and get ratios
52391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private final static float RATIO_TOLERANCE = 1.05f;
535e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // Implementor UUID for volume controller effect defined in
545e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
555e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    private final static UUID VOLUME_EFFECT_UUID =
565e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent        UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
575e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // Implementor UUID for environmental reverb effect defined in
585e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
595e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    private final static UUID ENV_REVERB_EFFECT_UUID =
605e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent        UUID.fromString("c7a511a0-a3bb-11df-860e-0002a5d5c51b");
61391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
62391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private EnvironmentalReverb mReverb = null;
63391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private int mSession = -1;
64391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
65391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public MediaEnvReverbTest() {
66391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
67391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
68391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
69391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @Override
70391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    protected void setUp() throws Exception {
71391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent      super.setUp();
72391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
73391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
74391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @Override
75391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    protected void tearDown() throws Exception {
76391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        super.tearDown();
77391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        releaseReverb();
78391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
79391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
80391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private static void assumeTrue(String message, boolean cond) {
81391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue("(assume)"+message, cond);
82391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
83391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
84391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void log(String testName, String message) {
85391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        Log.v(TAG, "["+testName+"] "+message);
86391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
87391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
88391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void loge(String testName, String message) {
89391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        Log.e(TAG, "["+testName+"] "+message);
90391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
91391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
92391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
93391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // ENVIRONMENTAL REVEB TESTS:
94391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
95391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
96391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
97391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
98391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // 0 - constructor
99391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
100391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
101391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 0.0: test constructor and release
102391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
103391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test0_0ConstructorAndRelease() throws Exception {
104391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
105391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_0ConstructorAndRelease()";
106391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        EnvironmentalReverb reverb = null;
107391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         try {
108391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            reverb = new EnvironmentalReverb(0, 0);
109391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertNotNull(msg + ": could not create EnvironmentalReverb", reverb);
110391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            try {
111391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                assertTrue(msg +": invalid effect ID", (reverb.getId() != 0));
112391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            } catch (IllegalStateException e) {
113391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                msg = msg.concat(": EnvironmentalReverb not initialized");
114391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
115391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
116391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
117391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": EnvironmentalReverb not found");
118391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
119391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Effect library not loaded");
120391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
121391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (reverb != null) {
122391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                reverb.release();
123391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
124391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
125391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
126391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
127391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
128391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
129391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // 1 - get/set parameters
130391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
131391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
132391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.0: test room level and room HF level
133391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
134391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_0Room() throws Exception {
135391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
136391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_0Room()";
137391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
138391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
139391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setRoomLevel((short)0);
140391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short level = mReverb.getRoomLevel();
141391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect room level",
142391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (level > (0 - MILLIBEL_TOLERANCE)) &&
143391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (level < (0 + MILLIBEL_TOLERANCE)));
144391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
145391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setRoomHFLevel((short)-6);
146391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            level = mReverb.getRoomHFLevel();
147391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect room HF level",
148391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (level > (-6 - MILLIBEL_TOLERANCE)) &&
149391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (level < (-6 + MILLIBEL_TOLERANCE)));
150391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
151391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
152391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
153391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
154391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
155391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
156391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
157391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
158391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
159391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
160391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
161391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
162391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
163391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
164391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
165391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
166391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
167391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.1: test decay time and ratio
168391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
169391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_1Decay() throws Exception {
170391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
171391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_1Decay()";
172391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
173391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
174391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setDecayTime(500);
175391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            int time = mReverb.getDecayTime();
176391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect decay time",
177391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)time > (float)(500 / DELAY_TOLERANCE)) &&
178391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)time < (float)(500 * DELAY_TOLERANCE)));
179391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
180391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setDecayHFRatio((short)1000);
181391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short ratio = mReverb.getDecayHFRatio();
182391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect decay HF ratio",
183391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)ratio > (float)(1000 / RATIO_TOLERANCE)) &&
184391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)ratio < (float)(1000 * RATIO_TOLERANCE)));
185391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
186391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
187391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
188391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
189391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
190391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
191391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
192391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
193391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
194391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
195391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
196391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
197391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
198391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
199391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
200391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
201391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
202391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.2: test reflections
203391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
204391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_2Reflections() throws Exception {
205391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        // TODO: uncomment when early reflections are implemented
206391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        boolean result = false;
207391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        String msg = "test1_2Reflections()";
208391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        getReverb(0);
209391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        try {
210391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            mReverb.setReflectionsLevel((short)0);
211391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            short level = mReverb.getReflectionsLevel();
212391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            assertTrue(msg +": got incorrect reflections level",
213391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//                    (level > (0 - MILLIBEL_TOLERANCE)) &&
214391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//                    (level < (0 + MILLIBEL_TOLERANCE)));
215391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//
216391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            mReverb.setReflectionsDelay(30);
217391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            int delay = mReverb.getReflectionsDelay();
218391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            assertTrue(msg +": got incorrect reflections delay",
219391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//                    ((float)delay > (float)(30 / DELAY_TOLERANCE)) &&
220391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//                    ((float)delay < (float)(30 * DELAY_TOLERANCE)));
221391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//
222391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            result = true;
223391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        } catch (IllegalArgumentException e) {
224391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            msg = msg.concat(": Bad parameter value");
225391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            loge(msg, "Bad parameter value");
226391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        } catch (UnsupportedOperationException e) {
227391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            msg = msg.concat(": get parameter() rejected");
228391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            loge(msg, "get parameter() rejected");
229391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        } catch (IllegalStateException e) {
230391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            msg = msg.concat("get parameter() called in wrong state");
231391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            loge(msg, "get parameter() called in wrong state");
232391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        } finally {
233391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//            releaseReverb();
234391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        }
235391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent//        assertTrue(msg, result);
236391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
237391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
238391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.3: test reverb
239391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
240391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_3Reverb() throws Exception {
241391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
242391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_3Reverb()";
243391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
244391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
245391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setReverbLevel((short)0);
246391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short level = mReverb.getReverbLevel();
247391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect reverb level",
248391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (level > (0 - MILLIBEL_TOLERANCE)) &&
249391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (level < (0 + MILLIBEL_TOLERANCE)));
250391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
251391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // TODO: change delay when early reflections are implemented
252391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setReverbDelay(0);
253391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            int delay = mReverb.getReverbDelay();
254391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect reverb delay", delay < 5);
255391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
256391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
257391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
258391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
259391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
260391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
261391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
262391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
263391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
264391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
265391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
266391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
267391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
268391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
269391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
270391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
271391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
272391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.4: test diffusion and density
273391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
274391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_4DiffusionAndDensity() throws Exception {
275391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
276391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_4DiffusionAndDensity()";
277391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
278391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
279391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setDiffusion((short)500);
280391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short diffusion = mReverb.getDiffusion();
281391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect diffusion",
282391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)diffusion > (float)(500 / RATIO_TOLERANCE)) &&
283391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)diffusion < (float)(500 * RATIO_TOLERANCE)));
284391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
285391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setDensity((short)500);
286391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short density = mReverb.getDensity();
287391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": got incorrect density",
288391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)density > (float)(500 / RATIO_TOLERANCE)) &&
289391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    ((float)density < (float)(500 * RATIO_TOLERANCE)));
290391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
291391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
292391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
293391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
294391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
295391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
296391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
297391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
298391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
299391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
300391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
301391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
302391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
303391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
304391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
305391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
306391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
307391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.5: test properties
308391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
309391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_5Properties() throws Exception {
310391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
311391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_5Properties()";
312391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
313391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
314391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            EnvironmentalReverb.Settings settings = mReverb.getProperties();
315391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short newRoomLevel = 0;
316391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (settings.roomLevel == 0) {
317391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                newRoomLevel = -1000;
318391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
319391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            String str = settings.toString();
320391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            settings = new EnvironmentalReverb.Settings(str);
321391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            settings.roomLevel = newRoomLevel;
322391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setProperties(settings);
323391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            settings = mReverb.getProperties();
324391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg +": setProperties failed",
325391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (settings.roomLevel > (newRoomLevel - MILLIBEL_TOLERANCE)) &&
326391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                    (settings.roomLevel < (newRoomLevel + MILLIBEL_TOLERANCE)));
327391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
328391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
329391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
330391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
331391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
332391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
333391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
334391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
335391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
336391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
337391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
338391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
339391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
340391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
341391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
342391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
343391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
344391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // 2 - Effect action
345391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
346391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
347391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 2.0: test actual auxiliary reverb influence on sound
348391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
349391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test2_0AuxiliarySoundModification() throws Exception {
350391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
351391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test2_0AuxiliarySoundModification()";
352391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        EnergyProbe probe = null;
353391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioEffect vc = null;
354391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        MediaPlayer mp = null;
355391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
356c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        int ringerMode = am.getRingerMode();
357c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
358391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
359391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        am.setStreamVolume(AudioManager.STREAM_MUSIC,
360391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
361391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           0);
362391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
363391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
364391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            probe = new EnergyProbe(0);
365391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // creating a volume controller on output mix ensures that ro.audio.silent mutes
366391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // audio after the effects and not before
367391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc = new AudioEffect(
3685e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                AudioEffect.EFFECT_TYPE_NULL,
3695e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                VOLUME_EFFECT_UUID,
3705e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0,
3715e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0);
372391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc.setEnabled(true);
373391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
374391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp = new MediaPlayer();
375391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setDataSource(MediaNames.SINE_200_1000);
376391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
377391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.attachAuxEffect(mReverb.getId());
378391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setAuxEffectSendLevel(1.0f);
379391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setRoomLevel((short)0);
380391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setReverbLevel((short)0);
381391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setDecayTime(2000);
382391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setEnabled(true);
383391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.prepare();
384391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.start();
385391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(1000);
386391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.stop();
387391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(300);
388391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // measure energy around 1kHz after media player was stopped for 300 ms
389391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            int energy1000 = probe.capture(1000);
390391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg + ": reverb has no effect", energy1000 > 0);
391391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
392391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
393391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
394391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
395391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
396391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
397391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
398391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
399391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
400391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
401391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (InterruptedException e) {
402391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "sleep() interrupted");
403391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
404391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        finally {
405391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
406391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (mp != null) {
407391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mp.release();
408391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
409391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (vc != null) {
410391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                vc.release();
411391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
412391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (probe != null) {
413391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                probe.release();
414391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
415391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
416c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent            am.setRingerMode(ringerMode);
417391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
418391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
419391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
420391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
421391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 2.1: test actual insert reverb influence on sound
422391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
423391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test2_1InsertSoundModification() throws Exception {
424391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
425391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test2_1InsertSoundModification()";
426391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        EnergyProbe probe = null;
427391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioEffect vc = null;
428391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        MediaPlayer mp = null;
42971fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent        AudioEffect rvb = null;
430391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
431c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        int ringerMode = am.getRingerMode();
432c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
433391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
434391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        am.setStreamVolume(AudioManager.STREAM_MUSIC,
435391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
436391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           0);
437391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
438391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // creating a volume controller on output mix ensures that ro.audio.silent mutes
439391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // audio after the effects and not before
440391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc = new AudioEffect(
4415e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                AudioEffect.EFFECT_TYPE_NULL,
4425e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                VOLUME_EFFECT_UUID,
4435e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0,
4445e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0);
445391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc.setEnabled(true);
446391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
447391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp = new MediaPlayer();
448391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setDataSource(MediaNames.SINE_200_1000);
449391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
45071fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
45171fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // create reverb with UUID instead of EnvironmentalReverb constructor otherwise an
45271fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // auxiliary reverb will be chosen by the effect framework as we are on session 0
45371fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb = new AudioEffect(
45471fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                        AudioEffect.EFFECT_TYPE_NULL,
4555e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                        ENV_REVERB_EFFECT_UUID,
45671fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                        0,
45771fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                        0);
45871fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
45971fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb.setParameter(EnvironmentalReverb.PARAM_ROOM_LEVEL, (short)0);
46071fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb.setParameter(EnvironmentalReverb.PARAM_REVERB_LEVEL, (short)0);
46171fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb.setParameter(EnvironmentalReverb.PARAM_DECAY_TIME, 2000);
46271fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb.setEnabled(true);
46371fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
46471fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // create probe after reverb so that it is chained behind the reverb in the
46571fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // effect chain
46671fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            probe = new EnergyProbe(0);
46771fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
468391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.prepare();
469391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.start();
470391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(1000);
471391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.stop();
472391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(300);
473391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // measure energy around 1kHz after media player was stopped for 300 ms
474391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            int energy1000 = probe.capture(1000);
475391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg + ": reverb has no effect", energy1000 > 0);
476391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
477391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
478391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
479391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
480391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
481391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
482391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
483391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
484391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
485391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
486391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (InterruptedException e) {
487391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "sleep() interrupted");
488391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
489391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        finally {
490391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (mp != null) {
491391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mp.release();
492391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
493391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (vc != null) {
494391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                vc.release();
495391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
49671fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            if (rvb != null) {
49771fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                rvb.release();
49871fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            }
499391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (probe != null) {
500391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                probe.release();
501391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
502391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
503c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent            am.setRingerMode(ringerMode);
504391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
505391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
506391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
507391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
508391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
509391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // private methods
510391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
511391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
512391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void getReverb(int session) {
513391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         if (mReverb == null || session != mSession) {
514391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent             if (session != mSession && mReverb != null) {
515391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                 mReverb.release();
516391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                 mReverb = null;
517391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent             }
518391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent             try {
519391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mReverb = new EnvironmentalReverb(0, session);
520391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mSession = session;
521391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            } catch (IllegalArgumentException e) {
522391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                Log.e(TAG, "getReverb() EnvironmentalReverb not found exception: "+e);
523391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            } catch (UnsupportedOperationException e) {
524391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                Log.e(TAG, "getReverb() Effect library not loaded exception: "+e);
525391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
526391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         }
527391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         assertNotNull("could not create mReverb", mReverb);
528391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
529391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
530391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void releaseReverb() {
531391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        if (mReverb != null) {
532391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.release();
533391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb = null;
534391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
535391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent   }
536391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
537391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent}
538