From eb8de01f4225c88ad0f6c5caec429f6196ca57dc Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Feb 2011 17:40:19 +0000 Subject: [PATCH] Fix previous patch a bit better. git-svn-id: svn://localhost/ardour2/branches/3.0@8959 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/audio_diskstream.h | 1 - libs/ardour/ardour/diskstream.h | 1 + libs/ardour/audio_diskstream.cc | 2 -- libs/ardour/diskstream.cc | 2 ++ libs/ardour/midi_diskstream.cc | 29 ++++++++++++++++++++++++--- 5 files changed, 29 insertions(+), 6 deletions(-) diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h index ff0a1c2a69..2bd44d62a6 100644 --- a/libs/ardour/ardour/audio_diskstream.h +++ b/libs/ardour/ardour/audio_diskstream.h @@ -284,7 +284,6 @@ class AudioDiskstream : public Diskstream int add_channel_to (boost::shared_ptr, uint32_t how_many); int remove_channel_from (boost::shared_ptr, uint32_t how_many); - framecnt_t playback_distance; }; } // namespace ARDOUR diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h index e81d8a1fd1..cd5932b3e5 100644 --- a/libs/ardour/ardour/diskstream.h +++ b/libs/ardour/ardour/diskstream.h @@ -288,6 +288,7 @@ class Diskstream : public SessionObject, public PublicDiskstream framepos_t file_frame; framepos_t playback_sample; + framecnt_t playback_distance; uint32_t _read_data_count; uint32_t _write_data_count; diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index a4c6ec178c..8a161c3977 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -76,7 +76,6 @@ AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream: : Diskstream(sess, name, flag) , deprecated_io_node(NULL) , channels (new ChannelList) - , playback_distance (0) { /* prevent any write sources from being created */ @@ -89,7 +88,6 @@ AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node) : Diskstream(sess, node) , deprecated_io_node(NULL) , channels (new ChannelList) - , playback_distance (0) { in_set_state = true; init (); diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc index 8720ea6d86..df9d1a9b4d 100644 --- a/libs/ardour/diskstream.cc +++ b/libs/ardour/diskstream.cc @@ -106,6 +106,7 @@ Diskstream::Diskstream (Session &sess, const string &name, Flag flag) , _target_speed (_speed) , file_frame (0) , playback_sample (0) + , playback_distance (0) , _read_data_count (0) , _write_data_count (0) , in_set_state (false) @@ -149,6 +150,7 @@ Diskstream::Diskstream (Session& sess, const XMLNode& /*node*/) , _target_speed (_speed) , file_frame (0) , playback_sample (0) + , playback_distance (0) , _read_data_count (0) , _write_data_count (0) , in_set_state (false) diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 50ad39c576..f434af50f3 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -496,6 +496,8 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can bool nominally_recording; bool re = record_enabled (); + playback_distance = 0; + check_record_status (transport_frame, can_record); nominally_recording = (can_record && re); @@ -557,10 +559,31 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can } if (rec_nframes) { + /* data will be written to disk */ + + if (rec_nframes == nframes && rec_offset == 0) { + playback_distance = nframes; + } + adjust_capture_position = rec_nframes; + + } else if (nominally_recording) { + + /* XXXX do this for MIDI !!! + can't do actual capture yet - waiting for latency effects to finish before we start + */ + + playback_distance = nframes; + + } else { + + /* XXX: should be doing varispeed stuff here, similar to the code in AudioDiskstream::process */ + + playback_distance = nframes; + } - + ret = 0; if (commit (nframes)) { @@ -576,9 +599,9 @@ MidiDiskstream::commit (framecnt_t nframes) bool need_butler = false; if (_actual_speed < 0.0) { - playback_sample -= nframes; + playback_sample -= playback_distance; } else { - playback_sample += nframes; + playback_sample += playback_distance; } if (adjust_capture_position != 0) {