slightly improved fixes for MIDI issues
[ardour.git] / libs / ardour / session_timefx.cc
index d7274388aab35af77bf0968351deed9e2adbbe2c..115d3eeeec5b8321c2d13e93d098b18caf108751 100644 (file)
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cerrno>
@@ -50,6 +49,9 @@ Session::tempoize_region (TimeStretchRequest& tsr)
        float percentage;
        nframes_t total_frames;
        nframes_t done;
+       int c;
+       char buf[64];
+       string::size_type len;
 
        /* the soundtouch code wants a *tempo* change percentage, which is 
           of opposite sign to the length change.  
@@ -73,8 +75,18 @@ Session::tempoize_region (TimeStretchRequest& tsr)
        done = 0;
 
        for (uint32_t i = 0; i < tsr.region->n_channels(); ++i) {
-               string path = path_from_region_name (PBD::basename_nosuffix (names[i]), ident);
 
+               string rstr;
+               string::size_type existing_ident;
+               
+               if ((existing_ident = names[i].find (ident)) != string::npos) {
+                       rstr = names[i].substr (0, existing_ident);
+               } else {
+                       rstr = names[i];
+               }
+
+               string path = path_from_region_name (DataType::AUDIO, PBD::basename_nosuffix (rstr), ident);
+               
                if (path.length() == 0) {
                        error << string_compose (_("tempoize: error creating name for new audio file based on %1"), tsr.region->name()) 
                              << endmsg;
@@ -82,12 +94,13 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                }
 
                try {
-                       sources.push_back (boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (*this, path, false, frame_rate())));
+                       sources.push_back (boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (DataType::AUDIO, *this, path, false, frame_rate())));
 
                } catch (failed_constructor& err) {
                        error << string_compose (_("tempoize: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg;
                        goto out;
                }
+
        }
        
        try {
@@ -99,6 +112,12 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                        nframes_t pos = 0;
                        nframes_t this_read = 0;
 
+                       boost::shared_ptr<AudioSource> asrc = boost::dynamic_pointer_cast<AudioSource>(sources[i]);
+                       if (!asrc) {
+                               cerr << "FIXME: TimeFX for non-audio" << endl;
+                               continue;
+                       }
+
                        st.clear();
                        while (tsr.running && pos < tsr.region->length()) {
                                nframes_t this_time;
@@ -122,7 +141,7 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                                st.putSamples (buffer, this_read);
                        
                                while ((this_read = st.receiveSamples (buffer, bufsize)) > 0 && tsr.running) {
-                                       if (sources[i]->write (buffer, this_read) != this_read) {
+                                       if (asrc->write (buffer, this_read) != this_read) {
                                                error << string_compose (_("error writing tempo-adjusted data to %1"), sources[i]->name()) << endmsg;
                                                goto out;
                                        }
@@ -134,7 +153,7 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                        }
                
                        while (tsr.running && (this_read = st.receiveSamples (buffer, bufsize)) > 0) {
-                               if (sources[i]->write (buffer, this_read) != this_read) {
+                               if (asrc->write (buffer, this_read) != this_read) {
                                        error << string_compose (_("error writing tempo-adjusted data to %1"), sources[i]->name()) << endmsg;
                                        goto out;
                                }
@@ -158,7 +177,34 @@ Session::tempoize_region (TimeStretchRequest& tsr)
                }
        }
 
-       region_name = tsr.region->name() + X_(".t");
+       len = tsr.region->name().length();
+
+       while (--len) {
+               if (!isdigit (tsr.region->name()[len])) {
+                       break;
+               }
+       }
+
+       if (len == 0) {
+               
+               region_name = tsr.region->name() + ".t000";
+
+       } else {
+
+               if (tsr.region->name()[len] == 't') {
+                       c = atoi (tsr.region->name().substr(len+1).c_str());
+
+                       snprintf (buf, sizeof (buf), "t%03d", ++c);
+                       region_name = tsr.region->name().substr (0, len) + buf;
+
+               } else {
+                       
+                       /* not sure what this is, just tack the suffix on to it */
+
+                       region_name = tsr.region->name() + ".t000";
+               }
+                       
+       }
 
        r = (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, 0, sources.front()->length(), region_name,
                                                                              0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile))));