Change the feedback alert to a flashing button; works

around part of #4432.


git-svn-id: svn://localhost/ardour2/branches/3.0@10539 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2011-11-11 13:52:27 +00:00
parent a74310ebbe
commit cd2047cbff
9 changed files with 66 additions and 6 deletions

View File

@ -415,6 +415,22 @@
<Option name="rude audition: text" value="979797ff"/>
<Option name="rude audition: text active" value="ffffffff"/>
<Option name="rude audition: text mid" value="00000000"/>
<Option name="feedback alert: border start" value="997171ff"/>
<Option name="feedback alert: border end" value="000000ff"/>
<Option name="feedback alert: border start selected" value="000000ff"/>
<Option name="feedback alert: border end selected" value="00000000"/>
<Option name="feedback alert: fill start" value="684d4dff"/>
<Option name="feedback alert: fill end" value="513c3cff"/>
<Option name="feedback alert: fill start active" value="ff1f1fff"/>
<Option name="feedback alert: fill end active" value="e21b1bff"/>
<Option name="feedback alert: fill start mid" value="00000000"/>
<Option name="feedback alert: fill end mid" value="00000000"/>
<Option name="feedback alert: led" value="00000000"/>
<Option name="feedback alert: led active" value="00000000"/>
<Option name="feedback alert: led mid" value="00000000"/>
<Option name="feedback alert: text" value="969696ff"/>
<Option name="feedback alert: text active" value="e5e5e5ff"/>
<Option name="feedback alert: text mid" value="00000000"/>
<Option name="mute button: border start" value="ffcb8bff"/>
<Option name="mute button: border end" value="603600ff"/>
<Option name="mute button: border start selected" value="00000000"/>

View File

@ -395,6 +395,7 @@ widget "*send alert button" style:highest "small_text"
widget "*solo button" style:highest "monitor"
widget "*rude solo" style:highest "small_text"
widget "*rude audition" style:highest "small_text"
widget "*feedback alert" style:highest "small_text"
widget "*transport option button" style:highest "small_text"
widget "*transport active option button" style:highest "small_text"
widget "*plugin bypass button" style:highest "small_text"

View File

@ -161,10 +161,12 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
, auditioning_alert_button (_("AUDITION"))
, solo_alert_button (_("SOLO"))
, feedback_alert_button (_("FEEDBACK"))
, error_log_button (_("Errors"))
, _status_bar_visibility (X_("status-bar"))
, _feedback_exists (false)
{
using namespace Gtk::Menu_Helpers;
@ -267,6 +269,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
/* tell the user about feedback */
ARDOUR::Session::FeedbackDetected.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::feedback_detected, this), gui_context ());
ARDOUR::Session::SuccessfulGraphSort.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::successful_graph_sort, this), gui_context ());
/* handle requests to deal with missing files */
@ -3880,13 +3883,13 @@ ARDOUR_UI::drop_process_buffers ()
void
ARDOUR_UI::feedback_detected ()
{
MessageDialog d (
_("Something you have just done has generated a feedback path within Ardour's "
"routing. Until this feedback is removed, Ardour's output will be as it was "
"before you made the feedback-generating connection.")
);
_feedback_exists = true;
}
d.run ();
void
ARDOUR_UI::successful_graph_sort ()
{
_feedback_exists = false;
}
void

View File

@ -444,12 +444,14 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
ArdourButton auditioning_alert_button;
ArdourButton solo_alert_button;
ArdourButton feedback_alert_button;
Gtk::VBox alert_box;
void solo_blink (bool);
void sync_blink (bool);
void audition_blink (bool);
void feedback_blink (bool);
void soloing_changed (bool);
void auditioning_changed (bool);
@ -457,6 +459,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
bool solo_alert_press (GdkEventButton* ev);
bool audition_alert_press (GdkEventButton* ev);
bool feedback_alert_press (GdkEventButton *);
void big_clock_value_changed ();
void primary_clock_value_changed ();
@ -734,6 +737,9 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
ArdourButton midi_panic_button;
void midi_panic ();
void successful_graph_sort ();
bool _feedback_exists;
};
#endif /* __ardour_gui_h__ */

