2014-04-23 100 views
1

我正在製作一個2D RPG遊戲,並且我想要獲得背景音樂的工作。我寫了一個可以在單獨的線程上播放音樂的健全類,但我無法弄清楚如何讓它循環播放。我的聲音類別如下:在Java中的單獨線程上循環播放音頻

package tileRPG.gfx; 

import java.io.File; 
import java.io.IOException; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.SourceDataLine; 


public class Sound implements Runnable 
{ 

    private String fileLocation = "res/bgMusic.wav"; 

    public Sound() { } 

    public void play() 
    { 
     Thread t = new Thread(this); 
     t.start(); 
    } 

    public void run() 
    { 
     playSound(fileLocation); 
    } 

    private void playSound(String fileName) 
    { 
     File soundFile = new File(fileName); 
     AudioInputStream audioInputStream = null; 
     try 
     { 
      audioInputStream = AudioSystem.getAudioInputStream(soundFile); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     AudioFormat audioFormat = audioInputStream.getFormat(); 
     SourceDataLine line = null; 
     DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); 
     try 
     { 
      line = (SourceDataLine) AudioSystem.getLine(info); 
      line.open(audioFormat); 
     } 
     catch (LineUnavailableException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     line.start(); 
     int nBytesRead = 0; 
     byte[] abData = new byte[128000]; 
     while (nBytesRead != -1) 
     { 
      try 
      { 
       nBytesRead = audioInputStream.read(abData, 0, abData.length); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      if (nBytesRead >= 0) 
      { 
       int nBytesWritten = line.write(abData, 0, nBytesRead); 
      } 
     } 
     line.drain(); 
     line.close(); 
    } 
} 
+0

你想再玩一次嗎?請確認。 – Braj

+0

我想讓它繼續播放,直到節目結束 –

+0

@gnomed,我想修復縮進,因爲它的可讀性不好。是的,如果作者不同意,他可以拒絕或撤消它。 –

回答

1
public void run() 
{ 
    while(true) 
    { 
     playSound(fileLocation); 
    } 
} 

這將創建一個無限循環。相應地調整。

當您啓動一個線程時,它將執行run()方法中的任何代碼,然後退出。所以這就是循環爲了重複播放聲音而去的地方(不會阻塞你的其他線程/代碼)。

此解決方案無法使用當前代碼停止此線程(因此會停止播放),但我認爲您正在分階段編寫該代碼。該線程將停止播放並在應用程序當前執行時退出。

+0

簡單而有效。感謝您的解決方案!我不能相信我沒有想到我自己 –

0

使用遞歸

示例代碼:

private void playSound(String fileName) 
{ 
    ... 
    line.drain(); 
    line.close(); 

    //recursive call to same method 
    playSound(fileName); 
} 

你可以把它更多地受run()方法移動方法playSound()的靜態部分更好。在這種情況下,您不需要再次讀取文件。

提示:通過SourceDataLine在方法而不是fileName

+0

這將阻止他們的代碼在播放過程中(因此永遠),我認爲這是不可取的。 – gnomed

+0

但我沒有在帖子中找到任何其他代碼。 – Braj

+0

我假設他使用線程的原因不是「有趣」。在這篇文章中甚至沒有主要的方法,所以我不會假設他們的程序沒有做別的事情(他們說這是一個2D遊戲) – gnomed