2010-10-21 115 views
1

我使用下面的方法播放录制的声音,它工作正常,但它为什么只播放一次,第二次单击播放按钮时,它什么都不做,如何重置数据?Java声音只播放一次?

// Write data to the OutputChannel. 
    public class Playback implements Runnable 
    { 
    SourceDataLine line; 
    Thread thread; 

    public void start() 
    { 
     errStr=null; 
     thread=new Thread(this); 
     thread.setName("Playback"); 
     thread.start(); 
    } 

    public void stop() { thread=null; } 

    private void shutDown(String message) 
    { 
     if ((errStr=message)!=null) 
     { 
     System.err.println(errStr); 
     samplingGraph.repaint(); 
     } 
     if (thread!=null) 
     { 
     thread=null; 
     samplingGraph.stop(); 
     if (Java_Sound.Running_In_All_Permissions_Mode) captB.setEnabled(true); 
     pausB.setEnabled(false); 
     playB.setText("Play"); 
     } 
    } 

    public void run() 
    { 
     AudioFormat format=formatControls.getFormat();            // get an AudioInputStream of the desired format for playback 
     AudioInputStream playbackInputStream=AudioSystem.getAudioInputStream(format,audioInputStream); 

     if (playbackInputStream==null) 
     { 
     shutDown("Unable to convert stream of format "+audioInputStream+" to format "+format); 
     return; 
     } 
     SourceDataLine.Info info=new DataLine.Info(SourceDataLine.class,format);      // define the required attributes for our line,and make sure a compatible line is supported. 

     if (AudioSystem.isLineSupported(info)) 
     { 
     try                      // get and open the source data line for playback. 
     { 
      line=(SourceDataLine)AudioSystem.getLine(info); 
      line.open(format,bufSize); 
     } 
     catch (LineUnavailableException ex) 
     { 
      shutDown("Unable to open the line: "+ex); 
      return; 
     } 
     int frameSizeInBytes=format.getFrameSize();            // play back the captured audio data 
     int bufferLengthInFrames=line.getBufferSize()/8; 
     int bufferLengthInBytes=bufferLengthInFrames*frameSizeInBytes; 
     byte[] data=new byte[bufferLengthInBytes]; 
     int numBytesRead=0; 
     line.start();                    // start the source data line 
     while (thread!=null) 
     { 
      try 
      { 
      if ((numBytesRead=playbackInputStream.read(data))==-1) break; 
      int numBytesRemaining=numBytesRead; 
      while (numBytesRemaining>0) { numBytesRemaining-=line.write(data,0,numBytesRemaining); } 
      } 
      catch (Exception e) 
      { 
      shutDown("Error during playback: "+e); 
      break; 
      } 
     } 
     } 
     if (thread!=null) line.drain();                // we reached the end of the stream. Let the data play out,then stop and close the line. 
     line.stop(); 
     line.close(); 
     line=null; 
     shutDown(null); 
    } 
    } 

经过我的测试,我发现这条线是造成问题

if ((numBytesRead=playbackInputStream.read(data))==-1) break;

我第一次回放,有数据,它工作得很好,但第二次,它打破了。为什么?如何解决它?

回答

0

我想通了,添加以下行之后“关闭(空)”

if (file==null) 
    try { audioInputStream.reset(); } 
    catch (Exception e) { e.printStackTrace(); } 

现在它运行完美。

0

从未使用过java音频,但由于您使用的是流,因此如果该选项可用,则需要重置流,或者每次读取时都需要创建新流。