get_input_sources ();
set_capture_offset ();
-
- if (first_input_change) {
- set_align_style (_persistent_alignment_style);
- first_input_change = false;
- } else {
- set_align_style_from_io ();
- }
+ set_align_style_from_io ();
input_change_pending.type = IOChange::NoChange;
calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset);
if (rec_nframes && !was_recording) {
+ _write_source->mark_write_starting_now ();
capture_captured = 0;
was_recording = true;
}
assert(!destructive());
if (record_enabled() &&
- ((_session.transport_frame() - _last_flush_frame > disk_io_chunk_frames) ||
- force_flush)) {
+ ((_session.transport_frame() - _last_flush_frame > disk_io_chunk_frames) ||
+ force_flush)) {
if ((!_write_source) || _write_source->midi_write (*_capture_buf, get_capture_start_frame (0), to_write) != to_write) {
error << string_compose(_("MidiDiskstream %1: cannot write to disk"), _id) << endmsg;
return -1;
if (_write_source) {
_write_source->mark_for_remove ();
+ _write_source->drop_references ();
_write_source.reset();
}
const double total_capture_beats = converter.from(total_capture);
_write_source->set_length_beats(total_capture_beats);
- /* make it not a stub anymore */
-
- _write_source->unstubify ();
-
/* we will want to be able to keep (over)writing the source
but we don't want it to be removable. this also differs
from the audio situation, where the source at this point
_playlist->thaw ();
_session.add_command (new StatefulDiffCommand(_playlist));
- }
+
+ } else {
+
+ /* No data was recorded, so this capture will
+ effectively be aborted; do the same as we
+ do for an explicit abort.
+ */
+
+ if (_write_source) {
+ _write_source->mark_for_remove ();
+ _write_source->drop_references ();
+ _write_source.reset();
+ }
+ }
+
mark_write_completed = true;
}
MidiDiskstream::disengage_record_enable ()
{
g_atomic_int_set (&_record_enabled, 0);
- if (_source_port && Config->get_monitoring_model() == HardwareMonitoring) {
- if (_source_port) {
- _source_port->request_monitor_input (false);
- }
- }
-
RecordEnableChanged (); /* EMIT SIGNAL */
}
XMLNode&
MidiDiskstream::get_state ()
{
- XMLNode* node = new XMLNode ("Diskstream");
+ XMLNode& node (Diskstream::get_state());
char buf[64];
LocaleGuard lg (X_("POSIX"));
- snprintf (buf, sizeof(buf), "0x%x", _flags);
- node->add_property ("flags", buf);
-
- node->add_property("channel-mode", enum_2_string(get_channel_mode()));
-
+ node.add_property("channel-mode", enum_2_string(get_channel_mode()));
snprintf (buf, sizeof(buf), "0x%x", get_channel_mask());
- node->add_property("channel-mask", buf);
-
- node->add_property ("playlist", _playlist->name());
-
- snprintf (buf, sizeof(buf), "%f", _visible_speed);
- node->add_property ("speed", buf);
-
- node->add_property("name", _name);
- id().print(buf, sizeof(buf));
- node->add_property("id", buf);
+ node.add_property("channel-mask", buf);
if (_write_source && _session.get_record_enabled()) {
}
cs_child->add_property (X_("at"), buf);
- node->add_child_nocopy (*cs_child);
+ node.add_child_nocopy (*cs_child);
}
- if (_extra_xml) {
- node->add_child_copy (*_extra_xml);
- }
-
- return* node;
+ return node;
}
int
-MidiDiskstream::set_state (const XMLNode& node, int /*version*/)
+MidiDiskstream::set_state (const XMLNode& node, int version)
{
const XMLProperty* prop;
XMLNodeList nlist = node.children();
XMLNode* capture_pending_node = 0;
LocaleGuard lg (X_("POSIX"));
+ /* prevent write sources from being created */
+
in_set_state = true;
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
- /*if ((*niter)->name() == IO::state_node_name) {
- deprecated_io_node = new XMLNode (**niter);
- }*/
assert ((*niter)->name() != IO::state_node_name);
if ((*niter)->name() == X_("CapturingSources")) {
}
}
- /* prevent write sources from being created */
-
- in_set_state = true;
-
- if ((prop = node.property ("name")) != 0) {
- _name = prop->value();
- }
-
- if ((prop = node.property ("id")) != 0) {
- _id = prop->value ();
- }
-
- if ((prop = node.property ("flags")) != 0) {
- _flags = Flag (string_2_enum (prop->value(), _flags));
+ if (Diskstream::set_state (node, version)) {
+ return -1;
}
ChannelMode channel_mode = AllChannels;
}
}
- set_channel_mode(channel_mode, channel_mask);
- if ((prop = node.property ("playlist")) == 0) {
- return -1;
+ if (capture_pending_node) {
+ use_pending_capture_data (*capture_pending_node);
}
- {
- bool had_playlist = (_playlist != 0);
-
- if (find_and_use_playlist (prop->value())) {
- return -1;
- }
-
- if (!had_playlist) {
- _playlist->set_orig_diskstream_id (id());
- }
-
- if (capture_pending_node) {
- use_pending_capture_data (*capture_pending_node);
- }
-
- }
-
- if ((prop = node.property ("speed")) != 0) {
- double sp = atof (prop->value().c_str());
-
- if (realtime_set_speed (sp, false)) {
- non_realtime_set_speed ();
- }
- }
+ set_channel_mode (channel_mode, channel_mask);
in_set_state = false;
_write_source.reset();
try {
- /* file starts off as a stub file, it will be converted
- when we're done with a capture pass, or when "stolen"
- by the GUI.
- */
-
_write_source = boost::dynamic_pointer_cast<SMFSource>(
- _session.create_midi_source_for_session (0, name (), true));
+ _session.create_midi_source_for_session (0, name ()));
if (!_write_source) {
throw failed_constructor();
return -1;
}
- _write_source->mark_streaming_midi_write_started (_note_mode, _session.transport_frame());
-
return 0;
}
boost::dynamic_pointer_cast<MidiSource>(_write_source)->session_saved ();
- /* make it visible/present */
- _write_source->unstubify ();
/* never let it go away */
_write_source->mark_nonremovable ();
{
bool have_physical = false;
+ if (_alignment_choice != Automatic) {
+ return;
+ }
+
if (_io == 0) {
return;
}