From e41527d5bac8a9369ddbd4f4f48c66f5b662bfc8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 29 Apr 2009 17:30:35 +0000 Subject: [PATCH] Only make record button solid red (and big clock red) when things are actually being recorded (ie when record is in progress and one or more tracks are armed). As per mantis #2604. git-svn-id: svn://localhost/ardour2/branches/3.0@5012 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour_ui.cc | 25 +++++++++++-------------- libs/ardour/ardour/session.h | 4 ++++ libs/ardour/session.cc | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 838588487b..ce435c4ad5 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -1957,23 +1957,20 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff) if (session == 0) { return; } + + Session::RecordState const r = session->record_status (); + bool const h = session->have_rec_enabled_diskstream (); - switch (session->record_status()) { - case Session::Enabled: + if (r == Session::Enabled || (r == Session::Recording && !h)) { if (onoff) { rec_button.set_visual_state (2); } else { rec_button.set_visual_state (0); } - break; - - case Session::Recording: + } else if (r == Session::Recording && h) { rec_button.set_visual_state (1); - break; - - default: + } else { rec_button.set_visual_state (0); - break; } } @@ -3175,13 +3172,13 @@ ARDOUR_UI::record_state_changed () return; } - switch (session->record_status()) { - case Session::Recording: + Session::RecordState const r = session->record_status (); + bool const h = session->have_rec_enabled_diskstream (); + + if (r == Session::Recording && h) { big_clock.set_widget_name ("BigClockRecording"); - break; - default: + } else { big_clock.set_widget_name ("BigClockNonRecording"); - break; } } diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index ce29928468..ce238fbc2e 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -292,6 +292,7 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable void add_diskstream (boost::shared_ptr); boost::shared_ptr diskstream_by_id (const PBD::ID& id); boost::shared_ptr diskstream_by_name (string name); + bool have_rec_enabled_diskstream () const; bool have_captured() const { return _have_captured; } @@ -1742,6 +1743,9 @@ class Session : public PBD::StatefulDestructible, public boost::noncopyable SessionMetadata * _metadata; mutable bool have_looped; ///< Used in ::audible_frame(*) + + void update_have_rec_enabled_diskstream (); + gint _have_rec_enabled_diskstream; }; } // namespace ARDOUR diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index fdb396d902..c5904de869 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -140,7 +140,8 @@ Session::Session (AudioEngine &eng, click_data (0), click_emphasis_data (0), main_outs (0), - _metadata (new SessionMetadata()) + _metadata (new SessionMetadata()), + _have_rec_enabled_diskstream (false) { bool new_session; @@ -223,7 +224,8 @@ Session::Session (AudioEngine &eng, click_data (0), click_emphasis_data (0), main_outs (0), - _metadata (new SessionMetadata()) + _metadata (new SessionMetadata()), + _have_rec_enabled_diskstream (false) { bool new_session; @@ -2141,6 +2143,8 @@ Session::add_diskstream (boost::shared_ptr dstream) /* this will connect to future changes, and check the current length */ diskstream_playlist_changed (dstream); + dstream->RecordEnableChanged.connect (mem_fun (*this, &Session::update_have_rec_enabled_diskstream)); + dstream->prepare (); } @@ -4325,3 +4329,28 @@ Session::sync_order_keys (const char* base) } +/** @return true if there is at least one record-enabled diskstream, otherwise false */ +bool +Session::have_rec_enabled_diskstream () const +{ + return g_atomic_int_get (&_have_rec_enabled_diskstream) == 1; +} + +/** Update the state of our rec-enabled diskstreams flag */ +void +Session::update_have_rec_enabled_diskstream () +{ + boost::shared_ptr dsl = diskstreams.reader (); + DiskstreamList::iterator i = dsl->begin (); + while (i != dsl->end () && (*i)->record_enabled () == false) { + ++i; + } + + int const old = g_atomic_int_get (&_have_rec_enabled_diskstream); + + g_atomic_int_set (&_have_rec_enabled_diskstream, i != dsl->end () ? 1 : 0); + + if (g_atomic_int_get (&_have_rec_enabled_diskstream) != old) { + RecordStateChanged (); /* EMIT SIGNAL */ + } +}