(Untested) loop recording support in MIDI Diskstream (fix compilation broken by loop...
authorDavid Robillard <d@drobilla.net>
Tue, 26 Jun 2007 04:16:17 +0000 (04:16 +0000)
committerDavid Robillard <d@drobilla.net>
Tue, 26 Jun 2007 04:16:17 +0000 (04:16 +0000)
git-svn-id: svn://localhost/ardour2/trunk@2036 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/midi_diskstream.h
libs/ardour/midi_diskstream.cc

index cf78d0d05b6119a98834cde70430246fb1d6ee99..be329b470404986f18170360f0334e030663feb0 100644 (file)
@@ -127,6 +127,7 @@ class MidiDiskstream : public Diskstream
 
        void finish_capture (bool rec_monitors_input);
        void transport_stopped (struct tm&, time_t, bool abort);
+       void transport_looped (nframes_t transport_frame);
 
        void init (Diskstream::Flag);
 
@@ -145,6 +146,8 @@ class MidiDiskstream : public Diskstream
        void engage_record_enable ();
        void disengage_record_enable ();
        
+       /* FIXME: too much code duplication in this class because of lack of ChannelInfo */
+
        MidiRingBuffer*                   _playback_buf;
        MidiRingBuffer*                   _capture_buf;
        MidiPort*                         _source_port;
index 0626f6d423cf0cb68295572e906b7b754b969789..9114f689b2296d367bf75fc40b8d8a0b5cdeba6a 100644 (file)
@@ -1106,6 +1106,35 @@ MidiDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_cap
        capture_start_frame = 0;
 }
 
+void
+MidiDiskstream::transport_looped (nframes_t transport_frame)
+{
+       if (was_recording) {
+
+               // adjust the capture length knowing that the data will be recorded to disk
+               // only necessary after the first loop where we're recording
+               if (capture_info.size() == 0) {
+                       capture_captured += _capture_offset;
+
+                       if (_alignment_style == ExistingMaterial) {
+                               capture_captured += _session.worst_output_latency();
+                       } else {
+                               capture_captured += _roll_delay;
+                       }
+               }
+
+               finish_capture (true);
+
+               // the next region will start recording via the normal mechanism
+               // we'll set the start position to the current transport pos
+               // no latency adjustment or capture offset needs to be made, as that already happened the first time
+               capture_start_frame = transport_frame;
+               first_recordable_frame = transport_frame; // mild lie
+               last_recordable_frame = max_frames;
+               was_recording = true;
+       }
+}
+
 void
 MidiDiskstream::finish_capture (bool rec_monitors_input)
 {