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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user