1d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks/* 2d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * Copyright (c) 2009, Google Inc. 3d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * 4d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * Licensed under the Apache License, Version 2.0 (the "License"); 5d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * you may not use this file except in compliance with the License. 6d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * You may obtain a copy of the License at 7d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * 8d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * http://www.apache.org/licenses/LICENSE-2.0 9d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * 10d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * Unless required by applicable law or agreed to in writing, software 11d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * distributed under the License is distributed on an "AS IS" BASIS, 12d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * See the License for the specific language governing permissions and 14d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks * limitations under the License. 15d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks */ 16d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 17d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparkspackage com.android.soundpooltest; 18d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 19d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.app.Activity; 20d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.widget.LinearLayout; 21d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.os.Bundle; 22d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.view.ViewGroup; 23d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.widget.Button; 24d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.view.View; 25d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.view.View.OnClickListener; 26d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.view.KeyEvent; 27d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.media.AudioSystem; 28d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.media.AudioManager; 29d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.media.SoundPool; 30d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.media.SoundPool.OnLoadCompleteListener; 31d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport android.util.Log; 32d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport java.util.HashMap; 33d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport java.lang.Math; 34d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 35d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparksimport com.android.soundpooltest.R; 36d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 37d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparkspublic class SoundPoolTest extends Activity 38d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks{ 39d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private static final String LOG_TAG = "SoundPoolTest"; 40d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private static final boolean DEBUG = true; 41d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private static final boolean VERBOSE = false; 42d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private TestThread mThread; 43d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 44d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private static final int[] mTestFiles = new int[] { 451905530bb1316674f9bc9794bad98f439f8df232Dave Sparks R.raw.organ441, 46d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks R.raw.sine441, 476ed937ebe99088b5671a645060340a558b02fefbAndreas Huber R.raw.test1, 48d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks R.raw.test2, 49d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks R.raw.test3, 50d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks R.raw.test4, 51d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks R.raw.test5 52d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks }; 53d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 54d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static float SEMITONE = 1.059463094f; 55d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static float DEFAULT_VOLUME = 0.707f; 56d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static float MAX_VOLUME = 1.0f; 57d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static float MIN_VOLUME = 0.01f; 58d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static int LOW_PRIORITY = 1000; 59d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static int NORMAL_PRIORITY = 2000; 60d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static int HIGH_PRIORITY = 3000; 61d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static int DEFAULT_LOOP = -1; 62d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static int DEFAULT_SRC_QUALITY = 0; 63d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final static double PI_OVER_2 = Math.PI / 2.0; 64d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 65d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks public SoundPoolTest() {} 66d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 67d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final class TestThread extends java.lang.Thread { 68d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean mRunning; 69d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private SoundPool mSoundPool = null; 70d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private int mLastSample; 71f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks private int mMaxStreams; 72d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private int mLoadStatus; 73d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private int[] mSounds; 74d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private float mScale[]; 75d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 76d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks TestThread() { 77d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks super("SoundPool.TestThread"); 78d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 79d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 80d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private final class LoadCompleteCallback implements 81d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks android.media.SoundPool.OnLoadCompleteListener { 82d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 83d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks synchronized(mSoundPool) { 84d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Sample " + sampleId + " load status = " + status); 85d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (status != 0) { 86d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mLoadStatus = status; 87d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 88d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (sampleId == mLastSample) { 89d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.notify(); 90d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 91d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 92d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 93d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 94d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 95d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private int loadSound(int resId, int priority) { 96d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int id = mSoundPool.load(getApplicationContext(), resId, priority); 97d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 98d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Unable to open resource"); 99d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 100d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return id; 101d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 102d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 103f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks private int initSoundPool(int numStreams) throws java.lang.InterruptedException { 104d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 105d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (mSoundPool != null) { 106f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks if ((mMaxStreams == numStreams) && (mLoadStatus == 0)) return mLoadStatus; 107d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.release(); 108d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool = null; 109d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 110d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 111d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // create sound pool 112d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mLoadStatus = 0; 113f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks mMaxStreams = numStreams; 114f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks mSoundPool = new SoundPool(numStreams, AudioSystem.STREAM_MUSIC, 0); 115d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.setOnLoadCompleteListener(new LoadCompleteCallback()); 116d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int numSounds = mTestFiles.length; 117d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSounds = new int[numSounds]; 118d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 119d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // load sounds 120d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks synchronized(mSoundPool) { 121d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int index = 0; index < numSounds; index++) { 122d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSounds[index] = loadSound(mTestFiles[index], NORMAL_PRIORITY); 123d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mLastSample = mSounds[index]; 124d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 125d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.wait(); 126d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 127d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return mLoadStatus; 128d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 129d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 130d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean TestSounds() throws java.lang.InterruptedException { 131d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Begin sounds test"); 132d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int count = mSounds.length; 133d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int index = 0; index < count; index++) { 134d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int id = mSoundPool.play(mSounds[index], DEFAULT_VOLUME, DEFAULT_VOLUME, 135d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks NORMAL_PRIORITY, DEFAULT_LOOP, 1.0f); 136d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + id); 137d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 138d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Error occurred starting note"); 139d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return false; 140d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 141d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks sleep(450); 142d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(id); 143d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Stop note " + id); 144d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks sleep(50); 145d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 14653d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "End sounds test"); 147d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return true; 148d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 149d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 150d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean TestScales() throws java.lang.InterruptedException { 151d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Begin scale test"); 152d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 153d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // interate through pitch table 154d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int count = mScale.length; 155d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int step = 0; step < count; step++) { 156d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME, 157d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks NORMAL_PRIORITY, DEFAULT_LOOP, mScale[step]); 158d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + id); 159d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 160d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Error occurred starting note"); 161d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return false; 162d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 163d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks sleep(450); 164d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(id); 165d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Stop note " + id); 166d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks sleep(50); 167d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 16853d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "End scale test"); 169d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return true; 170d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 171d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 172d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean TestRates() throws java.lang.InterruptedException { 173d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Begin rate test"); 174d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 175d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // start the note 176d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int count = mScale.length; 177d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME, 178d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks NORMAL_PRIORITY, DEFAULT_LOOP, mScale[0]); 179d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + id); 180d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 181d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Test failed - exiting"); 182d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return false; 183d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 184d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 185d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // modify the pitch 186d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int step = 1; step < count; step++) { 187d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks sleep(250); 188d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.setRate(id, mScale[step]); 189d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Change rate " + mScale[step]); 190d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 191d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(id); 19253d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "Stop note " + id); 193d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "End rate test"); 194d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return true; 195d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 196d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 197d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean TestPriority() throws java.lang.InterruptedException { 198d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Begin priority test"); 199d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks boolean result = true; 200d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 201d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // play a normal priority looping sound 202d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int normalId = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME, 203d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks NORMAL_PRIORITY, DEFAULT_LOOP, 1.0f); 204d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + normalId); 205d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (normalId == 0) { 206d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Error occurred starting note"); 207d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return false; 208d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 20953d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 210d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 211d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // play a low priority sound 21253d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten int id = mSoundPool.play(mSounds[1], DEFAULT_VOLUME, DEFAULT_VOLUME, 213d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks LOW_PRIORITY, DEFAULT_LOOP, 1.0f); 21453d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (id != 0) { 215d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Normal > Low priority test failed"); 216d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks result = false; 217d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(id); 218d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } else { 21953d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 22053d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten Log.i(LOG_TAG, "Normal > Low priority test passed"); 221d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 222d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 223d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // play a high priority sound 22453d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten id = mSoundPool.play(mSounds[2], DEFAULT_VOLUME, DEFAULT_VOLUME, 225d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks HIGH_PRIORITY, DEFAULT_LOOP, 1.0f); 226d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 227d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "High > Normal priority test failed"); 228d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks result = false; 229d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } else { 23053d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 23153d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten Log.i(LOG_TAG, "Stopping high priority"); 23253d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten mSoundPool.stop(id); 23353d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 23453d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten Log.i(LOG_TAG, "High > Normal priority test passed"); 235d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 236d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 237d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // stop normal note 23853d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten Log.i(LOG_TAG, "Stopping normal priority"); 239d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(normalId); 24053d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 241d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 242d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "End priority test"); 243d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return result; 244d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 245d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 246d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean TestPauseResume() throws java.lang.InterruptedException { 247d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Begin pause/resume test"); 248d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks boolean result = true; 249d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 250d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // play a normal priority looping sound 251d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int id = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME, 252d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks NORMAL_PRIORITY, DEFAULT_LOOP, 1.0f); 253d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + id); 254d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 255d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Error occurred starting note"); 256d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return false; 257d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 25853d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(2500); 259d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 260d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // pause and resume sound a few times 261d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int count = 0; count < 5; count++) { 26253d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "Pause note " + id); 263d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.pause(id); 26453d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 26553d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "Resume note " + id); 266d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.resume(id); 26753d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 268d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 269d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 27053d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "Stop note " + id); 271d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(id); 27253d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 273d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 274f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks // play 5 sounds, forces one to be stolen 275f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks int ids[] = new int[5]; 276f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks for (int i = 0; i < 5; i++) { 277f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks ids[i] = mSoundPool.play(mSounds[0], DEFAULT_VOLUME, DEFAULT_VOLUME, 278f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks NORMAL_PRIORITY, DEFAULT_LOOP, mScale[i]); 279f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + ids[i]); 280f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks if (ids[i] == 0) { 281f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks Log.e(LOG_TAG, "Error occurred starting note"); 282f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks return false; 283f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks } 28453d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 285f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks } 286f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks 287f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks // pause and resume sound a few times 288f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks for (int count = 0; count < 5; count++) { 28953d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "autoPause"); 290f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks mSoundPool.autoPause(); 29153d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 29253d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "autoResume"); 293f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks mSoundPool.autoResume(); 29453d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(1000); 295f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks } 296f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks 297f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks for (int i = 0; i < 5; i++) { 29853d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten if (DEBUG) Log.d(LOG_TAG, "Stop note " + ids[i]); 299f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks mSoundPool.stop(ids[i]); 300f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks } 301f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks 302d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "End pause/resume test"); 303d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return result; 304d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 305d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 306d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private boolean TestVolume() throws java.lang.InterruptedException { 307d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Begin volume test"); 308d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 309d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // start the note 310d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int id = mSoundPool.play(mSounds[0], 0.0f, 1.0f, NORMAL_PRIORITY, DEFAULT_LOOP, mScale[0]); 311d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Start note " + id); 312d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (id == 0) { 313d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.e(LOG_TAG, "Test failed - exiting"); 314d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return false; 315d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 316d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 31753d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten // pan from right to left 318d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int count = 0; count < 101; count++) { 31953d1537606923778bfc8efe462a033a09273dfa6Glenn Kasten sleep(50); 320d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks double radians = PI_OVER_2 * count / 100.0; 321d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks float leftVolume = (float) Math.sin(radians); 322d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks float rightVolume = (float) Math.cos(radians); 323d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.setVolume(id, leftVolume, rightVolume); 324d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Change volume (" + leftVolume + "," + rightVolume + ")"); 325d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 326d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 327d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.stop(id); 328d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "End volume test"); 329d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks return true; 330d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 331d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 332d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks public void run() { 333d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Test thread running"); 334d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 335d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // initialize 336d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mRunning = true; 337d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks int failures = 0; 338d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 339d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // initialize pitch table 340d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks float pitch = 0.5f; 341d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mScale = new float[13]; 342d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks for (int i = 0; i < 13; ++i) { 343d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mScale[i] = pitch; 344d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks pitch *= SEMITONE; 345d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 346d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 347d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks try { 348d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 349f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks // do single stream tests 350f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks initSoundPool(1); 351d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (!TestSounds()) failures = failures + 1; 352d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (!TestScales()) failures = failures + 1; 353d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (!TestRates()) failures = failures + 1; 354d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (!TestPriority()) failures = failures + 1; 355d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (!TestVolume()) failures = failures + 1; 356d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 357f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks // do multiple stream tests 358f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks initSoundPool(4); 359f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks if (!TestPauseResume()) failures = failures + 1; 360f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks 361d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } catch (java.lang.InterruptedException e) { 362d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Test interrupted"); 363d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks failures = failures + 1; 364d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } finally { 365d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mRunning = false; 366d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 367d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 368d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // release sound pool 369d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (mSoundPool != null) { 370d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool.release(); 371d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mSoundPool = null; 372d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 373d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 374d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks // output stats 375d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "Test thread exit"); 376d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (failures == 0) { 377d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.i(LOG_TAG, "All tests passed"); 378d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } else { 379d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.i(LOG_TAG, failures + " tests failed"); 380d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 381d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 382d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 383d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks public void quit() { 384d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "interrupt"); 385d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks interrupt(); 386d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks while (mRunning) { 387d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks try { 388d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks sleep(20); 389d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } catch (java.lang.InterruptedException e) { } 390d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 391d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks if (DEBUG) Log.d(LOG_TAG, "quit"); 392d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 393d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 394d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 395d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks private void startTests() { 396d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mThread = new TestThread(); 397d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mThread.start(); 398d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 399d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 400d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks protected void onPause() 401d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks { 402d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.v(LOG_TAG, "onPause"); 403d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks super.onPause(); 404d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mThread.quit(); 405d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks mThread = null; 406d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 407d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 408d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks protected void onResume() 409d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks { 410d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks Log.v(LOG_TAG, "onResume"); 411d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks super.onResume(); 412d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks startTests(); 413d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 414d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 415d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks public void onCreate(Bundle icicle) 416d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks { 417d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks super.onCreate(icicle); 418d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks setVolumeControlStream(AudioManager.STREAM_MUSIC); 419d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks } 420d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks} 421d94466c4c8054cbe68cffb132d0ad90d924dca01Dave Sparks 422