major fixes to automation editing
[ardour.git] / libs / ardour / audio_library.cc
index 33a1ad230e6de130410608c107c1d140bd569231..3aa6d05be1fea88bc087318d349829c1583e8ab8 100644 (file)
 
 using namespace std;
 using namespace ARDOUR;
+using namespace PBD;
 
 static char* SOUNDFILE = "http://ardour.org/ontology/Soundfile";
 
+string AudioLibrary::state_node_name = "AudioLibrary";
+
 AudioLibrary::AudioLibrary ()
 {
 //     sfdb_paths.push_back("/Users/taybin/sounds");
 
-       src = "file:" + Config->get_user_ardour_path() + "sfdb";
+       src = "file:" + get_user_ardour_path() + "sfdb";
 
        // workaround for possible bug in raptor that crashes when saving to a
        // non-existant file.
-       touch_file(Config->get_user_ardour_path() + "sfdb");
+       touch_file(get_user_ardour_path() + "sfdb");
 
        lrdf_read_file(src.c_str());
 
@@ -73,8 +76,6 @@ AudioLibrary::AudioLibrary ()
        } 
 
        lrdf_free_statements(matches);
-
-       scan_paths();
 }
 
 AudioLibrary::~AudioLibrary ()
@@ -355,6 +356,8 @@ void
 AudioLibrary::set_paths (vector<string> paths)
 {
        sfdb_paths = paths;
+       
+       scan_paths ();
 }
 
 vector<string> 
@@ -428,5 +431,50 @@ AudioLibrary::safe_file_extension(string file)
         file.rfind(".maud")== string::npos &&
         file.rfind(".vwe") == string::npos &&
         file.rfind(".paf") == string::npos &&
+#ifdef HAVE_COREAUDIO
+       file.rfind(".mp3") == string::npos &&
+       file.rfind(".aac") == string::npos &&
+       file.rfind(".mp4") == string::npos &&
+#endif // HAVE_COREAUDIO
         file.rfind(".voc") == string::npos);
 }
+
+XMLNode&
+AudioLibrary::get_state ()
+{
+       XMLNode* root = new XMLNode(X_("AudioLibrary"));
+       
+       for (vector<string>::iterator i = sfdb_paths.begin(); i != sfdb_paths.end(); ++i) {
+               XMLNode* node = new XMLNode(X_("Path"));
+               node->add_property("value", *i);
+               root->add_child_nocopy(*node);
+       }
+       
+       return *root;
+}
+
+int
+AudioLibrary::set_state (const XMLNode& node)
+{
+       if (node.name() != X_("AudioLibrary")) {
+               fatal << "programming error: AudioLibrary: incorrect XML node sent to set_state()" << endmsg;
+               return -1;
+       }
+       
+       XMLNodeList nodes = node.children(X_("Path"));
+       
+       vector<string> paths;
+       XMLProperty* prop;
+       XMLNode* child;
+       for (XMLNodeConstIterator iter = nodes.begin(); iter != nodes.end(); ++iter) {
+               child = *iter;
+               
+               if ((prop = child->property(X_("value"))) != 0) {
+                       paths.push_back(prop->value());
+               }
+       }
+       
+       set_paths (paths);
+       
+       return 0;
+}