mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-01 22:58:50 -04:00
audiomixer: remove the empty buffer
We don't need the preallocated empty buffer. When we need to produce samples, simply write to the output buffer.
This commit is contained in:
parent
8e3eaf7952
commit
8844c15d4d
2 changed files with 32 additions and 41 deletions
|
|
@ -49,7 +49,6 @@ static struct spa_log_topic *log_topic = &SPA_LOG_TOPIC(0, "spa.audiomixer");
|
|||
#define MAX_BUFFERS 64
|
||||
#define MAX_PORTS 128
|
||||
#define MAX_CHANNELS 64
|
||||
#define MAX_BUFFER_SIZE (MAX_SAMPLES * MAX_CHANNELS * 8)
|
||||
|
||||
#define PORT_DEFAULT_VOLUME 1.0
|
||||
#define PORT_DEFAULT_MUTE false
|
||||
|
|
@ -74,8 +73,6 @@ struct buffer {
|
|||
struct spa_buffer *buffer;
|
||||
struct spa_meta_header *h;
|
||||
struct spa_buffer buf;
|
||||
struct spa_data datas[1];
|
||||
struct spa_chunk chunk[1];
|
||||
};
|
||||
|
||||
struct port {
|
||||
|
|
@ -128,9 +125,6 @@ struct impl {
|
|||
unsigned int started:1;
|
||||
uint32_t stride;
|
||||
uint32_t blocks;
|
||||
|
||||
uint8_t empty[MAX_BUFFER_SIZE];
|
||||
|
||||
};
|
||||
|
||||
#define PORT_VALID(p) ((p) != NULL && (p)->valid)
|
||||
|
|
@ -657,6 +651,7 @@ impl_node_port_use_buffers(void *object,
|
|||
b->flags = 0;
|
||||
b->id = i;
|
||||
b->h = spa_buffer_find_meta_data(buffers[i], SPA_META_Header, sizeof(*b->h));
|
||||
b->buf = *buffers[i];
|
||||
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error(this->log, "%p: invalid memory on buffer %p", this,
|
||||
|
|
@ -725,9 +720,9 @@ static int impl_node_process(void *object)
|
|||
struct impl *this = object;
|
||||
struct port *outport;
|
||||
struct spa_io_buffers *outio;
|
||||
uint32_t n_samples, n_buffers, i, maxsize;
|
||||
uint32_t n_buffers, i, maxsize;
|
||||
struct buffer **buffers;
|
||||
struct buffer *outb;
|
||||
struct buffer *outb;
|
||||
const void **datas;
|
||||
|
||||
spa_return_val_if_fail(this != NULL, -EINVAL);
|
||||
|
|
@ -752,7 +747,7 @@ static int impl_node_process(void *object)
|
|||
datas = alloca(MAX_PORTS * sizeof(void *));
|
||||
n_buffers = 0;
|
||||
|
||||
maxsize = MAX_SAMPLES * this->stride;
|
||||
maxsize = UINT32_MAX;
|
||||
|
||||
for (i = 0; i < this->last_port; i++) {
|
||||
struct port *inport = GET_IN_PORT(this, i);
|
||||
|
|
@ -789,22 +784,22 @@ static int impl_node_process(void *object)
|
|||
return -EPIPE;
|
||||
}
|
||||
|
||||
n_samples = maxsize / this->stride;
|
||||
|
||||
if (n_buffers == 1) {
|
||||
*outb->buffer = *buffers[0]->buffer;
|
||||
}
|
||||
else {
|
||||
outb->buffer->n_datas = 1;
|
||||
outb->buffer->datas = outb->datas;
|
||||
outb->datas[0].data = this->empty;
|
||||
outb->datas[0].chunk = outb->chunk;
|
||||
outb->datas[0].chunk->offset = 0;
|
||||
outb->datas[0].chunk->size = n_samples * this->stride;
|
||||
outb->datas[0].chunk->stride = this->stride;
|
||||
outb->datas[0].maxsize = maxsize;
|
||||
struct spa_data *d = outb->buf.datas;
|
||||
|
||||
mix_ops_process(&this->ops, outb->datas[0].data, datas, n_buffers, n_samples);
|
||||
*outb->buffer = outb->buf;
|
||||
|
||||
maxsize = SPA_MIN(maxsize, d[0].maxsize);
|
||||
|
||||
d[0].chunk->offset = 0;
|
||||
d[0].chunk->size = maxsize;
|
||||
d[0].chunk->stride = this->stride;
|
||||
|
||||
mix_ops_process(&this->ops, d[0].data,
|
||||
datas, n_buffers, maxsize / this->stride);
|
||||
}
|
||||
|
||||
outio->buffer_id = outb->id;
|
||||
|
|
|
|||
|
|
@ -73,8 +73,6 @@ struct buffer {
|
|||
struct spa_buffer *buffer;
|
||||
struct spa_meta_header *h;
|
||||
struct spa_buffer buf;
|
||||
struct spa_data datas[1];
|
||||
struct spa_chunk chunk[1];
|
||||
};
|
||||
|
||||
struct port {
|
||||
|
|
@ -126,8 +124,6 @@ struct impl {
|
|||
|
||||
unsigned int have_format:1;
|
||||
unsigned int started:1;
|
||||
|
||||
float empty[MAX_SAMPLES + MAX_ALIGN];
|
||||
};
|
||||
|
||||
#define PORT_VALID(p) ((p) != NULL && (p)->valid)
|
||||
|
|
@ -601,12 +597,13 @@ impl_node_port_use_buffers(void *object,
|
|||
b->flags = 0;
|
||||
b->id = i;
|
||||
b->h = spa_buffer_find_meta_data(buffers[i], SPA_META_Header, sizeof(*b->h));
|
||||
b->buf = *buffers[i];
|
||||
|
||||
if (d[0].data == NULL) {
|
||||
spa_log_error(this->log, "%p: invalid memory on buffer %d", this, i);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!SPA_IS_ALIGNED(d[0].data, 16)) {
|
||||
if (!SPA_IS_ALIGNED(d[0].data, 32)) {
|
||||
spa_log_warn(this->log, "%p: memory on buffer %d not aligned", this, i);
|
||||
}
|
||||
if (direction == SPA_DIRECTION_OUTPUT)
|
||||
|
|
@ -668,9 +665,9 @@ static int impl_node_process(void *object)
|
|||
struct impl *this = object;
|
||||
struct port *outport;
|
||||
struct spa_io_buffers *outio;
|
||||
uint32_t n_samples, n_buffers, i, maxsize;
|
||||
struct buffer **buffers;
|
||||
struct buffer *outb;
|
||||
uint32_t n_buffers, i, maxsize;
|
||||
struct buffer **buffers;
|
||||
struct buffer *outb;
|
||||
const void **datas;
|
||||
|
||||
spa_return_val_if_fail(this != NULL, -EINVAL);
|
||||
|
|
@ -695,7 +692,7 @@ static int impl_node_process(void *object)
|
|||
datas = alloca(MAX_PORTS * sizeof(void *));
|
||||
n_buffers = 0;
|
||||
|
||||
maxsize = MAX_SAMPLES * sizeof(float);
|
||||
maxsize = UINT32_MAX;
|
||||
|
||||
for (i = 0; i < this->last_port; i++) {
|
||||
struct port *inport = GET_IN_PORT(this, i);
|
||||
|
|
@ -732,21 +729,20 @@ static int impl_node_process(void *object)
|
|||
return -EPIPE;
|
||||
}
|
||||
|
||||
n_samples = maxsize / sizeof(float);
|
||||
|
||||
if (n_buffers == 1) {
|
||||
*outb->buffer = *buffers[0]->buffer;
|
||||
}
|
||||
else {
|
||||
outb->buffer->n_datas = 1;
|
||||
outb->buffer->datas = outb->datas;
|
||||
outb->datas[0].data = SPA_PTR_ALIGN(this->empty, MAX_ALIGN, void);
|
||||
outb->datas[0].chunk = outb->chunk;
|
||||
outb->datas[0].chunk->offset = 0;
|
||||
outb->datas[0].chunk->size = n_samples * sizeof(float);
|
||||
outb->datas[0].chunk->stride = sizeof(float);
|
||||
} else {
|
||||
struct spa_data *d = outb->buf.datas;
|
||||
*outb->buffer = outb->buf;
|
||||
|
||||
mix_ops_process(&this->ops, outb->datas[0].data, datas, n_buffers, n_samples);
|
||||
maxsize = SPA_MIN(maxsize, d[0].maxsize);
|
||||
|
||||
d[0].chunk->offset = 0;
|
||||
d[0].chunk->size = maxsize;
|
||||
d[0].chunk->stride = sizeof(float);
|
||||
|
||||
mix_ops_process(&this->ops, d[0].data,
|
||||
datas, n_buffers, maxsize / sizeof(float));
|
||||
}
|
||||
|
||||
outio->buffer_id = outb->id;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue