SoundPool puse 只工作一次
SoundPool puse works only one time
这是我的代码:
int SC5;
sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
SC5 = sp.load(this, R.raw.c5, 1);
C5.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// PRESSED
sp.play(SC5, 1, 1, 0, 0, 1);
return true;
case MotionEvent.ACTION_UP:
// RELEASED
sp.pause(SC5);
return true;
}
return false;
}
});
我希望当我松开按钮时我的音池停止播放,这段代码有效,但只有一次。当我第二次按下按钮时,我无法停止声音
我无法使用 autoPause();
因为我在这个音池中还有其他文件
请帮忙
解决方案:
int streamId = -1;
C5.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// PRESSED
streamId = sp.play(SC5, 1, 1, 0, 0, 1);
return true;
case MotionEvent.ACTION_UP:
// RELEASED
sp.pause(streamId);
return true;
}
return false;
}
});
解释
您不能使用 SC5 暂停声音,因为 SC5 原来是一个 soundId。
有关更多信息,您应该查看 SoundPool 的文档,并注意用于播放 (soundId) 或暂停 (streamId) 声音的 ID。
/**
* Play a sound from a sound ID.
*
* Play the sound specified by the soundID. This is the value
* returned by the load() function. Returns a non-zero streamID
* if successful, zero if it fails. The streamID can be used to
* further control playback. Note that calling play() may cause
* another sound to stop playing if the maximum number of active
* streams is exceeded. A loop value of -1 means loop forever,
* a value of 0 means don't loop, other values indicate the
* number of repeats, e.g. a value of 1 plays the audio twice.
* The playback rate allows the application to vary the playback
* rate (pitch) of the sound. A value of 1.0 means play back at
* the original frequency. A value of 2.0 means play back twice
* as fast, and a value of 0.5 means playback at half speed.
*
* @param soundID a soundID returned by the load() function
* @param leftVolume left volume value (range = 0.0 to 1.0)
* @param rightVolume right volume value (range = 0.0 to 1.0)
* @param priority stream priority (0 = lowest priority)
* @param loop loop mode (0 = no loop, -1 = loop forever)
* @param rate playback rate (1.0 = normal playback, range 0.5 to 2.0)
* @return non-zero streamID if successful, zero if failed
*/
public final int play(int soundID, float leftVolume, float rightVolume,
int priority, int loop, float rate);
/**
* Pause a playback stream.
*
* Pause the stream specified by the streamID. This is the
* value returned by the play() function. If the stream is
* playing, it will be paused. If the stream is not playing
* (e.g. is stopped or was previously paused), calling this
* function will have no effect.
*
* @param streamID a streamID returned by the play() function
*/
public final void pause(int streamID);
这是我的代码:
int SC5;
sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
SC5 = sp.load(this, R.raw.c5, 1);
C5.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// PRESSED
sp.play(SC5, 1, 1, 0, 0, 1);
return true;
case MotionEvent.ACTION_UP:
// RELEASED
sp.pause(SC5);
return true;
}
return false;
}
});
我希望当我松开按钮时我的音池停止播放,这段代码有效,但只有一次。当我第二次按下按钮时,我无法停止声音
我无法使用 autoPause();
因为我在这个音池中还有其他文件
请帮忙
解决方案:
int streamId = -1;
C5.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
// PRESSED
streamId = sp.play(SC5, 1, 1, 0, 0, 1);
return true;
case MotionEvent.ACTION_UP:
// RELEASED
sp.pause(streamId);
return true;
}
return false;
}
});
解释
您不能使用 SC5 暂停声音,因为 SC5 原来是一个 soundId。
有关更多信息,您应该查看 SoundPool 的文档,并注意用于播放 (soundId) 或暂停 (streamId) 声音的 ID。
/**
* Play a sound from a sound ID.
*
* Play the sound specified by the soundID. This is the value
* returned by the load() function. Returns a non-zero streamID
* if successful, zero if it fails. The streamID can be used to
* further control playback. Note that calling play() may cause
* another sound to stop playing if the maximum number of active
* streams is exceeded. A loop value of -1 means loop forever,
* a value of 0 means don't loop, other values indicate the
* number of repeats, e.g. a value of 1 plays the audio twice.
* The playback rate allows the application to vary the playback
* rate (pitch) of the sound. A value of 1.0 means play back at
* the original frequency. A value of 2.0 means play back twice
* as fast, and a value of 0.5 means playback at half speed.
*
* @param soundID a soundID returned by the load() function
* @param leftVolume left volume value (range = 0.0 to 1.0)
* @param rightVolume right volume value (range = 0.0 to 1.0)
* @param priority stream priority (0 = lowest priority)
* @param loop loop mode (0 = no loop, -1 = loop forever)
* @param rate playback rate (1.0 = normal playback, range 0.5 to 2.0)
* @return non-zero streamID if successful, zero if failed
*/
public final int play(int soundID, float leftVolume, float rightVolume,
int priority, int loop, float rate);
/**
* Pause a playback stream.
*
* Pause the stream specified by the streamID. This is the
* value returned by the play() function. If the stream is
* playing, it will be paused. If the stream is not playing
* (e.g. is stopped or was previously paused), calling this
* function will have no effect.
*
* @param streamID a streamID returned by the play() function
*/
public final void pause(int streamID);