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.PresetReverb;
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 MediaPresetReverbTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
46391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private String TAG = "MediaPresetReverbTest";
475e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // Implementor UUID for volume controller effect defined in
485e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
495e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    private final static UUID VOLUME_EFFECT_UUID =
505e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent        UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b");
515e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // Implementor UUID for preset reverb effect defined in
525e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    // frameworks/base/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp
535e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent    private final static UUID PRESET_REVERB_EFFECT_UUID =
545e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent        UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b");
55391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
56391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private PresetReverb mReverb = null;
57391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private int mSession = -1;
58391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
59391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public MediaPresetReverbTest() {
60391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        super("com.android.mediaframeworktest", MediaFrameworkTest.class);
61391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
62391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
63391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @Override
64391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    protected void setUp() throws Exception {
65391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent      super.setUp();
66391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
67391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
68391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @Override
69391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    protected void tearDown() throws Exception {
70391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        super.tearDown();
71391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        releaseReverb();
72391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
73391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
74391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private static void assumeTrue(String message, boolean cond) {
75391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue("(assume)"+message, cond);
76391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
77391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
78391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void log(String testName, String message) {
79391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        Log.v(TAG, "["+testName+"] "+message);
80391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
81391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
82391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void loge(String testName, String message) {
83391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        Log.e(TAG, "["+testName+"] "+message);
84391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
85391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
86391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
87391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // PRESET REVEB TESTS:
88391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
89391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
90391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
91391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
92391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // 0 - constructor
93391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
94391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
95391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 0.0: test constructor and release
96391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
97391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test0_0ConstructorAndRelease() throws Exception {
98391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
99391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_0ConstructorAndRelease()";
100391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        PresetReverb reverb = null;
101391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         try {
102391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            reverb = new PresetReverb(0, 0);
103391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertNotNull(msg + ": could not create PresetReverb", reverb);
104391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            try {
105391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                assertTrue(msg +": invalid effect ID", (reverb.getId() != 0));
106391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            } catch (IllegalStateException e) {
107391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                msg = msg.concat(": PresetReverb not initialized");
108391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
109391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
110391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
111391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": PresetReverb not found");
112391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
113391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Effect library not loaded");
114391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
115391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (reverb != null) {
116391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                reverb.release();
117391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
118391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
119391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
120391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
121391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
122391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
123391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // 1 - get/set parameters
124391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
125391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
126391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.0: test preset
127391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
128391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_0Preset() throws Exception {
129391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
130391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_0Preset()";
131391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
132391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
133391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setPreset((short)PresetReverb.PRESET_LARGEROOM);
134391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short preset = mReverb.getPreset();
135391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertEquals(msg +": got incorrect preset",
136391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                         (short)PresetReverb.PRESET_LARGEROOM,
137391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                         preset);
138391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
139391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
140391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
141391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
142391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
143391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
144391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
145391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
146391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
147391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
148391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
149391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
150391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
151391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
152391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
153391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
154391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 1.1: test properties
155391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
156391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test1_1Properties() throws Exception {
157391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
158391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test1_1Properties()";
159391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
160391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
161391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            PresetReverb.Settings settings = mReverb.getProperties();
162391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            short newPreset = (short)PresetReverb.PRESET_LARGEROOM;
163391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (settings.preset == (short)PresetReverb.PRESET_LARGEROOM) {
164391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                newPreset = (short)PresetReverb.PRESET_SMALLROOM;
165391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
166391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            String str = settings.toString();
167391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            settings = new PresetReverb.Settings(str);
168391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            settings.preset = newPreset;
169391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setProperties(settings);
170391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            settings = mReverb.getProperties();
171391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertEquals(msg +": setProperties failed", newPreset, settings.preset);
172391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
173391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
174391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
175391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
176391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
177391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
178391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
179391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
180391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
181391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
182391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } finally {
183391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
184391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
185391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
186391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
187391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
188391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
189391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // 2 - Effect action
190391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
191391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
192391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 2.0: test actual auxiliary reverb influence on sound
193391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
194391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test2_0AuxiliarySoundModification() throws Exception {
195391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
196391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test2_0AuxiliarySoundModification()";
197391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        EnergyProbe probe = null;
198391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioEffect vc = null;
199391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        MediaPlayer mp = null;
200391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
201c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        int ringerMode = am.getRingerMode();
202c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
203391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
204391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        am.setStreamVolume(AudioManager.STREAM_MUSIC,
205391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
206391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           0);
207391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        getReverb(0);
208391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
209391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            probe = new EnergyProbe(0);
210391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // creating a volume controller on output mix ensures that ro.audio.silent mutes
211391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // audio after the effects and not before
212391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc = new AudioEffect(
2135e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                AudioEffect.EFFECT_TYPE_NULL,
2145e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                VOLUME_EFFECT_UUID,
2155e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0,
2165e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0);
217391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc.setEnabled(true);
218391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
219391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp = new MediaPlayer();
220391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setDataSource(MediaNames.SINE_200_1000);
221391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
222391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.attachAuxEffect(mReverb.getId());
223391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setAuxEffectSendLevel(1.0f);
224391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setPreset((short)PresetReverb.PRESET_PLATE);
225391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.setEnabled(true);
226391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.prepare();
227391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.start();
228391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(1000);
229391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.stop();
230391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(200);
231391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // measure energy around 1kHz after media player was stopped for 200 ms
232391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            int energy1000 = probe.capture(1000);
233391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg + ": reverb has no effect", energy1000 > 0);
234391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
235391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
236391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
237391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
238391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
239391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
240391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
241391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
242391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
243391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
244391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (InterruptedException e) {
245391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "sleep() interrupted");
246391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
247391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        finally {
248391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            releaseReverb();
249391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (mp != null) {
250391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mp.release();
251391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
252391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (vc != null) {
253391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                vc.release();
254391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
255391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (probe != null) {
256391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                probe.release();
257391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
258391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
259c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent            am.setRingerMode(ringerMode);
260391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
261391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
262391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
263391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
264391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //Test case 2.1: test actual insert reverb influence on sound
265391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    @LargeTest
266391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    public void test2_1InsertSoundModification() throws Exception {
267391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        boolean result = false;
268391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        String msg = "test2_1InsertSoundModification()";
269391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        EnergyProbe probe = null;
270391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioEffect vc = null;
271391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        MediaPlayer mp = null;
27271fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent        AudioEffect rvb = null;
273391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
274c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        int ringerMode = am.getRingerMode();
275c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent        am.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
276391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
277391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        am.setStreamVolume(AudioManager.STREAM_MUSIC,
278391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
279391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                           0);
280391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        try {
281391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // creating a volume controller on output mix ensures that ro.audio.silent mutes
282391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // audio after the effects and not before
283391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc = new AudioEffect(
2845e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                AudioEffect.EFFECT_TYPE_NULL,
2855e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                VOLUME_EFFECT_UUID,
2865e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0,
2875e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                                0);
288391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            vc.setEnabled(true);
289391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
290391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp = new MediaPlayer();
291391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setDataSource(MediaNames.SINE_200_1000);
292391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
29371fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
29471fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // create reverb with UUID instead of PresetReverb constructor otherwise an auxiliary
29571fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // reverb will be chosen by the effect framework as we are on session 0
29671fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb = new AudioEffect(
29771fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                        AudioEffect.EFFECT_TYPE_NULL,
2985e7acae2c3e4cf345e3fa7bf10e3c62f9e69e6beEric Laurent                        PRESET_REVERB_EFFECT_UUID,
29971fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                        0,
30071fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                        0);
30171fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
30271fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb.setParameter(PresetReverb.PARAM_PRESET, PresetReverb.PRESET_PLATE);
30371fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            rvb.setEnabled(true);
30471fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
30571fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // create probe after reverb so that it is chained behind the reverb in the
30671fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            // effect chain
30771fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            probe = new EnergyProbe(0);
30871fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent
309391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.prepare();
310391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.start();
311391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(1000);
312391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mp.stop();
313391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            Thread.sleep(200);
314391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            // measure energy around 1kHz after media player was stopped for 200 ms
315391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            int energy1000 = probe.capture(1000);
316391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            assertTrue(msg + ": reverb has no effect", energy1000 > 0);
317391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            result = true;
318391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalArgumentException e) {
319391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": Bad parameter value");
320391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "Bad parameter value");
321391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (UnsupportedOperationException e) {
322391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat(": get parameter() rejected");
323391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() rejected");
324391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (IllegalStateException e) {
325391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            msg = msg.concat("get parameter() called in wrong state");
326391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "get parameter() called in wrong state");
327391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        } catch (InterruptedException e) {
328391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            loge(msg, "sleep() interrupted");
329391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
330391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        finally {
331391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (mp != null) {
332391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mp.release();
333391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
334391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (vc != null) {
335391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                vc.release();
336391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
33771fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            if (rvb != null) {
33871fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent                rvb.release();
33971fe631c78756da48662f8ee220fa7b09f5413fbEric Laurent            }
340391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            if (probe != null) {
341391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                probe.release();
342391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
343391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0);
344c81e0ad9bd438575389623f523a28e2e6ca69236Eric Laurent            am.setRingerMode(ringerMode);
345391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
346391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        assertTrue(msg, result);
347391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
348391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
349391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //-----------------------------------------------------------------
350391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    // private methods
351391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    //----------------------------------
352391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
353391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void getReverb(int session) {
354391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         if (mReverb == null || session != mSession) {
355391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent             if (session != mSession && mReverb != null) {
356391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                 mReverb.release();
357391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                 mReverb = null;
358391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent             }
359391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent             try {
360391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mReverb = new PresetReverb(0, session);
361391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                mSession = session;
362391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            } catch (IllegalArgumentException e) {
363391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                Log.e(TAG, "getReverb() PresetReverb not found exception: "+e);
364391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            } catch (UnsupportedOperationException e) {
365391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent                Log.e(TAG, "getReverb() Effect library not loaded exception: "+e);
366391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            }
367391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         }
368391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent         assertNotNull("could not create mReverb", mReverb);
369391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    }
370391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
371391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent    private void releaseReverb() {
372391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        if (mReverb != null) {
373391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb.release();
374391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent            mReverb = null;
375391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent        }
376391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent   }
377391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent
378391e2d0d88c1acd87b1503be276cfa4e7ce66c88Eric Laurent}
379