From: Mike Brady Date: Wed, 30 Jan 2019 17:43:15 +0000 (+0000) Subject: Make it work with deferred initialisation of the alsa device -- deferred to first... X-Git-Tag: 3.3RC0~66^2~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fd08511f1f41c06a8fe0d230d666cd17227ef030;p=thirdparty%2Fshairport-sync.git Make it work with deferred initialisation of the alsa device -- deferred to first use. Investigate hardware mute again. --- diff --git a/audio_alsa.c b/audio_alsa.c index 0b94e812..ca636708 100644 --- a/audio_alsa.c +++ b/audio_alsa.c @@ -977,10 +977,8 @@ static int init(int argc, char **argv) { } debug(1, "alsa: output device name is \"%s\".", alsa_out_dev); - - do_alsa_device_init_if_needed(); - - alsa_mix_handle = NULL; + + alsa_mix_handle = NULL; // indicates alsa handle isn't open // so, now, if the option to keep the DAC running has been selected, start a thread to monitor the // length of the queue @@ -1297,6 +1295,7 @@ int play(void *buf, int samples) { if (alsa_backend_state != abm_playing) { debug(2, "alsa: play() -- alsa_backend_state => abm_playing"); alsa_backend_state = abm_playing; + do_mute(0); } ret = do_play(buf, samples); } @@ -1399,6 +1398,7 @@ static void linear_volume(double vol) { */ int mute(int mute_state_requested) { + debug(1,"alsa: mute(%d)",mute_state_requested); int response = 0; if (config.alsa_use_hardware_mute == 1) response = 1; // return true if actually using the mute facility @@ -1413,7 +1413,7 @@ int mute(int mute_state_requested) { } void do_mute(int mute_state_requested) { - debug(3, "Setting mute to %d.", mute_state_requested); + debug(1, "alsa: do_mute(%d).", mute_state_requested); int oldState; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &oldState); // make this un-cancellable @@ -1468,13 +1468,13 @@ void alsa_buffer_monitor_thread_cleanup_function(__attribute__((unused)) void *a void *alsa_buffer_monitor_thread_code(__attribute__((unused)) void *arg) { while (1) { - int sleep_time_ms = (int)(config.audio_backend_silence_scan_interval * 1000); - pthread_cleanup_debug_mutex_lock(&alsa_mutex, 20000, 1); - // check possible state transitions here if ((config.keep_dac_busy != 0) && (alsa_device_initialised == 0)) { debug(1,"alsa: alsa_buffer_monitor_thread_code() calling do_alsa_device_init_if_needed."); do_alsa_device_init_if_needed(); } + int sleep_time_ms = (int)(config.audio_backend_silence_scan_interval * 1000); + pthread_cleanup_debug_mutex_lock(&alsa_mutex, 20000, 1); + // check possible state transitions here if ((alsa_backend_state == abm_disconnected) && (config.keep_dac_busy != 0)) { // open the dac and move to abm_connected mode if (do_open() == 0) diff --git a/player.c b/player.c index 52356ce0..642b6e2c 100644 --- a/player.c +++ b/player.c @@ -2692,10 +2692,12 @@ void player_volume_without_notification(double airplay_volume, rtsp_conn_info *c } - if (((volume_mode == vol_hw_only) || (volume_mode == vol_both)) && (config.output->volume)) + if (((volume_mode == vol_hw_only) || (volume_mode == vol_both)) && (config.output->volume)) { config.output->volume(hardware_attenuation); // otherwise set the output to the lowest value // debug(1,"Hardware attenuation set to %f for airplay volume of // %f.",hardware_attenuation,airplay_volume); + conn->fix_volume = 0x10000; + } if ((volume_mode == vol_sw_only) || (volume_mode == vol_both)) { double temp_fix_volume = 65536.0 * pow(10, software_attenuation / 2000);