dramatic change in logic and naming for operations related to adding a MIDI region...
[ardour.git] / libs / ardour / midi_diskstream.cc
index 4771f7128cf7ac3e6263e07273be7fd456f42fd9..fdf155d78b76cdc9795d7928161d13cc07a7d222 100644 (file)
 #include <fcntl.h>
 #include <cstdlib>
 #include <ctime>
-#include <strings.h> // for ffs(3)
 #include <sys/stat.h>
-#include <sys/mman.h>
 
 #include "pbd/error.h"
+#include "pbd/ffs.h"
 #include "pbd/basename.h"
 #include <glibmm/threads.h>
 #include "pbd/xml++.h"
@@ -439,7 +438,7 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
                                break;
                        case ForceChannel:
                                if (ev.is_channel_event()) {
-                                       ev.set_channel (ffs(mask) - 1);
+                                       ev.set_channel (PBD::ffs(mask) - 1);
                                }
                                _capture_buf->write(transport_frame + loop_offset + ev.time(),
                                                    ev.type(), ev.size(), ev.buffer());
@@ -1199,7 +1198,7 @@ MidiDiskstream::use_new_write_source (uint32_t n)
 
        try {
                _write_source = boost::dynamic_pointer_cast<SMFSource>(
-                       _session.create_midi_source_for_session (0, name ()));
+                       _session.create_midi_source_for_session (name ()));
 
                if (!_write_source) {
                        throw failed_constructor();
@@ -1214,25 +1213,30 @@ MidiDiskstream::use_new_write_source (uint32_t n)
 
        return 0;
 }
-
-list<boost::shared_ptr<Source> >
-MidiDiskstream::steal_write_sources()
+/**
+ * We want to use the name of the existing write source (the one that will be
+ * used by the next capture) for another purpose. So change the name of the
+ * current source, and return its current name.
+ *
+ * Return an empty string if the change cannot be accomplished.
+ */
+std::string
+MidiDiskstream::steal_write_source_name ()
 {
-       list<boost::shared_ptr<Source> > ret;
-
-       /* put some data on the disk, even if its just a header for an empty file */
-       boost::dynamic_pointer_cast<SMFSource> (_write_source)->ensure_disk_file ();
-
-       /* never let it go away */
-       _write_source->mark_nonremovable ();
-
-       ret.push_back (_write_source);
+       string our_old_name = _write_source->name();
 
-       /* get a new one */
-
-       use_new_write_source (0);
+       /* this will bump the name of the current write source to the next one
+        * (e.g. "MIDI 1-1" gets renamed to "MIDI 1-2"), thus leaving the
+        * current write source name (e.g. "MIDI 1-1" available). See the
+        * comments in Session::create_midi_source_for_track() about why we do
+        * this.
+        */
 
-       return ret;
+       if (_write_source->set_source_name (name(), false)) {
+               return string();
+       }
+       
+       return our_old_name;
 }
 
 void