2017-02-13 8 views
0

私はLibGDXでゲームを作っています。同時に2つのメロディを再生する必要があります。しかし、Androidの読み込みと再生では、2つのメロディーは機能しません。ここで私がやった小さなテストです。私はLibGDX AssetManagerを使ってみましたが、まだ成功しませんでした。LibGDXでAndroid上で2つの音楽インスタンスを再生できない

Music test1; 
Music test2; 

AssetManager manager = new AssetManager(); 

@Override public void create() 
{ 
    manager.load(Melody.REVERSION.getPath(), Music.class); 
    manager.load(Melody.COLLAPSE.getPath(), Music.class); 

    while (!manager.update()) {} 
    manager.finishLoading(); 

    test1 = manager.get(Melody.REVERSION.getPath()); 
    test2 = manager.get(Melody.COLLAPSE.getPath()); 

    test1.setVolume(1); 
    test1.play(); 
    test2.setVolume(1); 
    test2.play(); 
} 
+0

おそらく関連している:http://gamedev.stackexchange.com/questions/104893/sounds-overlapping-when-playing-too-many-at-the-same-timeとhttp://stackoverflow.com/questions/15742812/ android-gdx-sound-performance-issue –

答えて

0

私は現在SoundPoolライブラリを使用しています。 これで私は異なるサウンドエフェクトを同時に再現できますが、それが音楽の最良の方法であるかどうかわかりません。

郵便関連:Play sound using soundpool example

のMediaPlayerとCyclicBarrierをを使用して編集

public enum MP_COMMAND { 
    START, 
    STOP, 
    PAUSE 
} 

/** 
* Uses threads to execute synced commands for the current video media player and 
* background music player in tandem. 
*/ 
public void syncedCommand(MediaPlayer player1, MediaPlayer player2, MP_COMMAND command) { 
    final CyclicBarrier commandBarrier = new CyclicBarrier(2); 
    new Thread(new SyncedCommandService(commandBarrier, player1, command)).start(); 
    new Thread(new SyncedCommandService(commandBarrier, player2, command)).start(); 
} 

/** 
* Inner class that starts a given media player synchronously 
* with other threads utilizing SyncedStartService 
*/ 
private class SyncedCommandService implements Runnable { 
    private final CyclicBarrier    mCommandBarrier; 
    private  MediaPlayerTest.MP_COMMAND mCommand; 
    private  MediaPlayer    mMediaPlayer; 

    public SyncedCommandService(CyclicBarrier barrier, MediaPlayer player, MediaPlayerTest.MP_COMMAND command) { 
     mCommandBarrier = barrier; 
     mMediaPlayer = player; 
     mCommand = command; 
    } 

    @Override public void run() { 
     try { 
      mCommandBarrier.await(); 
     } catch (InterruptedException | BrokenBarrierException e) { 
      e.printStackTrace(); 
     } 

     switch (mCommand) { 
      case START: 
       mMediaPlayer.start(); 
       break; 

      case STOP: 
       mMediaPlayer.stop(); 
       break; 

      case PAUSE: 
       mMediaPlayer.pause(); 
       break; 

      default: 
       break; 
     } 
    } 
} 

を両方の曲を再生するには、これを呼び出す:

MediaPlayer mCurrentVideoPlayer = MediaPlayer.create(this, R.raw.track1); 
MediaPlayer mBackgroundMusic = MediaPlayer.create(this, R.raw.track2); 

syncedCommand(mCurrentVideoPlayer, mBackgroundMusic, MP_COMMAND.START); 

参考:Playing multiple songs with MediaPlayer at the same time: only one is really playing

+0

LibGDXではサウンドと音楽が異なります。サウンドはメモリに完全にロードされ、再生中のインスタンスはいくつでも構いません。ただし、サウンドは1 MB未満のファイルに対してのみ機能します。あなたは一般的にサウンドエフェクトのためにサウンドを使用します。たとえば、ガンショットのように、私は音楽を使用する必要があります。音楽は、音楽ファイルのコンテンツをストリーミングすることによって動作します。 AndroidのバックエンドでMediaPlayerを使用します。音楽は、再生が必要な長い曲に使用されます。私は2つの音を同時に実行する必要はありません。 – BananyaDev

+0

ああ、あなたはMediaPlayerを使ってみることができます。私はこれを読んでいます:http://stackoverflow.com/questions/26379441/playing-multiple-songs-with-mediaplayer-at-the-same-time-only-one-is-本当にplaはおそらくあなたを助けることができます。 – Santi

+0

MP_COMMAND.STARTを実行してMP_COMMAND.PAUSEをすばやく実行すると、すべてのスレッドが終了していない場合、どのように最後のアクションをキャンセルしますか? – Billyjoker

関連する問題