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