Как избавиться от ошибки?

#java #audio #audio-streaming #keylistener

#java #Аудио #потоковое аудио #keylistener

Вопрос:

Я пишу текстовый редактор, который должен фактически УКАЗЫВАТЬ текущую нажатую клавишу. Мне удалось это сделать, я даже подготовил файлы. И все работает просто отлично, но когда количество символов становится больше 29, компилятор говорит:

 javax.sound.sampled.LineUnavailableException: unable to obtain a line
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.connect(PulseAudioDataLine.java:279)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:102)
at org.classpath.icedtea.pulseaudio.PulseAudioDataLine.open(PulseAudioDataLine.java:289)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:402)
at org.classpath.icedtea.pulseaudio.PulseAudioClip.open(PulseAudioClip.java:453)
at TextEditor$AreaListener.keyPressed(Main.java:81)
at java.awt.Component.processKeyEvent(Component.java:6161)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
at java.awt.Component.processEvent(Component.java:5980)
at java.awt.Container.processEvent(Container.java:2105)
at java.awt.Component.dispatchEventImpl(Component.java:4564)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1881)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:749)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1025)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:892)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:713)
at java.awt.Component.dispatchEventImpl(Component.java:4434)
at java.awt.Container.dispatchEventImpl(Container.java:2163)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4390)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:649)
at java.awt.EventQueue.access$000(EventQueue.java:96)
at java.awt.EventQueue$1.run(EventQueue.java:608)
at java.awt.EventQueue$1.run(EventQueue.java:606)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:116)
at java.awt.EventQueue$2.run(EventQueue.java:622)
at java.awt.EventQueue$2.run(EventQueue.java:620)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:105)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:619)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
  

Вот часть моего исходного кода, где описывается класс, который реализует интерфейс KeyListener. Этот класс является слушателем моей основной текстовой области.

 class AreaListener implements KeyListener {
    @Override public void keyPressed( KeyEvent e) {
        try {
            AudioInputStream result1 = AudioSystem.getAudioInputStream(new File("/home/nikkka/Desktop/alphabet/blank.wav"));;
            if(new Character(e.getKeyChar()).isLetter(e.getKeyChar()))
                result1 = AudioSystem.getAudioInputStream(new File("/home/nikkka/Desktop/alphabet/" e.getKeyChar() "_EDITOR.wav"));
            DataLine.Info info = new DataLine.Info(Clip.class, result1.getFormat());
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(result1);
            clip.start();
        } catch(Exception e1) {e1.printStackTrace();}}
    @Override public void keyReleased(KeyEvent e) {}
    @Override public void keyTyped(   KeyEvent e) {
    }
}
  

Я не вижу, в чем проблема?… Более того, почему то, что работает для первых 29 символов, не должно работать на большем количестве? Может быть, это потому, что я должен закрыть клип на clip.close() after clip.start() ? Пожалуйста, помогите:-S

Ответ №1:

Вы получаете эту ошибку, потому что Line она недоступна из-за ограничений ресурсов, согласно документации, описанной здесь.

Я думаю, вам следует закрыть Line после того, как вы использовали его с Line.close() методом.

Редактировать: Правильный способ сделать это может быть следующим:

  1. создайте Clip объект при запуске приложения или создании объектов для обработки области ввода
  2. используйте этот Clip объект при нажатии клавиши в области ввода
  3. stop() и close() то Clip , когда приложение завершает работу или уничтожает область ввода

Это позволило бы сэкономить ресурсы.

Комментарии:

1. что ж, спасибо, но я действительно не могу понять, что вы имеете в виду … не могли бы вы, пожалуйста, быть более конкретными? : S какую строку вы имеете в виду? :S

2. Вы получаете Line в строке написано Clip clip = (Clip) AudioSystem.getLine(info); . После того, как вы ее использовали, вам следует освободить ресурс с помощью close метода.

3. Да, потому что Clip является подклассом Line .

4. Может случиться так, что я никогда не пользовался Clip и Line , вот почему я сказал, что вы должны освободить его после использования.

5. Кстати, почему бы вам не получить Line при запуске и не воспроизвести звук с этим объектом и освободить его перед выходом из вашей программы.

Ответ №2:

Это не сообщение об ошибке компилятора.

Это ошибка времени выполнения, которая, я бы предположил, означает, что не удалось прочитать данные в звуковом файле. Либо файл поврежден, либо имеет формат, который не поддерживается.

Комментарии:

1. На самом деле, единственный ключ, который я использую для тестирования, — это ключ «а». И в 29 раз это работает просто отлично. Это тот же ключ «a» и тот же файл «a_EDITOR.wav», который используется программой. И я все еще не могу понять причину, почему…