Fix more broken whitespace.
[ardour.git] / libs / ardour / midi_diskstream.cc
index f434af50f39eb93469ef2d43ab5c72a17dd28304..3d2336da3abb7642722729d23f44d8577476c56a 100644 (file)
@@ -171,13 +171,7 @@ MidiDiskstream::non_realtime_input_change ()
 
                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;
 
@@ -520,6 +514,7 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can
                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;
                }
@@ -887,8 +882,8 @@ MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush)
        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;
@@ -942,6 +937,7 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
 
                if (_write_source) {
                        _write_source->mark_for_remove ();
+                       _write_source->drop_references ();
                        _write_source.reset();
                }
 
@@ -979,10 +975,6 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
                        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
@@ -1068,7 +1060,21 @@ MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen
 
                        _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;
        }
@@ -1188,38 +1194,19 @@ void
 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()) {
 
@@ -1241,18 +1228,14 @@ MidiDiskstream::get_state ()
                }
 
                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();
@@ -1260,12 +1243,11 @@ MidiDiskstream::set_state (const XMLNode& node, int /*version*/)
        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")) {
@@ -1273,20 +1255,8 @@ MidiDiskstream::set_state (const XMLNode& node, int /*version*/)
                }
        }
 
-       /* 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;
@@ -1302,36 +1272,12 @@ MidiDiskstream::set_state (const XMLNode& node, int /*version*/)
                }
        }
 
-       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;
 
@@ -1350,13 +1296,8 @@ MidiDiskstream::use_new_write_source (uint32_t n)
        _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();
@@ -1369,8 +1310,6 @@ MidiDiskstream::use_new_write_source (uint32_t n)
                return -1;
        }
 
-       _write_source->mark_streaming_midi_write_started (_note_mode, _session.transport_frame());
-
        return 0;
 }
 
@@ -1387,8 +1326,6 @@ MidiDiskstream::steal_write_sources()
 
        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 ();
 
@@ -1446,6 +1383,10 @@ MidiDiskstream::set_align_style_from_io ()
 {
        bool have_physical = false;
 
+       if (_alignment_choice != Automatic) {
+               return;
+       }
+
        if (_io == 0) {
                return;
        }