Поиск всех устройств, которые я могу использовать, чтобы играть в PCM с ALSA - PullRequest
4 голосов
/ 29 июля 2011

Я использую ALSA для воспроизведения сэмплов PCM. Я открываю поток PCM с помощью этой функции:

int snd_pcm_open(snd_pcm_t** pcmp,
        const char* name,
        snd_pcm_stream_t stream,
        int mode);

В настоящее время я использую «default» в качестве параметра имени. Я хотел бы иметь возможность выбирать другие устройства. Я не могу понять, как я могу определить, как называются другие доступные устройства.

Я подключил USB-микрофон к моей системе, и aplay, и amixer, похоже, обнаруживают новое устройство. Как определить название этого устройства? Есть ли какая-либо функция ALSA для получения списка доступных устройств с соответствующими именами?

Ответы [ 3 ]

7 голосов
/ 29 июля 2011

Я думаю, вы можете использовать snd_device_name_hint для перечисления устройств.Вот пример.Остерегайтесь, что я не скомпилировал это!

char **hints;
/* Enumerate sound devices */
int err = snd_device_name_hint(-1, "pcm", (void***)&hints);
if (err != 0)
   return;//Error! Just return

char** n = hints;
while (*n != NULL) {

    char *name = snd_device_name_get_hint(*n, "NAME");

    if (name != NULL && 0 != strcmp("null", name)) {
        //Copy name to another buffer and then free it
        free(name);
    }
    n++;
}//End of while

//Free hint buffer too
snd_device_name_free_hint((void**)hints);
2 голосов
/ 01 августа 2013

Это были мои первые требования к проектам linux / unix, где мне нужно было знать обо всех доступных возможностях и названиях аудиоустройств.Затем мне нужно использовать эти устройства для захвата и воспроизведения звука.То, что я сделал, довольно просто.Существует команда linux / unix, которая используется для поиска устройств с помощью утилиты alsa в linux.

Это:

aplay -l

Теперь я просто создал программу для выдачиalsa.

Для всех я создал библиотеку (.so) и пример приложения, демонстрирующие использование этой библиотеки в c ++.

Вывод моей библиотекиЭто как -

[root@~]# ./IdeaAudioEngineTest
HDA Intel plughw:0,0
HDA Intel plughw:0,2
USB Audio Device plughw:1,0

Эта библиотека также может захватывать и воспроизводить аудиоданные в режиме реального времени.

Она доступна с документацией в Библиотека IdeaAudio с дуплексом Alsa Audio

0 голосов
/ 06 июля 2019

Просто ради ухмылки, ваша программа переформатирована:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>

#include <alsa/asoundlib.h>

void listdev(char *devname)

{

    char** hints;
    int    err;
    char** n;
    char*  name;
    char*  desc;
    char*  ioid;

    /* Enumerate sound devices */
    err = snd_device_name_hint(-1, devname, (void***)&hints);
    if (err != 0) {

        fprintf(stderr, "*** Cannot get device names\n");
        exit(1);

    }

    n = hints;
    while (*n != NULL) {

        name = snd_device_name_get_hint(*n, "NAME");
        desc = snd_device_name_get_hint(*n, "DESC");
        ioid = snd_device_name_get_hint(*n, "IOID");

        printf("Name of device: %s\n", name);
        printf("Description of device: %s\n", desc);
        printf("I/O type of device: %s\n", ioid);
        printf("\n");

        if (name && strcmp("null", name)) free(name);
        if (desc && strcmp("null", desc)) free(desc);
        if (ioid && strcmp("null", ioid)) free(ioid);
        n++;

    }

    //Free hint buffer too
    snd_device_name_free_hint((void**)hints);

}

int main(void)

{

    printf("PCM devices:\n");
    printf("\n");
    listdev("pcm");

    printf("MIDI devices:\n");
    printf("\n");
    listdev("rawmidi");

    return 0;

}
...