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

时间:2017-05-14 07:44:42

标签: alsa libalsa

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

我的代码的相关片段是

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));
}

1 个答案:

答案 0 :(得分:1)

要获取有关PCM设备的信息而不打开它,请打开其卡的控制设备并致电snd_ctl_pcm_info()。 (有关如何使用它,请参阅aplay source code。)

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