stream: fix read and write index for capture

This commit is contained in:
Wim Taymans 2018-07-31 21:37:41 +02:00
parent 6eb6e31beb
commit f73d640cb8

View file

@ -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;