MediaPresetReverbTest.java revision db6028508c8eb31a0de1dcdfc410ddfe6df7c5ad
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.mediaframeworktest.functional.audio; 18 19import com.android.mediaframeworktest.MediaFrameworkTest; 20import com.android.mediaframeworktest.MediaNames; 21import com.android.mediaframeworktest.functional.EnergyProbe; 22import android.content.Context; 23import android.content.res.AssetFileDescriptor; 24import android.media.audiofx.AudioEffect; 25import android.media.AudioManager; 26import android.media.audiofx.PresetReverb; 27import android.media.audiofx.Visualizer; 28import android.media.MediaPlayer; 29 30import android.os.Looper; 31import android.test.suitebuilder.annotation.LargeTest; 32import android.test.suitebuilder.annotation.MediumTest; 33import android.test.suitebuilder.annotation.Suppress; 34import android.test.ActivityInstrumentationTestCase2; 35import android.util.Log; 36 37import java.nio.ByteOrder; 38import java.nio.ByteBuffer; 39import java.util.UUID; 40 41/** 42 * Junit / Instrumentation test case for the media AudioTrack api 43 44 */ 45public class MediaPresetReverbTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 46 private String TAG = "MediaPresetReverbTest"; 47 48 private PresetReverb mReverb = null; 49 private int mSession = -1; 50 51 public MediaPresetReverbTest() { 52 super("com.android.mediaframeworktest", MediaFrameworkTest.class); 53 } 54 55 @Override 56 protected void setUp() throws Exception { 57 super.setUp(); 58 } 59 60 @Override 61 protected void tearDown() throws Exception { 62 super.tearDown(); 63 releaseReverb(); 64 } 65 66 private static void assumeTrue(String message, boolean cond) { 67 assertTrue("(assume)"+message, cond); 68 } 69 70 private void log(String testName, String message) { 71 Log.v(TAG, "["+testName+"] "+message); 72 } 73 74 private void loge(String testName, String message) { 75 Log.e(TAG, "["+testName+"] "+message); 76 } 77 78 //----------------------------------------------------------------- 79 // PRESET REVEB TESTS: 80 //---------------------------------- 81 82 83 //----------------------------------------------------------------- 84 // 0 - constructor 85 //---------------------------------- 86 87 //Test case 0.0: test constructor and release 88 @LargeTest 89 public void test0_0ConstructorAndRelease() throws Exception { 90 boolean result = false; 91 String msg = "test1_0ConstructorAndRelease()"; 92 PresetReverb reverb = null; 93 try { 94 reverb = new PresetReverb(0, 0); 95 assertNotNull(msg + ": could not create PresetReverb", reverb); 96 try { 97 assertTrue(msg +": invalid effect ID", (reverb.getId() != 0)); 98 } catch (IllegalStateException e) { 99 msg = msg.concat(": PresetReverb not initialized"); 100 } 101 result = true; 102 } catch (IllegalArgumentException e) { 103 msg = msg.concat(": PresetReverb not found"); 104 } catch (UnsupportedOperationException e) { 105 msg = msg.concat(": Effect library not loaded"); 106 } finally { 107 if (reverb != null) { 108 reverb.release(); 109 } 110 } 111 assertTrue(msg, result); 112 } 113 114 //----------------------------------------------------------------- 115 // 1 - get/set parameters 116 //---------------------------------- 117 118 //Test case 1.0: test preset 119 @LargeTest 120 public void test1_0Preset() throws Exception { 121 boolean result = false; 122 String msg = "test1_0Preset()"; 123 getReverb(0); 124 try { 125 mReverb.setPreset((short)PresetReverb.PRESET_LARGEROOM); 126 short preset = mReverb.getPreset(); 127 assertEquals(msg +": got incorrect preset", 128 (short)PresetReverb.PRESET_LARGEROOM, 129 preset); 130 result = true; 131 } catch (IllegalArgumentException e) { 132 msg = msg.concat(": Bad parameter value"); 133 loge(msg, "Bad parameter value"); 134 } catch (UnsupportedOperationException e) { 135 msg = msg.concat(": get parameter() rejected"); 136 loge(msg, "get parameter() rejected"); 137 } catch (IllegalStateException e) { 138 msg = msg.concat("get parameter() called in wrong state"); 139 loge(msg, "get parameter() called in wrong state"); 140 } finally { 141 releaseReverb(); 142 } 143 assertTrue(msg, result); 144 } 145 146 //Test case 1.1: test properties 147 @LargeTest 148 public void test1_1Properties() throws Exception { 149 boolean result = false; 150 String msg = "test1_1Properties()"; 151 getReverb(0); 152 try { 153 PresetReverb.Settings settings = mReverb.getProperties(); 154 short newPreset = (short)PresetReverb.PRESET_LARGEROOM; 155 if (settings.preset == (short)PresetReverb.PRESET_LARGEROOM) { 156 newPreset = (short)PresetReverb.PRESET_SMALLROOM; 157 } 158 String str = settings.toString(); 159 settings = new PresetReverb.Settings(str); 160 settings.preset = newPreset; 161 mReverb.setProperties(settings); 162 settings = mReverb.getProperties(); 163 assertEquals(msg +": setProperties failed", newPreset, settings.preset); 164 result = true; 165 } catch (IllegalArgumentException e) { 166 msg = msg.concat(": Bad parameter value"); 167 loge(msg, "Bad parameter value"); 168 } catch (UnsupportedOperationException e) { 169 msg = msg.concat(": get parameter() rejected"); 170 loge(msg, "get parameter() rejected"); 171 } catch (IllegalStateException e) { 172 msg = msg.concat("get parameter() called in wrong state"); 173 loge(msg, "get parameter() called in wrong state"); 174 } finally { 175 releaseReverb(); 176 } 177 assertTrue(msg, result); 178 } 179 180 //----------------------------------------------------------------- 181 // 2 - Effect action 182 //---------------------------------- 183 184 //Test case 2.0: test actual auxiliary reverb influence on sound 185 @LargeTest 186 public void test2_0AuxiliarySoundModification() throws Exception { 187 boolean result = false; 188 String msg = "test2_0AuxiliarySoundModification()"; 189 EnergyProbe probe = null; 190 AudioEffect vc = null; 191 MediaPlayer mp = null; 192 AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 193 int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 194 am.setStreamVolume(AudioManager.STREAM_MUSIC, 195 am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 196 0); 197 getReverb(0); 198 try { 199 probe = new EnergyProbe(0); 200 // creating a volume controller on output mix ensures that ro.audio.silent mutes 201 // audio after the effects and not before 202 vc = new AudioEffect( 203 AudioEffect.EFFECT_TYPE_NULL, 204 UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"), 205 0, 206 0); 207 vc.setEnabled(true); 208 209 mp = new MediaPlayer(); 210 mp.setDataSource(MediaNames.SINE_200_1000); 211 mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 212 mp.attachAuxEffect(mReverb.getId()); 213 mp.setAuxEffectSendLevel(1.0f); 214 mReverb.setPreset((short)PresetReverb.PRESET_PLATE); 215 mReverb.setEnabled(true); 216 mp.prepare(); 217 mp.start(); 218 Thread.sleep(1000); 219 mp.stop(); 220 Thread.sleep(200); 221 // measure energy around 1kHz after media player was stopped for 200 ms 222 int energy1000 = probe.capture(1000); 223 assertTrue(msg + ": reverb has no effect", energy1000 > 0); 224 result = true; 225 } catch (IllegalArgumentException e) { 226 msg = msg.concat(": Bad parameter value"); 227 loge(msg, "Bad parameter value"); 228 } catch (UnsupportedOperationException e) { 229 msg = msg.concat(": get parameter() rejected"); 230 loge(msg, "get parameter() rejected"); 231 } catch (IllegalStateException e) { 232 msg = msg.concat("get parameter() called in wrong state"); 233 loge(msg, "get parameter() called in wrong state"); 234 } catch (InterruptedException e) { 235 loge(msg, "sleep() interrupted"); 236 } 237 finally { 238 releaseReverb(); 239 if (mp != null) { 240 mp.release(); 241 } 242 if (vc != null) { 243 vc.release(); 244 } 245 if (probe != null) { 246 probe.release(); 247 } 248 am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); 249 } 250 assertTrue(msg, result); 251 } 252 253 //Test case 2.1: test actual insert reverb influence on sound 254 @LargeTest 255 public void test2_1InsertSoundModification() throws Exception { 256 boolean result = false; 257 String msg = "test2_1InsertSoundModification()"; 258 EnergyProbe probe = null; 259 AudioEffect vc = null; 260 MediaPlayer mp = null; 261 AudioEffect rvb = null; 262 AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 263 int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 264 am.setStreamVolume(AudioManager.STREAM_MUSIC, 265 am.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 266 0); 267 try { 268 // creating a volume controller on output mix ensures that ro.audio.silent mutes 269 // audio after the effects and not before 270 vc = new AudioEffect( 271 AudioEffect.EFFECT_TYPE_NULL, 272 UUID.fromString("119341a0-8469-11df-81f9-0002a5d5c51b"), 273 0, 274 0); 275 vc.setEnabled(true); 276 277 mp = new MediaPlayer(); 278 mp.setDataSource(MediaNames.SINE_200_1000); 279 mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 280 getReverb(mp.getAudioSessionId()); 281 mReverb.setPreset((short)PresetReverb.PRESET_PLATE); 282 mReverb.setEnabled(true); 283 284 // create reverb with UUID instead of PresetReverb constructor otherwise an auxiliary 285 // reverb will be chosen by the effect framework as we are on session 0 286 rvb = new AudioEffect( 287 AudioEffect.EFFECT_TYPE_NULL, 288 UUID.fromString("172cdf00-a3bc-11df-a72f-0002a5d5c51b"), 289 0, 290 0); 291 292 rvb.setParameter(PresetReverb.PARAM_PRESET, PresetReverb.PRESET_PLATE); 293 rvb.setEnabled(true); 294 295 // create probe after reverb so that it is chained behind the reverb in the 296 // effect chain 297 probe = new EnergyProbe(0); 298 299 mp.prepare(); 300 mp.start(); 301 Thread.sleep(1000); 302 mp.stop(); 303 Thread.sleep(200); 304 // measure energy around 1kHz after media player was stopped for 200 ms 305 int energy1000 = probe.capture(1000); 306 assertTrue(msg + ": reverb has no effect", energy1000 > 0); 307 result = true; 308 } catch (IllegalArgumentException e) { 309 msg = msg.concat(": Bad parameter value"); 310 loge(msg, "Bad parameter value"); 311 } catch (UnsupportedOperationException e) { 312 msg = msg.concat(": get parameter() rejected"); 313 loge(msg, "get parameter() rejected"); 314 } catch (IllegalStateException e) { 315 msg = msg.concat("get parameter() called in wrong state"); 316 loge(msg, "get parameter() called in wrong state"); 317 } catch (InterruptedException e) { 318 loge(msg, "sleep() interrupted"); 319 } 320 finally { 321 releaseReverb(); 322 if (mp != null) { 323 mp.release(); 324 } 325 if (vc != null) { 326 vc.release(); 327 } 328 if (rvb != null) { 329 rvb.release(); 330 } 331 if (probe != null) { 332 probe.release(); 333 } 334 am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); 335 } 336 assertTrue(msg, result); 337 } 338 339 //----------------------------------------------------------------- 340 // private methods 341 //---------------------------------- 342 343 private void getReverb(int session) { 344 if (mReverb == null || session != mSession) { 345 if (session != mSession && mReverb != null) { 346 mReverb.release(); 347 mReverb = null; 348 } 349 try { 350 mReverb = new PresetReverb(0, session); 351 mSession = session; 352 } catch (IllegalArgumentException e) { 353 Log.e(TAG, "getReverb() PresetReverb not found exception: "+e); 354 } catch (UnsupportedOperationException e) { 355 Log.e(TAG, "getReverb() Effect library not loaded exception: "+e); 356 } 357 } 358 assertNotNull("could not create mReverb", mReverb); 359 } 360 361 private void releaseReverb() { 362 if (mReverb != null) { 363 mReverb.release(); 364 mReverb = null; 365 } 366 } 367 368} 369