Home | History | Annotate | Download | only in test
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <string.h>
      4 #include <errno.h>
      5 #include <ctype.h>
      6 #include <getopt.h>
      7 #include "../include/asoundlib.h"
      8 
      9 #include "seq-decoder.c"
     10 #include "seq-sender.c"
     11 
     12 #define SEQ_VERSION "0.0.1"
     13 
     14 #define HELPID_HELP             1000
     15 #define HELPID_DEBUG            1001
     16 #define HELPID_VERBOSE		1002
     17 #define HELPID_VERSION          1003
     18 
     19 int max_clients;
     20 int max_ports;
     21 int max_queues;
     22 int debug = 0;
     23 int verbose = 0;
     24 
     25 void set_name(snd_seq_t *handle)
     26 {
     27 	int err;
     28 	char name[64];
     29 
     30 	sprintf(name, "SeqUtil - %i", getpid());
     31 	if ((err = snd_seq_set_client_name(handle, name)) < 0) {
     32 		fprintf(stderr, "Set client info error: %s\n", snd_strerror(err));
     33 		exit(0);
     34 	}
     35 }
     36 
     37 void system_info(snd_seq_t *handle)
     38 {
     39 	int err;
     40 	snd_seq_system_info_t *sysinfo;
     41 
     42 	snd_seq_system_info_alloca(&sysinfo);
     43 	if ((err = snd_seq_system_info(handle, sysinfo))<0) {
     44 		fprintf(stderr, "System info error: %s\n", snd_strerror(err));
     45 		exit(0);
     46 	}
     47 	max_clients = snd_seq_system_info_get_clients(sysinfo);
     48 	max_ports = snd_seq_system_info_get_ports(sysinfo);
     49 	max_queues = snd_seq_system_info_get_ports(sysinfo);
     50 }
     51 
     52 void show_system_info(snd_seq_t *handle ATTRIBUTE_UNUSED)
     53 {
     54 	printf("System info\n");
     55 	printf("  Max queues    : %i\n", max_queues);
     56 	printf("  Max clients   : %i\n", max_clients);
     57 	printf("  Max ports     : %i\n", max_ports);
     58 }
     59 
     60 void show_queue_status(snd_seq_t *handle, int queue)
     61 {
     62 	int err, idx, min, max;
     63 	snd_seq_queue_status_t *status;
     64 
     65 	snd_seq_queue_status_alloca(&status);
     66 	min = queue < 0 ? 0 : queue;
     67 	max = queue < 0 ? max_queues : queue + 1;
     68 	for (idx = min; idx < max; idx++) {
     69 		if ((err = snd_seq_get_queue_status(handle, idx, status))<0) {
     70 			if (err == -ENOENT)
     71 				continue;
     72 			fprintf(stderr, "Client %i info error: %s\n", idx, snd_strerror(err));
     73 			exit(0);
     74 		}
     75 		printf("Queue %i info\n", snd_seq_queue_status_get_queue(status));
     76 		printf("  Tick          : %u\n", snd_seq_queue_status_get_tick_time(status));
     77 		printf("  Realtime      : %i.%i\n",
     78 		       snd_seq_queue_status_get_real_time(status)->tv_sec,
     79 		       snd_seq_queue_status_get_real_time(status)->tv_nsec);
     80 		printf("  Flags         : 0x%x\n", snd_seq_queue_status_get_status(status));
     81 	}
     82 }
     83 
     84 void show_port_info(snd_seq_t *handle, int client, int port)
     85 {
     86 	int err, idx, min, max;
     87 	snd_seq_port_info_t *info;
     88 
     89 	snd_seq_port_info_alloca(&info);
     90 	min = port < 0 ? 0 : port;
     91 	max = port < 0 ? max_ports : port + 1;
     92 	for (idx = min; idx < max; idx++) {
     93 		if ((err = snd_seq_get_any_port_info(handle, client, idx, info))<0) {
     94 			if (err == -ENOENT)
     95 				continue;
     96 			fprintf(stderr, "Port %i/%i info error: %s\n", client, idx, snd_strerror(err));
     97 			exit(0);
     98 		}
     99 		printf("  Port %i info\n", idx);
    100 		printf("    Client        : %i\n", snd_seq_port_info_get_client(info));
    101 		printf("    Port          : %i\n", snd_seq_port_info_get_port(info));
    102 		printf("    Name          : %s\n", snd_seq_port_info_get_name(info));
    103 		printf("    Capability    : 0x%x\n", snd_seq_port_info_get_capability(info));
    104 		printf("    Type          : 0x%x\n", snd_seq_port_info_get_type(info));
    105 		//printf("    Midi channels : %i\n", info.midi_channels);
    106 		//printf("    Synth voices  : %i\n", info.synth_voices);
    107 		printf("    Output subs   : %i\n", snd_seq_port_info_get_write_use(info));
    108 		printf("    Input subs    : %i\n", snd_seq_port_info_get_read_use(info));
    109 	}
    110 }
    111 
    112 void show_client_info(snd_seq_t *handle, int client)
    113 {
    114 	int err, idx, min, max;
    115 	snd_seq_client_info_t *info;
    116 
    117 	snd_seq_client_info_alloca(&info);
    118 	min = client < 0 ? 0 : client;
    119 	max = client < 0 ? max_clients : client + 1;
    120 	for (idx = min; idx < max; idx++) {
    121 		if ((err = snd_seq_get_any_client_info(handle, idx, info))<0) {
    122 			if (err == -ENOENT)
    123 				continue;
    124 			fprintf(stderr, "Client %i info error: %s\n", idx, snd_strerror(err));
    125 			exit(0);
    126 		}
    127 		printf("Client %i info\n", idx);
    128 		if (verbose)
    129 			printf("  Client        : %i\n", snd_seq_client_info_get_client(info));
    130 		printf("  Type          : %s\n", snd_seq_client_info_get_type(info) == SND_SEQ_KERNEL_CLIENT ? "kernel" : "user");
    131 		printf("  Name          : %s\n", snd_seq_client_info_get_name(info));
    132 	}
    133 }
    134 
    135 static void help(void)
    136 {
    137 	printf("Usage: seq <options> command\n");
    138 	printf("\nAvailable options:\n");
    139 	printf("  -h,--help       this help\n");
    140 	printf("  -d,--debug      debug mode\n");
    141 	printf("  -v,--verbose    verbose mode\n");
    142 	printf("  -V,--version    print version of this program\n");
    143 	printf("\nAvailable commands:\n");
    144 	printf("  system          show basic sequencer info\n");
    145 	printf("  queue [#]       show all queues or specified queue\n");
    146 	printf("  client [#]      show all clients or specified client\n");
    147 	printf("  port <client> [#]  show all ports or specified port for specified client\n");
    148 	printf("  decoder         event decoder\n");
    149 	printf("  sender <client.port> [<client.port>] ...   event sender\n");
    150 }
    151 
    152 int main(int argc, char *argv[])
    153 {
    154 	int morehelp, err, arg, arg1;
    155 	snd_seq_t *handle;
    156 	static struct option long_option[] =
    157 	{
    158 		{"help", 0, NULL, HELPID_HELP},
    159 		{"debug", 0, NULL, HELPID_DEBUG},
    160 		{"verbose", 0, NULL, HELPID_VERBOSE},
    161 		{"version", 0, NULL, HELPID_VERSION},
    162 		{NULL, 0, NULL, 0},
    163         };
    164 
    165         morehelp = 0;
    166 
    167 	while (1) {
    168 		int c;
    169 
    170 		if ((c = getopt_long(argc, argv, "hdvV", long_option, NULL)) < 0)
    171 			break;
    172 		switch (c) {
    173 		case 'h':
    174 		case HELPID_HELP:
    175 			morehelp++;
    176 			break;
    177 		case 'd':
    178 		case HELPID_DEBUG:
    179 			debug = 1;
    180 			break;
    181 		case 'v':
    182 		case HELPID_VERBOSE:
    183 			verbose = 1;
    184 			break;
    185 		case 'V':
    186 		case HELPID_VERSION:
    187 			printf("alsactl version " SEQ_VERSION "\n");
    188 			return 1;
    189 		default:
    190 			fprintf(stderr, "\07Invalid switch or option needs an argument.\n");
    191 			morehelp++;
    192 		}
    193 	}
    194         if (morehelp) {
    195                 help();
    196                 return 1;
    197         }
    198 	if (argc - optind <= 0) {
    199 		fprintf(stderr, "seq: Specify command...\n");
    200 		return 0;
    201 	}
    202 	if ((err = snd_seq_open(&handle, "hw", SND_SEQ_OPEN_DUPLEX, 0))<0) {
    203 		fprintf(stderr, "Open error: %s\n", snd_strerror(err));
    204 		exit(0);
    205 	}
    206 	set_name(handle);
    207 	system_info(handle);
    208 
    209         if (!strcmp(argv[optind], "system")) {
    210 		show_system_info(handle);
    211 	} else if (!strcmp(argv[optind], "queue")) {
    212 		arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1;
    213 		show_queue_status(handle, arg);
    214 	} else if (!strcmp(argv[optind], "client")) {
    215 		arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1;
    216 		show_client_info(handle, arg);
    217 	} else if (!strcmp(argv[optind], "port")) {
    218 		arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1;
    219 		if (arg < 0) {
    220 			fprintf(stderr, "Specify port...\n");
    221 			exit(0);
    222 		}
    223 		arg1 = argc - optind > 2 ? atoi(argv[optind + 2]) : -1;
    224 		show_port_info(handle, arg, arg1);
    225 	} else if (!strcmp(argv[optind], "decoder")) {
    226 		event_decoder(handle, argc - optind - 1, argv + optind + 1);
    227 	} else if (!strcmp(argv[optind], "sender")) {
    228 		event_sender(handle, argc - optind - 1, argv + optind + 1);
    229 	} else {
    230 		help();
    231 	}
    232 	exit(1);
    233 }
    234