JSyn DualOscilloscope在我的声卡上打开两条线

时间:2015-06-23 14:30:18

标签: java audio jsyn

我创建了一个小程序来录制声音(我使用带有TargetDataLine的JavaSound来到我的声卡)。 我用JSYN的“DualOscilloscope.java”类进行了一些测试,以获得声音的视觉效果。 问题是他们的班级用“合成器”打开一行,所以我在我的声卡和我上面有两行触发异常(因为你不能在声卡上打开两行)。 是否可以使用我的实例化我的TargetDataLine来初始化JSYN的合成器?

The Latest JSyn JAR File

源代码类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 个答案:

答案 0 :(得分:0)

JSyn目前不支持传递TargetDataLine。但是,您可以根据GitHub上的源代码实现自己的AudioDeviceManager。将JavaSoundAudioDevice.java替换为使用TargetDataLine的JavaSoundAudioDevice.java,而不是创建一个新的。

更简单的方法是让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);