mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05: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;
|
snd_seq_queue_status_t *status;
|
||||||
const snd_seq_real_time_t* queue_time;
|
const snd_seq_real_time_t* queue_time;
|
||||||
uint64_t queue_real, position;
|
uint64_t queue_real, duration;
|
||||||
double err, corr;
|
double err, corr;
|
||||||
uint64_t clock_elapsed, queue_elapsed;
|
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->rate = clock->rate;
|
||||||
state->duration = clock->duration;
|
state->duration = clock->duration;
|
||||||
state->threshold = state->duration;
|
state->threshold = state->duration;
|
||||||
position = clock->position;
|
duration = clock->duration;
|
||||||
} else {
|
} else {
|
||||||
position = 0;
|
duration = 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
corr = 1.0 - (state->dll.z2 + state->dll.z3);
|
||||||
|
|
||||||
/* take queue time */
|
/* take queue time */
|
||||||
snd_seq_queue_status_alloca(&status);
|
snd_seq_queue_status_alloca(&status);
|
||||||
snd_seq_get_queue_status(state->event.hndl, state->event.queue_id, 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_time = snd_seq_queue_status_get_real_time(status);
|
||||||
queue_real = SPA_TIMESPEC_TO_NSEC(queue_time);
|
queue_real = SPA_TIMESPEC_TO_NSEC(queue_time);
|
||||||
|
|
||||||
if (state->queue_base == 0) {
|
if (state->queue_base == 0)
|
||||||
state->queue_base = nsec - queue_real;
|
queue_elapsed = 0;
|
||||||
state->clock_base = position;
|
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;
|
queue_elapsed = NSEC_TO_CLOCK(state->clock, queue_elapsed);
|
||||||
state->queue_time = nsec - state->queue_base;
|
clock_elapsed = duration;
|
||||||
queue_elapsed = NSEC_TO_CLOCK(state->clock, state->queue_time) / corr;
|
|
||||||
|
|
||||||
err = ((int64_t)clock_elapsed - (int64_t) queue_elapsed);
|
err = ((int64_t)clock_elapsed - (int64_t) queue_elapsed);
|
||||||
err = SPA_CLAMP(err, -64, 64);
|
err = SPA_CLAMP(err, -64, 64);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue