diff options
-rw-r--r-- | gtk2_ardour/session_metadata_dialog.cc | 72 | ||||
-rw-r--r-- | gtk2_ardour/session_metadata_dialog.h | 4 | ||||
-rw-r--r-- | gtk2_ardour/session_option_editor.cc | 16 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 4 | ||||
-rw-r--r-- | libs/ardour/ardour/session_configuration_vars.h | 2 | ||||
-rw-r--r-- | libs/ardour/ardour/session_metadata.h | 29 | ||||
-rw-r--r-- | libs/ardour/broadcast_info.cc | 5 | ||||
-rw-r--r-- | libs/ardour/rc_configuration.cc | 7 | ||||
-rw-r--r-- | libs/ardour/session.cc | 2 | ||||
-rw-r--r-- | libs/ardour/session_metadata.cc | 137 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 8 |
11 files changed, 230 insertions, 56 deletions
diff --git a/gtk2_ardour/session_metadata_dialog.cc b/gtk2_ardour/session_metadata_dialog.cc index 996262f0fa..5bac706106 100644 --- a/gtk2_ardour/session_metadata_dialog.cc +++ b/gtk2_ardour/session_metadata_dialog.cc @@ -27,6 +27,7 @@ #include "ardour/session.h" #include "ardour/session_directory.h" #include "ardour/session_utils.h" +#include "ardour/configuration.h" #include "i18n.h" @@ -81,8 +82,8 @@ TextMetadataField::load_data (ARDOUR::SessionMetadata const & data) Gtk::Widget & TextMetadataField::name_widget () { - label = Gtk::manage (new Gtk::Label(_name + ':', Gtk::ALIGN_LEFT)); - label->set_alignment (0, 0.5); + label = Gtk::manage (new Gtk::Label(_name + ':')); + label->set_alignment (1, 0.5); return *label; } @@ -160,8 +161,8 @@ NumberMetadataField::update_value () Gtk::Widget & NumberMetadataField::name_widget () { - label = Gtk::manage (new Gtk::Label(_name + ':', Gtk::ALIGN_LEFT)); - label->set_alignment (0, 0.5); + label = Gtk::manage (new Gtk::Label(_name + ':')); + label->set_alignment (1, 0.5); return *label; } @@ -255,7 +256,7 @@ SessionMetadataSetEditable::set_session (ARDOUR::Session * s) return; } - ARDOUR::SessionMetadata const & data = _session->metadata(); + ARDOUR::SessionMetadata const & data = *(ARDOUR::SessionMetadata::Metadata()); table.resize (list.size(), 2); uint32_t row = 0; @@ -272,7 +273,7 @@ SessionMetadataSetEditable::set_session (ARDOUR::Session * s) void SessionMetadataSetEditable::save_data () { - ARDOUR::SessionMetadata & data = _session->metadata(); + ARDOUR::SessionMetadata & data = *(ARDOUR::SessionMetadata::Metadata()); for (DataList::const_iterator it = list.begin(); it != list.end(); ++it) { (*it)->save_data(data); } @@ -330,7 +331,7 @@ SessionMetadataSetImportable::load_extra_data (ARDOUR::SessionMetadata const & d return; } - ARDOUR::SessionMetadata & session_data = _session->metadata(); + ARDOUR::SessionMetadata const & session_data = *(ARDOUR::SessionMetadata::Metadata()); MetadataPtr session_field; MetadataPtr import_field; @@ -378,7 +379,7 @@ SessionMetadataSetImportable::save_data () return; } - ARDOUR::SessionMetadata & session_data = _session->metadata(); + ARDOUR::SessionMetadata & session_data = *(ARDOUR::SessionMetadata::Metadata()); Gtk::TreeModel::Children fields = tree->children(); Gtk::TreeModel::Children::iterator it; @@ -421,22 +422,25 @@ SessionMetadataDialog<DataSet>::SessionMetadataDialog (string const & name) : { cancel_button = add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); cancel_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::end_dialog)); - save_button = add_button (Gtk::Stock::SAVE, Gtk::RESPONSE_ACCEPT); + save_button = add_button (Gtk::Stock::OK, Gtk::RESPONSE_ACCEPT); save_button->signal_clicked().connect (sigc::mem_fun(*this, &SessionMetadataDialog::save_and_close)); } template <typename DataSet> void -SessionMetadataDialog<DataSet>::init_data () +SessionMetadataDialog<DataSet>::init_data ( bool skip_user ) { if (!_session) { std::cerr << "Programming error: no session set for SessionMetaDataDialog (in init_data)!" << std::endl; return; } + if (!skip_user) + init_user_data (); init_track_data (); init_album_data (); init_people_data (); + init_school_data (); for (DataSetList::iterator it = data_list.begin(); it != data_list.end(); ++it) { (*it)->set_session (_session); @@ -468,6 +472,7 @@ void SessionMetadataDialog<DataSet>::save_and_close () { save_data (); + _session->set_dirty(); end_dialog (); } @@ -509,6 +514,32 @@ SessionMetadataDialog<DataSet>::add_widget (Gtk::Widget & widget) template <typename DataSet> void +SessionMetadataDialog<DataSet>::init_user_data () +{ + DataSetPtr data_set (new DataSet (_("User"))); + data_list.push_back (data_set); + + MetadataPtr ptr; + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_name, &ARDOUR::SessionMetadata::set_user_name, _("Name"))); + data_set->add_data_field (ptr); + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_email, &ARDOUR::SessionMetadata::set_user_email, _("Email"))); + data_set->add_data_field (ptr); + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::user_web, &ARDOUR::SessionMetadata::set_user_web, _("Web"))); + data_set->add_data_field (ptr); + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::organization, &ARDOUR::SessionMetadata::set_organization, _("Organization"))); + data_set->add_data_field (ptr); + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::country, &ARDOUR::SessionMetadata::set_country, _("Country"))); + data_set->add_data_field (ptr); + +} + +template <typename DataSet> +void SessionMetadataDialog<DataSet>::init_track_data () { DataSetPtr data_set (new DataSet (_("Track"))); @@ -615,6 +646,23 @@ SessionMetadataDialog<DataSet>::init_people_data () data_set->add_data_field (ptr); } +template <typename DataSet> +void +SessionMetadataDialog<DataSet>::init_school_data () +{ + DataSetPtr data_set (new DataSet (_("School"))); + data_list.push_back (data_set); + + MetadataPtr ptr; + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::instructor, &ARDOUR::SessionMetadata::set_instructor, _("Instructor"))); + data_set->add_data_field (ptr); + + ptr = MetadataPtr (new TextMetadataField (&ARDOUR::SessionMetadata::course, &ARDOUR::SessionMetadata::set_course, _("Course"))); + data_set->add_data_field (ptr); + +} + /* SessionMetadataEditor */ SessionMetadataEditor::SessionMetadataEditor () : @@ -722,10 +770,10 @@ SessionMetadataImporter::run () return; } + //create a temporary ARDOUR::SessionMetadata data; data.set_state (*node, version); - - init_data (); + init_data ( true ); //skip user data here load_extra_data (data); init_gui(); diff --git a/gtk2_ardour/session_metadata_dialog.h b/gtk2_ardour/session_metadata_dialog.h index fbe430e7ad..9aa62ed4ca 100644 --- a/gtk2_ardour/session_metadata_dialog.h +++ b/gtk2_ardour/session_metadata_dialog.h @@ -209,7 +209,7 @@ class SessionMetadataDialog : public ArdourDialog SessionMetadataDialog (std::string const & name); protected: - void init_data (); + void init_data ( bool skip_user = false ); void load_extra_data (ARDOUR::SessionMetadata const & data); void save_data (); @@ -232,9 +232,11 @@ class SessionMetadataDialog : public ArdourDialog Gtk::Notebook notebook; private: + void init_user_data (); void init_track_data (); void init_album_data (); void init_people_data (); + void init_school_data (); typedef boost::shared_ptr<SessionMetadataSet> DataSetPtr; typedef std::list<DataSetPtr> DataSetList; diff --git a/gtk2_ardour/session_option_editor.cc b/gtk2_ardour/session_option_editor.cc index b524644542..62d555c13d 100644 --- a/gtk2_ardour/session_option_editor.cc +++ b/gtk2_ardour/session_option_editor.cc @@ -294,22 +294,6 @@ SessionOptionEditor::SessionOptionEditor (Session* s) add_option (_("Misc"), li); - add_option (_("Misc"), new OptionEditorHeading (_("Broadcast WAVE metadata"))); - - add_option (_("Misc"), new EntryOption ( - "bwf-country-code", - _("Country code"), - sigc::mem_fun (*_session_config, &SessionConfiguration::get_bwf_country_code), - sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_country_code) - )); - - add_option (_("Misc"), new EntryOption ( - "bwf-organization-code", - _("Organization code"), - sigc::mem_fun (*_session_config, &SessionConfiguration::get_bwf_organization_code), - sigc::mem_fun (*_session_config, &SessionConfiguration::set_bwf_organization_code) - )); - add_option (_("Misc"), new OptionEditorHeading (_("Glue to bars and beats"))); add_option (_("Misc"), new BoolOption ( diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 5becfd9a8f..6c7a9af844 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -777,8 +777,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi boost::shared_ptr<PBD::Controllable> solo_cut_control() const; - SessionMetadata & metadata () { return *_metadata; } - SessionConfiguration config; bool exporting () const { @@ -1466,8 +1464,6 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi static bool _disable_all_loaded_plugins; - SessionMetadata * _metadata; - mutable bool have_looped; ///< Used in ::audible_frame(*) void update_have_rec_enabled_track (); diff --git a/libs/ardour/ardour/session_configuration_vars.h b/libs/ardour/ardour/session_configuration_vars.h index 87b317d3e8..a6147f9140 100644 --- a/libs/ardour/ardour/session_configuration_vars.h +++ b/libs/ardour/ardour/session_configuration_vars.h @@ -45,8 +45,6 @@ CONFIG_VARIABLE (TimecodeFormat, timecode_format, "timecode-format", timecode_30 CONFIG_VARIABLE_SPECIAL(std::string, raid_path, "raid-path", "", path_expand) CONFIG_VARIABLE_SPECIAL(std::string, audio_search_path, "audio-search-path", "", search_path_expand) CONFIG_VARIABLE_SPECIAL(std::string, midi_search_path, "midi-search-path", "", search_path_expand) -CONFIG_VARIABLE (std::string, bwf_country_code, "bwf-country-code", "US") -CONFIG_VARIABLE (std::string, bwf_organization_code, "bwf-organization-code", "US") CONFIG_VARIABLE (std::string, auditioner_output_left, "auditioner-output-left", "default") CONFIG_VARIABLE (std::string, auditioner_output_right, "auditioner-output-right", "default") CONFIG_VARIABLE (bool, timecode_source_is_synced, "timecode-source-is-synced", true) diff --git a/libs/ardour/ardour/session_metadata.h b/libs/ardour/ardour/session_metadata.h index 296bf6243f..c4341dbc61 100644 --- a/libs/ardour/ardour/session_metadata.h +++ b/libs/ardour/ardour/session_metadata.h @@ -37,6 +37,9 @@ namespace ARDOUR { class SessionMetadata : public PBD::StatefulDestructible { public: + //singleton instance: + static SessionMetadata *Metadata() { if (_metadata == NULL) _metadata = new SessionMetadata(); return _metadata; } + SessionMetadata (); ~SessionMetadata (); @@ -72,6 +75,15 @@ class SessionMetadata : public PBD::StatefulDestructible std::string genre () const; + std::string instructor () const; + std::string course () const; + + std::string user_name () const; + std::string user_email () const; + std::string user_web () const; + std::string organization () const; + std::string country () const; + /*** Editing ***/ void set_comment (const std::string &); void set_copyright (const std::string &); @@ -104,15 +116,28 @@ class SessionMetadata : public PBD::StatefulDestructible void set_genre (const std::string &); + void set_instructor (const std::string &); + void set_course (const std::string &); + + void set_user_name (const std::string &); + void set_user_email (const std::string &); + void set_user_web (const std::string &); + void set_organization (const std::string &); + void set_country (const std::string &); + /*** Serialization ***/ - XMLNode & get_state (); - int set_state (const XMLNode &, int version); + XMLNode & get_state (); //serializes stuff in the map, to be stored in session file + XMLNode & get_user_state (); //serializes stuff in the user_map, to be stored in user's config file + int set_state (const XMLNode &, int version_num); private: + static SessionMetadata *_metadata; //singleton instance + typedef std::pair<std::string, std::string> Property; typedef std::map<std::string, std::string> PropertyMap; PropertyMap map; + PropertyMap user_map; XMLNode * get_xml (const std::string & name); diff --git a/libs/ardour/broadcast_info.cc b/libs/ardour/broadcast_info.cc index cdc63cae11..af760629ff 100644 --- a/libs/ardour/broadcast_info.cc +++ b/libs/ardour/broadcast_info.cc @@ -28,6 +28,7 @@ #include "ardour/svn_revision.h" #include "ardour/ardour.h" #include "ardour/session.h" +#include "ardour/session_metadata.h" #include "pbd/convert.h" @@ -94,8 +95,8 @@ BroadcastInfo::set_originator_ref_from_session (Session const & session) serial_number << "ARDOUR" << "r" << std::setfill('0') << std::right << std::setw(5) << svn_revision; snprintf_bounded_null_filled (info->originator_reference, sizeof (info->originator_reference), "%2s%3s%12s%02d%02d%02d%9d", - session.config.get_bwf_country_code().c_str(), - session.config.get_bwf_organization_code().c_str(), + SessionMetadata::Metadata()->country().c_str(), + SessionMetadata::Metadata()->organization().c_str(), serial_number.str().c_str(), _time.tm_hour, _time.tm_min, diff --git a/libs/ardour/rc_configuration.cc b/libs/ardour/rc_configuration.cc index 8c4650b2e6..d5bfc7a9a8 100644 --- a/libs/ardour/rc_configuration.cc +++ b/libs/ardour/rc_configuration.cc @@ -36,6 +36,7 @@ #include "ardour/audio_diskstream.h" #include "ardour/control_protocol_manager.h" #include "ardour/filesystem_paths.h" +#include "ardour/session_metadata.h" #include "i18n.h" @@ -208,6 +209,8 @@ RCConfiguration::get_state () root->add_child_nocopy (get_variables ()); + root->add_child_nocopy (SessionMetadata::Metadata()->get_user_state()); + if (_extra_xml) { root->add_child_copy (*_extra_xml); } @@ -239,7 +242,7 @@ RCConfiguration::get_variables () } int -RCConfiguration::set_state (const XMLNode& root, int /*version*/) +RCConfiguration::set_state (const XMLNode& root, int version) { if (root.name() != "Ardour") { return -1; @@ -263,6 +266,8 @@ RCConfiguration::set_state (const XMLNode& root, int /*version*/) if (node->name() == "Config") { set_variables (*node); + } else if (node->name() == "Metadata") { + SessionMetadata::Metadata()->set_state (*node, version); } else if (node->name() == ControlProtocolManager::state_node_name) { _control_protocol_state = new XMLNode (*node); } else if (node->name() == MIDI::Port::state_node_name) { diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 152113aa83..a7fc6740c2 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -94,7 +94,6 @@ #include "ardour/session.h" #include "ardour/session_directory.h" #include "ardour/session_directory.h" -#include "ardour/session_metadata.h" #include "ardour/session_playlists.h" #include "ardour/slave.h" #include "ardour/smf_source.h" @@ -162,7 +161,6 @@ Session::Session (AudioEngine &eng, , click_data (0) , click_emphasis_data (0) , main_outs (0) - , _metadata (new SessionMetadata()) , _have_rec_enabled_track (false) , _suspend_timecode_transmission (0) { diff --git a/libs/ardour/session_metadata.cc b/libs/ardour/session_metadata.cc index 51dba7ceff..8e2a4ca057 100644 --- a/libs/ardour/session_metadata.cc +++ b/libs/ardour/session_metadata.cc @@ -26,6 +26,8 @@ using namespace std; using namespace Glib; using namespace ARDOUR; +SessionMetadata *SessionMetadata::_metadata = NULL; //singleton instance + SessionMetadata::SessionMetadata () { /*** General ***/ @@ -53,6 +55,10 @@ SessionMetadata::SessionMetadata () map.insert (Property ("mixer", "")); //map.insert (Property ("performers", "")); // Multiple values [instrument] + /*** Education... ***/ + map.insert (Property ("instructor", "")); + map.insert (Property ("course", "")); + /*** Album info ***/ map.insert (Property ("album", "")); map.insert (Property ("compilation", "")); @@ -79,7 +85,14 @@ SessionMetadata::SessionMetadata () //map.insert (Property ("album_sort", "")); //map.insert (Property ("album_artist_sort", "")); //map.insert (Property ("artist_sort", "")); - //map.insert (Property ("title_sort", "")); + //map.insert (Property ("title_sort", ""));\ + + /*** Globals ***/ + user_map.insert (Property ("user_name", "")); + user_map.insert (Property ("user_email", "")); + user_map.insert (Property ("user_web", "")); + user_map.insert (Property ("user_organization", "")); + user_map.insert (Property ("user_country", "")); } SessionMetadata::~SessionMetadata () @@ -107,9 +120,12 @@ SessionMetadata::get_value (const string & name) const { PropertyMap::const_iterator it = map.find (name); if (it == map.end()) { - // Should not be reached! - std::cerr << "Programming error in SessionMetadata::get_value" << std::endl; - return ""; + it = user_map.find (name); + if (it == user_map.end()) { + // Should not be reached! + std::cerr << "Programming error in SessionMetadata::get_value" << std::endl; + return ""; + } } return it->second; @@ -126,9 +142,12 @@ SessionMetadata::set_value (const string & name, const string & value) { PropertyMap::iterator it = map.find (name); if (it == map.end()) { - // Should not be reached! - std::cerr << "Programming error in SessionMetadata::set_value" << std::endl; - return; + it = user_map.find (name); + if (it == user_map.end()) { + // Should not be reached! + std::cerr << "Programming error in SessionMetadata::set_value" << std::endl; + return; + } } it->second = value; @@ -163,7 +182,7 @@ SessionMetadata::get_state () } int -SessionMetadata::set_state (const XMLNode & state, int /*version*/) +SessionMetadata::set_state (const XMLNode & state, int version_num) { const XMLNodeList & children = state.children(); string name; @@ -186,6 +205,22 @@ SessionMetadata::set_state (const XMLNode & state, int /*version*/) return 0; } + +XMLNode & +SessionMetadata::get_user_state () +{ + XMLNode * node = new XMLNode ("Metadata"); + XMLNode * prop; + + for (PropertyMap::const_iterator it = user_map.begin(); it != user_map.end(); ++it) { + if ((prop = get_xml (it->first))) { + node->add_child_nocopy (*prop); + } + } + + return *node; +} + /*** Accessing ***/ string SessionMetadata::comment () const @@ -343,6 +378,51 @@ SessionMetadata::genre () const return get_value("genre"); } +string +SessionMetadata::instructor () const +{ + return get_value("instructor"); +} + +string +SessionMetadata::course () const +{ + return get_value("course"); +} + + +string +SessionMetadata::user_name () const +{ + return get_value("user_name"); +} + +string +SessionMetadata::user_email () const +{ + return get_value("user_email"); +} + +string +SessionMetadata::user_web () const +{ + return get_value("user_web"); +} + +string +SessionMetadata::organization () const +{ + return get_value("user_organization"); +} + +string +SessionMetadata::country () const +{ + return get_value("user_country"); +} + + + /*** Editing ***/ void SessionMetadata::set_comment (const string & v) @@ -499,3 +579,44 @@ SessionMetadata::set_genre (const string & v) { set_value ("genre", v); } + +void +SessionMetadata::set_instructor (const string & v) +{ + set_value ("instructor", v); +} + +void +SessionMetadata::set_course (const string & v) +{ + set_value ("course", v); +} + +void +SessionMetadata::set_user_name (const string & v) +{ + set_value ("user_name", v); +} + +void +SessionMetadata::set_user_email (const string & v) +{ + set_value ("user_email", v); +} + +void +SessionMetadata::set_user_web (const string & v) +{ + set_value ("user_web", v); +} + +void +SessionMetadata::set_organization (const string & v) +{ + set_value ("user_organization", v); +} +void +SessionMetadata::set_country (const string & v) +{ + set_value ("user_country", v); +} diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 218f70cd5b..efde3e2f4e 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -566,10 +566,6 @@ Session::create (const string& session_template, BusProfile* bus_profile) } - /* Instantiate metadata */ - - _metadata = new SessionMetadata (); - /* set initial start + end point */ _state_of_the_state = Clean; @@ -1058,7 +1054,7 @@ Session::state(bool full_state) node->add_child_nocopy (config.get_variables ()); - node->add_child_nocopy (_metadata->get_state()); + node->add_child_nocopy (ARDOUR::SessionMetadata::Metadata()->get_state()); child = node->add_child ("Sources"); @@ -1275,7 +1271,7 @@ Session::set_state (const XMLNode& node, int version) if (version >= 3000) { if ((child = find_named_node (node, "Metadata")) == 0) { warning << _("Session: XML state has no metadata section") << endmsg; - } else if (_metadata->set_state (*child, version)) { + } else if ( ARDOUR::SessionMetadata::Metadata()->set_state (*child, version) ) { goto out; } } |