有没有一种已知的方法可以仅使用 ALSA API 列出现有的 MIDI 客户端,而不读取特殊文件/proc/asound/seq/clients
?
我搜索了ALSA MIDI API 参考,但找不到任何匹配项。我相信一定有一种方法可以使用 API 来实现这一点,否则那就太令人惊讶了。
有没有一种已知的方法可以仅使用 ALSA API 列出现有的 MIDI 客户端,而不读取特殊文件/proc/asound/seq/clients
?
我搜索了ALSA MIDI API 参考,但找不到任何匹配项。我相信一定有一种方法可以使用 API 来实现这一点,否则那就太令人惊讶了。
如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
作为客户端 IDsnd_seq_get_any_client_info
是一种猜测:ALSA 使用负数表示错误,所以我猜第一个有效的客户端 ID 是 0。