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