JSyn DualOscilloscope Two открытая линия на моей звуковой карте

Я создал небольшую программу для записи звука (я использую JavaSound с TargetDataLine, чтобы добраться до моей звуковой карты). Я провел некоторое тестирование с классом " DualOscilloscope.java " JSYN для визуального представления звука. Проблема в том, что их класс открывает строку с "Синтезатором", поэтому у меня на звуковой карте две касания, что вызывает исключение (так как вы не можете открыть две строки на звуковой карте). Можно ли использовать мой экземпляр TargetDataLine для инициализации синтезатора JSYN?

Последний файл JSyn JAR

Исходный код класса DualOscilloscope (автор Phil Burk)

   protected void startAudio(int itemIndex) {
  // Both stereo.
  int numInputChannels = deviceMaxInputs.get(itemIndex);
  if (numInputChannels > 2)
     numInputChannels = 2;
  int inputDeviceIndex = deviceIds.get(itemIndex);
  synth.start(16000, inputDeviceIndex, numInputChannels, AudioDeviceManager.USE_DEFAULT_DEVICE, 0);
  channel1.output.connect(pass1.input);
  // Only connect second channel if more than one input channel.
  if (numInputChannels > 1) {
     channel2.output.connect(pass2.input);
  }

  // We only need to start the LineOut. It will pull data from the
  // channels.
  scope.start();

1 ответ

Решение

JSyn в настоящее время не поддерживает передачу TargetDataLine. Однако вы можете реализовать свой собственный AudioDeviceManager на основе исходного кода на GitHub. Замените JavaSoundAudioDevice.java на тот, который использовал ваш TargetDataLine вместо создания нового.

Более простым способом было бы позволить JSyn открыть аудиовход, а затем использовать этот вход в вашей программе. Не открывайте свою собственную TargetDataLine.

Вы можете использовать JSyn для обработки аудио или для сохранения его в виде файла WAVE. Если вам нужно выполнить пользовательскую обработку, то вы можете написать собственный генератор единиц. Или вы можете использовать AudioStreamReader для потоковой передачи аудиоданных в ваш собственный поток.

AudioStreamReader reader = new AudioStreamReader(synth, 2); // stereo
lineIn.connect(0, read.getInput(), 0);
lineIn.connect(1, read.getInput(), 1);

Затем вы можете читать данные из этого считывателя, а не из собственной TargetDataLine.

reader.read(buffer, start, count);
Другие вопросы по тегам