我已经创建了一个类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();
没有成功。声音继续发挥到底。 任何意见将不胜感激
答案 0 :(得分:11)
我假设您在MySoundPool类的构造函数中创建了一个新的SoundPool对象?
如果是这样,那么SoundPool的构造函数所采用的第一个参数是同时允许的流的数量。例如......
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
这样可以同时播放10个声音,所以只需将10改为1即可。
编辑: stop()方法将stream id作为参数,该参数应该是play()方法返回的数字。您可以尝试设置一个等于play()返回的变量,然后在停止声音时使用该变量。
答案 1 :(得分:7)
使用soundId播放声音但使用streamId停止声音。这些并不总是相同的数字!
启动声音时,请存储返回的streamId:
int myStreamId = mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume, index, 0, rate);
然后使用streamId(而不是soundId)来停止声音:
mSoundPool.stop(myStreamId);
答案 2 :(得分:2)
正如课堂文件所述:
public final int play(int soundID,float leftVolume,float rightVolume,int priority,int loop,float rate) 自:API Level 1
播放声音ID中的声音。播放soundID指定的声音。这是load()函数返回的值。如果成功则返回非零streamID,如果失败则返回零。 streamID可用于进一步控制回放。
返回
non-zero streamID if successful, zero if failed
有同样的问题,为什么一个人不读F? :D
- 谢谢你们!