1

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

我的代码的相关片段是

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

1 回答 1

2

要在不打开 PCM 设备的情况下获取它的信息,请打开其卡的控制设备并调用snd_ctl_pcm_info()。(如何使用请参阅aplay 源代码。)

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

于 2017-05-14T08:24:53.747 回答