major fixes to automation editing
[ardour.git] / libs / ardour / destructive_filesource.cc
index bf16b40005c7e7247f15d3ca1e3a0a42791ee893..2f2e85ed5a088652ad7cd59f3c09de66af79d502 100644 (file)
@@ -55,8 +55,10 @@ typedef off_t off64_t;
 #include <fcntl.h>
 
 #include <pbd/error.h>
+#include <pbd/stacktrace.h>
 #include <ardour/destructive_filesource.h>
 #include <ardour/utils.h>
+#include <ardour/session.h>
 
 #include "i18n.h"
 
@@ -66,23 +68,23 @@ using namespace PBD;
 
 gain_t* DestructiveFileSource::out_coefficient = 0;
 gain_t* DestructiveFileSource::in_coefficient = 0;
-jack_nframes_t DestructiveFileSource::xfade_frames = 64;
+nframes_t DestructiveFileSource::xfade_frames = 64;
 
-DestructiveFileSource::DestructiveFileSource (string path, SampleFormat samp_format, HeaderFormat hdr_format, jack_nframes_t rate, Flag flags)
-       : SndFileSource (path, samp_format, hdr_format, rate, flags)
+DestructiveFileSource::DestructiveFileSource (Session& s, string path, SampleFormat samp_format, HeaderFormat hdr_format, nframes_t rate, Flag flags)
+       : SndFileSource (s, path, samp_format, hdr_format, rate, flags)
 {
        init ();
 }
 
 
-DestructiveFileSource::DestructiveFileSource (string path, Flag flags)
-       : SndFileSource (path, flags)
+DestructiveFileSource::DestructiveFileSource (Session& s, string path, Flag flags)
+       : SndFileSource (s, path, flags)
 {
        init ();
 }
 
-DestructiveFileSource::DestructiveFileSource (const XMLNode& node)
-       : SndFileSource (node)
+DestructiveFileSource::DestructiveFileSource (Session& s, const XMLNode& node)
+       : SndFileSource (s, node)
 {
        init ();
 }
@@ -106,13 +108,13 @@ DestructiveFileSource::~DestructiveFileSource()
 }
 
 void
