(abs_delta << 32) / config.output_rate; // int64_t which is positive
conn->first_packet_time_to_play = reference_timestamp_time - delta_fp_sec;
}
-
- int64_t max_dac_delay = config.output_rate / 10;
+
+ // now, the size of the initial silence must be affected by the lead-in time.
+ // it must be somewhat less than the lead-in time so that dynamic adjustments can be made
+ // to compensate for delays due to paging, etc.
+ // The suggestion is that it should be at least 100 ms less than the lead-in time.
+
+ int64_t max_dac_delay = config.output_rate / 10; // so the lead-in time must be greater than this, say 0.2 sec, to allow for dynamic adjustment
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) {
// do some calculations
int64_t lead_time = conn->first_packet_time_to_play-local_time_now;
int64_t lead_in_time = (int64_t)(config.audio_backend_silent_lead_in_time*(int64_t)0x100000000);
- //debug(1,"Lead in time is %llx.",lead_in_time);
- // an audio_backend_silent_lead_in_time of less than zero means start filling ASAP
+ // debug(1,"Lead time is %llx at fpttp %llx.",lead_time,conn->first_packet_time_to_play);
+ // an audio_backend_silent_lead_in_time of less than zero means start filling ASAP
if ((lead_in_time<0) || (lead_time<=lead_in_time)) {
- // debug(1,"Continuing...");
+ // debug(1,"Checking");
if (config.output->delay) {
// conn->first_packet_time_to_play is definitely later than local_time_now
if (have_sent_prefiller_silence != 0) {
int resp = config.output->delay(&dac_delay);
+
if (resp != 0) {
debug(1, "Error %d getting dac_delay in buffer_get_frame.", resp);
dac_delay = 0;
int64_t exact_frame_gap = gross_frame_gap - dac_delay;
if (exact_frame_gap < 0) {
// we've gone past the time...
+ // debug(1,"Run past time.");
// debug(1,"Run a bit past the exact start time by %lld frames, with time now of
// %llx, fpttp of %llx and dac_delay of %d and %d packets;
// flush.",-exact_frame_gap,tn,conn->first_packet_time_to_play,dac_delay,seq_diff(ab_read,
// 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) {
+ 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));
+ // debug(1,"Frames to start: %llu, DAC delay %d, 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;
}
}
+ have_sent_prefiller_silence = 1; // even if we haven't sent silence because it's zero frames long...
}
} else {
//no delay function on back end -- just send the prefiller silence
time_to_wait_for_wakeup_fp *= 4 * 352; // four full 352-frame packets
time_to_wait_for_wakeup_fp /= 3; // four thirds of a packet time
+
#ifdef COMPILE_FOR_LINUX_AND_FREEBSD_AND_CYGWIN
uint64_t time_of_wakeup_fp = local_time_now + time_to_wait_for_wakeup_fp;
uint64_t sec = time_of_wakeup_fp >> 32;
struct timespec time_of_wakeup;
time_of_wakeup.tv_sec = sec;
time_of_wakeup.tv_nsec = nsec;
-
pthread_cond_timedwait(&conn->flowcontrol, &conn->ab_mutex, &time_of_wakeup);
// int rc = pthread_cond_timedwait(&flowcontrol,&ab_mutex,&time_of_wakeup);
// if (rc!=0)