From: Mike Brady Date: Mon, 7 Jan 2019 16:00:58 +0000 (+0000) Subject: Make buffer size threashold 100 ms instead of 50 ms. Remove some surplus snd_pcm_prep... X-Git-Tag: 3.3RC0~66^2~81 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4613ee6bcbc094e7f3e38f7a70684a017e3fe528;p=thirdparty%2Fshairport-sync.git Make buffer size threashold 100 ms instead of 50 ms. Remove some surplus snd_pcm_prepare calls. --- diff --git a/audio_alsa.c b/audio_alsa.c index ea934719..b1c7ae7c 100644 --- a/audio_alsa.c +++ b/audio_alsa.c @@ -600,14 +600,6 @@ int actual_open_alsa_device(void) { break; } } - - // now open the device - ret = snd_pcm_prepare(alsa_handle); - if (ret) { - warn("alsa: can't prepare device."); - return ret; - } - return 0; } @@ -638,14 +630,14 @@ static int init(int argc, char **argv) { config.audio_backend_latency_offset = 0; config.audio_backend_buffer_desired_length = 0.15; config.audio_backend_buffer_interpolation_threshold_in_seconds = - 0.050; // below this, basic interpolation will be used to save time. + 0.100; // below this, basic interpolation will be used to save time. config.alsa_maximum_stall_time = 0.200; // 200 milliseconds -- if it takes longer, it's a problem - - + stall_monitor_error_threshold = (uint64_t)1000000 * config.alsa_maximum_stall_time; // stall time max to microseconds; stall_monitor_error_threshold = (stall_monitor_error_threshold << 32) / 1000000; // now in fp form - debug(1,"stall_monitor_error_threshold is %" PRIX64 ", with alsa_maximum_stall_time of %f sec.", stall_monitor_error_threshold, config.alsa_maximum_stall_time); + debug(1, "stall_monitor_error_threshold is %" PRIX64 ", with alsa_maximum_stall_time of %f sec.", + stall_monitor_error_threshold, config.alsa_maximum_stall_time); stall_monitor_start_time = 0; stall_monitor_frame_count = 0; @@ -1029,7 +1021,7 @@ int delay_and_status(snd_pcm_state_t *state, snd_pcm_sframes_t *delay) { if ((*state == SND_PCM_STATE_RUNNING) || (*state == SND_PCM_STATE_DRAINING)) { // must be 1.1 or later to use snd_pcm_status_get_driver_htstamp -#if SND_LIB_MINOR==0 +#if SND_LIB_MINOR == 0 snd_pcm_status_get_htstamp(alsa_snd_pcm_status, &update_timestamp); #else snd_pcm_status_get_driver_htstamp(alsa_snd_pcm_status, &update_timestamp); @@ -1052,7 +1044,11 @@ int delay_and_status(snd_pcm_state_t *state, snd_pcm_sframes_t *delay) { if (((update_timestamp_ns - stall_monitor_start_time) > stall_monitor_error_threshold) || ((time_now_ns - stall_monitor_start_time) > stall_monitor_error_threshold)) { - debug(2, "DAC seems to have stalled with time_now_ns: %" PRIX64 ", update_timestamp_ns: %" PRIX64 ", stall_monitor_start_time %" PRIX64 ", stall_monitor_error_threshold %" PRIX64 ".", time_now_ns, update_timestamp_ns, stall_monitor_start_time, stall_monitor_error_threshold); + debug(2, "DAC seems to have stalled with time_now_ns: %" PRIX64 + ", update_timestamp_ns: %" PRIX64 ", stall_monitor_start_time %" PRIX64 + ", stall_monitor_error_threshold %" PRIX64 ".", + time_now_ns, update_timestamp_ns, stall_monitor_start_time, + stall_monitor_error_threshold); ret = sps_extra_code_output_stalled; } } else { @@ -1067,7 +1063,7 @@ int delay_and_status(snd_pcm_state_t *state, snd_pcm_sframes_t *delay) { ((uint64_t)desired_sample_rate * delta) / 1000000000; snd_pcm_sframes_t frames_played_since_last_interrupt_sized = frames_played_since_last_interrupt; - + *delay = *delay - frames_played_since_last_interrupt_sized; } } else { // not running, thus no delay information, thus can't check for stall @@ -1080,7 +1076,7 @@ int delay_and_status(snd_pcm_state_t *state, snd_pcm_sframes_t *delay) { measurement_data_is_valid = 0; } } else { - debug(1,"alsa: can't get device's status."); + debug(1, "alsa: can't get device's status."); } return ret; } @@ -1198,36 +1194,30 @@ int untimed_play(void *buf, int samples) { } } } else { + debug(1, "alsa: error %d writing %d samples to alsa device.", ret, samples); frame_index = 0; measurement_data_is_valid = 0; if (ret == -EPIPE) { /* underrun */ ret = snd_pcm_recover(alsa_handle, ret, debuglev > 0 ? 1 : 0); if (ret < 0) { - debug(1, "alsa: failed to recover from SND_PCM_STATE_XRUN with snd_pcm_recover(); " - "trying snd_pcm_prepare()."); - ret = snd_pcm_prepare(alsa_handle); - if (ret < 0) - warn("alsa: can't recover from SND_PCM_STATE_XRUN, snd_pcm_recover() and " - "snd_pcm_prepare() failed: %s.", - snd_strerror(ret)); + warn("alsa: can't recover from SND_PCM_STATE_XRUN: %s.", snd_strerror(ret)); } } else if (ret == -ESTRPIPE) { /* suspended */ while ((ret = snd_pcm_resume(alsa_handle)) == -EAGAIN) { sleep(1); /* wait until the suspend flag is released */ if (ret < 0) { - ret = snd_pcm_prepare(alsa_handle); - if (ret < 0) - warn("alsa: can't recover from SND_PCM_STATE_SUSPENDED state, snd_pcm_prepare() " - "failed: %s.", - snd_strerror(ret)); + warn("alsa: can't recover from SND_PCM_STATE_SUSPENDED state, snd_pcm_prepare() " + "failed: %s.", + snd_strerror(ret)); } } } } } } else { - debug(1, "alsa: device status returns fault status %d and SND_PCM_STATE_* %d for play.", ret, state); + debug(1, "alsa: device status returns fault status %d and SND_PCM_STATE_* %d for play.", ret, + state); frame_index = 0; measurement_data_is_valid = 0; } @@ -1284,7 +1274,6 @@ int delay(long *the_delay) { return untimed_delay(the_delay); } - static void stop(void) { // debug(2,"audio_alsa stop called."); // when we want to stop, we want the alsa device @@ -1507,7 +1496,7 @@ void *alsa_buffer_monitor_thread_code(void *arg) { } } else { // debug(2,"Skipping sending silence"); - } + } } usleep(sleep_time_ms * 1000); // has a cancellation point in it // pthread_testcancel();