簡體   English   中英

VST插件:如何實現“前瞻”緩沖區?

[英]VST Plug-In: How to implement a “lookahead” buffer?

我的目標是編寫一個應該在AuditionAudacity中工作的VST插件,所以我打算使用VST v2.x. 我是VST開發的新手,但我在這里研究了這些例子。 到目前為止,大多數東西看起來很直接。 主要的“魔法”似乎發生在process()processReplace()函數中。 不太清楚這兩個功能的好處/缺點是什么。

現在“問題”是我的過濾器需要幾秒鍾的“Lookahead”緩沖區(可能更長,取決於設置)。 這意味着,在流程開始時,我需要填充內部緩沖區。 並且,在該過程結束時,我將需要從內部緩沖區中清除待處理的樣本。

我以前一直在為SoX (Sound eXchange)編寫過濾器,它們的API與VST非常相似。 VST中所謂的process ()在SoX API中稱為flow() 但是有一個主要區別:SoX API中的flow()函數作為參數獲取輸入緩沖區中可用的樣本數以及適合輸出緩沖區的樣本數。 然后, flow()函數返回它從輸入緩沖區中獲取的樣本數以及它已寫入輸出緩沖區的樣本數。 這意味着我不必在每次調用中處理所有可用的輸入樣本。 並且單個調用可以返回比消耗的樣本更少的樣本。 因此,在過程開始時,我可以使用所有輸入樣本,但根本不返回任何 輸出樣本! 這樣我就可以在開頭填充我的“前瞻”緩沖區。 最后,SoX API有一個drain()函數,該函數將在進程結束時由Main應用程序調用,以便從過濾器的內部緩沖區中清除待處理的樣本。

根據我對VST的理解, process()函數只有一個參數來指示輸入輸出樣本的數量。 並且它無法限制輸出樣本的數量。 顯然, process()假設一個簡單的“N個樣本,N個樣本輸出”行為。 那正確嗎 ???

如果是這樣,在VST中填充內部前瞻緩沖區的建議方法是什么? 在VST結束時刷新內部緩沖區的推薦方法是什么?


順便說一句:我知道當然,我可以通過在進程開始時在前幾個process()調用中僅返回“silent”來填充我的內部緩沖區。 但這會延遲/移動整個音頻文件,這是不需要的 此外,它沒有解決在過程結束時如何刷新內部緩沖區的問題。

謝謝你的任何建議! ;-)

好的,我想我找到了一個解決方案。 VST中有一個setInitialDelay()函數。 所以我想我需要自己延遲輸出,然后通過setInitialDelay()設置正確的值進行補償。

[UPDATE]

這似乎與Audition很好用,但不適用於Audacity 看起來像Audacity忽略setInitialDelay()設置的值,因此音頻最終會延遲。 Audacity有什么解決方法嗎?

暫無
暫無

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

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