我有一个应用程序可以收听四个输入音频通道(这四个通道可以来自完全不同的来源)。
我的问题是如何有效地实现这一点。起初我尝试简单地嵌套以下代码:
try (TargetDataLine line = (TargetDataLine) m1.getLine(info1)) {
line.open(format1);
line.start();
对于四个频道,彼此之间。但是,如果一个源被停止或消失,这将起作用,这将阻止所有子TargetDataLines执行。
然后我意识到想要单独控制,为每个输入创建一个线程可能更好。 (我正在使用音频缓冲区,然后进行去交错以获得所需的通道,然后转换为此数组的浮点数,然后再进行处理)。所以我开始这样做,并有四个运行代码的线程实例。 然而,这似乎使应用程序运行速度慢得多,并且另一个线程上的其他进程开始花费更长时间。 (值得注意的是,我代表传入音频通道的流量计的过程从大约需要20毫秒处理到3100毫秒才能处理!),
audioInput(String name, String audiointerface, String selectedchannel, String totalchannel ){
threadName = name;
interfaceName = audiointerface;
selectedChannel = selectedchannel;
totalChannel = totalchannel;
}
public void run(){
synchronized (audioInputMonitor){
System.out.println("audipInput1 Threrad is running");
while (continuousLoop){
while(!pauseInput){
try {
System.out.println("captureaudio method loading");
captureAudio1();
System.out.println("Finished capture method");
} catch (ParseException ex) {
Logger.getLogger(audioInput.class.getName()).log(Level.SEVERE, null, ex);
} catch (LineUnavailableException ex) {
Logger.getLogger(audioInput.class.getName()).log(Level.SEVERE, null, ex);
}
}
while (pauseInput){
try {
System.out.println("t is waiting");
audioInputMonitor.wait();
System.out.println("t finished waiting");
} catch (InterruptedException ex) {
System.out.println("Interrupted waiting");
}
}
}
public void start(){
System.out.println("Starting " + threadName);
t = new Thread (this, threadName);
t.start();
}
然后我创建了这个线程的四个实例。 captureAudio()是一个正在运行的进程,它打开一个targetdataline,它具有给定格式,用于发送到此代码顶部的audioInput的变量。然后,该过程在连续循环上始终将流馈送到缓冲器。
理想情况下,我只想运行三个线程,我的应用程序线程,一个用于音频IO,一个用于处理数据。是否可以有一个线程,并在其中创建同时在连续循环上运行的类的四个实例?我很难看到如何有效地做到这一点。另外我开始时是正确的,需要嵌套四组起始线,一组在另一组内,以使它们保持在同一个线程中。