SoundPoolは、ほかのタスクがバックグラウンドで実行されているときにうまく再生され、単独で再生するときに壊れます

最も奇妙なこと。アニメーションが再生されているとき、サウンドエフェクトがはっきりと聞こえますが、アニメーションを再生していないときは、サウンドエフェクトが壊れます。ここにコードです:

private void Feedback(boolean success)
{
    Log.d(TAG, "Feedback");
    if(success)
    {
        PlayCreatureSound();
        ShowAnimatedCreature();
    }
    else
    {
        PlayFailedSound();
    }
}

private void PlayCreatureSound()
{
    Log.d(TAG, "PlayCreatureSound");
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float leftVolume = curVolume/maxVolume;
      float rightVolume = curVolume/maxVolume;      
    spCreatureVoice.play(iCreatureVoicesId[lastCreature.ordinal()], leftVolume, rightVolume, 1, 0, 1);
}

private void PlayFailedSound()
{
    Log.d(TAG, "PlayFailedSound");
    spCreatureVoice.stop(iCreatureVoicesId[FeedbackCreature.FC_COUNT.ordinal()]);
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float leftVolume = curVolume/maxVolume;
      float rightVolume = curVolume/maxVolume;      
    spCreatureVoice.play(iCreatureVoicesId[FeedbackCreature.FC_COUNT.ordinal()], leftVolume, rightVolume, 1, 0, 1);
}

private void ShowAnimatedCreature()
{
    Log.d(TAG, "ShowAnimatedCreature");
   //show the creature
    ibtnShapes[lastTargetLocation].setImageBitmap(bmCreatures[lastCreature.ordinal()]); 
   //animate
    ibtnShapes[lastTargetLocation].startAnimation(rotate[0]);
}

私はすでに試しました: 1.ファイルの切り替え 2. MediaPlayerの使用 3. "spCreatureVoice.stop(..." 4.優先順位の変更

1

2 答え

あなたがFeedbackCreature構造体をどのように扱っているのか、またはstopメソッドにあるのかもしれません。あなたは同時に2つのサウンドエフェクトを演奏しようとしていますか?

これらの2つのメソッドは非常に多くのコードを共有しているため、以下のように組み合わせることをお勧めします。問題の絞り込みに役立つかもしれません。

private void Feedback(boolean success)
{
    Log.d(TAG, "Feedback");
    if(success)
    {
        int creatureOrdinal = lastCreature.ordinal();
        PlaySound(creatureOrdinal );
        ShowAnimatedCreature(creatureOrdinal );
    }
    else
    {
        int creatureOrdinal = FeedbackCreature.FC_COUNT.ordinal();
        spCreatureVoice.stop(iCreatureVoicesId[creatureOrdinal]);
        PlaySound(creatureOrdinal);
    }
}


private void PlaySound(int creatureOrdinal)
{
    Log.d(TAG, "PlayCreatureSound");
    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
      float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
      float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
      float leftVolume = curVolume/maxVolume;
      float rightVolume = curVolume/maxVolume;      
    spCreatureVoice.play(iCreatureVoicesId[creatureOrdinal], leftVolume, rightVolume, 1, 0, 1);
}

private void ShowAnimatedCreature(int creatureOrdinal)
{
    Log.d(TAG, "ShowAnimatedCreature");
   //show the creature
    ibtnShapes[lastTargetLocation].setImageBitmap(bmCreatures[creatureOrdinal]); 
   //animate
    ibtnShapes[lastTargetLocation].startAnimation(rotate[0]);
}
0
追加された
したがって、唯一の違いは、spCreatureVoice.stopメソッドまたはこのメソッドの呼び出し方法です。 stopメソッドと、これを呼び出したコードの部分を失敗ケース(通常のケース)に投稿してください。
追加された 著者 Noah,
サウンドのプール記述:リソースの制約のためにストリームを停止できるため、streamIDはストリームの特定のインスタンスへの参照です。優先順位の高いストリームを再生できるようにストリームが停止している場合、そのストリームはもはや有効ではありません。ただし、アプリケーションはエラーなしでstreamIDのメソッドを呼び出すことができます。これは、アプリケーションがストリームライフサイクルに関わる必要がないため、プログラムロジックを簡素化するのに役立ちます。 developer.android.com/reference/android/media/SoundPool.html
追加された 著者 Noah,
あなたのコードは少しきれいですが、私の問題は残っています。一度に1つのストリームしか再生していませんが、アニメーションが再生されているときだけ、サウンドはクリアです。アニメーションは簡単な回転です。
追加された 著者 Redrori,
停止はSoundPool APIの一部であり、私はそれを改善することなく削除しようとしました。フィードバック(true)が機能し、フィードバック(false)が壊れています。私が考えることができるのは、エミュレータでのみ起こっていること、またはアニメーションですべてのCPUを使用しないと、アンドロイドがバックグラウンドで動作していることです。
追加された 著者 Redrori,
OKだから私はSoundPoolのコンストラクタのストリームの数を増やし、改善のないストリームのタイプを変更しようとしました。上の見積もりや常識から、アニメーションが再生されているときに音が壊れると思うでしょう。
追加された 著者 Redrori,
私は現在、この人が書いたことを見ています:
追加された 著者 Redrori,
[link] stackoverflow .com/questions/7437505 /…
追加された 著者 Redrori,
別のスレッドやサービスでサウンドを再生しようとしても問題は解決しませんでした
追加された 著者 Redrori,

これはエミュレータの問題のように見えます。実際のデバイスで何の問題も聞こえません。

0
追加された
Androidのエミュレータが最高ではないことはかなりよく知られています。それは良いツールですが、デバイスでほとんどのテストを行うようにしてください。 (少なくとも複数のデバイスを買う余裕のないデバイスをテストする必要があるまで))
追加された 著者 Codeman,