mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
* 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:
parent
6e72ca3977
commit
ef61108225
6 changed files with 146 additions and 47 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
141
src/seq/seq.c
141
src/seq/seq.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
25
test/seq.c
25
test/seq.c
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue