2011-07-27 69 views
2

我已經創建了一個類MySoundPool(我使用這個類作爲sigelton,但不認爲這是相關的,因爲所有其他作品)。我正在初始化SoundPool,一個HashMap,並獲取AudioManager的上下文。此後我加載了兩個聲音。 MySoundpool使用由方法MySoundPool.playSound(INT指數,浮動率) playSound剪輯速率〜0.5 < =率> = 2.0的執行語句Android的SoundPool.stop似乎不工作

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(); 

沒有成功。聲音繼續發揮到最後。 任何意見將不勝感激

回答

9

我假設你在MySoundPool類的構造函數中創建一個新的SoundPool對象?

如果是這樣,那麼SoundPool的構造函數採用的第一個參數是同時允許的流的數量。例如...

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

這將允許10個聲音一次播放,所以只需將10改爲1,那應該做到這一點。

編輯: stop()方法將流id作爲參數,它應該是從play()方法返回的數字。你可以嘗試設置一個等於play()返回的變量,然後在停止聲音時使用該變量。

+0

什麼花招!不使SoundPool.stop()工作,但它服務於我的需求。完美無缺的答謝基蘭! – Addi

+0

沒問題,是的這是一種解決方法,但我只是意識到我沒有真正回答你的問題,而是提供了一種解決方法。看看我上面的編輯,看看如何得到停止工作我相信這是因爲你給stop()錯誤的參數... – DRiFTy

+0

確實!它不是mSoundPoolMap.get(index),而是通過mSoundPool.play(...) 的調用返回的streamID再次感謝您爲我節省了一天 – Addi

2

,因爲它說的類文件中:

公衆最終詮釋戲(INT soundID,浮leftVolume,浮rightVolume,INT優先級,INT迴路,浮動利率) 自:API等級1

播放來自聲音ID的聲音。播放由soundID指定的聲音。這是load()函數返回的值。如果成功則返回非零流ID,如果失敗則返回零。 streamID可用於進一步控制播放。

返回

有同樣的問題,爲什麼一個沒有閱讀的女性男! :D

- 謝謝夥計!

3

使用soundId播放聲音,但使用streamId將其停止。這些並不總是相同的數字!

當您啓動聲音,存儲返回流ID:

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

然後使用流ID(不是soundId)停止聲音:

mSoundPool.stop(myStreamId);