* HAL2 driver Ulf Carlsson <ulfc@thepuffingroup.com>

* Timer API changes/cleanups
* Sequencer API changes/cleanups
  - queue ioctls changed
  - instrument events added
This commit is contained in:
Jaroslav Kysela 1999-05-09 23:15:42 +00:00
parent 6e72ca3977
commit ef61108225
6 changed files with 146 additions and 47 deletions

View file

@ -16,11 +16,15 @@
byte first (like Motorola and SPARC, unlike Intel and VAX). */ byte first (like Motorola and SPARC, unlike Intel and VAX). */
#undef WORDS_BIGENDIAN #undef WORDS_BIGENDIAN
/* Package name */
#undef PACKAGE
/* Package version */ /* Package version */
#undef VERSION #undef VERSION
/* Define if you have the <linux/asound.h> header file. */ /* Define if you have the <linux/asound.h> header file. */
#undef HAVE_LINUX_ASOUND_H #undef HAVE_LINUX_ASOUND_H
/* Name of package */
#undef PACKAGE
/* Version number of package */
#undef VERSION

View file

@ -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_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_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_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_get_queue_status(void *handle, int q, snd_seq_queue_status_t *status);
int snd_seq_set_queue_info(void *handle, int q, snd_seq_queue_info_t *queue); 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_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_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); int snd_seq_free_queue(void *handle, int q);
/* event routines */ /* event routines */
snd_seq_event_t *snd_seq_create_event(void); snd_seq_event_t *snd_seq_create_event(void);

View file

@ -296,29 +296,124 @@ int snd_seq_unsubscribe_port(void *handle, snd_seq_port_subscribe_t * sub)
return 0; 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; snd_seq_t *seq;
seq = (snd_seq_t *) handle; seq = (snd_seq_t *) handle;
if (!seq || !info) if (!seq || !status)
return -EINVAL; return -EINVAL;
bzero(info, sizeof(snd_seq_queue_info_t)); bzero(status, sizeof(snd_seq_queue_status_t));
info->queue = q; status->queue = q;
if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_INFO, info) < 0) if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_STATUS, status) < 0)
return -errno; return -errno;
return 0; 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; snd_seq_t *seq;
seq = (snd_seq_t *) handle; seq = (snd_seq_t *) handle;
if (!seq || !info) if (!seq || !tempo)
return -EINVAL; return -EINVAL;
info->queue = q; bzero(tempo, sizeof(snd_seq_queue_tempo_t));
if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_INFO, info) < 0) 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 -errno;
return 0; return 0;
} }
@ -352,11 +447,11 @@ int snd_seq_set_queue_client(void *handle, int q, snd_seq_queue_client_t * info)
return 0; 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; int i, err;
snd_seq_system_info_t sysinfo; snd_seq_system_info_t sysinfo;
snd_seq_queue_info_t inf; snd_seq_queue_owner_t owner;
snd_seq_t *seq; snd_seq_t *seq;
seq = (snd_seq_t *) handle; 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) if ((err = snd_seq_system_info(handle, &sysinfo))<0)
return err; return err;
for (i = 0; i < sysinfo.queues; i++) { 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; continue;
if (inf.locked) if (owner.locked)
continue; continue;
inf.locked = 1; owner.locked = 1;
inf.owner = seq->client; owner.owner = seq->client;
if ((err = snd_seq_set_queue_info(handle, i, &inf))<0) if ((err = snd_seq_set_queue_owner(handle, i, &owner))<0)
continue; continue;
if (info)
memcpy(info, &inf, sizeof(snd_seq_queue_info_t));
return i; return i;
} }
return -EBUSY; return -EBUSY;
@ -384,17 +477,17 @@ int snd_seq_free_queue(void *handle, int q)
{ {
int err; int err;
snd_seq_t *seq; snd_seq_t *seq;
snd_seq_queue_info_t inf; snd_seq_queue_owner_t owner;
seq = (snd_seq_t *) handle; seq = (snd_seq_t *) handle;
if (!seq) if (!seq)
return -EINVAL; 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; return err;
if (inf.locked && inf.owner == seq->client) { if (owner.locked && owner.owner == seq->client) {
inf.locked = 0; owner.locked = 0;
inf.owner = -1; owner.owner = -1;
if ((err = snd_seq_set_queue_info(handle, q, &inf))<0) if ((err = snd_seq_set_queue_owner(handle, q, &owner))<0)
return err; return err;
} }
return 0; return 0;

View file

@ -433,7 +433,7 @@ void event_decoder(void *handle, int argc, char *argv[])
return; return;
} }
printf("Client ID = %i\n", client); 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)); fprintf(stderr, "Cannot allocate queue: %s\n", snd_strerror(queue));
return; return;
} }

View file

@ -87,7 +87,7 @@ void event_sender(void *handle, int argc, char *argv[])
return; return;
} }
printf("Client ID = %i\n", client); 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)); fprintf(stderr, "Cannot allocate queue: %s\n", snd_strerror(queue));
return; return;
} }

View file

@ -51,29 +51,24 @@ void show_system_info(void *handle)
printf(" Max ports : %i\n", sysinfo.ports); 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; int err, idx, min, max;
snd_seq_queue_info_t info; snd_seq_queue_status_t status;
min = queue < 0 ? 0 : queue; min = queue < 0 ? 0 : queue;
max = queue < 0 ? sysinfo.queues : queue + 1; max = queue < 0 ? sysinfo.queues : queue + 1;
for (idx = min; idx < max; idx++) { 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) if (err == -ENOENT)
continue; continue;
fprintf(stderr, "Client %i info error: %s\n", idx, snd_strerror(err)); fprintf(stderr, "Client %i info error: %s\n", idx, snd_strerror(err));
exit(0); exit(0);
} }
printf("Queue %i info\n", info.queue); printf("Queue %i info\n", status.queue);
printf(" Tick : %u\n", info.tick); printf(" Tick : %u\n", status.tick);
printf(" Realtime : %i.%i\n", info.time.tv_sec, info.time.tv_nsec); printf(" Realtime : %li.%li\n", status.time.tv_sec, status.time.tv_nsec);
printf(" Running : %i\n", info.running); printf(" Flags : 0x%x\n", status.flags);
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);
} }
} }
@ -99,8 +94,8 @@ void show_port_info(void *handle, int client, int port)
printf(" Type : 0x%x\n", info.type); printf(" Type : 0x%x\n", info.type);
printf(" Midi channels : %i\n", info.midi_channels); printf(" Midi channels : %i\n", info.midi_channels);
printf(" Synth voices : %i\n", info.synth_voices); printf(" Synth voices : %i\n", info.synth_voices);
printf(" Subscribers : %i\n", info.subscribers); printf(" Output subs : %i\n", info.out_use);
printf(" Use : %i\n", info.use); printf(" Input subs : %i\n", info.in_use);
} }
} }
@ -200,7 +195,7 @@ int main(int argc, char *argv[])
show_system_info(handle); show_system_info(handle);
} else if (!strcmp(argv[optind], "queue")) { } else if (!strcmp(argv[optind], "queue")) {
arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1; 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")) { } else if (!strcmp(argv[optind], "client")) {
arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1; arg = argc - optind > 1 ? atoi(argv[optind + 1]) : -1;
show_client_info(handle, arg); show_client_info(handle, arg);