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.audio; 18 19 import com.android.mediaframeworktest.MediaFrameworkTest; 20 import com.android.mediaframeworktest.MediaNames; 21 import android.content.res.AssetFileDescriptor; 22 import android.media.audiofx.AudioEffect; 23 import android.media.AudioFormat; 24 import android.media.AudioManager; 25 import android.media.AudioTrack; 26 import android.media.AudioRecord; 27 import android.media.audiofx.EnvironmentalReverb; 28 import android.media.audiofx.Equalizer; 29 import android.media.MediaPlayer; 30 import android.media.MediaRecorder; 31 32 import android.os.Looper; 33 import android.test.suitebuilder.annotation.LargeTest; 34 import android.test.suitebuilder.annotation.MediumTest; 35 import android.test.suitebuilder.annotation.Suppress; 36 import android.test.ActivityInstrumentationTestCase2; 37 import android.util.Log; 38 39 import java.nio.ByteOrder; 40 import java.nio.ByteBuffer; 41 import java.util.UUID; 42 43 /** 44 * Junit / Instrumentation test case for the media AudioTrack api 45 46 */ 47 public class MediaAudioEffectTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 48 private String TAG = "MediaAudioEffectTest"; 49 50 private AudioEffect mEffect = null; 51 private boolean mHasControl = false; 52 private boolean mIsEnabled = false; 53 private int mParameterChanged = -1; 54 private MediaPlayer mMediaPlayer = null; 55 private boolean mInitialized = false; 56 private Looper mLooper = null; 57 private int mError = 0; 58 private final Object lock = new Object(); 59 private final static int SAMPLING_RATE = 44100; 60 61 public MediaAudioEffectTest() { 62 super("com.android.mediaframeworktest", MediaFrameworkTest.class); 63 } 64 65 @Override 66 protected void setUp() throws Exception { 67 super.setUp(); 68 } 69 70 @Override 71 protected void tearDown() throws Exception { 72 super.tearDown(); 73 } 74 75 private static void assumeTrue(String message, boolean cond) { 76 assertTrue("(assume)"+message, cond); 77 } 78 79 private void log(String testName, String message) { 80 Log.v(TAG, "["+testName+"] "+message); 81 } 82 83 private void loge(String testName, String message) { 84 Log.e(TAG, "["+testName+"] "+message); 85 } 86 87 //----------------------------------------------------------------- 88 // AUDIOEFFECT TESTS: 89 //---------------------------------- 90 91 //----------------------------------------------------------------- 92 // 0 - static methods 93 //---------------------------------- 94 95 //Test case 0.0: test queryEffects() and available effects 96 @LargeTest 97 public void test0_0QueryEffects() throws Exception { 98 99 AudioEffect.Descriptor[] desc = AudioEffect.queryEffects(); 100 101 assertTrue("test0_0QueryEffects: number of effects < 4: "+desc.length, (desc.length >= 4)); 102 103 boolean hasEQ = false; 104 boolean hasBassBoost = false; 105 boolean hasVirtualizer = false; 106 boolean hasEnvReverb = false; 107 108 for (int i = 0; i < desc.length; i++) { 109 if (desc[i].type.equals(AudioEffect.EFFECT_TYPE_EQUALIZER)) { 110 hasEQ = true; 111 } if (desc[i].type.equals(AudioEffect.EFFECT_TYPE_BASS_BOOST)) { 112 hasBassBoost = true; 113 } else if (desc[i].type.equals(AudioEffect.EFFECT_TYPE_VIRTUALIZER)) { 114 hasVirtualizer = true; 115 } 116 else if (desc[i].type.equals(AudioEffect.EFFECT_TYPE_ENV_REVERB)) { 117 hasEnvReverb = true; 118 } 119 } 120 assertTrue("test0_0QueryEffects: equalizer not found", hasEQ); 121 assertTrue("test0_0QueryEffects: bass boost not found", hasBassBoost); 122 assertTrue("test0_0QueryEffects: virtualizer not found", hasVirtualizer); 123 assertTrue("test0_0QueryEffects: environmental reverb not found", hasEnvReverb); 124 } 125 126 //----------------------------------------------------------------- 127 // 1 - constructor 128 //---------------------------------- 129 130 private AudioRecord getAudioRecord() { 131 AudioRecord ar = null; 132 try { 133 ar = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, 134 SAMPLING_RATE, 135 AudioFormat.CHANNEL_CONFIGURATION_MONO, 136 AudioFormat.ENCODING_PCM_16BIT, 137 AudioRecord.getMinBufferSize(SAMPLING_RATE, 138 AudioFormat.CHANNEL_CONFIGURATION_MONO, 139 AudioFormat.ENCODING_PCM_16BIT) * 10); 140 assertNotNull("Could not create AudioRecord", ar); 141 assertEquals("AudioRecord not initialized", 142 AudioRecord.STATE_INITIALIZED, ar.getState()); 143 } catch (IllegalArgumentException e) { 144 fail("AudioRecord invalid parameter"); 145 } 146 return ar; 147 } 148 149 //Test case 1.0: test constructor from effect type and get effect ID 150 @LargeTest 151 public void test1_0ConstructorFromType() throws Exception { 152 boolean result = true; 153 String msg = "test1_0ConstructorFromType()"; 154 AudioEffect.Descriptor[] desc = AudioEffect.queryEffects(); 155 assertTrue(msg+": no effects found", (desc.length != 0)); 156 try { 157 int sessionId; 158 AudioRecord ar = null; 159 if (AudioEffect.EFFECT_PRE_PROCESSING.equals(desc[0].connectMode)) { 160 ar = getAudioRecord(); 161 sessionId = ar.getAudioSessionId(); 162 } else { 163 sessionId = 0; 164 } 165 166 AudioEffect effect = new AudioEffect(desc[0].type, 167 AudioEffect.EFFECT_TYPE_NULL, 168 0, 169 sessionId); 170 assertNotNull(msg + ": could not create AudioEffect", effect); 171 try { 172 assertTrue(msg +": invalid effect ID", (effect.getId() != 0)); 173 } catch (IllegalStateException e) { 174 msg = msg.concat(": AudioEffect not initialized"); 175 result = false; 176 } finally { 177 effect.release(); 178 if (ar != null) { 179 ar.release(); 180 } 181 } 182 } catch (IllegalArgumentException e) { 183 msg = msg.concat(": Effect not found: "+desc[0].name); 184 result = false; 185 } catch (UnsupportedOperationException e) { 186 msg = msg.concat(": Effect library not loaded"); 187 result = false; 188 } 189 assertTrue(msg, result); 190 } 191 192 //Test case 1.1: test constructor from effect uuid 193 @LargeTest 194 public void test1_1ConstructorFromUuid() throws Exception { 195 boolean result = true; 196 String msg = "test1_1ConstructorFromUuid()"; 197 AudioEffect.Descriptor[] desc = AudioEffect.queryEffects(); 198 assertTrue(msg+"no effects found", (desc.length != 0)); 199 try { 200 int sessionId; 201 AudioRecord ar = null; 202 if (AudioEffect.EFFECT_PRE_PROCESSING.equals(desc[0].connectMode)) { 203 ar = getAudioRecord(); 204 sessionId = ar.getAudioSessionId(); 205 } else { 206 sessionId = 0; 207 } 208 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_NULL, 209 desc[0].uuid, 210 0, 211 sessionId); 212 assertNotNull(msg + ": could not create AudioEffect", effect); 213 effect.release(); 214 if (ar != null) { 215 ar.release(); 216 } 217 } catch (IllegalArgumentException e) { 218 msg = msg.concat(": Effect not found: "+desc[0].name); 219 result = false; 220 } catch (UnsupportedOperationException e) { 221 msg = msg.concat(": Effect library not loaded"); 222 result = false; 223 } 224 assertTrue(msg, result); 225 } 226 227 //Test case 1.2: test constructor failure from unknown type 228 @LargeTest 229 public void test1_2ConstructorUnknownType() throws Exception { 230 boolean result = false; 231 String msg = "test1_2ConstructorUnknownType()"; 232 233 try { 234 AudioEffect effect = new AudioEffect(UUID.randomUUID(), 235 AudioEffect.EFFECT_TYPE_NULL, 236 0, 237 0); 238 msg = msg.concat(": could create random AudioEffect"); 239 if (effect != null) { 240 effect.release(); 241 } 242 } catch (IllegalArgumentException e) { 243 result = true; 244 } catch (UnsupportedOperationException e) { 245 msg = msg.concat(": Effect library not loaded"); 246 } 247 assertTrue(msg, result); 248 } 249 250 //Test case 1.3: test getEnabled() failure when called on released effect 251 @LargeTest 252 public void test1_3GetEnabledAfterRelease() throws Exception { 253 boolean result = false; 254 String msg = "test1_3GetEnabledAfterRelease()"; 255 256 try { 257 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 258 AudioEffect.EFFECT_TYPE_NULL, 259 0, 260 0); 261 assertNotNull(msg + ": could not create AudioEffect", effect); 262 effect.release(); 263 try { 264 effect.getEnabled(); 265 } catch (IllegalStateException e) { 266 result = true; 267 } 268 } catch (IllegalArgumentException e) { 269 msg = msg.concat(": Equalizer not found"); 270 } catch (UnsupportedOperationException e) { 271 msg = msg.concat(": Effect library not loaded"); 272 } 273 assertTrue(msg, result); 274 } 275 276 //Test case 1.4: test contructor on mediaPlayer audio session 277 @LargeTest 278 public void test1_4InsertOnMediaPlayer() throws Exception { 279 boolean result = false; 280 String msg = "test1_4InsertOnMediaPlayer()"; 281 282 try { 283 MediaPlayer mp = new MediaPlayer(); 284 mp.setDataSource(MediaNames.SHORTMP3); 285 286 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 287 AudioEffect.EFFECT_TYPE_NULL, 288 0, 289 mp.getAudioSessionId()); 290 assertNotNull(msg + ": could not create AudioEffect", effect); 291 try { 292 loge(msg, ": effect.setEnabled"); 293 effect.setEnabled(true); 294 } catch (IllegalStateException e) { 295 msg = msg.concat(": AudioEffect not initialized"); 296 } 297 298 result = true; 299 effect.release(); 300 mp.release(); 301 } catch (IllegalArgumentException e) { 302 msg = msg.concat(": Equalizer not found"); 303 loge(msg, ": Equalizer not found"); 304 } catch (UnsupportedOperationException e) { 305 msg = msg.concat(": Effect library not loaded"); 306 loge(msg, ": Effect library not loaded"); 307 } catch (Exception e){ 308 loge(msg, "Could not create media player:" + e); 309 } 310 assertTrue(msg, result); 311 } 312 313 //Test case 1.5: test auxiliary effect attachement on MediaPlayer 314 @LargeTest 315 public void test1_5AuxiliaryOnMediaPlayer() throws Exception { 316 boolean result = false; 317 String msg = "test1_5AuxiliaryOnMediaPlayer()"; 318 319 try { 320 MediaPlayer mp = new MediaPlayer(); 321 mp.setDataSource(MediaNames.SHORTMP3); 322 323 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 324 AudioEffect.EFFECT_TYPE_NULL, 325 0, 326 0); 327 assertNotNull(msg + ": could not create AudioEffect", effect); 328 mp.attachAuxEffect(effect.getId()); 329 mp.setAuxEffectSendLevel(1.0f); 330 result = true; 331 effect.release(); 332 mp.release(); 333 } catch (IllegalArgumentException e) { 334 msg = msg.concat(": Equalizer not found"); 335 loge(msg, ": Equalizer not found"); 336 } catch (UnsupportedOperationException e) { 337 msg = msg.concat(": Effect library not loaded"); 338 loge(msg, ": Effect library not loaded"); 339 } catch (Exception e){ 340 loge(msg, "Could not create media player:" + e); 341 } 342 assertTrue(msg, result); 343 } 344 345 //Test case 1.6: test auxiliary effect attachement failure before setDatasource 346 @LargeTest 347 public void test1_6AuxiliaryOnMediaPlayerFailure() throws Exception { 348 boolean result = false; 349 String msg = "test1_6AuxiliaryOnMediaPlayerFailure()"; 350 351 try { 352 createMediaPlayerLooper(); 353 synchronized(lock) { 354 try { 355 lock.wait(1000); 356 } catch(Exception e) { 357 Log.e(TAG, "Looper creation: wait was interrupted."); 358 } 359 } 360 assertTrue(mInitialized); // mMediaPlayer has been initialized? 361 mError = 0; 362 363 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 364 AudioEffect.EFFECT_TYPE_NULL, 365 0, 366 0); 367 assertNotNull(msg + ": could not create AudioEffect", effect); 368 synchronized(lock) { 369 try { 370 mMediaPlayer.attachAuxEffect(effect.getId()); 371 lock.wait(1000); 372 } catch(Exception e) { 373 Log.e(TAG, "Attach effect: wait was interrupted."); 374 } 375 } 376 assertTrue(msg + ": no error on attachAuxEffect", mError != 0); 377 result = true; 378 effect.release(); 379 terminateMediaPlayerLooper(); 380 } catch (IllegalArgumentException e) { 381 msg = msg.concat(": Equalizer not found"); 382 loge(msg, ": Equalizer not found"); 383 } catch (UnsupportedOperationException e) { 384 msg = msg.concat(": Effect library not loaded"); 385 loge(msg, ": Effect library not loaded"); 386 } catch (Exception e){ 387 loge(msg, "Could not create media player:" + e); 388 } 389 assertTrue(msg, result); 390 } 391 392 393 //Test case 1.7: test auxiliary effect attachement on AudioTrack 394 @LargeTest 395 public void test1_7AuxiliaryOnAudioTrack() throws Exception { 396 boolean result = false; 397 String msg = "test1_7AuxiliaryOnAudioTrack()"; 398 399 try { 400 AudioTrack track = new AudioTrack( 401 AudioManager.STREAM_MUSIC, 402 44100, 403 AudioFormat.CHANNEL_OUT_MONO, 404 AudioFormat.ENCODING_PCM_16BIT, 405 AudioTrack.getMinBufferSize(44100, 406 AudioFormat.CHANNEL_OUT_MONO, 407 AudioFormat.ENCODING_PCM_16BIT), 408 AudioTrack.MODE_STREAM); 409 assertNotNull(msg + ": could not create AudioTrack", track); 410 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 411 AudioEffect.EFFECT_TYPE_NULL, 412 0, 413 0); 414 415 track.attachAuxEffect(effect.getId()); 416 track.setAuxEffectSendLevel(1.0f); 417 result = true; 418 effect.release(); 419 track.release(); 420 } catch (IllegalArgumentException e) { 421 msg = msg.concat(": Equalizer not found"); 422 loge(msg, ": Equalizer not found"); 423 } catch (UnsupportedOperationException e) { 424 msg = msg.concat(": Effect library not loaded"); 425 loge(msg, ": Effect library not loaded"); 426 } 427 assertTrue(msg, result); 428 } 429 430 //----------------------------------------------------------------- 431 // 2 - enable/ disable 432 //---------------------------------- 433 434 435 //Test case 2.0: test setEnabled() and getEnabled() in valid state 436 @LargeTest 437 public void test2_0SetEnabledGetEnabled() throws Exception { 438 boolean result = false; 439 String msg = "test2_0SetEnabledGetEnabled()"; 440 441 try { 442 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 443 AudioEffect.EFFECT_TYPE_NULL, 444 0, 445 0); 446 assertNotNull(msg + ": could not create AudioEffect", effect); 447 try { 448 effect.setEnabled(true); 449 assertTrue(msg + ": invalid state from getEnabled", effect.getEnabled()); 450 effect.setEnabled(false); 451 assertFalse(msg + ": invalid state to getEnabled", effect.getEnabled()); 452 result = true; 453 } catch (IllegalStateException e) { 454 msg = msg.concat(": setEnabled() in wrong state"); 455 } finally { 456 effect.release(); 457 } 458 } catch (IllegalArgumentException e) { 459 msg = msg.concat(": Equalizer not found"); 460 loge(msg, ": Equalizer not found"); 461 } catch (UnsupportedOperationException e) { 462 msg = msg.concat(": Effect library not loaded"); 463 loge(msg, ": Effect library not loaded"); 464 } 465 assertTrue(msg, result); 466 } 467 468 //Test case 2.1: test setEnabled() throws exception after release 469 @LargeTest 470 public void test2_1SetEnabledAfterRelease() throws Exception { 471 boolean result = false; 472 String msg = "test2_1SetEnabledAfterRelease()"; 473 474 try { 475 AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 476 AudioEffect.EFFECT_TYPE_NULL, 477 0, 478 0); 479 assertNotNull(msg + ": could not create AudioEffect", effect); 480 effect.release(); 481 try { 482 effect.setEnabled(true); 483 } catch (IllegalStateException e) { 484 result = true; 485 } 486 } catch (IllegalArgumentException e) { 487 msg = msg.concat(": Equalizer not found"); 488 loge(msg, ": Equalizer not found"); 489 } catch (UnsupportedOperationException e) { 490 msg = msg.concat(": Effect library not loaded"); 491 loge(msg, ": Effect library not loaded"); 492 } 493 assertTrue(msg, result); 494 } 495 496 //----------------------------------------------------------------- 497 // 3 - set parameters 498 //---------------------------------- 499 500 //Test case 3.0: test setParameter(byte[], byte[]) 501 @LargeTest 502 public void test3_0SetParameterByteArrayByteArray() throws Exception { 503 boolean result = false; 504 String msg = "test3_0SetParameterByteArrayByteArray()"; 505 AudioEffect effect = null; 506 try { 507 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 508 AudioEffect.EFFECT_TYPE_NULL, 509 0, 510 0); 511 assertNotNull(msg + ": could not create AudioEffect", effect); 512 byte[] param = intToByteArray(Equalizer.PARAM_CURRENT_PRESET); 513 byte[] value = shortToByteArray((short)0); 514 if (effect.setParameter(param, value) == AudioEffect.SUCCESS) { 515 result = true; 516 } 517 } catch (IllegalArgumentException e) { 518 msg = msg.concat(": Bad parameter value"); 519 loge(msg, "Bad parameter value"); 520 } catch (UnsupportedOperationException e) { 521 msg = msg.concat(": setParameter() rejected"); 522 loge(msg, "setParameter() rejected"); 523 } catch (IllegalStateException e) { 524 msg = msg.concat("setParameter() called in wrong state"); 525 loge(msg, "setParameter() called in wrong state"); 526 } finally { 527 if (effect != null) { 528 effect.release(); 529 } 530 } 531 assertTrue(msg, result); 532 } 533 534 //Test case 3.1: test setParameter(int, int) 535 @LargeTest 536 public void test3_1SetParameterIntInt() throws Exception { 537 boolean result = false; 538 String msg = "test3_1SetParameterIntInt()"; 539 AudioEffect effect = null; 540 try { 541 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 542 AudioEffect.EFFECT_TYPE_NULL, 543 0, 544 0); 545 assertNotNull(msg + ": could not create AudioEffect", effect); 546 if (effect.setParameter(EnvironmentalReverb.PARAM_DECAY_TIME, 0) 547 == AudioEffect.SUCCESS) { 548 result = true; 549 } 550 } catch (IllegalArgumentException e) { 551 msg = msg.concat(": Bad parameter value"); 552 loge(msg, "Bad parameter value"); 553 } catch (UnsupportedOperationException e) { 554 msg = msg.concat(": setParameter() rejected"); 555 loge(msg, "setParameter() rejected"); 556 } catch (IllegalStateException e) { 557 msg = msg.concat("setParameter() called in wrong state"); 558 loge(msg, "setParameter() called in wrong state"); 559 } finally { 560 if (effect != null) { 561 effect.release(); 562 } 563 } 564 assertTrue(msg, result); 565 } 566 567 //Test case 3.2: test setParameter(int, short) 568 @LargeTest 569 public void test3_2SetParameterIntShort() throws Exception { 570 boolean result = false; 571 String msg = "test3_2SetParameterIntShort()"; 572 AudioEffect effect = null; 573 try { 574 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 575 AudioEffect.EFFECT_TYPE_NULL, 576 0, 577 0); 578 assertNotNull(msg + ": could not create AudioEffect", effect); 579 if (effect.setParameter(Equalizer.PARAM_CURRENT_PRESET, (short)0) 580 == AudioEffect.SUCCESS) { 581 result = true; 582 } 583 } catch (IllegalArgumentException e) { 584 msg = msg.concat(": Bad parameter value"); 585 loge(msg, "Bad parameter value"); 586 } catch (UnsupportedOperationException e) { 587 msg = msg.concat(": setParameter() rejected"); 588 loge(msg, "setParameter() rejected"); 589 } catch (IllegalStateException e) { 590 msg = msg.concat("setParameter() called in wrong state"); 591 loge(msg, "setParameter() called in wrong state"); 592 } finally { 593 if (effect != null) { 594 effect.release(); 595 } 596 } 597 assertTrue(msg, result); 598 } 599 600 //Test case 3.3: test setParameter(int, byte[]) 601 @LargeTest 602 public void test3_3SetParameterIntByteArray() throws Exception { 603 boolean result = false; 604 String msg = "test3_3SetParameterIntByteArray()"; 605 AudioEffect effect = null; 606 try { 607 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 608 AudioEffect.EFFECT_TYPE_NULL, 609 0, 610 0); 611 assertNotNull(msg + ": could not create AudioEffect", effect); 612 byte[] value = shortToByteArray((short)0); 613 if (effect.setParameter(Equalizer.PARAM_CURRENT_PRESET, value) 614 == AudioEffect.SUCCESS) { 615 result = true; 616 } 617 } catch (IllegalArgumentException e) { 618 msg = msg.concat(": Bad parameter value"); 619 loge(msg, "Bad parameter value"); 620 } catch (UnsupportedOperationException e) { 621 msg = msg.concat(": setParameter() rejected"); 622 loge(msg, "setParameter() rejected"); 623 } catch (IllegalStateException e) { 624 msg = msg.concat("setParameter() called in wrong state"); 625 loge(msg, "setParameter() called in wrong state"); 626 } finally { 627 if (effect != null) { 628 effect.release(); 629 } 630 } 631 assertTrue(msg, result); 632 } 633 634 //Test case 3.4: test setParameter(int[], int[]) 635 @LargeTest 636 public void test3_4SetParameterIntArrayIntArray() throws Exception { 637 boolean result = false; 638 String msg = "test3_4SetParameterIntArrayIntArray()"; 639 AudioEffect effect = null; 640 try { 641 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 642 AudioEffect.EFFECT_TYPE_NULL, 643 0, 644 0); 645 assertNotNull(msg + ": could not create AudioEffect", effect); 646 int[] param = new int[1]; 647 int[] value = new int[1]; 648 param[0] = EnvironmentalReverb.PARAM_DECAY_TIME; 649 value[0] = 0; 650 if (effect.setParameter(param, value) 651 == AudioEffect.SUCCESS) { 652 result = true; 653 } 654 } catch (IllegalArgumentException e) { 655 msg = msg.concat(": Bad parameter value"); 656 loge(msg, "Bad parameter value"); 657 } catch (UnsupportedOperationException e) { 658 msg = msg.concat(": setParameter() rejected"); 659 loge(msg, "setParameter() rejected"); 660 } catch (IllegalStateException e) { 661 msg = msg.concat("setParameter() called in wrong state"); 662 loge(msg, "setParameter() called in wrong state"); 663 } finally { 664 if (effect != null) { 665 effect.release(); 666 } 667 } 668 assertTrue(msg, result); 669 } 670 671 //Test case 3.5: test setParameter(int[], short[]) 672 @LargeTest 673 public void test3_5SetParameterIntArrayShortArray() throws Exception { 674 boolean result = false; 675 String msg = "test3_5SetParameterIntArrayShortArray()"; 676 AudioEffect effect = null; 677 try { 678 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 679 AudioEffect.EFFECT_TYPE_NULL, 680 0, 681 0); 682 assertNotNull(msg + ": could not create AudioEffect", effect); 683 int[] param = new int[1]; 684 short[] value = new short[1]; 685 param[0] = Equalizer.PARAM_CURRENT_PRESET; 686 value[0] = (short)0; 687 if (effect.setParameter(param, value) 688 == AudioEffect.SUCCESS) { 689 result = true; 690 } 691 } catch (IllegalArgumentException e) { 692 msg = msg.concat(": Bad parameter value"); 693 loge(msg, "Bad parameter value"); 694 } catch (UnsupportedOperationException e) { 695 msg = msg.concat(": setParameter() rejected"); 696 loge(msg, "setParameter() rejected"); 697 } catch (IllegalStateException e) { 698 msg = msg.concat("setParameter() called in wrong state"); 699 loge(msg, "setParameter() called in wrong state"); 700 } finally { 701 if (effect != null) { 702 effect.release(); 703 } 704 } 705 assertTrue(msg, result); 706 } 707 708 //Test case 3.6: test setParameter(int[], byte[]) 709 @LargeTest 710 public void test3_6SetParameterIntArrayByteArray() throws Exception { 711 boolean result = false; 712 String msg = "test3_6SetParameterIntArrayByteArray()"; 713 AudioEffect effect = null; 714 try { 715 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 716 AudioEffect.EFFECT_TYPE_NULL, 717 0, 718 0); 719 assertNotNull(msg + ": could not create AudioEffect", effect); 720 int[] param = new int[1]; 721 byte[] value = shortToByteArray((short)0); 722 param[0] = Equalizer.PARAM_CURRENT_PRESET; 723 if (effect.setParameter(param, value) 724 == AudioEffect.SUCCESS) { 725 result = true; 726 } 727 } catch (IllegalArgumentException e) { 728 msg = msg.concat(": Bad parameter value"); 729 loge(msg, "Bad parameter value"); 730 } catch (UnsupportedOperationException e) { 731 msg = msg.concat(": setParameter() rejected"); 732 loge(msg, "setParameter() rejected"); 733 } catch (IllegalStateException e) { 734 msg = msg.concat("setParameter() called in wrong state"); 735 loge(msg, "setParameter() called in wrong state"); 736 } finally { 737 if (effect != null) { 738 effect.release(); 739 } 740 } 741 assertTrue(msg, result); 742 } 743 744 //Test case 3.7: test setParameter() throws exception after release() 745 @LargeTest 746 public void test3_7SetParameterAfterRelease() throws Exception { 747 boolean result = false; 748 String msg = "test3_7SetParameterAfterRelease()"; 749 AudioEffect effect = null; 750 try { 751 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 752 AudioEffect.EFFECT_TYPE_NULL, 753 0, 754 0); 755 assertNotNull(msg + ": could not create AudioEffect", effect); 756 effect.release(); 757 effect.setParameter(Equalizer.PARAM_CURRENT_PRESET, (short)0); 758 } catch (IllegalArgumentException e) { 759 msg = msg.concat(": Bad parameter value"); 760 loge(msg, "Bad parameter value"); 761 } catch (UnsupportedOperationException e) { 762 msg = msg.concat(": setParameter() rejected"); 763 loge(msg, "setParameter() rejected"); 764 } catch (IllegalStateException e) { 765 result = true; 766 } finally { 767 if (effect != null) { 768 effect.release(); 769 } 770 } 771 assertTrue(msg, result); 772 } 773 774 //----------------------------------------------------------------- 775 // 4 - get parameters 776 //---------------------------------- 777 778 //Test case 4.0: test getParameter(byte[], byte[]) 779 @LargeTest 780 public void test4_0GetParameterByteArrayByteArray() throws Exception { 781 boolean result = false; 782 String msg = "test4_0GetParameterByteArrayByteArray()"; 783 AudioEffect effect = null; 784 try { 785 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 786 AudioEffect.EFFECT_TYPE_NULL, 787 0, 788 0); 789 assertNotNull(msg + ": could not create AudioEffect", effect); 790 byte[] param = intToByteArray(Equalizer.PARAM_CURRENT_PRESET); 791 byte[] value = new byte[2]; 792 if (!AudioEffect.isError(effect.getParameter(param, value))) { 793 result = true; 794 } 795 } catch (IllegalArgumentException e) { 796 msg = msg.concat(": Bad parameter value"); 797 loge(msg, "Bad parameter value"); 798 } catch (UnsupportedOperationException e) { 799 msg = msg.concat(": getParameter() rejected"); 800 loge(msg, "getParameter() rejected"); 801 } catch (IllegalStateException e) { 802 msg = msg.concat("getParameter() called in wrong state"); 803 loge(msg, "getParameter() called in wrong state"); 804 } finally { 805 if (effect != null) { 806 effect.release(); 807 } 808 } 809 assertTrue(msg, result); 810 } 811 812 //Test case 4.1: test getParameter(int, int[]) 813 @LargeTest 814 public void test4_1GetParameterIntIntArray() throws Exception { 815 boolean result = false; 816 String msg = "test4_1GetParameterIntIntArray()"; 817 AudioEffect effect = null; 818 try { 819 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 820 AudioEffect.EFFECT_TYPE_NULL, 821 0, 822 0); 823 assertNotNull(msg + ": could not create AudioEffect", effect); 824 int[] value = new int[1]; 825 if (!AudioEffect.isError( 826 effect.getParameter(EnvironmentalReverb.PARAM_DECAY_TIME, value))) { 827 result = true; 828 } 829 } catch (IllegalArgumentException e) { 830 msg = msg.concat(": Bad parameter value"); 831 loge(msg, "Bad parameter value"); 832 } catch (UnsupportedOperationException e) { 833 msg = msg.concat(": getParameter() rejected"); 834 loge(msg, "getParameter() rejected"); 835 } catch (IllegalStateException e) { 836 msg = msg.concat("getParameter() called in wrong state"); 837 loge(msg, "getParameter() called in wrong state"); 838 } finally { 839 if (effect != null) { 840 effect.release(); 841 } 842 } 843 assertTrue(msg, result); 844 } 845 846 //Test case 4.2: test getParameter(int, short[]) 847 @LargeTest 848 public void test4_2GetParameterIntShortArray() throws Exception { 849 boolean result = false; 850 String msg = "test4_2GetParameterIntShortArray()"; 851 AudioEffect effect = null; 852 try { 853 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 854 AudioEffect.EFFECT_TYPE_NULL, 855 0, 856 0); 857 assertNotNull(msg + ": could not create AudioEffect", effect); 858 short[] value = new short[1]; 859 if (!AudioEffect.isError(effect.getParameter(Equalizer.PARAM_CURRENT_PRESET, value))) { 860 result = true; 861 } 862 } catch (IllegalArgumentException e) { 863 msg = msg.concat(": Bad parameter value"); 864 loge(msg, "Bad parameter value"); 865 } catch (UnsupportedOperationException e) { 866 msg = msg.concat(": getParameter() rejected"); 867 loge(msg, "getParameter() rejected"); 868 } catch (IllegalStateException e) { 869 msg = msg.concat("getParameter() called in wrong state"); 870 loge(msg, "getParameter() called in wrong state"); 871 } finally { 872 if (effect != null) { 873 effect.release(); 874 } 875 } 876 assertTrue(msg, result); 877 } 878 879 //Test case 4.3: test getParameter(int, byte[]) 880 @LargeTest 881 public void test4_3GetParameterIntByteArray() throws Exception { 882 boolean result = false; 883 String msg = "test4_3GetParameterIntByteArray()"; 884 AudioEffect effect = null; 885 try { 886 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 887 AudioEffect.EFFECT_TYPE_NULL, 888 0, 889 0); 890 assertNotNull(msg + ": could not create AudioEffect", effect); 891 byte[] value = new byte[2]; 892 if (!AudioEffect.isError(effect.getParameter(Equalizer.PARAM_CURRENT_PRESET, value))) { 893 result = true; 894 } 895 } catch (IllegalArgumentException e) { 896 msg = msg.concat(": Bad parameter value"); 897 loge(msg, "Bad parameter value"); 898 } catch (UnsupportedOperationException e) { 899 msg = msg.concat(": getParameter() rejected"); 900 loge(msg, "getParameter() rejected"); 901 } catch (IllegalStateException e) { 902 msg = msg.concat("getParameter() called in wrong state"); 903 loge(msg, "getParameter() called in wrong state"); 904 } finally { 905 if (effect != null) { 906 effect.release(); 907 } 908 } 909 assertTrue(msg, result); 910 } 911 912 //Test case 4.4: test getParameter(int[], int[]) 913 @LargeTest 914 public void test4_4GetParameterIntArrayIntArray() throws Exception { 915 boolean result = false; 916 String msg = "test4_4GetParameterIntArrayIntArray()"; 917 AudioEffect effect = null; 918 try { 919 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_ENV_REVERB, 920 AudioEffect.EFFECT_TYPE_NULL, 921 0, 922 0); 923 assertNotNull(msg + ": could not create AudioEffect", effect); 924 int[] param = new int[1]; 925 int[] value = new int[1]; 926 param[0] = EnvironmentalReverb.PARAM_DECAY_TIME; 927 if (!AudioEffect.isError(effect.getParameter(param, value))) { 928 result = true; 929 } 930 } catch (IllegalArgumentException e) { 931 msg = msg.concat(": Bad parameter value"); 932 loge(msg, "Bad parameter value"); 933 } catch (UnsupportedOperationException e) { 934 msg = msg.concat(": getParameter() rejected"); 935 loge(msg, "getParameter() rejected"); 936 } catch (IllegalStateException e) { 937 msg = msg.concat("getParameter() called in wrong state"); 938 loge(msg, "getParameter() called in wrong state"); 939 } finally { 940 if (effect != null) { 941 effect.release(); 942 } 943 } 944 assertTrue(msg, result); 945 } 946 947 //Test case 4.5: test getParameter(int[], short[]) 948 @LargeTest 949 public void test4_5GetParameterIntArrayShortArray() throws Exception { 950 boolean result = false; 951 String msg = "test4_5GetParameterIntArrayShortArray()"; 952 AudioEffect effect = null; 953 try { 954 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 955 AudioEffect.EFFECT_TYPE_NULL, 956 0, 957 0); 958 assertNotNull(msg + ": could not create AudioEffect", effect); 959 int[] param = new int[1]; 960 short[] value = new short[1]; 961 param[0] = Equalizer.PARAM_CURRENT_PRESET; 962 if (!AudioEffect.isError(effect.getParameter(param, value))) { 963 result = true; 964 } 965 } catch (IllegalArgumentException e) { 966 msg = msg.concat(": Bad parameter value"); 967 loge(msg, "Bad parameter value"); 968 } catch (UnsupportedOperationException e) { 969 msg = msg.concat(": getParameter() rejected"); 970 loge(msg, "getParameter() rejected"); 971 } catch (IllegalStateException e) { 972 msg = msg.concat("getParameter() called in wrong state"); 973 loge(msg, "getParameter() called in wrong state"); 974 } finally { 975 if (effect != null) { 976 effect.release(); 977 } 978 } 979 assertTrue(msg, result); 980 } 981 982 //Test case 4.6: test getParameter(int[], byte[]) 983 @LargeTest 984 public void test4_6GetParameterIntArrayByteArray() throws Exception { 985 boolean result = false; 986 String msg = "test4_6GetParameterIntArrayByteArray()"; 987 AudioEffect effect = null; 988 try { 989 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 990 AudioEffect.EFFECT_TYPE_NULL, 991 0, 992 0); 993 assertNotNull(msg + ": could not create AudioEffect", effect); 994 int[] param = new int[1]; 995 byte[] value = new byte[2]; 996 param[0] = Equalizer.PARAM_CURRENT_PRESET; 997 if (!AudioEffect.isError(effect.getParameter(param, value))) { 998 result = true; 999 } 1000 } catch (IllegalArgumentException e) { 1001 msg = msg.concat(": Bad parameter value"); 1002 loge(msg, "Bad parameter value"); 1003 } catch (UnsupportedOperationException e) { 1004 msg = msg.concat(": getParameter() rejected"); 1005 loge(msg, "getParameter() rejected"); 1006 } catch (IllegalStateException e) { 1007 msg = msg.concat("getParameter() called in wrong state"); 1008 loge(msg, "getParameter() called in wrong state"); 1009 } finally { 1010 if (effect != null) { 1011 effect.release(); 1012 } 1013 } 1014 assertTrue(msg, result); 1015 } 1016 1017 //Test case 4.7: test getParameter() throws exception after release() 1018 @LargeTest 1019 public void test4_7GetParameterAfterRelease() throws Exception { 1020 boolean result = false; 1021 String msg = "test4_7GetParameterAfterRelease()"; 1022 AudioEffect effect = null; 1023 try { 1024 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1025 AudioEffect.EFFECT_TYPE_NULL, 1026 0, 1027 0); 1028 assertNotNull(msg + ": could not create AudioEffect", effect); 1029 effect.release(); 1030 short[] value = new short[1]; 1031 effect.getParameter(Equalizer.PARAM_CURRENT_PRESET, value); 1032 } catch (IllegalArgumentException e) { 1033 msg = msg.concat(": Bad parameter value"); 1034 loge(msg, "Bad parameter value"); 1035 } catch (UnsupportedOperationException e) { 1036 msg = msg.concat(": getParameter() rejected"); 1037 loge(msg, "getParameter() rejected"); 1038 } catch (IllegalStateException e) { 1039 result = true; 1040 } finally { 1041 if (effect != null) { 1042 effect.release(); 1043 } 1044 } 1045 assertTrue(msg, result); 1046 } 1047 1048 //----------------------------------------------------------------- 1049 // 5 priority and listeners 1050 //---------------------------------- 1051 1052 //Test case 5.0: test control passed to higher priority client 1053 @LargeTest 1054 public void test5_0setEnabledLowerPriority() throws Exception { 1055 boolean result = false; 1056 String msg = "test5_0setEnabledLowerPriority()"; 1057 AudioEffect effect1 = null; 1058 AudioEffect effect2 = null; 1059 try { 1060 effect1 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1061 AudioEffect.EFFECT_TYPE_NULL, 1062 0, 1063 0); 1064 effect2 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1065 AudioEffect.EFFECT_TYPE_NULL, 1066 1, 1067 0); 1068 1069 assertNotNull(msg + ": could not create AudioEffect", effect1); 1070 assertNotNull(msg + ": could not create AudioEffect", effect2); 1071 1072 assertTrue(msg + ": Effect2 does not have control", effect2.hasControl()); 1073 assertFalse(msg + ": Effect1 has control", effect1.hasControl()); 1074 assertTrue(msg + ": Effect1 can enable", 1075 effect1.setEnabled(true) == AudioEffect.ERROR_INVALID_OPERATION); 1076 assertFalse(msg + ": Effect1 has enabled", effect2.getEnabled()); 1077 result = true; 1078 } catch (IllegalArgumentException e) { 1079 msg = msg.concat(": Effect not found"); 1080 result = false; 1081 } catch (UnsupportedOperationException e) { 1082 msg = msg.concat(": Effect library not loaded"); 1083 result = false; 1084 } finally { 1085 if (effect1 != null) { 1086 effect1.release(); 1087 } 1088 if (effect2 != null) { 1089 effect2.release(); 1090 } 1091 } 1092 assertTrue(msg, result); 1093 } 1094 1095 //Test case 5.1: test control passed to higher priority client 1096 @LargeTest 1097 public void test5_1setParameterLowerPriority() throws Exception { 1098 boolean result = false; 1099 String msg = "test5_1setParameterLowerPriority()"; 1100 AudioEffect effect1 = null; 1101 AudioEffect effect2 = null; 1102 try { 1103 effect1 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1104 AudioEffect.EFFECT_TYPE_NULL, 1105 0, 1106 0); 1107 effect2 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1108 AudioEffect.EFFECT_TYPE_NULL, 1109 1, 1110 0); 1111 1112 assertNotNull(msg + ": could not create AudioEffect", effect1); 1113 assertNotNull(msg + ": could not create AudioEffect", effect2); 1114 1115 int status = effect2.setParameter(Equalizer.PARAM_CURRENT_PRESET, (short)0); 1116 assertEquals(msg + ": Effect2 setParameter failed", 1117 AudioEffect.SUCCESS, status); 1118 1119 status = effect1.setParameter(Equalizer.PARAM_CURRENT_PRESET, (short)1); 1120 assertEquals(msg + ": Effect1 setParameter did not fail", 1121 AudioEffect.ERROR_INVALID_OPERATION, status); 1122 1123 short[] value = new short[1]; 1124 status = effect2.getParameter(Equalizer.PARAM_CURRENT_PRESET, value); 1125 assertFalse(msg + ": Effect2 getParameter failed", 1126 AudioEffect.isError(status)); 1127 assertEquals(msg + ": Effect1 changed parameter", 1128 (short)0, value[0]); 1129 1130 result = true; 1131 } catch (IllegalArgumentException e) { 1132 msg = msg.concat(": Effect not found"); 1133 result = false; 1134 } catch (UnsupportedOperationException e) { 1135 msg = msg.concat(": Effect library not loaded"); 1136 result = false; 1137 } finally { 1138 if (effect1 != null) { 1139 effect1.release(); 1140 } 1141 if (effect2 != null) { 1142 effect2.release(); 1143 } 1144 } 1145 assertTrue(msg, result); 1146 } 1147 1148 //Test case 5.2: test control status listener 1149 @LargeTest 1150 public void test5_2ControlStatusListener() throws Exception { 1151 boolean result = false; 1152 String msg = "test5_2ControlStatusListener()"; 1153 mEffect = null; 1154 AudioEffect effect2 = null; 1155 try { 1156 mHasControl = true; 1157 createListenerLooper(true, false, false); 1158 synchronized(lock) { 1159 try { 1160 lock.wait(1000); 1161 } catch(Exception e) { 1162 Log.e(TAG, "Looper creation: wait was interrupted."); 1163 } 1164 } 1165 assertTrue(mInitialized); 1166 synchronized(lock) { 1167 try { 1168 effect2 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1169 AudioEffect.EFFECT_TYPE_NULL, 1170 1, 1171 0); 1172 assertNotNull(msg + ": could not create AudioEffect", effect2); 1173 lock.wait(1000); 1174 } catch(Exception e) { 1175 Log.e(TAG, "Create second effect: wait was interrupted."); 1176 } 1177 } 1178 assertFalse(msg + ": effect control not lost by effect1", mHasControl); 1179 result = true; 1180 } catch (IllegalArgumentException e) { 1181 msg = msg.concat(": Equalizer not found"); 1182 loge(msg, ": Equalizer not found"); 1183 } catch (UnsupportedOperationException e) { 1184 msg = msg.concat(": Effect library not loaded"); 1185 loge(msg, ": Effect library not loaded"); 1186 } catch (Exception e){ 1187 loge(msg, "Could not create media player:" + e); 1188 } finally { 1189 terminateListenerLooper(); 1190 if (effect2 != null) { 1191 effect2.release(); 1192 } 1193 } 1194 assertTrue(msg, result); 1195 } 1196 1197 //Test case 5.3: test enable status listener 1198 @LargeTest 1199 public void test5_3EnableStatusListener() throws Exception { 1200 boolean result = false; 1201 String msg = "test5_3EnableStatusListener()"; 1202 mEffect = null; 1203 AudioEffect effect2 = null; 1204 try { 1205 createListenerLooper(false, true, false); 1206 synchronized(lock) { 1207 try { 1208 lock.wait(1000); 1209 } catch(Exception e) { 1210 Log.e(TAG, "Looper creation: wait was interrupted."); 1211 } 1212 } 1213 assertTrue(mInitialized); 1214 mEffect.setEnabled(true); 1215 mIsEnabled = true; 1216 effect2 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1217 AudioEffect.EFFECT_TYPE_NULL, 1218 1, 1219 0); 1220 assertNotNull(msg + ": could not create AudioEffect", effect2); 1221 assertTrue(msg + ": effect not enabled", effect2.getEnabled()); 1222 synchronized(lock) { 1223 try { 1224 effect2.setEnabled(false); 1225 lock.wait(1000); 1226 } catch(Exception e) { 1227 Log.e(TAG, "Create second effect: wait was interrupted."); 1228 } 1229 } 1230 assertFalse(msg + ": enable status not updated", mIsEnabled); 1231 result = true; 1232 } catch (IllegalArgumentException e) { 1233 msg = msg.concat(": Equalizer not found"); 1234 loge(msg, ": Equalizer not found"); 1235 } catch (UnsupportedOperationException e) { 1236 msg = msg.concat(": Effect library not loaded"); 1237 loge(msg, ": Effect library not loaded"); 1238 } catch (Exception e){ 1239 loge(msg, "Could not create media player:" + e); 1240 } finally { 1241 terminateListenerLooper(); 1242 if (effect2 != null) { 1243 effect2.release(); 1244 } 1245 } 1246 assertTrue(msg, result); 1247 } 1248 1249 //Test case 5.4: test parameter changed listener 1250 @LargeTest 1251 public void test5_4ParameterChangedListener() throws Exception { 1252 boolean result = false; 1253 String msg = "test5_4ParameterChangedListener()"; 1254 mEffect = null; 1255 AudioEffect effect2 = null; 1256 try { 1257 createListenerLooper(false, false, true); 1258 synchronized(lock) { 1259 try { 1260 lock.wait(1000); 1261 } catch(Exception e) { 1262 Log.e(TAG, "Looper creation: wait was interrupted."); 1263 } 1264 } 1265 assertTrue(mInitialized); 1266 effect2 = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1267 AudioEffect.EFFECT_TYPE_NULL, 1268 1, 1269 0); 1270 assertNotNull(msg + ": could not create AudioEffect", effect2); 1271 synchronized(lock) { 1272 try { 1273 mParameterChanged = -1; 1274 effect2.setParameter(Equalizer.PARAM_CURRENT_PRESET, (short)0); 1275 lock.wait(1000); 1276 } catch(Exception e) { 1277 Log.e(TAG, "Create second effect: wait was interrupted."); 1278 } 1279 } 1280 assertEquals(msg + ": parameter change not received", 1281 Equalizer.PARAM_CURRENT_PRESET, mParameterChanged); 1282 result = true; 1283 } catch (IllegalArgumentException e) { 1284 msg = msg.concat(": Equalizer not found"); 1285 loge(msg, ": Equalizer not found"); 1286 } catch (UnsupportedOperationException e) { 1287 msg = msg.concat(": Effect library not loaded"); 1288 loge(msg, ": Effect library not loaded"); 1289 } catch (Exception e){ 1290 loge(msg, "Could not create media player:" + e); 1291 } finally { 1292 terminateListenerLooper(); 1293 if (effect2 != null) { 1294 effect2.release(); 1295 } 1296 } 1297 assertTrue(msg, result); 1298 } 1299 1300 //----------------------------------------------------------------- 1301 // 6 command method 1302 //---------------------------------- 1303 1304 1305 //Test case 6.0: test command method 1306 @LargeTest 1307 public void test6_0Command() throws Exception { 1308 boolean result = false; 1309 String msg = "test6_0Command()"; 1310 AudioEffect effect = null; 1311 try { 1312 effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1313 AudioEffect.EFFECT_TYPE_NULL, 1314 0, 1315 0); 1316 assertNotNull(msg + ": could not create AudioEffect", effect); 1317 try { 1318 byte[] cmd = new byte[0]; 1319 byte[] reply = new byte[4]; 1320 int status = effect.command(3, cmd, reply); 1321 assertFalse(msg + ": command failed", AudioEffect.isError(status)); 1322 assertTrue(msg + ": effect not enabled", effect.getEnabled()); 1323 result = true; 1324 } catch (IllegalStateException e) { 1325 msg = msg.concat(": command in illegal state"); 1326 } 1327 } catch (IllegalArgumentException e) { 1328 msg = msg.concat(": Equalizer not found"); 1329 loge(msg, ": Equalizer not found"); 1330 } catch (UnsupportedOperationException e) { 1331 msg = msg.concat(": Effect library not loaded"); 1332 loge(msg, ": Effect library not loaded"); 1333 } catch (Exception e){ 1334 loge(msg, "Could not create media player:" + e); 1335 } finally { 1336 if (effect != null) { 1337 effect.release(); 1338 } 1339 } 1340 assertTrue(msg, result); 1341 } 1342 1343 //----------------------------------------------------------------- 1344 // private methods 1345 //---------------------------------- 1346 1347 /* 1348 * Initializes the message looper so that the MediaPlayer object can 1349 * receive the callback messages. 1350 */ 1351 private void createMediaPlayerLooper() { 1352 new Thread() { 1353 @Override 1354 public void run() { 1355 // Set up a looper to be used by mMediaPlayer. 1356 Looper.prepare(); 1357 1358 // Save the looper so that we can terminate this thread 1359 // after we are done with it. 1360 mLooper = Looper.myLooper(); 1361 1362 mMediaPlayer = new MediaPlayer(); 1363 mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { 1364 public boolean onError(MediaPlayer player, int what, int extra) { 1365 synchronized(lock) { 1366 mError = what; 1367 lock.notify(); 1368 } 1369 return true; 1370 } 1371 }); 1372 mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 1373 public void onCompletion(MediaPlayer player) { 1374 synchronized(lock) { 1375 lock.notify(); 1376 } 1377 } 1378 }); 1379 synchronized(lock) { 1380 mInitialized = true; 1381 lock.notify(); 1382 } 1383 Looper.loop(); // Blocks forever until Looper.quit() is called. 1384 } 1385 }.start(); 1386 } 1387 /* 1388 * Terminates the message looper thread. 1389 */ 1390 private void terminateMediaPlayerLooper() { 1391 if (mLooper != null) { 1392 mLooper.quit(); 1393 mLooper = null; 1394 } 1395 if (mMediaPlayer != null) { 1396 mMediaPlayer.release(); 1397 } 1398 } 1399 1400 /* 1401 * Initializes the message looper fro effect listener 1402 */ 1403 class ListenerThread extends Thread { 1404 boolean mControl; 1405 boolean mEnable; 1406 boolean mParameter; 1407 1408 public ListenerThread(boolean control, boolean enable, boolean parameter) { 1409 super(); 1410 mControl = control; 1411 mEnable = enable; 1412 mParameter = parameter; 1413 } 1414 } 1415 private void createListenerLooper(boolean control, boolean enable, boolean parameter) { 1416 1417 new ListenerThread(control, enable, parameter) { 1418 @Override 1419 public void run() { 1420 // Set up a looper to be used by mEffect. 1421 Looper.prepare(); 1422 1423 // Save the looper so that we can terminate this thread 1424 // after we are done with it. 1425 mLooper = Looper.myLooper(); 1426 1427 mEffect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, 1428 AudioEffect.EFFECT_TYPE_NULL, 1429 0, 1430 0); 1431 assertNotNull("could not create AudioEffect", mEffect); 1432 1433 if (mControl) { 1434 mEffect.setControlStatusListener(new AudioEffect.OnControlStatusChangeListener() { 1435 public void onControlStatusChange(AudioEffect effect, boolean controlGranted) { 1436 synchronized(lock) { 1437 if (effect == mEffect) { 1438 mHasControl = controlGranted; 1439 lock.notify(); 1440 } 1441 } 1442 } 1443 }); 1444 } 1445 if (mEnable) { 1446 mEffect.setEnableStatusListener(new AudioEffect.OnEnableStatusChangeListener() { 1447 public void onEnableStatusChange(AudioEffect effect, boolean enabled) { 1448 synchronized(lock) { 1449 if (effect == mEffect) { 1450 mIsEnabled = enabled; 1451 lock.notify(); 1452 } 1453 } 1454 } 1455 }); 1456 } 1457 if (mParameter) { 1458 mEffect.setParameterListener(new AudioEffect.OnParameterChangeListener() { 1459 public void onParameterChange(AudioEffect effect, int status, byte[] param, 1460 byte[] value) { 1461 synchronized(lock) { 1462 if (effect == mEffect) { 1463 mParameterChanged = byteArrayToInt(param); 1464 lock.notify(); 1465 } 1466 } 1467 } 1468 }); 1469 } 1470 1471 synchronized(lock) { 1472 mInitialized = true; 1473 lock.notify(); 1474 } 1475 Looper.loop(); // Blocks forever until Looper.quit() is called. 1476 } 1477 }.start(); 1478 } 1479 /* 1480 * Terminates the listener looper thread. 1481 */ 1482 private void terminateListenerLooper() { 1483 if (mEffect != null) { 1484 mEffect.release(); 1485 mEffect = null; 1486 } 1487 if (mLooper != null) { 1488 mLooper.quit(); 1489 mLooper = null; 1490 } 1491 } 1492 1493 protected int byteArrayToInt(byte[] valueBuf) { 1494 return byteArrayToInt(valueBuf, 0); 1495 1496 } 1497 1498 protected int byteArrayToInt(byte[] valueBuf, int offset) { 1499 ByteBuffer converter = ByteBuffer.wrap(valueBuf); 1500 converter.order(ByteOrder.nativeOrder()); 1501 return converter.getInt(offset); 1502 1503 } 1504 1505 protected byte[] intToByteArray(int value) { 1506 ByteBuffer converter = ByteBuffer.allocate(4); 1507 converter.order(ByteOrder.nativeOrder()); 1508 converter.putInt(value); 1509 return converter.array(); 1510 } 1511 1512 protected short byteArrayToShort(byte[] valueBuf) { 1513 return byteArrayToShort(valueBuf, 0); 1514 } 1515 1516 protected short byteArrayToShort(byte[] valueBuf, int offset) { 1517 ByteBuffer converter = ByteBuffer.wrap(valueBuf); 1518 converter.order(ByteOrder.nativeOrder()); 1519 return converter.getShort(offset); 1520 1521 } 1522 1523 protected byte[] shortToByteArray(short value) { 1524 ByteBuffer converter = ByteBuffer.allocate(2); 1525 converter.order(ByteOrder.nativeOrder()); 1526 short sValue = (short) value; 1527 converter.putShort(sValue); 1528 return converter.array(); 1529 } 1530 1531 } 1532