4

クラス MySoundPool を作成しました (このクラスを sigelton として使用していますが、他のすべてが機能するため、これは関係ないと思います)。私は、HashMap である SoundPool を初期化し、AudioManager のコンテキストを取得しています。その後、2 つのサウンドをロードしています。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レベル1

サウンドIDからサウンドを再生します。soundIDで指定した音を鳴らします。これは、load()関数によって返される値です。成功した場合はゼロ以外のstreamIDを返し、失敗した場合はゼロを返します。streamIDを使用して、再生をさらに制御できます。

戻り値

non-zero streamID if successful, zero if failed 

同じ問題がありましたが、なぜFMを読まないのですか?:D

-みんなありがとう!

于 2012-03-23T07:46:30.217 に答える