add ::usable() method to TransportMaster objects to allow GUI to show their usability after backend/engine changes

This commit is contained in:
Paul Davis 2019-09-16 13:46:06 -06:00
parent fb4cbb9f9e
commit 37d9ec34c8
4 changed files with 34 additions and 0 deletions

View file

@ -86,6 +86,8 @@ TransportMastersWidget::TransportMastersWidget ()
TransportMasterManager::instance().Added.connect (add_connection, invalidator (*this), boost::bind (&TransportMastersWidget::rebuild, this), gui_context()); TransportMasterManager::instance().Added.connect (add_connection, invalidator (*this), boost::bind (&TransportMastersWidget::rebuild, this), gui_context());
TransportMasterManager::instance().Removed.connect (remove_connection, invalidator (*this), boost::bind (&TransportMastersWidget::rebuild, this), gui_context()); TransportMasterManager::instance().Removed.connect (remove_connection, invalidator (*this), boost::bind (&TransportMastersWidget::rebuild, this), gui_context());
AudioEngine::instance()->Running.connect (engine_running_connection, invalidator (*this), boost::bind (&TransportMastersWidget::update_usability, this), gui_context());
rebuild (); rebuild ();
} }
@ -244,6 +246,19 @@ TransportMastersWidget::rebuild ()
r->prop_change (all_change); r->prop_change (all_change);
} }
update_usability ();
}
void
TransportMastersWidget::update_usability ()
{
for (vector<Row*>::iterator r= rows.begin(); r != rows.end(); ++r) {
const bool usable = (*r)->tm->usable();
(*r)->use_button.set_sensitive (usable);
(*r)->collect_button.set_sensitive (usable);
(*r)->request_options.set_sensitive (usable);
}
} }
TransportMastersWidget::Row::Row (TransportMastersWidget& p) TransportMastersWidget::Row::Row (TransportMastersWidget& p)

View file

@ -143,11 +143,13 @@ class TransportMastersWidget : public Gtk::VBox, public ARDOUR::SessionHandlePtr
PBD::ScopedConnection current_connection; PBD::ScopedConnection current_connection;
PBD::ScopedConnection add_connection; PBD::ScopedConnection add_connection;
PBD::ScopedConnection remove_connection; PBD::ScopedConnection remove_connection;
PBD::ScopedConnection engine_running_connection;
void rebuild (); void rebuild ();
void clear (); void clear ();
void current_changed (boost::shared_ptr<ARDOUR::TransportMaster> old_master, boost::shared_ptr<ARDOUR::TransportMaster> new_master); void current_changed (boost::shared_ptr<ARDOUR::TransportMaster> old_master, boost::shared_ptr<ARDOUR::TransportMaster> new_master);
void add_master (); void add_master ();
void update_usability ();
public: public:
bool idle_remove (Row*); bool idle_remove (Row*);

View file

@ -231,6 +231,16 @@ class LIBARDOUR_API TransportMaster : public PBD::Stateful {
*/ */
virtual bool ok() const = 0; virtual bool ok() const = 0;
/**
* reports to ARDOUR whether it is possible to use this slave
*
* @return - true if the slave can be used.
*
* Only the JACK ("Engine") slave is ever likely to return false,
* if JACK is not being used for the Audio/MIDI backend.
*/
virtual bool usable() const { return true; }
/** /**
* reports to ARDOUR whether the slave is in the process of starting * reports to ARDOUR whether the slave is in the process of starting
* to roll * to roll
@ -626,6 +636,7 @@ class LIBARDOUR_API Engine_TransportMaster : public TransportMaster
void reset (bool with_position); void reset (bool with_position);
bool locked() const; bool locked() const;
bool ok() const; bool ok() const;
bool usable() const;
samplecnt_t update_interval () const; samplecnt_t update_interval () const;
samplecnt_t resolution () const { return 1; } samplecnt_t resolution () const { return 1; }
bool requires_seekahead () const { return false; } bool requires_seekahead () const { return false; }

View file

@ -47,6 +47,12 @@ Engine_TransportMaster::init ()
{ {
} }
bool
Engine_TransportMaster::usable () const
{
return AudioEngine::instance()->current_backend_name() == X_("JACK");
}
void void
Engine_TransportMaster::check_backend() Engine_TransportMaster::check_backend()
{ {