Я попытался работать с 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.
Вы пытались отлаживать метод 'Clip.open()'? Какую реализацию 'Clip' вы используете? Как он использует объект AudioInputStream? – mdewitt
Clip - это класс из пакета javax.sound.sampled, поэтому я не могу напрямую его отлаживать. То же самое касается AudioInputStream, поэтому я не могу ответить на один из вопросов выше. Я попытался понять документацию этих классов и их объектов, но мне не удалось:/ – TreffnonX
Вы можете добавить банку из javax. на ваш путь к классу, а затем вы можете отлаживать его. Используйте jdk во время выполнения вместо jre и добавьте jr из библиотеки jdk в ваш путь к классам. Но вы должны иметь возможность, по крайней мере, использовать отладчик, чтобы увидеть, какая реализация Clip будет возвращена из AudioSystem.getClip() – mdewitt