2013-01-03 26 views
0

我無法弄清楚。我的代碼完美運行了43次,然後當Clip對象試圖重新打開線路時,我得到一個LineUnsupportedException。它的節拍器如此精確的時間是非常重要的,我已經將代碼編寫成了一個功能強大的點。我創建了一個Clip[]Clip對象,度量有多少個節拍,我循環瀏覽while循環中的所有對象,並且每個度量都關閉並刷新剪輯,並定義Clip對象的新的Clip[],如果我不不時地關閉線,並重置所有音頻將停止播放,我不知道是否剪輯isActive()方法返回false或發生了什麼,但該解決方案似乎已經解決了問題,直到我開始得到這個異常,任何想法可能會導致它?我的線程正好循環了43次然後拋出一個異常

下面是最後一個工作循環的例外我的輸出...

蜱...

數:42

循環完成:6

節拍時長應該是:499

剩餘時間到睡眠:493

蜱...

COUNT :: 43

無法獲得線

的java:/建造/ buildd /的openjdk-6-6b24 -1.11.5/build /../ pulseaudio/src/native/org_classpath_icedtea_pulseaudio_Stream.c:720:Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1cork:聲明`流'失敗。

,目前兩個班參與了這個線程...

Ticker.java

package com.timer; 

import java.io.IOException; 

import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.UnsupportedAudioFileException; 

public class Ticker extends Thread { 

private App app; 

private String[] soundFiles; 

private Ticker() { 
} 

public Ticker(App app) { 
    this.app = app; 
    soundFiles = new String[app.getBeatsPerMeasure()]; 
} 

private AudioInputStream stream; 

private Clip[] ticks; 
AudioFormat format; 
DataLine.Info dataLineInfo; 

public String setFileNames() { 
    for (int i = 0; i < app.getBeatsPerMeasure(); i++) { 
     soundFiles[i] = "firstBeatCut.au"; 
    } 
    return ""; 
} 

public String loadArray(int... iArray) { 
    if (iArray.length != app.getBeatsPerMeasure()) { 
     return "Sorry there was an error."; 
    } 
    for (int i = 0; i < iArray.length; i++) { 
     iArray[i] = i; 
     System.out.println(iArray[i]); 
    } 
    return ""; 
} 

public void tick() { 
    long difference, timeTaken, timeAllowedToSleep, before, after; 
    long idealTime; 

    int i = 0; 
    int count = 0; 

    ticks = new Clip[app.getBeatsPerMeasure()]; 

    while (app.isTicking()) { 
     System.out.println("Tick..."); 

     before = System.nanoTime(); 

     try { 

      stream = AudioSystem.getAudioInputStream(this.getClass() 
        .getResource("./firstBeatCut.au")); 

     } catch (UnsupportedAudioFileException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     if (ticks[i] != null && ticks[i].isRunning()) { 
      ticks[i].stop(); 
      if (ticks[i].isActive()) { 
       ticks[i].close(); 
      } 
     } 

     count++; 
     System.out.println("COUNT:: " + count); 
     try { 
      ticks[i] = (Clip) AudioSystem.getClip(); 
      if (!ticks[i].isOpen()) { 
       ticks[i].open(stream); 
      } 
     } catch (LineUnavailableException e) { 
      System.out.println(e.getMessage()); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     ticks[i].setMicrosecondPosition(0); 

     if (ticks[i].isOpen()) { 
      ticks[i].setMicrosecondPosition(0L); 
      ticks[i].start(); 
     } else { 
      try { 
       ticks[i].open(stream); 
      } catch (LineUnavailableException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      ticks[i].setMicrosecondPosition(0); 
      ticks[i].start(); 
     } 

     idealTime = app.calculateSleep(app.getBPM()) 
       - ticks[i].getMicrosecondLength(); 

     after = System.nanoTime(); 

     timeTaken = (after - before); 
     difference = (idealTime - timeTaken); 
     System.out.println("Loop completed in: " + (timeTaken/1000000L) 
       + "\nBeat Duration should be: " + (idealTime/1000000L) 
       + "\nTime left to sleep: " + (difference/1000000L)); 

     timeAllowedToSleep = difference; 

     if (timeAllowedToSleep > 0) { 
      try { 
       Thread.currentThread().sleep(timeAllowedToSleep/1000000L); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     System.out.println(i); 

     stopTick(ticks[i], ++i); 
     if (i == app.getBeatsPerMeasure()) { 
      i = 0; 
     } 
    } 
} 

public void closeTick(Clip tick) { 
    tick.close(); 
} 

public void stopTick(Clip tick, int index) { 
    tick.stop(); 
    if (index == 4) { 
     closeTick(tick); 

     try { 
      tick = AudioSystem.getClip(); 
     } catch (LineUnavailableException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void play(Clip tick) { 
    tick.setMicrosecondPosition(0L); 
    tick.start(); 
} 

public long calculateTimeAllowedToSleep(long sTime, long time) { 
    long diff = time - sTime; 
    long timeToSleep; 
    long ssTime = 60000/120; 
    timeToSleep = ssTime - diff; 
    return timeToSleep; 

} 

} 

ActionHandler.java

package com.timer; 

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JSpinner; 
import javax.swing.SpinnerNumberModel; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class ActionHandler implements ActionListener, ChangeListener { 

private App app; 
Ticker ticker; 
Thread t1; 
private int beatsInMeasure; 
private boolean ticking; 

public ActionHandler(final App app) { 
    this.app = app; 
    this.ticker = new Ticker(app); 
    beatsInMeasure = app.getTimeSignature()[0]; 
    ticking = app.isTicking(); 
    ticker.loadArray(0,1,2,3); 
} 

private Runnable doTick = new Runnable() { 
    public void run() { 
     while (app.isTicking()) { 

      ticker.tick(); 

     } 
    } 
}; 

public void actionPerformed(ActionEvent e) { 
    JButton b = (JButton) e.getSource(); 
    if (b == app.getBtnStart()) { 
     if (b.getText().equalsIgnoreCase("Start")) { 
      app.setStartText("Stop"); 
      app.resetEnabled(false); 
      ticker.setFileNames(); 
      app.setTicking(true); 
      t1 = new Thread(doTick); 
      t1.start(); 
     } else { 
      app.setStartText("Start"); 
      app.resetEnabled(true); 
      app.setTicking(false); 
      app.setTicking(false); 
      try { 
       t1.join(); 
      } catch (InterruptedException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
     } 
    } else if (b == app.getBtnReset()) { 
     app.reset(); 
    } 
} 

@Override 
public void stateChanged(ChangeEvent e) { 
    JSpinner sp = (JSpinner) e.getSource(); 
    SpinnerNumberModel model = app.getModel(); 
    if (sp.getValue() != null) { 
     app.calculateSleep(Integer.parseInt(String.valueOf(
       sp.getModel().getValue()).toString())); 
    } 
} 
} 
+0

你能提供你的代碼嗎? – Swapnil

+4

顯示代碼和例外... –

+0

我很害怕,好吧,我必須首先清理它。我一直在調試它,所以各地都有各種隨機的東西,我不會讓你篩選它,所以我會在幾分鐘後發佈它。 –

回答

0

如果你打開一條線,只要將其關閉你每次都完成它。我從Ticker中的stop方法中刪除了if語句,它完美地工作。我要睡覺,感謝所有評論過的人。

相關問題