From 6dc4227cc4edeba407002ab30533dc8f51962dcc Mon Sep 17 00:00:00 2001 From: Nikolaus Gullotta Date: Wed, 10 Apr 2019 10:47:51 -0500 Subject: [PATCH] set up recall flags for later usage --- libs/ardour/ardour/mixer_snapshot.h | 25 ++++++++- libs/ardour/enums.cc | 8 +++ libs/ardour/mixer_snapshot.cc | 83 ++++++++++++++++++++--------- 3 files changed, 89 insertions(+), 27 deletions(-) diff --git a/libs/ardour/ardour/mixer_snapshot.h b/libs/ardour/ardour/mixer_snapshot.h index 3d19c0f61e..345a384f5f 100644 --- a/libs/ardour/ardour/mixer_snapshot.h +++ b/libs/ardour/ardour/mixer_snapshot.h @@ -32,6 +32,14 @@ namespace ARDOUR { class LIBARDOUR_API MixerSnapshot { public: + enum RecallFlags { + RecallEQ = 0x1, + RecallComp = 0x2, + RecallIO = 0x4, + RecallGroup = 0x8, + RecallVCA = 0x10, + }; + MixerSnapshot(ARDOUR::Session*); MixerSnapshot(ARDOUR::Session*, std::string); ~MixerSnapshot(); @@ -65,13 +73,25 @@ class LIBARDOUR_API MixerSnapshot std::vector get_groups() {return group_states;}; std::vector get_vcas() {return vca_states;}; + bool recall_eq() { return _flags & RecallEQ;}; + bool recall_comp() { return _flags & RecallComp;}; + bool recall_io() { return _flags & RecallIO;}; + bool recall_group() { return _flags & RecallGroup;}; + bool recall_vca() { return _flags & RecallVCA;}; + + void set_recall_eq(bool); + void set_recall_comp(bool); + void set_recall_io(bool); + void set_recall_group(bool); + void set_recall_vca(bool); + unsigned int get_id() {return id;}; void set_id(unsigned int new_id) {id = new_id;}; std::string get_label() {return label;}; void set_label(std::string new_label) {label = new_label;}; - bool get_favorite() {return timestamp;}; + bool get_favorite() {return favorite;}; void set_favorite(bool yn) {favorite = yn;}; std::time_t get_timestamp() {return timestamp;}; @@ -87,16 +107,19 @@ class LIBARDOUR_API MixerSnapshot void reassign_masters(boost::shared_ptr, XMLNode); void load_from_session(std::string); void load_from_session(XMLNode&); + bool set_flag(bool, RecallFlags); unsigned int id; bool favorite; std::string label; std::time_t timestamp; std::string last_modified_with; + RecallFlags _flags; std::vector route_states; std::vector group_states; std::vector vca_states; + }; } // namespace ARDOUR diff --git a/libs/ardour/enums.cc b/libs/ardour/enums.cc index 3dc0d3122a..e8a7858b2e 100644 --- a/libs/ardour/enums.cc +++ b/libs/ardour/enums.cc @@ -40,6 +40,7 @@ #include "ardour/io.h" #include "ardour/location.h" #include "ardour/midi_model.h" +#include "ardour/mixer_snapshot.h" #include "ardour/mode.h" #include "ardour/mute_master.h" #include "ardour/presentation_info.h" @@ -159,6 +160,7 @@ setup_enum_writer () LoopFadeChoice _LoopFadeChooice; TransportState _TransportState; LocateTransportDisposition _LocateTransportDisposition; + MixerSnapshot::RecallFlags _Recall_Flags; #define REGISTER(e) enum_writer.register_distinct (typeid(e).name(), i, s); i.clear(); s.clear() #define REGISTER_BITS(e) enum_writer.register_bits (typeid(e).name(), i, s); i.clear(); s.clear() @@ -848,6 +850,12 @@ setup_enum_writer () REGISTER_ENUM (MustRoll); REGISTER_ENUM (RollIfAppropriate); REGISTER (_LocateTransportDisposition); + REGISTER_CLASS_ENUM (MixerSnapshot, RecallEQ); + REGISTER_CLASS_ENUM (MixerSnapshot, RecallComp); + REGISTER_CLASS_ENUM (MixerSnapshot, RecallIO); + REGISTER_CLASS_ENUM (MixerSnapshot, RecallGroup); + REGISTER_CLASS_ENUM (MixerSnapshot, RecallVCA); + REGISTER_BITS (_Recall_Flags); } } /* namespace ARDOUR */ diff --git a/libs/ardour/mixer_snapshot.cc b/libs/ardour/mixer_snapshot.cc index 4249bcbde8..8d7c962f03 100644 --- a/libs/ardour/mixer_snapshot.cc +++ b/libs/ardour/mixer_snapshot.cc @@ -18,6 +18,18 @@ #include +#include +#include + +#include "pbd/file_utils.h" +#include "pbd/i18n.h" +#include "pbd/memento_command.h" + +#include "pbd/types_convert.h" +#include "pbd/stl_delete.h" +#include "pbd/xml++.h" +#include "pbd/enumwriter.h" + #include "ardour/mixer_snapshot.h" #include "ardour/route_group.h" #include "ardour/vca_manager.h" @@ -26,24 +38,23 @@ #include "ardour/session_state_utils.h" #include "ardour/revision.h" #include "ardour/session_directory.h" +#include "ardour/types_convert.h" -#include "pbd/i18n.h" -#include "pbd/xml++.h" -#include "pbd/memento_command.h" -#include "pbd/file_utils.h" - -#include -#include +namespace PBD { + DEFINE_ENUM_CONVERT(ARDOUR::MixerSnapshot::RecallFlags) +} using namespace std; using namespace ARDOUR; + MixerSnapshot::MixerSnapshot(Session* s) : id(0) , favorite(false) , label("snapshot") , timestamp(time(0)) , last_modified_with(string_compose("%1 %2", PROGRAM_NAME, revision)) + , _flags(RecallFlags(0)) { if(s) { _session = s; @@ -56,6 +67,7 @@ MixerSnapshot::MixerSnapshot(Session* s, string file_path) , label("snapshot") , timestamp(time(0)) , last_modified_with(string_compose("%1 %2", PROGRAM_NAME, revision)) + , _flags(RecallFlags(0)) { if(s) { _session = s; @@ -79,6 +91,29 @@ MixerSnapshot::~MixerSnapshot() { } +bool MixerSnapshot::set_flag(bool yn, RecallFlags flag) +{ + if (yn) { + if (!(_flags & flag)) { + _flags = RecallFlags (_flags | flag); + return true; + } + } else { + if (_flags & flag) { + _flags = RecallFlags (_flags & ~flag); + return true; + } + } + return false; +} + +void MixerSnapshot::set_recall_eq(bool yn) { set_flag(yn, RecallEQ);}; +void MixerSnapshot::set_recall_comp(bool yn) { set_flag(yn, RecallComp);}; +void MixerSnapshot::set_recall_io(bool yn) { set_flag(yn, RecallIO);}; +void MixerSnapshot::set_recall_group(bool yn) { set_flag(yn, RecallGroup);}; +void MixerSnapshot::set_recall_vca(bool yn) { set_flag(yn, RecallVCA);}; + + bool MixerSnapshot::has_specials() { if(empty()) { @@ -326,14 +361,18 @@ void MixerSnapshot::write(const string path) return; } + set_recall_eq(true); + set_recall_io(true); + set_recall_vca(true); + XMLNode* node = new XMLNode("MixerSnapshot"); + node->set_property(X_("flags"), _flags); + node->set_property(X_("favorite"), favorite); + node->set_property(X_("modified-with"), last_modified_with); XMLNode* child; - child = node->add_child ("ProgramVersion"); - child->set_property("modified-with", last_modified_with); - - child = node->add_child ("Favorite"); - child->set_property("favorite", favorite); + // child = node->add_child ("ProgramVersion"); + // child->set_property("modified-with", last_modified_with); child = node->add_child("Routes"); for(vector::iterator i = route_states.begin(); i != route_states.end(); i++) { @@ -370,24 +409,16 @@ void MixerSnapshot::load(const string path) return; } - XMLNode* version_node = find_named_node(*root, "ProgramVersion"); - XMLNode* fav_node = find_named_node(*root, "Favorite"); + string fav; + root->get_property(X_("flags"), _flags); + root->get_property(X_("favorite"), fav); + root->get_property(X_("modified-with"), last_modified_with); + set_favorite(atoi(fav.c_str())); + XMLNode* route_node = find_named_node(*root, "Routes"); XMLNode* group_node = find_named_node(*root, "Groups"); XMLNode* vca_node = find_named_node(*root, "VCAS"); - if(version_node) { - string version; - version_node->get_property(X_("modified-with"), version); - last_modified_with = version; - } - - if(fav_node) { - string fav; - fav_node->get_property(X_("favorite"), fav); - favorite = atoi(fav.c_str()); - } - if(route_node) { XMLNodeList nlist = route_node->children(); for(XMLNodeConstIterator niter = nlist.begin(); niter != nlist.end(); niter++) {