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;
}
}
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;
}
}
void add_diskstream (boost::shared_ptr<Diskstream>);
boost::shared_ptr<Diskstream> diskstream_by_id (const PBD::ID& id);
boost::shared_ptr<Diskstream> diskstream_by_name (string name);
+ bool have_rec_enabled_diskstream () const;
bool have_captured() const { return _have_captured; }
SessionMetadata * _metadata;
mutable bool have_looped; ///< Used in ::audible_frame(*)
+
+ void update_have_rec_enabled_diskstream ();
+ gint _have_rec_enabled_diskstream;
};
} // namespace ARDOUR
click_data (0),
click_emphasis_data (0),
main_outs (0),
- _metadata (new SessionMetadata())
+ _metadata (new SessionMetadata()),
+ _have_rec_enabled_diskstream (false)
{
bool new_session;
click_data (0),
click_emphasis_data (0),
main_outs (0),
- _metadata (new SessionMetadata())
+ _metadata (new SessionMetadata()),
+ _have_rec_enabled_diskstream (false)
{
bool new_session;
/* 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 ();
}
}
+/** @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<DiskstreamList> 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 */
+ }
+}