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 == 0.0 && (ms == MonitoringDisk)) {
261 /* stopped. Don't accidentally pass any data from disk
262 * into our outputs (e.g. via interpolation)
264 bufs.silence (nframes, 0);
268 if (speed != 1.0f && speed != -1.0f) {
269 interpolation.set_speed (speed);
270 midi_interpolation.set_speed (speed);
271 playback_distance = midi_interpolation.distance (nframes);
275 playback_distance = -playback_distance;
278 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
280 if (!result_required || ((ms & MonitoringDisk) == 0)) {
282 /* no need for actual disk data, just advance read pointer and return */
284 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
285 (*chan)->buf->increment_read_ptr (playback_distance);
290 /* we need audio data from disk */
292 size_t n_buffers = bufs.count().n_audio();
293 size_t n_chans = c->size();
296 if (n_chans > n_buffers) {
297 scaling = ((float) n_buffers)/n_chans;
302 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
304 ChannelInfo* chaninfo (*chan);
305 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
306 Sample* disk_signal = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
308 if (ms & MonitoringInput) {
309 /* put disk stream in scratch buffer, blend at end */
310 disk_signal = scratch_bufs.get_audio(n).data ();
312 /* no input stream needed, just overwrite buffers */
313 disk_signal = buf.data ();
316 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
318 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
320 if (fabsf (speed) != 1.0f) {
321 (void) interpolation.interpolate (
323 chaninfo->rw_vector.buf[0],
325 } else if (speed != 0.0) {
326 memcpy (disk_signal, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
331 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
333 if (playback_distance <= total) {
335 /* We have enough samples, but not in one lump.
338 if (fabsf (speed) != 1.0f) {
339 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
340 chaninfo->rw_vector.buf[0],
342 disk_signal += chaninfo->rw_vector.len[0];
343 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
344 chaninfo->rw_vector.buf[1],
346 } else if (speed != 0.0) {
348 chaninfo->rw_vector.buf[0],
349 chaninfo->rw_vector.len[0] * sizeof (Sample));
350 disk_signal += chaninfo->rw_vector.len[0];
352 chaninfo->rw_vector.buf[1],
353 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
358 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
359 cerr << "underrun for " << _name << endl;
360 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
361 DEBUG_THREAD_SELF, name(), total));
368 if (scaling != 1.0f && speed != 0.0) {
369 apply_gain_to_buffer (disk_signal, nframes, scaling);
372 chaninfo->buf->increment_read_ptr (playback_distance);
374 if ((speed != 0.0) && (ms & MonitoringInput)) {
375 /* mix the disk signal into the input signal (already in bufs) */
376 mix_buffers_no_gain (buf.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
381 /* MIDI data handling */
383 if (!_session.declick_out_pending()) {
384 if (ms & MonitoringDisk) {
385 get_midi_playback (bufs.get_midi (0), playback_distance, ms, scratch_bufs, speed, playback_distance);
390 playback_sample -= playback_distance;
392 playback_sample += playback_distance;
395 if (_playlists[DataType::AUDIO]) {
398 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
399 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
400 c->front()->buf->bufsize()));
404 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
405 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
413 if (_playlists[DataType::MIDI]) {
414 /* MIDI butler needed part */
416 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
417 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
420 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
421 " = " << frames_written - frames_read
422 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
425 /* frames_read will generally be less than frames_written, but
426 * immediately after an overwrite, we can end up having read some data
427 * before we've written any. we don't need to trip an assert() on this,
428 * but we do need to check so that the decision on whether or not we
429 * need the butler is done correctly.
434 * Doing heavy GUI operations[1] can stall also the butler.
435 * The RT-thread meanwhile will happily continue and
436 * ‘frames_read’ (from buffer to output) will become larger
437 * than ‘frames_written’ (from disk to buffer).
439 * The disk-stream is now behind..
441 * In those cases the butler needs to be summed to refill the buffer (done now)
442 * AND we need to skip (frames_read - frames_written). ie remove old events
443 * before playback_sample from the rinbuffer.
445 * [1] one way to do so is described at #6170.
446 * For me just popping up the context-menu on a MIDI-track header
447 * of a track with a large (think beethoven :) midi-region also did the
448 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
450 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
453 if (frames_read <= frames_written) {
454 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
463 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
467 DiskReader::set_pending_overwrite (bool yn)
469 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
471 _pending_overwrite = yn;
473 overwrite_frame = playback_sample;
475 boost::shared_ptr<ChannelList> c = channels.reader ();
477 overwrite_offset = c->front()->buf->get_read_ptr();
482 DiskReader::overwrite_existing_buffers ()
486 boost::shared_ptr<ChannelList> c = channels.reader();
488 overwrite_queued = false;
490 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
496 const bool reversed = _session.transport_speed() < 0.0f;
498 /* assume all are the same size */
499 framecnt_t size = c->front()->buf->bufsize();
501 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
502 std::auto_ptr<float> gain_buffer (new float[size]);
504 /* reduce size so that we can fill the buffer correctly (ringbuffers
505 can only handle size-1, otherwise they appear to be empty)
512 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
514 start = overwrite_frame;
515 framecnt_t cnt = size;
517 /* to fill the buffer without resetting the playback sample, we need to
518 do it one or two chunks (normally two).
520 |----------------------------------------------------------------------|
524 |<- second chunk->||<----------------- first chunk ------------------>|
528 framecnt_t to_read = size - overwrite_offset;
530 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
531 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
532 id(), size, playback_sample) << endmsg;
540 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
541 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
542 id(), size, playback_sample) << endmsg;
554 if (_midi_buf && _playlists[DataType::MIDI]) {
556 /* Clear the playback buffer contents. This is safe as long as the butler
557 thread is suspended, which it should be.
560 _midi_buf->reset_tracker ();
562 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
563 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
565 /* Resolve all currently active notes in the playlist. This is more
566 aggressive than it needs to be: ideally we would only resolve what is
567 absolutely necessary, but this seems difficult and/or impossible without
568 having the old data or knowing what change caused the overwrite.
570 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
572 midi_read (overwrite_frame, _chunk_frames, false);
574 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
577 _pending_overwrite = false;
583 DiskReader::seek (framepos_t frame, bool complete_refill)
587 ChannelList::iterator chan;
588 boost::shared_ptr<ChannelList> c = channels.reader();
590 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
591 (*chan)->buf->reset ();
594 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
595 /* we haven't read anything since the last seek,
596 so flush all note trackers to prevent
603 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
604 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
606 playback_sample = frame;
609 if (complete_refill) {
610 /* call _do_refill() to refill the entire buffer, using
611 the largest reads possible.
613 while ((ret = do_refill_with_alloc (false)) > 0) ;
615 /* call _do_refill() to refill just one chunk, and then
618 ret = do_refill_with_alloc (true);
626 DiskReader::can_internal_playback_seek (framecnt_t distance)
630 ChannelList::iterator chan;
631 boost::shared_ptr<ChannelList> c = channels.reader();
633 for (chan = c->begin(); chan != c->end(); ++chan) {
634 if ((*chan)->buf->read_space() < (size_t) distance) {
641 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
642 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
644 return ((frames_written - frames_read) < distance);
648 DiskReader::internal_playback_seek (framecnt_t distance)
650 ChannelList::iterator chan;
651 boost::shared_ptr<ChannelList> c = channels.reader();
653 for (chan = c->begin(); chan != c->end(); ++chan) {
654 (*chan)->buf->increment_read_ptr (::llabs(distance));
657 playback_sample += distance;
663 void swap_by_ptr (Sample *first, Sample *last)
665 while (first < last) {
672 /** Read some data for 1 channel from our playlist into a buffer.
673 * @param buf Buffer to write to.
674 * @param start Session frame to start reading from; updated to where we end up
676 * @param cnt Count of samples to read.
677 * @param reversed true if we are running backwards, otherwise false.
680 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
681 framepos_t& start, framecnt_t cnt,
682 int channel, bool reversed)
684 framecnt_t this_read = 0;
686 framepos_t loop_end = 0;
687 framepos_t loop_start = 0;
688 framecnt_t offset = 0;
691 if (!_playlists[DataType::AUDIO]) {
692 memset (buf, 0, sizeof (Sample) * cnt);
696 /* XXX we don't currently play loops in reverse. not sure why */
700 framecnt_t loop_length = 0;
702 /* Make the use of a Location atomic for this read operation.
704 Note: Locations don't get deleted, so all we care about
705 when I say "atomic" is that we are always pointing to
706 the same one and using a start/length values obtained
710 if ((loc = loop_location) != 0) {
711 loop_start = loc->start();
712 loop_end = loc->end();
713 loop_length = loop_end - loop_start;
716 /* if we are looping, ensure that the first frame we read is at the correct
717 position within the loop.
720 if (loc && start >= loop_end) {
721 start = loop_start + ((start - loop_start) % loop_length);
730 /* We need this while loop in case we hit a loop boundary, in which case our read from
731 the playlist must be split into more than one section.
736 /* take any loop into account. we can't read past the end of the loop. */
738 if (loc && (loop_end - start < cnt)) {
739 this_read = loop_end - start;
746 if (this_read == 0) {
750 this_read = min(cnt,this_read);
752 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
753 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
760 swap_by_ptr (buf, buf + this_read - 1);
764 /* if we read to the end of the loop, go back to the beginning */
781 DiskReader::_do_refill_with_alloc (bool partial_fill)
783 /* We limit disk reads to at most 4MB chunks, which with floating point
784 samples would be 1M samples. But we might use 16 or 14 bit samples,
785 in which case 4MB is more samples than that. Therefore size this for
786 the smallest sample value .. 4MB = 2M samples (16 bit).
790 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
791 std::auto_ptr<float> gain_buf (new float[2*1048576]);
793 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
800 return refill_midi ();
804 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
806 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
812 return refill_midi ();
816 /** Get some more data from disk and put it in our channels' bufs,
817 * if there is suitable space in them.
819 * If fill_level is non-zero, then we will refill the buffer so that there is
820 * still at least fill_level samples of space left to be filled. This is used
821 * after locates so that we do not need to wait to fill the entire buffer.
826 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
828 /* do not read from disk while session is marked as Loading, to avoid
829 useless redundant I/O.
832 if (_session.loading()) {
838 RingBufferNPT<Sample>::rw_vector vector;
839 bool const reversed = _session.transport_speed() < 0.0f;
840 framecnt_t total_space;
841 framecnt_t zero_fill;
843 ChannelList::iterator i;
844 boost::shared_ptr<ChannelList> c = channels.reader();
851 assert(mixdown_buffer);
859 c->front()->buf->get_write_vector (&vector);
861 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
862 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
863 /* nowhere to write to */
868 if (fill_level < total_space) {
869 total_space -= fill_level;
871 /* we can't do anything with it */
876 /* if we're running close to normal speed and there isn't enough
877 space to do disk_read_chunk_frames of I/O, then don't bother.
879 at higher speeds, just do it because the sync between butler
880 and audio thread may not be good enough.
882 Note: it is a design assumption that disk_read_chunk_frames is smaller
883 than the playback buffer size, so this check should never trip when
884 the playback buffer is empty.
887 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()));
888 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
892 /* when slaved, don't try to get too close to the read pointer. this
893 leaves space for the buffer reversal to have something useful to
897 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
898 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
904 if (file_frame == 0) {
906 /* at start: nothing to do but fill with silence */
908 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
910 ChannelInfo* chan (*i);
911 chan->buf->get_write_vector (&vector);
912 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
914 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
916 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
921 if (file_frame < total_space) {
923 /* too close to the start: read what we can,
924 and then zero fill the rest
927 zero_fill = total_space - file_frame;
928 total_space = file_frame;
937 if (file_frame == max_framepos) {
939 /* at end: nothing to do but fill with silence */
941 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
943 ChannelInfo* chan (*i);
944 chan->buf->get_write_vector (&vector);
945 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
947 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
949 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
954 if (file_frame > max_framepos - total_space) {
956 /* to close to the end: read what we can, and zero fill the rest */
958 zero_fill = total_space - (max_framepos - file_frame);
959 total_space = max_framepos - file_frame;
966 framepos_t file_frame_tmp = 0;
968 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
970 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
971 size_t total_bytes = total_space * bits_per_sample / 8;
973 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
975 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
977 /* find nearest (lower) multiple of 16384 */
979 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
981 /* now back to samples */
983 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
985 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
987 // uint64_t before = g_get_monotonic_time ();
990 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
992 ChannelInfo* chan (*i);
995 framecnt_t len1, len2;
997 chan->buf->get_write_vector (&vector);
999 if ((framecnt_t) vector.len[0] > samples_to_read) {
1001 /* we're not going to fill the first chunk, so certainly do not bother with the
1002 other part. it won't be connected with the part we do fill, as in:
1004 .... => writable space
1005 ++++ => readable space
1006 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1008 |......|+++++++++++++|...............................|
1013 So, just pretend that the buf1 part isn't there.
1023 file_frame_tmp = file_frame;
1025 buf1 = vector.buf[0];
1026 len1 = vector.len[0];
1027 buf2 = vector.buf[1];
1028 len2 = vector.len[1];
1030 to_read = min (ts, len1);
1031 to_read = min (to_read, (framecnt_t) samples_to_read);
1033 assert (to_read >= 0);
1037 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1042 chan->buf->increment_write_ptr (to_read);
1046 to_read = min (ts, len2);
1050 /* we read all of vector.len[0], but it wasn't the
1051 entire samples_to_read of data, so read some or
1052 all of vector.len[1] as well.
1055 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1060 chan->buf->increment_write_ptr (to_read);
1064 /* XXX: do something */
1069 // elapsed = g_get_monotonic_time () - before;
1070 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1072 file_frame = file_frame_tmp;
1073 assert (file_frame >= 0);
1075 ret = ((total_space - samples_to_read) > _chunk_frames);
1077 c->front()->buf->get_write_vector (&vector);
1084 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1086 /* If we're coming from an undo, it will have handled
1087 automation undo (it must, since automation-follows-regions
1088 can lose automation data). Hence we can do nothing here.
1095 if (!_route || Config->get_automation_follows_regions () == false) {
1099 list< Evoral::RangeMove<double> > movements;
1101 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1102 i != movements_frames.end();
1105 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1108 /* move panner automation */
1109 boost::shared_ptr<Pannable> pannable = _route->pannable();
1110 Evoral::ControlSet::Controls& c (pannable->controls());
1112 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1113 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1117 boost::shared_ptr<AutomationList> alist = ac->alist();
1118 if (!alist->size()) {
1121 XMLNode & before = alist->get_state ();
1122 bool const things_moved = alist->move_ranges (movements);
1124 _session.add_command (new MementoCommand<AutomationList> (
1125 *alist.get(), &before, &alist->get_state ()));
1128 /* move processor automation */
1129 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1133 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1135 boost::shared_ptr<Processor> processor (p.lock ());
1140 list< Evoral::RangeMove<double> > movements;
1141 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1142 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1145 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1147 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1148 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1152 XMLNode & before = al->get_state ();
1153 bool const things_moved = al->move_ranges (movements);
1155 _session.add_command (
1156 new MementoCommand<AutomationList> (
1157 *al.get(), &before, &al->get_state ()
1164 boost::shared_ptr<MidiBuffer>
1165 DiskReader::get_gui_feed_buffer () const
1167 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1169 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1170 b->copy (_gui_feed_buffer);
1175 DiskReader::reset_tracker ()
1177 _midi_buf->reset_tracker ();
1179 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1182 mp->reset_note_trackers ();
1187 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1189 _midi_buf->resolve_tracker(buffer, time);
1191 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1194 mp->reset_note_trackers ();
1198 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1199 * so that an event at playback_sample has time = 0
1202 DiskReader::get_midi_playback (MidiBuffer& dst, framecnt_t nframes, MonitorState ms, BufferSet& scratch_bufs, double speed, framecnt_t playback_distance)
1206 if ((ms & MonitoringInput) == 0) {
1210 target = &scratch_bufs.get_midi (0);
1213 if (ms & MonitoringDisk) {
1214 /* no disk data needed */
1216 Location* loc = loop_location;
1218 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1219 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1220 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1221 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1223 //cerr << "======== PRE ========\n";
1224 //_midi_buf->dump (cerr);
1225 //cerr << "----------------\n";
1227 size_t events_read = 0;
1230 framepos_t effective_start;
1232 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1233 effective_start = loop_range.squish (playback_sample);
1235 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1237 if (effective_start == loc->start()) {
1238 /* We need to turn off notes that may extend
1239 beyond the loop end.
1242 _midi_buf->resolve_tracker (*target, 0);
1245 /* for split-cycles we need to offset the events */
1247 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1249 /* end of loop is within the range we are reading, so
1250 split the read in two, and lie about the location
1254 framecnt_t first, second;
1256 first = loc->end() - effective_start;
1257 second = nframes - first;
1259 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1260 effective_start, loc->end(), first, second));
1263 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1264 effective_start, first));
1265 events_read = _midi_buf->read (*target, effective_start, first);
1269 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1270 loc->start(), second));
1271 events_read += _midi_buf->read (*target, loc->start(), second);
1275 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1276 effective_start, nframes));
1277 events_read = _midi_buf->read (*target, effective_start, effective_start + nframes);
1280 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1281 if (n_skipped > 0) {
1282 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1284 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1285 events_read = _midi_buf->read (*target, playback_sample, playback_sample + nframes);
1288 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1289 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1290 _name, events_read, playback_sample, playback_sample + nframes,
1291 _midi_buf->read_space(), _midi_buf->write_space(),
1292 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1295 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1299 if (speed != 0.0 && fabsf (speed) != 1.0f) {
1300 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1301 MidiBuffer::TimeType *tme = i.timeptr();
1302 *tme = (*tme) * nframes / playback_distance;
1306 if (ms & MonitoringInput) {
1307 dst.merge_from (*target, nframes);
1310 //cerr << "======== POST ========\n";
1311 //_midi_buf->dump (cerr);
1312 //cerr << "----------------\n";
1315 /** @a start is set to the new frame position (TIME) read up to */
1317 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1319 framecnt_t this_read = 0;
1320 framepos_t loop_end = 0;
1321 framepos_t loop_start = 0;
1322 framecnt_t loop_length = 0;
1323 Location* loc = loop_location;
1324 framepos_t effective_start = start;
1325 Evoral::Range<framepos_t>* loop_range (0);
1327 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1328 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1329 MidiChannelFilter* filter = 0;
1331 frameoffset_t loop_offset = 0;
1333 if (!reversed && loc) {
1334 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1339 /* take any loop into account. we can't read past the end of the loop. */
1341 if (loc && !reversed) {
1344 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1347 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1348 position within the loop.
1351 effective_start = loop_range->squish (effective_start);
1353 if ((loop_end - effective_start) <= dur) {
1354 /* too close to end of loop to read "dur", so
1357 this_read = loop_end - effective_start;
1366 if (this_read == 0) {
1370 this_read = min (dur,this_read);
1372 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1374 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1375 error << string_compose(
1376 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1377 id(), this_read, start) << endmsg;
1381 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1385 // Swap note ons with note offs here. etc?
1386 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1387 // CC values etc. hard.
1391 /* adjust passed-by-reference argument (note: this is
1392 monotonic and does not reflect looping.
1396 /* similarly adjust effective_start, but this may be
1397 readjusted for seamless looping as we continue around
1400 effective_start += this_read;
1404 //offset += this_read;
1411 DiskReader::refill_midi ()
1413 if (!_playlists[DataType::MIDI]) {
1417 size_t write_space = _midi_buf->write_space();
1418 const bool reversed = _session.transport_speed() < 0.0f;
1420 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1422 /* no space to write */
1423 if (write_space == 0) {
1431 /* at end: nothing to do */
1433 if (file_frame == max_framepos) {
1438 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1439 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1441 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1445 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1447 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1448 to_read = min (to_read, (framecnt_t) write_space);
1450 if (midi_read (file_frame, to_read, reversed)) {