我無法弄清楚。我的代碼完美運行了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()));
}
}
}
你能提供你的代碼嗎? – Swapnil
顯示代碼和例外... –
我很害怕,好吧,我必須首先清理它。我一直在調試它,所以各地都有各種隨機的東西,我不會讓你篩選它,所以我會在幾分鐘後發佈它。 –