Merged with trunk R992.
[ardour.git] / libs / ardour / midi_diskstream.cc
index 40b0b11564e5715be762aa0c1556e157a6b84899..8247aac217c3249ffb305c04fe81d6be44f155b7 100644 (file)
@@ -45,6 +45,7 @@
 #include <ardour/smf_source.h>
 #include <ardour/destructive_filesource.h>
 #include <ardour/send.h>
+#include <ardour/region_factory.h>
 #include <ardour/midi_playlist.h>
 #include <ardour/cycle_timer.h>
 #include <ardour/midi_region.h>
@@ -66,7 +67,6 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F
        //, _playback_wrap_buffer(0)
        //, _capture_wrap_buffer(0)
        , _source_port(0)
-       , _write_source(0)
        , _capture_transition_buf(0)
        , _last_flush_frame(0)
 {
@@ -80,7 +80,6 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F
        in_set_state = false;
 
        assert(!destructive());
-       DiskstreamCreated (this); /* EMIT SIGNAL */
 }
        
 MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
@@ -92,7 +91,6 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
        //, _playback_wrap_buffer(0)
        //, _capture_wrap_buffer(0)
        , _source_port(0)
-       , _write_source(0)
        , _capture_transition_buf(0)
        , _last_flush_frame(0)
 {
@@ -109,8 +107,6 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
        if (destructive()) {
                use_destructive_playlist ();
        }
-
-       DiskstreamCreated (this); /* EMIT SIGNAL */
 }
 
 void
