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 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
272 if (!result_required || ((ms & MonitoringDisk) == 0)) {
274 /* no need for actual disk data, just advance read pointer and return */
276 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
277 (*chan)->buf->increment_read_ptr (playback_distance);
282 /* we need audio data from disk */
284 size_t n_buffers = bufs.count().n_audio();
285 size_t n_chans = c->size();
288 if (n_chans > n_buffers) {
289 scaling = ((float) n_buffers)/n_chans;
294 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
296 ChannelInfo* chaninfo (*chan);
297 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
298 Sample* outgoing = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
300 if (ms & MonitoringInput) {
301 /* put disk stream in scratch buffer, blend at end */
302 outgoing = scratch_bufs.get_audio(n).data ();
304 /* no input stream needed, just overwrite buffers */
305 outgoing = buf.data ();
308 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
310 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
312 if (fabsf (speed) != 1.0f) {
313 (void) interpolation.interpolate (
315 chaninfo->rw_vector.buf[0],
318 memcpy (outgoing, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
323 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
325 if (playback_distance <= total) {
327 /* We have enough samples, but not in one lump.
330 if (fabsf (speed) != 1.0f) {
331 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
332 chaninfo->rw_vector.buf[0],
334 outgoing += chaninfo->rw_vector.len[0];
335 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
336 chaninfo->rw_vector.buf[1],
340 chaninfo->rw_vector.buf[0],
341 chaninfo->rw_vector.len[0] * sizeof (Sample));
342 outgoing += chaninfo->rw_vector.len[0];
344 chaninfo->rw_vector.buf[1],
345 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
350 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
351 cerr << "underrun for " << _name << endl;
352 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
353 DEBUG_THREAD_SELF, name(), total));
360 if (scaling != 1.0f) {
361 apply_gain_to_buffer (outgoing, nframes, scaling);
364 chaninfo->buf->increment_read_ptr (playback_distance);
366 if (ms & MonitoringInput) {
367 /* mix the disk signal into the input signal (already in bufs) */
368 mix_buffers_no_gain (buf.data(), outgoing, speed == 0.0 ? nframes : playback_distance);
373 /* MIDI data handling */
375 if (!_session.declick_out_pending()) {
376 if (ms & MonitoringDisk) {
377 get_midi_playback (bufs.get_midi (0), playback_distance, ms, scratch_bufs, speed, playback_distance);
382 playback_sample -= playback_distance;
384 playback_sample += playback_distance;
387 if (_playlists[DataType::AUDIO]) {
390 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
391 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
392 c->front()->buf->bufsize()));
396 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
397 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
405 if (_playlists[DataType::MIDI]) {
406 /* MIDI butler needed part */
408 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
409 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
412 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
413 " = " << frames_written - frames_read
414 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
417 /* frames_read will generally be less than frames_written, but
418 * immediately after an overwrite, we can end up having read some data
419 * before we've written any. we don't need to trip an assert() on this,
420 * but we do need to check so that the decision on whether or not we
421 * need the butler is done correctly.
426 * Doing heavy GUI operations[1] can stall also the butler.
427 * The RT-thread meanwhile will happily continue and
428 * ‘frames_read’ (from buffer to output) will become larger
429 * than ‘frames_written’ (from disk to buffer).
431 * The disk-stream is now behind..
433 * In those cases the butler needs to be summed to refill the buffer (done now)
434 * AND we need to skip (frames_read - frames_written). ie remove old events
435 * before playback_sample from the rinbuffer.
437 * [1] one way to do so is described at #6170.
438 * For me just popping up the context-menu on a MIDI-track header
439 * of a track with a large (think beethoven :) midi-region also did the
440 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
442 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
445 if (frames_read <= frames_written) {
446 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
455 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
459 DiskReader::set_pending_overwrite (bool yn)
461 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
463 _pending_overwrite = yn;
465 overwrite_frame = playback_sample;
467 boost::shared_ptr<ChannelList> c = channels.reader ();
469 overwrite_offset = c->front()->buf->get_read_ptr();
474 DiskReader::overwrite_existing_buffers ()
478 boost::shared_ptr<ChannelList> c = channels.reader();
480 overwrite_queued = false;
482 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
488 const bool reversed = _session.transport_speed() < 0.0f;
490 /* assume all are the same size */
491 framecnt_t size = c->front()->buf->bufsize();
493 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
494 std::auto_ptr<float> gain_buffer (new float[size]);
496 /* reduce size so that we can fill the buffer correctly (ringbuffers
497 can only handle size-1, otherwise they appear to be empty)
504 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
506 start = overwrite_frame;
507 framecnt_t cnt = size;
509 /* to fill the buffer without resetting the playback sample, we need to
510 do it one or two chunks (normally two).
512 |----------------------------------------------------------------------|
516 |<- second chunk->||<----------------- first chunk ------------------>|
520 framecnt_t to_read = size - overwrite_offset;
522 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
523 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
524 id(), size, playback_sample) << endmsg;
532 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
533 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
534 id(), size, playback_sample) << endmsg;
546 if (_midi_buf && _playlists[DataType::MIDI]) {
548 /* Clear the playback buffer contents. This is safe as long as the butler
549 thread is suspended, which it should be.
552 _midi_buf->reset_tracker ();
554 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
555 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
557 /* Resolve all currently active notes in the playlist. This is more
558 aggressive than it needs to be: ideally we would only resolve what is
559 absolutely necessary, but this seems difficult and/or impossible without
560 having the old data or knowing what change caused the overwrite.
562 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
564 midi_read (overwrite_frame, _chunk_frames, false);
566 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
569 _pending_overwrite = false;
575 DiskReader::seek (framepos_t frame, bool complete_refill)
579 ChannelList::iterator chan;
580 boost::shared_ptr<ChannelList> c = channels.reader();
582 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
583 (*chan)->buf->reset ();
586 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
587 /* we haven't read anything since the last seek,
588 so flush all note trackers to prevent
595 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
596 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
598 playback_sample = frame;
601 if (complete_refill) {
602 /* call _do_refill() to refill the entire buffer, using
603 the largest reads possible.
605 while ((ret = do_refill_with_alloc (false)) > 0) ;
607 /* call _do_refill() to refill just one chunk, and then
610 ret = do_refill_with_alloc (true);
618 DiskReader::can_internal_playback_seek (framecnt_t distance)
622 ChannelList::iterator chan;
623 boost::shared_ptr<ChannelList> c = channels.reader();
625 for (chan = c->begin(); chan != c->end(); ++chan) {
626 if ((*chan)->buf->read_space() < (size_t) distance) {
633 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
634 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
636 return ((frames_written - frames_read) < distance);
640 DiskReader::internal_playback_seek (framecnt_t distance)
642 ChannelList::iterator chan;
643 boost::shared_ptr<ChannelList> c = channels.reader();
645 for (chan = c->begin(); chan != c->end(); ++chan) {
646 (*chan)->buf->increment_read_ptr (::llabs(distance));
649 playback_sample += distance;
655 void swap_by_ptr (Sample *first, Sample *last)
657 while (first < last) {
664 /** Read some data for 1 channel from our playlist into a buffer.
665 * @param buf Buffer to write to.
666 * @param start Session frame to start reading from; updated to where we end up
668 * @param cnt Count of samples to read.
669 * @param reversed true if we are running backwards, otherwise false.
672 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
673 framepos_t& start, framecnt_t cnt,
674 int channel, bool reversed)
676 framecnt_t this_read = 0;
678 framepos_t loop_end = 0;
679 framepos_t loop_start = 0;
680 framecnt_t offset = 0;
683 if (!_playlists[DataType::AUDIO]) {
684 memset (buf, 0, sizeof (Sample) * cnt);
688 /* XXX we don't currently play loops in reverse. not sure why */
692 framecnt_t loop_length = 0;
694 /* Make the use of a Location atomic for this read operation.
696 Note: Locations don't get deleted, so all we care about
697 when I say "atomic" is that we are always pointing to
698 the same one and using a start/length values obtained
702 if ((loc = loop_location) != 0) {
703 loop_start = loc->start();
704 loop_end = loc->end();
705 loop_length = loop_end - loop_start;
708 /* if we are looping, ensure that the first frame we read is at the correct
709 position within the loop.
712 if (loc && start >= loop_end) {
713 start = loop_start + ((start - loop_start) % loop_length);
722 /* We need this while loop in case we hit a loop boundary, in which case our read from
723 the playlist must be split into more than one section.
728 /* take any loop into account. we can't read past the end of the loop. */
730 if (loc && (loop_end - start < cnt)) {
731 this_read = loop_end - start;
738 if (this_read == 0) {
742 this_read = min(cnt,this_read);
744 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
745 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
752 swap_by_ptr (buf, buf + this_read - 1);
756 /* if we read to the end of the loop, go back to the beginning */
773 DiskReader::_do_refill_with_alloc (bool partial_fill)
775 /* We limit disk reads to at most 4MB chunks, which with floating point
776 samples would be 1M samples. But we might use 16 or 14 bit samples,
777 in which case 4MB is more samples than that. Therefore size this for
778 the smallest sample value .. 4MB = 2M samples (16 bit).
782 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
783 std::auto_ptr<float> gain_buf (new float[2*1048576]);
785 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
792 return refill_midi ();
796 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
798 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
804 return refill_midi ();
808 /** Get some more data from disk and put it in our channels' bufs,
809 * if there is suitable space in them.
811 * If fill_level is non-zero, then we will refill the buffer so that there is
812 * still at least fill_level samples of space left to be filled. This is used
813 * after locates so that we do not need to wait to fill the entire buffer.
818 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
820 /* do not read from disk while session is marked as Loading, to avoid
821 useless redundant I/O.
824 if (_session.loading()) {
830 RingBufferNPT<Sample>::rw_vector vector;
831 bool const reversed = _session.transport_speed() < 0.0f;
832 framecnt_t total_space;
833 framecnt_t zero_fill;
835 ChannelList::iterator i;
836 boost::shared_ptr<ChannelList> c = channels.reader();
843 assert(mixdown_buffer);
851 c->front()->buf->get_write_vector (&vector);
853 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
854 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
855 /* nowhere to write to */
860 if (fill_level < total_space) {
861 total_space -= fill_level;
863 /* we can't do anything with it */
868 /* if we're running close to normal speed and there isn't enough
869 space to do disk_read_chunk_frames of I/O, then don't bother.
871 at higher speeds, just do it because the sync between butler
872 and audio thread may not be good enough.
874 Note: it is a design assumption that disk_read_chunk_frames is smaller
875 than the playback buffer size, so this check should never trip when
876 the playback buffer is empty.
879 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()));
880 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
884 /* when slaved, don't try to get too close to the read pointer. this
885 leaves space for the buffer reversal to have something useful to
889 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
890 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
896 if (file_frame == 0) {
898 /* at start: nothing to do but fill with silence */
900 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
902 ChannelInfo* chan (*i);
903 chan->buf->get_write_vector (&vector);
904 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
906 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
908 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
913 if (file_frame < total_space) {
915 /* too close to the start: read what we can,
916 and then zero fill the rest
919 zero_fill = total_space - file_frame;
920 total_space = file_frame;
929 if (file_frame == max_framepos) {
931 /* at end: nothing to do but fill with silence */
933 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
935 ChannelInfo* chan (*i);
936 chan->buf->get_write_vector (&vector);
937 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
939 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
941 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
946 if (file_frame > max_framepos - total_space) {
948 /* to close to the end: read what we can, and zero fill the rest */
950 zero_fill = total_space - (max_framepos - file_frame);
951 total_space = max_framepos - file_frame;
958 framepos_t file_frame_tmp = 0;
960 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
962 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
963 size_t total_bytes = total_space * bits_per_sample / 8;
965 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
967 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
969 /* find nearest (lower) multiple of 16384 */
971 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
973 /* now back to samples */
975 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
977 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
979 // uint64_t before = g_get_monotonic_time ();
982 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
984 ChannelInfo* chan (*i);
987 framecnt_t len1, len2;
989 chan->buf->get_write_vector (&vector);
991 if ((framecnt_t) vector.len[0] > samples_to_read) {
993 /* we're not going to fill the first chunk, so certainly do not bother with the
994 other part. it won't be connected with the part we do fill, as in:
996 .... => writable space
997 ++++ => readable space
998 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1000 |......|+++++++++++++|...............................|
1005 So, just pretend that the buf1 part isn't there.
1015 file_frame_tmp = file_frame;
1017 buf1 = vector.buf[0];
1018 len1 = vector.len[0];
1019 buf2 = vector.buf[1];
1020 len2 = vector.len[1];
1022 to_read = min (ts, len1);
1023 to_read = min (to_read, (framecnt_t) samples_to_read);
1025 assert (to_read >= 0);
1029 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1034 chan->buf->increment_write_ptr (to_read);
1038 to_read = min (ts, len2);
1042 /* we read all of vector.len[0], but it wasn't the
1043 entire samples_to_read of data, so read some or
1044 all of vector.len[1] as well.
1047 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1052 chan->buf->increment_write_ptr (to_read);
1056 /* XXX: do something */
1061 // elapsed = g_get_monotonic_time () - before;
1062 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1064 file_frame = file_frame_tmp;
1065 assert (file_frame >= 0);
1067 ret = ((total_space - samples_to_read) > _chunk_frames);
1069 c->front()->buf->get_write_vector (&vector);
1076 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1078 /* If we're coming from an undo, it will have handled
1079 automation undo (it must, since automation-follows-regions
1080 can lose automation data). Hence we can do nothing here.
1087 if (!_route || Config->get_automation_follows_regions () == false) {
1091 list< Evoral::RangeMove<double> > movements;
1093 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1094 i != movements_frames.end();
1097 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1100 /* move panner automation */
1101 boost::shared_ptr<Pannable> pannable = _route->pannable();
1102 Evoral::ControlSet::Controls& c (pannable->controls());
1104 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1105 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1109 boost::shared_ptr<AutomationList> alist = ac->alist();
1110 if (!alist->size()) {
1113 XMLNode & before = alist->get_state ();
1114 bool const things_moved = alist->move_ranges (movements);
1116 _session.add_command (new MementoCommand<AutomationList> (
1117 *alist.get(), &before, &alist->get_state ()));
1120 /* move processor automation */
1121 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1125 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1127 boost::shared_ptr<Processor> processor (p.lock ());
1132 list< Evoral::RangeMove<double> > movements;
1133 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1134 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1137 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1139 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1140 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1144 XMLNode & before = al->get_state ();
1145 bool const things_moved = al->move_ranges (movements);
1147 _session.add_command (
1148 new MementoCommand<AutomationList> (
1149 *al.get(), &before, &al->get_state ()
1156 boost::shared_ptr<MidiBuffer>
1157 DiskReader::get_gui_feed_buffer () const
1159 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1161 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1162 b->copy (_gui_feed_buffer);
1167 DiskReader::reset_tracker ()
1169 _midi_buf->reset_tracker ();
1171 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1174 mp->reset_note_trackers ();
1179 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1181 _midi_buf->resolve_tracker(buffer, time);
1183 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1186 mp->reset_note_trackers ();
1190 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1191 * so that an event at playback_sample has time = 0
1194 DiskReader::get_midi_playback (MidiBuffer& dst, framecnt_t nframes, MonitorState ms, BufferSet& scratch_bufs, double speed, framecnt_t playback_distance)
1198 if ((ms & MonitoringInput) == 0) {
1202 target = &scratch_bufs.get_midi (0);
1205 if (ms & MonitoringDisk) {
1206 /* no disk data needed */
1208 Location* loc = loop_location;
1210 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1211 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1212 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1213 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1215 //cerr << "======== PRE ========\n";
1216 //_midi_buf->dump (cerr);
1217 //cerr << "----------------\n";
1219 size_t events_read = 0;
1222 framepos_t effective_start;
1224 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1225 effective_start = loop_range.squish (playback_sample);
1227 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1229 if (effective_start == loc->start()) {
1230 /* We need to turn off notes that may extend
1231 beyond the loop end.
1234 _midi_buf->resolve_tracker (*target, 0);
1237 /* for split-cycles we need to offset the events */
1239 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1241 /* end of loop is within the range we are reading, so
1242 split the read in two, and lie about the location
1246 framecnt_t first, second;
1248 first = loc->end() - effective_start;
1249 second = nframes - first;
1251 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1252 effective_start, loc->end(), first, second));
1255 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1256 effective_start, first));
1257 events_read = _midi_buf->read (*target, effective_start, first);
1261 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1262 loc->start(), second));
1263 events_read += _midi_buf->read (*target, loc->start(), second);
1267 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1268 effective_start, nframes));
1269 events_read = _midi_buf->read (*target, effective_start, effective_start + nframes);
1272 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1273 if (n_skipped > 0) {
1274 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1276 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1277 events_read = _midi_buf->read (*target, playback_sample, playback_sample + nframes);
1280 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1281 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1282 _name, events_read, playback_sample, playback_sample + nframes,
1283 _midi_buf->read_space(), _midi_buf->write_space(),
1284 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1287 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1291 if (speed != 0.0 && fabsf (speed) != 1.0f) {
1292 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1293 MidiBuffer::TimeType *tme = i.timeptr();
1294 *tme = (*tme) * nframes / playback_distance;
1298 if (ms & MonitoringInput) {
1299 dst.merge_from (*target, nframes);
1302 //cerr << "======== POST ========\n";
1303 //_midi_buf->dump (cerr);
1304 //cerr << "----------------\n";
1307 /** @a start is set to the new frame position (TIME) read up to */
1309 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1311 framecnt_t this_read = 0;
1312 framepos_t loop_end = 0;
1313 framepos_t loop_start = 0;
1314 framecnt_t loop_length = 0;
1315 Location* loc = loop_location;
1316 framepos_t effective_start = start;
1317 Evoral::Range<framepos_t>* loop_range (0);
1319 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1320 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1321 MidiChannelFilter* filter = 0;
1323 frameoffset_t loop_offset = 0;
1325 if (!reversed && loc) {
1326 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1331 /* take any loop into account. we can't read past the end of the loop. */
1333 if (loc && !reversed) {
1336 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1339 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1340 position within the loop.
1343 effective_start = loop_range->squish (effective_start);
1345 if ((loop_end - effective_start) <= dur) {
1346 /* too close to end of loop to read "dur", so
1349 this_read = loop_end - effective_start;
1358 if (this_read == 0) {
1362 this_read = min (dur,this_read);
1364 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1366 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1367 error << string_compose(
1368 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1369 id(), this_read, start) << endmsg;
1373 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1377 // Swap note ons with note offs here. etc?
1378 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1379 // CC values etc. hard.
1383 /* adjust passed-by-reference argument (note: this is
1384 monotonic and does not reflect looping.
1388 /* similarly adjust effective_start, but this may be
1389 readjusted for seamless looping as we continue around
1392 effective_start += this_read;
1396 //offset += this_read;
1403 DiskReader::refill_midi ()
1405 if (!_playlists[DataType::MIDI]) {
1409 size_t write_space = _midi_buf->write_space();
1410 const bool reversed = _session.transport_speed() < 0.0f;
1412 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1414 /* no space to write */
1415 if (write_space == 0) {
1423 /* at end: nothing to do */
1425 if (file_frame == max_framepos) {
1430 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1431 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1433 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1437 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1439 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1440 to_read = min (to_read, (framecnt_t) write_space);
1442 if (midi_read (file_frame, to_read, reversed)) {