2015-05-09 110 views
1

這是我的健全課。在Java中啓動和停止音樂文件?

public class Sounds extends Thread { 

private String filename; 
private Position curPosition; 
private final int EXTERNAL_BUFFER_SIZE = 524288; 

enum Position { 
    LEFT, RIGHT, NORMAL 
}; 

public Sounds(String wavFile) { 
    filename = wavFile; 
    curPosition = Position.NORMAL; 
} 

public Sounds(String wavfile, Position p) { 
    filename = wavfile; 
    curPosition = p; 
} 

public void run() { 

    File soundFile = new File(filename); 
    if (!soundFile.exists()) { 
     System.err.println(".wav file not found: " + filename); 
     return; 
    } 

    AudioInputStream audioInputStream = null; 
    try { 
     audioInputStream = AudioSystem.getAudioInputStream(soundFile); 
    } catch (UnsupportedAudioFileException e1) { 
     e1.printStackTrace(); 
     return; 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
     return; 
    } 

    AudioFormat format = audioInputStream.getFormat(); 
    SourceDataLine auline = null; 
    DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); 

    try { 
     auline = (SourceDataLine) AudioSystem.getLine(info); 
     auline.open(format); 
    } catch (LineUnavailableException e) { 
     e.printStackTrace(); 
     return; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return; 
    } 

    if (auline.isControlSupported(FloatControl.Type.PAN)) { 
     FloatControl pan = (FloatControl) auline 
       .getControl(FloatControl.Type.PAN); 
     if (curPosition == Position.RIGHT) 
      pan.setValue(1.0f); 
     else if (curPosition == Position.LEFT) 
      pan.setValue(-1.0f); 
    } 

    auline.start(); 
    int nBytesRead = 0; 
    byte[] abData = new byte[EXTERNAL_BUFFER_SIZE]; 

    try { 
     while (nBytesRead != -1) { 
      nBytesRead = audioInputStream.read(abData, 0, abData.length); 
      if (nBytesRead >= 0) 
       auline.write(abData, 0, nBytesRead); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return; 
    } finally { 
     auline.drain(); 
     auline.close(); 
    } 
} 
} 

這是我的ActionListener,當用戶單擊按鈕時我想停止音樂。音樂在啓動時播放。

btnSound.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     btnSound.setVisible(false); 
     btnNoSound.setVisible(true); 
     new Sounds("Sounds/MenuMusic.wav").end(); 
    } 
}); 

我可以讓音樂播放得很好,但我無法弄清楚如何阻止它。我嘗試使用.stop()和.end(),但我被告知他們已被棄用。任何人有任何想法我可以做到這一點?謝謝。

+0

'新的聲音(「聽起來/ MenuMusic.wav」)結束();'因爲這不是**正在播放的'Sounds'的實例**,它什麼都不會實現。該代碼需要引用**原始的'聲音'對象。** –

回答

1

您可以使用片段類。這是我讀一個.wav文件和播放它的代碼:

try { 
    File file = new File(src); // src is the location of the file 
    AudioInputStream stream = AudioSystem.getAudioInputStream(file); 
    Clip clip = AudioSystem.getClip(); 
    clip.open(stream); 
    clip.start(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

那是,clip.stop()將停止剪輯。要重置剪輯,請使用clip.setFramePosition(0)。請注意,clip不需要需要關閉,因爲如果在clip.start()之後調用clip.close(),剪輯將不會播放。

希望這就是你要找的!

編輯:作用域

在Java中使用的作用域,如果你在一個方法聲明一個局部變量,你不能在方法外部訪問它。如果您要訪問的主要方法外夾,將其解壓縮到一個字段:

class Main { 
    static Clip clip; 
    public static void main (String... args) { 
     try { 
      File file... 
      clip = AudioSystem.getClip(); 
      ... 
     } catch... 
    } 
} 
+0

我嘗試過使用該方法。但我無法完成它的工作。 – NemoLKLK

+0

我有剪輯設置,它的工作,但我不能訪問我的主要方法以外的剪輯功能。 – NemoLKLK

+0

*「但我無法訪問我的主要方法外的剪輯功能。」*這是一個基本的面向對象問題,與當前問題無關。但我的建議是:修復並使用'Clip'來代替。 –