1 回答
TA貢獻1815條經驗 獲得超6個贊
沒有實用的方法來確定應用于揚聲器的相位何時超過 0。最好放棄這一點。
這是一個“不同”的解決方案,我認為您會發現效果更好:
切換到
MODE_STREAM。要獲得最低延遲,請使用最小的可用緩沖區大小 (getMinBufferSize())。使用專用線程向
AudioTrack.AudioTrack該線程有一項工作:根據當前頻率將一小段波形寫入。(您也可以使用主線程,并不斷地AudioTrack使用非阻塞寫入,但在我看來,使用單獨的線程更優雅。線程將大部分時間卡在阻塞write()調用中,這意味著緩沖區保持不變最大限度地填充,用最少的工作。)擺脫
startSinus()和stopSinus()。從頭開始播放音頻,直到您離開應用程序才停止。進行更改
setSinus(),使其簡單地將當前頻率值傳達給步驟 2 中描述的線程。使用任何標準的線程間通信機制。當該離開應用程序時,使用標準的線程間通信機制來通知線程它應該終止,然后
join()它,清理等。
額外細節:
做你的
write()s小。一次可能只有 100 個樣本。這有助于最大限度地減少延遲,同時仍保持理想的阻塞行為,并且無需擔心AudioTrack.在工作線程中,使用 a
float來跟蹤階段(就像您現在所做的那樣)。根據頻率增加相位,但不要讓它變得太大!通過讓它環繞將其保持在 0 到 2*PI 之間(否則,由于量化,大的相位誤差會蔓延,并且頻率會意外改變)。phase顯然,在填充每個微小的 100 個樣本緩沖區后,您不會重置。你只是讓它繼續滾動。
添加回答
舉報
