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