簡體   English   中英

Java生產者使用者線程,用於監視音頻

[英]java producer consumer threads for monitoring audio

我正在用Java制作DAW,實際上它比這更基礎,我以我曾經擁有的舊Tascam 4-Track記錄器為模型進行了建模。 我正在嘗試在錄制時盡可能減少兩者之間的延遲(延遲)的同時監視音頻。 如果我在同一線程中寫入音頻字節,則在讀取它們的過程中存在大量延遲(如果您想查看我擁有的代碼,我會將其發布,但這似乎無關緊要,因為我認為需要重寫) 。 我一直在考慮做的事情是使用生產者,使用者線程和隊列在兩者之間存儲字節塊。 因此,我的生產者線程可能會從TargetDataLine讀取字節並將其存儲在隊列中,可能使用一種返回讀取字節數的方法,以便可以在while循環中檢查EOF。 並創建一個並發線程,該線程獲取存儲在隊列中的字節塊(當它們是要寫入的字節時),並將其寫入SourceDataLine 我的想法是,兩個同時運行的線程幾乎能夠在讀取它們的同時寫入字節,或者至少比我現在擁有的更好,但是我想知道其他人如何解決了這個問題。

我還需要確保我的使用者線程等待隊列中沒有字節,並在添加字節以開始再次寫入字節時得到通知,如果有人發布了同步兩個線程的正確方法的示例,欣賞它。 我知道它們必須位於同步代碼塊中,我應該使用多個鎖嗎? 我不是在問音頻的特定示例,而只是在將示例添加到集合中然后將其刪除的一般示例,我們將不勝感激。 謝謝。

在“經典” java中,您可以(並且可能應該)將單個鎖定對象用於生產者-消費者實現。 就像是

public final static Object LOCK = new Object();

然后在您的Produce()方法中,您將獲得如下代碼:

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 您可以只定義一個“全局”靜態隊列,然后分別對produce()和consume()實現使用offer()和take()。

但是,如果您真的擔心延遲,我會加倍努力,並使用專門為低延遲線程間通信編寫的庫。 此類庫的一個很好的例子是破壞者 ,它聲稱延遲比ArrayBlockingQueue好得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM