alsa:如何使用它的名称以编程方式查找设备是否正忙/正在使用中而不打开它

时间:2016-03-03 12:54:37

标签: linux resources device alsa

我们有一个Linux设备,它有一个扬声器和MIC设备。这些设备在不同的模块之间共享 - 例如,VOIP呼叫可以使用扬声器,危险警告系统可以使用扬声器,语音提示可以使用扬声器等:

ALSA中似乎有一个函数使用pcm来提供状态。 int snd_pcm_status(snd_pcm_t * pcm,snd_pcm_status_t * status)

然而,snd_pcm_open返回* pcm。我们不想打开设备,因为我们想知道设备的状态使用" name"

Alsa API为here

如何在不打开资源/设备并使用其名称的情况下检查资源/设备是否正忙?

2 个答案:

答案 0 :(得分:2)

文件/proc/asound/cardZ/pcmYp/subX/status中提供了卡Z上设备Y的回放流X的相同信息;当设备未打开时,它只是说“关闭”。

请注意,您无法使用此信息来决定是否可以打开设备,因为在您阅读此信息后,其他一些过程可能会打开它。检查是否可以打开它的唯一方法是实际尝试。

答案 1 :(得分: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而不是trap。

NB 2 :/ dev / dsp可能缺少,具体取决于内核配置。