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.
20 #include "pbd/enumwriter.h"
22 #include "pbd/memento_command.h"
24 #include "ardour/audioengine.h"
25 #include "ardour/audioplaylist.h"
26 #include "ardour/audio_buffer.h"
27 #include "ardour/butler.h"
28 #include "ardour/debug.h"
29 #include "ardour/disk_reader.h"
30 #include "ardour/midi_ring_buffer.h"
31 #include "ardour/midi_playlist.h"
32 #include "ardour/pannable.h"
33 #include "ardour/playlist.h"
34 #include "ardour/playlist_factory.h"
35 #include "ardour/session.h"
36 #include "ardour/session_playlists.h"
38 using namespace ARDOUR;
42 ARDOUR::framecnt_t DiskReader::_chunk_frames = default_chunk_frames ();
43 PBD::Signal0<void> DiskReader::Underrun;
44 Sample* DiskReader::_mixdown_buffer = 0;
45 gain_t* DiskReader::_gain_buffer = 0;
46 framecnt_t DiskReader::midi_readahead = 4096;
48 DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
49 : DiskIOProcessor (s, str, f)
52 , overwrite_offset (0)
53 , _pending_overwrite (false)
54 , overwrite_queued (false)
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 (_route);
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 frameoffset_t playback_distance = nframes;
243 MonitorState ms = _route->monitoring_state ();
246 if (!_pending_active) {
251 if (_pending_active) {
258 _need_butler = false;
260 if (speed != 1.0f && speed != -1.0f) {
261 interpolation.set_speed (speed);
262 midi_interpolation.set_speed (speed);
263 playback_distance = midi_interpolation.distance (nframes);
267 playback_distance = -playback_distance;
270 if (!result_required || ((ms & MonitoringDisk) == 0)) {
272 /* no need for actual disk data, just advance read pointer and return */
274 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
275 (*chan)->buf->increment_read_ptr (playback_distance);
280 /* we need audio data from disk */
282 size_t n_buffers = bufs.count().n_audio();
283 size_t n_chans = c->size();
285 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
287 if (n_chans > n_buffers) {
288 scaling = ((float) n_buffers)/n_chans;
293 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
295 ChannelInfo* chaninfo (*chan);
296 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
297 Sample* outgoing = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
299 if (ms & MonitoringInput) {
300 /* put disk stream in scratch buffer, blend at end */
301 outgoing = scratch_bufs.get_audio(n).data ();
303 /* no input stream needed, just overwrite buffers */
304 outgoing = buf.data ();
307 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
309 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
311 if (fabsf (speed) != 1.0f) {
312 (void) interpolation.interpolate (
314 chaninfo->rw_vector.buf[0],
317 memcpy (outgoing, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
322 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
324 if (playback_distance <= total) {
326 /* We have enough samples, but not in one lump.
329 if (fabsf (speed) != 1.0f) {
330 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
331 chaninfo->rw_vector.buf[0],
333 outgoing += chaninfo->rw_vector.len[0];
334 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
335 chaninfo->rw_vector.buf[1],
339 chaninfo->rw_vector.buf[0],
340 chaninfo->rw_vector.len[0] * sizeof (Sample));
341 outgoing += chaninfo->rw_vector.len[0];
343 chaninfo->rw_vector.buf[1],
344 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
349 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
350 cerr << "underrun for " << _name << endl;
351 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
352 DEBUG_THREAD_SELF, name(), total));
359 if (scaling != 1.0f) {
360 apply_gain_to_buffer (outgoing, nframes, scaling);
363 chaninfo->buf->increment_read_ptr (playback_distance);
365 if (ms & MonitoringInput) {
366 /* mix the disk signal into the input signal (already in bufs) */
367 mix_buffers_no_gain (buf.data(), outgoing, speed == 0.0 ? nframes : playback_distance);
372 /* MIDI data handling */
374 if (!_session.declick_out_pending()) {
376 /* copy the diskstream data to all output buffers */
378 MidiBuffer& mbuf (bufs.get_midi (0));
379 get_playback (mbuf, playback_distance);
382 if (speed != 0.0 && fabsf (speed) != 1.0f) {
383 MidiBuffer& mbuf (bufs.get_midi (0));
384 for (MidiBuffer::iterator i = mbuf.begin(); i != mbuf.end(); ++i) {
385 MidiBuffer::TimeType *tme = i.timeptr();
386 *tme = (*tme) * nframes / playback_distance;
392 playback_sample -= playback_distance;
394 playback_sample += playback_distance;
397 if (_playlists[DataType::AUDIO]) {
400 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
401 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
402 c->front()->buf->bufsize()));
406 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
407 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
415 if (_playlists[DataType::MIDI]) {
416 /* MIDI butler needed part */
418 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
419 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
422 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
423 " = " << frames_written - frames_read
424 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
427 /* frames_read will generally be less than frames_written, but
428 * immediately after an overwrite, we can end up having read some data
429 * before we've written any. we don't need to trip an assert() on this,
430 * but we do need to check so that the decision on whether or not we
431 * need the butler is done correctly.
436 * Doing heavy GUI operations[1] can stall also the butler.
437 * The RT-thread meanwhile will happily continue and
438 * ‘frames_read’ (from buffer to output) will become larger
439 * than ‘frames_written’ (from disk to buffer).
441 * The disk-stream is now behind..
443 * In those cases the butler needs to be summed to refill the buffer (done now)
444 * AND we need to skip (frames_read - frames_written). ie remove old events
445 * before playback_sample from the rinbuffer.
447 * [1] one way to do so is described at #6170.
448 * For me just popping up the context-menu on a MIDI-track header
449 * of a track with a large (think beethoven :) midi-region also did the
450 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
452 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
455 if (frames_read <= frames_written) {
456 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
459 cerr << name() << " fr " << frames_read << " > " << frames_written << endl;
467 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
471 DiskReader::set_pending_overwrite (bool yn)
473 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
475 _pending_overwrite = yn;
477 overwrite_frame = playback_sample;
479 boost::shared_ptr<ChannelList> c = channels.reader ();
481 overwrite_offset = c->front()->buf->get_read_ptr();
486 DiskReader::overwrite_existing_buffers ()
490 boost::shared_ptr<ChannelList> c = channels.reader();
492 overwrite_queued = false;
494 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
500 const bool reversed = _session.transport_speed() < 0.0f;
502 /* assume all are the same size */
503 framecnt_t size = c->front()->buf->bufsize();
505 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
506 std::auto_ptr<float> gain_buffer (new float[size]);
508 /* reduce size so that we can fill the buffer correctly (ringbuffers
509 can only handle size-1, otherwise they appear to be empty)
516 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
518 start = overwrite_frame;
519 framecnt_t cnt = size;
521 /* to fill the buffer without resetting the playback sample, we need to
522 do it one or two chunks (normally two).
524 |----------------------------------------------------------------------|
528 |<- second chunk->||<----------------- first chunk ------------------>|
532 framecnt_t to_read = size - overwrite_offset;
534 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
535 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
536 id(), size, playback_sample) << endmsg;
544 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
545 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
546 id(), size, playback_sample) << endmsg;
558 if (_midi_buf && _playlists[DataType::MIDI]) {
560 /* Clear the playback buffer contents. This is safe as long as the butler
561 thread is suspended, which it should be.
564 _midi_buf->reset_tracker ();
566 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
567 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
569 /* Resolve all currently active notes in the playlist. This is more
570 aggressive than it needs to be: ideally we would only resolve what is
571 absolutely necessary, but this seems difficult and/or impossible without
572 having the old data or knowing what change caused the overwrite.
574 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
576 midi_read (overwrite_frame, _chunk_frames, false);
578 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
581 _pending_overwrite = false;
587 DiskReader::seek (framepos_t frame, bool complete_refill)
591 ChannelList::iterator chan;
592 boost::shared_ptr<ChannelList> c = channels.reader();
594 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
595 (*chan)->buf->reset ();
598 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
599 /* we haven't read anything since the last seek,
600 so flush all note trackers to prevent
607 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
608 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
610 playback_sample = frame;
613 if (complete_refill) {
614 /* call _do_refill() to refill the entire buffer, using
615 the largest reads possible.
617 while ((ret = do_refill_with_alloc (false)) > 0) ;
619 /* call _do_refill() to refill just one chunk, and then
622 ret = do_refill_with_alloc (true);
630 DiskReader::can_internal_playback_seek (framecnt_t distance)
634 ChannelList::iterator chan;
635 boost::shared_ptr<ChannelList> c = channels.reader();
637 for (chan = c->begin(); chan != c->end(); ++chan) {
638 if ((*chan)->buf->read_space() < (size_t) distance) {
645 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
646 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
648 return ((frames_written - frames_read) < distance);
652 DiskReader::internal_playback_seek (framecnt_t distance)
654 ChannelList::iterator chan;
655 boost::shared_ptr<ChannelList> c = channels.reader();
657 for (chan = c->begin(); chan != c->end(); ++chan) {
658 (*chan)->buf->increment_read_ptr (::llabs(distance));
661 playback_sample += distance;
667 void swap_by_ptr (Sample *first, Sample *last)
669 while (first < last) {
676 /** Read some data for 1 channel from our playlist into a buffer.
677 * @param buf Buffer to write to.
678 * @param start Session frame to start reading from; updated to where we end up
680 * @param cnt Count of samples to read.
681 * @param reversed true if we are running backwards, otherwise false.
684 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
685 framepos_t& start, framecnt_t cnt,
686 int channel, bool reversed)
688 framecnt_t this_read = 0;
690 framepos_t loop_end = 0;
691 framepos_t loop_start = 0;
692 framecnt_t offset = 0;
695 if (!_playlists[DataType::AUDIO]) {
696 memset (buf, 0, sizeof (Sample) * cnt);
700 /* XXX we don't currently play loops in reverse. not sure why */
704 framecnt_t loop_length = 0;
706 /* Make the use of a Location atomic for this read operation.
708 Note: Locations don't get deleted, so all we care about
709 when I say "atomic" is that we are always pointing to
710 the same one and using a start/length values obtained
714 if ((loc = loop_location) != 0) {
715 loop_start = loc->start();
716 loop_end = loc->end();
717 loop_length = loop_end - loop_start;
720 /* if we are looping, ensure that the first frame we read is at the correct
721 position within the loop.
724 if (loc && start >= loop_end) {
725 start = loop_start + ((start - loop_start) % loop_length);
734 /* We need this while loop in case we hit a loop boundary, in which case our read from
735 the playlist must be split into more than one section.
740 /* take any loop into account. we can't read past the end of the loop. */
742 if (loc && (loop_end - start < cnt)) {
743 this_read = loop_end - start;
750 if (this_read == 0) {
754 this_read = min(cnt,this_read);
756 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
757 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
764 swap_by_ptr (buf, buf + this_read - 1);
768 /* if we read to the end of the loop, go back to the beginning */
785 DiskReader::_do_refill_with_alloc (bool partial_fill)
787 /* We limit disk reads to at most 4MB chunks, which with floating point
788 samples would be 1M samples. But we might use 16 or 14 bit samples,
789 in which case 4MB is more samples than that. Therefore size this for
790 the smallest sample value .. 4MB = 2M samples (16 bit).
794 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
795 std::auto_ptr<float> gain_buf (new float[2*1048576]);
797 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
804 return refill_midi ();
808 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
810 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
816 return refill_midi ();
820 /** Get some more data from disk and put it in our channels' bufs,
821 * if there is suitable space in them.
823 * If fill_level is non-zero, then we will refill the buffer so that there is
824 * still at least fill_level samples of space left to be filled. This is used
825 * after locates so that we do not need to wait to fill the entire buffer.
830 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
832 /* do not read from disk while session is marked as Loading, to avoid
833 useless redundant I/O.
836 if (_session.loading()) {
842 RingBufferNPT<Sample>::rw_vector vector;
843 bool const reversed = _session.transport_speed() < 0.0f;
844 framecnt_t total_space;
845 framecnt_t zero_fill;
847 ChannelList::iterator i;
848 boost::shared_ptr<ChannelList> c = channels.reader();
855 assert(mixdown_buffer);
863 c->front()->buf->get_write_vector (&vector);
865 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
866 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
867 /* nowhere to write to */
872 if (fill_level < total_space) {
873 total_space -= fill_level;
875 /* we can't do anything with it */
880 /* if we're running close to normal speed and there isn't enough
881 space to do disk_read_chunk_frames of I/O, then don't bother.
883 at higher speeds, just do it because the sync between butler
884 and audio thread may not be good enough.
886 Note: it is a design assumption that disk_read_chunk_frames is smaller
887 than the playback buffer size, so this check should never trip when
888 the playback buffer is empty.
891 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()));
892 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
896 /* when slaved, don't try to get too close to the read pointer. this
897 leaves space for the buffer reversal to have something useful to
901 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
902 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
908 if (file_frame == 0) {
910 /* at start: nothing to do but fill with silence */
912 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
914 ChannelInfo* chan (*i);
915 chan->buf->get_write_vector (&vector);
916 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
918 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
920 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
925 if (file_frame < total_space) {
927 /* too close to the start: read what we can,
928 and then zero fill the rest
931 zero_fill = total_space - file_frame;
932 total_space = file_frame;
941 if (file_frame == max_framepos) {
943 /* at end: nothing to do but fill with silence */
945 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
947 ChannelInfo* chan (*i);
948 chan->buf->get_write_vector (&vector);
949 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
951 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
953 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
958 if (file_frame > max_framepos - total_space) {
960 /* to close to the end: read what we can, and zero fill the rest */
962 zero_fill = total_space - (max_framepos - file_frame);
963 total_space = max_framepos - file_frame;
970 framepos_t file_frame_tmp = 0;
972 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
974 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
975 size_t total_bytes = total_space * bits_per_sample / 8;
977 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
979 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
981 /* find nearest (lower) multiple of 16384 */
983 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
985 /* now back to samples */
987 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
989 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
991 // uint64_t before = g_get_monotonic_time ();
994 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
996 ChannelInfo* chan (*i);
999 framecnt_t len1, len2;
1001 chan->buf->get_write_vector (&vector);
1003 if ((framecnt_t) vector.len[0] > samples_to_read) {
1005 /* we're not going to fill the first chunk, so certainly do not bother with the
1006 other part. it won't be connected with the part we do fill, as in:
1008 .... => writable space
1009 ++++ => readable space
1010 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1012 |......|+++++++++++++|...............................|
1017 So, just pretend that the buf1 part isn't there.
1027 file_frame_tmp = file_frame;
1029 buf1 = vector.buf[0];
1030 len1 = vector.len[0];
1031 buf2 = vector.buf[1];
1032 len2 = vector.len[1];
1034 to_read = min (ts, len1);
1035 to_read = min (to_read, (framecnt_t) samples_to_read);
1037 assert (to_read >= 0);
1041 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1046 chan->buf->increment_write_ptr (to_read);
1050 to_read = min (ts, len2);
1054 /* we read all of vector.len[0], but it wasn't the
1055 entire samples_to_read of data, so read some or
1056 all of vector.len[1] as well.
1059 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1064 chan->buf->increment_write_ptr (to_read);
1068 /* XXX: do something */
1073 // elapsed = g_get_monotonic_time () - before;
1074 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1076 file_frame = file_frame_tmp;
1077 assert (file_frame >= 0);
1079 ret = ((total_space - samples_to_read) > _chunk_frames);
1081 c->front()->buf->get_write_vector (&vector);
1088 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1090 /* If we're coming from an undo, it will have handled
1091 automation undo (it must, since automation-follows-regions
1092 can lose automation data). Hence we can do nothing here.
1099 if (!_route || Config->get_automation_follows_regions () == false) {
1103 list< Evoral::RangeMove<double> > movements;
1105 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1106 i != movements_frames.end();
1109 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1112 /* move panner automation */
1113 boost::shared_ptr<Pannable> pannable = _route->pannable();
1114 Evoral::ControlSet::Controls& c (pannable->controls());
1116 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1117 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1121 boost::shared_ptr<AutomationList> alist = ac->alist();
1122 if (!alist->size()) {
1125 XMLNode & before = alist->get_state ();
1126 bool const things_moved = alist->move_ranges (movements);
1128 _session.add_command (new MementoCommand<AutomationList> (
1129 *alist.get(), &before, &alist->get_state ()));
1132 /* move processor automation */
1133 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1137 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1139 boost::shared_ptr<Processor> processor (p.lock ());
1144 list< Evoral::RangeMove<double> > movements;
1145 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1146 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1149 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1151 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1152 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1156 XMLNode & before = al->get_state ();
1157 bool const things_moved = al->move_ranges (movements);
1159 _session.add_command (
1160 new MementoCommand<AutomationList> (
1161 *al.get(), &before, &al->get_state ()
1168 boost::shared_ptr<MidiBuffer>
1169 DiskReader::get_gui_feed_buffer () const
1171 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1173 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1174 b->copy (_gui_feed_buffer);
1179 DiskReader::reset_tracker ()
1181 _midi_buf->reset_tracker ();
1183 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1186 mp->reset_note_trackers ();
1191 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1193 _midi_buf->resolve_tracker(buffer, time);
1195 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1198 mp->reset_note_trackers ();
1203 DiskReader::flush_playback (framepos_t start, framepos_t end)
1205 _midi_buf->flush (start, end);
1206 g_atomic_int_add (&_frames_read_from_ringbuffer, end - start);
1209 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1210 * so that an event at playback_sample has time = 0
1213 DiskReader::get_playback (MidiBuffer& dst, framecnt_t nframes)
1217 Location* loc = loop_location;
1219 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1220 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1221 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1222 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1224 //cerr << "======== PRE ========\n";
1225 //_midi_buf->dump (cerr);
1226 //cerr << "----------------\n";
1228 size_t events_read = 0;
1231 framepos_t effective_start;
1233 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1234 effective_start = loop_range.squish (playback_sample);
1236 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1238 if (effective_start == loc->start()) {
1239 /* We need to turn off notes that may extend
1240 beyond the loop end.
1243 _midi_buf->resolve_tracker (dst, 0);
1246 /* for split-cycles we need to offset the events */
1248 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1250 /* end of loop is within the range we are reading, so
1251 split the read in two, and lie about the location
1255 framecnt_t first, second;
1257 first = loc->end() - effective_start;
1258 second = nframes - first;
1260 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1261 effective_start, loc->end(), first, second));
1264 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1265 effective_start, first));
1266 events_read = _midi_buf->read (dst, effective_start, first);
1270 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1271 loc->start(), second));
1272 events_read += _midi_buf->read (dst, loc->start(), second);
1276 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1277 effective_start, nframes));
1278 events_read = _midi_buf->read (dst, effective_start, effective_start + nframes);
1281 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1282 if (n_skipped > 0) {
1283 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1285 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1286 events_read = _midi_buf->read (dst, playback_sample, playback_sample + nframes);
1289 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1290 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1291 _name, events_read, playback_sample, playback_sample + nframes,
1292 _midi_buf->read_space(), _midi_buf->write_space(),
1293 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1295 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1297 //cerr << "======== POST ========\n";
1298 //_midi_buf->dump (cerr);
1299 //cerr << "----------------\n";
1302 /** @a start is set to the new frame position (TIME) read up to */
1304 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1306 framecnt_t this_read = 0;
1307 framepos_t loop_end = 0;
1308 framepos_t loop_start = 0;
1309 framecnt_t loop_length = 0;
1310 Location* loc = loop_location;
1311 framepos_t effective_start = start;
1312 Evoral::Range<framepos_t>* loop_range (0);
1314 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1315 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1316 MidiChannelFilter* filter = 0;
1318 frameoffset_t loop_offset = 0;
1320 if (!reversed && loc) {
1321 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1326 /* take any loop into account. we can't read past the end of the loop. */
1328 if (loc && !reversed) {
1331 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1334 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1335 position within the loop.
1338 effective_start = loop_range->squish (effective_start);
1340 if ((loop_end - effective_start) <= dur) {
1341 /* too close to end of loop to read "dur", so
1344 this_read = loop_end - effective_start;
1353 if (this_read == 0) {
1357 this_read = min (dur,this_read);
1359 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1361 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1362 error << string_compose(
1363 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1364 id(), this_read, start) << endmsg;
1368 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1372 // Swap note ons with note offs here. etc?
1373 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1374 // CC values etc. hard.
1378 /* adjust passed-by-reference argument (note: this is
1379 monotonic and does not reflect looping.
1383 /* similarly adjust effective_start, but this may be
1384 readjusted for seamless looping as we continue around
1387 effective_start += this_read;
1391 //offset += this_read;
1398 DiskReader::refill_midi ()
1400 if (!_playlists[DataType::MIDI]) {
1404 size_t write_space = _midi_buf->write_space();
1405 const bool reversed = _session.transport_speed() < 0.0f;
1407 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1409 /* no space to write */
1410 if (write_space == 0) {
1418 /* at end: nothing to do */
1420 if (file_frame == max_framepos) {
1425 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1426 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1428 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1432 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1434 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1435 to_read = min (to_read, (framecnt_t) write_space);
1437 if (midi_read (file_frame, to_read, reversed)) {