no-read-past-end for destructive crossfade as well; cleanup xfade coefficient arrays...
[ardour.git] / libs / ardour / crossfade.cc
index 67b6a182b41e5c35cba4e86ff26460cb164e9006..c23689a3a32f3438dd5f957708ffde9f0f3e0516 100644 (file)
@@ -146,17 +146,19 @@ Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
                      << endmsg;
                throw failed_constructor();
        }
-
+       
        if ((_out = dynamic_cast<AudioRegion*> (r)) == 0) {
                throw failed_constructor();
        }
 
        _length = 0;
-       initialize();
+       initialize(false);
        
        if (set_state (node)) {
                throw failed_constructor();
        }
+
+       save_state ("initial");
 }
 
 Crossfade::~Crossfade ()
@@ -167,7 +169,7 @@ Crossfade::~Crossfade ()
 }
 
 void
-Crossfade::initialize ()
+Crossfade::initialize (bool savestate)
 {
        _in_update = false;
        
@@ -198,8 +200,10 @@ Crossfade::initialize ()
 //     _out->StateChanged.connect (slot (*this, &Crossfade::member_changed));
 
        overlap_type = _in->coverage (_out->position(), _out->last_frame());
-       
-       save_state ("initial");
+
+       if (savestate) {
+               save_state ("initial");
+       }
 }      
 
 int
@@ -369,7 +373,7 @@ Crossfade::compute (AudioRegion& a, AudioRegion& b, CrossfadeModel model)
 
 jack_nframes_t 
 Crossfade::read_at (Sample *buf, Sample *mixdown_buffer, 
-                   float *gain_buffer, jack_nframes_t start, jack_nframes_t cnt, uint32_t chan_n,
+                   float *gain_buffer, char * workbuf, jack_nframes_t start, jack_nframes_t cnt, uint32_t chan_n,
                    jack_nframes_t read_frames, jack_nframes_t skip_frames)
 {
        jack_nframes_t offset;
@@ -405,8 +409,8 @@ Crossfade::read_at (Sample *buf, Sample *mixdown_buffer,
 
        offset = start - _position;
 
-       _out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
-       _in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, start, to_write, chan_n, read_frames, skip_frames);
+       _out->read_at (crossfade_buffer_out, mixdown_buffer, gain_buffer, workbuf, start, to_write, chan_n, read_frames, skip_frames);
+       _in->read_at (crossfade_buffer_in, mixdown_buffer, gain_buffer, workbuf, start, to_write, chan_n, read_frames, skip_frames);
 
        float* fiv = new float[to_write];
        float* fov = new float[to_write];