mirror of
https://github.com/alsa-project/alsa-utils
synced 2024-11-09 17:35:42 +01:00
aconnect: Add UMP support
This patch extends the aconnect program for supporting UMP. Now the verbose output can show the UMP client version. Also, a new option -a is added to control the behavior whether to show the all ports including the inactive ports or not. As default, only the active ports are shown, but UMP clients allow to hide some ports as inactive. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
2b08d585a3
commit
64b1d486b1
2 changed files with 78 additions and 16 deletions
|
@ -120,6 +120,9 @@ List existing output (writable) ports.
|
||||||
This option is exclusive to
|
This option is exclusive to
|
||||||
.B \-i.
|
.B \-i.
|
||||||
.TP
|
.TP
|
||||||
|
.B \-a, \-\-all
|
||||||
|
List inactive ports, too.
|
||||||
|
.TP
|
||||||
.B \-l, \-\-list
|
.B \-l, \-\-list
|
||||||
List the current connection status. The connected and connecting ports
|
List the current connection status. The connected and connecting ports
|
||||||
from/to each port are listed together.
|
from/to each port are listed together.
|
||||||
|
|
|
@ -29,6 +29,13 @@
|
||||||
#include "aconfig.h"
|
#include "aconfig.h"
|
||||||
#include "gettext.h"
|
#include "gettext.h"
|
||||||
|
|
||||||
|
#ifdef SND_SEQ_PORT_CAP_INACTIVE
|
||||||
|
#define HANDLE_SHOW_ALL
|
||||||
|
static int show_all;
|
||||||
|
#else
|
||||||
|
#define show_all 0
|
||||||
|
#endif
|
||||||
|
|
||||||
static void error_handler(const char *file, int line, const char *function, int err, const char *fmt, ...)
|
static void error_handler(const char *file, int line, const char *function, int err, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
|
@ -60,6 +67,9 @@ static void usage(void)
|
||||||
printf(_(" aconnect -i|-o [-options]\n"));
|
printf(_(" aconnect -i|-o [-options]\n"));
|
||||||
printf(_(" -i,--input list input (readable) ports\n"));
|
printf(_(" -i,--input list input (readable) ports\n"));
|
||||||
printf(_(" -o,--output list output (writable) ports\n"));
|
printf(_(" -o,--output list output (writable) ports\n"));
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
printf(_(" -a,--all show inactive ports, too\n"));
|
||||||
|
#endif
|
||||||
printf(_(" -l,--list list current connections of each port\n"));
|
printf(_(" -l,--list list current connections of each port\n"));
|
||||||
printf(_(" * Remove all exported connections\n"));
|
printf(_(" * Remove all exported connections\n"));
|
||||||
printf(_(" -x, --removeall\n"));
|
printf(_(" -x, --removeall\n"));
|
||||||
|
@ -72,25 +82,38 @@ static void usage(void)
|
||||||
#define LIST_INPUT 1
|
#define LIST_INPUT 1
|
||||||
#define LIST_OUTPUT 2
|
#define LIST_OUTPUT 2
|
||||||
|
|
||||||
#define perm_ok(pinfo,bits) ((snd_seq_port_info_get_capability(pinfo) & (bits)) == (bits))
|
#define perm_ok(cap,bits) (((cap) & (bits)) == (bits))
|
||||||
|
|
||||||
|
#ifdef SND_SEQ_PORT_DIR_INPUT
|
||||||
|
static int check_direction(snd_seq_port_info_t *pinfo, int bit)
|
||||||
|
{
|
||||||
|
int dir = snd_seq_port_info_get_direction(pinfo);
|
||||||
|
return !dir || (dir & bit);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define check_direction(x, y) 1
|
||||||
|
#endif
|
||||||
|
|
||||||
static int check_permission(snd_seq_port_info_t *pinfo, int perm)
|
static int check_permission(snd_seq_port_info_t *pinfo, int perm)
|
||||||
{
|
{
|
||||||
if (perm) {
|
int cap = snd_seq_port_info_get_capability(pinfo);
|
||||||
if (perm & LIST_INPUT) {
|
|
||||||
if (perm_ok(pinfo, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ))
|
if (cap & SND_SEQ_PORT_CAP_NO_EXPORT)
|
||||||
goto __ok;
|
|
||||||
}
|
|
||||||
if (perm & LIST_OUTPUT) {
|
|
||||||
if (perm_ok(pinfo, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE))
|
|
||||||
goto __ok;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (!perm)
|
||||||
|
return 1;
|
||||||
|
if (perm & LIST_INPUT) {
|
||||||
|
if (perm_ok(cap, SND_SEQ_PORT_CAP_READ|SND_SEQ_PORT_CAP_SUBS_READ) &&
|
||||||
|
check_direction(pinfo, SND_SEQ_PORT_DIR_INPUT))
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
__ok:
|
if (perm & LIST_OUTPUT) {
|
||||||
if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_NO_EXPORT)
|
if (perm_ok(cap, SND_SEQ_PORT_CAP_WRITE|SND_SEQ_PORT_CAP_SUBS_WRITE) &&
|
||||||
return 0;
|
check_direction(pinfo, SND_SEQ_PORT_DIR_OUTPUT))
|
||||||
return 1;
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -151,12 +174,20 @@ static void do_search_port(snd_seq_t *seq, int perm, action_func_t do_action)
|
||||||
/* reset query info */
|
/* reset query info */
|
||||||
snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
|
snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
|
||||||
snd_seq_port_info_set_port(pinfo, -1);
|
snd_seq_port_info_set_port(pinfo, -1);
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
if (show_all)
|
||||||
|
snd_seq_port_info_set_capability(pinfo, SND_SEQ_PORT_CAP_INACTIVE);
|
||||||
|
#endif
|
||||||
count = 0;
|
count = 0;
|
||||||
while (snd_seq_query_next_port(seq, pinfo) >= 0) {
|
while (snd_seq_query_next_port(seq, pinfo) >= 0) {
|
||||||
if (check_permission(pinfo, perm)) {
|
if (check_permission(pinfo, perm)) {
|
||||||
do_action(seq, cinfo, pinfo, count);
|
do_action(seq, cinfo, pinfo, count);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
if (show_all)
|
||||||
|
snd_seq_port_info_set_capability(pinfo, SND_SEQ_PORT_CAP_INACTIVE);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -173,7 +204,20 @@ static void print_port(snd_seq_t *seq, snd_seq_client_info_t *cinfo,
|
||||||
snd_seq_client_info_get_name(cinfo),
|
snd_seq_client_info_get_name(cinfo),
|
||||||
(snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ?
|
(snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ?
|
||||||
_("user") : _("kernel")));
|
_("user") : _("kernel")));
|
||||||
|
#ifdef HAVE_SEQ_CLIENT_INFO_GET_MIDI_VERSION
|
||||||
|
switch (snd_seq_client_info_get_midi_version(cinfo)) {
|
||||||
|
case SND_SEQ_CLIENT_UMP_MIDI_1_0:
|
||||||
|
printf(",UMP-MIDI1");
|
||||||
|
break;
|
||||||
|
case SND_SEQ_CLIENT_UMP_MIDI_2_0:
|
||||||
|
printf(",UMP-MIDI2");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
if (snd_seq_port_info_get_capability(pinfo) & SND_SEQ_PORT_CAP_INACTIVE)
|
||||||
|
printf(",INACTIVE");
|
||||||
|
#endif
|
||||||
#ifdef HAVE_SEQ_CLIENT_INFO_GET_CARD
|
#ifdef HAVE_SEQ_CLIENT_INFO_GET_CARD
|
||||||
card = snd_seq_client_info_get_card(cinfo);
|
card = snd_seq_client_info_get_card(cinfo);
|
||||||
#endif
|
#endif
|
||||||
|
@ -251,6 +295,12 @@ enum {
|
||||||
SUBSCRIBE, UNSUBSCRIBE, LIST, REMOVE_ALL
|
SUBSCRIBE, UNSUBSCRIBE, LIST, REMOVE_ALL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
#define ACONNECT_OPTS "dior:t:elxa"
|
||||||
|
#else
|
||||||
|
#define ACONNECT_OPTS "dior:t:elx"
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct option long_option[] = {
|
static const struct option long_option[] = {
|
||||||
{"disconnect", 0, NULL, 'd'},
|
{"disconnect", 0, NULL, 'd'},
|
||||||
{"input", 0, NULL, 'i'},
|
{"input", 0, NULL, 'i'},
|
||||||
|
@ -260,6 +310,9 @@ static const struct option long_option[] = {
|
||||||
{"exclusive", 0, NULL, 'e'},
|
{"exclusive", 0, NULL, 'e'},
|
||||||
{"list", 0, NULL, 'l'},
|
{"list", 0, NULL, 'l'},
|
||||||
{"removeall", 0, NULL, 'x'},
|
{"removeall", 0, NULL, 'x'},
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
{"all", 0, NULL, 'a'},
|
||||||
|
#endif
|
||||||
{NULL, 0, NULL, 0},
|
{NULL, 0, NULL, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -280,7 +333,7 @@ int main(int argc, char **argv)
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while ((c = getopt_long(argc, argv, "dior:t:elx", long_option, NULL)) != -1) {
|
while ((c = getopt_long(argc, argv, ACONNECT_OPTS, long_option, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'd':
|
case 'd':
|
||||||
command = UNSUBSCRIBE;
|
command = UNSUBSCRIBE;
|
||||||
|
@ -313,6 +366,12 @@ int main(int argc, char **argv)
|
||||||
case 'x':
|
case 'x':
|
||||||
command = REMOVE_ALL;
|
command = REMOVE_ALL;
|
||||||
break;
|
break;
|
||||||
|
#ifdef HANDLE_SHOW_ALL
|
||||||
|
case 'a':
|
||||||
|
command = LIST;
|
||||||
|
show_all = 1;
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
default:
|
default:
|
||||||
usage();
|
usage();
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
Loading…
Reference in a new issue