mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-16 08:56:45 -05:00
mixer-dsp: handle input offset
Handle the input buffer offset and clamp the size to maxsize.
This commit is contained in:
parent
411b12f59e
commit
e1a50a6c1a
1 changed files with 20 additions and 11 deletions
|
|
@ -690,9 +690,9 @@ static int impl_node_process(void *object)
|
||||||
outio->buffer_id = SPA_ID_INVALID;
|
outio->buffer_id = SPA_ID_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
buffers = alloca(MAX_PORTS * sizeof(struct buffer *));
|
buffers = alloca(MAX_PORTS * sizeof(struct buffer *));
|
||||||
datas = alloca(MAX_PORTS * sizeof(void *));
|
datas = alloca(MAX_PORTS * sizeof(void *));
|
||||||
n_buffers = 0;
|
n_buffers = 0;
|
||||||
|
|
||||||
maxsize = UINT32_MAX;
|
maxsize = UINT32_MAX;
|
||||||
|
|
||||||
|
|
@ -700,6 +700,8 @@ static int impl_node_process(void *object)
|
||||||
struct port *inport = GET_IN_PORT(this, i);
|
struct port *inport = GET_IN_PORT(this, i);
|
||||||
struct spa_io_buffers *inio = NULL;
|
struct spa_io_buffers *inio = NULL;
|
||||||
struct buffer *inb;
|
struct buffer *inb;
|
||||||
|
struct spa_data *bd;
|
||||||
|
uint32_t size, offs;
|
||||||
|
|
||||||
if (SPA_UNLIKELY(!PORT_VALID(inport) ||
|
if (SPA_UNLIKELY(!PORT_VALID(inport) ||
|
||||||
(inio = inport->io) == NULL ||
|
(inio = inport->io) == NULL ||
|
||||||
|
|
@ -715,21 +717,26 @@ static int impl_node_process(void *object)
|
||||||
}
|
}
|
||||||
|
|
||||||
inb = &inport->buffers[inio->buffer_id];
|
inb = &inport->buffers[inio->buffer_id];
|
||||||
maxsize = SPA_MIN(inb->buffer->datas[0].chunk->size, maxsize);
|
bd = &inb->buffer->datas[0];
|
||||||
|
|
||||||
spa_log_trace_fp(this->log, "%p: mix input %d %p->%p %d %d %d", this,
|
offs = SPA_MIN(bd->chunk->offset, bd->maxsize);
|
||||||
i, inio, outio, inio->status, inio->buffer_id, maxsize);
|
size = SPA_MIN(bd->maxsize - offs, bd->chunk->size);
|
||||||
|
maxsize = SPA_MIN(maxsize, size);
|
||||||
|
|
||||||
datas[n_buffers] = inb->buffer->datas[0].data;
|
spa_log_trace_fp(this->log, "%p: mix input %d %p->%p %d %d %d:%d", this,
|
||||||
|
i, inio, outio, inio->status, inio->buffer_id,
|
||||||
|
offs, size);
|
||||||
|
|
||||||
|
datas[n_buffers] = SPA_PTROFF(bd->data, offs, void);
|
||||||
buffers[n_buffers++] = inb;
|
buffers[n_buffers++] = inb;
|
||||||
inio->status = SPA_STATUS_NEED_DATA;
|
inio->status = SPA_STATUS_NEED_DATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
outb = dequeue_buffer(this, outport);
|
outb = dequeue_buffer(this, outport);
|
||||||
if (SPA_UNLIKELY(outb == NULL)) {
|
if (SPA_UNLIKELY(outb == NULL)) {
|
||||||
spa_log_trace(this->log, "%p: out of buffers", this);
|
spa_log_trace(this->log, "%p: out of buffers", this);
|
||||||
return -EPIPE;
|
return -EPIPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n_buffers == 1) {
|
if (n_buffers == 1) {
|
||||||
*outb->buffer = *buffers[0]->buffer;
|
*outb->buffer = *buffers[0]->buffer;
|
||||||
|
|
@ -743,6 +750,8 @@ static int impl_node_process(void *object)
|
||||||
d[0].chunk->size = maxsize;
|
d[0].chunk->size = maxsize;
|
||||||
d[0].chunk->stride = sizeof(float);
|
d[0].chunk->stride = sizeof(float);
|
||||||
|
|
||||||
|
spa_log_trace_fp(this->log, "%p: %d mix %d", this, n_buffers, maxsize);
|
||||||
|
|
||||||
mix_ops_process(&this->ops, d[0].data,
|
mix_ops_process(&this->ops, d[0].data,
|
||||||
datas, n_buffers, maxsize / sizeof(float));
|
datas, n_buffers, maxsize / sizeof(float));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue