]> git.ipfire.org Git - thirdparty/shairport-sync.git/commitdiff
Restore player.c modifications specific to pa -- not needed now.
authorMike Brady <mikebrady@eircom.net>
Thu, 18 May 2017 09:25:15 +0000 (10:25 +0100)
committerMike Brady <mikebrady@eircom.net>
Thu, 18 May 2017 09:25:15 +0000 (10:25 +0100)
player.c

index 096a2ca66fc01f5b3512f7012c74d26bbb995898..03d8e1a2877e82417fb485ef5b836bb5ec5703c3 100644 (file)
--- a/player.c
+++ b/player.c
@@ -863,12 +863,8 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) {
               conn->first_packet_time_to_play = reference_timestamp_time - delta_fp_sec;
             }
 
-            int64_t initial_filler_size = config.output_rate / 40; // to prevent underrun, start it with this
-            
-            int64_t filler_size = 352;
-            if (have_sent_prefiller_silence==0)
-              filler_size = initial_filler_size;
-              
+            int64_t max_dac_delay = config.output_rate / 10;
+            int64_t filler_size = max_dac_delay; // 0.1 second -- the maximum we'll add to the DAC
 
             if (local_time_now >= conn->first_packet_time_to_play) {
               // we've gone past the time...
@@ -891,14 +887,11 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) {
                   debug(1, "Error %d getting dac_delay in buffer_get_frame.", resp);
                   dac_delay = 0;
                 }
-              } else {
+              } else
                 dac_delay = 0;
-              }
-              //debug(1,"DAC Delay: %d",dac_delay);
               int64_t gross_frame_gap =
                   ((conn->first_packet_time_to_play - local_time_now) * config.output_rate) >> 32;
               int64_t exact_frame_gap = gross_frame_gap - dac_delay;
-              // debug(1,"Gross gap %lld, exact frame gap %lld, dac delay %lld.",gross_frame_gap, exact_frame_gap,dac_delay);
               if (exact_frame_gap < 0) {
                 // we've gone past the time...
                 // debug(1,"Run a bit past the exact start time by %lld frames, with time now of
@@ -911,49 +904,42 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) {
                 conn->first_packet_timestamp = 0;
                 conn->first_packet_time_to_play = 0;
               } else {
-                if (filler_size < 0) {
-                  debug(2, "frame size (filler_size) < 0 with dac_delay of %ld", dac_delay);
-                  filler_size = 0;
+                int64_t fs = filler_size;
+                if (fs > (max_dac_delay - dac_delay))
+                  fs = max_dac_delay - dac_delay;
+                if (fs < 0) {
+                  debug(2, "frame size (fs) < 0 with max_dac_delay of %lld and dac_delay of %ld",
+                        max_dac_delay, dac_delay);
+                  fs = 0;
                 }
-                if ((exact_frame_gap <= filler_size) || (exact_frame_gap <= conn->max_frames_per_packet * 2)) {
-                  filler_size = exact_frame_gap;
-                  // debug(1,"Filler size changed to: %d.",fs);
+                if ((exact_frame_gap <= fs) || (exact_frame_gap <= conn->max_frames_per_packet * 2)) {
+                  fs = exact_frame_gap;
                   // debug(1,"Exact frame gap is %llu; play %d frames of silence. Dac_delay is %d,
                   // with %d packets, ab_read is %04x, ab_write is
                   // %04x.",exact_frame_gap,fs,dac_delay,seq_diff(ab_read,
                   // ab_write),ab_read,ab_write);
                   conn->ab_buffering = 0;
                 }
-                // it doesn't really make much sense to send a prefiller if the back end does not have a delay procedure
-                // because you can't monitor its effect, so you end up doing it blindly.
-//                if (config.output->delay) {
-//                  if (0) {
-                  signed short *silence;
-                  // if (fs==0)
-                  //  debug(2,"Zero length silence buffer needed with gross_frame_gap of %lld and
-                  //  dac_delay of %lld.",gross_frame_gap,dac_delay);
-                  // the fs (number of frames of silence to play) can be zero in the DAC doesn't start
-                  // ouotputting frames for a while -- it could get loaded up but not start responding
-                  // for many milliseconds.
-                  if (filler_size != 0) {
-                    silence = malloc(conn->output_bytes_per_frame * filler_size);
-                    if (silence == NULL)
-                      debug(1, "Failed to allocate %d byte silence buffer.", filler_size);
-                    else {
-                      memset(silence, 0, conn->output_bytes_per_frame * filler_size);
-                      // debug(1,"Frames to start: %llu, DAC delay %ld, buffer: %d packets.",exact_frame_gap,dac_delay,seq_diff(conn->ab_read, conn->ab_write, conn->ab_read));
-
-                      if (config.output->delay) {
-//                      if (0) {
-                        //debug(1, "Sending %d frames of silence",filler_size);
-                        config.output->play(silence, filler_size);
-                      }
-                      free(silence);
-                      have_sent_prefiller_silence = 1;
-                    }
+                signed short *silence;
+                // if (fs==0)
+                //  debug(2,"Zero length silence buffer needed with gross_frame_gap of %lld and
+                //  dac_delay of %lld.",gross_frame_gap,dac_delay);
+                // the fs (number of frames of silence to play) can be zero in the DAC doesn't start
+                // ouotputting frames for a while -- it could get loaded up but not start responding
+                // for many milliseconds.
+                if (fs != 0) {
+                  silence = malloc(conn->output_bytes_per_frame * fs);
+                  if (silence == NULL)
+                    debug(1, "Failed to allocate %d byte silence buffer.", fs);
+                  else {
+                    memset(silence, 0, conn->output_bytes_per_frame * fs);
+                    // debug(1,"Frames to start: %llu, DAC delay %ld, buffer: %d packets.",exact_frame_gap,dac_delay,seq_diff(conn->ab_read, conn->ab_write, conn->ab_read));
+                    config.output->play(silence, fs);
+                    free(silence);
+                    have_sent_prefiller_silence = 1;
                   }
                 }
-//              }
+              }
             }
           }
           if (conn->ab_buffering == 0) {
@@ -962,7 +948,6 @@ static abuf_t *buffer_get_frame(rtsp_conn_info* conn) {
             get_reference_timestamp_stuff(&conn->play_segment_reference_frame, &reference_timestamp_time,
                                           &conn->play_segment_reference_frame_remote_time, conn);
             conn->play_segment_reference_frame *= conn->output_sample_ratio;
-            // debug(1,"Finished waiting");
 #ifdef CONFIG_METADATA
             send_ssnc_metadata('prsm', NULL, 0,
                                0); // "resume", but don't wait if the queue is locked