summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/session_metadata_dialog.cc72
-rw-r--r--gtk2_ardour/session_metadata_dialog.h4
-rw-r--r--gtk2_ardour/session_option_editor.cc16
-rw-r--r--libs/ardour/ardour/session.h4
-rw-r--r--libs/ardour/ardour/session_configuration_vars.h2
-rw-r--r--libs/ardour/ardour/session_metadata.h29
-rw-r--r--libs/ardour/broadcast_info.cc5
-rw-r--r--libs/ardour/rc_configuration.cc7
-rw-r--r--libs/ardour/session.cc2
-rw-r--r--libs/ardour/session_metadata.cc137
-rw-r--r--libs/ardour/session_state.cc8
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;
}
}