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