2016-03-03 13 views
0

我們有一個Linux設備,它具有揚聲器和MIC設備。這些設備在不同模塊之間共享 - 例如VOIP呼叫可以使用揚聲器,危險警告系統可以使用揚聲器,語音提示可以使用揚聲器等:alsa:如何以編程方式查找設備是否正忙/正在使用使用它的名稱而不打開它

ALSA似乎有一個使用pcm提供的功能狀態。 int snd_pcm_status(snd_pcm_t * pcm,snd_pcm_status_t * status)

但是* pcm由snd_pcm_open返回。我們不想打開設備,因爲我們想使用它的「名字」

艾莎API是here

我們如何檢查資源/設備正忙,而無需打開它知道設備的狀態並使用它的名字?

回答

2

文件/proc/asound/cardZ/pcmYp/subX/status中提供了Z卡上設備Y的播放流X的相同信息;當設備未打開時,它只是說「關閉」。

請注意,您不能使用此信息來決定是否可以打開設備,因爲其他進程可能會在您閱讀此信息後纔會打開該設備。檢查是否可以打開它的唯一方法是實際嘗試。

0

雖然它需要的/ dev/DSP,這似乎工作:

#!/bin/dash 

## If the speaker is not used by any, returns 0, and prints "free" 
## Otherwise, returns 1 and prints "not free" 

iExit(){ 
    trap '' 0 
    exit $1 
} 

iCatch(){ 
    # The speaker is already in use 
    echo not free 
    iExit 1 
} 

trap iCatch 0 

{ 
    exec 3>&1 1>/dev/dsp 
    # If the execution reaches here, the speaker is not used by any 
    # Otherwise, it's catched by iCatch 
    exec 1>&3 
    echo free 
    iExit 0 
} 2>/dev/null 

沒有的PulseAudio,似乎有些PC只有一個輸出端在同一時間被接受的;在其他人同時播放是允許的。但即使在後一種情況下,上面的代碼也可以工作。

NB:上面的代碼沒有不是使用bash;對於bash,只需使用if/else而不是陷阱。

NB 2:根據內核配置的不同,可能會缺乏/ dev/dsp。

相關問題