diff --git a/audio_alsa.c b/audio_alsa.c index a5b7659c..f70ce9a6 100644 --- a/audio_alsa.c +++ b/audio_alsa.c @@ -187,6 +187,19 @@ static int init(int argc, char **argv) { } } + /* Get the desired length of the period of silence before the audio starts. */ + if (config_lookup_float(config.cfg, "alsa.audio_backend_silent_lead_in_time", + &dvalue)) { + if ((dvalue < 0.05) || (dvalue > 4)) { + pthread_mutex_unlock(&alsa_mutex); + die("Invalid alsa audio_backend_silent_lead_in_time \"%f\". It " + "must be between 0.050 and 4.0 seconds. Omit setting to use the default value, which is approximately the latency specified by the source (typically 2 seconds). A value greater than the latency is ignored.", + dvalue); + } else { + config.audio_backend_silent_lead_in_time = dvalue; + } + } + /* Get the desired buffer size setting. */ if (config_lookup_float(config.cfg, "alsa.audio_backend_buffer_desired_length_in_seconds", &dvalue)) { diff --git a/audio_ao.c b/audio_ao.c index 299a8a20..03aac687 100644 --- a/audio_ao.c +++ b/audio_ao.c @@ -54,6 +54,19 @@ static int init(int argc, char **argv) { // get settings from settings file first, allow them to be overridden by command line options if (config.cfg != NULL) { + /* Get the desired length of the period of silence before the audio starts. */ + if (config_lookup_float(config.cfg, "ao.audio_backend_silent_lead_in_time", + &dvalue)) { + if ((dvalue < 0.05) || (dvalue > 4)) { + pthread_mutex_unlock(&alsa_mutex); + die("Invalid ao audio_backend_silent_lead_in_time \"%f\". It " + "must be between 0.050 and 4.0 seconds. Omit setting to use the default value, which is approximately the latency specified by the source (typically 2 seconds). A value greater than the latency is ignored.", + dvalue); + } else { + config.audio_backend_silent_lead_in_time = dvalue; + } + } + /* Get the desired buffer size setting. */ if (config_lookup_int(config.cfg, "ao.audio_backend_buffer_desired_length", &value)) { if ((value < 0) || (value > 66150)) { diff --git a/audio_pa.c b/audio_pa.c index 7bb09686..5a75e6b8 100644 --- a/audio_pa.c +++ b/audio_pa.c @@ -52,6 +52,17 @@ static int init(int argc, char **argv) { if (config.cfg != NULL) { const char *str; double dvalue; + /* Get the desired length of the period of silence before the audio starts. */ + if (config_lookup_float(config.cfg, "pa.audio_backend_silent_lead_in_time", + &dvalue)) { + if ((dvalue < 0.05) || (dvalue > 4)) { + die("Invalid pa audio_backend_silent_lead_in_time \"%f\". It " + "must be between 0.050 and 4.0 seconds. Omit setting to use the default value, which is approximately the latency specified by the source (typically 2 seconds). A value greater than the latency is ignored.", + dvalue); + } else { + config.audio_backend_silent_lead_in_time = dvalue; + } + } /* Get the desired buffer size setting. */ if (config_lookup_float(config.cfg, "pa.audio_backend_buffer_desired_length_in_seconds", diff --git a/audio_pipe.c b/audio_pipe.c index 9b7d75c7..a27ca65f 100644 --- a/audio_pipe.c +++ b/audio_pipe.c @@ -95,6 +95,18 @@ static int init(int argc, char **argv) { if (config_lookup_string(config.cfg, "pipe.name", &str)) { pipename = (char *)str; } + + /* Get the desired length of the period of silence before the audio starts. */ + if (config_lookup_float(config.cfg, "pipe.audio_backend_silent_lead_in_time", + &dvalue)) { + if ((dvalue < 0.05) || (dvalue > 4)) { + die("Invalid pipe audio_backend_silent_lead_in_time \"%f\". It " + "must be between 0.050 and 4.0 seconds. Omit setting to use the default value, which is approximately the latency specified by the source (typically 2 seconds). A value greater than the latency is ignored.", + dvalue); + } else { + config.audio_backend_silent_lead_in_time = dvalue; + } + } if ((pipename) && (strcasecmp(pipename, "STDOUT") == 0)) die("Can't use \"pipe\" backend for STDOUT. Use the \"stdout\" backend instead."); diff --git a/audio_stdout.c b/audio_stdout.c index ee4a81b3..33d3f339 100644 --- a/audio_stdout.c +++ b/audio_stdout.c @@ -64,6 +64,18 @@ static int init(int argc, char **argv) { config.audio_backend_latency_offset = 0; if (config.cfg != NULL) { + /* Get the desired length of the period of silence before the audio starts. */ + if (config_lookup_float(config.cfg, "stdout.audio_backend_silent_lead_in_time", + &dvalue)) { + if ((dvalue < 0.05) || (dvalue > 4)) { + die("Invalid stdout audio_backend_silent_lead_in_time \"%f\". It " + "must be between 0.050 and 4.0 seconds. Omit setting to use the default value, which is approximately the latency specified by the source (typically 2 seconds). A value greater than the latency is ignored.", + dvalue); + } else { + config.audio_backend_silent_lead_in_time = dvalue; + } + } + /* Get the desired buffer size setting. */ if (config_lookup_int(config.cfg, "stdout.audio_backend_buffer_desired_length", &value)) { if ((value < 0) || (value > 66150)) { diff --git a/shairport.c b/shairport.c index b3133274..8226083b 100644 --- a/shairport.c +++ b/shairport.c @@ -1316,6 +1316,7 @@ int main(int argc, char **argv) { debug(1, "audio backend desired buffer length is %f seconds.", config.audio_backend_buffer_desired_length); debug(1, "audio backend latency offset is %f seconds.", config.audio_backend_latency_offset); + debug(1, "audio backend silence lead-in time is %f seconds. The value -1.0 means use the default.", config.audio_backend_silent_lead_in_time); debug(1, "volume range in dB (zero means use the range specified by the mixer): %u.", config.volume_range_db); debug(1, "zeroconf regtype is \"%s\".", config.regtype);