2013-04-11 131 views
0

我正在做一个Java的DAW,实际上它比它更基本,我用我曾经拥有的旧Tascam 4轨录音机来模拟它。我试图在录音时监视音频,尽可能减少两者之间的延迟(延迟)。如果我在同一个线程中写入音频字节,我正在读取它们的延迟时间很长(如果您想查看我拥有的代码,我会发布它,但由于我认为它需要重写,因此似乎无关紧要) 。我一直在想的是使用生产者,消费者线程和队列来在其间存储字节块。所以我的生产者线程将从TargetDataLine中读取字节并将它们存储在队列中,可能使用返回读取的字节数的方法,以便在while循环中检查EOF。并创建一个并发线程,它将队列中存储的字节块(当它们是要写入的字节时)并将它们写入SourceDataLine。我的想法是同时运行的两个线程几乎可以在读取字节的同时写入字节,或者至少比现在更好,但我想知道其他人如何解决这个问题。java生产者消费者线程监控音频

此外,我需要确保我的使用者线程等待队列中是否有字节,并在添加字节时再通知再次开始写入字节,如果有人会发布正确方法的示例来同步两个线程,我将不胜感激。我知道他们必须在同步代码块中,我应该使用多个锁吗?我不是要求一个特定于音频的例子,而只是一个通用的例子,它增加了一些东西,然后删除它,任何帮助表示赞赏。谢谢。

回答

1

你可以(和probbaly应该)为生产者 - 消费者实现使用单个锁对象。像

public final static Object LOCK = new Object(); 

然后在农产品()方法,你就会有这样的代码:

synchronized(LOCK) { 
    //place stuff in queue 
    LOCK.notifyAll(); //wake up any sleepers 
} 

,并在你的消费()方法,你将有另一面:

synchronized(LOCK) { 
    if (anything in queue) { 
     return something 
    } 
    //queue is empty - wait 
    while (nothing in queue) { //while bit is important - we might wakeup for no reason or someone else might grab everything leaving us with nothing 
     try { 
     Lock.wait(); 
     } catch (InterruptedException ex) { 
     //99% of java code ignores these spurious wakeups, and they also hardly ever really happen 
     } 
    } 
} 

但这是老派。更现代的Java版本有整齐地包装所有这些低级伏都教的类。例如ArrayBlockingQueue。你可以定义一个“全局”静态队列,然后分别为你生成()和使用()实现使用offer()和take()。

但是,如果您真的关心延迟,我会多花一分钱,并使用精确写入低延迟线程间通信的库。这样的库的一个很好的例子是the disruptor,它比ArrayBlockingQueue声称更好的延迟。

+0

我喜欢干扰链接 – 2013-04-11 05:33:18