View File

@ -141,6 +141,7 @@ ARDOUR_UI::setup_tooltips ()
set_tip (time_master_button, string_compose (_("Does %1 control the time?"), PROGRAM_NAME));
set_tip (solo_alert_button, _("When active, something is soloed.\nClick to de-solo everything"));
set_tip (auditioning_alert_button, _("When active, auditioning is taking place\nClick to stop the audition"));
set_tip (feedback_alert_button, _("When active, there is a feedback loop."));
set_tip (primary_clock, _("Primary Clock"));
set_tip (secondary_clock, _("Secondary Clock"));
@ -324,9 +325,12 @@ ARDOUR_UI::setup_transport ()
solo_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_press), false);
auditioning_alert_button.set_name ("rude audition");
auditioning_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_press), false);
feedback_alert_button.set_name ("feedback alert");
feedback_alert_button.signal_button_press_event().connect (sigc::mem_fun (*this, &ARDOUR_UI::feedback_alert_press), false);
alert_box.pack_start (solo_alert_button, true, false);
alert_box.pack_start (auditioning_alert_button, true, false);
alert_box.pack_start (feedback_alert_button, true, false);
HBox* tbox = manage (new HBox);
tbox->set_spacing (2);
@ -512,6 +516,12 @@ ARDOUR_UI::solo_alert_press (GdkEventButton*)
return true;
}
bool
ARDOUR_UI::feedback_alert_press (GdkEventButton *)
{
return true;
}
void
ARDOUR_UI::solo_blink (bool onoff)
{
@ -572,6 +582,20 @@ ARDOUR_UI::audition_blink (bool onoff)
}
}
void
ARDOUR_UI::feedback_blink (bool onoff)
{
if (_feedback_exists) {
if (onoff) {
feedback_alert_button.set_active (true);
} else {
feedback_alert_button.set_active (false);
}
} else {
feedback_alert_button.set_active (false);
}
}
void
ARDOUR_UI::set_transport_sensitivity (bool yn)
{

View File

@ -154,6 +154,7 @@ ARDOUR_UI::set_session (Session *s)
Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::solo_blink));
Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::sync_blink));
Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::audition_blink));
Blink.connect (sigc::mem_fun(*this, &ARDOUR_UI::feedback_blink));
_session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
_session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());

View File

@ -173,6 +173,7 @@ BUTTON_VARS(MonitorSectionSoloExclusiveButton, "monitor solo exclusive")
BUTTON_VARS(RudeSolo, "rude solo")
BUTTON_VARS(RudeIsolate, "rude isolate")
BUTTON_VARS(RudeAudition, "rude audition")
BUTTON_VARS(FeedbackAlert, "feedback alert")
BUTTON_VARS(MuteButton, "mute button")
BUTTON_VARS(SoloButton, "solo button")
BUTTON_VARS(RecEnableButton, "record enable button")

View File

@ -833,6 +833,11 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
*/
static PBD::Signal0<void> FeedbackDetected;
/** Emitted when a graph sort has successfully completed, which means
that it has no feedback cycles.
*/
static PBD::Signal0<void> SuccessfulGraphSort;
/* handlers can return an integer value:
0: config.set_audio_search_path() or config.set_midi_search_path() was used
to modify the search path and we should try to find it again.

View File

@ -130,6 +130,7 @@ PBD::Signal2<void,std::string, std::string> Session::Exported;
PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
PBD::Signal0<void> Session::Quit;
PBD::Signal0<void> Session::FeedbackDetected;
PBD::Signal0<void> Session::SuccessfulGraphSort;
static void clean_up_session_event (SessionEvent* ev) { delete ev; }
const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
@ -1390,6 +1391,8 @@ Session::resort_routes_using (boost::shared_ptr<RouteList> r)
}
#endif
SuccessfulGraphSort (); /* EMIT SIGNAL */
} else {
/* The topological sort failed, so we have a problem. Tell everyone
and stick to the old graph; this will continue to be processed, so