mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
alsa-seq: use better clock rate matching
Match the elapsed queue time against the elapsed graph time.
This commit is contained in:
parent
c2c7dd040a
commit
034dd00813
1 changed files with 13 additions and 11 deletions
|
|
@ -700,7 +700,7 @@ static int update_time(struct seq_state *state, uint64_t nsec, bool follower)
|
|||
{
|
||||
snd_seq_queue_status_t *status;
|
||||
const snd_seq_real_time_t* queue_time;
|
||||
uint64_t queue_real, position;
|
||||
uint64_t queue_real, duration;
|
||||
double err, corr;
|
||||
uint64_t clock_elapsed, queue_elapsed;
|
||||
|
||||
|
|
@ -709,27 +709,29 @@ static int update_time(struct seq_state *state, uint64_t nsec, bool follower)
|
|||
state->rate = clock->rate;
|
||||
state->duration = clock->duration;
|
||||
state->threshold = state->duration;
|
||||
position = clock->position;
|
||||
duration = clock->duration;
|
||||
} else {
|
||||
position = 0;
|
||||
duration = 1024;
|
||||
}
|
||||
|
||||
corr = 1.0 - (state->dll.z2 + state->dll.z3);
|
||||
|
||||
/* take queue time */
|
||||
snd_seq_queue_status_alloca(&status);
|
||||
snd_seq_get_queue_status(state->event.hndl, state->event.queue_id, status);
|
||||
queue_time = snd_seq_queue_status_get_real_time(status);
|
||||
queue_real = SPA_TIMESPEC_TO_NSEC(queue_time);
|
||||
|
||||
if (state->queue_base == 0) {
|
||||
state->queue_base = nsec - queue_real;
|
||||
state->clock_base = position;
|
||||
}
|
||||
if (state->queue_base == 0)
|
||||
queue_elapsed = 0;
|
||||
else
|
||||
queue_elapsed = (queue_real - state->queue_base) / corr;
|
||||
|
||||
corr = 1.0 - (state->dll.z2 + state->dll.z3);
|
||||
state->queue_base = queue_real;
|
||||
state->queue_time = queue_real;
|
||||
|
||||
clock_elapsed = position - state->clock_base;
|
||||
state->queue_time = nsec - state->queue_base;
|
||||
queue_elapsed = NSEC_TO_CLOCK(state->clock, state->queue_time) / corr;
|
||||
queue_elapsed = NSEC_TO_CLOCK(state->clock, queue_elapsed);
|
||||
clock_elapsed = duration;
|
||||
|
||||
err = ((int64_t)clock_elapsed - (int64_t) queue_elapsed);
|
||||
err = SPA_CLAMP(err, -64, 64);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue