diff --git a/src/audio/alsa/backend.rs b/src/audio/alsa/backend.rs index 29318f1c1..abec290a6 100644 --- a/src/audio/alsa/backend.rs +++ b/src/audio/alsa/backend.rs @@ -352,5 +352,12 @@ fn on_alsa_event( self::AudioUser::Unknown, ); } + AlsaEvent::AlsaCardReload => { + invoke_handlers( + handlers, + self::AudioSignal::CardReload, + self::AudioUser::Unknown, + ); + } } } diff --git a/src/audio/alsa/card.rs b/src/audio/alsa/card.rs index 1719aadda..0ecaaa60f 100644 --- a/src/audio/alsa/card.rs +++ b/src/audio/alsa/card.rs @@ -32,6 +32,8 @@ pub enum AlsaEvent { AlsaCardDiconnected, /// The values of the mixer changed, including mute state. AlsaCardValuesChanged, + /// Alsa needs to be reloaded due to recoverable error. + AlsaCardReload, } @@ -236,8 +238,9 @@ extern "C" fn watch_cb( continue; } glib_sys::G_IO_STATUS_NORMAL => { - error!("Alsa failed to clear the channel"); - cb(AlsaEvent::AlsaCardError); + // BUG: https://github.com/nicklan/pnmixer/issues/182 + warn!("Alsa failed to clear the channel"); + cb(AlsaEvent::AlsaCardReload); } glib_sys::G_IO_STATUS_ERROR => (), glib_sys::G_IO_STATUS_EOF => { diff --git a/src/audio/frontend.rs b/src/audio/frontend.rs index dc85683a2..ad2d8ee76 100644 --- a/src/audio/frontend.rs +++ b/src/audio/frontend.rs @@ -49,6 +49,7 @@ pub enum AudioSignal { CardDisconnected, CardError, ValuesChanged, + CardReload, } diff --git a/src/ui/entry.rs b/src/ui/entry.rs index 5323494a0..0de356387 100644 --- a/src/ui/entry.rs +++ b/src/ui/entry.rs @@ -72,7 +72,7 @@ where &apps.prefs.borrow(), AudioUser::Unknown, )); - } + }, (AudioSignal::CardError, _) => { if run_audio_error_dialog( &apps.gui.popup_menu.menu_window, @@ -84,7 +84,14 @@ where AudioUser::Unknown, )); } - } + }, + (AudioSignal::CardReload, _) => { + try_w!(audio_reload( + apps.audio.as_ref(), + &apps.prefs.borrow(), + AudioUser::Unknown, + )); + }, _ => (), }), );