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