Я написал апплет, который передает звуковые данные с сервера и воспроизводит их через компьютер клиента.У меня есть клиент, заполучивший линию динамика со следующей функцией:
private SourceDataLine getSourceDataLine() {
try {
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
for (Mixer.Info mi : AudioSystem.getMixerInfo()) {
SourceDataLine dataline = null;
try {
Mixer mixer = AudioSystem.getMixer(mi);
dataline = (SourceDataLine)mixer.getLine(info);
dataline.open(format);
dataline.start();
return dataline;
}
catch (Exception e) {
e.printstacktrace();
}
if (dataline != null)
try {
dataline.close();
}
catch (Exception e) {
e.printstacktrace();
}
}
}
catch (Exception e) {
e.printstacktrace();
}
return null;
}
Эта функция вызывается почти сразу после открытия веб-страницы, и она прекрасно работает при первом открытии страницы.Однако, если вы обновите страницу, все остальное работает нормально при перезапуске, но вы теряете звук.Это связано с тем, что оригинальный апплет не полностью закрывается к моменту создания нового, поэтому исходный SourceDataLine все еще используется, когда новый апплет пытается получить его.Ему все еще удается найти его, но это не тот, который на самом деле подключается к динамикам.
Я полагаю, что одним из решений было бы всегда иметь функцию, ожидающую определенное количество времени, прежде чем пытаться получить SourceDataLine,но это не выглядит особенно элегантно, и я бы хотел, чтобы программа как можно быстрее захватила нужную линию данных.
Итак, есть ли у кого-нибудь какие-либо советы о том, как я могу это сделать, или я симпатичная?сильно застрял?
- РЕДАКТИРОВАТЬ -
Я добавил несколько следов стека (по совету Эндрю) и вот что я получил:
javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian not supported.
at javax.sound.sampled.LineUnavailableException: line with format PCM_SIGNED 44100.0 Hz, 16 bit, stereo, 4 bytes/frame, big-endian not supported.
at com.sun.media.sound.DirectAudioDevice$DirectDL.implOpen(DirectAudioDevice.java:494)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:107)
at com.sun.media.sound.AbstractDataLine.open(AbstractDataLine.java:139)
at view.PlaybackThread.getSourceDataLine(PlaybackThread.java:120)
at view.PlaybackThread.loadSoundData(PlaybackThread.java:99)
at view.PlaybackThread.<init>(PlaybackThread.java:33)
at model.GUIModule.<init>(GUIModule.java:77)
at model.GUIMainApplet.createAndShowGUI(GUIMainApplet.java:24)
at model.GUIMainApplet.access$0(GUIMainApplet.java:22)
at model.GUIMainApplet$1.run(GUIMainApplet.java:17)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:642)
at java.awt.EventQueue.access$000(EventQueue.java:85)
at java.awt.EventQueue$1.run(EventQueue.java:603)
at java.awt.EventQueue$1.run(EventQueue.java:601)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:612)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Строка 6 этогоПолагаю, свалка - это то место, где мы хотим начать поиск.