Как вывести список клиентов ALSA MIDI без чтения `/proc/asound/seq/clients`?

Известен ли способ перечисления существующих клиентов MIDI с использованием только API ALSA без чтения специального файла /proc/asound/seq/clients?

Я искал справочник ALSA MIDI API и не смог найти соответствия. Я считаю, что должен быть способ достичь этого с помощью API, в противном случае это очень удивительно.

2 ответа

Решение

Как показано в исходном коде aplaymidi и аналогичные инструменты, клиенты секвенсора ALSA перечисляются с помощью snd_seq_query_next_client ():

snd_seq_client_info_alloca(&cinfo);
snd_seq_client_info_set_client(cinfo, -1);
while (snd_seq_query_next_client(seq, cinfo) >= 0) {
    int client = snd_seq_client_info_get_client(cinfo);
    ...
}

Я мог понять это, наконец: snd_seq_get_any_client_info получить информацию о первом клиенте (должен быть хотя бы один, системный) и snd_seq_query_next_client, чтобы получить следующий.

Вот фрагмент списка клиентов MIDI:

static void list_clients(void) {

   int count = 0;
   int status;
   snd_seq_client_info_t* info;

   snd_seq_client_info_alloca(&info);

   status = snd_seq_get_any_client_info(seq_handle, 0, info);

   while (status >= 0) {
      count += 1;
      int id = snd_seq_client_info_get_client(info);
      char const* name = snd_seq_client_info_get_name(info);
      int num_ports = snd_seq_client_info_get_num_ports(info);
      printf("Client “%s” #%i, with %i ports\n", name, id, num_ports);
      status = snd_seq_query_next_client(seq_handle, info);
   }

   printf("Found %i clients\n", count);
}

Фрагмент предполагает seq_handle объявляется и инициализируется в другом месте (инициализируется snd_seq_open).

Использование 0 в качестве идентификатора клиента при вызове snd_seq_get_any_client_infoЭто предположение: ALSA использует отрицательные числа для ошибок, поэтому я предполагаю, что первый действительный идентификатор клиента равен 0.

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