alsa: clean up rate matching code

Remove some useless fields.
Use macros for time<->rate conversions.
This commit is contained in:
Wim Taymans 2021-09-06 12:55:06 +02:00
parent 8d741d6077
commit c54f64cd13
2 changed files with 15 additions and 19 deletions

View file

@ -498,6 +498,9 @@ static int process_recycle(struct seq_state *state)
return 0; return 0;
} }
#define NSEC_TO_CLOCK(r,n) (((n) * (r)->denom) / ((r)->num * SPA_NSEC_PER_SEC))
#define NSEC_FROM_CLOCK(r,n) (((n) * (r)->num * SPA_NSEC_PER_SEC) / (r)->denom)
static int process_read(struct seq_state *state) static int process_read(struct seq_state *state)
{ {
snd_seq_event_t *ev; snd_seq_event_t *ev;
@ -551,7 +554,7 @@ static int process_read(struct seq_state *state)
diff = 0; diff = 0;
/* convert the age to samples and convert to an offset */ /* convert the age to samples and convert to an offset */
offset = (diff * state->rate.denom) / (state->rate.num * SPA_NSEC_PER_SEC); offset = NSEC_TO_CLOCK(&state->rate, diff);
if (state->duration > offset) if (state->duration > offset)
offset = state->duration - 1 - offset; offset = state->duration - 1 - offset;
else else
@ -673,8 +676,7 @@ static int process_write(struct seq_state *state)
snd_seq_ev_set_source(&ev, state->event.addr.port); snd_seq_ev_set_source(&ev, state->event.addr.port);
snd_seq_ev_set_dest(&ev, port->addr.client, port->addr.port); snd_seq_ev_set_dest(&ev, port->addr.client, port->addr.port);
out_time = state->queue_time + out_time = state->queue_time + NSEC_FROM_CLOCK(&state->rate, c->offset);
(c->offset * state->rate.num * SPA_NSEC_PER_SEC) / state->rate.denom;
out_rt.tv_nsec = out_time % SPA_NSEC_PER_SEC; out_rt.tv_nsec = out_time % SPA_NSEC_PER_SEC;
out_rt.tv_sec = out_time / SPA_NSEC_PER_SEC; out_rt.tv_sec = out_time / SPA_NSEC_PER_SEC;
@ -694,25 +696,23 @@ static int process_write(struct seq_state *state)
return res; return res;
} }
#define NSEC_TO_CLOCK(c,n) ((n) * (c)->rate.denom / ((c)->rate.num * SPA_NSEC_PER_SEC))
static int update_time(struct seq_state *state, uint64_t nsec, bool follower) 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, duration; uint64_t queue_real;
double err, corr; double err, corr;
uint64_t clock_elapsed, queue_elapsed; uint64_t queue_elapsed;
if (state->position) { if (state->position) {
struct spa_io_clock *clock = &state->position->clock; struct spa_io_clock *clock = &state->position->clock;
state->rate = clock->rate; state->rate = clock->rate;
state->duration = clock->duration; state->duration = clock->duration;
state->threshold = state->duration;
duration = clock->duration;
} else { } else {
duration = 1024; state->rate = SPA_FRACTION(1, 48000);
state->duration = 1024;
} }
state->threshold = state->duration;
corr = 1.0 - (state->dll.z2 + state->dll.z3); corr = 1.0 - (state->dll.z2 + state->dll.z3);
@ -722,18 +722,16 @@ static int update_time(struct seq_state *state, uint64_t nsec, bool follower)
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_time == 0)
queue_elapsed = 0; queue_elapsed = 0;
else else
queue_elapsed = (queue_real - state->queue_base) / corr; queue_elapsed = (queue_real - state->queue_time) / corr;
state->queue_base = queue_real;
state->queue_time = queue_real; state->queue_time = queue_real;
queue_elapsed = NSEC_TO_CLOCK(state->clock, queue_elapsed); queue_elapsed = NSEC_TO_CLOCK(&state->rate, queue_elapsed);
clock_elapsed = duration;
err = ((int64_t)clock_elapsed - (int64_t) queue_elapsed); err = ((int64_t)state->threshold - (int64_t) queue_elapsed);
err = SPA_CLAMP(err, -64, 64); err = SPA_CLAMP(err, -64, 64);
if (state->dll.bw == 0.0) { if (state->dll.bw == 0.0) {
@ -896,7 +894,7 @@ int spa_alsa_seq_start(struct seq_state *state)
state->source.rmask = 0; state->source.rmask = 0;
spa_loop_add_source(state->data_loop, &state->source); spa_loop_add_source(state->data_loop, &state->source);
state->queue_base = 0; state->queue_time = 0;
spa_dll_init(&state->dll); spa_dll_init(&state->dll);
set_timers(state); set_timers(state);

View file

@ -159,8 +159,6 @@ struct seq_state {
uint64_t next_time; uint64_t next_time;
uint64_t base_time; uint64_t base_time;
uint64_t queue_time; uint64_t queue_time;
uint64_t queue_base;
uint64_t clock_base;
unsigned int opened:1; unsigned int opened:1;
unsigned int started:1; unsigned int started:1;