diff options
Diffstat (limited to 'alsa-lib/test/seq.c')
-rw-r--r-- | alsa-lib/test/seq.c | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/alsa-lib/test/seq.c b/alsa-lib/test/seq.c new file mode 100644 index 0000000..34b000f --- /dev/null +++ b/alsa-lib/test/seq.c @@ -0,0 +1,233 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> +#include <getopt.h> +#include "../include/asoundlib.h" + +#include "seq-decoder.c" +#include "seq-sender.c" + +#define SEQ_VERSION "0.0.1" + +#define HELPID_HELP 1000 +#define HELPID_DEBUG 1001 +#define HELPID_VERBOSE 1002 +#define HELPID_VERSION 1003 + +int max_clients; +int max_ports; +int max_queues; +int debug = 0; +int verbose = 0; + +void set_name(snd_seq_t *handle) +{ + int err; + char name[64]; + + sprintf(name, "SeqUtil - %i", getpid()); + if ((err = snd_seq_set_client_name(handle, name)) < 0) { + fprintf(stderr, "Set client info error: %s\n", snd_strerror(err)); + exit(0); + } +} + +void system_info(snd_seq_t *handle) +{ + int err; + snd_seq_system_info_t *sysinfo; + + snd_seq_system_info_alloca(&sysinfo); + if ((err = snd_seq_system_info(handle, sysinfo))<0) { + fprintf(stderr, "System info error: %s\n", snd_strerror(err)); + exit(0); + } + max_clients = snd_seq_system_info_get_clients(sysinfo); + max_ports = snd_seq_system_info_get_ports(sysinfo); + max_queues = snd_seq_system_info_get_ports(sysinfo); +} + +void show_system_info(snd_seq_t *handle ATTRIBUTE_UNUSED) +{ + printf("System info\n"); + printf(" Max queues : %i\n", max_queues); + printf(" Max clients : %i\n", max_clients); + printf(" Max ports : %i\n", max_ports); +} + +void show_queue_status(snd_seq_t *handle, int queue) +{ + int err, idx, min, max; + snd_seq_queue_status_t *status; + + snd_seq_queue_status_alloca(&status); + min = queue < 0 ? 0 : queue; + max = queue < 0 ? max_queues : queue + 1; + for (idx = min; idx < max; idx++) { + if ((err = snd_seq_get_queue_status(handle, idx, status))<0) { + if (err == -ENOENT) + continue; + fprintf(stderr, "Client %i info error: %s\n", idx, snd_strerror(err)); + exit(0); + } + printf("Queue %i info\n", snd_seq_queue_status_get_queue(status)); + printf(" Tick : %u\n", snd_seq_queue_status_get_tick_time(status)); + printf(" Realtime : %i.%i\n", + snd_seq_queue_status_get_real_time(status)->tv_sec, + snd_seq_queue_status_get_real_time(status)->tv_nsec); + printf(" Flags : 0x%x\n", snd_seq_queue_status_get_status(status)); + } +} + +void show_port_info(snd_seq_t *handle, int client, int port) +{ + int err, idx, min, max; + snd_seq_port_info_t *info; + + snd_seq_port_info_alloca(&info); + min = port < 0 ? 0 : port; + max = port < 0 ? max_ports : port + 1; + for (idx = min; idx < max; idx++) { + if ((err = snd_seq_get_any_port_info(handle, client, idx, info))<0) { + if (err == -ENOENT) + continue; + fprintf(stderr, "Port %i/%i info error: %s\n", client, idx, snd_strerror(err)); + exit(0); + } + printf(" Port %i info\n", idx); + printf(" Client : %i\n", snd_seq_port_info_get_client(info)); + printf(" Port : %i\n", snd_seq_port_info_get_port(info)); + printf(" Name : %s\n", snd_seq_port_info_get_name(info)); + printf(" Capability : 0x%x\n", snd_seq_port_info_get_capability(info)); + printf(" Type : 0x%x\n", snd_seq_port_info_get_type(info)); + //printf(" Midi channels : %i\n", info.midi_channels); + //printf(" Synth voices : %i\n", info.synth_voices); + printf(" Output subs : %i\n", snd_seq_port_info_get_write_use(info)); + printf(" Input subs : %i\n", snd_seq_port_info_get_read_use(info)); + } +} + +void show_client_info(snd_seq_t *handle, int client) +{ + int err, idx, min, max; + snd_seq_client_info_t *info; + + snd_seq_client_info_alloca(&info); + min = client < 0 ? 0 : client; + max = client < 0 ? max_clients : client + 1; + for (idx = min; idx < max; idx++) { + if ((err = snd_seq_get_any_client_info(handle, idx, info))<0) { + if (err == -ENOENT) + continue; + fprintf(stderr, "Client %i info error: %s\n", idx, snd_strerror(err)); + exit(0); + } + printf("Client %i info\n", idx); + if (verbose) + printf(" Client : %i\n", snd_seq_client_info_get_client(info)); + printf(" Type : %s\n", snd_seq_client_info_get_type(info) == SND_SEQ_KERNEL_CLIENT ? "kernel" : "user"); + printf(" Name : %s\n", snd_seq_client_info_get_name(info)); + } +} + +static void help(void) +{ + printf("Usage: seq <options> command\n"); + printf("\nAvailable options:\n"); + printf(" -h,--help this help\n"); + printf(" -d,--debug debug mode\n"); + printf(" -v,--verbose verbose mode\n"); + printf(" -V,--version print version of this program\n"); + printf("\nAvailable commands:\n"); + printf(" system show basic sequencer info\n"); + printf(" queue [#] show all queues or specified queue\n"); + printf(" client [#] show all clients or specified client\n"); + printf(" port <client> [#] show all ports or specified port for specified client\n"); + printf(" decoder event decoder\n"); + printf(" sender <client.port> [<client.port>] ... event sender\n"); +} + +int main(int argc, char *argv[]) +{ + int morehelp, err, arg, arg1; + snd_seq_t *handle; + static struct option long_option[] = + { + {"help", 0, NULL, HELPID_HELP}, + {"debug", 0, NULL, HELPID_DEBUG}, + {"verbose", 0, NULL, HELPID_VERBOSE}, + {"version", 0, NULL, HELPID_VERSION}, + {NULL, 0, NULL, 0}, + }; + + morehelp = 0; + + while (1) { + int c; + + if ((c = getopt_long(argc, argv, "hdvV", long_option, NULL)) < 0) + break; + switch (c) { + case 'h': + case HELPID_HELP: + morehelp++; + break; + case 'd': + case HELPID_DEBUG: + debug = 1; + break; + case 'v': + case HELPID_VERBOSE: + verbose = 1; + break; + case 'V': + case HELPID_VERSION: + printf("alsactl version " SEQ_VERSION "\n"); + return 1; + default: + fprintf(stderr, "\07Invalid switch or option needs an argument.\n"); + morehelp++; + } + } + if (morehelp) { + help(); + return 1; + } + if (argc - optind <= 0) { + fprintf(stderr, "seq: Specify command...\n"); + return 0; + } + if ((err = snd_seq_open(&handle, "hw", SND_SEQ_OPEN_DUPLEX, 0))<0) { + fprintf(stderr, "Open error: %s\n", snd_strerror(err)); + exit(0); + } + set_name(handle); + system_info(handle); + + if (!strcmp(argv[optind], "system")) { + show_system_info(handle); + } else if (!strcmp(argv[optind], "queue")) { + arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1; + show_queue_status(handle, arg); + } else if (!strcmp(argv[optind], "client")) { + arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1; + show_client_info(handle, arg); + } else if (!strcmp(argv[optind], "port")) { + arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1; + if (arg < 0) { + fprintf(stderr, "Specify port...\n"); + exit(0); + } + arg1 = argc - optind > 2 ? atoi(argv[optind + 2]) : -1; + show_port_info(handle, arg, arg1); + } else if (!strcmp(argv[optind], "decoder")) { + event_decoder(handle, argc - optind - 1, argv + optind + 1); + } else if (!strcmp(argv[optind], "sender")) { + event_sender(handle, argc - optind - 1, argv + optind + 1); + } else { + help(); + } + exit(1); +} |