-DestructiveFileSource::setup_standard_crossfades (jack_nframes_t rate)
+DestructiveFileSource::setup_standard_crossfades (nframes_t rate)
 {
        /* This static method is assumed to have been called by the Session
           before any DFS's are created.
        */
 
-       xfade_frames = (jack_nframes_t) floor ((Config->get_destructive_xfade_msecs () / 1000.0) * rate);
+       xfade_frames = (nframes_t) floor ((Config->get_destructive_xfade_msecs () / 1000.0) * rate);
 
        if (out_coefficient) {
                delete [] out_coefficient;
@@ -129,7 +131,7 @@ DestructiveFileSource::setup_standard_crossfades (jack_nframes_t rate)
 }
 
 void
-DestructiveFileSource::mark_capture_start (jack_nframes_t pos)
+DestructiveFileSource::mark_capture_start (nframes_t pos)
 {
        if (pos < timeline_position) {
                _capture_start = false;
@@ -152,15 +154,15 @@ DestructiveFileSource::clear_capture_marks ()
        _capture_end = false;
 }      
 
-jack_nframes_t
-DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in)
+nframes_t
+DestructiveFileSource::crossfade (Sample* data, nframes_t cnt, int fade_in)
 {
-       jack_nframes_t xfade = min (xfade_frames, cnt);
-       jack_nframes_t nofade = cnt - xfade;
+       nframes_t xfade = min (xfade_frames, cnt);
+       nframes_t nofade = cnt - xfade;
        Sample* fade_data = 0;
-       jack_nframes_t fade_position = 0; // in frames
+       nframes_t fade_position = 0; // in frames
        ssize_t retval;
-       jack_nframes_t file_cnt;
+       nframes_t file_cnt;
 
        if (fade_in) {
                fade_position = file_pos;
@@ -190,6 +192,7 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in)
        }
 
        if (file_cnt) {
+               
                if ((retval = read_unlocked (xfade_buf, fade_position, file_cnt)) != (ssize_t) file_cnt) {
                        if (retval >= 0 && errno == EAGAIN) {
                                /* XXX - can we really trust that errno is meaningful here?  yes POSIX, i'm talking to you.
@@ -203,12 +206,12 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in)
        } 
 
        if (file_cnt != xfade) {
-               jack_nframes_t delta = xfade - file_cnt;
+               nframes_t delta = xfade - file_cnt;
                memset (xfade_buf+file_cnt, 0, sizeof (Sample) * delta);
        }
        
        if (nofade && !fade_in) {
-               if (write_float (data, file_pos - timeline_position, nofade) != nofade) {
+               if (write_float (data, file_pos, nofade) != nofade) {
                        error << string_compose(_("DestructiveFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
                        return 0;
                }
@@ -216,7 +219,7 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in)
 
        if (xfade == xfade_frames) {
 
-               jack_nframes_t n;
+               nframes_t n;
 
                /* use the standard xfade curve */
                
@@ -247,20 +250,20 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in)
 
                compute_equal_power_fades (xfade, in, out);
 
-               for (jack_nframes_t n = 0; n < xfade; ++n) {
+               for (nframes_t n = 0; n < xfade; ++n) {
                        xfade_buf[n] = (xfade_buf[n] * out[n]) + (fade_data[n] * in[n]);                
                }
        }
 
        if (xfade) {
-               if (write_float (xfade_buf, fade_position - timeline_position, xfade) != xfade) {
+               if (write_float (xfade_buf, fade_position, xfade) != xfade) {
                        error << string_compose(_("DestructiveFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
                        return 0;
                }
        }
        
        if (fade_in && nofade) {
-               if (write_float (data + xfade, file_pos + xfade - timeline_position, nofade) != nofade) {
+               if (write_float (data + xfade, file_pos + xfade, nofade) != nofade) {
                        error << string_compose(_("DestructiveFileSource: \"%1\" bad write (%2)"), _path, strerror (errno)) << endmsg;
                        return 0;
                }
@@ -269,10 +272,10 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in)
        return cnt;
 }
 
-jack_nframes_t
-DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt)
+nframes_t
+DestructiveFileSource::write_unlocked (Sample* data, nframes_t cnt)
 {
-       jack_nframes_t old_file_pos;
+       nframes_t old_file_pos;
 
        if (!writable()) {
                return 0;
@@ -288,11 +291,11 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt)
                _capture_end = false;
                
                /* move to the correct location place */
-               file_pos = capture_start_frame;
+               file_pos = capture_start_frame - timeline_position;
                
                // split cnt in half
-               jack_nframes_t subcnt = cnt / 2;
-               jack_nframes_t ofilepos = file_pos;
+               nframes_t subcnt = cnt / 2;
+               nframes_t ofilepos = file_pos;
                
                // fade in
                if (crossfade (data, subcnt, 1) != subcnt) {
@@ -320,8 +323,8 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt)
                _capture_end = false;
                
                /* move to the correct location place */
-               file_pos = capture_start_frame;
-               
+               file_pos = capture_start_frame - timeline_position;
+
                if (crossfade (data, cnt, 1) != cnt) {
                        return 0;
                }
@@ -342,16 +345,16 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt)
        } else {
 
                /* in the middle of recording */
-               
-               if (write_float (data, file_pos - timeline_position, cnt) != cnt) {
+
+               if (write_float (data, file_pos, cnt) != cnt) {
                        return 0;
                }
        }
-       
+
        old_file_pos = file_pos;
        update_length (file_pos, cnt);
        file_pos += cnt;
-       
+
        if (_build_peakfiles) {
                PeakBuildRecord *pbr = 0;
                
@@ -374,13 +377,13 @@ DestructiveFileSource::write_unlocked (Sample* data, jack_nframes_t cnt)
        }
 
        if (_build_peakfiles) {
-               queue_for_peaks (this);
+               queue_for_peaks (shared_from_this ());
        }
        
        return cnt;
 }
 
-jack_nframes_t
+nframes_t
 DestructiveFileSource::last_capture_start_frame () const
 {
        return capture_start_frame;
@@ -407,7 +410,15 @@ DestructiveFileSource::handle_header_position_change ()
 }
 
 void
-DestructiveFileSource::set_timeline_position (jack_nframes_t pos)
+DestructiveFileSource::set_timeline_position (nframes_t pos)
 {
        //destructive track timeline postion does not change except at instantion or when header_position_offset (session start) changes
 }
+
+int
+DestructiveFileSource::read_peaks (PeakData *peaks, nframes_t npeaks, nframes_t start, nframes_t cnt, double samples_per_unit) const
+{
+       // cerr << _name << " read peaks at " << start << " for " << cnt << " tpos = " << timeline_position << endl;
+       return AudioFileSource::read_peaks (peaks, npeaks, start, cnt, samples_per_unit);
+}
+