2 * Copyright (C) 2009-2018 Paul Davis
3 * Copyright (C) 2019 Robin Gareus <robin@gareus.org>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 #include <boost/smart_ptr/scoped_array.hpp>
22 #include "pbd/enumwriter.h"
23 #include "pbd/memento_command.h"
24 #include "pbd/playback_buffer.h"
26 #include "ardour/audioengine.h"
27 #include "ardour/audioplaylist.h"
28 #include "ardour/audio_buffer.h"
29 #include "ardour/butler.h"
30 #include "ardour/debug.h"
31 #include "ardour/disk_reader.h"
32 #include "ardour/midi_ring_buffer.h"
33 #include "ardour/midi_playlist.h"
34 #include "ardour/midi_track.h"
35 #include "ardour/pannable.h"
36 #include "ardour/playlist.h"
37 #include "ardour/playlist_factory.h"
38 #include "ardour/session.h"
39 #include "ardour/session_playlists.h"
43 using namespace ARDOUR;
47 ARDOUR::samplecnt_t DiskReader::_chunk_samples = default_chunk_samples ();
48 PBD::Signal0<void> DiskReader::Underrun;
49 Sample* DiskReader::_sum_buffer = 0;
50 Sample* DiskReader::_mixdown_buffer = 0;
51 gain_t* DiskReader::_gain_buffer = 0;
52 samplecnt_t DiskReader::midi_readahead = 4096;
53 bool DiskReader::_no_disk_output = false;
55 DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
56 : DiskIOProcessor (s, str, f)
57 , overwrite_sample (0)
58 , _pending_overwrite (false)
59 , overwrite_queued (false)
62 file_sample[DataType::AUDIO] = 0;
63 file_sample[DataType::MIDI] = 0;
66 DiskReader::~DiskReader ()
68 DEBUG_TRACE (DEBUG::Destruction, string_compose ("DiskReader %1 @ %2 deleted\n", _name, this));
70 for (uint32_t n = 0; n < DataType::num_types; ++n) {
72 _playlists[n]->release ();
78 DiskReader::ReaderChannelInfo::resize (samplecnt_t bufsize)
81 /* touch memory to lock it */
82 rbuf = new PlaybackBuffer<Sample> (bufsize);
83 memset (rbuf->buffer(), 0, sizeof (Sample) * rbuf->bufsize());
87 DiskReader::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
90 c->push_back (new ReaderChannelInfo (_session.butler()->audio_diskstream_playback_buffer_size()));
91 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: new reader channel, write space = %2 read = %3\n",
93 c->back()->rbuf->write_space(),
94 c->back()->rbuf->read_space()));
101 DiskReader::allocate_working_buffers()
103 /* with varifill buffer refilling, we compute the read size in bytes (to optimize
104 for disk i/o bandwidth) and then convert back into samples. These buffers
105 need to reflect the maximum size we could use, which is 4MB reads, or 2M samples
106 using 16 bit samples.
108 _sum_buffer = new Sample[2*1048576];
109 _mixdown_buffer = new Sample[2*1048576];
110 _gain_buffer = new gain_t[2*1048576];
114 DiskReader::free_working_buffers()
116 delete [] _sum_buffer;
117 delete [] _mixdown_buffer;
118 delete [] _gain_buffer;
125 DiskReader::default_chunk_samples()
131 DiskReader::set_name (string const & str)
133 string my_name = X_("player:");
136 if (_name != my_name) {
137 SessionObject::set_name (my_name);
146 XMLNode& node (DiskIOProcessor::state ());
147 node.set_property(X_("type"), X_("diskreader"));
152 DiskReader::set_state (const XMLNode& node, int version)
154 if (DiskIOProcessor::set_state (node, version)) {
162 DiskReader::realtime_handle_transport_stopped ()
167 DiskReader::realtime_locate ()
172 DiskReader::buffer_load () const
174 /* Note: for MIDI it's not trivial to differentiate the following two cases:
176 1. The playback buffer is empty because the system has run out of time to fill it.
177 2. The playback buffer is empty because there is no more data on the playlist.
179 If we use a simple buffer load computation, we will report that the MIDI diskstream
180 cannot keep up when #2 happens, when in fact it can. Since MIDI data rates
181 are so low compared to audio, just use the audio value here.
184 boost::shared_ptr<ChannelList> c = channels.reader();
187 /* no channels, so no buffers, so completely full and ready to playback, sir! */
191 PBD::PlaybackBuffer<Sample>* b = c->front()->rbuf;
192 return (float) ((double) b->read_space() / (double) b->bufsize());
196 DiskReader::adjust_buffering ()
198 boost::shared_ptr<ChannelList> c = channels.reader();
200 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
201 (*chan)->resize (_session.butler()->audio_diskstream_playback_buffer_size());
206 DiskReader::playlist_changed (const PropertyChange&)
208 playlist_modified ();
212 DiskReader::playlist_modified ()
214 if (!i_am_the_modifier && !overwrite_queued) {
215 _session.request_overwrite_buffer (_route);
216 overwrite_queued = true;
221 DiskReader::use_playlist (DataType dt, boost::shared_ptr<Playlist> playlist)
223 bool prior_playlist = false;
225 if (_playlists[dt]) {
226 prior_playlist = true;
229 if (DiskIOProcessor::use_playlist (dt, playlist)) {
233 /* don't do this if we've already asked for it *or* if we are setting up
234 the diskstream for the very first time - the input changed handling will
235 take care of the buffer refill.
238 if (!overwrite_queued && (prior_playlist || _session.loading())) {
239 _session.request_overwrite_buffer (_route);
240 overwrite_queued = true;
247 DiskReader::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sample,
248 double speed, pframes_t nframes, bool result_required)
251 boost::shared_ptr<ChannelList> c = channels.reader();
252 ChannelList::iterator chan;
253 sampleoffset_t disk_samples_to_consume;
254 MonitorState ms = _route->monitoring_state ();
257 if (!_pending_active) {
262 if (_pending_active) {
269 if ((speed == 0.0) && (ms == MonitoringDisk)) {
270 /* no channels, or stopped. Don't accidentally pass any data
271 * from disk into our outputs (e.g. via interpolation)
276 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
277 const bool still_locating = _session.global_locate_pending();
280 /* do nothing with audio */
284 assert (speed == -1 || speed == 0 || speed == 1);
287 disk_samples_to_consume = -nframes;
288 } else if (speed > 0) {
289 disk_samples_to_consume = nframes;
291 disk_samples_to_consume = 0;
294 if (!result_required || ((ms & MonitoringDisk) == 0) || still_locating || _no_disk_output) {
296 /* no need for actual disk data, just advance read pointer and return */
298 if (!still_locating || _no_disk_output) {
299 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
300 (*chan)->rbuf->increment_read_ptr (disk_samples_to_consume);
304 /* if monitoring disk but locating put silence in the buffers */
306 if ((_no_disk_output || still_locating) && (ms == MonitoringDisk)) {
307 bufs.silence (nframes, 0);
312 /* we need audio data from disk */
314 size_t n_buffers = bufs.count().n_audio();
315 size_t n_chans = c->size();
318 if (n_chans > n_buffers) {
319 scaling = ((float) n_buffers)/n_chans;
324 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
326 ChannelInfo* chaninfo (*chan);
327 AudioBuffer& output (bufs.get_audio (n%n_buffers));
328 Sample* disk_signal = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
330 if (ms & MonitoringInput) {
331 /* put disk stream in scratch buffer, blend at end */
332 disk_signal = scratch_bufs.get_audio(n).data ();
334 /* no input stream needed, just overwrite buffers */
335 disk_signal = output.data ();
339 if (start_sample < playback_sample) {
340 cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << endl;
343 } else if (speed < 0) {
344 if (playback_sample < start_sample) {
345 cerr << owner()->name() << " SS = " << start_sample << " PS = " << playback_sample << " REVERSE" << endl;
350 if ((speed > 0) && (start_sample != playback_sample)) {
352 str << owner()->name() << " playback @ " << start_sample << " not aligned with " << playback_sample << " jump ahead " << (start_sample - playback_sample) << endl;
355 if (can_internal_playback_seek (start_sample - playback_sample)) {
356 internal_playback_seek (start_sample - playback_sample);
358 cerr << owner()->name() << " playback not possible: ss = " << start_sample << " ps = " << playback_sample << endl;
364 assert (disk_signal);
365 const samplecnt_t total = chaninfo->rbuf->read (disk_signal, disk_samples_to_consume);
366 if (disk_samples_to_consume > total) {
367 cerr << _name << " Need " << disk_samples_to_consume << " total = " << total << endl;
368 cerr << "underrun for " << _name << endl;
369 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
370 DEBUG_THREAD_SELF, name(), total));
376 if (scaling != 1.0f && speed != 0.0) {
377 apply_gain_to_buffer (disk_signal, disk_samples_to_consume, scaling);
380 //chaninfo->rbuf->increment_read_ptr (disk_samples_to_consume);
382 if (ms & MonitoringInput) {
383 /* mix the disk signal into the input signal (already in bufs) */
384 mix_buffers_no_gain (output.data(), disk_signal, disk_samples_to_consume);
389 /* MIDI data handling */
392 if (/*!_session.declick_out_pending() && */ bufs.count().n_midi() && _midi_buf) {
395 if (_no_disk_output) {
396 dst = &scratch_bufs.get_midi(0);
398 dst = &bufs.get_midi (0);
401 if ((ms & MonitoringDisk) && !still_locating) {
402 get_midi_playback (*dst, start_sample, end_sample, ms, scratch_bufs, speed, disk_samples_to_consume);
406 if (!still_locating) {
408 bool butler_required = false;
411 playback_sample -= disk_samples_to_consume;
413 playback_sample += disk_samples_to_consume;
416 if (_playlists[DataType::AUDIO]) {
419 if (c->front()->rbuf->write_space() >= c->front()->rbuf->bufsize() / 2) {
420 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->rbuf->write_space(), c->front()->rbuf->bufsize()));
421 butler_required = true;
424 if ((samplecnt_t) c->front()->rbuf->write_space() >= _chunk_samples) {
425 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->rbuf->write_space(),
427 butler_required = true;
433 if (_playlists[DataType::MIDI]) {
434 /* MIDI butler needed part */
436 uint32_t samples_read = g_atomic_int_get(const_cast<gint*>(&_samples_read_from_ringbuffer));
437 uint32_t samples_written = g_atomic_int_get(const_cast<gint*>(&_samples_written_to_ringbuffer));
440 cerr << name() << " MDS written: " << samples_written << " - read: " << samples_read <<
441 " = " << samples_written - samples_read
442 << " + " << disk_samples_to_consume << " < " << midi_readahead << " = " << need_butler << ")" << endl;
445 /* samples_read will generally be less than samples_written, but
446 * immediately after an overwrite, we can end up having read some data
447 * before we've written any. we don't need to trip an assert() on this,
448 * but we do need to check so that the decision on whether or not we
449 * need the butler is done correctly.
454 * Doing heavy GUI operations[1] can stall also the butler.
455 * The RT-thread meanwhile will happily continue and
456 * ‘samples_read’ (from buffer to output) will become larger
457 * than ‘samples_written’ (from disk to buffer).
459 * The disk-stream is now behind..
461 * In those cases the butler needs to be summed to refill the buffer (done now)
462 * AND we need to skip (samples_read - samples_written). ie remove old events
463 * before playback_sample from the rinbuffer.
465 * [1] one way to do so is described at #6170.
466 * For me just popping up the context-menu on a MIDI-track header
467 * of a track with a large (think beethoven :) midi-region also did the
468 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
470 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
473 if (samples_read <= samples_written) {
474 if ((samples_written - samples_read) + disk_samples_to_consume < midi_readahead) {
475 butler_required = true;
478 butler_required = true;
483 _need_butler = butler_required;
486 // DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
490 DiskReader::set_pending_overwrite (bool yn)
492 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
494 _pending_overwrite = yn;
496 overwrite_sample = playback_sample;
498 boost::shared_ptr<ChannelList> c = channels.reader ();
499 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
500 (*chan)->rbuf->read_flush ();
505 DiskReader::overwrite_existing_buffers ()
509 boost::shared_ptr<ChannelList> c = channels.reader();
511 overwrite_queued = false;
513 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_sample));
518 const bool reversed = _session.transport_speed() < 0.0f;
520 /* assume all are the same size */
521 samplecnt_t size = c->front()->rbuf->write_space ();
523 boost::scoped_array<Sample> sum_buffer (new Sample[size]);
524 boost::scoped_array<Sample> mixdown_buffer (new Sample[size]);
525 boost::scoped_array<float> gain_buffer (new float[size]);
527 /* reduce size so that we can fill the buffer correctly (ringbuffers
528 * can only handle size-1, otherwise they appear to be empty)
534 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
536 samplepos_t start = overwrite_sample;
537 samplecnt_t to_read = size;
539 cerr << owner()->name() << " over-read: " << to_read << endl;
540 if (audio_read ((*chan)->rbuf, sum_buffer.get(), mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
541 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at sample %3"), id(), size, overwrite_sample) << endmsg;
551 if (_midi_buf && _playlists[DataType::MIDI]) {
553 /* Clear the playback buffer contents. This is safe as long as the butler
554 thread is suspended, which it should be.
557 _midi_buf->reset_tracker ();
559 g_atomic_int_set (&_samples_read_from_ringbuffer, 0);
560 g_atomic_int_set (&_samples_written_to_ringbuffer, 0);
562 /* Resolve all currently active notes in the playlist. This is more
563 aggressive than it needs to be: ideally we would only resolve what is
564 absolutely necessary, but this seems difficult and/or impossible without
565 having the old data or knowing what change caused the overwrite.
567 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_sample);
569 midi_read (overwrite_sample, _chunk_samples, false);
570 file_sample[DataType::MIDI] = overwrite_sample; // overwrite_sample was adjusted by ::midi_read() to the new position
573 _pending_overwrite = false;
579 DiskReader::seek (samplepos_t sample, bool complete_refill)
583 ChannelList::iterator chan;
584 boost::shared_ptr<ChannelList> c = channels.reader();
586 //sample = std::max ((samplecnt_t)0, sample -_session.worst_output_latency ());
588 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
589 (*chan)->rbuf->reset ();
592 if (g_atomic_int_get (&_samples_read_from_ringbuffer) == 0) {
593 /* we haven't read anything since the last seek,
594 so flush all note trackers to prevent
603 g_atomic_int_set(&_samples_read_from_ringbuffer, 0);
604 g_atomic_int_set(&_samples_written_to_ringbuffer, 0);
606 playback_sample = sample;
607 file_sample[DataType::AUDIO] = sample;
608 file_sample[DataType::MIDI] = sample;
610 if (complete_refill) {
611 /* call _do_refill() to refill the entire buffer, using
612 the largest reads possible.
614 while ((ret = do_refill_with_alloc (false)) > 0) ;
616 /* call _do_refill() to refill just one chunk, and then
619 ret = do_refill_with_alloc (true);
627 DiskReader::can_internal_playback_seek (samplecnt_t distance)
631 ChannelList::iterator chan;
632 boost::shared_ptr<ChannelList> c = channels.reader();
634 for (chan = c->begin(); chan != c->end(); ++chan) {
635 if ((*chan)->rbuf->read_space() < (size_t) distance) {
642 uint32_t samples_read = g_atomic_int_get(&_samples_read_from_ringbuffer);
643 uint32_t samples_written = g_atomic_int_get(&_samples_written_to_ringbuffer);
645 return ((samples_written - samples_read) < distance);
649 DiskReader::internal_playback_seek (samplecnt_t distance)
651 ChannelList::iterator chan;
652 boost::shared_ptr<ChannelList> c = channels.reader();
654 for (chan = c->begin(); chan != c->end(); ++chan) {
655 (*chan)->rbuf->increment_read_ptr (::llabs(distance));
658 playback_sample += distance;
664 void swap_by_ptr (Sample *first, Sample *last)
666 while (first < last) {
673 /** Read some data for 1 channel from our playlist into a buffer.
674 * @param buf Buffer to write to.
675 * @param start Session sample to start reading from; updated to where we end up
677 * @param cnt Count of samples to read.
678 * @param reversed true if we are running backwards, otherwise false.
681 DiskReader::audio_read (PBD::PlaybackBuffer<Sample>*rb,
683 Sample* mixdown_buffer,
685 samplepos_t& start, samplecnt_t cnt,
686 int channel, bool reversed)
688 samplecnt_t this_read = 0;
690 samplepos_t loop_end = 0;
691 samplepos_t loop_start = 0;
694 if (!_playlists[DataType::AUDIO]) {
695 // TODO optimize use zero-buffer
696 for (uint32_t z = 0; z < cnt; ++z) {
703 /* XXX we don't currently play loops in reverse. not sure why */
707 samplecnt_t loop_length = 0;
709 /* Make the use of a Location atomic for this read operation.
711 Note: Locations don't get deleted, so all we care about
712 when I say "atomic" is that we are always pointing to
713 the same one and using a start/length values obtained
717 if ((loc = _loop_location) != 0) {
718 loop_start = loc->start();
719 loop_end = loc->end();
720 loop_length = loop_end - loop_start;
723 /* if we are looping, ensure that the first sample we read is at the correct
724 position within the loop.
727 if (loc && start >= loop_end) {
728 start = loop_start + ((start - loop_start) % loop_length);
737 /* We need this while loop in case we hit a loop boundary, in which case our read from
738 the playlist must be split into more than one section.
743 /* take any loop into account. we can't read past the end of the loop. */
745 if (loc && (loop_end - start < cnt)) {
746 this_read = loop_end - start;
753 if (this_read == 0) {
757 this_read = min (cnt, this_read);
759 if (audio_playlist()->read (sum_buffer, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
760 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at sample %3"), id(), this_read, start) << endmsg;
766 swap_by_ptr (sum_buffer, sum_buffer + this_read - 1);
770 /* if we read to the end of the loop, go back to the beginning */
779 if (rb->write (sum_buffer, this_read) != this_read) {
780 cerr << owner()->name() << " Ringbuffer Write overrun" << endl;
790 DiskReader::_do_refill_with_alloc (bool partial_fill)
792 /* We limit disk reads to at most 4MB chunks, which with floating point
793 samples would be 1M samples. But we might use 16 or 14 bit samples,
794 in which case 4MB is more samples than that. Therefore size this for
795 the smallest sample value .. 4MB = 2M samples (16 bit).
799 boost::scoped_array<Sample> sum_buf (new Sample[2*1048576]);
800 boost::scoped_array<Sample> mix_buf (new Sample[2*1048576]);
801 boost::scoped_array<float> gain_buf (new float[2*1048576]);
803 int ret = refill_audio (sum_buf.get(), mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_samples : 0));
810 return refill_midi ();
814 DiskReader::refill (Sample* sum_buffer, Sample* mixdown_buffer, float* gain_buffer, samplecnt_t fill_level)
816 int ret = refill_audio (sum_buffer, mixdown_buffer, gain_buffer, fill_level);
822 return refill_midi ();
826 /** Get some more data from disk and put it in our channels' bufs,
827 * if there is suitable space in them.
829 * If fill_level is non-zero, then we will refill the buffer so that there is
830 * still at least fill_level samples of space left to be filled. This is used
831 * after locates so that we do not need to wait to fill the entire buffer.
836 DiskReader::refill_audio (Sample* sum_buffer, Sample* mixdown_buffer, float* gain_buffer, samplecnt_t fill_level)
838 /* do not read from disk while session is marked as Loading, to avoid
839 useless redundant I/O.
842 if (_session.loading()) {
847 bool const reversed = _session.transport_speed() < 0.0f;
848 samplecnt_t zero_fill;
850 ChannelList::iterator i;
851 boost::shared_ptr<ChannelList> c = channels.reader();
857 assert(mixdown_buffer);
860 samplecnt_t total_space = c->front()->rbuf->write_space();
862 if (total_space == 0) {
863 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
864 /* nowhere to write to */
869 if (fill_level < total_space) {
870 total_space -= fill_level;
872 /* we can't do anything with it */
877 /* if we're running close to normal speed and there isn't enough
878 space to do disk_read_chunk_samples of I/O, then don't bother.
880 at higher speeds, just do it because the sync between butler
881 and audio thread may not be good enough.
883 Note: it is a design assumption that disk_read_chunk_samples is smaller
884 than the playback buffer size, so this check should never trip when
885 the playback buffer is empty.
888 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_samples, _session.transport_speed()));
889 if ((total_space < _chunk_samples) && fabs (_session.transport_speed()) < 2.0f) {
893 /* when slaved, don't try to get too close to the read pointer. this
894 leaves space for the buffer reversal to have something useful to
898 if (_slaved && total_space < (samplecnt_t) (c->front()->rbuf->bufsize() / 2)) {
899 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
903 samplepos_t ffa = file_sample[DataType::AUDIO];
908 /* at start: nothing to do but fill with silence */
909 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
910 ChannelInfo* chan (*i);
911 // TODO optimize use zero-buffer
912 samplecnt_t ws = chan->rbuf->write_space ();
913 for (uint32_t z = 0; z < ws; ++z) {
915 chan->rbuf->write (&t, 1);
921 if (ffa < total_space) {
922 /* too close to the start: read what we can, and then zero fill the rest */
923 zero_fill = total_space - ffa;
931 if (ffa == max_samplepos) {
932 /* at end: nothing to do but fill with silence */
933 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
934 ChannelInfo* chan (*i);
935 // TODO optimize use zero-buffer
936 samplecnt_t ws = chan->rbuf->write_space ();
937 for (uint32_t z = 0; z < ws; ++z) {
939 chan->rbuf->write (&t, 1);
945 if (ffa > max_samplepos - total_space) {
946 /* to close to the end: read what we can, and zero fill the rest */
947 zero_fill = total_space - (max_samplepos - ffa);
948 total_space = max_samplepos - ffa;
955 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
956 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
957 size_t total_bytes = total_space * bits_per_sample / 8;
959 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer */
960 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
962 /* find nearest (lower) multiple of 16384 */
964 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
966 /* now back to samples */
967 samplecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
969 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
971 samplepos_t file_sample_tmp = ffa;
973 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
974 ChannelInfo* chan (*i);
975 file_sample_tmp = ffa;
976 samplecnt_t ts = total_space;
978 samplecnt_t to_read = min (ts, (samplecnt_t) chan->rbuf->write_space ());
979 to_read = min (to_read, samples_to_read);
980 assert (to_read >= 0);
982 cerr << owner()->name() << " to-read: " << to_read << endl;
985 if (audio_read (chan->rbuf, sum_buffer, mixdown_buffer, gain_buffer, file_sample_tmp, to_read, chan_n, reversed)) {
986 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at sample %3"), id(), to_read, ffa) << endmsg;
993 /* XXX: do something */
997 // elapsed = g_get_monotonic_time () - before;
998 // cerr << '\t' << name() << ": bandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1000 file_sample[DataType::AUDIO] = file_sample_tmp;
1001 assert (file_sample[DataType::AUDIO] >= 0);
1003 ret = ((total_space - samples_to_read) > _chunk_samples);
1010 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<samplepos_t> > const & movements_samples, bool from_undo_or_shift)
1012 /* If we're coming from an undo, it will have handled
1013 * automation undo (it must, since automation-follows-regions
1014 * can lose automation data). Hence we can do nothing here.
1016 * Likewise when shifting regions (insert/remove time)
1017 * automation is taken care of separately (busses with
1018 * automation have no disk-reader).
1021 if (from_undo_or_shift) {
1025 if (!_route || Config->get_automation_follows_regions () == false) {
1029 list< Evoral::RangeMove<double> > movements;
1031 for (list< Evoral::RangeMove<samplepos_t> >::const_iterator i = movements_samples.begin();
1032 i != movements_samples.end();
1035 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1038 /* move panner automation */
1039 boost::shared_ptr<Pannable> pannable = _route->pannable();
1040 Evoral::ControlSet::Controls& c (pannable->controls());
1042 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1043 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1047 boost::shared_ptr<AutomationList> alist = ac->alist();
1048 if (!alist->size()) {
1051 XMLNode & before = alist->get_state ();
1052 bool const things_moved = alist->move_ranges (movements);
1054 _session.add_command (new MementoCommand<AutomationList> (
1055 *alist.get(), &before, &alist->get_state ()));
1058 /* move processor automation */
1059 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_samples));
1063 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<samplepos_t> > const & movements_samples)
1065 boost::shared_ptr<Processor> processor (p.lock ());
1070 list< Evoral::RangeMove<double> > movements;
1071 for (list< Evoral::RangeMove<samplepos_t> >::const_iterator i = movements_samples.begin(); i != movements_samples.end(); ++i) {
1072 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1075 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1077 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1078 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1082 XMLNode & before = al->get_state ();
1083 bool const things_moved = al->move_ranges (movements);
1085 _session.add_command (
1086 new MementoCommand<AutomationList> (
1087 *al.get(), &before, &al->get_state ()
1095 DiskReader::reset_tracker ()
1098 _midi_buf->reset_tracker ();
1101 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1104 mp->reset_note_trackers ();
1109 DiskReader::resolve_tracker (Evoral::EventSink<samplepos_t>& buffer, samplepos_t time)
1112 _midi_buf->resolve_tracker(buffer, time);
1115 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1118 mp->reset_note_trackers ();
1122 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1123 * so that an event at playback_sample has time = 0
1126 DiskReader::get_midi_playback (MidiBuffer& dst, samplepos_t start_sample, samplepos_t end_sample, MonitorState ms, BufferSet& scratch_bufs, double speed, samplecnt_t disk_samples_to_consume)
1129 samplepos_t nframes = end_sample - start_sample;
1133 if ((ms & MonitoringInput) == 0) {
1134 /* Route::process_output_buffers() clears the buffer as-needed */
1137 target = &scratch_bufs.get_midi (0);
1140 if (ms & MonitoringDisk) {
1141 /* disk data needed */
1143 Location* loc = _loop_location;
1145 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1146 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1147 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), start_sample, end_sample,
1148 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1150 //cerr << "======== PRE ========\n";
1151 //_midi_buf->dump (cerr);
1152 //cerr << "----------------\n";
1154 size_t events_read = 0;
1157 samplepos_t effective_start;
1159 Evoral::Range<samplepos_t> loop_range (loc->start(), loc->end() - 1);
1160 effective_start = loop_range.squish (start_sample);
1162 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1164 if (effective_start == loc->start()) {
1165 /* We need to turn off notes that may extend
1166 beyond the loop end.
1169 _midi_buf->resolve_tracker (*target, 0);
1172 /* for split-cycles we need to offset the events */
1174 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1176 /* end of loop is within the range we are reading, so
1177 split the read in two, and lie about the location
1181 samplecnt_t first, second;
1183 first = loc->end() - effective_start;
1184 second = nframes - first;
1186 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1187 effective_start, loc->end(), first, second));
1190 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1191 effective_start, first));
1192 events_read = _midi_buf->read (*target, effective_start, first);
1196 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1197 loc->start(), second));
1198 events_read += _midi_buf->read (*target, loc->start(), second);
1202 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1203 effective_start, nframes));
1204 events_read = _midi_buf->read (*target, effective_start, effective_start + nframes);
1207 const size_t n_skipped = _midi_buf->skip_to (start_sample);
1208 if (n_skipped > 0) {
1209 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1211 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", start_sample, end_sample, nframes));
1212 events_read = _midi_buf->read (*target, start_sample, end_sample, Port::port_offset ());
1215 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1216 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1217 _name, events_read, playback_sample, playback_sample + nframes,
1218 _midi_buf->read_space(), _midi_buf->write_space(),
1219 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1222 g_atomic_int_add (&_samples_read_from_ringbuffer, nframes);
1225 if (speed != 0.0 && fabsf (speed) != 1.0f) {
1226 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1227 MidiBuffer::TimeType *tme = i.timeptr();
1228 // XXX need to subtract port offsets before scaling
1229 // also we must only scale events read from disk
1230 // and not existing input data in the buffer.
1231 *tme = (*tme) * nframes / disk_samples_to_consume;
1235 if (ms & MonitoringInput) {
1236 dst.merge_from (*target, nframes);
1240 if (!target->empty ()) {
1241 cerr << "======== MIDI OUT ========\n";
1242 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1243 const Evoral::Event<MidiBuffer::TimeType> ev (*i, false);
1244 cerr << "MIDI EVENT (from disk) @ " << ev.time();
1245 for (size_t xx = 0; xx < ev.size(); ++xx) {
1246 cerr << ' ' << hex << (int) ev.buffer()[xx];
1248 cerr << dec << endl;
1250 cerr << "----------------\n";
1254 cerr << "======== MIDI Disk Buffer ========\n";
1255 _midi_buf->dump (cerr);
1256 cerr << "----------------\n";
1260 /** @a start is set to the new sample position (TIME) read up to */
1262 DiskReader::midi_read (samplepos_t& start, samplecnt_t dur, bool reversed)
1264 samplecnt_t this_read = 0;
1265 samplepos_t loop_end = 0;
1266 samplepos_t loop_start = 0;
1267 samplecnt_t loop_length = 0;
1268 Location* loc = _loop_location;
1269 samplepos_t effective_start = start;
1270 Evoral::Range<samplepos_t>* loop_range (0);
1274 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS::midi_read @ %1 cnt %2\n", start, dur));
1276 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
1277 MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1278 sampleoffset_t loop_offset = 0;
1280 if (!reversed && loc) {
1281 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1286 /* take any loop into account. we can't read past the end of the loop. */
1288 if (loc && !reversed) {
1291 loop_range = new Evoral::Range<samplepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1294 /* if we are (seamlessly) looping, ensure that the first sample we read is at the correct
1295 position within the loop.
1298 effective_start = loop_range->squish (effective_start);
1300 if ((loop_end - effective_start) <= dur) {
1301 /* too close to end of loop to read "dur", so
1304 this_read = loop_end - effective_start;
1313 if (this_read == 0) {
1317 this_read = min (dur,this_read);
1319 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1321 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1322 error << string_compose(
1323 _("MidiDiskstream %1: cannot read %2 from playlist at sample %3"),
1324 id(), this_read, start) << endmsg;
1328 g_atomic_int_add (&_samples_written_to_ringbuffer, this_read);
1332 // Swap note ons with note offs here. etc?
1333 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1334 // CC values etc. hard.
1338 /* adjust passed-by-reference argument (note: this is
1339 monotonic and does not reflect looping.
1343 /* similarly adjust effective_start, but this may be
1344 readjusted for seamless looping as we continue around
1347 effective_start += this_read;
1357 DiskReader::refill_midi ()
1359 if (!_playlists[DataType::MIDI] || !_midi_buf) {
1363 const size_t write_space = _midi_buf->write_space();
1364 const bool reversed = _session.transport_speed() < 0.0f;
1366 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file sample = %2\n", write_space, file_sample[DataType::MIDI]));
1368 /* no space to write */
1369 if (write_space == 0) {
1377 /* at end: nothing to do */
1379 samplepos_t ffm = file_sample[DataType::MIDI];
1381 if (ffm == max_samplepos) {
1386 const uint32_t samples_read = g_atomic_int_get (&_samples_read_from_ringbuffer);
1387 const uint32_t samples_written = g_atomic_int_get (&_samples_written_to_ringbuffer);
1389 if ((samples_read < samples_written) && (samples_written - samples_read) >= midi_readahead) {
1393 samplecnt_t to_read = midi_readahead - ((samplecnt_t)samples_written - (samplecnt_t)samples_read);
1395 to_read = min (to_read, (samplecnt_t) (max_samplepos - ffm));
1396 to_read = min (to_read, (samplecnt_t) write_space);
1398 if (midi_read (ffm, to_read, reversed)) {
1402 file_sample[DataType::MIDI] = ffm;
1408 DiskReader::set_no_disk_output (bool yn)
1410 /* this MUST be called as part of the process call tree, before any
1411 disk readers are invoked. We use it when the session needs the
1412 transport (and thus effective read position for DiskReaders) to keep
1413 advancing as part of syncing up with a transport master, but we
1414 don't want any actual disk output yet because we are still not
1417 _no_disk_output = yn;