mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
export-sink: don't block for render
Pass the buffer to the render function in the main thread but don't block the data thread
This commit is contained in:
parent
153bf51ef1
commit
d655d9e0bf
1 changed files with 12 additions and 10 deletions
|
|
@ -493,7 +493,7 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
|
||||||
const void *_data, size_t size, void *user_data)
|
const void *_data, size_t size, void *user_data)
|
||||||
{
|
{
|
||||||
struct data *d = user_data;
|
struct data *d = user_data;
|
||||||
struct spa_buffer *buf;
|
const struct spa_buffer *buf = *(struct spa_buffer**)_data;
|
||||||
uint8_t *map;
|
uint8_t *map;
|
||||||
void *sdata, *ddata;
|
void *sdata, *ddata;
|
||||||
int sstride, dstride, ostride;
|
int sstride, dstride, ostride;
|
||||||
|
|
@ -502,14 +502,6 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
|
||||||
|
|
||||||
handle_events(d);
|
handle_events(d);
|
||||||
|
|
||||||
if (d->io->status != SPA_STATUS_HAVE_BUFFER)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (d->io->buffer_id > d->n_buffers)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
buf = d->buffers[d->io->buffer_id];
|
|
||||||
|
|
||||||
if (buf->datas[0].type == d->t->data.MemFd ||
|
if (buf->datas[0].type == d->t->data.MemFd ||
|
||||||
buf->datas[0].type == d->t->data.DmaBuf) {
|
buf->datas[0].type == d->t->data.DmaBuf) {
|
||||||
map = mmap(NULL, buf->datas[0].maxsize + buf->datas[0].mapoffset, PROT_READ,
|
map = mmap(NULL, buf->datas[0].maxsize + buf->datas[0].mapoffset, PROT_READ,
|
||||||
|
|
@ -550,10 +542,20 @@ static int do_render(struct spa_loop *loop, bool async, uint32_t seq,
|
||||||
static int impl_node_process_input(struct spa_node *node)
|
static int impl_node_process_input(struct spa_node *node)
|
||||||
{
|
{
|
||||||
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
struct data *d = SPA_CONTAINER_OF(node, struct data, impl_node);
|
||||||
|
struct spa_buffer *buf;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
|
if (d->io->status != SPA_STATUS_HAVE_BUFFER)
|
||||||
|
return SPA_STATUS_NEED_BUFFER;
|
||||||
|
|
||||||
|
if (d->io->buffer_id > d->n_buffers)
|
||||||
|
return SPA_STATUS_NEED_BUFFER;
|
||||||
|
|
||||||
|
buf = d->buffers[d->io->buffer_id];
|
||||||
|
|
||||||
if ((res = pw_loop_invoke(pw_main_loop_get_loop(d->loop), do_render,
|
if ((res = pw_loop_invoke(pw_main_loop_get_loop(d->loop), do_render,
|
||||||
SPA_ID_INVALID, NULL, 0, true, d)) < 0)
|
SPA_ID_INVALID, &buf, sizeof(struct spa_buffer *),
|
||||||
|
false, d)) < 0)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
update_param(d);
|
update_param(d);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue