Preserve gain envelopes across filtering operations and stretch them across time...
authorCarl Hetherington <carl@carlh.net>
Mon, 26 Apr 2010 00:23:40 +0000 (00:23 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 26 Apr 2010 00:23:40 +0000 (00:23 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6989 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/filter.cc
libs/ardour/rb_effect.cc

index 44e7f11cbde0c79f26f0d3588a44833d4c72d545..2bbeecf37e6f560a84c6aca7b314ea987b4b9b3a 100644 (file)
@@ -138,6 +138,7 @@ Filter::finish (boost::shared_ptr<Region> region, SourceList& nsrcs, string regi
                audio_r->set_fade_in (audio_region->fade_in ());
                audio_r->set_fade_out_active (audio_region->fade_out_active ());
                audio_r->set_fade_out (audio_region->fade_out ());
+               *(audio_r->envelope()) = *(audio_region->envelope ());
        }
        results.push_back (r);
 
index 4cb77d1c5822862e2ca95ea8d712075c02f8d5ba..60764c12201901d78f96fda416ff1c8cf70b195b 100644 (file)
@@ -80,7 +80,8 @@ RBEffect::run (boost::shared_ptr<Region> r)
        string::size_type at;
        nframes_t pos = 0;
        int avail = 0;
-
+       boost::shared_ptr<AudioRegion> result;
+       
        cerr << "RBEffect: source region: position = " << region->position()
             << ", start = " << region->start()
             << ", length = " << region->length()
@@ -357,6 +358,15 @@ RBEffect::run (boost::shared_ptr<Region> r)
                (*x)->set_length( (*x)->length() * stretch, this);
        }
 
+       /* stretch region gain envelope */
+       /* XXX: assuming we've only processed one input region into one result here */
+
+       if (tsr.time_fraction != 1) {
+               result = boost::dynamic_pointer_cast<AudioRegion> (results.front());
+               assert (result);
+               result->envelope()->x_scale (tsr.time_fraction);
+       }
+
   out:
 
        delete [] gain_buffer;