jack: zero empty buffer when needed

This commit is contained in:
Wim Taymans 2018-08-01 11:56:04 +02:00
parent d608819a33
commit 9255315c6a

View file

@ -192,6 +192,7 @@ struct port {
bool have_format; bool have_format;
uint32_t rate; uint32_t rate;
bool zeroed;
float empty[BUFFER_SIZE_MAX + 8]; float empty[BUFFER_SIZE_MAX + 8];
}; };
@ -2111,14 +2112,13 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
struct spa_io_buffers *io; struct spa_io_buffers *io;
struct mix *mix; struct mix *mix;
int layer = 0; int layer = 0;
void *ptr; void *ptr = NULL;
if (o->type != c->context.t->port || o->port.port_id == SPA_ID_INVALID) { if (o->type != c->context.t->port || o->port.port_id == SPA_ID_INVALID) {
pw_log_error("client %p: invalid port %p", c, port); pw_log_error("client %p: invalid port %p", c, port);
return NULL; return NULL;
} }
p = GET_PORT(c, GET_DIRECTION(o->port.flags), o->port.port_id); p = GET_PORT(c, GET_DIRECTION(o->port.flags), o->port.port_id);
ptr = p->empty;
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) {
@ -2135,6 +2135,7 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
else { else {
add_f32(p->empty, ptr, b->datas[0].data, frames); add_f32(p->empty, ptr, b->datas[0].data, frames);
ptr = p->empty; ptr = p->empty;
p->zeroed = false;
} }
} }
} else { } else {
@ -2172,6 +2173,13 @@ void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t frames)
} }
done: done:
if (ptr == NULL) {
ptr = p->empty;
if (!p->zeroed) {
memset(ptr, 0, sizeof(p->empty));
p->zeroed = true;
}
}
pw_log_trace("port %p: buffer %p", p, ptr); pw_log_trace("port %p: buffer %p", p, ptr);
return ptr; return ptr;
} }