2 Copyright (C) 2008 Paul Davis
5 This program is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2 of the License, or (at your option)
10 This program is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 675 Mass Ave, Cambridge, MA 02139, USA.
20 #include "ardour/session_metadata.h"
27 using namespace ARDOUR;
29 SessionMetadata *SessionMetadata::_metadata = NULL; //singleton instance
31 SessionMetadata::SessionMetadata ()
34 map.insert (Property ("description", ""));
36 /*** Track/Song Data ***/
37 map.insert (Property ("comment", ""));
38 map.insert (Property ("copyright", ""));
39 map.insert (Property ("isrc", ""));
40 map.insert (Property ("year", ""));
42 /*** Title and friends ***/
43 map.insert (Property ("grouping", ""));
44 map.insert (Property ("title", ""));
45 map.insert (Property ("subtitle", ""));
48 map.insert (Property ("artist", ""));
49 map.insert (Property ("album_artist", ""));
50 map.insert (Property ("lyricist", ""));
51 map.insert (Property ("composer", ""));
52 map.insert (Property ("conductor", ""));
53 map.insert (Property ("remixer", ""));
54 map.insert (Property ("arranger", ""));
55 map.insert (Property ("engineer", ""));
56 map.insert (Property ("producer", ""));
57 map.insert (Property ("dj_mixer", ""));
58 map.insert (Property ("mixer", ""));
59 //map.insert (Property ("performers", "")); // Multiple values [instrument]
61 /*** Education... ***/
62 map.insert (Property ("instructor", ""));
63 map.insert (Property ("course", ""));
66 map.insert (Property ("album", ""));
67 map.insert (Property ("compilation", ""));
68 map.insert (Property ("disc_subtitle", ""));
69 map.insert (Property ("disc_number", ""));
70 map.insert (Property ("total_discs", ""));
71 map.insert (Property ("track_number", ""));
72 map.insert (Property ("total_tracks", ""));
75 map.insert (Property ("genre", ""));
76 //map.insert (Property ("mood", ""));
77 //map.insert (Property ("bpm", ""));
80 //map.insert (Property ("lyrics", ""));
81 //map.insert (Property ("media", ""));
82 //map.insert (Property ("label", ""));
83 map.insert (Property ("barcode", ""));
84 //map.insert (Property ("encoded_by", ""));
85 //map.insert (Property ("catalog_number", ""));
87 /*** Sorting orders ***/
88 //map.insert (Property ("album_sort", ""));
89 //map.insert (Property ("album_artist_sort", ""));
90 //map.insert (Property ("artist_sort", ""));
91 //map.insert (Property ("title_sort", ""));
94 user_map.insert (Property ("user_name", ""));
95 user_map.insert (Property ("user_email", ""));
96 user_map.insert (Property ("user_web", ""));
97 user_map.insert (Property ("user_organization", ""));
98 user_map.insert (Property ("user_country", ""));
101 SessionMetadata::~SessionMetadata ()
107 SessionMetadata::get_xml (const string & name)
109 string value = get_value (name);
114 XMLNode val ("value", value);
115 XMLNode * node = new XMLNode (name);
116 node->add_child_copy (val);
122 SessionMetadata::get_value (const string & name) const
124 PropertyMap::const_iterator it = map.find (name);
125 if (it == map.end()) {
126 it = user_map.find (name);
127 if (it == user_map.end()) {
128 // Should not be reached, except if loading metadata from a newer version with a new type
129 std::cerr << "Programming error in SessionMetadata::get_value (" << name << ")" << std::endl;
138 SessionMetadata::get_uint_value (const string & name) const
140 return atoi (get_value (name).c_str());
144 SessionMetadata::set_value (const string & name, const string & value)
146 PropertyMap::iterator it = map.find (name);
147 if (it == map.end()) {
148 it = user_map.find (name);
149 if (it == user_map.end()) {
150 // Should not be reached, except if loading metadata from a newer version with a new type
151 std::cerr << "Programming error in SessionMetadata::set_value (" << name << ")" << std::endl;
160 SessionMetadata::set_value (const string & name, uint32_t value)
162 std::ostringstream oss;
164 if (oss.str().compare("0")) {
165 set_value (name, oss.str());
167 set_value (name, "");
171 /*** Serialization ***/
173 SessionMetadata::get_state ()
175 XMLNode * node = new XMLNode ("Metadata");
178 for (PropertyMap::const_iterator it = map.begin(); it != map.end(); ++it) {
179 if ((prop = get_xml (it->first))) {
180 node->add_child_nocopy (*prop);
188 SessionMetadata::set_state (const XMLNode & state, int /*version_num*/)
190 const XMLNodeList & children = state.children();
195 for (XMLNodeConstIterator it = children.begin(); it != children.end(); it++) {
197 if (node->children().empty()) {
202 node = *node->children().begin();
203 value = node->content();
205 set_value (name, value);
213 SessionMetadata::get_user_state ()
215 XMLNode * node = new XMLNode ("Metadata");
218 for (PropertyMap::const_iterator it = user_map.begin(); it != user_map.end(); ++it) {
219 if ((prop = get_xml (it->first))) {
220 node->add_child_nocopy (*prop);
229 SessionMetadata::description () const
231 return get_value("description");
235 SessionMetadata::comment () const
237 return get_value("comment");
241 SessionMetadata::copyright () const
243 return get_value("copyright");
247 SessionMetadata::isrc () const
249 return get_value("isrc");
253 SessionMetadata::year () const
255 return get_uint_value("year");
259 SessionMetadata::grouping () const
261 return get_value("grouping");
265 SessionMetadata::barcode () const
267 return get_value("barcode");
271 SessionMetadata::title () const
273 return get_value("title");
277 SessionMetadata::subtitle () const
279 return get_value("subtitle");
283 SessionMetadata::artist () const
285 return get_value("artist");
289 SessionMetadata::album_artist () const
291 return get_value("album_artist");
295 SessionMetadata::lyricist () const
297 return get_value("lyricist");
301 SessionMetadata::composer () const
303 return get_value("composer");
307 SessionMetadata::conductor () const
309 return get_value("conductor");
313 SessionMetadata::remixer () const
315 return get_value("remixer");
319 SessionMetadata::arranger () const
321 return get_value("arranger");
325 SessionMetadata::engineer () const
327 return get_value("engineer");
331 SessionMetadata::producer () const
333 return get_value("producer");
337 SessionMetadata::dj_mixer () const
339 return get_value("dj_mixer");
343 SessionMetadata::mixer () const
345 return get_value("mixer");
349 SessionMetadata::album () const
351 return get_value("album");
355 SessionMetadata::compilation () const
357 return get_value("compilation");
361 SessionMetadata::disc_subtitle () const
363 return get_value("disc_subtitle");
367 SessionMetadata::disc_number () const
369 return get_uint_value("disc_number");
373 SessionMetadata::total_discs () const
375 return get_uint_value("total_discs");
379 SessionMetadata::track_number () const
381 return get_uint_value("track_number");
385 SessionMetadata::total_tracks () const
387 return get_uint_value("total_tracks");
391 SessionMetadata::genre () const
393 return get_value("genre");
397 SessionMetadata::instructor () const
399 return get_value("instructor");
403 SessionMetadata::course () const
405 return get_value("course");
410 SessionMetadata::user_name () const
412 return get_value("user_name");
416 SessionMetadata::user_email () const
418 return get_value("user_email");
422 SessionMetadata::user_web () const
424 return get_value("user_web");
428 SessionMetadata::organization () const
430 return get_value("user_organization");
434 SessionMetadata::country () const
436 return get_value("user_country");
443 SessionMetadata::set_description (const string & v)
445 set_value ("description", v);
449 SessionMetadata::set_comment (const string & v)
451 set_value ("comment", v);
455 SessionMetadata::set_copyright (const string & v)
457 set_value ("copyright", v);
461 SessionMetadata::set_isrc (const string & v)
463 set_value ("isrc", v);
467 SessionMetadata::set_year (uint32_t v)
469 set_value ("year", v);
473 SessionMetadata::set_grouping (const string & v)
475 set_value ("grouping", v);
479 SessionMetadata::set_barcode (const string & v)
481 set_value ("barcode", v);
485 SessionMetadata::set_title (const string & v)
487 set_value ("title", v);
491 SessionMetadata::set_subtitle (const string & v)
493 set_value ("subtitle", v);
497 SessionMetadata::set_artist (const string & v)
499 set_value ("artist", v);
503 SessionMetadata::set_album_artist (const string & v)
505 set_value ("album_artist", v);
509 SessionMetadata::set_lyricist (const string & v)
511 set_value ("lyricist", v);
515 SessionMetadata::set_composer (const string & v)
517 set_value ("composer", v);
521 SessionMetadata::set_conductor (const string & v)
523 set_value ("conductor", v);
527 SessionMetadata::set_remixer (const string & v)
529 set_value ("remixer", v);
533 SessionMetadata::set_arranger (const string & v)
535 set_value ("arranger", v);
539 SessionMetadata::set_engineer (const string & v)
541 set_value ("engineer", v);
545 SessionMetadata::set_producer (const string & v)
547 set_value ("producer", v);
551 SessionMetadata::set_dj_mixer (const string & v)
553 set_value ("dj_mixer", v);
557 SessionMetadata::set_mixer (const string & v)
559 set_value ("mixer", v);
563 SessionMetadata::set_album (const string & v)
565 set_value ("album", v);
569 SessionMetadata::set_compilation (const string & v)
571 set_value ("compilation", v);
575 SessionMetadata::set_disc_subtitle (const string & v)
577 set_value ("disc_subtitle", v);
581 SessionMetadata::set_disc_number (uint32_t v)
583 set_value ("disc_number", v);
587 SessionMetadata::set_total_discs (uint32_t v)
589 set_value ("total_discs", v);
593 SessionMetadata::set_track_number (uint32_t v)
595 set_value ("track_number", v);
599 SessionMetadata::set_total_tracks (uint32_t v)
601 set_value ("total_tracks", v);
605 SessionMetadata::set_genre (const string & v)
607 set_value ("genre", v);
611 SessionMetadata::set_instructor (const string & v)
613 set_value ("instructor", v);
617 SessionMetadata::set_course (const string & v)
619 set_value ("course", v);
623 SessionMetadata::set_user_name (const string & v)
625 set_value ("user_name", v);
629 SessionMetadata::set_user_email (const string & v)
631 set_value ("user_email", v);
635 SessionMetadata::set_user_web (const string & v)
637 set_value ("user_web", v);
641 SessionMetadata::set_organization (const string & v)
643 set_value ("user_organization", v);
646 SessionMetadata::set_country (const string & v)
648 set_value ("user_country", v);