full compilation and linking (coding not finished, will not run)
[ardour.git] / libs / ardour / session_state.cc
index 51f6f1352c321cc9e83bbaa5b9a07076938d79d6..cae3b9720acf7233030d13206066a4617a45de63 100644 (file)
@@ -136,7 +136,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
 
        char buf[PATH_MAX+1];
        if (!realpath (fullpath.c_str(), buf) && (errno != ENOENT)) {
-               error << string_compose(_("Could not use path %1 (%s)"), buf, strerror(errno)) << endmsg;
+               error << string_compose(_("Could not use path %1 (%2)"), buf, strerror(errno)) << endmsg;
                destroy ();
                throw failed_constructor();
        }
@@ -155,7 +155,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
 
        set_history_depth (Config->get_history_depth());
 
-       _current_frame_rate = _engine.frame_rate ();
+       _current_frame_rate = _engine.sample_rate ();
        _nominal_frame_rate = _current_frame_rate;
        _base_frame_rate = _current_frame_rate;
 
@@ -206,6 +206,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
        _play_range = false;
        _exporting = false;
        pending_abort = false;
+       _adding_routes_in_progress = false;
        destructive_index = 0;
        first_file_data_format_reset = true;
        first_file_header_format_reset = true;
@@ -366,6 +367,7 @@ Session::second_stage_init ()
 
        MIDI::Name::MidiPatchManager::instance().set_session (this);
 
+       ltc_tx_initialize();
        /* initial program change will be delivered later; see ::config_changed() */
 
        _state_of_the_state = Clean;
@@ -683,7 +685,7 @@ Session::remove_state (string snapshot_name)
 
        // and delete it
        if (g_remove (xml_path.c_str()) != 0) {
-               error << string_compose(_("Could not remove state file at path \"%1\" (%2)"),
+               error << string_compose(_("Could not remove session file at path \"%1\" (%2)"),
                                xml_path, g_strerror (errno)) << endmsg;
        }
 }
@@ -692,7 +694,7 @@ Session::remove_state (string snapshot_name)
 void
 Session::jack_session_event (jack_session_event_t * event)
 {
-        char timebuf[128];
+        char timebuf[128], *tmp;
         time_t n;
         struct tm local_time;
 
@@ -700,6 +702,8 @@ Session::jack_session_event (jack_session_event_t * event)
         localtime_r (&n, &local_time);
         strftime (timebuf, sizeof(timebuf), "JS_%FT%T", &local_time);
 
+        while ((tmp = strchr(timebuf, ':'))) { *tmp = '.'; }
+
         if (event->type == JackSessionSaveTemplate)
         {
                 if (save_template( timebuf )) {
@@ -732,7 +736,15 @@ Session::jack_session_event (jack_session_event_t * event)
                 }
         }
 
-       jack_session_reply (_engine.jack(), event);
+       /* this won't be called if the port engine in use is not JACK, so we do 
+          not have to worry about the type of PortEngine::private_handle()
+       */
+
+       jack_client_t* jack_client = (jack_client_t*) AudioEngine::instance()->port_engine().private_handle();
+       
+       if (jack_client) {
+               jack_session_reply (jack_client, event);
+       }
 
        if (event->type == JackSessionSaveAndQuit) {
                Quit (); /* EMIT SIGNAL */
@@ -770,6 +782,8 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
                }
        }
 
