diff options
author | Jesse Chappell <jesse@essej.net> | 2006-02-17 06:19:24 +0000 |
---|---|---|
committer | Jesse Chappell <jesse@essej.net> | 2006-02-17 06:19:24 +0000 |
commit | 5c47492d880e07c687a6f5ce542d4a57c822f81c (patch) | |
tree | 6255412db4a23a24b9e0fc42575e541a60179c36 /libs/ardour/destructive_filesource.cc | |
parent | 9a92c195e3e35263e5caf707c0557d2c9c274c84 (diff) |
diskstream fixups for destructive track captures. crossfade fixes for destructive sources.
git-svn-id: svn://localhost/trunk/ardour2@336 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/destructive_filesource.cc')
-rw-r--r-- | libs/ardour/destructive_filesource.cc | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/libs/ardour/destructive_filesource.cc b/libs/ardour/destructive_filesource.cc index bce8d5fb42..33beaaadcb 100644 --- a/libs/ardour/destructive_filesource.cc +++ b/libs/ardour/destructive_filesource.cc @@ -77,6 +77,7 @@ DestructiveFileSource::DestructiveFileSource (string path, jack_nframes_t rate, _capture_start = false; _capture_end = false; + file_pos = 0; } DestructiveFileSource::DestructiveFileSource (const XMLNode& node, jack_nframes_t rate) @@ -90,6 +91,7 @@ DestructiveFileSource::DestructiveFileSource (const XMLNode& node, jack_nframes_ _capture_start = false; _capture_end = false; + file_pos = 0; } DestructiveFileSource::~DestructiveFileSource() @@ -160,10 +162,8 @@ DestructiveFileSource::crossfade (Sample* data, jack_nframes_t cnt, int fade_in, if ((retval = file_read (xfade_buf, fade_position, xfade, workbuf)) != (ssize_t) xfade) { if (retval >= 0 && errno == EAGAIN) { /* XXX - can we really trust that errno is meaningful here? yes POSIX, i'm talking to you. - /* short or no data there */ - - xfade = retval; - nofade = cnt - xfade; + * short or no data there */ + memset (xfade_buf, 0, xfade * sizeof(Sample)); } else { error << string_compose(_("DestructiveFileSource: \"%1\" bad read retval: %2 of %5 (%3: %4)"), _path, retval, errno, strerror (errno), xfade) << endmsg; return 0; @@ -244,12 +244,40 @@ DestructiveFileSource::write (Sample* data, jack_nframes_t cnt, char * workbuf) jack_nframes_t oldlen; - if (_capture_start) { + if (_capture_start && _capture_end) { + _capture_start = false; + _capture_end = false; + + /* move to the correct location place */ + file_pos = capture_start_frame; + + cerr << "First frame of capture will be at " << file_pos << " and last at: " << file_pos + cnt << endl; + + // split cnt in half + jack_nframes_t subcnt = cnt / 2; + jack_nframes_t ofilepos = file_pos; + + // fade in + if (crossfade (data, subcnt, 1, workbuf) != subcnt) { + return 0; + } + + file_pos += subcnt; + Sample * tmpdata = data + subcnt; + + // fade out + subcnt = cnt - subcnt; + if (crossfade (tmpdata, subcnt, 0, workbuf) != subcnt) { + return 0; + } + + file_pos = ofilepos; // adjusted below + } + else if (_capture_start) { _capture_start = false; _capture_end = false; /* move to the correct location place */ - //file_pos = data_offset + (capture_start_frame * sizeof (Sample)); file_pos = capture_start_frame; cerr << "First frame of capture will be at " << file_pos << endl; |