+ save_user ();
+}
+
+void
+OSC_GUI::set_bitsets ()
+{
+ if (preset_busy) {
+ return;
+ }
+ calculate_strip_types ();
+ calculate_feedback ();
+ push_strip_types ();
+ push_feedback ();
+}
+
+void
+OSC_GUI::scan_preset_files ()
+{
+ std::vector<std::string> presets;
+ Searchpath spath (preset_search_path());
+
+ find_files_matching_filter (presets, spath, preset_filter, 0, false, true);
+ //device_profiles.clear ();preset_list.clear // first two entries already there
+
+ if (presets.empty()) {
+ error << "No OSC preset files found using " << spath.to_string() << endmsg;
+ return;
+ }
+
+ for (std::vector<std::string>::iterator i = presets.begin(); i != presets.end(); ++i) {
+ std::string fullpath = *i;
+ //DeviceProfile dp; // has to be initial every loop or info from last added.
+
+ XMLTree tree;
+
+ if (!tree.read (fullpath.c_str())) {
+ continue;
+ }
+
+ XMLNode* root = tree.root ();
+ if (!root) {
+ continue;
+ }
+ const XMLProperty* prop;
+ const XMLNode* child;
+
+ if (root->name() != "OSCPreset") {
+ continue;
+ }
+
+ if ((child = root->child ("Name")) == 0 || (prop = child->property ("value")) == 0) {
+ continue;
+ } else {
+ if (prop->value() == "User") {
+ // We already added user but no file name
+ preset_files[prop->value()] = fullpath;
+ } else if (preset_files.find(prop->value()) == preset_files.end()) {
+ preset_options.push_back (prop->value());
+ preset_files[prop->value()] = fullpath;
+ }
+ }
+
+ }
+}
+
+void
+OSC_GUI::save_user ()
+{
+ if (preset_busy) {
+ return;
+ }
+ preset_combo.set_active (2);
+ std::string fullpath = user_preset_directory();
+
+ if (g_mkdir_with_parents (fullpath.c_str(), 0755) < 0) {
+ error << string_compose(_("Session: cannot create user MCP profile folder \"%1\" (%2)"), fullpath, strerror (errno)) << endmsg;
+ return;
+ }
+
+ fullpath = Glib::build_filename (fullpath, string_compose ("%1%2", legalize_for_path ("user"), preset_suffix));
+
+ XMLNode* node = new XMLNode ("OSCPreset");
+ XMLNode* child = new XMLNode ("Name");
+
+ child->add_property ("value", "User");
+ node->add_child_nocopy (*child);
+
+ child = new XMLNode ("PortMode");
+ child->add_property ("value", cp.get_portmode());
+ node->add_child_nocopy (*child);
+
+ child = new XMLNode ("Remote-Port");
+ child->add_property ("value", cp.get_remote_port());
+ node->add_child_nocopy (*child);
+
+ child = new XMLNode ("Bank-Size");
+ child->add_property ("value", cp.get_banksize());
+ node->add_child_nocopy (*child);
+
+ child = new XMLNode ("Strip-Types");
+ child->add_property ("value", cp.get_defaultstrip());
+ node->add_child_nocopy (*child);
+
+ child = new XMLNode ("Feedback");
+ child->add_property ("value", cp.get_defaultfeedback());
+ node->add_child_nocopy (*child);
+
+ child = new XMLNode ("Gain-Mode");
+ child->add_property ("value", cp.get_gainmode());
+ node->add_child_nocopy (*child);
+
+ XMLTree tree;
+ tree.set_root (node);
+
+ if (!tree.write (fullpath)) {
+ error << string_compose ("MCP profile not saved to %1", fullpath) << endmsg;
+ }
+
+}
+
+void
+OSC_GUI::load_preset (std::string preset)
+{
+ if (preset == "User" && preset_files["User"] == "") {
+ restore_sesn_values ();
+ } else if (preset_files.find(preset) != preset_files.end()) {
+ XMLTree tree;
+
+ if (!tree.read (preset_files[preset])) {
+ std::cerr << "preset file not found " << preset_files[preset] << "\n";
+ return;
+ }
+
+ XMLNode* root = tree.root ();
+ if (!root) {
+ std::cerr << "invalid preset file " << preset_files[preset] << "\n";
+ return;
+ }
+ const XMLProperty* prop;
+ const XMLNode* child;
+
+ if (root->name() != "OSCPreset") {
+ std::cerr << "invalid preset file " << preset_files[preset] << "\n";
+ return;
+ }
+
+ if ((child = root->child ("Name")) == 0 || (prop = child->property ("value")) == 0) {
+ std::cerr << "preset file missing Name " << preset_files[preset] << "\n";
+ return;
+ }
+ if ((child = root->child ("PortMode")) == 0 || (prop = child->property ("value")) == 0) {
+ cp.set_portmode (sesn_portmode);
+ portmode_combo.set_active (sesn_portmode);
+ } else {
+ cp.set_portmode (atoi (prop->value().c_str()));
+ portmode_combo.set_active (atoi (prop->value().c_str()));
+ }
+ if ((child = root->child ("Remote-Port")) == 0 || (prop = child->property ("value")) == 0) {
+ cp.set_remote_port (sesn_port);
+ port_entry.set_text (sesn_port);
+ } else {
+ cp.set_remote_port (prop->value());
+ port_entry.set_text (prop->value());
+ }
+ if ((child = root->child ("Bank-Size")) == 0 || (prop = child->property ("value")) == 0) {
+ cp.set_banksize (sesn_bank);
+ bank_entry.set_value (sesn_bank);
+ } else {
+ cp.set_banksize (atoi (prop->value().c_str()));
+ bank_entry.set_value (atoi (prop->value().c_str()));
+ }
+ if ((child = root->child ("Strip-Types")) == 0 || (prop = child->property ("value")) == 0) {
+ cp.set_defaultstrip (sesn_strips);
+ } else {
+ cp.set_defaultstrip (atoi (prop->value().c_str()));
+ }
+ if ((child = root->child ("Feedback")) == 0 || (prop = child->property ("value")) == 0) {
+ cp.set_defaultfeedback (sesn_feedback);
+ } else {
+ cp.set_defaultfeedback (atoi (prop->value().c_str()));
+ }
+ reshow_values (); // show strip types and feed back in GUI
+
+ if ((child = root->child ("Gain-Mode")) == 0 || (prop = child->property ("value")) == 0) {
+ cp.set_gainmode (sesn_gainmode);
+ gainmode_combo.set_active (sesn_gainmode);
+ } else {
+ cp.set_gainmode (atoi (prop->value().c_str()));
+ gainmode_combo.set_active (atoi (prop->value().c_str()));
+ }
+
+ }
+}
+
+void
+OSC_GUI::get_session ()
+{
+ sesn_portmode = cp.get_portmode ();
+ sesn_port = cp.get_remote_port ();
+ sesn_bank = cp.get_banksize ();
+ sesn_strips = cp.get_defaultstrip ();
+ sesn_feedback = cp.get_defaultfeedback ();
+ sesn_gainmode = cp.get_gainmode ();
+}
+
+void
+OSC_GUI::restore_sesn_values ()
+{
+ cp.set_portmode (sesn_portmode);
+ portmode_combo.set_active (sesn_portmode);
+ cp.set_remote_port (sesn_port);
+ port_entry.set_text (sesn_port);
+ cp.set_banksize (sesn_bank);
+ bank_entry.set_value (sesn_bank);
+ cp.set_defaultstrip (sesn_strips);
+ cp.set_defaultfeedback (sesn_feedback);
+ reshow_values ();
+ cp.set_gainmode (sesn_gainmode);
+ gainmode_combo.set_active (sesn_gainmode);