2012-01-03 7 views
1

私はAndroidアプリのサウンドを再生するためにSoundPoolを使用しています。すべてのサウンドは、アプリケーション自体の遅れを防ぐために、アプリケーションの開始時に読み込まれます。ループするように設定されていない限り、すべてのサウンドは正常に再生されます。ループをtrue(-1に設定)に設定すると、サウンドは再生されません。Androidでループが-1に設定されているとサウンドが再生されない

ユーザーの入力に応じて、停止と開始の6種類の音があります。それは最初の音の罰金を再生しますが、その後の音は再生に失敗します。

私は、停止するよりも一時停止する、ボリュームを0に設定する、一時停止するのではなく0にループする、ループを実際の繰り返しではなく任意の大きな整数に設定して、これらのどれもうまくいきませんでした。

public int loadSound(int soundFile) 
{ 
    int soundID; 

    try 
    { 
     if (m_loadedSounds.containsKey(soundFile)) 
     { 
      soundID = m_loadedSounds.get(soundFile); 
     } 
     else 
     {   
      soundID = m_soundPool.load(m_context, soundFile, 1); 
      m_loadedSounds.put(soundFile, soundID); 
     } 
    } 
    catch (Exception e) 
    { 
     soundID = -1; 
    } 

    return soundID; 
} 

public void playSound(int soundFile, boolean loop) 
{ 
    // Grab it from the map 
    int soundID = loadSound(soundFile); 

    int loops = loop ? -1 : 0; 
    float streamVolume = m_audioManager.getStreamVolume(AudioManager.STREAM_MUSIC); 
    streamVolume /= m_audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 

    // If succeeded then play the sound 
    if (soundID != -1) 
    { 
     if (m_soundStreams.containsKey(soundID)) 
     { 
      int streamID = m_soundStreams.get(soundID); 
      m_soundPool.setLoop(streamID, loops); 
      m_soundPool.resume(streamID); 
     } 
     else 
     { 
      int streamID = m_soundPool.play(soundID, streamVolume, streamVolume, 1, loops, 1.0f); 
      Log.d("SOUNDS", "Sound played! ID: " + soundID + " At volume: " + streamVolume + " Looping: " + (loop ? "Yes": "No") + " Success: " + (streamID != 0 ? "Yes" : "No")); 

      if (streamID != 0) 
      { 
       m_soundStreams.put(soundID, streamID); 
      } 
     } 
    } 
} 

public void stopSound(int soundFile) 
{ 
    int soundID = loadSound(soundFile); 

    Integer streamID = m_soundStreams.get(soundID); 

    if (streamID != null) 
    { 
     m_soundPool.pause(streamID); 
    } 
} 

、実行時にLogCatに指定されたエラーは、次のとおりです:次のように

私のコードがある

01-03 16:03:20.142: ERROR/AudioFlinger(2359): not enough memory for AudioTrack size=670096 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): AudioTrack (0x389a0, size=1048576) 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):  0: 0005b090 | 0x00000000 | 0x00010080 | F 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):  1: 0006db58 | 0x00010080 | 0x0007B8A0 | A 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):  2: 0005af70 | 0x0008B920 | 0x0005C280 | A 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359):  3: 000752c0 | 0x000E7BA0 | 0x00018460 | F 
01-03 16:03:20.142: DEBUG/MemoryDealer(2359): size allocated: 883488 (862 KB) 
01-03 16:03:20.142: ERROR/AudioTrack(11584): AudioFlinger could not create track, status: -12 
01-03 16:03:20.142: ERROR/SoundPool(11584): Error creating AudioTrack 

誰もがこの厄介な問題への解決策を知っている、またはいずれかの回避策ん私は試していない?

+0

どのような形式のオーディオとファイルのサイズですか? SoundPoolは時々気難しいです。小さな.oggファイルでうまく動作します。 – robertly

+0

サウンドは<3秒、.ogg形式です – Luke

答えて

1

最高の解決策は、これを行っているサウンドに特殊なケースを入れ、これらのサウンドにMediaPlayerを使用することです。その後、私が使用していないときにそれらを解放してから、再度再生したいときにそれらをリロードすることを、私は&で止めなければなりません。音が変わるときに目立つ、しかしわずかな、ローディング時間がありますが、それは私ができる最高です。他の答えはまだ大いに評価されるだろう。

0

メモリが漏れないように、サウンドプールのリソースをonPause()で解放していることを確認してください。 onResume()でサウンドをロードする必要があります。

0

私は同じ問題を抱えていました。ループさせたい音を再生するときは、音の優先度を99に設定し、残りの音量を下げてください。ハイガーは、ハイガーの優先順位を評価します。しかし、音を鳴らすときに大きなレイテンシの問題があります。何か解決策があれば私に知らせてください(私もIDプールとしてサウンドプールを使用しています)

Which I mean: 
int streamID = m_soundPool.play(soundID, streamVolume, streamVolume, 99, loops, 1.0f); 
関連する問題