From 2dc55fd684234393da0e556ebbb94485ab8b7eef Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 16 Nov 1999 15:07:05 +0000 Subject: [PATCH] Takashi Iwai Tue, 16 Nov 1999 14:32:17 +0100 Some minor bug fixes in alsa-lib/seq. --- include/seq.h | 4 +++ src/seq/seq.c | 88 +++++++++++++++++++++++++++++++++++---------------- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/include/seq.h b/include/seq.h index 7ce96b27..b3c0c18c 100644 --- a/include/seq.h +++ b/include/seq.h @@ -44,8 +44,12 @@ int snd_seq_get_queue_sync(snd_seq_t *handle, int q, snd_seq_queue_sync_t *sync) int snd_seq_set_queue_sync(snd_seq_t *handle, int q, snd_seq_queue_sync_t *sync); int snd_seq_get_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t *queue); int snd_seq_set_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t *queue); +int snd_seq_alloc_named_queue(snd_seq_t *seq, char *name); int snd_seq_alloc_queue(snd_seq_t *handle); int snd_seq_free_queue(snd_seq_t *handle, int q); +int snd_seq_get_queue_info(snd_seq_t *seq, int q, snd_seq_queue_info_t *info); +int snd_seq_set_queue_info(snd_seq_t *seq, int q, snd_seq_queue_info_t *info); +int snd_seq_get_named_queue(snd_seq_t *seq, char *name); int snd_seq_get_client_pool(snd_seq_t *handle, snd_seq_client_pool_t * info); int snd_seq_set_client_pool(snd_seq_t *handle, snd_seq_client_pool_t * info); int snd_seq_query_next_client(snd_seq_t *handle, snd_seq_client_info_t * info); diff --git a/src/seq/seq.c b/src/seq/seq.c index aa58f2ea..b9a1a628 100644 --- a/src/seq/seq.c +++ b/src/seq/seq.c @@ -376,48 +376,76 @@ int snd_seq_set_queue_client(snd_seq_t *seq, int q, snd_seq_queue_client_t * inf return 0; } -int snd_seq_alloc_queue(snd_seq_t *seq) +int snd_seq_alloc_named_queue(snd_seq_t *seq, char *name) { - int i, err; - snd_seq_system_info_t sysinfo; - snd_seq_queue_owner_t owner; + snd_seq_queue_info_t info; if (!seq) return -EINVAL; - if ((err = snd_seq_system_info(seq, &sysinfo))<0) - return err; - for (i = 0; i < sysinfo.queues; i++) { - if ((err = snd_seq_get_queue_owner(seq, i, &owner))<0) - continue; - if (owner.locked) - continue; - owner.locked = 1; - owner.owner = seq->client; - if ((err = snd_seq_set_queue_owner(seq, i, &owner))<0) - continue; - return i; - } - return -EBUSY; + + memset(&info, 0, sizeof(info)); + info.owner = seq->client; + info.locked = 1; + if (name) + strncpy(info.name, name, sizeof(info.name) - 1); + if (ioctl(seq->fd, SND_SEQ_IOCTL_CREATE_QUEUE, &info) < 0) + return -errno; + + return info.queue; +} + +int snd_seq_alloc_queue(snd_seq_t *seq) +{ + return snd_seq_alloc_named_queue(seq, NULL); } int snd_seq_free_queue(snd_seq_t *seq, int q) { - int err; - snd_seq_queue_owner_t owner; + snd_seq_queue_info_t info; if (!seq) return -EINVAL; - if ((err = snd_seq_get_queue_owner(seq, q, &owner))<0) - return err; - if (owner.locked && owner.owner == seq->client) { - owner.locked = 0; - owner.owner = -1; - if ((err = snd_seq_set_queue_owner(seq, q, &owner))<0) - return err; - } + + memset(&info, 0, sizeof(info)); + info.queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_DELETE_QUEUE, &info) < 0) + return -errno; + return 0; } +int snd_seq_get_queue_info(snd_seq_t *seq, int q, snd_seq_queue_info_t *info) +{ + if (!seq || !info) + return -EINVAL; + info->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_QUEUE_INFO, info) < 0) + return -errno; + return 0; +} + +int snd_seq_set_queue_info(snd_seq_t *seq, int q, snd_seq_queue_info_t *info) +{ + if (!seq || !info) + return -EINVAL; + info->queue = q; + if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_QUEUE_INFO, info) < 0) + return -errno; + return 0; +} + +int snd_seq_get_named_queue(snd_seq_t *seq, char *name) +{ + snd_seq_queue_info_t info; + + if (!seq) + return -EINVAL; + strncpy(info.name, name, sizeof(info.name)); + if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_NAMED_QUEUE, &info) < 0) + return -errno; + return info.queue; +} + snd_seq_event_t *snd_seq_create_event(void) { return (snd_seq_event_t *) calloc(1, sizeof(snd_seq_event_t)); @@ -558,11 +586,13 @@ static int snd_seq_decode_event(char **buf, int *len, snd_seq_event_t *ev) case SND_SEQ_EVENT_LENGTH_VARIABLE: if (*len < ev->data.ext.len) { *len = 0; + ev->flags &= ~SND_SEQ_EVENT_LENGTH_MASK; /* clear flag */ return -ENOENT; } if (ev->data.ext.len > 0) { ev->data.ext.ptr = (char *) malloc(ev->data.ext.len); if (!(ev->data.ext.ptr)) { + ev->flags &= ~SND_SEQ_EVENT_LENGTH_MASK; /* clear flag */ *buf += ev->data.ext.len; *len -= ev->data.ext.len; return -ENOENT; @@ -595,6 +625,8 @@ int snd_seq_event_input(snd_seq_t *seq, snd_seq_event_t **ev) return -ENOMEM; cell = snd_seq_input_cell_out(seq); memcpy(*ev, &cell->ev, sizeof(snd_seq_event_t)); + /* clear flag to avoid free copied data */ + cell->ev.flags &= ~SND_SEQ_EVENT_LENGTH_MASK; snd_seq_free_cell(cell); return seq->cells; } -- 2.47.1