Defer rather than delete blocks of audio that are too far into the future and check for a valid clock. Silence a few irrelevant debug messages.

This commit is contained in:
Mike Brady
2026-03-02 19:03:58 +00:00
parent 57c3ec9ee4
commit 14c54b3a15
+27 -10
View File
@@ -198,6 +198,8 @@ void *rtp_buffered_audio_processor(void *arg) {
int packets_played_in_this_sequence = 0;
int play_enabled = 0;
int very_early_packets_signalled = 0;
// double requested_lead_time = 0.0; // normal lead time minimum -- maybe it should be about 0.1
// wait until our timing information is valid
@@ -368,7 +370,7 @@ void *rtp_buffered_audio_processor(void *arg) {
} else {
debug(3, "immediate flush of block %u until block %u", seq_no,
debug(4, "immediate flush of block %u until block %u", seq_no,
conn->ap2_immediate_flush_until_sequence_number);
ap2_immediate_flush_requested = 1;
new_audio_block_needed = 1; //
@@ -444,27 +446,37 @@ void *rtp_buffered_audio_processor(void *arg) {
// debug(1,"player buffer size and occupancy: %u and %u", player_buffer_size,
// player_buffer_occupancy);
// If we are playing and there is room in the player buffer, go ahead and decode the block
// If we are playing and there is room in the player buffer, and the block it not too
// early, go ahead and decode the block
// and send it to the player. Otherwise, keep the block and sleep for a while.
if ((play_enabled != 0) &&
(((1.0 * player_buffer_occupancy * conn->frames_per_packet) / conn->input_rate) <=
config.audio_decoded_buffer_desired_length)) {
uint64_t buffer_should_be_time;
frame_to_local_time(timestamp, &buffer_should_be_time, conn);
// calculate if there is room in the decoded audio buffer...
int audio_decoded_buffer_below_desired_length = ((1.0 * player_buffer_occupancy * conn->frames_per_packet) / conn->input_rate) <= config.audio_decoded_buffer_desired_length;
uint64_t buffer_should_be_time;
int have_valid_time = (frame_to_local_time(timestamp, &buffer_should_be_time, conn) == 0);
// calculate the lead time to make sure it's not too early...
int64_t lead_time = buffer_should_be_time - get_absolute_time_in_ns();
if ((play_enabled != 0) && (have_valid_time != 0) &&
(audio_decoded_buffer_below_desired_length != 0) &&
(lead_time * 1E-9 < (config.audio_decoded_buffer_desired_length + 0.1))) {
very_early_packets_signalled = 0; //reset very early packet warning signaller
// try to identify blocks that are timed to before the last buffer, and drop 'em
int64_t time_from_last_buffer_time =
buffer_should_be_time - previous_buffer_should_be_time;
if ((packets_played_in_this_sequence == 0) || (time_from_last_buffer_time > 0)) {
int64_t lead_time = buffer_should_be_time - get_absolute_time_in_ns();
payload_length = 0;
if (ssrc_is_recognised(payload_ssrc) != 0) {
// prepare_decoding_chain(conn, payload_ssrc);
unsigned long long new_payload_length = 0;
payload_pointer = m + leading_free_space_length;
if ((lead_time < (int64_t)30000000000L) &&
(lead_time >= 0)) { // only decipher the packet if it's not too late or too early
if (lead_time >= 0) { // only decipher the packet if it's not too late
int response = -1; // guess that there is a problem
if (conn->session_key != NULL) {
unsigned char nonce[12];
@@ -623,6 +635,11 @@ void *rtp_buffered_audio_processor(void *arg) {
}
new_audio_block_needed = 1; // the block has been used up and is no longer current
} else {
if ((have_valid_time != 0) && (very_early_packets_signalled == 0) && (lead_time * 1E-9 > (config.audio_decoded_buffer_desired_length + 0.2))) {
debug(1, "incoming frame suddenly (?) has a lead time of %f seconds, with a desired decoded buffer length of %f.", 1.0 * lead_time * 1E-9, config.audio_decoded_buffer_desired_length);
very_early_packets_signalled = 1;
}
usleep(20000); // wait for a while
}
}