mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-09-20 00:11:31 +00:00
resample: recalc rate match when out of buffers
When we don't have any input buffers, recalculate the rate match size field so that we can know the size of the expected buffer. We already do this when starting but it might have been done with a different quantum.
This commit is contained in:
parent
a8139b7acf
commit
10e71264e7
|
@ -271,6 +271,15 @@ static void update_rate_match(struct impl *this, bool passthrough, uint32_t out_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void recalc_rate_match(struct impl *this)
|
||||||
|
{
|
||||||
|
bool passthrough = this->resample.i_rate == this->resample.o_rate &&
|
||||||
|
(this->io_rate_match == NULL ||
|
||||||
|
!SPA_FLAG_IS_SET(this->io_rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE));
|
||||||
|
uint32_t out_size = this->io_position ? this->io_position->clock.duration : 1024;
|
||||||
|
update_rate_match(this, passthrough, out_size, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void reset_node(struct impl *this)
|
static void reset_node(struct impl *this)
|
||||||
{
|
{
|
||||||
struct port *outport, *inport;
|
struct port *outport, *inport;
|
||||||
|
@ -292,15 +301,9 @@ static int impl_node_send_command(void *object, const struct spa_command *comman
|
||||||
|
|
||||||
switch (SPA_NODE_COMMAND_ID(command)) {
|
switch (SPA_NODE_COMMAND_ID(command)) {
|
||||||
case SPA_NODE_COMMAND_Start:
|
case SPA_NODE_COMMAND_Start:
|
||||||
{
|
recalc_rate_match(this);
|
||||||
bool passthrough = this->resample.i_rate == this->resample.o_rate &&
|
|
||||||
(this->io_rate_match == NULL ||
|
|
||||||
!SPA_FLAG_IS_SET(this->io_rate_match->flags, SPA_IO_RATE_MATCH_FLAG_ACTIVE));
|
|
||||||
uint32_t out_size = this->io_position ? this->io_position->clock.duration : 1024;
|
|
||||||
this->started = true;
|
this->started = true;
|
||||||
update_rate_match(this, passthrough, out_size, 0);
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case SPA_NODE_COMMAND_Suspend:
|
case SPA_NODE_COMMAND_Suspend:
|
||||||
case SPA_NODE_COMMAND_Flush:
|
case SPA_NODE_COMMAND_Flush:
|
||||||
reset_node(this);
|
reset_node(this);
|
||||||
|
@ -814,9 +817,10 @@ static int impl_node_process(void *object)
|
||||||
outio->buffer_id = SPA_ID_INVALID;
|
outio->buffer_id = SPA_ID_INVALID;
|
||||||
}
|
}
|
||||||
if (SPA_UNLIKELY(inio->status != SPA_STATUS_HAVE_DATA)) {
|
if (SPA_UNLIKELY(inio->status != SPA_STATUS_HAVE_DATA)) {
|
||||||
if (inio->status != SPA_STATUS_DRAINED || this->drained)
|
if (inio->status != SPA_STATUS_DRAINED || this->drained) {
|
||||||
|
recalc_rate_match(this);
|
||||||
return outio->status = inio->status;
|
return outio->status = inio->status;
|
||||||
|
}
|
||||||
inio->buffer_id = 0;
|
inio->buffer_id = 0;
|
||||||
inport->buffers[0].outbuf->datas[0].chunk->size = 0;
|
inport->buffers[0].outbuf->datas[0].chunk->size = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue