From: Mike Brady Date: Wed, 15 Mar 2017 21:19:31 +0000 (+0000) Subject: Fix audio backend latency offset calculations X-Git-Tag: 3.1.s5~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=43fdb12aca4da0f628cf10e9a8dfc208107a9bba;p=thirdparty%2Fshairport-sync.git Fix audio backend latency offset calculations --- diff --git a/player.c b/player.c index 8dba9bc8..e052a816 100644 --- a/player.c +++ b/player.c @@ -820,7 +820,7 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) { int64_t delta = (conn->first_packet_timestamp - reference_timestamp) + config.latency * conn->output_sample_ratio + - config.audio_backend_latency_offset * config.output_rate; + (int64_t)(config.audio_backend_latency_offset * config.output_rate); if (delta >= 0) { int64_t delta_fp_sec = @@ -846,7 +846,7 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) { // recalculate conn->first_packet_time_to_play -- the latency might change int64_t delta = (conn->first_packet_timestamp - reference_timestamp) + config.latency * conn->output_sample_ratio + - config.audio_backend_latency_offset * config.output_rate; + (int64_t)(config.audio_backend_latency_offset * config.output_rate); if (delta >= 0) { int64_t delta_fp_sec = @@ -980,7 +980,7 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) { int64_t delta = packet_timestamp - reference_timestamp; int64_t offset = config.latency * conn->output_sample_ratio + - config.audio_backend_latency_offset * config.output_rate - + (int64_t)(config.audio_backend_latency_offset * config.output_rate) - config.audio_backend_buffer_desired_length * config.output_rate; // all arguments are int32_t, so expression promotion okay int64_t net_offset = delta + offset; // okay @@ -1347,7 +1347,7 @@ static void *player_thread_func(void *arg) { // check that there are enough buffers to accommodate the desired latency and the latency offset - int maximum_latency = config.latency + config.audio_backend_latency_offset * conn->input_rate; + int maximum_latency = config.latency + (int64_t)(config.audio_backend_latency_offset * config.output_rate); if ((maximum_latency + (352 - 1)) / 352 + 10 > BUFFER_FRAMES) die("Not enough buffers available for a total latency of %d frames. A maximum of %d 352-frame " "packets may be accommodated.", @@ -1699,7 +1699,7 @@ static void *player_thread_func(void *arg) { // This is the timing error for the next audio frame in the DAC. sync_error = delay - - config.latency * conn->output_sample_ratio; // int64_t from int64_t - int32_t, so okay + (config.latency * conn->output_sample_ratio + (int64_t)(config.audio_backend_latency_offset * config.output_rate)); // int64_t from int64_t - int32_t, so okay // if (llabs(sync_error)>352*512) // debug(1,"Very large sync error: %lld",sync_error);