mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
jack: support midi buffers
This commit is contained in:
parent
9902886ba5
commit
796c91440e
1 changed files with 36 additions and 5 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue