Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux alsa:如何以编程方式使用设备名称查找设备是否正忙/正在使用,而无需打开它_Linux_Resources_Device_Alsa - Fatal编程技术网

Linux alsa:如何以编程方式使用设备名称查找设备是否正忙/正在使用,而无需打开它

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

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

ALSA中似乎有一个使用pcm提供状态的功能。 int snd_pcm_状态(snd_pcm_t*pcm,snd_pcm_状态_t*状态)

但是,*pcm由snd_pcm_open返回。我们不想打开该设备,因为我们想使用其“名称”了解该设备的状态

Alsa API是


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

卡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可能缺少,具体取决于内核配置