diff options
| author | Lennart Poettering <lennart@poettering.net> | 2009-11-20 19:55:47 +0100 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2009-11-20 19:55:47 +0100 | 
| commit | ba95b1939d581bc6f647616bd12bd673370f3be5 (patch) | |
| tree | ed27ca7bfdd0b12cf0ed238ea84c89d7ff2e9843 | |
| parent | f05ae357b6dee91b4d80c1c09bcf2bbf1a8802fa (diff) | |
pulse: ask for timing updates both *before* and *after* triggering a stream state change so that in the STARTED/UNDERFLOW callbacks we accurate transport latency information
| -rw-r--r-- | src/pulse/stream.c | 38 | 
1 files changed, 36 insertions, 2 deletions
| diff --git a/src/pulse/stream.c b/src/pulse/stream.c index 4a44c31a..4dea5670 100644 --- a/src/pulse/stream.c +++ b/src/pulse/stream.c @@ -1482,6 +1482,11 @@ pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *us      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE); +    /* Ask for a timing update before we cork/uncork to get the best +     * accuracy for the transport latency suitable for the +     * check_smoother_status() call in the started callback */ +    request_auto_timing_update(s, TRUE); +      o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);      t = pa_tagstruct_command(s->context, PA_COMMAND_DRAIN_PLAYBACK_STREAM, &tag); @@ -1489,6 +1494,10 @@ pa_operation * pa_stream_drain(pa_stream *s, pa_stream_success_cb_t cb, void *us      pa_pstream_send_tagstruct(s->context->pstream, t);      pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_stream_simple_ack_callback, pa_operation_ref(o), (pa_free_cb_t) pa_operation_unref); +    /* This might cause the read index to conitnue again, hence +     * let's request a timing update */ +    request_auto_timing_update(s, TRUE); +      return o;  } @@ -2037,6 +2046,11 @@ pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, voi      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); +    /* Ask for a timing update before we cork/uncork to get the best +     * accuracy for the transport latency suitable for the +     * check_smoother_status() call in the started callback */ +    request_auto_timing_update(s, TRUE); +      s->corked = b;      o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata); @@ -2052,8 +2066,8 @@ pa_operation* pa_stream_cork(pa_stream *s, int b, pa_stream_success_cb_t cb, voi      check_smoother_status(s, FALSE, FALSE, FALSE); -    /* This might cause the indexes to hang/start again, hence -     * let's request a timing update */ +    /* This might cause the indexes to hang/start again, hence let's +     * request a timing update, after the cork/uncork, too */      request_auto_timing_update(s, TRUE);      return o; @@ -2090,6 +2104,11 @@ pa_operation* pa_stream_flush(pa_stream *s, pa_stream_success_cb_t cb, void *use      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->state == PA_STREAM_READY, PA_ERR_BADSTATE);      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE); +    /* Ask for a timing update *before* the flush, so that the +     * transport usec is as up to date as possible when we get the +     * underflow message and update the smoother status*/ +    request_auto_timing_update(s, TRUE); +      if (!(o = stream_send_simple_command(s, (uint32_t) (s->direction == PA_STREAM_PLAYBACK ? PA_COMMAND_FLUSH_PLAYBACK_STREAM : PA_COMMAND_FLUSH_RECORD_STREAM), cb, userdata)))          return NULL; @@ -2124,6 +2143,11 @@ pa_operation* pa_stream_prebuf(pa_stream *s, pa_stream_success_cb_t cb, void *us      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE);      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE); +    /* Ask for a timing update before we cork/uncork to get the best +     * accuracy for the transport latency suitable for the +     * check_smoother_status() call in the started callback */ +    request_auto_timing_update(s, TRUE); +      if (!(o = stream_send_simple_command(s, PA_COMMAND_PREBUF_PLAYBACK_STREAM, cb, userdata)))          return NULL; @@ -2145,6 +2169,11 @@ pa_operation* pa_stream_trigger(pa_stream *s, pa_stream_success_cb_t cb, void *u      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction == PA_STREAM_PLAYBACK, PA_ERR_BADSTATE);      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->buffer_attr.prebuf > 0, PA_ERR_BADSTATE); +    /* Ask for a timing update before we cork/uncork to get the best +     * accuracy for the transport latency suitable for the +     * check_smoother_status() call in the started callback */ +    request_auto_timing_update(s, TRUE); +      if (!(o = stream_send_simple_command(s, PA_COMMAND_TRIGGER_PLAYBACK_STREAM, cb, userdata)))          return NULL; @@ -2396,6 +2425,11 @@ pa_operation* pa_stream_set_buffer_attr(pa_stream *s, const pa_buffer_attr *attr      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->direction != PA_STREAM_UPLOAD, PA_ERR_BADSTATE);      PA_CHECK_VALIDITY_RETURN_NULL(s->context, s->context->version >= 12, PA_ERR_NOTSUPPORTED); +    /* Ask for a timing update before we cork/uncork to get the best +     * accuracy for the transport latency suitable for the +     * check_smoother_status() call in the started callback */ +    request_auto_timing_update(s, TRUE); +      o = pa_operation_new(s->context, s, (pa_operation_cb_t) cb, userdata);      t = pa_tagstruct_command( | 
