diff --git a/libs/ardour/ardour/instrument_info.h b/libs/ardour/ardour/instrument_info.h index 6799c8a0fa..9330dedd47 100644 --- a/libs/ardour/ardour/instrument_info.h +++ b/libs/ardour/ardour/instrument_info.h @@ -78,8 +78,17 @@ private: std::string get_patch_name (uint16_t bank, uint8_t program, uint8_t channel, bool with_extra) const; - std::string external_instrument_model; - std::string external_instrument_mode; + void invalidate_cached_plugin_model () + { + _plugin_model = ""; + _plugin_mode = ""; + } + + std::string _external_instrument_model; + std::string _external_instrument_mode; + + mutable std::string _plugin_model; + mutable std::string _plugin_mode; boost::weak_ptr internal_instrument; }; diff --git a/libs/ardour/instrument_info.cc b/libs/ardour/instrument_info.cc index f52671d3da..f683e96f0b 100644 --- a/libs/ardour/instrument_info.cc +++ b/libs/ardour/instrument_info.cc @@ -38,7 +38,7 @@ using namespace MIDI::Name; using std::string; InstrumentInfo::InstrumentInfo () - : external_instrument_model (_("Unknown")) + : _external_instrument_model (_("Unknown")) { } @@ -49,26 +49,28 @@ InstrumentInfo::~InstrumentInfo () void InstrumentInfo::set_external_instrument (const string& model, const string& mode) { - if (external_instrument_model == model && external_instrument_mode == mode) { + invalidate_cached_plugin_model (); + if (_external_instrument_model == model && _external_instrument_mode == mode) { //std::cerr << "InstrumentInfo::set_external_instrument '" << model << "' '" << mode << "' -- no change\n"; return; } //std::cerr << "InstrumentInfo::set_external_instrument '" << model << "' '" << mode << "'\n"; - external_instrument_model = model; - external_instrument_mode = mode; + _external_instrument_model = model; + _external_instrument_mode = mode; Changed (); /* EMIT SIGNAL */ } void InstrumentInfo::set_internal_instrument (boost::shared_ptr p) { + invalidate_cached_plugin_model (); if (p == internal_instrument.lock ()) { //std::cerr << "InstrumentInfo::set_internal_instrument -- NO CHANGE\n"; return; } //std::cerr << "InstrumentInfo::set_internal_instrument -> '" << (p ? p->name () : "(NULL)") << "'\n"; internal_instrument = p; - if (external_instrument_model.empty () || external_instrument_model == _("Unknown")) { + if (_external_instrument_model.empty () || _external_instrument_model == _("Unknown")) { Changed (); /* EMIT SIGNAL */ } } @@ -92,14 +94,17 @@ InstrumentInfo::have_custom_plugin_info () const std::string InstrumentInfo::model () const { - if (!external_instrument_model.empty ()) { - return external_instrument_model; + if (!_external_instrument_model.empty ()) { + return _external_instrument_model; + } + if (!_plugin_model.empty ()) { + return _plugin_model; } - // TODO: cache plugin model boost::shared_ptr p = internal_instrument.lock (); boost::shared_ptr pi = boost::dynamic_pointer_cast (p); if (pi && pi->plugin ()->has_midnam ()) { - return pi->plugin ()->midnam_model (); + _plugin_model = pi->plugin ()->midnam_model (); + return _plugin_model; } return ""; } @@ -107,16 +112,19 @@ InstrumentInfo::model () const std::string InstrumentInfo::mode () const { - if (!external_instrument_model.empty ()) { - return external_instrument_mode; + if (!_external_instrument_model.empty ()) { + return _external_instrument_mode; + } + if (!_plugin_mode.empty ()) { + return _plugin_mode; } - // TODO: cache plugin mode boost::shared_ptr p = internal_instrument.lock (); boost::shared_ptr pi = boost::dynamic_pointer_cast (p); if (pi && pi->plugin ()->has_midnam ()) { const std::list device_modes = MidiPatchManager::instance ().custom_device_mode_names_by_model (model ()); if (device_modes.size () > 0) { - return device_modes.front (); + _plugin_mode = device_modes.front (); + return _plugin_mode; } } return "";