Sequencer changes (pool per client) by Takashi Iwai <iwai@ww.uni-erlangen.de>

This commit is contained in:
Jaroslav Kysela 1999-06-15 22:26:21 +00:00
parent dc126564c7
commit d00535cc1b
3 changed files with 439 additions and 576 deletions

View file

@ -44,6 +44,8 @@ int snd_seq_get_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t *q
int snd_seq_set_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_queue(snd_seq_t *handle); int snd_seq_alloc_queue(snd_seq_t *handle);
int snd_seq_free_queue(snd_seq_t *handle, int q); int snd_seq_free_queue(snd_seq_t *handle, int q);
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);
/* event routines */ /* event routines */
snd_seq_event_t *snd_seq_create_event(void); snd_seq_event_t *snd_seq_create_event(void);
int snd_seq_free_event(snd_seq_event_t *ev); int snd_seq_free_event(snd_seq_event_t *ev);

View file

@ -108,12 +108,10 @@ int snd_seq_open(snd_seq_t **handle, int mode)
return 0; return 0;
} }
int snd_seq_close(snd_seq_t *handle) int snd_seq_close(snd_seq_t *seq)
{ {
snd_seq_t *seq;
int res; int res;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
res = close(seq->fd) < 0 ? -errno : 0; res = close(seq->fd) < 0 ? -errno : 0;
@ -121,22 +119,17 @@ int snd_seq_close(snd_seq_t *handle)
return res; return res;
} }
int snd_seq_file_descriptor(snd_seq_t *handle) int snd_seq_file_descriptor(snd_seq_t *seq)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
return seq->fd; return seq->fd;
} }
int snd_seq_block_mode(snd_seq_t *handle, int enable) int snd_seq_block_mode(snd_seq_t *seq, int enable)
{ {
snd_seq_t *seq;
long flags; long flags;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
if ((flags = fcntl(seq->fd, F_GETFL)) < 0) if ((flags = fcntl(seq->fd, F_GETFL)) < 0)
@ -150,21 +143,15 @@ int snd_seq_block_mode(snd_seq_t *handle, int enable)
return 0; return 0;
} }
int snd_seq_client_id(snd_seq_t *handle) int snd_seq_client_id(snd_seq_t *seq)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
return seq->client; return seq->client;
} }
int snd_seq_system_info(snd_seq_t *handle, snd_seq_system_info_t * info) int snd_seq_system_info(snd_seq_t *seq, snd_seq_system_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info) if (!seq || !info)
return -EINVAL; return -EINVAL;
if (ioctl(seq->fd, SND_SEQ_IOCTL_SYSTEM_INFO, info) < 0) if (ioctl(seq->fd, SND_SEQ_IOCTL_SYSTEM_INFO, info) < 0)
@ -172,21 +159,15 @@ int snd_seq_system_info(snd_seq_t *handle, snd_seq_system_info_t * info)
return 0; return 0;
} }
int snd_seq_get_client_info(snd_seq_t *handle, snd_seq_client_info_t * info) int snd_seq_get_client_info(snd_seq_t *seq, snd_seq_client_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info) if (!seq || !info)
return -EINVAL; return -EINVAL;
return snd_seq_get_any_client_info(handle, seq->client, info); return snd_seq_get_any_client_info(seq, seq->client, info);
} }
int snd_seq_get_any_client_info(snd_seq_t *handle, int client, snd_seq_client_info_t * info) int snd_seq_get_any_client_info(snd_seq_t *seq, int client, snd_seq_client_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info || client < 0) if (!seq || !info || client < 0)
return -EINVAL; return -EINVAL;
bzero(info, sizeof(snd_seq_client_info_t)); bzero(info, sizeof(snd_seq_client_info_t));
@ -196,11 +177,8 @@ int snd_seq_get_any_client_info(snd_seq_t *handle, int client, snd_seq_client_in
return 0; return 0;
} }
int snd_seq_set_client_info(snd_seq_t *handle, snd_seq_client_info_t * info) int snd_seq_set_client_info(snd_seq_t *seq, snd_seq_client_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info) if (!seq || !info)
return -EINVAL; return -EINVAL;
info->client = seq->client; info->client = seq->client;
@ -210,11 +188,8 @@ int snd_seq_set_client_info(snd_seq_t *handle, snd_seq_client_info_t * info)
return 0; return 0;
} }
int snd_seq_create_port(snd_seq_t *handle, snd_seq_port_info_t * port) int snd_seq_create_port(snd_seq_t *seq, snd_seq_port_info_t * port)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !port) if (!seq || !port)
return -EINVAL; return -EINVAL;
port->client = seq->client; port->client = seq->client;
@ -223,11 +198,8 @@ int snd_seq_create_port(snd_seq_t *handle, snd_seq_port_info_t * port)
return 0; return 0;
} }
int snd_seq_delete_port(snd_seq_t *handle, snd_seq_port_info_t * port) int snd_seq_delete_port(snd_seq_t *seq, snd_seq_port_info_t * port)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !port) if (!seq || !port)
return -EINVAL; return -EINVAL;
port->client = seq->client; port->client = seq->client;
@ -236,21 +208,15 @@ int snd_seq_delete_port(snd_seq_t *handle, snd_seq_port_info_t * port)
return 0; return 0;
} }
int snd_seq_get_port_info(snd_seq_t *handle, int port, snd_seq_port_info_t * info) int snd_seq_get_port_info(snd_seq_t *seq, int port, snd_seq_port_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info || port < 0) if (!seq || !info || port < 0)
return -EINVAL; return -EINVAL;
return snd_seq_get_any_port_info(handle, seq->client, port, info); return snd_seq_get_any_port_info(seq, seq->client, port, info);
} }
int snd_seq_get_any_port_info(snd_seq_t *handle, int client, int port, snd_seq_port_info_t * info) int snd_seq_get_any_port_info(snd_seq_t *seq, int client, int port, snd_seq_port_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info || client < 0 || port < 0) if (!seq || !info || client < 0 || port < 0)
return -EINVAL; return -EINVAL;
bzero(info, sizeof(snd_seq_port_info_t)); bzero(info, sizeof(snd_seq_port_info_t));
@ -261,11 +227,8 @@ int snd_seq_get_any_port_info(snd_seq_t *handle, int client, int port, snd_seq_p
return 0; return 0;
} }
int snd_seq_set_port_info(snd_seq_t *handle, int port, snd_seq_port_info_t * info) int snd_seq_set_port_info(snd_seq_t *seq, int port, snd_seq_port_info_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info || port < 0) if (!seq || !info || port < 0)
return -EINVAL; return -EINVAL;
info->port = port; info->port = port;
@ -274,11 +237,8 @@ int snd_seq_set_port_info(snd_seq_t *handle, int port, snd_seq_port_info_t * inf
return 0; return 0;
} }
int snd_seq_subscribe_port(snd_seq_t *handle, snd_seq_port_subscribe_t * sub) int snd_seq_subscribe_port(snd_seq_t *seq, snd_seq_port_subscribe_t * sub)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !sub) if (!seq || !sub)
return -EINVAL; return -EINVAL;
if (ioctl(seq->fd, SND_SEQ_IOCTL_SUBSCRIBE_PORT, sub) < 0) if (ioctl(seq->fd, SND_SEQ_IOCTL_SUBSCRIBE_PORT, sub) < 0)
@ -286,11 +246,8 @@ int snd_seq_subscribe_port(snd_seq_t *handle, snd_seq_port_subscribe_t * sub)
return 0; return 0;
} }
int snd_seq_unsubscribe_port(snd_seq_t *handle, snd_seq_port_subscribe_t * sub) int snd_seq_unsubscribe_port(snd_seq_t *seq, snd_seq_port_subscribe_t * sub)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !sub) if (!seq || !sub)
return -EINVAL; return -EINVAL;
if (ioctl(seq->fd, SND_SEQ_IOCTL_UNSUBSCRIBE_PORT, sub) < 0) if (ioctl(seq->fd, SND_SEQ_IOCTL_UNSUBSCRIBE_PORT, sub) < 0)
@ -298,11 +255,8 @@ int snd_seq_unsubscribe_port(snd_seq_t *handle, snd_seq_port_subscribe_t * sub)
return 0; return 0;
} }
int snd_seq_get_queue_status(snd_seq_t *handle, int q, snd_seq_queue_status_t * status) int snd_seq_get_queue_status(snd_seq_t *seq, int q, snd_seq_queue_status_t * status)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !status) if (!seq || !status)
return -EINVAL; return -EINVAL;
bzero(status, sizeof(snd_seq_queue_status_t)); bzero(status, sizeof(snd_seq_queue_status_t));
@ -312,11 +266,8 @@ int snd_seq_get_queue_status(snd_seq_t *handle, int q, snd_seq_queue_status_t *
return 0; return 0;
} }
int snd_seq_get_queue_tempo(snd_seq_t *handle, int q, snd_seq_queue_tempo_t * tempo) int snd_seq_get_queue_tempo(snd_seq_t *seq, int q, snd_seq_queue_tempo_t * tempo)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !tempo) if (!seq || !tempo)
return -EINVAL; return -EINVAL;
bzero(tempo, sizeof(snd_seq_queue_tempo_t)); bzero(tempo, sizeof(snd_seq_queue_tempo_t));
@ -326,11 +277,8 @@ int snd_seq_get_queue_tempo(snd_seq_t *handle, int q, snd_seq_queue_tempo_t * te
return 0; return 0;
} }
int snd_seq_set_queue_tempo(snd_seq_t *handle, int q, snd_seq_queue_tempo_t * tempo) int snd_seq_set_queue_tempo(snd_seq_t *seq, int q, snd_seq_queue_tempo_t * tempo)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !tempo) if (!seq || !tempo)
return -EINVAL; return -EINVAL;
tempo->queue = q; tempo->queue = q;
@ -339,11 +287,8 @@ int snd_seq_set_queue_tempo(snd_seq_t *handle, int q, snd_seq_queue_tempo_t * te
return 0; return 0;
} }
int snd_seq_get_queue_owner(snd_seq_t *handle, int q, snd_seq_queue_owner_t * owner) int snd_seq_get_queue_owner(snd_seq_t *seq, int q, snd_seq_queue_owner_t * owner)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !owner) if (!seq || !owner)
return -EINVAL; return -EINVAL;
bzero(owner, sizeof(snd_seq_queue_owner_t)); bzero(owner, sizeof(snd_seq_queue_owner_t));
@ -353,11 +298,8 @@ int snd_seq_get_queue_owner(snd_seq_t *handle, int q, snd_seq_queue_owner_t * ow
return 0; return 0;
} }
int snd_seq_set_queue_owner(snd_seq_t *handle, int q, snd_seq_queue_owner_t * owner) int snd_seq_set_queue_owner(snd_seq_t *seq, int q, snd_seq_queue_owner_t * owner)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !owner) if (!seq || !owner)
return -EINVAL; return -EINVAL;
owner->queue = q; owner->queue = q;
@ -366,11 +308,8 @@ int snd_seq_set_queue_owner(snd_seq_t *handle, int q, snd_seq_queue_owner_t * ow
return 0; return 0;
} }
int snd_seq_get_queue_timer(snd_seq_t *handle, int q, snd_seq_queue_timer_t * timer) int snd_seq_get_queue_timer(snd_seq_t *seq, int q, snd_seq_queue_timer_t * timer)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !timer) if (!seq || !timer)
return -EINVAL; return -EINVAL;
bzero(timer, sizeof(snd_seq_queue_timer_t)); bzero(timer, sizeof(snd_seq_queue_timer_t));
@ -380,11 +319,8 @@ int snd_seq_get_queue_timer(snd_seq_t *handle, int q, snd_seq_queue_timer_t * ti
return 0; return 0;
} }
int snd_seq_set_queue_timer(snd_seq_t *handle, int q, snd_seq_queue_timer_t * timer) int snd_seq_set_queue_timer(snd_seq_t *seq, int q, snd_seq_queue_timer_t * timer)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !timer) if (!seq || !timer)
return -EINVAL; return -EINVAL;
timer->queue = q; timer->queue = q;
@ -393,11 +329,8 @@ int snd_seq_set_queue_timer(snd_seq_t *handle, int q, snd_seq_queue_timer_t * ti
return 0; return 0;
} }
int snd_seq_get_queue_sync(snd_seq_t *handle, int q, snd_seq_queue_sync_t * sync) int snd_seq_get_queue_sync(snd_seq_t *seq, int q, snd_seq_queue_sync_t * sync)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !sync) if (!seq || !sync)
return -EINVAL; return -EINVAL;
bzero(sync, sizeof(snd_seq_queue_sync_t)); bzero(sync, sizeof(snd_seq_queue_sync_t));
@ -407,11 +340,8 @@ int snd_seq_get_queue_sync(snd_seq_t *handle, int q, snd_seq_queue_sync_t * sync
return 0; return 0;
} }
int snd_seq_set_queue_sync(snd_seq_t *handle, int q, snd_seq_queue_sync_t * sync) int snd_seq_set_queue_sync(snd_seq_t *seq, int q, snd_seq_queue_sync_t * sync)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !sync) if (!seq || !sync)
return -EINVAL; return -EINVAL;
sync->queue = q; sync->queue = q;
@ -420,11 +350,8 @@ int snd_seq_set_queue_sync(snd_seq_t *handle, int q, snd_seq_queue_sync_t * sync
return 0; return 0;
} }
int snd_seq_get_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t * info) int snd_seq_get_queue_client(snd_seq_t *seq, int q, snd_seq_queue_client_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info) if (!seq || !info)
return -EINVAL; return -EINVAL;
bzero(info, sizeof(snd_seq_queue_client_t)); bzero(info, sizeof(snd_seq_queue_client_t));
@ -435,11 +362,8 @@ int snd_seq_get_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t *
return 0; return 0;
} }
int snd_seq_set_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t * info) int snd_seq_set_queue_client(snd_seq_t *seq, int q, snd_seq_queue_client_t * info)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq || !info) if (!seq || !info)
return -EINVAL; return -EINVAL;
info->queue = q; info->queue = q;
@ -449,47 +373,43 @@ int snd_seq_set_queue_client(snd_seq_t *handle, int q, snd_seq_queue_client_t *
return 0; return 0;
} }
int snd_seq_alloc_queue(snd_seq_t *handle) int snd_seq_alloc_queue(snd_seq_t *seq)
{ {
int i, err; int i, err;
snd_seq_system_info_t sysinfo; snd_seq_system_info_t sysinfo;
snd_seq_queue_owner_t owner; snd_seq_queue_owner_t owner;
snd_seq_t *seq;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
if ((err = snd_seq_system_info(handle, &sysinfo))<0) if ((err = snd_seq_system_info(seq, &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_owner(handle, i, &owner))<0) if ((err = snd_seq_get_queue_owner(seq, i, &owner))<0)
continue; continue;
if (owner.locked) if (owner.locked)
continue; continue;
owner.locked = 1; owner.locked = 1;
owner.owner = seq->client; owner.owner = seq->client;
if ((err = snd_seq_set_queue_owner(handle, i, &owner))<0) if ((err = snd_seq_set_queue_owner(seq, i, &owner))<0)
continue; continue;
return i; return i;
} }
return -EBUSY; return -EBUSY;
} }
int snd_seq_free_queue(snd_seq_t *handle, int q) int snd_seq_free_queue(snd_seq_t *seq, int q)
{ {
int err; int err;
snd_seq_t *seq;
snd_seq_queue_owner_t owner; snd_seq_queue_owner_t owner;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
if ((err = snd_seq_get_queue_owner(handle, q, &owner))<0) if ((err = snd_seq_get_queue_owner(seq, q, &owner))<0)
return err; return err;
if (owner.locked && owner.owner == seq->client) { if (owner.locked && owner.owner == seq->client) {
owner.locked = 0; owner.locked = 0;
owner.owner = -1; owner.owner = -1;
if ((err = snd_seq_set_queue_owner(handle, q, &owner))<0) if ((err = snd_seq_set_queue_owner(seq, q, &owner))<0)
return err; return err;
} }
return 0; return 0;
@ -537,17 +457,15 @@ int snd_seq_event_length(snd_seq_event_t *ev)
return len; return len;
} }
int snd_seq_event_output(snd_seq_t *handle, snd_seq_event_t *ev) int snd_seq_event_output(snd_seq_t *seq, snd_seq_event_t *ev)
{ {
int len; int len;
snd_seq_t *seq;
seq = handle;
if (!seq || !ev) if (!seq || !ev)
return -EINVAL; return -EINVAL;
len = snd_seq_event_length(ev); len = snd_seq_event_length(ev);
if ((seq->obufsize - seq->obufused) < len) { if ((seq->obufsize - seq->obufused) < len) {
snd_seq_flush_output(handle); snd_seq_flush_output(seq);
if ((seq->obufsize - seq->obufused) < len) if ((seq->obufsize - seq->obufused) < len)
return -ENOMEM; return -ENOMEM;
} }
@ -659,15 +577,13 @@ static int snd_seq_decode_event(char **buf, int *len, snd_seq_event_t *ev)
* Current implementation uses FIFO cache. * Current implementation uses FIFO cache.
*/ */
int snd_seq_event_input(snd_seq_t *handle, snd_seq_event_t **ev) int snd_seq_event_input(snd_seq_t *seq, snd_seq_event_t **ev)
{ {
snd_seq_t *seq;
snd_seq_cell_t *cell; snd_seq_cell_t *cell;
char *buf; char *buf;
int count; int count;
*ev = NULL; *ev = NULL;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
if (snd_seq_input_cell_available(seq)) { if (snd_seq_input_cell_available(seq)) {
@ -705,19 +621,17 @@ int snd_seq_event_input(snd_seq_t *handle, snd_seq_event_t **ev)
return seq->cells; return seq->cells;
} }
int snd_seq_flush_output(snd_seq_t *handle) int snd_seq_flush_output(snd_seq_t *seq)
{ {
snd_seq_t *seq;
int result; int result;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
if (seq->obufused <= 0) if (seq->obufused <= 0)
return 0; return 0;
result = write(seq->fd, seq->obuf, seq->obufused); result = write(seq->fd, seq->obuf, seq->obufused);
if (result < 0) { if (result < 0) {
snd_seq_drain_output(handle); snd_seq_drain_output(seq);
return -errno; return -errno;
} }
if (result < seq->obufused) if (result < seq->obufused)
@ -726,22 +640,16 @@ int snd_seq_flush_output(snd_seq_t *handle)
return seq->obufused; return seq->obufused;
} }
int snd_seq_drain_output(snd_seq_t *handle) int snd_seq_drain_output(snd_seq_t *seq)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
seq->obufused = 0; seq->obufused = 0;
return 0; return 0;
} }
int snd_seq_drain_input(snd_seq_t *handle) int snd_seq_drain_input(snd_seq_t *seq)
{ {
snd_seq_t *seq;
seq = handle;
if (!seq) if (!seq)
return -EINVAL; return -EINVAL;
while (snd_seq_input_cell_available(seq)) while (snd_seq_input_cell_available(seq))
@ -749,6 +657,26 @@ int snd_seq_drain_input(snd_seq_t *handle)
return 0; return 0;
} }
int snd_seq_get_client_pool(snd_seq_t *seq, snd_seq_client_pool_t *info)
{
if (!seq || !info)
return -EINVAL;
info->client = seq->client;
if (ioctl(seq->fd, SND_SEQ_IOCTL_GET_CLIENT_POOL, info) < 0)
return -errno;
return 0;
}
int snd_seq_set_client_pool(snd_seq_t *seq, snd_seq_client_pool_t *info)
{
if (!seq || !info)
return -EINVAL;
info->client = seq->client;
if (ioctl(seq->fd, SND_SEQ_IOCTL_SET_CLIENT_POOL, info) < 0)
return -errno;
return 0;
}
void snd_seq_set_bit(int nr, void *array) void snd_seq_set_bit(int nr, void *array)
{ {
((unsigned int *)array)[nr >> 5] |= 1UL << (nr & 31); ((unsigned int *)array)[nr >> 5] |= 1UL << (nr & 31);

File diff suppressed because it is too large Load diff