Можно ли получить информацию о занятом устройстве Alsa?

В настоящее время я пытаюсь получить информацию об устройстве Alsa, позвонив в snd_pcm_open Функция затем передать это 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));
}

1 ответ

Решение

Чтобы получить информацию об устройстве PCM, не открывая его, откройте устройство управления его карты и вызовите snd_ctl_pcm_info (). (См. Исходный код aplay, чтобы узнать, как его использовать.)

Информация о канальной карте предоставляется в информации TLV некоторых элементов управления микшера; используйте вспомогательную функцию snd_pcm_query_chmaps_from_hw(), чтобы прочитать ее.

Другие вопросы по тегам