2016-05-28 9 views
0

Ich setze eine Musikdatei für den MediaPlayer für mein Spiel, aber es verursacht eine Verzögerung von 2 Sekunden, wenn es eine Schleife macht.Android - Wie MediaPlayer Loop-Verzögerungen zu entfernen?

Mein Code:

boolean activateSounds = getIntent().getBooleanExtra("Activate sounds", true); 

    if(mp!=null){ 
     mp.reset(); 
     mp.release(); 
    } 
    mp = MediaPlayer.create(StartGame.this, R.raw.music1); 
    mp.setVolume(8f, 8f); 
    mp.setLooping(true); // This is causing delays 
    if (activateSounds) mp.start(); 

Für ein Spiel, das ist nicht interessant. Gibt es eine Möglichkeit, MediaPlayer die Schleifenverzögerung zu nehmen?

Antwort

1

Ich konnte SetLooping nicht ohne Lücke arbeiten.

Einzige Lösung, die für mich funktionierte, war SetNextMediaPlayer Aufruf (der in der Lage ist, nächste Schleife ohne eine Lücke zu starten) und zwei MediaPlayer.

'pseudo' Code:

class Abc implements MediaPlayer.OnCompletionListener { 

private final MediaPlayer[] mps = new MediaPlayer[2]; 

public Abc() { 
    mps[0] = new MediaPlayer(); 
    mps[1] = new MediaPlayer(); 
    mps[0].setOnCompletionListener(this); 
    mps[1].setOnCompletionListener(this); 
} 

public void start() 
    initMediaPlayer(mps[0]); 
    initMediaPlayer(mps[1]); 

    mps[0].setNextMediaPlayer(mps[1]); 
    mps[0].start(); 
} 

private void initMediaPlayer(MediaPlayer mp) 
{ 
    if (mp.isPlaying()){ 
      mp.stop(); 
    } 
    mp.reset(); 

    final float volume = 0.07f; 

    mp.setDataSource(MY_SOURCE); 
    mp.setVolume(volume, volume); 
    mp.setLooping(false); 

    try { 
     mp.prepare(); 
    }catch(Exception error){ 
     Log.d("BackgroundMusic", error.toString()); 
    } 
} 

@Override 
public void onCompletion(MediaPlayer mp) 
{ 
    MediaPlayer cur = mps[0] == mp ? mps[1] : mps[0]; 

    initMediaPlayer(mp); 
    cur.setNextMediaPlayer(mp); 
} 

}