+       SaveSession (); /* EMIT SIGNAL */
+
        tree.set_root (&get_state());
 
        if (snapshot_name.empty()) {
@@ -805,7 +819,7 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
        if (!tree.write (tmp_path)) {
                error << string_compose (_("state could not be saved to %1"), tmp_path) << endmsg;
                if (g_remove (tmp_path.c_str()) != 0) {
-                       error << string_compose(_("Could not remove temporary state file at path \"%1\" (%2)"),
+                       error << string_compose(_("Could not remove temporary session file at path \"%1\" (%2)"),
                                        tmp_path, g_strerror (errno)) << endmsg;
                }
                return -1;
@@ -816,7 +830,7 @@ Session::save_state (string snapshot_name, bool pending, bool switch_to_snapshot
                        error << string_compose (_("could not rename temporary session file %1 to %2"),
                                        tmp_path, xml_path) << endmsg;
                        if (g_remove (tmp_path.c_str()) != 0) {
-                               error << string_compose(_("Could not remove temporary state file at path \"%1\" (%2)"),
+                               error << string_compose(_("Could not remove temporary session file at path \"%1\" (%2)"),
                                                tmp_path, g_strerror (errno)) << endmsg;
                        }
                        return -1;
@@ -881,7 +895,7 @@ Session::load_state (string snapshot_name)
        if (!Glib::file_test (xmlpath, Glib::FILE_TEST_EXISTS)) {
                xmlpath = Glib::build_filename (_session_dir->root_path(), legalize_for_path (snapshot_name) + statefile_suffix);
                if (!Glib::file_test (xmlpath, Glib::FILE_TEST_EXISTS)) {
-                        error << string_compose(_("%1: session state information file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
+                        error << string_compose(_("%1: session file \"%2\" doesn't exist!"), _name, xmlpath) << endmsg;
                         return 1;
                 }
         }
@@ -893,7 +907,7 @@ Session::load_state (string snapshot_name)
        _writable = exists_and_writable (xmlpath);
 
        if (!state_tree->read (xmlpath)) {
-               error << string_compose(_("Could not understand ardour file %1"), xmlpath) << endmsg;
+               error << string_compose(_("Could not understand session file %1"), xmlpath) << endmsg;
                delete state_tree;
                state_tree = 0;
                return -1;
@@ -936,9 +950,7 @@ Session::load_state (string snapshot_name)
 
                if (!Glib::file_test (backup_path, Glib::FILE_TEST_EXISTS)) {
                        
-                       info << string_compose (_("Copying old session file %1 to %2\nUse %2 with %3 versions before 2.0 from now on"),
-                                               xmlpath, backup_path, PROGRAM_NAME)
-                            << endmsg;
+                       VersionMismatch (xmlpath, backup_path);
                        
                        if (!copy_file (xmlpath, backup_path)) {;
                                return -1;
@@ -1076,7 +1088,11 @@ Session::state (bool full_state)
                         boost::shared_ptr<Region> r = i->second;
                         /* only store regions not attached to playlists */
                         if (r->playlist() == 0) {
-                                child->add_child_nocopy (r->state ());
+                               if (boost::dynamic_pointer_cast<AudioRegion>(r)) {
+                                       child->add_child_nocopy ((boost::dynamic_pointer_cast<AudioRegion>(r))->get_basic_state ());
+                               } else {
+                                       child->add_child_nocopy (r->get_state ());
+                               }
                         }
                 }
 
@@ -1135,7 +1151,7 @@ Session::state (bool full_state)
                 }
 
                for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
-                       if (!(*i)->is_hidden()) {
+                       if (!(*i)->is_auditioner()) {
                                if (full_state) {
                                        child->add_child_nocopy ((*i)->get_state());
                                } else {
@@ -1158,6 +1174,16 @@ Session::state (bool full_state)
                gain_child->add_child_nocopy (_click_gain->state (full_state));
        }
 
+       if (_ltc_input) {
+               XMLNode* ltc_input_child = node->add_child ("LTC-In");
+               ltc_input_child->add_child_nocopy (_ltc_input->state (full_state));
+       }
+
+       if (_ltc_input) {
+               XMLNode* ltc_output_child = node->add_child ("LTC-Out");
+               ltc_output_child->add_child_nocopy (_ltc_output->state (full_state));
+       }
+
         node->add_child_nocopy (_speakers->get_state());
        node->add_child_nocopy (_tempo_map->get_state());
        node->add_child_nocopy (get_control_protocol_state());
@@ -1647,7 +1673,7 @@ Session::load_nested_sources (const XMLNode& node)
 
                        XMLProperty* prop = (*niter)->property (X_("id"));
                        if (!prop) {
-                               error << _("Nested source has no ID info in session state file! (ignored)") << endmsg;
+                               error << _("Nested source has no ID info in session file! (ignored)") << endmsg;
                                continue;
                        }
 
@@ -2064,7 +2090,7 @@ Session::save_template (string template_name)
 void
 Session::refresh_disk_space ()
 {
-#if HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H
+#if __APPLE__ || (HAVE_SYS_VFS_H && HAVE_SYS_STATVFS_H)
        
        Glib::Threads::Mutex::Lock lm (space_lock);
 
@@ -2246,7 +2272,7 @@ Session::load_bundles (XMLNode const & node)
                } else if ((*niter)->name() == "OutputBundle") {
                        add_bundle (boost::shared_ptr<UserBundle> (new UserBundle (**niter, false)));
                } else {
-                       error << string_compose(_("Unknown node \"%1\" found in Bundles list from state file"), (*niter)->name()) << endmsg;
+                       error << string_compose(_("Unknown node \"%1\" found in Bundles list from session file"), (*niter)->name()) << endmsg;
                        return -1;
                }
        }
@@ -2573,7 +2599,7 @@ Session::find_all_sources_across_snapshots (set<string>& result, bool exclude_th
                ripped = ripped.substr (0, ripped.length() - 1);
        }
 
-       state_files = scanner (ripped, accept_all_state_files, (void *) 0, false, true);
+       state_files = scanner (ripped, accept_all_state_files, (void *) 0, true, true);
 
        if (state_files == 0) {
                /* impossible! */
@@ -3548,6 +3574,12 @@ Session::config_changed (std::string p, bool ours)
                AudioSource::allocate_working_buffers (frame_rate());
        } else if (p == "automation-thinning-factor") {
                Evoral::ControlList::set_thinning_factor (Config->get_automation_thinning_factor());
+       } else if (p == "ltc-source-port") {
+               reconnect_ltc_input ();
+       } else if (p == "ltc-sink-port") {
+               reconnect_ltc_output ();
+       } else if (p == "timecode-generator-offset") {
+               ltc_tx_parse_offset();
        }
 
        set_dirty ();