4

我创建了一个 MySoundPool 类(我将这个类用作 sigelton,但不认为这是相关的,因为其他一切都有效)。我正在初始化 SoundPool,一个 HashMap,并获取 AudioManager 的上下文。此后,我正在加载两个声音。MySoundpool 由方法 MySoundPool.playSound(int index, float rate) playSound 剪辑速率为 0.5 <= rate >= 2.0 并执行语句

float streamVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
streamVolume = streamVolume / mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);

到现在为止还挺好。一切正常。不,在前一个声音仍在播放时调用 playSound ,我想在播放新声音之前停止它。在上面的代码片段之前我试过

mSoundPool.stop(mSoundPoolMap.get(index));

mSoundPool.autoPause();

没有成功。声音只是继续播放到最后。任何意见将不胜感激

4

3 回答 3

13

我假设您在 MySoundPool 类的构造函数中创建了一个新的 SoundPool 对象?

如果是这样,那么 SoundPool 的构造函数采用的第一个参数是同时允许的流数。例如...

mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);

这将允许同时播放 10 种声音,因此只需将 10 更改为 1 即可。

编辑: stop() 方法将流 id 作为参数,它应该是从 play() 方法返回的数字。您可以尝试设置一个等于 play() 返回的变量,然后在停止声音时使用该变量。

于 2011-07-27T18:40:07.150 回答
10

使用 soundId 播放声音,但使用 streamId 停止它。这些并不总是相同的数字!

启动声音时,存储返回的 streamId:

int myStreamId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);

然后使用该 streamId(不是 soundId)来停止声音:

mSoundPool.stop(myStreamId);
于 2014-02-03T22:52:57.133 回答
2

正如课堂文件中所说:

public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) 自:API Level 1

从声音 ID 播放声音。播放由 soundID 指定的声音。这是 load() 函数返回的值。如果成功则返回一个非零的流 ID,如果失败则返回零。streamID 可用于进一步控制播放。

退货

non-zero streamID if successful, zero if failed 

有同样的问题,为什么不看FM!:D

-多谢你们!

于 2012-03-23T07:46:30.217 回答