Потеря звуковой составляющей при обновлении - PullRequest
1 голос
/ 17 марта 2011

Я написал апплет, который передает звуковые данные с сервера и воспроизводит их через компьютер клиента.У меня есть клиент, заполучивший линию динамика со следующей функцией:

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 этогоПолагаю, свалка - это то место, где мы хотим начать поиск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...