Linux alsa:如何以编程方式使用设备名称查找设备是否正忙/正在使用,而无需打开它
我们有一个Linux设备,它有一个扬声器和麦克风设备。这些设备在不同模块之间共享-例如,VOIP呼叫可以使用扬声器,危险警告系统可以使用扬声器,语音提示可以使用扬声器等: ALSA中似乎有一个使用pcm提供状态的功能。 int snd_pcm_状态(snd_pcm_t*pcm,snd_pcm_状态_t*状态) 但是,*pcm由snd_pcm_open返回。我们不想打开该设备,因为我们想使用其“名称”了解该设备的状态 Alsa API是Linux alsa:如何以编程方式使用设备名称查找设备是否正忙/正在使用,而无需打开它,linux,resources,device,alsa,Linux,Resources,Device,Alsa,我们有一个Linux设备,它有一个扬声器和麦克风设备。这些设备在不同模块之间共享-例如,VOIP呼叫可以使用扬声器,危险警告系统可以使用扬声器,语音提示可以使用扬声器等: ALSA中似乎有一个使用pcm提供状态的功能。 int snd_pcm_状态(snd_pcm_t*pcm,snd_pcm_状态_t*状态) 但是,*pcm由snd_pcm_open返回。我们不想打开该设备,因为我们想使用其“名称”了解该设备的状态 Alsa API是 如何在不打开资源/设备并使用其名称的情况下检查其是否忙?卡Z
如何在不打开资源/设备并使用其名称的情况下检查其是否忙?卡Z上设备Y的播放流X的相同信息可在文件
/proc/asound/cardZ/pcmYp/subX/status
中找到;当设备没有打开时,它只是说“关闭”
请注意,您不能使用此信息来决定是否可以打开设备,因为在您阅读此信息后,其他进程可能会打开设备。检查是否可以打开的唯一方法是实际尝试。卡Z上设备Y的播放流X的相同信息可在文件
/proc/asound/cardZ/pcmYp/subX/status
中找到;当设备没有打开时,它只是说“关闭”
请注意,您不能使用此信息来决定是否可以打开设备,因为在您阅读此信息后,其他进程可能会打开设备。检查是否可以打开它的唯一方法是实际尝试。尽管它需要/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可能缺少,具体取决于内核配置。尽管它需要/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可能缺少,具体取决于内核配置