From ef611082257e89286fbb61ed8ad88250881d25ab Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Sun, 9 May 1999 23:15:42 +0000 Subject: [PATCH] * HAL2 driver Ulf Carlsson * Timer API changes/cleanups * Sequencer API changes/cleanups - queue ioctls changed - instrument events added --- include/config.h.in | 10 +++- include/seq.h | 13 +++- src/seq/seq.c | 141 ++++++++++++++++++++++++++++++++++++-------- test/seq-decoder.c | 2 +- test/seq-sender.c | 2 +- test/seq.c | 25 ++++---- 6 files changed, 146 insertions(+), 47 deletions(-) diff --git a/include/config.h.in b/include/config.h.in index 0d30be50..f03aa534 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -16,11 +16,15 @@ byte first (like Motorola and SPARC, unlike Intel and VAX). */ #undef WORDS_BIGENDIAN -/* Package name */ -#undef PACKAGE - /* Package version */ #undef VERSION /* Define if you have the header file. */ #undef HAVE_LINUX_ASOUND_H + +/* Name of package */ +#undef PACKAGE + +/* Version number of package */ +#undef VERSION + diff --git a/include/seq.h b/include/seq.h index ccd50bb0..382b7921 100644 --- a/include/seq.h +++ b/include/seq.h @@ -29,11 +29,18 @@ int snd_seq_get_any_port_info(void *handle, int client, int port, snd_seq_port_i int snd_seq_set_port_info(void *handle, int port, snd_seq_port_info_t *info); int snd_seq_subscribe_port(void *handle, snd_seq_port_subscribe_t *sub); int snd_seq_unsubscribe_port(void *handle, snd_seq_port_subscribe_t *sub); -int snd_seq_get_queue_info(void *handle, int q, snd_seq_queue_info_t *queue); -int snd_seq_set_queue_info(void *handle, int q, snd_seq_queue_info_t *queue); +int snd_seq_get_queue_status(void *handle, int q, snd_seq_queue_status_t *status); +int snd_seq_get_queue_tempo(void *handle, int q, snd_seq_queue_tempo_t *tempo); +int snd_seq_set_queue_tempo(void *handle, int q, snd_seq_queue_tempo_t *tempo); +int snd_seq_get_queue_owner(void *handle, int q, snd_seq_queue_owner_t *owner); +int snd_seq_set_queue_owner(void *handle, int q, snd_seq_queue_owner_t *owner); +int snd_seq_get_queue_timer(void *handle, int q, snd_seq_queue_timer_t *timer); +int snd_seq_set_queue_timer(void *handle, int q, snd_seq_queue_timer_t *timer); +int snd_seq_get_queue_sync(void *handle, int q, snd_seq_queue_sync_t *sync); +int snd_seq_set_queue_sync(void *handle, int q, snd_seq_queue_sync_t *sync); int snd_seq_get_queue_client(void *handle, int q, snd_seq_queue_client_t *queue); int snd_seq_set_queue_client(void *handle, int q, snd_seq_queue_client_t *queue); -int snd_seq_alloc_queue(void *handle, snd_seq_queue_info_t *queue); +int snd_seq_alloc_queue(void *handle); int snd_seq_free_queue(void *handle, int q); /* event routines */ snd_seq_event_t *snd_seq_create_event(void); diff --git a/src/seq/seq.c b/src/seq/seq.c index 31b538ca..c84740be 100644 --- a/src/seq/seq.c +++ b/src/seq/seq.c @@ -296,29 +296,124 @@ int snd_seq_unsubscribe_port(void *handle, snd_seq_port_subscribe_t * sub) return 0; } -int snd_seq_get_queue_info(void *handle, int q, snd_seq_queue_info_t * info) +int snd_seq_get_queue_status(void *handle, int q, snd_seq_queue_status_t * status) { snd_seq_t *seq; seq = (snd_seq_t *) handle; - if (!seq || !info) + if (!seq || !status) return -EINVAL; - bzero(info, sizeof(snd_seq_queue_info_t)); - info->queue = q; - if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_INFO, info) < 0) + bzero(status, sizeof(snd_seq_queue_status_t)); + status->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_STATUS, status) < 0) return -errno; return 0; } -int snd_seq_set_queue_info(void *handle, int q, snd_seq_queue_info_t * info) +int snd_seq_get_queue_tempo(void *handle, int q, snd_seq_queue_tempo_t * tempo) { snd_seq_t *seq; seq = (snd_seq_t *) handle; - if (!seq || !info) + if (!seq || !tempo) return -EINVAL; - info->queue = q; - if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_INFO, info) < 0) + bzero(tempo, sizeof(snd_seq_queue_tempo_t)); + tempo->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_TEMPO, tempo) < 0) + return -errno; + return 0; +} + +int snd_seq_set_queue_tempo(void *handle, int q, snd_seq_queue_tempo_t * tempo) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !tempo) + return -EINVAL; + tempo->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_TEMPO, tempo) < 0) + return -errno; + return 0; +} + +int snd_seq_get_queue_owner(void *handle, int q, snd_seq_queue_owner_t * owner) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !owner) + return -EINVAL; + bzero(owner, sizeof(snd_seq_queue_owner_t)); + owner->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_OWNER, owner) < 0) + return -errno; + return 0; +} + +int snd_seq_set_queue_owner(void *handle, int q, snd_seq_queue_owner_t * owner) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !owner) + return -EINVAL; + owner->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_OWNER, owner) < 0) + return -errno; + return 0; +} + +int snd_seq_get_queue_timer(void *handle, int q, snd_seq_queue_timer_t * timer) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !timer) + return -EINVAL; + bzero(timer, sizeof(snd_seq_queue_timer_t)); + timer->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_TIMER, timer) < 0) + return -errno; + return 0; +} + +int snd_seq_set_queue_timer(void *handle, int q, snd_seq_queue_timer_t * timer) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !timer) + return -EINVAL; + timer->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_TIMER, timer) < 0) + return -errno; + return 0; +} + +int snd_seq_get_queue_sync(void *handle, int q, snd_seq_queue_sync_t * sync) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !sync) + return -EINVAL; + bzero(sync, sizeof(snd_seq_queue_sync_t)); + sync->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_SYNC, sync) < 0) + return -errno; + return 0; +} + +int snd_seq_set_queue_sync(void *handle, int q, snd_seq_queue_sync_t * sync) +{ + snd_seq_t *seq; + + seq = (snd_seq_t *) handle; + if (!seq || !sync) + return -EINVAL; + sync->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_SYNC, sync) < 0) return -errno; return 0; } @@ -352,11 +447,11 @@ int snd_seq_set_queue_client(void *handle, int q, snd_seq_queue_client_t * info) return 0; } -int snd_seq_alloc_queue(void *handle, snd_seq_queue_info_t *info) +int snd_seq_alloc_queue(void *handle) { int i, err; snd_seq_system_info_t sysinfo; - snd_seq_queue_info_t inf; + snd_seq_queue_owner_t owner; snd_seq_t *seq; seq = (snd_seq_t *) handle; @@ -365,16 +460,14 @@ int snd_seq_alloc_queue(void *handle, snd_seq_queue_info_t *info) if ((err = snd_seq_system_info(handle, &sysinfo))<0) return err; for (i = 0; i < sysinfo.queues; i++) { - if ((err = snd_seq_get_queue_info(handle, i, &inf))<0) + if ((err = snd_seq_get_queue_owner(handle, i, &owner))<0) continue; - if (inf.locked) + if (owner.locked) continue; - inf.locked = 1; - inf.owner = seq->client; - if ((err = snd_seq_set_queue_info(handle, i, &inf))<0) + owner.locked = 1; + owner.owner = seq->client; + if ((err = snd_seq_set_queue_owner(handle, i, &owner))<0) continue; - if (info) - memcpy(info, &inf, sizeof(snd_seq_queue_info_t)); return i; } return -EBUSY; @@ -384,17 +477,17 @@ int snd_seq_free_queue(void *handle, int q) { int err; snd_seq_t *seq; - snd_seq_queue_info_t inf; + snd_seq_queue_owner_t owner; seq = (snd_seq_t *) handle; if (!seq) return -EINVAL; - if ((err = snd_seq_get_queue_info(handle, q, &inf))<0) + if ((err = snd_seq_get_queue_owner(handle, q, &owner))<0) return err; - if (inf.locked && inf.owner == seq->client) { - inf.locked = 0; - inf.owner = -1; - if ((err = snd_seq_set_queue_info(handle, q, &inf))<0) + if (owner.locked && owner.owner == seq->client) { + owner.locked = 0; + owner.owner = -1; + if ((err = snd_seq_set_queue_owner(handle, q, &owner))<0) return err; } return 0; diff --git a/test/seq-decoder.c b/test/seq-decoder.c index 05e5abc7..7142be27 100644 --- a/test/seq-decoder.c +++ b/test/seq-decoder.c @@ -433,7 +433,7 @@ void event_decoder(void *handle, int argc, char *argv[]) return; } printf("Client ID = %i\n", client); - if ((queue = snd_seq_alloc_queue(handle, NULL))<0) { + if ((queue = snd_seq_alloc_queue(handle))<0) { fprintf(stderr, "Cannot allocate queue: %s\n", snd_strerror(queue)); return; } diff --git a/test/seq-sender.c b/test/seq-sender.c index a9923f7a..644c73af 100644 --- a/test/seq-sender.c +++ b/test/seq-sender.c @@ -87,7 +87,7 @@ void event_sender(void *handle, int argc, char *argv[]) return; } printf("Client ID = %i\n", client); - if ((queue = snd_seq_alloc_queue(handle, NULL))<0) { + if ((queue = snd_seq_alloc_queue(handle))<0) { fprintf(stderr, "Cannot allocate queue: %s\n", snd_strerror(queue)); return; } diff --git a/test/seq.c b/test/seq.c index cc812c7a..cfcc065c 100644 --- a/test/seq.c +++ b/test/seq.c @@ -51,29 +51,24 @@ void show_system_info(void *handle) printf(" Max ports : %i\n", sysinfo.ports); } -void show_queue_info(void *handle, int queue) +void show_queue_status(void *handle, int queue) { int err, idx, min, max; - snd_seq_queue_info_t info; + snd_seq_queue_status_t status; min = queue < 0 ? 0 : queue; max = queue < 0 ? sysinfo.queues : queue + 1; for (idx = min; idx < max; idx++) { - if ((err = snd_seq_get_queue_info(handle, idx, &info))<0) { + 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", info.queue); - printf(" Tick : %u\n", info.tick); - printf(" Realtime : %i.%i\n", info.time.tv_sec, info.time.tv_nsec); - printf(" Running : %i\n", info.running); - printf(" Tempo : %i\n", info.tempo); - printf(" PPQ : %i\n", info.ppq); - printf(" Flags : 0x%x\n", info.flags); - printf(" Owner : %i\n", info.owner); - printf(" Locked : %i\n", info.locked); + printf("Queue %i info\n", status.queue); + printf(" Tick : %u\n", status.tick); + printf(" Realtime : %li.%li\n", status.time.tv_sec, status.time.tv_nsec); + printf(" Flags : 0x%x\n", status.flags); } } @@ -99,8 +94,8 @@ void show_port_info(void *handle, int client, int port) printf(" Type : 0x%x\n", info.type); printf(" Midi channels : %i\n", info.midi_channels); printf(" Synth voices : %i\n", info.synth_voices); - printf(" Subscribers : %i\n", info.subscribers); - printf(" Use : %i\n", info.use); + printf(" Output subs : %i\n", info.out_use); + printf(" Input subs : %i\n", info.in_use); } } @@ -200,7 +195,7 @@ int main(int argc, char *argv[]) show_system_info(handle); } else if (!strcmp(argv[optind], "queue")) { arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1; - show_queue_info(handle, arg); + 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); -- 2.47.1