是否有可能获得有关繁忙的 Alsa 设备的信息?

Is it possible to get information about a busy Alsa device?

目前我正在尝试通过调用 snd_pcm_open 函数然后将其传递给 snd_pcm_info 来获取有关设备的信息来获取有关 Alsa 设备的信息。我打算专门从snd_pcm_query_chmaps获取频道信息。我收到的错误代码是:Device or resource busy。我很好奇是否有另一种方法可以获取此信息或以某种方式打开 pcm,而其他应用程序永远不会 "busy"。如果可能的话,我将如何以一种即使设备很忙也能正常工作的方式获取这些信息?

我的代码的相关片段是

snd_pcm_t* pcm;
int err;
if ((err = snd_pcm_open(&pcm, name, SND_PCM_STREAM_PLAYBACK, 0)) == 0 || (err = snd_pcm_open(&pcm, name, SND_PCM_STREAM_CAPTURE, 0)) == 0) {
    snd_pcm_info_t* pcm_info;
    if (snd_pcm_info_malloc(&pcm_info) == 0) {
        if (snd_pcm_info(pcm, pcm_info) == 0) {
            printf("Card number: %d\n", snd_pcm_info_get_card(pcm_info));
            printf("Device number: %d\n", snd_pcm_info_get_device(pcm_info));
            printf("Subdevice number: %d\n", snd_pcm_info_get_subdevice(pcm_info));
        }
        snd_pcm_info_free(pcm_info);
    }
    snd_pcm_close(pcm);
} else {
    printf("Erroring opening PCM device with error: %s\n", snd_strerror(err));
}

要在不打开 PCM 设备的情况下获取有关它的信息,请打开其卡的控制设备并调用 snd_ctl_pcm_info(). (See the aplay source code 了解如何使用它。)

通道映射信息在某些混音器控件的TLV信息中提供;使用 snd_pcm_query_chmaps_from_hw() 辅助函数来读取它。