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/midi_track.h"
33 #include "ardour/pannable.h"
34 #include "ardour/playlist.h"
35 #include "ardour/playlist_factory.h"
36 #include "ardour/session.h"
37 #include "ardour/session_playlists.h"
39 using namespace ARDOUR;
43 ARDOUR::framecnt_t DiskReader::_chunk_frames = default_chunk_frames ();
44 PBD::Signal0<void> DiskReader::Underrun;
45 Sample* DiskReader::_mixdown_buffer = 0;
46 gain_t* DiskReader::_gain_buffer = 0;
47 framecnt_t DiskReader::midi_readahead = 4096;
48 bool DiskReader::no_disk_output = false;
50 DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
51 : DiskIOProcessor (s, str, f)
54 , overwrite_offset (0)
55 , _pending_overwrite (false)
56 , overwrite_queued (false)
57 , _gui_feed_buffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
59 file_frame[DataType::AUDIO] = 0;
60 file_frame[DataType::MIDI] = 0;
63 DiskReader::~DiskReader ()
65 DEBUG_TRACE (DEBUG::Destruction, string_compose ("DiskReader %1 @ %2 deleted\n", _name, this));
67 for (uint32_t n = 0; n < DataType::num_types; ++n) {
69 _playlists[n]->release ();
74 RCUWriter<ChannelList> writer (channels);
75 boost::shared_ptr<ChannelList> c = writer.get_copy();
77 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
90 DiskReader::allocate_working_buffers()
92 /* with varifill buffer refilling, we compute the read size in bytes (to optimize
93 for disk i/o bandwidth) and then convert back into samples. These buffers
94 need to reflect the maximum size we could use, which is 4MB reads, or 2M samples
97 _mixdown_buffer = new Sample[2*1048576];
98 _gain_buffer = new gain_t[2*1048576];
102 DiskReader::free_working_buffers()
104 delete [] _mixdown_buffer;
105 delete [] _gain_buffer;
111 DiskReader::default_chunk_frames()
117 DiskReader::set_name (string const & str)
119 string my_name = X_("playback:");
122 if (_name != my_name) {
123 SessionObject::set_name (my_name);
130 DiskReader::set_roll_delay (ARDOUR::framecnt_t nframes)
132 _roll_delay = nframes;
136 DiskReader::state (bool full)
138 XMLNode& node (DiskIOProcessor::state (full));
139 node.set_property(X_("type"), X_("diskreader"));
144 DiskReader::set_state (const XMLNode& node, int version)
146 if (DiskIOProcessor::set_state (node, version)) {
154 DiskReader::realtime_handle_transport_stopped ()
156 realtime_speed_change ();
160 DiskReader::realtime_locate ()
165 DiskReader::buffer_load () const
167 /* Note: for MIDI it's not trivial to differentiate the following two cases:
169 1. The playback buffer is empty because the system has run out of time to fill it.
170 2. The playback buffer is empty because there is no more data on the playlist.
172 If we use a simple buffer load computation, we will report that the MIDI diskstream
173 cannot keep up when #2 happens, when in fact it can. Since MIDI data rates
174 are so low compared to audio, just use the audio value here.
177 boost::shared_ptr<ChannelList> c = channels.reader();
180 /* no channels, so no buffers, so completely full and ready to playback, sir! */
184 PBD::RingBufferNPT<Sample> * b = c->front()->buf;
185 return (float) ((double) b->read_space() / (double) b->bufsize());
189 DiskReader::adjust_buffering ()
191 boost::shared_ptr<ChannelList> c = channels.reader();
193 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
194 (*chan)->resize (_session.butler()->audio_diskstream_playback_buffer_size());
199 DiskReader::playlist_changed (const PropertyChange&)
201 playlist_modified ();
205 DiskReader::playlist_modified ()
207 if (!i_am_the_modifier && !overwrite_queued) {
208 _session.request_overwrite_buffer (_route);
209 overwrite_queued = true;
214 DiskReader::use_playlist (DataType dt, boost::shared_ptr<Playlist> playlist)
216 bool prior_playlist = false;
218 if (_playlists[dt]) {
219 prior_playlist = true;
222 if (DiskIOProcessor::use_playlist (dt, playlist)) {
226 /* don't do this if we've already asked for it *or* if we are setting up
227 the diskstream for the very first time - the input changed handling will
228 take care of the buffer refill.
231 if (!overwrite_queued && (prior_playlist || _session.loading())) {
232 _session.request_overwrite_buffer (_route);
233 overwrite_queued = true;
240 DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
241 double speed, pframes_t nframes, bool result_required)
244 boost::shared_ptr<ChannelList> c = channels.reader();
245 ChannelList::iterator chan;
246 frameoffset_t playback_distance;
247 MonitorState ms = _route->monitoring_state ();
250 if (!_pending_active) {
255 if (_pending_active) {
262 _need_butler = false;
264 if (speed == 0.0 && (ms == MonitoringDisk)) {
265 /* stopped. Don't accidentally pass any data from disk
266 * into our outputs (e.g. via interpolation)
268 bufs.silence (nframes, 0);
272 if (speed != 1.0f && speed != -1.0f) {
273 interpolation.set_speed (speed);
274 midi_interpolation.set_speed (speed);
275 playback_distance = midi_interpolation.distance (nframes);
277 playback_distance = -playback_distance;
280 playback_distance = nframes;
283 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
284 const bool still_locating = _session.global_locate_pending();
286 if (!result_required || ((ms & MonitoringDisk) == 0) || still_locating) {
288 /* no need for actual disk data, just advance read pointer and return */
290 if (!still_locating) {
291 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
292 (*chan)->buf->increment_read_ptr (playback_distance);
296 /* if monitoring disk but locating put silence in the buffers */
298 if (still_locating && (ms == MonitoringDisk)) {
299 bufs.silence (playback_distance, 0);
304 /* we need audio data from disk */
306 size_t n_buffers = bufs.count().n_audio();
307 size_t n_chans = c->size();
310 if (n_chans > n_buffers) {
311 scaling = ((float) n_buffers)/n_chans;
316 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
318 ChannelInfo* chaninfo (*chan);
319 AudioBuffer& output (bufs.get_audio (n%n_buffers));
320 Sample* disk_signal = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
322 if (ms & MonitoringInput) {
323 /* put disk stream in scratch buffer, blend at end */
324 disk_signal = scratch_bufs.get_audio(n).data ();
326 /* no input stream needed, just overwrite buffers */
327 disk_signal = output.data ();
330 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
332 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
334 if (fabsf (speed) != 1.0f) {
335 (void) interpolation.interpolate (
337 chaninfo->rw_vector.buf[0],
339 } else if (speed != 0.0) {
340 memcpy (disk_signal, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
345 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
347 if (playback_distance <= total) {
349 /* We have enough samples, but not in one lump.
352 if (fabsf (speed) != 1.0f) {
353 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
354 chaninfo->rw_vector.buf[0],
356 disk_signal += chaninfo->rw_vector.len[0];
357 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
358 chaninfo->rw_vector.buf[1],
360 } else if (speed != 0.0) {
362 chaninfo->rw_vector.buf[0],
363 chaninfo->rw_vector.len[0] * sizeof (Sample));
364 memcpy (disk_signal + chaninfo->rw_vector.len[0],
365 chaninfo->rw_vector.buf[1],
366 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
371 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
372 cerr << "underrun for " << _name << endl;
373 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
374 DEBUG_THREAD_SELF, name(), total));
381 if (scaling != 1.0f && speed != 0.0) {
382 apply_gain_to_buffer (disk_signal, nframes, scaling);
385 chaninfo->buf->increment_read_ptr (playback_distance);
387 if (!no_disk_output && (speed != 0.0) && (ms & MonitoringInput)) {
388 /* mix the disk signal into the input signal (already in bufs) */
389 mix_buffers_no_gain (output.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
394 /* MIDI data handling */
396 if (!_session.declick_out_pending()) {
397 if (ms & MonitoringDisk && !still_locating) {
398 get_midi_playback (bufs.get_midi (0), playback_distance, ms, scratch_bufs, speed, playback_distance);
402 if (!still_locating) {
405 playback_sample -= playback_distance;
407 playback_sample += playback_distance;
410 if (_playlists[DataType::AUDIO]) {
413 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
414 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
415 c->front()->buf->bufsize()));
419 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
420 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
428 if (_playlists[DataType::MIDI]) {
429 /* MIDI butler needed part */
431 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
432 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
435 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
436 " = " << frames_written - frames_read
437 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
440 /* frames_read will generally be less than frames_written, but
441 * immediately after an overwrite, we can end up having read some data
442 * before we've written any. we don't need to trip an assert() on this,
443 * but we do need to check so that the decision on whether or not we
444 * need the butler is done correctly.
449 * Doing heavy GUI operations[1] can stall also the butler.
450 * The RT-thread meanwhile will happily continue and
451 * ‘frames_read’ (from buffer to output) will become larger
452 * than ‘frames_written’ (from disk to buffer).
454 * The disk-stream is now behind..
456 * In those cases the butler needs to be summed to refill the buffer (done now)
457 * AND we need to skip (frames_read - frames_written). ie remove old events
458 * before playback_sample from the rinbuffer.
460 * [1] one way to do so is described at #6170.
461 * For me just popping up the context-menu on a MIDI-track header
462 * of a track with a large (think beethoven :) midi-region also did the
463 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
465 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
468 if (frames_read <= frames_written) {
469 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
479 // DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
483 DiskReader::set_pending_overwrite (bool yn)
485 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
487 _pending_overwrite = yn;
489 overwrite_frame = playback_sample;
491 boost::shared_ptr<ChannelList> c = channels.reader ();
493 overwrite_offset = c->front()->buf->get_read_ptr();
498 DiskReader::overwrite_existing_buffers ()
502 boost::shared_ptr<ChannelList> c = channels.reader();
504 overwrite_queued = false;
506 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
512 const bool reversed = _session.transport_speed() < 0.0f;
514 /* assume all are the same size */
515 framecnt_t size = c->front()->buf->bufsize();
517 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
518 std::auto_ptr<float> gain_buffer (new float[size]);
520 /* reduce size so that we can fill the buffer correctly (ringbuffers
521 can only handle size-1, otherwise they appear to be empty)
528 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
530 start = overwrite_frame;
531 framecnt_t cnt = size;
533 /* to fill the buffer without resetting the playback sample, we need to
534 do it one or two chunks (normally two).
536 |----------------------------------------------------------------------|
540 |<- second chunk->||<----------------- first chunk ------------------>|
544 framecnt_t to_read = size - overwrite_offset;
546 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
547 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
548 id(), size, playback_sample) << endmsg;
556 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
557 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
558 id(), size, playback_sample) << endmsg;
570 if (_midi_buf && _playlists[DataType::MIDI]) {
572 /* Clear the playback buffer contents. This is safe as long as the butler
573 thread is suspended, which it should be.
576 _midi_buf->reset_tracker ();
578 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
579 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
581 /* Resolve all currently active notes in the playlist. This is more
582 aggressive than it needs to be: ideally we would only resolve what is
583 absolutely necessary, but this seems difficult and/or impossible without
584 having the old data or knowing what change caused the overwrite.
586 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
588 midi_read (overwrite_frame, _chunk_frames, false);
589 file_frame[DataType::MIDI] = overwrite_frame; // overwrite_frame was adjusted by ::midi_read() to the new position
592 _pending_overwrite = false;
598 DiskReader::seek (framepos_t frame, bool complete_refill)
602 ChannelList::iterator chan;
603 boost::shared_ptr<ChannelList> c = channels.reader();
605 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
606 (*chan)->buf->reset ();
609 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
610 /* we haven't read anything since the last seek,
611 so flush all note trackers to prevent
618 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
619 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
621 playback_sample = frame;
622 file_frame[DataType::AUDIO] = frame;
623 file_frame[DataType::MIDI] = frame;
625 if (complete_refill) {
626 /* call _do_refill() to refill the entire buffer, using
627 the largest reads possible.
629 while ((ret = do_refill_with_alloc (false)) > 0) ;
631 /* call _do_refill() to refill just one chunk, and then
634 ret = do_refill_with_alloc (true);
642 DiskReader::can_internal_playback_seek (framecnt_t distance)
646 ChannelList::iterator chan;
647 boost::shared_ptr<ChannelList> c = channels.reader();
649 for (chan = c->begin(); chan != c->end(); ++chan) {
650 if ((*chan)->buf->read_space() < (size_t) distance) {
657 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
658 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
660 return ((frames_written - frames_read) < distance);
664 DiskReader::internal_playback_seek (framecnt_t distance)
666 ChannelList::iterator chan;
667 boost::shared_ptr<ChannelList> c = channels.reader();
669 for (chan = c->begin(); chan != c->end(); ++chan) {
670 (*chan)->buf->increment_read_ptr (::llabs(distance));
673 playback_sample += distance;
679 void swap_by_ptr (Sample *first, Sample *last)
681 while (first < last) {
688 /** Read some data for 1 channel from our playlist into a buffer.
689 * @param buf Buffer to write to.
690 * @param start Session frame to start reading from; updated to where we end up
692 * @param cnt Count of samples to read.
693 * @param reversed true if we are running backwards, otherwise false.
696 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
697 framepos_t& start, framecnt_t cnt,
698 int channel, bool reversed)
700 framecnt_t this_read = 0;
702 framepos_t loop_end = 0;
703 framepos_t loop_start = 0;
704 framecnt_t offset = 0;
707 if (!_playlists[DataType::AUDIO]) {
708 memset (buf, 0, sizeof (Sample) * cnt);
712 /* XXX we don't currently play loops in reverse. not sure why */
716 framecnt_t loop_length = 0;
718 /* Make the use of a Location atomic for this read operation.
720 Note: Locations don't get deleted, so all we care about
721 when I say "atomic" is that we are always pointing to
722 the same one and using a start/length values obtained
726 if ((loc = loop_location) != 0) {
727 loop_start = loc->start();
728 loop_end = loc->end();
729 loop_length = loop_end - loop_start;
732 /* if we are looping, ensure that the first frame we read is at the correct
733 position within the loop.
736 if (loc && start >= loop_end) {
737 start = loop_start + ((start - loop_start) % loop_length);
746 /* We need this while loop in case we hit a loop boundary, in which case our read from
747 the playlist must be split into more than one section.
752 /* take any loop into account. we can't read past the end of the loop. */
754 if (loc && (loop_end - start < cnt)) {
755 this_read = loop_end - start;
762 if (this_read == 0) {
766 this_read = min(cnt,this_read);
768 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
769 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
776 swap_by_ptr (buf, buf + this_read - 1);
780 /* if we read to the end of the loop, go back to the beginning */
797 DiskReader::_do_refill_with_alloc (bool partial_fill)
799 /* We limit disk reads to at most 4MB chunks, which with floating point
800 samples would be 1M samples. But we might use 16 or 14 bit samples,
801 in which case 4MB is more samples than that. Therefore size this for
802 the smallest sample value .. 4MB = 2M samples (16 bit).
806 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
807 std::auto_ptr<float> gain_buf (new float[2*1048576]);
809 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
816 return refill_midi ();
820 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
822 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
828 return refill_midi ();
832 /** Get some more data from disk and put it in our channels' bufs,
833 * if there is suitable space in them.
835 * If fill_level is non-zero, then we will refill the buffer so that there is
836 * still at least fill_level samples of space left to be filled. This is used
837 * after locates so that we do not need to wait to fill the entire buffer.
842 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
844 /* do not read from disk while session is marked as Loading, to avoid
845 useless redundant I/O.
848 if (_session.loading()) {
854 RingBufferNPT<Sample>::rw_vector vector;
855 bool const reversed = _session.transport_speed() < 0.0f;
856 framecnt_t total_space;
857 framecnt_t zero_fill;
859 ChannelList::iterator i;
860 boost::shared_ptr<ChannelList> c = channels.reader();
867 assert(mixdown_buffer);
875 c->front()->buf->get_write_vector (&vector);
877 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
878 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
879 /* nowhere to write to */
884 if (fill_level < total_space) {
885 total_space -= fill_level;
887 /* we can't do anything with it */
892 /* if we're running close to normal speed and there isn't enough
893 space to do disk_read_chunk_frames of I/O, then don't bother.
895 at higher speeds, just do it because the sync between butler
896 and audio thread may not be good enough.
898 Note: it is a design assumption that disk_read_chunk_frames is smaller
899 than the playback buffer size, so this check should never trip when
900 the playback buffer is empty.
903 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()));
904 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
908 /* when slaved, don't try to get too close to the read pointer. this
909 leaves space for the buffer reversal to have something useful to
913 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
914 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
918 framepos_t ffa = file_frame[DataType::AUDIO];
924 /* at start: nothing to do but fill with silence */
926 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
928 ChannelInfo* chan (*i);
929 chan->buf->get_write_vector (&vector);
930 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
932 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
934 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
939 if (ffa < total_space) {
941 /* too close to the start: read what we can,
942 and then zero fill the rest
945 zero_fill = total_space - ffa;
955 if (ffa == max_framepos) {
957 /* at end: nothing to do but fill with silence */
959 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
961 ChannelInfo* chan (*i);
962 chan->buf->get_write_vector (&vector);
963 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
965 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
967 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
972 if (ffa > max_framepos - total_space) {
974 /* to close to the end: read what we can, and zero fill the rest */
976 zero_fill = total_space - (max_framepos - ffa);
977 total_space = max_framepos - ffa;
984 framepos_t file_frame_tmp = 0;
986 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
988 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
989 size_t total_bytes = total_space * bits_per_sample / 8;
991 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
993 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
995 /* find nearest (lower) multiple of 16384 */
997 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
999 /* now back to samples */
1001 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
1003 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
1005 // uint64_t before = g_get_monotonic_time ();
1006 // uint64_t elapsed;
1008 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1010 ChannelInfo* chan (*i);
1013 framecnt_t len1, len2;
1015 chan->buf->get_write_vector (&vector);
1017 if ((framecnt_t) vector.len[0] > samples_to_read) {
1019 /* we're not going to fill the first chunk, so certainly do not bother with the
1020 other part. it won't be connected with the part we do fill, as in:
1022 .... => writable space
1023 ++++ => readable space
1024 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1026 |......|+++++++++++++|...............................|
1031 So, just pretend that the buf1 part isn't there.
1041 file_frame_tmp = ffa;
1043 buf1 = vector.buf[0];
1044 len1 = vector.len[0];
1045 buf2 = vector.buf[1];
1046 len2 = vector.len[1];
1048 to_read = min (ts, len1);
1049 to_read = min (to_read, (framecnt_t) samples_to_read);
1051 assert (to_read >= 0);
1055 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1059 chan->buf->increment_write_ptr (to_read);
1063 to_read = min (ts, len2);
1067 /* we read all of vector.len[0], but it wasn't the
1068 entire samples_to_read of data, so read some or
1069 all of vector.len[1] as well.
1072 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1077 chan->buf->increment_write_ptr (to_read);
1081 /* XXX: do something */
1086 // elapsed = g_get_monotonic_time () - before;
1087 // cerr << '\t' << name() << ": bandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1089 file_frame[DataType::AUDIO] = file_frame_tmp;
1090 assert (file_frame[DataType::AUDIO] >= 0);
1092 ret = ((total_space - samples_to_read) > _chunk_frames);
1094 c->front()->buf->get_write_vector (&vector);
1101 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1103 /* If we're coming from an undo, it will have handled
1104 automation undo (it must, since automation-follows-regions
1105 can lose automation data). Hence we can do nothing here.
1112 if (!_route || Config->get_automation_follows_regions () == false) {
1116 list< Evoral::RangeMove<double> > movements;
1118 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1119 i != movements_frames.end();
1122 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1125 /* move panner automation */
1126 boost::shared_ptr<Pannable> pannable = _route->pannable();
1127 Evoral::ControlSet::Controls& c (pannable->controls());
1129 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1130 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1134 boost::shared_ptr<AutomationList> alist = ac->alist();
1135 if (!alist->size()) {
1138 XMLNode & before = alist->get_state ();
1139 bool const things_moved = alist->move_ranges (movements);
1141 _session.add_command (new MementoCommand<AutomationList> (
1142 *alist.get(), &before, &alist->get_state ()));
1145 /* move processor automation */
1146 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1150 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1152 boost::shared_ptr<Processor> processor (p.lock ());
1157 list< Evoral::RangeMove<double> > movements;
1158 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1159 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1162 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1164 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1165 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1169 XMLNode & before = al->get_state ();
1170 bool const things_moved = al->move_ranges (movements);
1172 _session.add_command (
1173 new MementoCommand<AutomationList> (
1174 *al.get(), &before, &al->get_state ()
1181 boost::shared_ptr<MidiBuffer>
1182 DiskReader::get_gui_feed_buffer () const
1184 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1186 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1187 b->copy (_gui_feed_buffer);
1192 DiskReader::reset_tracker ()
1194 _midi_buf->reset_tracker ();
1196 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1199 mp->reset_note_trackers ();
1204 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1206 _midi_buf->resolve_tracker(buffer, time);
1208 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1211 mp->reset_note_trackers ();
1215 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1216 * so that an event at playback_sample has time = 0
1219 DiskReader::get_midi_playback (MidiBuffer& dst, framecnt_t nframes, MonitorState ms, BufferSet& scratch_bufs, double speed, framecnt_t playback_distance)
1223 if ((ms & MonitoringInput) == 0) {
1227 target = &scratch_bufs.get_midi (0);
1230 if (ms & MonitoringDisk) {
1231 /* no disk data needed */
1233 Location* loc = loop_location;
1235 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1236 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1237 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1238 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1240 //cerr << "======== PRE ========\n";
1241 //_midi_buf->dump (cerr);
1242 //cerr << "----------------\n";
1244 size_t events_read = 0;
1247 framepos_t effective_start;
1249 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1250 effective_start = loop_range.squish (playback_sample);
1252 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1254 if (effective_start == loc->start()) {
1255 /* We need to turn off notes that may extend
1256 beyond the loop end.
1259 _midi_buf->resolve_tracker (*target, 0);
1262 /* for split-cycles we need to offset the events */
1264 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1266 /* end of loop is within the range we are reading, so
1267 split the read in two, and lie about the location
1271 framecnt_t first, second;
1273 first = loc->end() - effective_start;
1274 second = nframes - first;
1276 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1277 effective_start, loc->end(), first, second));
1280 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1281 effective_start, first));
1282 events_read = _midi_buf->read (*target, effective_start, first);
1286 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1287 loc->start(), second));
1288 events_read += _midi_buf->read (*target, loc->start(), second);
1292 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1293 effective_start, nframes));
1294 events_read = _midi_buf->read (*target, effective_start, effective_start + nframes);
1297 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1298 if (n_skipped > 0) {
1299 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1301 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1302 events_read = _midi_buf->read (*target, playback_sample, playback_sample + nframes);
1305 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1306 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1307 _name, events_read, playback_sample, playback_sample + nframes,
1308 _midi_buf->read_space(), _midi_buf->write_space(),
1309 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1312 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1316 if (speed != 0.0 && fabsf (speed) != 1.0f) {
1317 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1318 MidiBuffer::TimeType *tme = i.timeptr();
1319 *tme = (*tme) * nframes / playback_distance;
1323 if (ms & MonitoringInput) {
1324 dst.merge_from (*target, nframes);
1327 //cerr << "======== POST ========\n";
1328 //_midi_buf->dump (cerr);
1329 //cerr << "----------------\n";
1332 /** @a start is set to the new frame position (TIME) read up to */
1334 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1336 framecnt_t this_read = 0;
1337 framepos_t loop_end = 0;
1338 framepos_t loop_start = 0;
1339 framecnt_t loop_length = 0;
1340 Location* loc = loop_location;
1341 framepos_t effective_start = start;
1342 Evoral::Range<framepos_t>* loop_range (0);
1344 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS::midi_read @ %1 cnt %2\n", start, dur));
1346 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
1347 MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1348 frameoffset_t loop_offset = 0;
1350 if (!reversed && loc) {
1351 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1356 /* take any loop into account. we can't read past the end of the loop. */
1358 if (loc && !reversed) {
1361 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1364 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1365 position within the loop.
1368 effective_start = loop_range->squish (effective_start);
1370 if ((loop_end - effective_start) <= dur) {
1371 /* too close to end of loop to read "dur", so
1374 this_read = loop_end - effective_start;
1383 if (this_read == 0) {
1387 this_read = min (dur,this_read);
1389 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1391 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1392 error << string_compose(
1393 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1394 id(), this_read, start) << endmsg;
1398 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1402 // Swap note ons with note offs here. etc?
1403 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1404 // CC values etc. hard.
1408 /* adjust passed-by-reference argument (note: this is
1409 monotonic and does not reflect looping.
1413 /* similarly adjust effective_start, but this may be
1414 readjusted for seamless looping as we continue around
1417 effective_start += this_read;
1421 //offset += this_read;
1428 DiskReader::refill_midi ()
1430 if (!_playlists[DataType::MIDI]) {
1434 size_t write_space = _midi_buf->write_space();
1435 const bool reversed = _session.transport_speed() < 0.0f;
1437 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame[DataType::MIDI]));
1439 /* no space to write */
1440 if (write_space == 0) {
1448 /* at end: nothing to do */
1450 framepos_t ffm = file_frame[DataType::MIDI];
1452 if (ffm == max_framepos) {
1457 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1458 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1460 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1464 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1466 to_read = min (to_read, (framecnt_t) (max_framepos - ffm));
1467 to_read = min (to_read, (framecnt_t) write_space);
1469 if (midi_read (ffm, to_read, reversed)) {
1473 file_frame[DataType::MIDI] = ffm;
1479 DiskReader::set_no_disk_output (bool yn)
1481 /* this MUST be called as part of the process call tree, before any
1482 disk readers are invoked. We use it when the session needs the
1483 transport (and thus effective read position for DiskReaders) to keep
1484 advancing as part of syncing up with a transport master, but we
1485 don't want any actual disk output yet because we are still not
1488 no_disk_output = yn;