【问题标题】:Is it possible to get information about a busy Alsa device?是否可以获得有关繁忙的 Alsa 设备的信息?
【发布时间】:2017-10-13 04:18:18
【问题描述】:

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

我的代码相关的sn-p是

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

【问题讨论】:

    标签: alsa libalsa


    【解决方案1】:

    要在不打开PCM设备的情况下获取它的信息,请打开其卡的控制设备并调用snd_ctl_pcm_info()。 (使用方法见aplay source code。)

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

    【讨论】:

    • 我后来意识到有一种方法可以从函数snd_pcm_query_chmaps_from_hw 获取频道映射信息,因为文档说它不需要打开 PCM。不过,您指向 snd_ctl_pcm_info 的指针非常有用:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多