2012-02-28 78 views
3

我正在Linux下編寫一個使用ALSA(連接到自定義設備)的回放和記錄的程序。我想用異步回調體系結構來讀寫數據。對ALSA PCM回調有什麼限制?

但是,我一直無法獲得任何有關我在回調中允許執行的限制的信息。具體來說,我必須是異步安全的嗎?如果是這樣,這似乎嚴格限制了可以做什麼,因爲除其他外,我不應該引用任何全局變量,例如,從執行或寫入主線程填充的緩衝區中讀取相當困難到緩衝區,隨後保存到回調之外的文件。

是否有任何C併發構造,我可以在ALSA回調中使用以協調使用全局變量與主線程?例如,我可以使用POSIX信號量嗎?我是否有任何保證ALSA回調與主線程相關的原子(我知道它對其他ALSA回調不是原子的)?

非常感謝任何人的洞察力,可以帶來這一點。

+2

爲了讓你知道,這裏有一個鏈接,描述爲什麼使用這些API可能不是一個好主意。 http://0pointer.de/blog/projects/guide-to-sound-apis.html – ldav1s 2012-02-28 23:52:15

+0

謝謝!非常豐富。不幸的是,這是針對第三方設備的,所以我堅持使用ALSA。 – 2012-02-29 00:25:44

+0

但是你堅持使用異步API嗎? – ldav1s 2012-02-29 01:38:56

回答

3

我不知道這個答案是否會被人們認爲是對ALSA過分消極,但我仍然會給它。

我試過拼命地在幾個異步應用程序中使用ALSA。它是如此錯誤,沒有文件記錄和難以使用,經過幾天努力使事情工作,我最終放棄了。

我最終使用了ALSA OSS仿真層,並簡單地爲聲音設備打開fd,並使用libevent作爲異步回調的一種方式。這個解決方案對我來說非常合適,我對結果非常滿意 - 我已經使用了一段時間了。回想起來,ALSA令人驚訝地是過於複雜,過度設計,錯誤,記錄不完善,與設計人員事先沒有想到的I/O複用技術不兼容等。 - 我很難理解爲什麼它最終變成了這是Linux系統中的標準,在其他Unix操作系統上可以使用更簡單,更好的設計。

+0

感謝您的答案。不幸的是,非ALSA解決方案不是一種選擇(我將ALSA用作包含帶ALSA設備驅動程序的DAC/ADC的多通道器件的接口)。 – 2012-02-29 00:27:10

+2

僅僅因爲您必須使用ALSA驅動程序並不意味着您必須使用ALSA API--您可以使用OSS兼容性層作爲API而不是使用ALSA API。我就是做這個的。 – Perry 2012-02-29 00:35:14

+0

哦!我沒有意識到這一點。我現在要查看它。謝謝。 – 2012-02-29 00:39:57