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