From f73d640cb84fca07f3622d2fe420c61530f4e51a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Tue, 31 Jul 2018 21:37:41 +0200 Subject: [PATCH] stream: fix read and write index for capture --- src/stream.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/stream.c b/src/stream.c index 25d0f79a7..5f1f5e991 100644 --- a/src/stream.c +++ b/src/stream.c @@ -336,6 +336,7 @@ static void update_timing_info(pa_stream *s) struct pw_time pwt; pa_timing_info *ti = &s->timing_info; size_t stride = pa_frame_size(&s->sample_spec); + uint64_t delay; pw_stream_get_time(s->stream, &pwt); s->timing_info_valid = false; @@ -345,16 +346,22 @@ static void update_timing_info(pa_stream *s) pa_timeval_store(&ti->timestamp, pwt.now / SPA_NSEC_PER_USEC); ti->synchronized_clocks = true; - if (s->direction == PA_STREAM_PLAYBACK) - ti->sink_usec = (-pwt.delay * SPA_USEC_PER_SEC / pwt.rate.num); - else - ti->source_usec = (pwt.delay * SPA_USEC_PER_SEC / pwt.rate.num); ti->transport_usec = 0; ti->playing = 1; ti->write_index_corrupt = false; - ti->write_index = pwt.queued + (pwt.ticks * s->sample_spec.rate / pwt.rate.num) * stride; ti->read_index_corrupt = false; - ti->read_index = ((pwt.ticks + pwt.delay) * s->sample_spec.rate / pwt.rate.num) * stride; + + delay = pwt.delay * SPA_USEC_PER_SEC / pwt.rate.num; + if (s->direction == PA_STREAM_PLAYBACK) { + ti->sink_usec = delay; + ti->write_index = pwt.queued + (pwt.ticks * s->sample_spec.rate / pwt.rate.num) * stride; + ti->read_index = ((pwt.ticks - pwt.delay) * s->sample_spec.rate / pwt.rate.num) * stride; + } + else { + ti->source_usec = delay; + ti->read_index = pwt.queued + (pwt.ticks * s->sample_spec.rate / pwt.rate.num) * stride; + ti->write_index = ((pwt.ticks + pwt.delay) * s->sample_spec.rate / pwt.rate.num) * stride; + } ti->configured_sink_usec = 0; ti->configured_source_usec = 0;