2 Copyright (C) 2009-2016 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 #include "pbd/memento_command.h"
23 #include "ardour/audioengine.h"
24 #include "ardour/audioplaylist.h"
25 #include "ardour/audio_buffer.h"
26 #include "ardour/butler.h"
27 #include "ardour/debug.h"
28 #include "ardour/disk_reader.h"
29 #include "ardour/midi_ring_buffer.h"
30 #include "ardour/midi_playlist.h"
31 #include "ardour/pannable.h"
32 #include "ardour/playlist.h"
33 #include "ardour/playlist_factory.h"
34 #include "ardour/session.h"
35 #include "ardour/session_playlists.h"
37 using namespace ARDOUR;
41 ARDOUR::framecnt_t DiskReader::_chunk_frames = default_chunk_frames ();
42 PBD::Signal0<void> DiskReader::Underrun;
43 Sample* DiskReader::_mixdown_buffer = 0;
44 gain_t* DiskReader::_gain_buffer = 0;
45 framecnt_t DiskReader::midi_readahead = 4096;
47 DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
48 : DiskIOProcessor (s, str, f)
51 , overwrite_offset (0)
52 , _pending_overwrite (false)
53 , overwrite_queued (false)
54 , _monitoring_choice (MonitorDisk)
55 , _gui_feed_buffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
59 DiskReader::~DiskReader ()
61 DEBUG_TRACE (DEBUG::Destruction, string_compose ("DiskReader %1 deleted\n", _name));
63 for (uint32_t n = 0; n < DataType::num_types; ++n) {
65 _playlists[n]->release ();
70 RCUWriter<ChannelList> writer (channels);
71 boost::shared_ptr<ChannelList> c = writer.get_copy();
73 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
86 DiskReader::allocate_working_buffers()
88 /* with varifill buffer refilling, we compute the read size in bytes (to optimize
89 for disk i/o bandwidth) and then convert back into samples. These buffers
90 need to reflect the maximum size we could use, which is 4MB reads, or 2M samples
93 _mixdown_buffer = new Sample[2*1048576];
94 _gain_buffer = new gain_t[2*1048576];
98 DiskReader::free_working_buffers()
100 delete [] _mixdown_buffer;
101 delete [] _gain_buffer;
107 DiskReader::default_chunk_frames()
113 DiskReader::set_name (string const & str)
115 string my_name = X_("reader:");
118 if (_name != my_name) {
119 SessionObject::set_name (my_name);
126 DiskReader::set_roll_delay (ARDOUR::framecnt_t nframes)
128 _roll_delay = nframes;
132 DiskReader::state (bool full)
134 XMLNode& node (DiskIOProcessor::state (full));
135 node.set_property(X_("type"), X_("diskreader"));
140 DiskReader::set_state (const XMLNode& node, int version)
142 if (DiskIOProcessor::set_state (node, version)) {
150 DiskReader::realtime_handle_transport_stopped ()
152 realtime_speed_change ();
156 DiskReader::realtime_locate ()
161 DiskReader::buffer_load () const
163 /* Note: for MIDI it's not trivial to differentiate the following two cases:
165 1. The playback buffer is empty because the system has run out of time to fill it.
166 2. The playback buffer is empty because there is no more data on the playlist.
168 If we use a simple buffer load computation, we will report that the MIDI diskstream
169 cannot keep up when #2 happens, when in fact it can. Since MIDI data rates
170 are so low compared to audio, just use the audio value here.
173 boost::shared_ptr<ChannelList> c = channels.reader();
176 /* no channels, so no buffers, so completely full and ready to playback, sir! */
180 PBD::RingBufferNPT<Sample> * b = c->front()->buf;
181 return (float) ((double) b->read_space() / (double) b->bufsize());
185 DiskReader::adjust_buffering ()
187 boost::shared_ptr<ChannelList> c = channels.reader();
189 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
190 (*chan)->resize (_session.butler()->audio_diskstream_playback_buffer_size());
195 DiskReader::playlist_changed (const PropertyChange&)
197 playlist_modified ();
201 DiskReader::playlist_modified ()
203 if (!i_am_the_modifier && !overwrite_queued) {
204 // !!!! _session.request_overwrite_buffer (this);
205 overwrite_queued = true;
210 DiskReader::use_playlist (DataType dt, boost::shared_ptr<Playlist> playlist)
212 bool prior_playlist = false;
214 if (_playlists[dt]) {
215 prior_playlist = true;
218 if (DiskIOProcessor::use_playlist (dt, playlist)) {
222 /* don't do this if we've already asked for it *or* if we are setting up
223 the diskstream for the very first time - the input changed handling will
224 take care of the buffer refill.
227 if (!overwrite_queued && (prior_playlist || _session.loading())) {
228 _session.request_overwrite_buffer (_route);
229 overwrite_queued = true;
236 DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
237 double speed, pframes_t nframes, bool result_required)
240 boost::shared_ptr<ChannelList> c = channels.reader();
241 ChannelList::iterator chan;
242 const bool need_disk_signal = result_required || _monitoring_choice == MonitorDisk || _monitoring_choice == MonitorCue;
243 frameoffset_t playback_distance = nframes;
245 _need_butler = false;
248 if (speed != 1.0f && speed != -1.0f) {
249 interpolation.set_speed (speed);
250 midi_interpolation.set_speed (speed);
251 playback_distance = midi_interpolation.distance (nframes);
255 playback_distance = -playback_distance;
258 if (!need_disk_signal) {
260 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
261 (*chan)->buf->increment_read_ptr (playback_distance);
267 /* we're doing playback */
269 size_t n_buffers = bufs.count().n_audio();
270 size_t n_chans = c->size();
273 if (n_chans > n_buffers) {
274 scaling = ((float) n_buffers)/n_chans;
279 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
281 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
282 Sample* outgoing = buf.data ();
284 ChannelInfo* chaninfo (*chan);
286 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
288 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
290 if (fabsf (speed) != 1.0f) {
291 (void) interpolation.interpolate (
293 chaninfo->rw_vector.buf[0],
296 memcpy (outgoing, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
301 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
303 if (playback_distance <= total) {
305 /* We have enough samples, but not in one lump.
308 if (fabsf (speed) != 1.0f) {
309 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
310 chaninfo->rw_vector.buf[0],
312 outgoing += chaninfo->rw_vector.len[0];
313 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
314 chaninfo->rw_vector.buf[1],
318 chaninfo->rw_vector.buf[0],
319 chaninfo->rw_vector.len[0] * sizeof (Sample));
320 outgoing += chaninfo->rw_vector.len[0];
322 chaninfo->rw_vector.buf[1],
323 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
328 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
329 cerr << "underrun for " << _name << endl;
330 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
331 DEBUG_THREAD_SELF, name(), total));
339 if (scaling != 1.0f) {
340 apply_gain_to_buffer (outgoing, nframes, scaling);
343 chaninfo->buf->increment_read_ptr (playback_distance);
346 /* MIDI data handling */
348 if (!_session.declick_out_pending()) {
350 /* copy the diskstream data to all output buffers */
352 MidiBuffer& mbuf (bufs.get_midi (0));
353 get_playback (mbuf, playback_distance);
356 if (speed != 0.0 && fabsf (speed) != 1.0f) {
357 MidiBuffer& mbuf (bufs.get_midi (0));
358 for (MidiBuffer::iterator i = mbuf.begin(); i != mbuf.end(); ++i) {
359 MidiBuffer::TimeType *tme = i.timeptr();
360 *tme = (*tme) * nframes / playback_distance;
366 playback_sample -= playback_distance;
368 playback_sample += playback_distance;
371 if (_playlists[DataType::AUDIO]) {
374 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
375 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
376 c->front()->buf->bufsize()));
380 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
381 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
389 if (_playlists[DataType::MIDI]) {
390 /* MIDI butler needed part */
392 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
393 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
396 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
397 " = " << frames_written - frames_read
398 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
401 /* frames_read will generally be less than frames_written, but
402 * immediately after an overwrite, we can end up having read some data
403 * before we've written any. we don't need to trip an assert() on this,
404 * but we do need to check so that the decision on whether or not we
405 * need the butler is done correctly.
410 * Doing heavy GUI operations[1] can stall also the butler.
411 * The RT-thread meanwhile will happily continue and
412 * ‘frames_read’ (from buffer to output) will become larger
413 * than ‘frames_written’ (from disk to buffer).
415 * The disk-stream is now behind..
417 * In those cases the butler needs to be summed to refill the buffer (done now)
418 * AND we need to skip (frames_read - frames_written). ie remove old events
419 * before playback_sample from the rinbuffer.
421 * [1] one way to do so is described at #6170.
422 * For me just popping up the context-menu on a MIDI-track header
423 * of a track with a large (think beethoven :) midi-region also did the
424 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
426 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
429 if (frames_read <= frames_written) {
430 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
433 cerr << name() << " fr " << frames_read << " > " << frames_written << endl;
440 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
441 /* make sure bufs shows whatever data we had available */
444 cnt.set (DataType::MIDI, 1);
445 cnt.set (DataType::AUDIO, bufs.count().n_audio());
446 bufs.set_count (cnt);
450 DiskReader::set_pending_overwrite (bool yn)
452 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
454 _pending_overwrite = yn;
456 overwrite_frame = playback_sample;
458 boost::shared_ptr<ChannelList> c = channels.reader ();
460 overwrite_offset = c->front()->buf->get_read_ptr();
465 DiskReader::overwrite_existing_buffers ()
469 boost::shared_ptr<ChannelList> c = channels.reader();
471 overwrite_queued = false;
473 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
479 const bool reversed = _session.transport_speed() < 0.0f;
481 /* assume all are the same size */
482 framecnt_t size = c->front()->buf->bufsize();
484 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
485 std::auto_ptr<float> gain_buffer (new float[size]);
487 /* reduce size so that we can fill the buffer correctly (ringbuffers
488 can only handle size-1, otherwise they appear to be empty)
495 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
497 start = overwrite_frame;
498 framecnt_t cnt = size;
500 /* to fill the buffer without resetting the playback sample, we need to
501 do it one or two chunks (normally two).
503 |----------------------------------------------------------------------|
507 |<- second chunk->||<----------------- first chunk ------------------>|
511 framecnt_t to_read = size - overwrite_offset;
513 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
514 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
515 id(), size, playback_sample) << endmsg;
523 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
524 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
525 id(), size, playback_sample) << endmsg;
537 if (_midi_buf && _playlists[DataType::MIDI]) {
539 /* Clear the playback buffer contents. This is safe as long as the butler
540 thread is suspended, which it should be.
543 _midi_buf->reset_tracker ();
545 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
546 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
548 /* Resolve all currently active notes in the playlist. This is more
549 aggressive than it needs to be: ideally we would only resolve what is
550 absolutely necessary, but this seems difficult and/or impossible without
551 having the old data or knowing what change caused the overwrite.
553 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
555 midi_read (overwrite_frame, _chunk_frames, false);
557 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
560 _pending_overwrite = false;
566 DiskReader::seek (framepos_t frame, bool complete_refill)
570 ChannelList::iterator chan;
571 boost::shared_ptr<ChannelList> c = channels.reader();
573 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
574 (*chan)->buf->reset ();
577 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
578 /* we haven't read anything since the last seek,
579 so flush all note trackers to prevent
586 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
587 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
589 playback_sample = frame;
592 if (complete_refill) {
593 /* call _do_refill() to refill the entire buffer, using
594 the largest reads possible.
596 while ((ret = do_refill_with_alloc (false)) > 0) ;
598 /* call _do_refill() to refill just one chunk, and then
601 ret = do_refill_with_alloc (true);
609 DiskReader::can_internal_playback_seek (framecnt_t distance)
613 ChannelList::iterator chan;
614 boost::shared_ptr<ChannelList> c = channels.reader();
616 for (chan = c->begin(); chan != c->end(); ++chan) {
617 if ((*chan)->buf->read_space() < (size_t) distance) {
624 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
625 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
627 return ((frames_written - frames_read) < distance);
631 DiskReader::internal_playback_seek (framecnt_t distance)
633 ChannelList::iterator chan;
634 boost::shared_ptr<ChannelList> c = channels.reader();
636 for (chan = c->begin(); chan != c->end(); ++chan) {
637 (*chan)->buf->increment_read_ptr (::llabs(distance));
640 playback_sample += distance;
646 void swap_by_ptr (Sample *first, Sample *last)
648 while (first < last) {
655 /** Read some data for 1 channel from our playlist into a buffer.
656 * @param buf Buffer to write to.
657 * @param start Session frame to start reading from; updated to where we end up
659 * @param cnt Count of samples to read.
660 * @param reversed true if we are running backwards, otherwise false.
663 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
664 framepos_t& start, framecnt_t cnt,
665 int channel, bool reversed)
667 framecnt_t this_read = 0;
669 framepos_t loop_end = 0;
670 framepos_t loop_start = 0;
671 framecnt_t offset = 0;
674 if (!_playlists[DataType::AUDIO]) {
675 memset (buf, 0, sizeof (Sample) * cnt);
679 /* XXX we don't currently play loops in reverse. not sure why */
683 framecnt_t loop_length = 0;
685 /* Make the use of a Location atomic for this read operation.
687 Note: Locations don't get deleted, so all we care about
688 when I say "atomic" is that we are always pointing to
689 the same one and using a start/length values obtained
693 if ((loc = loop_location) != 0) {
694 loop_start = loc->start();
695 loop_end = loc->end();
696 loop_length = loop_end - loop_start;
699 /* if we are looping, ensure that the first frame we read is at the correct
700 position within the loop.
703 if (loc && start >= loop_end) {
704 start = loop_start + ((start - loop_start) % loop_length);
713 /* We need this while loop in case we hit a loop boundary, in which case our read from
714 the playlist must be split into more than one section.
719 /* take any loop into account. we can't read past the end of the loop. */
721 if (loc && (loop_end - start < cnt)) {
722 this_read = loop_end - start;
729 if (this_read == 0) {
733 this_read = min(cnt,this_read);
735 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
736 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
743 swap_by_ptr (buf, buf + this_read - 1);
747 /* if we read to the end of the loop, go back to the beginning */
764 DiskReader::_do_refill_with_alloc (bool partial_fill)
766 /* We limit disk reads to at most 4MB chunks, which with floating point
767 samples would be 1M samples. But we might use 16 or 14 bit samples,
768 in which case 4MB is more samples than that. Therefore size this for
769 the smallest sample value .. 4MB = 2M samples (16 bit).
773 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
774 std::auto_ptr<float> gain_buf (new float[2*1048576]);
776 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
783 return refill_midi ();
787 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
789 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
795 return refill_midi ();
799 /** Get some more data from disk and put it in our channels' bufs,
800 * if there is suitable space in them.
802 * If fill_level is non-zero, then we will refill the buffer so that there is
803 * still at least fill_level samples of space left to be filled. This is used
804 * after locates so that we do not need to wait to fill the entire buffer.
809 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
811 /* do not read from disk while session is marked as Loading, to avoid
812 useless redundant I/O.
815 if (_session.loading()) {
821 RingBufferNPT<Sample>::rw_vector vector;
822 bool const reversed = _session.transport_speed() < 0.0f;
823 framecnt_t total_space;
824 framecnt_t zero_fill;
826 ChannelList::iterator i;
827 boost::shared_ptr<ChannelList> c = channels.reader();
834 assert(mixdown_buffer);
842 c->front()->buf->get_write_vector (&vector);
844 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
845 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
846 /* nowhere to write to */
851 if (fill_level < total_space) {
852 total_space -= fill_level;
854 /* we can't do anything with it */
859 /* if we're running close to normal speed and there isn't enough
860 space to do disk_read_chunk_frames of I/O, then don't bother.
862 at higher speeds, just do it because the sync between butler
863 and audio thread may not be good enough.
865 Note: it is a design assumption that disk_read_chunk_frames is smaller
866 than the playback buffer size, so this check should never trip when
867 the playback buffer is empty.
870 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_frames, _session.transport_speed()));
871 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
875 /* when slaved, don't try to get too close to the read pointer. this
876 leaves space for the buffer reversal to have something useful to
880 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
881 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
887 if (file_frame == 0) {
889 /* at start: nothing to do but fill with silence */
891 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
893 ChannelInfo* chan (*i);
894 chan->buf->get_write_vector (&vector);
895 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
897 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
899 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
904 if (file_frame < total_space) {
906 /* too close to the start: read what we can,
907 and then zero fill the rest
910 zero_fill = total_space - file_frame;
911 total_space = file_frame;
920 if (file_frame == max_framepos) {
922 /* at end: nothing to do but fill with silence */
924 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
926 ChannelInfo* chan (*i);
927 chan->buf->get_write_vector (&vector);
928 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
930 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
932 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
937 if (file_frame > max_framepos - total_space) {
939 /* to close to the end: read what we can, and zero fill the rest */
941 zero_fill = total_space - (max_framepos - file_frame);
942 total_space = max_framepos - file_frame;
949 framepos_t file_frame_tmp = 0;
951 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
953 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
954 size_t total_bytes = total_space * bits_per_sample / 8;
956 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
958 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
960 /* find nearest (lower) multiple of 16384 */
962 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
964 /* now back to samples */
966 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
968 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
970 // uint64_t before = g_get_monotonic_time ();
973 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
975 ChannelInfo* chan (*i);
978 framecnt_t len1, len2;
980 chan->buf->get_write_vector (&vector);
982 if ((framecnt_t) vector.len[0] > samples_to_read) {
984 /* we're not going to fill the first chunk, so certainly do not bother with the
985 other part. it won't be connected with the part we do fill, as in:
987 .... => writable space
988 ++++ => readable space
989 ^^^^ => 1 x disk_read_chunk_frames that would be filled
991 |......|+++++++++++++|...............................|
996 So, just pretend that the buf1 part isn't there.
1006 file_frame_tmp = file_frame;
1008 buf1 = vector.buf[0];
1009 len1 = vector.len[0];
1010 buf2 = vector.buf[1];
1011 len2 = vector.len[1];
1013 to_read = min (ts, len1);
1014 to_read = min (to_read, (framecnt_t) samples_to_read);
1016 assert (to_read >= 0);
1020 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1025 chan->buf->increment_write_ptr (to_read);
1029 to_read = min (ts, len2);
1033 /* we read all of vector.len[0], but it wasn't the
1034 entire samples_to_read of data, so read some or
1035 all of vector.len[1] as well.
1038 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1043 chan->buf->increment_write_ptr (to_read);
1047 /* XXX: do something */
1052 // elapsed = g_get_monotonic_time () - before;
1053 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1055 file_frame = file_frame_tmp;
1056 assert (file_frame >= 0);
1058 ret = ((total_space - samples_to_read) > _chunk_frames);
1060 c->front()->buf->get_write_vector (&vector);
1067 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1069 /* If we're coming from an undo, it will have handled
1070 automation undo (it must, since automation-follows-regions
1071 can lose automation data). Hence we can do nothing here.
1078 if (!_route || Config->get_automation_follows_regions () == false) {
1082 list< Evoral::RangeMove<double> > movements;
1084 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1085 i != movements_frames.end();
1088 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1091 /* move panner automation */
1092 boost::shared_ptr<Pannable> pannable = _route->pannable();
1093 Evoral::ControlSet::Controls& c (pannable->controls());
1095 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1096 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1100 boost::shared_ptr<AutomationList> alist = ac->alist();
1101 if (!alist->size()) {
1104 XMLNode & before = alist->get_state ();
1105 bool const things_moved = alist->move_ranges (movements);
1107 _session.add_command (new MementoCommand<AutomationList> (
1108 *alist.get(), &before, &alist->get_state ()));
1111 /* move processor automation */
1112 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1116 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1118 boost::shared_ptr<Processor> processor (p.lock ());
1123 list< Evoral::RangeMove<double> > movements;
1124 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1125 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1128 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1130 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1131 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1135 XMLNode & before = al->get_state ();
1136 bool const things_moved = al->move_ranges (movements);
1138 _session.add_command (
1139 new MementoCommand<AutomationList> (
1140 *al.get(), &before, &al->get_state ()
1147 boost::shared_ptr<MidiBuffer>
1148 DiskReader::get_gui_feed_buffer () const
1150 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1152 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1153 b->copy (_gui_feed_buffer);
1158 DiskReader::reset_tracker ()
1160 _midi_buf->reset_tracker ();
1162 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1165 mp->reset_note_trackers ();
1170 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1172 _midi_buf->resolve_tracker(buffer, time);
1174 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1177 mp->reset_note_trackers ();
1182 DiskReader::flush_playback (framepos_t start, framepos_t end)
1184 _midi_buf->flush (start, end);
1185 g_atomic_int_add (&_frames_read_from_ringbuffer, end - start);
1188 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1189 * so that an event at playback_sample has time = 0
1192 DiskReader::get_playback (MidiBuffer& dst, framecnt_t nframes)
1196 Location* loc = loop_location;
1198 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1199 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1200 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1201 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1203 //cerr << "======== PRE ========\n";
1204 //_midi_buf->dump (cerr);
1205 //cerr << "----------------\n";
1207 size_t events_read = 0;
1210 framepos_t effective_start;
1212 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1213 effective_start = loop_range.squish (playback_sample);
1215 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1217 if (effective_start == loc->start()) {
1218 /* We need to turn off notes that may extend
1219 beyond the loop end.
1222 _midi_buf->resolve_tracker (dst, 0);
1225 /* for split-cycles we need to offset the events */
1227 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1229 /* end of loop is within the range we are reading, so
1230 split the read in two, and lie about the location
1234 framecnt_t first, second;
1236 first = loc->end() - effective_start;
1237 second = nframes - first;
1239 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1240 effective_start, loc->end(), first, second));
1243 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1244 effective_start, first));
1245 events_read = _midi_buf->read (dst, effective_start, first);
1249 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1250 loc->start(), second));
1251 events_read += _midi_buf->read (dst, loc->start(), second);
1255 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1256 effective_start, nframes));
1257 events_read = _midi_buf->read (dst, effective_start, effective_start + nframes);
1260 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1261 if (n_skipped > 0) {
1262 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1264 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1265 events_read = _midi_buf->read (dst, playback_sample, playback_sample + nframes);
1268 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1269 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1270 _name, events_read, playback_sample, playback_sample + nframes,
1271 _midi_buf->read_space(), _midi_buf->write_space(),
1272 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1274 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1276 //cerr << "======== POST ========\n";
1277 //_midi_buf->dump (cerr);
1278 //cerr << "----------------\n";
1281 /** @a start is set to the new frame position (TIME) read up to */
1283 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1285 framecnt_t this_read = 0;
1286 framepos_t loop_end = 0;
1287 framepos_t loop_start = 0;
1288 framecnt_t loop_length = 0;
1289 Location* loc = loop_location;
1290 framepos_t effective_start = start;
1291 Evoral::Range<framepos_t>* loop_range (0);
1293 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1294 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1295 MidiChannelFilter* filter = 0;
1297 frameoffset_t loop_offset = 0;
1299 if (!reversed && loc) {
1300 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1305 /* take any loop into account. we can't read past the end of the loop. */
1307 if (loc && !reversed) {
1310 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1313 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1314 position within the loop.
1317 effective_start = loop_range->squish (effective_start);
1319 if ((loop_end - effective_start) <= dur) {
1320 /* too close to end of loop to read "dur", so
1323 this_read = loop_end - effective_start;
1332 if (this_read == 0) {
1336 this_read = min (dur,this_read);
1338 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1340 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1341 error << string_compose(
1342 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1343 id(), this_read, start) << endmsg;
1347 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1351 // Swap note ons with note offs here. etc?
1352 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1353 // CC values etc. hard.
1357 /* adjust passed-by-reference argument (note: this is
1358 monotonic and does not reflect looping.
1362 /* similarly adjust effective_start, but this may be
1363 readjusted for seamless looping as we continue around
1366 effective_start += this_read;
1370 //offset += this_read;
1377 DiskReader::refill_midi ()
1379 if (!_playlists[DataType::MIDI]) {
1383 size_t write_space = _midi_buf->write_space();
1384 const bool reversed = _session.transport_speed() < 0.0f;
1386 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1388 /* no space to write */
1389 if (write_space == 0) {
1397 /* at end: nothing to do */
1399 if (file_frame == max_framepos) {
1404 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1405 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1407 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1411 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1413 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1414 to_read = min (to_read, (framecnt_t) write_space);
1416 if (midi_read (file_frame, to_read, reversed)) {