diff --git a/spa/plugins/alsa/alsa-pcm.c b/spa/plugins/alsa/alsa-pcm.c index c7ca41374..d2f4b4a67 100644 --- a/spa/plugins/alsa/alsa-pcm.c +++ b/spa/plugins/alsa/alsa-pcm.c @@ -2532,15 +2532,6 @@ static int get_status(struct state *state, uint64_t current_time, snd_pcm_uframe return 0; } - -static uint64_t get_time_ns(struct state *state) -{ - struct timespec now; - if (spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now) < 0) - return 0; - return SPA_TIMESPEC_TO_NSEC(&now); -} - static int update_time(struct state *state, uint64_t current_time, snd_pcm_sframes_t delay, snd_pcm_sframes_t target, bool follower) { @@ -2548,15 +2539,8 @@ static int update_time(struct state *state, uint64_t current_time, snd_pcm_sfram int32_t diff; if (state->disable_tsched && !follower) { - uint64_t now = get_time_ns(state); - - if (SPA_UNLIKELY(state->dll.bw == 0.0)) { - current_time = now; - err = 0.0; - } else { - err = (int64_t)(now - current_time); - err = err / 1e9 * state->rate; - } + err = (int64_t)(current_time - state->next_time); + err = err / 1e9 * state->rate; } else { if (state->stream == SND_PCM_STREAM_PLAYBACK) err = delay - target; @@ -3183,6 +3167,14 @@ static int capture_ready(struct state *state) return 0; } +static uint64_t get_time_ns(struct state *state) +{ + struct timespec now; + if (spa_system_clock_gettime(state->data_system, CLOCK_MONOTONIC, &now) < 0) + return 0; + return SPA_TIMESPEC_TO_NSEC(&now); +} + static void alsa_wakeup_event(struct spa_source *source) { struct state *state = source->data, *follower; @@ -3194,6 +3186,8 @@ static void alsa_wakeup_event(struct spa_source *source) int err; unsigned short revents; + current_time = get_time_ns(state); + for (int i = 0; i < state->n_fds; i++) { state->pfds[i].revents = state->source[i].rmask; /* Reset so that we only handle all our sources' events once */ @@ -3229,8 +3223,8 @@ static void alsa_wakeup_event(struct spa_source *source) return; } } + current_time = state->next_time; } - current_time = state->next_time; /* first do all the sync */ if (state->stream == SND_PCM_STREAM_CAPTURE)