19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.media; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 21e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrillimport java.io.IOException; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 23e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetFileDescriptor; 26f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparksimport android.os.Handler; 27f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparksimport android.os.Looper; 28f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparksimport android.os.Message; 29e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrillimport android.os.ParcelFileDescriptor; 30e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrillimport android.os.SystemProperties; 31e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrillimport android.util.AndroidRuntimeException; 32e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrillimport android.util.Log; 33e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 34f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 35cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks/** 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The SoundPool class manages and plays audio resources for applications. 37cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 38cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * <p>A SoundPool is a collection of samples that can be loaded into memory 39cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * from a resource inside the APK or from a file in the file system. The 40cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * SoundPool library uses the MediaPlayer service to decode the audio 41cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * into a raw 16-bit PCM mono or stereo stream. This allows applications 42cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * to ship with compressed streams without having to suffer the CPU load 43cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * and latency of decompressing during playback.</p> 44cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 45cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * <p>In addition to low-latency playback, SoundPool can also manage the number 46cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * of audio streams being rendered at once. When the SoundPool object is 47cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * constructed, the maxStreams parameter sets the maximum number of streams 48cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * that can be played at a time from this single SoundPool. SoundPool tracks 49cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * the number of active streams. If the maximum number of streams is exceeded, 50cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * SoundPool will automatically stop a previously playing stream based first 51cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * on priority and then by age within that priority. Limiting the maximum 52cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * number of streams helps to cap CPU loading and reducing the likelihood that 53cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * audio mixing will impact visuals or UI performance.</p> 54cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 556cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * <p>Sounds can be looped by setting a non-zero loop value. A value of -1 566cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * causes the sound to loop forever. In this case, the application must 576cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * explicitly call the stop() function to stop the sound. Any other non-zero 586cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * value will cause the sound to repeat the specified number of times, e.g. 596cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 3 causes the sound to play a total of 4 times.</p> 606cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 616cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * <p>The playback rate can also be changed. A playback rate of 1.0 causes 626cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * the sound to play at its original frequency (resampled, if necessary, 636cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * to the hardware output frequency). A playback rate of 2.0 causes the 646cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * sound to play at twice its original frequency, and a playback rate of 656cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 0.5 causes it to play at half its original frequency. The playback 666cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * rate range is 0.5 to 2.0.</p> 676cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 68cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * <p>Priority runs low to high, i.e. higher numbers are higher priority. 69cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * Priority is used when a call to play() would cause the number of active 70cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * streams to exceed the value established by the maxStreams parameter when 71cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * the SoundPool was created. In this case, the stream allocator will stop 72cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * the lowest priority stream. If there are multiple streams with the same 73cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * low priority, it will choose the oldest stream to stop. In the case 74cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * where the priority of the new stream is lower than all the active 75cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * streams, the new sound will not play and the play() function will return 76cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * a streamID of zero.</p> 77cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 78cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * <p>Let's examine a typical use case: A game consists of several levels of 79cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * play. For each level, there is a set of unique sounds that are used only 80cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * by that level. In this case, the game logic should create a new SoundPool 81cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * object when the first level is loaded. The level data itself might contain 82cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * the list of sounds to be used by this level. The loading logic iterates 83cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * through the list of sounds calling the appropriate SoundPool.load() 84cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * function. This should typically be done early in the process to allow time 85cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * for decompressing the audio to raw PCM format before they are needed for 86cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * playback.</p> 87cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 88cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * <p>Once the sounds are loaded and play has started, the application can 89cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * trigger sounds by calling SoundPool.play(). Playing streams can be 90cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * paused or resumed, and the application can also alter the pitch by 91cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * adjusting the playback rate in real-time for doppler or synthesis 92cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * effects.</p> 93cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 946cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * <p>Note that since streams can be stopped due to resource constraints, the 956cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * streamID is a reference to a particular instance of a stream. If the stream 966cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * is stopped to allow a higher priority stream to play, the stream is no 976cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * longer be valid. However, the application is allowed to call methods on 986cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * the streamID without error. This may help simplify program logic since 996cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * the application need not concern itself with the stream lifecycle.</p> 1006cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 101cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * <p>In our example, when the player has completed the level, the game 102cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * logic should call SoundPool.release() to release all the native resources 103cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * in use and then set the SoundPool reference to null. If the player starts 104cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * another level, a new SoundPool is created, sounds are loaded, and play 105cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * resumes.</p> 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 107e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrillpublic class SoundPool { 108e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private final SoundPoolDelegate mImpl; 109f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 110cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 111cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * Constructor. Constructs a SoundPool object with the following 112cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * characteristics: 113cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 114cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param maxStreams the maximum number of simultaneous streams for this 115cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * SoundPool object 116cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamType the audio stream type as described in AudioManager 117cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * For example, game applications will normally use 118cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * {@link AudioManager#STREAM_MUSIC}. 119cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param srcQuality the sample-rate converter quality. Currently has no 120cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * effect. Use 0 for the default. 121cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return a SoundPool object, or null if creation failed 122cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SoundPool(int maxStreams, int streamType, int srcQuality) { 124e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (SystemProperties.getBoolean("config.disable_media", false)) { 125e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl = new SoundPoolStub(); 126e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } else { 127e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl = new SoundPoolImpl(this, maxStreams, streamType, srcQuality); 128f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 131cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 1326cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Load the sound from the specified path. 1336cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 134cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param path the path to the audio file 1356cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param priority the priority of the sound. Currently has no effect. Use 1366cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 1 for future compatibility. 137cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return a sound ID. This value can be used to play or unload the sound. 138cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 139e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(String path, int priority) { 140e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return mImpl.load(path, priority); 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 143cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 1446cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Load the sound from the specified APK resource. 145cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 1466cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Note that the extension is dropped. For example, if you want to load 147cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * a sound from the raw resource file "explosion.mp3", you would specify 148cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * "R.raw.explosion" as the resource ID. Note that this means you cannot 149cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * have both an "explosion.wav" and an "explosion.mp3" in the res/raw 1506cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * directory. 151cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 152cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param context the application context 153cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param resId the resource ID 1546cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param priority the priority of the sound. Currently has no effect. Use 1556cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 1 for future compatibility. 156cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return a sound ID. This value can be used to play or unload the sound. 157cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int load(Context context, int resId, int priority) { 159e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return mImpl.load(context, resId, priority); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 162cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 1636cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Load the sound from an asset file descriptor. 164cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 165cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param afd an asset file descriptor 1666cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param priority the priority of the sound. Currently has no effect. Use 1676cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 1 for future compatibility. 168cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return a sound ID. This value can be used to play or unload the sound. 169cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int load(AssetFileDescriptor afd, int priority) { 171e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return mImpl.load(afd, priority); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 174cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 1756cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Load the sound from a FileDescriptor. 176cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 1776cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * This version is useful if you store multiple sounds in a single 178cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * binary. The offset specifies the offset from the start of the file 1796cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * and the length specifies the length of the sound within the file. 180cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 181cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param fd a FileDescriptor object 182cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param offset offset to the start of the sound 183cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param length length of the sound 1846cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param priority the priority of the sound. Currently has no effect. Use 1856cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 1 for future compatibility. 186cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return a sound ID. This value can be used to play or unload the sound. 187cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int load(FileDescriptor fd, long offset, long length, int priority) { 189e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return mImpl.load(fd, offset, length, priority); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 192cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 1936cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Unload a sound from a sound ID. 194cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 1956cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Unloads the sound specified by the soundID. This is the value 196cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * returned by the load() function. Returns true if the sound is 1976cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * successfully unloaded, false if the sound was already unloaded. 198cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 199cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param soundID a soundID returned by the load() function 200cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return true if just unloaded, false if previously unloaded 201cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 202e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final boolean unload(int soundID) { 203e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return mImpl.unload(soundID); 204e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 206cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 2076cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Play a sound from a sound ID. 208cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 2096cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Play the sound specified by the soundID. This is the value 210cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * returned by the load() function. Returns a non-zero streamID 211cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * if successful, zero if it fails. The streamID can be used to 212cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * further control playback. Note that calling play() may cause 213cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * another sound to stop playing if the maximum number of active 2146cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * streams is exceeded. A loop value of -1 means loop forever, 2156cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 0 means don't loop, other values indicate the 2166cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * number of repeats, e.g. a value of 1 plays the audio twice. 2176cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * The playback rate allows the application to vary the playback 2186cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * rate (pitch) of the sound. A value of 1.0 means play back at 2196cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * the original frequency. A value of 2.0 means play back twice 2206cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * as fast, and a value of 0.5 means playback at half speed. 221cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 222cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param soundID a soundID returned by the load() function 2236cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param leftVolume left volume value (range = 0.0 to 1.0) 2246cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param rightVolume right volume value (range = 0.0 to 1.0) 2256cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param priority stream priority (0 = lowest priority) 2266cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param loop loop mode (0 = no loop, -1 = loop forever) 2276cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param rate playback rate (1.0 = normal playback, range 0.5 to 2.0) 228cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @return non-zero streamID if successful, zero if failed 229cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 230e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final int play(int soundID, float leftVolume, float rightVolume, 231e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int priority, int loop, float rate) { 232e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return mImpl.play( 233e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill soundID, leftVolume, rightVolume, priority, loop, rate); 234e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 236cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 2376cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Pause a playback stream. 238cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 2396cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Pause the stream specified by the streamID. This is the 240cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * value returned by the play() function. If the stream is 241cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * playing, it will be paused. If the stream is not playing 242cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * (e.g. is stopped or was previously paused), calling this 2436cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * function will have no effect. 244cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 245cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamID a streamID returned by the play() function 246cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 247e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void pause(int streamID) { 248e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.pause(streamID); 249e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 251cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 2526cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Resume a playback stream. 253cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 2546cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Resume the stream specified by the streamID. This 255cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * is the value returned by the play() function. If the stream 256cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * is paused, this will resume playback. If the stream was not 2576cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * previously paused, calling this function will have no effect. 258cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 259cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamID a streamID returned by the play() function 260cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 261e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void resume(int streamID) { 262e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.resume(streamID); 263e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 265cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 266f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * Pause all active streams. 267f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * 268f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * Pause all streams that are currently playing. This function 269f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * iterates through all the active streams and pauses any that 270f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * are playing. It also sets a flag so that any streams that 271f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * are playing can be resumed by calling autoResume(). 272f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks */ 273e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void autoPause() { 274e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.autoPause(); 275e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 276f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks 277f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks /** 278f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * Resume all previously active streams. 279f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * 280f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * Automatically resumes all streams that were paused in previous 281f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks * calls to autoPause(). 282f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks */ 283e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void autoResume() { 284e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.autoResume(); 285e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 286f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks 287f992cbb9aae593c7787ac9c5f6b475e7bb0a92c5Dave Sparks /** 2886cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Stop a playback stream. 289cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 2906cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Stop the stream specified by the streamID. This 291cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * is the value returned by the play() function. If the stream 292cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * is playing, it will be stopped. It also releases any native 293cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * resources associated with this stream. If the stream is not 2946cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * playing, it will have no effect. 295cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 296cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamID a streamID returned by the play() function 297cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 298e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void stop(int streamID) { 299e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.stop(streamID); 300e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 302cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 3036cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Set stream volume. 304cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 3056cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Sets the volume on the stream specified by the streamID. 306cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * This is the value returned by the play() function. The 307cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * value must be in the range of 0.0 to 1.0. If the stream does 3086cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * not exist, it will have no effect. 309cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 310cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamID a streamID returned by the play() function 311cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param leftVolume left volume value (range = 0.0 to 1.0) 312cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param rightVolume right volume value (range = 0.0 to 1.0) 313cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 314e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setVolume(int streamID, 315e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill float leftVolume, float rightVolume) { 316e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.setVolume(streamID, leftVolume, rightVolume); 317e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 320068225de0197df07a0247b2877666ea91c22c992Glenn Kasten * Similar, except set volume of all channels to same value. 321068225de0197df07a0247b2877666ea91c22c992Glenn Kasten * @hide 322068225de0197df07a0247b2877666ea91c22c992Glenn Kasten */ 323068225de0197df07a0247b2877666ea91c22c992Glenn Kasten public void setVolume(int streamID, float volume) { 324068225de0197df07a0247b2877666ea91c22c992Glenn Kasten setVolume(streamID, volume, volume); 325068225de0197df07a0247b2877666ea91c22c992Glenn Kasten } 326068225de0197df07a0247b2877666ea91c22c992Glenn Kasten 327068225de0197df07a0247b2877666ea91c22c992Glenn Kasten /** 3286cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Change stream priority. 329cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 3306cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Change the priority of the stream specified by the streamID. 331cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * This is the value returned by the play() function. Affects the 3326cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * order in which streams are re-used to play new sounds. If the 3336cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * stream does not exist, it will have no effect. 334cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 335cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamID a streamID returned by the play() function 336cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 337e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setPriority(int streamID, int priority) { 338e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.setPriority(streamID, priority); 339e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 341cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks /** 3426cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Set loop mode. 343cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 3446cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Change the loop mode. A loop value of -1 means loop forever, 3456cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * a value of 0 means don't loop, other values indicate the 3466cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * number of repeats, e.g. a value of 1 plays the audio twice. 3476cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * If the stream does not exist, it will have no effect. 348cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * 349cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks * @param streamID a streamID returned by the play() function 3506cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param loop loop mode (0 = no loop, -1 = loop forever) 351cef302d0950a02fdc6920475d0c357d3949e85c3Dave Sparks */ 352e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setLoop(int streamID, int loop) { 353e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.setLoop(streamID, loop); 354e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3566cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks /** 3576cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * Change playback rate. 3586cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 3596cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * The playback rate allows the application to vary the playback 3606cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * rate (pitch) of the sound. A value of 1.0 means playback at 3616cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * the original frequency. A value of 2.0 means playback twice 3626cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * as fast, and a value of 0.5 means playback at half speed. 3636cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * If the stream does not exist, it will have no effect. 3646cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * 3656cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param streamID a streamID returned by the play() function 3666cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks * @param rate playback rate (1.0 = normal playback, range 0.5 to 2.0) 3676cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks */ 368e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setRate(int streamID, float rate) { 369e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.setRate(streamID, rate); 370e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 372e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public interface OnLoadCompleteListener { 373f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks /** 374f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks * Called when a sound has completed loading. 375f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks * 376f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks * @param soundPool SoundPool object from the load() method 37736b692d8ef595eee1e28d20b740be548365a5671David Friedman * @param sampleId the sample ID of the sound loaded. 378f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks * @param status the status of the load operation (0 = success) 379f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks */ 380f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks public void onLoadComplete(SoundPool soundPool, int sampleId, int status); 381f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 382f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 383f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks /** 384f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks * Sets the callback hook for the OnLoadCompleteListener. 385f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks */ 386e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setOnLoadCompleteListener(OnLoadCompleteListener listener) { 387e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.setOnLoadCompleteListener(listener); 388e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 389e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 390e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill /** 391e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * Release the SoundPool resources. 392e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * 393e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * Release all memory and native resources used by the SoundPool 394e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * object. The SoundPool can no longer be used and the reference 395e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * should be set to null. 396e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill */ 397e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void release() { 398e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mImpl.release(); 399e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 400e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 401e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill /** 402e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * Interface for SoundPool implementations. 403e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * SoundPool is statically referenced and unconditionally called from all 404e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * over the framework, so we can't simply omit the class or make it throw 405e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * runtime exceptions, as doing so would break the framework. Instead we 406e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * now select either a real or no-op impl object based on whether media is 407e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * enabled. 408e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * 409e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * @hide 410e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill */ 411e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill /* package */ interface SoundPoolDelegate { 412e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(String path, int priority); 413e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(Context context, int resId, int priority); 414e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(AssetFileDescriptor afd, int priority); 415e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load( 416e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill FileDescriptor fd, long offset, long length, int priority); 417e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public boolean unload(int soundID); 418e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int play( 419e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int soundID, float leftVolume, float rightVolume, 420e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int priority, int loop, float rate); 421e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void pause(int streamID); 422e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void resume(int streamID); 423e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void autoPause(); 424e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void autoResume(); 425e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void stop(int streamID); 426e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setVolume(int streamID, float leftVolume, float rightVolume); 427e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setVolume(int streamID, float volume); 428e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setPriority(int streamID, int priority); 429e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setLoop(int streamID, int loop); 430e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setRate(int streamID, float rate); 431e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setOnLoadCompleteListener(OnLoadCompleteListener listener); 432e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void release(); 433e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 434e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 435e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 436e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill /** 437e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * Real implementation of the delegate interface. This was formerly the 438e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * body of SoundPool itself. 439e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill */ 440e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill /* package */ static class SoundPoolImpl implements SoundPoolDelegate { 441e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill static { System.loadLibrary("soundpool"); } 442e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 443e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private final static String TAG = "SoundPool"; 444e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private final static boolean DEBUG = false; 445e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 446e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private int mNativeContext; // accessed by native methods 447e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 448e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private EventHandler mEventHandler; 449e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private SoundPool.OnLoadCompleteListener mOnLoadCompleteListener; 450e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private SoundPool mProxy; 451e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 452e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private final Object mLock; 453e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 454e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // SoundPool messages 455e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // 456e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // must match SoundPool.h 457e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private static final int SAMPLE_LOADED = 1; 458e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 459e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public SoundPoolImpl(SoundPool proxy, int maxStreams, int streamType, int srcQuality) { 460e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 461e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // do native setup 462e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (native_setup(new WeakReference(this), maxStreams, streamType, srcQuality) != 0) { 463e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill throw new RuntimeException("Native setup failed"); 464e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 465e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mLock = new Object(); 466e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mProxy = proxy; 467e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 468e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 469e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(String path, int priority) 470e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill { 471e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // pass network streams to player 472e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (path.startsWith("http:")) 473e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return _load(path, priority); 474e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 475e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // try local path 476e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int id = 0; 477e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill try { 478e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill File f = new File(path); 479e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill ParcelFileDescriptor fd = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY); 480e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (fd != null) { 481e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill id = _load(fd.getFileDescriptor(), 0, f.length(), priority); 482e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill fd.close(); 483a60e212d0dda7d2a748180ce77405f2463c9cf53Eric Laurent } 484e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } catch (java.io.IOException e) { 485e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill Log.e(TAG, "error loading " + path); 486e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 487e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return id; 488e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 489e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 490e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(Context context, int resId, int priority) { 491e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill AssetFileDescriptor afd = context.getResources().openRawResourceFd(resId); 492e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int id = 0; 493e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (afd != null) { 494e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill id = _load(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength(), priority); 495e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill try { 496e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill afd.close(); 497e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } catch (java.io.IOException ex) { 498e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill //Log.d(TAG, "close failed:", ex); 499e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 500e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 501e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return id; 502e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 503e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 504e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(AssetFileDescriptor afd, int priority) { 505e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (afd != null) { 506e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill long len = afd.getLength(); 507e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (len < 0) { 508e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill throw new AndroidRuntimeException("no length for fd"); 509e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 510e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return _load(afd.getFileDescriptor(), afd.getStartOffset(), len, priority); 511a60e212d0dda7d2a748180ce77405f2463c9cf53Eric Laurent } else { 512e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return 0; 513a60e212d0dda7d2a748180ce77405f2463c9cf53Eric Laurent } 514f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 515f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 516e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(FileDescriptor fd, long offset, long length, int priority) { 517e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return _load(fd, offset, length, priority); 518e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 519e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 520e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private native final int _load(String uri, int priority); 521e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 522e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private native final int _load(FileDescriptor fd, long offset, long length, int priority); 523e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 524e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final boolean unload(int soundID); 525e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 526e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final int play(int soundID, float leftVolume, float rightVolume, 527e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int priority, int loop, float rate); 528e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 529e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void pause(int streamID); 530e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 531e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void resume(int streamID); 532e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 533e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void autoPause(); 534e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 535e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void autoResume(); 536e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 537e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void stop(int streamID); 538f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 539e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void setVolume(int streamID, 540e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill float leftVolume, float rightVolume); 541e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 542e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setVolume(int streamID, float volume) { 543e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill setVolume(streamID, volume, volume); 544f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 545f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 546e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void setPriority(int streamID, int priority); 547e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 548e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void setLoop(int streamID, int loop); 549e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 550e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void setRate(int streamID, float rate); 551e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 552e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener) 553e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill { 554e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill synchronized(mLock) { 555e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (listener != null) { 556e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // setup message handler 557e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill Looper looper; 558e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if ((looper = Looper.myLooper()) != null) { 559e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mEventHandler = new EventHandler(mProxy, looper); 560e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } else if ((looper = Looper.getMainLooper()) != null) { 561e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mEventHandler = new EventHandler(mProxy, looper); 562e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } else { 563e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mEventHandler = null; 564f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 565e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } else { 566e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mEventHandler = null; 567f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 568e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mOnLoadCompleteListener = listener; 569f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 570f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 571f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 572e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private class EventHandler extends Handler 573e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill { 574e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private SoundPool mSoundPool; 575e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 576e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public EventHandler(SoundPool soundPool, Looper looper) { 577e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill super(looper); 578e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mSoundPool = soundPool; 579e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 580f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 581e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill @Override 582e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void handleMessage(Message msg) { 583e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill switch(msg.what) { 584e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill case SAMPLE_LOADED: 585e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (DEBUG) Log.d(TAG, "Sample " + msg.arg1 + " loaded"); 586e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill synchronized(mLock) { 587e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (mOnLoadCompleteListener != null) { 588e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill mOnLoadCompleteListener.onLoadComplete(mSoundPool, msg.arg1, msg.arg2); 589e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 590e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 591e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill break; 592e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill default: 593e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill Log.e(TAG, "Unknown message type " + msg.what); 594e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return; 595e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 596e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 597f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 598e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 599e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill // post event from native code to message handler 600e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private static void postEventFromNative(Object weakRef, int msg, int arg1, int arg2, Object obj) 601e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill { 602e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill SoundPoolImpl soundPoolImpl = (SoundPoolImpl)((WeakReference)weakRef).get(); 603e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (soundPoolImpl == null) 604e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return; 605e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 606e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill if (soundPoolImpl.mEventHandler != null) { 607e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill Message m = soundPoolImpl.mEventHandler.obtainMessage(msg, arg1, arg2, obj); 608e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill soundPoolImpl.mEventHandler.sendMessage(m); 609e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 610e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 611e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 612e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public native final void release(); 613e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 614e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill private native final int native_setup(Object weakRef, int maxStreams, int streamType, int srcQuality); 615e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 616e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill protected void finalize() { release(); } 617f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks } 618f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks 619f6e43bf29084760b39257b2273e0f04c2815fdc5Dave Sparks /** 620e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * No-op implementation of SoundPool. 621e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * Used when media is disabled by the system. 622e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill * @hide 6236cb9900e6f884adb6c9aa0243f2bf88985f671f8Dave Sparks */ 624e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill /* package */ static class SoundPoolStub implements SoundPoolDelegate { 625e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public SoundPoolStub() { } 626e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 627e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(String path, int priority) { 628e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return 0; 629e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 630e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 631e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(Context context, int resId, int priority) { 632e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return 0; 633e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 634e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 635e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(AssetFileDescriptor afd, int priority) { 636e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return 0; 637e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 638e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 639e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public int load(FileDescriptor fd, long offset, long length, int priority) { 640e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return 0; 641e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 642e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 643e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final boolean unload(int soundID) { 644e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return true; 645e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 646e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 647e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final int play(int soundID, float leftVolume, float rightVolume, 648e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill int priority, int loop, float rate) { 649e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill return 0; 650e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 651e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 652e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void pause(int streamID) { } 653e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 654e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void resume(int streamID) { } 655e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 656e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void autoPause() { } 657e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 658e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void autoResume() { } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 660e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void stop(int streamID) { } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 662e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setVolume(int streamID, 663e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill float leftVolume, float rightVolume) { } 664e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 665e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setVolume(int streamID, float volume) { 666e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 667e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 668e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setPriority(int streamID, int priority) { } 669e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 670e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setLoop(int streamID, int loop) { } 671e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 672e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void setRate(int streamID, float rate) { } 673e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 674e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public void setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener) { 675e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 676e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill 677e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill public final void release() { } 678e4d9a01bfc7451afff1ed399a5801c7aa2af2831Dan Morrill } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 680