2011-11-17 42 views
7

我想使用ALSA將某些音頻數據重放到PCM設備。作爲一個例子,我已經下載了this sample example並在我的電腦上運行它。當沒有其他進程正在使用聲卡時,它工作正常。但是,當一些其他進程使用音頻設備不玩什麼(即,媒體播放器播放的歌曲),並顯示以下錯誤 -ALSA:在共享模式下打開PCM設備

Playback open error: Device or resource busy 

看一下這個例子的源代碼,我可以說,snd_pcm_open功能在882行是拋出這個錯誤。它發現設備繁忙,因爲另一個進程正在使用它。

我也嘗試了相反的方式 - 首先開始這個例子,然後嘗試開始一首歌。在這種情況下,媒體播放器保持閒置狀態,在進度條旁邊顯示「閒置」(我正在使用Banshee)。我假設snd_pcm_open獲得設備資源的專有權,以便其他進程不能使用它。

但我不想那樣。我想在不需要任何專有權限的情況下播放音頻設備的聲音,以便PC中的其他進程可以共享相同的設備以輸出音頻數據。

我該怎麼做?如何打開PCM設備,以便其他進程也可以共享同一設備?

回答

3

我無法找到一個方法來共享多個進程之間的設備。我嘗試使用dmix插件將使用.asoundrc配置文件的多個回放流組合起來,但由於某些原因,這並不起作用。我試圖使用我的聲卡的default設備,但那不起作用。根據ALSA郵件列表中的建議,我嘗試使用default:CARD=x作爲snd_pcm_open函數的設備名稱參數來打開默認設備,導致我的系統中出現device not found錯誤。顯然沒有辦法做到這一點(如果有人可以找到方法,請更新此答案)。

而不是使用ALSA,我用PulseAudio下一個,這解決了我的問題。

1

檢查文件/ dev/sndstat(如果您啓用了OSS兼容性層)。它應列出與系統上的ALSA設備相對應的音頻設備。你也可以檢查/ proc/asound/devices來獲取每個設備的功能。

嘗試訪問不同的播放設備(在你的例子是 「plughw:0,0」 打開),通過選擇不同的snd_pcm_open名稱(): 這是here

plughw:卡,設備。兩者都具有作爲參數的卡(ID字符串或數字 索引),要訪問的硬件的設備和可選的子設備。

+0

不,我沒有啓用OSS兼容層,而且我也不想依賴它。我還檢查了/ proc/asound/devices,並在那裏看到了設備列表(我可以通過編程獲取該列表)。我也可以訪問不同的播放設備。但這些都不是真正的問題。我想知道是否可以在共享模式下打開單個設備。 –

1

當時ALSA的麻煩是沒有在默認輸出中插入混音器插件。在最近的ALSA版本中,這種情況不再發生,因爲dmix插件現在默認包含在輸出路徑中。

(您可以重新創建共享聲卡麻煩自己,如果你惹~/.asoundrc,或者如果你告訴應用程序直接使用的硬件插頭繞過混頻器。請注意,某些應用程序(如JACK將直接使用硬件,如果不告知其他應用程序)。

使用PulseAudio,您仍然使用ALSA作爲後端,您只需添加一個帶有混音器的圖層(以及一噸其他你可能不想知道的東西)。 傑克會爲你完成同樣的工作。現在,ALSA的dmix插件將爲您提供幫助,因此您可以擺脫PulseAudios和JACK等中間件,直到您真正需要它們提供的非基本音響系統功能爲止。

僅供參考,請查閱some .asoundrc documentation