jack: support midi buffers

This commit is contained in:
Wim Taymans 2018-05-24 16:12:59 +02:00
parent 9902886ba5
commit 796c91440e

View file

@ -128,6 +128,16 @@ struct mem {
void *ptr; void *ptr;
}; };
struct midi_buffer {
#define MIDI_BUFFER_MAGIC 0x900df00d
uint32_t magic;
int32_t buffer_size;
uint32_t nframes;
int32_t write_pos;
uint32_t event_count;
uint32_t lost_events;
};
struct buffer { struct buffer {
struct spa_list link; struct spa_list link;
#define BUFFER_FLAG_OUT (1<<0) #define BUFFER_FLAG_OUT (1<<0)
@ -918,6 +928,19 @@ static void client_node_port_set_param(void *object,
pw_client_node_proxy_done(c->node_proxy, seq, 0); pw_client_node_proxy_done(c->node_proxy, seq, 0);
} }
static void init_buffer(struct port *p, struct buffer *b)
{
if (p->object->port.type_id == 1) {
struct midi_buffer *mb = b->datas[0].data;
mb->magic = MIDI_BUFFER_MAGIC;
mb->buffer_size = b->datas[0].maxsize;
mb->nframes = b->datas[0].maxsize / sizeof(float);
mb->write_pos = 0;
mb->event_count = 0;
mb->lost_events = 0;
}
}
static void client_node_port_use_buffers(void *object, static void client_node_port_use_buffers(void *object,
uint32_t seq, uint32_t seq,
enum spa_direction direction, enum spa_direction direction,
@ -1016,12 +1039,14 @@ static void client_node_port_use_buffers(void *object,
d->fd = bm->fd; d->fd = bm->fd;
bm->ref++; bm->ref++;
b->mem[b->n_mem++] = bm->id; b->mem[b->n_mem++] = bm->id;
pw_log_debug(NAME" %p: data %d %u -> fd %d", c, j, bm->id, bm->fd); pw_log_debug(NAME" %p: data %d %u -> fd %d %d",
c, j, bm->id, bm->fd, d->maxsize);
} else if (d->type == t->data.MemPtr) { } else if (d->type == t->data.MemPtr) {
d->data = SPA_MEMBER(b->ptr, d->data = SPA_MEMBER(b->ptr,
b->map.start + SPA_PTR_TO_INT(d->data), void); b->map.start + SPA_PTR_TO_INT(d->data), void);
d->fd = -1; d->fd = -1;
pw_log_debug(NAME" %p: data %d %u -> mem %p", c, j, b->id, d->data); pw_log_debug(NAME" %p: data %d %u -> mem %p %d",
c, j, b->id, d->data, d->maxsize);
} else { } else {
pw_log_warn("unknown buffer data type %d", d->type); pw_log_warn("unknown buffer data type %d", d->type);
} }
@ -1029,9 +1054,13 @@ static void client_node_port_use_buffers(void *object,
pw_log_warn(NAME" %p: Failed to mlock memory %p %u: %m", c, pw_log_warn(NAME" %p: Failed to mlock memory %p %u: %m", c,
d->data, d->maxsize); d->data, d->maxsize);
} }
SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT); SPA_FLAG_SET(b->flags, BUFFER_FLAG_OUT);
if (direction == SPA_DIRECTION_OUTPUT) if (direction == SPA_DIRECTION_OUTPUT) {
init_buffer(p, b);
reuse_buffer(c, mix, b->id); reuse_buffer(c, mix, b->id);
}
} }
pw_log_debug("have %d buffers", n_buffers); pw_log_debug("have %d buffers", n_buffers);
mix->n_buffers = n_buffers; mix->n_buffers = n_buffers;
@ -1940,7 +1969,8 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
if (p->direction == SPA_DIRECTION_INPUT) { if (p->direction == SPA_DIRECTION_INPUT) {
spa_list_for_each(mix, &p->mix, port_link) { spa_list_for_each(mix, &p->mix, port_link) {
pw_log_trace("port %p: mix %d.%d get buffer", p, p->id, mix->id); pw_log_trace("port %p: mix %d.%d get buffer %d",
p, p->id, mix->id, frames);
io = mix->io; io = mix->io;
if (io == NULL || io->buffer_id >= mix->n_buffers) if (io == NULL || io->buffer_id >= mix->n_buffers)
continue; continue;
@ -1954,7 +1984,8 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
} }
} else { } else {
spa_list_for_each(mix, &p->mix, port_link) { spa_list_for_each(mix, &p->mix, port_link) {
pw_log_trace("port %p: mix %d.%d get buffer", p, p->id, mix->id); pw_log_trace("port %p: mix %d.%d get buffer %d",
p, p->id, mix->id, frames);
io = mix->io; io = mix->io;
if (mix->n_buffers == 0 || io == NULL) if (mix->n_buffers == 0 || io == NULL)