Symmetric x-fade, use equivalent of -6dB per step for 7 steps.
[ardour.git] / libs / ardour / midi_region.cc
index 1bcbae8c571ad44ca283e486dedb3011f3b91699..e7298e752623423c4a7c8e472001a44a9077c5ef 100644 (file)
 
 #include <set>
 
-#include <glibmm/thread.h>
+#include <glibmm/threads.h>
+#include <glibmm/fileutils.h>
+#include <glibmm/miscutils.h>
 
 #include "pbd/xml++.h"
-#include "pbd/filesystem.h"
+#include "pbd/basename.h"
 
 #include "ardour/automation_control.h"
 #include "ardour/midi_model.h"
@@ -36,6 +38,7 @@
 #include "ardour/midi_source.h"
 #include "ardour/region_factory.h"
 #include "ardour/session.h"
+#include "ardour/source_factory.h"
 #include "ardour/tempo.h"
 #include "ardour/types.h"
 
@@ -126,16 +129,31 @@ MidiRegion::~MidiRegion ()
  */
 boost::shared_ptr<MidiRegion>
 MidiRegion::clone (string path) const
+{
+       boost::shared_ptr<MidiSource> newsrc;
+
+       /* caller must check for pre-existing file */
+       assert (!Glib::file_test (path, Glib::FILE_TEST_EXISTS));
+       newsrc = boost::dynamic_pointer_cast<MidiSource>(
+               SourceFactory::createWritable(DataType::MIDI, _session,
+                                             path, false, _session.frame_rate()));
+       return clone (newsrc);
+}
+
+boost::shared_ptr<MidiRegion>
+MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const
 {
        BeatsFramesConverter bfc (_session.tempo_map(), _position);
        Evoral::MusicalTime const bbegin = bfc.from (_start);
        Evoral::MusicalTime const bend = bfc.from (_start + _length);
 
-       boost::shared_ptr<MidiSource> ms = midi_source(0)->clone (path, bbegin, bend);
+       if (midi_source(0)->write_to (newsrc, bbegin, bend)) {
+               return boost::shared_ptr<MidiRegion> ();
+       }
 
        PropertyList plist;
 
-       plist.add (Properties::name, sys::basename (ms->name()));
+       plist.add (Properties::name, PBD::basename_nosuffix (newsrc->name()));
        plist.add (Properties::whole_file, true);
        plist.add (Properties::start, _start);
        plist.add (Properties::start_beats, _start_beats);
@@ -143,7 +161,7 @@ MidiRegion::clone (string path) const
        plist.add (Properties::length_beats, _length_beats);
        plist.add (Properties::layer, 0);
 
-       return boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (ms, plist, true));
+       return boost::dynamic_pointer_cast<MidiRegion> (RegionFactory::create (newsrc, plist, true));
 }
 
 void
@@ -407,7 +425,7 @@ MidiRegion::model_automation_state_changed (Evoral::Parameter const & p)
           for a given set of filtered_parameters, so now that we've changed that list we must invalidate
           the iterator.
        */
-       Glib::Mutex::Lock lm (midi_source(0)->mutex());
+       Glib::Threads::Mutex::Lock lm (midi_source(0)->mutex());
        midi_source(0)->invalidate ();
 }