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