Как вывести список клиентов 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.