the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
- This program is distributed in the hope that it will be useful,
+ This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
#include "ardour/audioregion.h"
#include "ardour/auditioner.h"
#include "ardour/buffer.h"
+#include "ardour/butler.h"
#include "ardour/configuration.h"
#include "ardour/control_protocol_manager.h"
#include "ardour/crossfade.h"
auto_play_legal = false;
transport_sub_state = 0;
_transport_frame = 0;
+ _requested_return_frame = -1;
end_location = new Location (0, 0, _("end"), Location::Flags ((Location::IsMark|Location::IsEnd)));
start_location = new Location (0, 0, _("start"), Location::Flags ((Location::IsMark|Location::IsStart)));
g_atomic_int_set (&_record_status, Disabled);
pending_locate_frame = 0;
pending_locate_roll = false;
pending_locate_flush = false;
- audio_dstream_buffer_size = 0;
- midi_dstream_buffer_size = 0;
state_was_pending = false;
set_next_event ();
- outbound_mtc_smpte_frame = 0;
+ outbound_mtc_timecode_frame = 0;
next_quarter_frame_to_send = -1;
current_block_size = 0;
solo_update_disabled = false;
_have_captured = false;
_worst_output_latency = 0;
_worst_input_latency = 0;
- _worst_track_latency = 0;
+ _worst_track_latency = 0;
_state_of_the_state = StateOfTheState(CannotSave|InitialConnecting|Loading);
-
+ _was_seamless = Config->get_seamless_loop ();
_slave = 0;
session_send_mmc = false;
session_send_mtc = false;
- post_transport_work = PostTransportWork (0);
- g_atomic_int_set (&butler_should_do_transport_work, 0);
g_atomic_int_set (&_playback_load, 100);
g_atomic_int_set (&_capture_load, 100);
g_atomic_int_set (&_playback_load_min, 100);
destructive_index = 0;
first_file_data_format_reset = true;
first_file_header_format_reset = true;
- butler_thread = (pthread_t) 0;
//midi_thread = (pthread_t) 0;
AudioDiskstream::allocate_working_buffers();
waiting_for_sync_offset = false;
}
- last_smpte_when = 0;
- _smpte_offset = 0;
- _smpte_offset_negative = true;
- last_smpte_valid = false;
+ last_timecode_when = 0;
+ _timecode_offset = 0;
+ _timecode_offset_negative = true;
+ last_timecode_valid = false;
sync_time_vars ();
remove_empty_sounds ();
}
- if (start_butler_thread()) {
+ if (_butler->start_thread()) {
return -1;
}
// to call setup_raid_path() here.
if (state_tree) {
- if (set_state (*state_tree->root())) {
+ if (set_state (*state_tree->root(), Stateful::loading_state_version)) {
return -1;
}
} else {
Session::restore_state (string snapshot_name)
{
if (load_state (snapshot_name) == 0) {
- set_state (*state_tree->root());
+ set_state (*state_tree->root(), Stateful::loading_state_version);
}
return 0;
}
const XMLProperty* prop;
- bool is_old = false; // session is _very_ old (pre-2.0)
if ((prop = root.property ("version")) == 0) {
/* no version implies very old version of Ardour */
- is_old = true;
+ Stateful::loading_state_version = 1000;
} else {
- int major_version;
- major_version = atoi (prop->value().c_str()); // grab just the first number before the period
- if (major_version < 2) {
- is_old = true;
- }
- }
+ int major;
+ int minor;
+ int micro;
- if (is_old) {
+ sscanf (prop->value().c_str(), "%d.%d.%d", &major, &minor, µ);
+ Stateful::loading_state_version = (major * 1000) + minor;
+ }
+
+ if (Stateful::loading_state_version < CURRENT_SESSION_FILE_VERSION) {
sys::path backup_path(_session_dir->root_path());
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)) {
+ } else if (_metadata->set_state (*child, version)) {
goto out;
}
}
if ((child = find_named_node (node, "Locations")) == 0) {
error << _("Session: XML state has no locations section") << endmsg;
goto out;
- } else if (_locations.set_state (*child)) {
+ } else if (_locations.set_state (*child, version)) {
goto out;
}
if ((child = find_named_node (node, "TempoMap")) == 0) {
error << _("Session: XML state has no Tempo Map section") << endmsg;
goto out;
- } else if (_tempo_map->set_state (*child)) {
+ } else if (_tempo_map->set_state (*child, version)) {
goto out;
}
if ((child = find_named_node (node, "Click")) == 0) {
warning << _("Session: XML state has no click section") << endmsg;
} else if (_click_io) {
- _click_io->set_state (*child);
+ _click_io->set_state (*child, version);
}
if ((child = find_named_node (node, "ControlProtocols")) != 0) {
return ret;
}
} else {
- boost::shared_ptr<Route> ret (new Route (*this, node, version));
+ boost::shared_ptr<Route> ret (new Route (*this, node));
return ret;
}
}
};
int
-Session::cleanup_sources (Session::cleanup_report& rep)
+Session::cleanup_sources (CleanupReport& rep)
{
// FIXME: needs adaptation to midi
capture files.
*/
- if (!i->second->used() && i->second->length(i->second->timeline_position()) > 0) {
+ if (!source_use_count(i->second) && i->second->length(i->second->timeline_position()) > 0) {
dead_sources.push_back (i->second);
i->second->GoingAway();
}
}
int
-Session::cleanup_trash_sources (Session::cleanup_report& rep)
+Session::cleanup_trash_sources (CleanupReport& rep)
{
// FIXME: needs adaptation for MIDI
const string xml_filename = legalize_for_path (snapshot_name) + history_suffix;
const sys::path xml_path = _session_dir->root_path() / xml_filename;
- cerr << "Loading history from " << xml_path.to_string() << endmsg;
+ info << "Loading history from " << xml_path.to_string() << endmsg;
if (!sys::exists (xml_path)) {
info << string_compose (_("%1: no history file \"%2\" for this session."),
PBD::ID id(n->property("midi-source")->value());
boost::shared_ptr<MidiSource> midi_source =
boost::dynamic_pointer_cast<MidiSource, Source>(source_by_id(id));
- if(midi_source) {
+ if (midi_source) {
ut->add_command(new MidiModel::DeltaCommand(midi_source->model(), *n));
} else {
- error << "FIXME: Failed to downcast MidiSource for DeltaCommand" << endmsg;
+ error << _("Failed to downcast MidiSource for DeltaCommand") << endmsg;
}
+
} else if (n->name() == "DiffCommand") {
PBD::ID id(n->property("midi-source")->value());
boost::shared_ptr<MidiSource> midi_source =
boost::dynamic_pointer_cast<MidiSource, Source>(source_by_id(id));
- if(midi_source) {
+ if (midi_source) {
ut->add_command(new MidiModel::DiffCommand(midi_source->model(), *n));
} else {
- error << "FIXME: Failed to downcast MidiSource for DeltaCommand" << endmsg;
+ error << _("Failed to downcast MidiSource for DeltaCommand") << endmsg;
}
} else {
setup_raid_path (config.get_raid_path());
- } else if (p == "smpte-format") {
+ } else if (p == "timecode-format") {
sync_time_vars ();