2014-02-05 10 views
0

Я попытался работать с javax.sound.sampled-пакетом.Способы пользовательской реализации TargetDataLine не вызываются

Я попытался реализовать свою собственную версию TargetDataLine (для целей тестирования на данном этапе). К моему большому разочарованию, однако, когда я закончил и попытался «воспроизвести» его, ни один из его методов не был вызван (и не было никаких исключений), но вместо этого программа застыла.

Сегмент кода в вопросе выглядит следующим образом:

try { 
    // create stream. 
    AssembledDataLine line = new AssembledDataLine(); 
    AudioInputStream stream = new AudioInputStream(line); 

    // create content. 
    int size = 65536; 
    byte[] array = new byte[size]; 
    byte inc = 1; 
    byte pos = (byte) 0; 
    for (int i = 0; i < size; ++i) { 
    array[i] = (pos += inc); 
    if (pos == 127) { 
     inc = -1; 
    } else if (pos == -128) { 
     inc = 1; 
    } 
    } 
    line.writeArray(array); 

    // play. 
    System.out.println("starting to play."); 
    Clip clip = AudioSystem.getClip(); 
    clip.loop(Clip.LOOP_CONTINUOUSLY); 
    System.out.println("got clip"); 
    clip.open(stream); 
    System.out.println("opened"); 
    clip.start(); 
    Thread.sleep(5000); 
    System.out.println("started"); 
    clip.close(); 
    System.out.println("end."); 
} catch (Exception e) { 
    e.printStackTrace(); 
    System.out.println("error"); 
} 

Приведенный выше код никогда не достичь «открыл» заявление, или выбросить исключение. Я попытался вставить распечатку в каждый метод, реализованный в AssembledDataLine, но ни один из них никогда не вызывается (за исключением writeArray, который вызывается перед открытием потока).

Так что в этот момент я думаю, что метод Clip.open (stream) замерзает даже до достижения точки получения входа от потока.

Я попытался открыть файл таким же образом, и это сработало, поэтому я полагаю, что это связано с тем, как я создаю AudioInputStream.

+0

Вы пытались отлаживать метод 'Clip.open()'? Какую реализацию 'Clip' вы используете? Как он использует объект AudioInputStream? – mdewitt

+0

Clip - это класс из пакета javax.sound.sampled, поэтому я не могу напрямую его отлаживать. То же самое касается AudioInputStream, поэтому я не могу ответить на один из вопросов выше. Я попытался понять документацию этих классов и их объектов, но мне не удалось:/ – TreffnonX

+1

Вы можете добавить банку из javax. на ваш путь к классу, а затем вы можете отлаживать его. Используйте jdk во время выполнения вместо jre и добавьте jr из библиотеки jdk в ваш путь к классам. Но вы должны иметь возможность, по крайней мере, использовать отладчик, чтобы увидеть, какая реализация Clip будет возвращена из AudioSystem.getClip() – mdewitt

ответ

0

Ответом было то, что клип, не ссылаясь непосредственно на метод AssembledDataLine, будет запрашивать обертывание AudioInputStream, формат которого используется. В этом была моя ошибка. При создании аудиоформата я изменил значения FRAME_RATE и FRAME_SIZE. Это означало, что аудиоформат был недействительным и, таким образом, клип затормозился при распределении достаточной памяти для фактического воспроизведения входных данных.

 Смежные вопросы

  • Нет связанных вопросов^_^