@@ -360,7 +356,7 @@ MidiDiskstream::check_record_status (jack_nframes_t transport_frame, jack_nframe
                        if (_alignment_style == ExistingMaterial) {
 
 
-                               if (!_session.get_punch_in()) {
+                               if (!Config->get_punch_in()) {
 
                                        /* manual punch in happens at the correct transport frame
                                           because the user hit a button. but to get alignment correct 
@@ -389,7 +385,7 @@ MidiDiskstream::check_record_status (jack_nframes_t transport_frame, jack_nframe
 
                        } else {
 
-                               if (_session.get_punch_in()) {
+                               if (Config->get_punch_in()) {
                                        first_recordable_frame += _roll_delay;
                                } else {
                                        capture_start_frame -= _roll_delay;
@@ -476,7 +472,7 @@ MidiDiskstream::process (jack_nframes_t transport_frame, jack_nframes_t nframes,
 
        adjust_capture_position = 0;
 
-       if (nominally_recording || (_session.get_record_enabled() && _session.get_punch_in())) {
+       if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
                OverlapType ot;
 
                ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
@@ -975,7 +971,7 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
        uint32_t buffer_position;
        bool more_work = true;
        int err = 0;
-       MidiRegion* region = 0;
+       boost::shared_ptr<MidiRegion> region;
        jack_nframes_t total_capture;
        MidiRegion::SourceList srcs;
        MidiRegion::SourceList::iterator src;
@@ -1010,25 +1006,15 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
 
        if (abort_capture) {
 
-               list<Source*>* deletion_list = new list<Source*>;
-
                if (_write_source) {
-                       _write_source->mark_for_remove ();
-                       _write_source->release ();
 
-                       deletion_list->push_back (_write_source);
-
-                       _write_source = 0;
+                       _write_source->mark_for_remove ();
+                       _write_source->drop_references ();
+                       _write_source.reset();
                }
 
                /* new source set up in "out" below */
 
-               if (!deletion_list->empty()) {
-                       DeleteSources (deletion_list);
-               } else {
-                       delete deletion_list;
-               }
-
        } else {
 
                assert(_write_source);
@@ -1039,7 +1025,7 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
 
                /* figure out the name for this take */
 
-               SMFSource* s = _write_source;
+               boost::shared_ptr<SMFSource> s = _write_source;
 
                if (s) {
 
@@ -1059,10 +1045,12 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
                   */
                try {
                        assert(_write_source);
-                       region = new MidiRegion (srcs, _write_source->last_capture_start_frame(), total_capture, 
-                                       region_name_from_path (_write_source->name()), 
-                                       0, Region::Flag (Region::DefaultFlags|Region::Automatic|Region::WholeFile));
+                       
+                       boost::shared_ptr<Region> rx (RegionFactory::create (srcs, _write_source->last_capture_start_frame(), total_capture, 
+                                                                            region_name_from_path (_write_source->name()), 
+                                                                            0, Region::Flag (Region::DefaultFlags|Region::Automatic|Region::WholeFile)));
 
+                       region = boost::dynamic_pointer_cast<MidiRegion> (rx);
                        region->special_set_position (capture_info.front()->start);
                }
 
@@ -1087,11 +1075,12 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
                        // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
 
                        try {
-                               region = new MidiRegion (srcs, buffer_position, (*ci)->frames, region_name);
+                               boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
+                               region = boost::dynamic_pointer_cast<MidiRegion> (rx);
                        }
 
                        catch (failed_constructor& err) {
-                               error << _("MidiDiskstream: could not create region for captured audio!") << endmsg;
+                               error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
                                continue; /* XXX is this OK? */
                        }
 
@@ -1100,7 +1089,7 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
                        // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
 
                        i_am_the_modifier++;
-                       _playlist->add_region (*region, (*ci)->start);
+                       _playlist->add_region (region, (*ci)->start);
                        i_am_the_modifier--;
 
                        buffer_position += (*ci)->frames;
@@ -1108,7 +1097,7 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
 
                _playlist->thaw ();
                XMLNode &after = _playlist->get_state();
-               _session.add_command (new MementoCommand<Playlist>(*_playlist, before, after));
+               _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
 
                mark_write_completed = true;
 
@@ -1194,8 +1183,8 @@ MidiDiskstream::engage_record_enable ()
 
        g_atomic_int_set (&_record_enabled, 1);
        
-       if (Config->get_use_hardware_monitoring() && _source_port) {
-               _source_port->request_monitor_input (!(_session.get_auto_input() && rolling));
+       if (_source_port && Config->get_monitoring_model() == HardwareMonitoring) {
+               _source_port->request_monitor_input (!(Config->get_auto_input() && rolling));
        }
 
        RecordEnableChanged (); /* EMIT SIGNAL */
@@ -1205,7 +1194,7 @@ void
 MidiDiskstream::disengage_record_enable ()
 {
        g_atomic_int_set (&_record_enabled, 0);
-       if (Config->get_use_hardware_monitoring()) {
+       if (_source_port && Config->get_monitoring_model() == HardwareMonitoring) {
                if (_source_port) {
                        _source_port->request_monitor_input (false);
                }
@@ -1230,7 +1219,7 @@ MidiDiskstream::get_state ()
        node->add_property ("speed", buf);
 
        node->add_property("name", _name);
-       id().print(buf);
+       id().print(buf, sizeof(buf));
        node->add_property("id", buf);
 
        if (_write_source && _session.get_record_enabled()) {
@@ -1246,7 +1235,7 @@ MidiDiskstream::get_state ()
 
                Location* pi;
 
-               if (_session.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
+               if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
                        snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
                } else {
                        snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
@@ -1364,16 +1353,14 @@ MidiDiskstream::use_new_write_source (uint32_t n)
 
                if (SMFSource::is_empty (_write_source->path())) {
                        _write_source->mark_for_remove ();
-                       _write_source->release();
-                       delete _write_source;
+                       _write_source.reset();
                } else {
-                       _write_source->release();
-                       _write_source = 0;
+                       _write_source.reset();
                }
        }
 
        try {
-               _write_source = dynamic_cast<SMFSource*>(_session.create_midi_source_for_session (*this));
+               _write_source = boost::dynamic_pointer_cast<SMFSource>(_session.create_midi_source_for_session (*this));
                if (!_write_source) {
                        throw failed_constructor();
                }
@@ -1381,11 +1368,10 @@ MidiDiskstream::use_new_write_source (uint32_t n)
 
        catch (failed_constructor &err) {
                error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
-               _write_source = 0;
+               _write_source.reset();
                return -1;
        }
 
-       _write_source->use ();
        _write_source->set_allow_remove_if_empty (true);
 
        return 0;
@@ -1526,9 +1512,9 @@ MidiDiskstream::get_playback(MidiBuffer& dst, jack_nframes_t start, jack_nframes
        for (size_t i=0; i < dst.size(); ++i) {
                assert(dst[i].time >= start);
                assert(dst[i].time <= end);
-               cerr << "Translating event stamp " << dst[i].time << " to ";
+               //cerr << "Translating event stamp " << dst[i].time << " to ";
                dst[i].time -= start;
-               cerr << dst[i].time << endl;
+               //cerr << dst[i].time << endl;
 
        }
 }