public class SoundPool
extends Object
java.lang.Object | |
↳ | android.media.SoundPool |
SoundPool类管理和播放应用程序的音频资源。
SoundPool是一组样本,可以从APK中的资源或文件系统中的文件加载到内存中。 SoundPool库使用MediaPlayer服务将音频解码为原始16位PCM单声道或立体声流。 这允许应用程序随压缩流一起提供,而不必在播放过程中承受CPU负载和解压延迟。
除了低延迟播放之外,SoundPool还可以管理一次渲染的音频流数量。 当构建SoundPool对象时,maxStreams参数设置可从此单个SoundPool一次播放的最大流数。 SoundPool跟踪活动流的数量。 如果超过了最大数量的数据流,SoundPool会根据优先级自动停止先前播放的数据流,然后根据该优先级按年龄自动停止。 限制数据流的最大数量有助于限制CPU负载,并降低混音会影响视觉效果或UI性能的可能性。
声音可以通过设置非零循环值来循环。 值为-1会导致声音循环永久。 在这种情况下,应用程序必须显式调用stop()函数来停止声音。 任何其他非零值都会导致声音重复指定的次数,例如,值为3会导致声音总共播放4次。
播放速率也可以改变。 1.0的播放速率会导致声音以其原始频率播放(如果需要,重新采样至硬件输出频率)。 2.0的播放速率会使声音以原始频率的两倍播放,0.5的播放速度会使其以原始频率的一半播放。 播放速率范围是0.5到2.0。
优先级从低到高,即数字越大,优先级越高。 当创建SoundPool时,对play()的调用会导致活动流的数量超过maxStreams参数所确定的值时使用优先级。 在这种情况下,流分配器将停止最低优先级的流。 如果有多个具有相同低优先级的流,它将选择最旧的流停止。 在新流的优先级低于所有活动流的情况下,新的声音将不会播放,并且play()函数将返回0的流ID。
让我们来看一个典型的用例:一个游戏包含多个层次的游戏。 对于每个级别,都有一组仅用于该级别的独特声音。 在这种情况下,游戏逻辑应该在第一级加载时创建一个新的SoundPool对象。 关卡数据本身可能包含此关卡使用的声音列表。 加载逻辑遍历调用相应SoundPool.load()函数的声音列表。 这通常应该在流程的早期完成,以便在需要播放之前有时间将音频解压为原始PCM格式。
一旦声音加载并开始播放,应用程序可以通过调用SoundPool.play()来触发声音。 播放流可以暂停或恢复,应用程序还可以通过实时调整播放速率来改变音高,以获得多普勒效应或综合效果。
请注意,由于流可因资源限制而停止,因此streamID是对流的特定实例的引用。 如果流停止以允许播放更高优先级的流,则流不再有效。 但是,应用程序可以无错地调用streamID上的方法。 这可能有助于简化程序逻辑,因为应用程序不需要关注流生命周期。
在我们的例子中,当玩家完成关卡时,游戏逻辑应该调用SoundPool.release()来释放所有正在使用的本地资源,然后将SoundPool参考设置为null。 如果玩家开始另一个关卡,则会创建一个新的SoundPool,声音会被载入,然后重新开始播放。
Nested classes |
|
---|---|
class |
SoundPool.Builder |
interface |
SoundPool.OnLoadCompleteListener
|
Public constructors |
|
---|---|
SoundPool(int maxStreams, int streamType, int srcQuality) 此构造函数在API级别21中已弃用。请使用 |
Public methods |
|
---|---|
final void |
autoPause() 暂停所有活动的流。 |
final void |
autoResume() 恢复以前所有活动的流。 |
int |
load(Context context, int resId, int priority) 从指定的APK资源加载声音。 |
int |
load(String path, int priority) 加载指定路径的声音。 |
int |
load(AssetFileDescriptor afd, int priority) 加载资产文件描述符中的声音。 |
int |
load(FileDescriptor fd, long offset, long length, int priority) 加载来自FileDescriptor的声音。 |
final void |
pause(int streamID) 暂停播放流。 |
final int |
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) 从声音ID播放声音。 |
final void |
release() 释放SoundPool资源。 |
final void |
resume(int streamID) 恢复播放流。 |
final void |
setLoop(int streamID, int loop) 设置循环模式。 |
void |
setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener listener) 设置OnLoadCompleteListener的回调钩子。 |
final void |
setPriority(int streamID, int priority) 更改流优先级。 |
final void |
setRate(int streamID, float rate) 更改播放速率。 |
final void |
setVolume(int streamID, float leftVolume, float rightVolume) 设置流量。 |
final void |
stop(int streamID) 停止播放流。 |
final boolean |
unload(int soundID) 从声音ID中卸载声音。 |
Protected methods |
|
---|---|
void |
finalize() 当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
SoundPool (int maxStreams, int streamType, int srcQuality)
此构造函数在API级别21中已弃用。
改用SoundPool.Builder
来创建和配置SoundPool实例
构造函数。 构造具有以下特征的SoundPool对象:
Parameters | |
---|---|
maxStreams |
int : the maximum number of simultaneous streams for this SoundPool object |
streamType |
int : the audio stream type as described in AudioManager For example, game applications will normally use STREAM_MUSIC . |
srcQuality |
int : the sample-rate converter quality. Currently has no effect. Use 0 for the default. |
Returns | |
---|---|
|
a SoundPool object, or null if creation failed |
void autoPause ()
暂停所有活动的流。 暂停当前正在播放的所有数据流。 此函数迭代所有活动流并暂停正在播放的所有活动流。 它还设置了一个标志,以便通过调用autoResume()可以恢复正在播放的任何流。
int load (Context context, int resId, int priority)
从指定的APK资源加载声音。 请注意,扩展名被丢弃。 例如,如果要从原始资源文件“explosion.mp3”加载声音,则应将“R.raw.explosion”指定为资源ID。 请注意,这意味着res / raw目录中不能同时包含“explosion.wav”和“explosion.mp3”。
Parameters | |
---|---|
context |
Context : the application context |
resId |
int : the resource ID |
priority |
int : the priority of the sound. Currently has no effect. Use a value of 1 for future compatibility. |
Returns | |
---|---|
int |
a sound ID. This value can be used to play or unload the sound. |
int load (String path, int priority)
加载指定路径的声音。
Parameters | |
---|---|
path |
String : the path to the audio file |
priority |
int : the priority of the sound. Currently has no effect. Use a value of 1 for future compatibility. |
Returns | |
---|---|
int |
a sound ID. This value can be used to play or unload the sound. |
int load (AssetFileDescriptor afd, int priority)
加载资产文件描述符中的声音。
Parameters | |
---|---|
afd |
AssetFileDescriptor : an asset file descriptor |
priority |
int : the priority of the sound. Currently has no effect. Use a value of 1 for future compatibility. |
Returns | |
---|---|
int |
a sound ID. This value can be used to play or unload the sound. |
int load (FileDescriptor fd, long offset, long length, int priority)
加载来自FileDescriptor的声音。 如果您将多个声音存储在单个二进制文件中,此版本非常有用。 偏移量指定从文件起始处的偏移量,长度指定文件中声音的长度。
Parameters | |
---|---|
fd |
FileDescriptor : a FileDescriptor object |
offset |
long : offset to the start of the sound |
length |
long : length of the sound |
priority |
int : the priority of the sound. Currently has no effect. Use a value of 1 for future compatibility. |
Returns | |
---|---|
int |
a sound ID. This value can be used to play or unload the sound. |
void pause (int streamID)
暂停播放流。 暂停streamID指定的流。 这是play()函数返回的值。 如果该流正在播放,它将被暂停。 如果数据流没有播放(例如停止播放或之前暂停播放),则调用此函数将不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
从声音ID播放声音。 播放由soundID指定的声音。 这是load()函数返回的值。 如果成功则返回非零流ID,如果失败则返回零。 streamID可用于进一步控制播放。 请注意,如果超过最大活动流数,则调用play()可能会导致另一个声音停止播放。 循环值-1意味着永远循环,值0表示不循环,其他值表示重复次数,例如值1表示播放音频两次。 回放速率允许应用程序改变声音的回放速率(音高)。 1.0值意味着以原始频率播放。 值为2.0意味着播放速度快两倍,值为0.5意味着以半速播放。
Parameters | |
---|---|
soundID |
int : a soundID returned by the load() function |
leftVolume |
float : left volume value (range = 0.0 to 1.0) |
rightVolume |
float : right volume value (range = 0.0 to 1.0) |
priority |
int : stream priority (0 = lowest priority) |
loop |
int : loop mode (0 = no loop, -1 = loop forever) |
rate |
float : playback rate (1.0 = normal playback, range 0.5 to 2.0) |
Returns | |
---|---|
int |
non-zero streamID if successful, zero if failed |
void release ()
释放SoundPool资源。 释放SoundPool对象使用的所有内存和本机资源。 SoundPool不能再使用,并且引用应该设置为null。
void resume (int streamID)
恢复播放流。 恢复由streamID指定的流。 这是play()函数返回的值。 如果数据流暂停,则会恢复播放。 如果该流先前未暂停,则调用此函数将不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
void setLoop (int streamID, int loop)
设置循环模式。 改变循环模式。 循环值-1意味着永远循环,值0表示不循环,其他值表示重复次数,例如值1表示播放音频两次。 如果流不存在,它将不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
loop |
int : loop mode (0 = no loop, -1 = loop forever) |
void setOnLoadCompleteListener (SoundPool.OnLoadCompleteListener listener)
设置OnLoadCompleteListener的回调钩子。
Parameters | |
---|---|
listener |
SoundPool.OnLoadCompleteListener
|
void setPriority (int streamID, int priority)
更改流优先级。 更改由streamID指定的流的优先级。 这是play()函数返回的值。 影响重新使用流播放新声音的顺序。 如果流不存在,它将不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
priority |
int
|
void setRate (int streamID, float rate)
更改播放速率。 回放速率允许应用程序改变声音的回放速率(音高)。 1.0值表示以原始频率播放。 值为2.0意味着播放速度快两倍,值为0.5意味着以半速播放。 如果流不存在,它将不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
rate |
float : playback rate (1.0 = normal playback, range 0.5 to 2.0) |
void setVolume (int streamID, float leftVolume, float rightVolume)
设置流量。 设置由streamID指定的流上的音量。 这是play()函数返回的值。 该值必须在0.0到1.0的范围内。 如果流不存在,它将不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
leftVolume |
float : left volume value (range = 0.0 to 1.0) |
rightVolume |
float : right volume value (range = 0.0 to 1.0) |
void stop (int streamID)
停止播放流。 停止streamID指定的流。 这是play()函数返回的值。 如果正在播放流,它将被停止。 它还释放与此流关联的所有本机资源。 如果流不在播放,则不起作用。
Parameters | |
---|---|
streamID |
int : a streamID returned by the play() function |
boolean unload (int soundID)
从声音ID中卸载声音。 卸载由soundID指定的声音。 这是load()函数返回的值。 如果声音已成功卸载,则返回true;如果声音已被卸载,则返回false。
Parameters | |
---|---|
soundID |
int : a soundID returned by the load() function |
Returns | |
---|---|
boolean |
true if just unloaded, false if previously unloaded |
void finalize ()
当垃圾收集确定没有更多对该对象的引用时,由对象上的垃圾回收器调用。 子类重写finalize
方法来处置系统资源或执行其他清理。
的常规协定finalize
是,它被调用,如果当在Java TM虚拟机已确定不再有由该目的可以通过还没有死亡,除了作为一个动作的结果的任何线程访问的任何手段取决于某些其他可以完成的对象或类别的最终定稿。 finalize
方法可以采取任何行动,包括使该对象再次可用于其他线程; 然而, finalize
的通常目的是在对象被不可撤销地丢弃之前执行清理操作。 例如,表示输入/输出连接的对象的finalize方法可能会执行显式I / O事务,以在永久丢弃该对象之前中断连接。
类Object
的finalize
方法Object
执行特殊操作; 它只是正常返回。 Object
子类可以覆盖此定义。
Java编程语言不保证哪个线程将为任何给定对象调用finalize
方法。 但是,保证调用finalize的线程在调用finalize时不会保留任何用户可见的同步锁。 如果finalize方法引发未捕获的异常,则忽略该异常,并终止该对象的终止。
在为对象调用 finalize
方法后,在Java虚拟机再次确定没有任何方法可以通过尚未死亡的任何线程访问此对象之前,不会采取进一步的操作,包括可能的操作通过准备完成的其他对象或类别,此时该对象可能被丢弃。
对于任何给定对象,Java虚拟机永远不会多次调用 finalize
方法。
由 finalize
方法引发的任何异常 finalize
导致终止此对象的终止,但会被忽略。