From 415721fa5b48f3c3dc164ac60095c095c4e48ad0 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Tue, 27 Nov 2018 23:57:53 +0100 Subject: [PATCH] Prepare central engine check and user notification --- gtk2_ardour/utils.cc | 35 +++++++++++++++++++++++++++++++++++ gtk2_ardour/utils.h | 5 +++++ 2 files changed, 40 insertions(+) diff --git a/gtk2_ardour/utils.cc b/gtk2_ardour/utils.cc index 97c36b7faf..b1b6870ada 100644 --- a/gtk2_ardour/utils.cc +++ b/gtk2_ardour/utils.cc @@ -43,6 +43,7 @@ #include "pbd/file_utils.h" #include "pbd/stacktrace.h" +#include "ardour/audioengine.h" #include "ardour/filesystem_paths.h" #include "ardour/search_paths.h" @@ -51,6 +52,7 @@ #include "canvas/item.h" +#include "actions.h" #include "debug.h" #include "public_editor.h" #include "keyboard.h" @@ -99,6 +101,39 @@ ARDOUR_UI_UTILS::just_hide_it (GdkEventAny */*ev*/, Gtk::Window *win) return 0; } +static bool +idle_notify_engine_stopped () +{ + Glib::RefPtr act = ActionManager::get_action ("Window", "toggle-audio-midi-setup"); + Glib::RefPtr tact = Glib::RefPtr::cast_dynamic(act); + + MessageDialog msg ( + _("The current operation is not possible because of an error communicating with the audio hardware."), + false, Gtk::MESSAGE_WARNING, Gtk::BUTTONS_NONE, true); + + msg.add_button (_("Cancel"), Gtk::RESPONSE_CANCEL); + + if (tact && !tact->get_active()) { + msg.add_button (_("Configure Hardware"), Gtk::RESPONSE_OK); + } + + if (msg.run () == Gtk::RESPONSE_OK) { + tact->set_active (); + } + return false; /* do not call again */ +} + +bool +ARDOUR_UI_UTILS::no_engine_notify () +{ + if (ARDOUR::AudioEngine::instance()->running ()) { + return false; // 0 == OK + } + Glib::signal_idle().connect (sigc::ptr_fun (&idle_notify_engine_stopped)); + return true; +} + + /* xpm2rgb copied from nixieclock, which bore the legend: nixieclock - a nixie desktop timepiece diff --git a/gtk2_ardour/utils.h b/gtk2_ardour/utils.h index 6713844ba6..47967ae3b5 100644 --- a/gtk2_ardour/utils.h +++ b/gtk2_ardour/utils.h @@ -52,6 +52,11 @@ namespace ARDOUR_UI_UTILS { gint just_hide_it (GdkEventAny*, Gtk::Window*); void add_item_with_sensitivity (Gtk::Menu_Helpers::MenuList &, Gtk::Menu_Helpers::MenuElem, bool); +/* return 0 (false) if there is no error (engine runs). + * otherwise queue an idle user-notificaion and return true. + */ +bool no_engine_notify (); + unsigned char* xpm2rgb (const char** xpm, uint32_t& w, uint32_t& h); unsigned char* xpm2rgba (const char** xpm, uint32_t& w, uint32_t& h);