MediaEqualizerTest.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.Equalizer; 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 MediaEqualizerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 46 private String TAG = "MediaEqualizerTest"; 47 private final static int MIN_NUMBER_OF_BANDS = 4; 48 private final static int MIN_BAND_LEVEL = -1500; 49 private final static int MAX_BAND_LEVEL = 1500; 50 private final static int TEST_FREQUENCY_MILLIHERTZ = 1000000; 51 private final static int MIN_NUMBER_OF_PRESETS = 4; 52 private final static int TEST_VOLUME = 4; 53 private Equalizer mEqualizer = null; 54 private int mSession = -1; 55 56 public MediaEqualizerTest() { 57 super("com.android.mediaframeworktest", MediaFrameworkTest.class); 58 } 59 60 @Override 61 protected void setUp() throws Exception { 62 super.setUp(); 63 } 64 65 @Override 66 protected void tearDown() throws Exception { 67 super.tearDown(); 68 releaseEqualizer(); 69 } 70 71 private static void assumeTrue(String message, boolean cond) { 72 assertTrue("(assume)"+message, cond); 73 } 74 75 private void log(String testName, String message) { 76 Log.v(TAG, "["+testName+"] "+message); 77 } 78 79 private void loge(String testName, String message) { 80 Log.e(TAG, "["+testName+"] "+message); 81 } 82 83 //----------------------------------------------------------------- 84 // EQUALIZER TESTS: 85 //---------------------------------- 86 87 88 //----------------------------------------------------------------- 89 // 0 - constructor 90 //---------------------------------- 91 92 //Test case 0.0: test constructor and release 93 @LargeTest 94 public void test0_0ConstructorAndRelease() throws Exception { 95 boolean result = false; 96 String msg = "test1_0ConstructorAndRelease()"; 97 Equalizer eq = null; 98 try { 99 eq = new Equalizer(0, 0); 100 assertNotNull(msg + ": could not create Equalizer", eq); 101 try { 102 assertTrue(msg +": invalid effect ID", (eq.getId() != 0)); 103 } catch (IllegalStateException e) { 104 msg = msg.concat(": Equalizer not initialized"); 105 } 106 result = true; 107 } catch (IllegalArgumentException e) { 108 msg = msg.concat(": Equalizer not found"); 109 } catch (UnsupportedOperationException e) { 110 msg = msg.concat(": Effect library not loaded"); 111 } finally { 112 if (eq != null) { 113 eq.release(); 114 } 115 } 116 assertTrue(msg, result); 117 } 118 119 120 //----------------------------------------------------------------- 121 // 1 - get/set parameters 122 //---------------------------------- 123 124 //Test case 1.0: test setBandLevel() and getBandLevel() 125 @LargeTest 126 public void test1_0BandLevel() throws Exception { 127 boolean result = false; 128 String msg = "test1_0BandLevel()"; 129 getEqualizer(0); 130 try { 131 short numBands = mEqualizer.getNumberOfBands(); 132 assertTrue(msg + ": not enough bands", numBands >= MIN_NUMBER_OF_BANDS); 133 134 short[] levelRange = mEqualizer.getBandLevelRange(); 135 assertTrue(msg + ": min level too high", levelRange[0] <= MIN_BAND_LEVEL); 136 assertTrue(msg + ": max level too low", levelRange[1] >= MAX_BAND_LEVEL); 137 138 mEqualizer.setBandLevel((short)0, levelRange[1]); 139 short level = mEqualizer.getBandLevel((short)0); 140 // 10% margin on actual level compared to requested level 141 assertTrue(msg + ": setBandLevel failed", 142 ((float)level > (float)levelRange[1] * 0.9f) && 143 ((float)level < (float)levelRange[1] * 1.1f)); 144 result = true; 145 } catch (IllegalArgumentException e) { 146 msg = msg.concat(": Bad parameter value"); 147 loge(msg, "Bad parameter value"); 148 } catch (UnsupportedOperationException e) { 149 msg = msg.concat(": get parameter() rejected"); 150 loge(msg, "get parameter() rejected"); 151 } catch (IllegalStateException e) { 152 msg = msg.concat("get parameter() called in wrong state"); 153 loge(msg, "get parameter() called in wrong state"); 154 } finally { 155 releaseEqualizer(); 156 } 157 assertTrue(msg, result); 158 } 159 160 //Test case 1.1: test band frequency 161 @LargeTest 162 public void test1_1BandFrequency() throws Exception { 163 boolean result = false; 164 String msg = "test1_1BandFrequency()"; 165 getEqualizer(0); 166 try { 167 short band = mEqualizer.getBand(TEST_FREQUENCY_MILLIHERTZ); 168 assertTrue(msg + ": getBand failed", band >= 0); 169 int[] freqRange = mEqualizer.getBandFreqRange(band); 170 assertTrue(msg + ": getBandFreqRange failed", 171 (freqRange[0] <= TEST_FREQUENCY_MILLIHERTZ) && 172 (freqRange[1] >= TEST_FREQUENCY_MILLIHERTZ)); 173 int freq = mEqualizer.getCenterFreq(band); 174 assertTrue(msg + ": getCenterFreq failed", 175 (freqRange[0] <= freq) && (freqRange[1] >= freq)); 176 result = true; 177 } catch (IllegalArgumentException e) { 178 msg = msg.concat(": Bad parameter value"); 179 loge(msg, "Bad parameter value"); 180 } catch (UnsupportedOperationException e) { 181 msg = msg.concat(": get parameter() rejected"); 182 loge(msg, "get parameter() rejected"); 183 } catch (IllegalStateException e) { 184 msg = msg.concat("get parameter() called in wrong state"); 185 loge(msg, "get parameter() called in wrong state"); 186 } finally { 187 releaseEqualizer(); 188 } 189 assertTrue(msg, result); 190 } 191 192 //Test case 1.2: test presets 193 @LargeTest 194 public void test1_2Presets() throws Exception { 195 boolean result = false; 196 String msg = "test1_2Presets()"; 197 getEqualizer(0); 198 try { 199 short numPresets = mEqualizer.getNumberOfPresets(); 200 assertTrue(msg + ": getNumberOfPresets failed", numPresets >= MIN_NUMBER_OF_PRESETS); 201 mEqualizer.usePreset((short)(numPresets - 1)); 202 short preset = mEqualizer.getCurrentPreset(); 203 assertEquals(msg + ": usePreset failed", preset, (short)(numPresets - 1)); 204 String name = mEqualizer.getPresetName(preset); 205 assertNotNull(msg + ": getPresetName failed", name); 206 result = true; 207 } catch (IllegalArgumentException e) { 208 msg = msg.concat(": Bad parameter value"); 209 loge(msg, "Bad parameter value"); 210 } catch (UnsupportedOperationException e) { 211 msg = msg.concat(": get parameter() rejected"); 212 loge(msg, "get parameter() rejected"); 213 } catch (IllegalStateException e) { 214 msg = msg.concat("get parameter() called in wrong state"); 215 loge(msg, "get parameter() called in wrong state"); 216 } finally { 217 releaseEqualizer(); 218 } 219 assertTrue(msg, result); 220 } 221 222 //Test case 1.3: test properties 223 @LargeTest 224 public void test1_3Properties() throws Exception { 225 boolean result = false; 226 String msg = "test1_3Properties()"; 227 getEqualizer(0); 228 try { 229 Equalizer.Settings settings = mEqualizer.getProperties(); 230 String str = settings.toString(); 231 settings = new Equalizer.Settings(str); 232 mEqualizer.setProperties(settings); 233 result = true; 234 } catch (IllegalArgumentException e) { 235 msg = msg.concat(": Bad parameter value"); 236 loge(msg, "Bad parameter value"); 237 } catch (UnsupportedOperationException e) { 238 msg = msg.concat(": get parameter() rejected"); 239 loge(msg, "get parameter() rejected"); 240 } catch (IllegalStateException e) { 241 msg = msg.concat("get parameter() called in wrong state"); 242 loge(msg, "get parameter() called in wrong state"); 243 } finally { 244 releaseEqualizer(); 245 } 246 assertTrue(msg, result); 247 } 248 249 //----------------------------------------------------------------- 250 // 2 - Effect action 251 //---------------------------------- 252 253 //Test case 2.0: test that the equalizer actually alters the sound 254 @LargeTest 255 public void test2_0SoundModification() throws Exception { 256 boolean result = false; 257 String msg = "test2_0SoundModification()"; 258 EnergyProbe probe = null; 259 AudioEffect vc = null; 260 MediaPlayer mp = null; 261 AudioManager am = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE); 262 int volume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 263 am.setStreamVolume(AudioManager.STREAM_MUSIC, 264 TEST_VOLUME, 265 0); 266 try { 267 probe = new EnergyProbe(0); 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 getEqualizer(mp.getAudioSessionId()); 281 mp.prepare(); 282 mp.start(); 283 Thread.sleep(500); 284 // measure reference energy around 1kHz 285 int refEnergy = probe.capture(1000); 286 short band = mEqualizer.getBand(1000000); 287 short[] levelRange = mEqualizer.getBandLevelRange(); 288 mEqualizer.setBandLevel(band, levelRange[0]); 289 mEqualizer.setEnabled(true); 290 Thread.sleep(500); 291 // measure energy around 1kHz with band level at min 292 int energy = probe.capture(1000); 293 assertTrue(msg + ": equalizer has no effect at 1kHz", energy < refEnergy/4); 294 result = true; 295 } catch (IllegalArgumentException e) { 296 msg = msg.concat(": Bad parameter value"); 297 loge(msg, "Bad parameter value"); 298 } catch (UnsupportedOperationException e) { 299 msg = msg.concat(": get parameter() rejected"); 300 loge(msg, "get parameter() rejected"); 301 } catch (IllegalStateException e) { 302 msg = msg.concat("get parameter() called in wrong state"); 303 loge(msg, "get parameter() called in wrong state"); 304 } catch (InterruptedException e) { 305 loge(msg, "sleep() interrupted"); 306 } 307 finally { 308 releaseEqualizer(); 309 if (mp != null) { 310 mp.release(); 311 } 312 if (vc != null) { 313 vc.release(); 314 } 315 if (probe != null) { 316 probe.release(); 317 } 318 am.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0); 319 } 320 assertTrue(msg, result); 321 } 322 323 //----------------------------------------------------------------- 324 // private methods 325 //---------------------------------- 326 327 private void getEqualizer(int session) { 328 if (mEqualizer == null || session != mSession) { 329 if (session != mSession && mEqualizer != null) { 330 mEqualizer.release(); 331 mEqualizer = null; 332 } 333 try { 334 mEqualizer = new Equalizer(0, session); 335 mSession = session; 336 } catch (IllegalArgumentException e) { 337 Log.e(TAG, "getEqualizer() Equalizer not found exception: "+e); 338 } catch (UnsupportedOperationException e) { 339 Log.e(TAG, "getEqualizer() Effect library not loaded exception: "+e); 340 } 341 } 342 assertNotNull("could not create mEqualizer", mEqualizer); 343 } 344 345 private void releaseEqualizer() { 346 if (mEqualizer != null) { 347 mEqualizer.release(); 348 mEqualizer = null; 349 } 350 } 351 352} 353