我们有一个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
如何在不打开资源/设备并使用其名称的情况下检查资源/设备是否正忙?
答案 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可能缺少,具体取决于内核配置。