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.
21 #include "pbd/memento_command.h"
23 #include "ardour/audioengine.h"
24 #include "ardour/audioplaylist.h"
25 #include "ardour/audio_buffer.h"
26 #include "ardour/butler.h"
27 #include "ardour/debug.h"
28 #include "ardour/disk_reader.h"
29 #include "ardour/midi_ring_buffer.h"
30 #include "ardour/midi_playlist.h"
31 #include "ardour/pannable.h"
32 #include "ardour/playlist.h"
33 #include "ardour/playlist_factory.h"
34 #include "ardour/session.h"
35 #include "ardour/session_playlists.h"
37 using namespace ARDOUR;
41 ARDOUR::framecnt_t DiskReader::_chunk_frames = default_chunk_frames ();
42 PBD::Signal0<void> DiskReader::Underrun;
43 Sample* DiskReader::_mixdown_buffer = 0;
44 gain_t* DiskReader::_gain_buffer = 0;
45 framecnt_t DiskReader::midi_readahead = 4096;
47 DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
48 : DiskIOProcessor (s, str, f)
51 , overwrite_offset (0)
52 , _pending_overwrite (false)
53 , overwrite_queued (false)
54 , _monitoring_choice (MonitorDisk)
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)
116 for (uint32_t n = 0; n < DataType::num_types; ++n) {
118 _playlists[n]->set_name (str);
121 SessionObject::set_name(str);
128 DiskReader::set_roll_delay (ARDOUR::framecnt_t nframes)
130 _roll_delay = nframes;
134 DiskReader::state (bool full)
136 XMLNode& node (DiskIOProcessor::state (full));
137 node.add_property(X_("type"), X_("diskreader"));
142 DiskReader::set_state (const XMLNode& node, int version)
144 if (DiskIOProcessor::set_state (node, version)) {
152 DiskReader::realtime_handle_transport_stopped ()
157 DiskReader::realtime_locate ()
162 DiskReader::buffer_load () const
164 /* Note: for MIDI it's not trivial to differentiate the following two cases:
166 1. The playback buffer is empty because the system has run out of time to fill it.
167 2. The playback buffer is empty because there is no more data on the playlist.
169 If we use a simple buffer load computation, we will report that the MIDI diskstream
170 cannot keep up when #2 happens, when in fact it can. Since MIDI data rates
171 are so low compared to audio, just use the audio value here.
174 boost::shared_ptr<ChannelList> c = channels.reader();
177 /* no channels, so no buffers, so completely full and ready to playback, sir! */
181 PBD::RingBufferNPT<Sample> * b = c->front()->buf;
182 return (float) ((double) b->read_space() / (double) b->bufsize());
186 DiskReader::adjust_buffering ()
188 boost::shared_ptr<ChannelList> c = channels.reader();
190 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
191 (*chan)->resize (_session.butler()->audio_diskstream_playback_buffer_size());
196 DiskReader::playlist_changed (const PropertyChange&)
198 playlist_modified ();
202 DiskReader::playlist_modified ()
204 if (!i_am_the_modifier && !overwrite_queued) {
205 // !!!! _session.request_overwrite_buffer (this);
206 overwrite_queued = true;
211 DiskReader::use_playlist (DataType dt, boost::shared_ptr<Playlist> playlist)
213 bool prior_playlist = false;
215 if (_playlists[dt]) {
216 prior_playlist = true;
219 if (DiskIOProcessor::use_playlist (dt, playlist)) {
223 /* don't do this if we've already asked for it *or* if we are setting up
224 the diskstream for the very first time - the input changed handling will
225 take care of the buffer refill.
228 if (!overwrite_queued && (prior_playlist || _session.loading())) {
229 _session.request_overwrite_buffer (_route);
230 overwrite_queued = true;
237 DiskReader::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
238 double speed, pframes_t nframes, bool result_required)
241 boost::shared_ptr<ChannelList> c = channels.reader();
242 ChannelList::iterator chan;
243 framecnt_t playback_distance = 0;
244 const bool need_disk_signal = result_required || _monitoring_choice == MonitorDisk || _monitoring_choice == MonitorCue;
246 _need_butler = false;
248 if (fabsf (_actual_speed) != 1.0f) {
249 midi_interpolation.set_speed (_target_speed);
250 interpolation.set_speed (_target_speed);
251 playback_distance = midi_interpolation.distance (nframes);
253 playback_distance = nframes;
256 if (!need_disk_signal) {
258 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
259 (*chan)->buf->increment_read_ptr (playback_distance);
265 /* we're doing playback */
267 size_t n_buffers = bufs.count().n_audio();
268 size_t n_chans = c->size();
271 if (n_chans > n_buffers) {
272 scaling = ((float) n_buffers)/n_chans;
277 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
279 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
280 Sample* outgoing = buf.data ();
282 ChannelInfo* chaninfo (*chan);
284 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
286 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
288 if (fabsf (_actual_speed) != 1.0f) {
289 (void) interpolation.interpolate (
291 chaninfo->rw_vector.buf[0],
294 memcpy (outgoing, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
299 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
301 if (playback_distance <= total) {
303 /* We have enough samples, but not in one lump.
306 if (fabsf (_actual_speed) != 1.0f) {
307 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
308 chaninfo->rw_vector.buf[0],
310 outgoing += chaninfo->rw_vector.len[0];
311 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
312 chaninfo->rw_vector.buf[1],
316 chaninfo->rw_vector.buf[0],
317 chaninfo->rw_vector.len[0] * sizeof (Sample));
318 outgoing += chaninfo->rw_vector.len[0];
320 chaninfo->rw_vector.buf[1],
321 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
326 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
327 cerr << "underrun for " << _name << endl;
328 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
329 DEBUG_THREAD_SELF, name(), total));
337 if (scaling != 1.0f) {
338 apply_gain_to_buffer (outgoing, nframes, scaling);
341 chaninfo->buf->increment_read_ptr (playback_distance);
342 _speed = _target_speed;
345 /* MIDI data handling */
347 if (!_session.declick_out_pending()) {
349 /* copy the diskstream data to all output buffers */
351 MidiBuffer& mbuf (bufs.get_midi (0));
352 get_playback (mbuf, playback_distance);
355 if (_target_speed > 0 && _actual_speed != 1.0f) {
356 MidiBuffer& mbuf (bufs.get_midi (0));
357 for (MidiBuffer::iterator i = mbuf.begin(); i != mbuf.end(); ++i) {
358 MidiBuffer::TimeType *tme = i.timeptr();
359 *tme = (*tme) * nframes / playback_distance;
364 if (_actual_speed < 0.0) {
365 playback_sample -= playback_distance;
367 playback_sample += playback_distance;
370 if (_playlists[DataType::AUDIO]) {
373 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
374 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
375 c->front()->buf->bufsize()));
379 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
380 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
388 if (_playlists[DataType::MIDI]) {
389 /* MIDI butler needed part */
391 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
392 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
395 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
396 " = " << frames_written - frames_read
397 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
400 /* frames_read will generally be less than frames_written, but
401 * immediately after an overwrite, we can end up having read some data
402 * before we've written any. we don't need to trip an assert() on this,
403 * but we do need to check so that the decision on whether or not we
404 * need the butler is done correctly.
409 * Doing heavy GUI operations[1] can stall also the butler.
410 * The RT-thread meanwhile will happily continue and
411 * ‘frames_read’ (from buffer to output) will become larger
412 * than ‘frames_written’ (from disk to buffer).
414 * The disk-stream is now behind..
416 * In those cases the butler needs to be summed to refill the buffer (done now)
417 * AND we need to skip (frames_read - frames_written). ie remove old events
418 * before playback_sample from the rinbuffer.
420 * [1] one way to do so is described at #6170.
421 * For me just popping up the context-menu on a MIDI-track header
422 * of a track with a large (think beethoven :) midi-region also did the
423 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
425 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
428 if (frames_read <= frames_written) {
429 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
437 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
438 /* make sure bufs shows whatever data we had available */
441 cnt.set (DataType::MIDI, 1);
442 cnt.set (DataType::AUDIO, bufs.count().n_audio());
443 bufs.set_count (cnt);
447 DiskReader::calculate_playback_distance (pframes_t nframes)
449 frameoffset_t playback_distance = nframes;
451 if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
452 interpolation.set_speed (_target_speed);
453 boost::shared_ptr<ChannelList> c = channels.reader();
455 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
456 playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
459 playback_distance = nframes;
462 if (_actual_speed < 0.0) {
463 return -playback_distance;
465 return playback_distance;
470 DiskReader::set_pending_overwrite (bool yn)
472 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
474 _pending_overwrite = yn;
476 overwrite_frame = playback_sample;
478 boost::shared_ptr<ChannelList> c = channels.reader ();
480 overwrite_offset = c->front()->buf->get_read_ptr();
485 DiskReader::overwrite_existing_buffers ()
489 boost::shared_ptr<ChannelList> c = channels.reader();
491 overwrite_queued = false;
493 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
499 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
501 /* assume all are the same size */
502 framecnt_t size = c->front()->buf->bufsize();
504 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
505 std::auto_ptr<float> gain_buffer (new float[size]);
507 /* reduce size so that we can fill the buffer correctly (ringbuffers
508 can only handle size-1, otherwise they appear to be empty)
515 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
517 start = overwrite_frame;
518 framecnt_t cnt = size;
520 /* to fill the buffer without resetting the playback sample, we need to
521 do it one or two chunks (normally two).
523 |----------------------------------------------------------------------|
527 |<- second chunk->||<----------------- first chunk ------------------>|
531 framecnt_t to_read = size - overwrite_offset;
533 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
534 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
535 id(), size, playback_sample) << endmsg;
543 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
544 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
545 id(), size, playback_sample) << endmsg;
557 if (_midi_buf && _playlists[DataType::MIDI]) {
559 /* Clear the playback buffer contents. This is safe as long as the butler
560 thread is suspended, which it should be.
563 _midi_buf->reset_tracker ();
565 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
566 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
568 /* Resolve all currently active notes in the playlist. This is more
569 aggressive than it needs to be: ideally we would only resolve what is
570 absolutely necessary, but this seems difficult and/or impossible without
571 having the old data or knowing what change caused the overwrite.
573 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
575 midi_read (overwrite_frame, _chunk_frames, false);
577 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
580 _pending_overwrite = false;
586 DiskReader::seek (framepos_t frame, bool complete_refill)
590 ChannelList::iterator chan;
591 boost::shared_ptr<ChannelList> c = channels.reader();
593 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
594 (*chan)->buf->reset ();
597 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
598 /* we haven't read anything since the last seek,
599 so flush all note trackers to prevent
606 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
607 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
609 playback_sample = frame;
612 if (complete_refill) {
613 /* call _do_refill() to refill the entire buffer, using
614 the largest reads possible.
616 while ((ret = do_refill_with_alloc (false)) > 0) ;
618 /* call _do_refill() to refill just one chunk, and then
621 ret = do_refill_with_alloc (true);
629 DiskReader::can_internal_playback_seek (framecnt_t distance)
633 ChannelList::iterator chan;
634 boost::shared_ptr<ChannelList> c = channels.reader();
636 for (chan = c->begin(); chan != c->end(); ++chan) {
637 if ((*chan)->buf->read_space() < (size_t) distance) {
644 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
645 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
647 return ((frames_written - frames_read) < distance);
651 DiskReader::internal_playback_seek (framecnt_t distance)
653 ChannelList::iterator chan;
654 boost::shared_ptr<ChannelList> c = channels.reader();
656 for (chan = c->begin(); chan != c->end(); ++chan) {
657 (*chan)->buf->increment_read_ptr (::llabs(distance));
660 playback_sample += distance;
666 void swap_by_ptr (Sample *first, Sample *last)
668 while (first < last) {
675 /** Read some data for 1 channel from our playlist into a buffer.
676 * @param buf Buffer to write to.
677 * @param start Session frame to start reading from; updated to where we end up
679 * @param cnt Count of samples to read.
680 * @param reversed true if we are running backwards, otherwise false.
683 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
684 framepos_t& start, framecnt_t cnt,
685 int channel, bool reversed)
687 framecnt_t this_read = 0;
689 framepos_t loop_end = 0;
690 framepos_t loop_start = 0;
691 framecnt_t offset = 0;
694 if (!_playlists[DataType::AUDIO]) {
695 memset (buf, 0, sizeof (Sample) * cnt);
699 /* XXX we don't currently play loops in reverse. not sure why */
703 framecnt_t loop_length = 0;
705 /* Make the use of a Location atomic for this read operation.
707 Note: Locations don't get deleted, so all we care about
708 when I say "atomic" is that we are always pointing to
709 the same one and using a start/length values obtained
713 if ((loc = loop_location) != 0) {
714 loop_start = loc->start();
715 loop_end = loc->end();
716 loop_length = loop_end - loop_start;
719 /* if we are looping, ensure that the first frame we read is at the correct
720 position within the loop.
723 if (loc && start >= loop_end) {
724 start = loop_start + ((start - loop_start) % loop_length);
733 /* We need this while loop in case we hit a loop boundary, in which case our read from
734 the playlist must be split into more than one section.
739 /* take any loop into account. we can't read past the end of the loop. */
741 if (loc && (loop_end - start < cnt)) {
742 this_read = loop_end - start;
749 if (this_read == 0) {
753 this_read = min(cnt,this_read);
755 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
756 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
763 swap_by_ptr (buf, buf + this_read - 1);
767 /* if we read to the end of the loop, go back to the beginning */
784 DiskReader::_do_refill_with_alloc (bool partial_fill)
786 /* We limit disk reads to at most 4MB chunks, which with floating point
787 samples would be 1M samples. But we might use 16 or 14 bit samples,
788 in which case 4MB is more samples than that. Therefore size this for
789 the smallest sample value .. 4MB = 2M samples (16 bit).
793 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
794 std::auto_ptr<float> gain_buf (new float[2*1048576]);
796 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
803 return refill_midi ();
807 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
809 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
815 return refill_midi ();
819 /** Get some more data from disk and put it in our channels' bufs,
820 * if there is suitable space in them.
822 * If fill_level is non-zero, then we will refill the buffer so that there is
823 * still at least fill_level samples of space left to be filled. This is used
824 * after locates so that we do not need to wait to fill the entire buffer.
829 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
831 /* do not read from disk while session is marked as Loading, to avoid
832 useless redundant I/O.
835 if (_session.loading()) {
841 RingBufferNPT<Sample>::rw_vector vector;
842 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
843 framecnt_t total_space;
844 framecnt_t zero_fill;
846 ChannelList::iterator i;
847 boost::shared_ptr<ChannelList> c = channels.reader();
854 assert(mixdown_buffer);
862 c->front()->buf->get_write_vector (&vector);
864 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
865 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
866 /* nowhere to write to */
871 if (fill_level < total_space) {
872 total_space -= fill_level;
874 /* we can't do anything with it */
879 /* if we're running close to normal speed and there isn't enough
880 space to do disk_read_chunk_frames of I/O, then don't bother.
882 at higher speeds, just do it because the sync between butler
883 and audio thread may not be good enough.
885 Note: it is a design assumption that disk_read_chunk_frames is smaller
886 than the playback buffer size, so this check should never trip when
887 the playback buffer is empty.
890 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: space to refill %2 vs. chunk %3 (speed = %4)\n", name(), total_space, _chunk_frames, _actual_speed));
891 if ((total_space < _chunk_frames) && fabs (_actual_speed) < 2.0f) {
895 /* when slaved, don't try to get too close to the read pointer. this
896 leaves space for the buffer reversal to have something useful to
900 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
901 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
907 if (file_frame == 0) {
909 /* at start: nothing to do but fill with silence */
911 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
913 ChannelInfo* chan (*i);
914 chan->buf->get_write_vector (&vector);
915 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
917 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
919 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
924 if (file_frame < total_space) {
926 /* too close to the start: read what we can,
927 and then zero fill the rest
930 zero_fill = total_space - file_frame;
931 total_space = file_frame;
940 if (file_frame == max_framepos) {
942 /* at end: nothing to do but fill with silence */
944 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
946 ChannelInfo* chan (*i);
947 chan->buf->get_write_vector (&vector);
948 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
950 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
952 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
957 if (file_frame > max_framepos - total_space) {
959 /* to close to the end: read what we can, and zero fill the rest */
961 zero_fill = total_space - (max_framepos - file_frame);
962 total_space = max_framepos - file_frame;
969 framepos_t file_frame_tmp = 0;
971 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
973 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
974 size_t total_bytes = total_space * bits_per_sample / 8;
976 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
978 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
980 /* find nearest (lower) multiple of 16384 */
982 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
984 /* now back to samples */
986 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
988 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
990 // uint64_t before = g_get_monotonic_time ();
993 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
995 ChannelInfo* chan (*i);
998 framecnt_t len1, len2;
1000 chan->buf->get_write_vector (&vector);
1002 if ((framecnt_t) vector.len[0] > samples_to_read) {
1004 /* we're not going to fill the first chunk, so certainly do not bother with the
1005 other part. it won't be connected with the part we do fill, as in:
1007 .... => writable space
1008 ++++ => readable space
1009 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1011 |......|+++++++++++++|...............................|
1016 So, just pretend that the buf1 part isn't there.
1026 file_frame_tmp = file_frame;
1028 buf1 = vector.buf[0];
1029 len1 = vector.len[0];
1030 buf2 = vector.buf[1];
1031 len2 = vector.len[1];
1033 to_read = min (ts, len1);
1034 to_read = min (to_read, (framecnt_t) samples_to_read);
1036 assert (to_read >= 0);
1040 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1045 chan->buf->increment_write_ptr (to_read);
1049 to_read = min (ts, len2);
1053 /* we read all of vector.len[0], but it wasn't the
1054 entire samples_to_read of data, so read some or
1055 all of vector.len[1] as well.
1058 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1063 chan->buf->increment_write_ptr (to_read);
1067 /* XXX: do something */
1072 // elapsed = g_get_monotonic_time () - before;
1073 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1075 file_frame = file_frame_tmp;
1076 assert (file_frame >= 0);
1078 ret = ((total_space - samples_to_read) > _chunk_frames);
1080 c->front()->buf->get_write_vector (&vector);
1087 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1089 /* If we're coming from an undo, it will have handled
1090 automation undo (it must, since automation-follows-regions
1091 can lose automation data). Hence we can do nothing here.
1098 if (!_route || Config->get_automation_follows_regions () == false) {
1102 list< Evoral::RangeMove<double> > movements;
1104 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1105 i != movements_frames.end();
1108 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1111 /* move panner automation */
1112 boost::shared_ptr<Pannable> pannable = _route->pannable();
1113 Evoral::ControlSet::Controls& c (pannable->controls());
1115 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1116 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1120 boost::shared_ptr<AutomationList> alist = ac->alist();
1121 if (!alist->size()) {
1124 XMLNode & before = alist->get_state ();
1125 bool const things_moved = alist->move_ranges (movements);
1127 _session.add_command (new MementoCommand<AutomationList> (
1128 *alist.get(), &before, &alist->get_state ()));
1131 /* move processor automation */
1132 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1136 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1138 boost::shared_ptr<Processor> processor (p.lock ());
1143 list< Evoral::RangeMove<double> > movements;
1144 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1145 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1148 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1150 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1151 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1155 XMLNode & before = al->get_state ();
1156 bool const things_moved = al->move_ranges (movements);
1158 _session.add_command (
1159 new MementoCommand<AutomationList> (
1160 *al.get(), &before, &al->get_state ()
1167 boost::shared_ptr<MidiBuffer>
1168 DiskReader::get_gui_feed_buffer () const
1170 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1172 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1173 b->copy (_gui_feed_buffer);
1178 DiskReader::reset_tracker ()
1180 _midi_buf->reset_tracker ();
1182 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1185 mp->reset_note_trackers ();
1190 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1192 _midi_buf->resolve_tracker(buffer, time);
1194 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1197 mp->reset_note_trackers ();
1202 DiskReader::flush_playback (framepos_t start, framepos_t end)
1204 _midi_buf->flush (start, end);
1205 g_atomic_int_add (&_frames_read_from_ringbuffer, end - start);
1208 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1209 * so that an event at playback_sample has time = 0
1212 DiskReader::get_playback (MidiBuffer& dst, framecnt_t nframes)
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 (dst, 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 (dst, 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 (dst, 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 (dst, 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 (dst, 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()));
1294 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1296 //cerr << "======== POST ========\n";
1297 //_midi_buf->dump (cerr);
1298 //cerr << "----------------\n";
1301 /** @a start is set to the new frame position (TIME) read up to */
1303 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1305 framecnt_t this_read = 0;
1306 framepos_t loop_end = 0;
1307 framepos_t loop_start = 0;
1308 framecnt_t loop_length = 0;
1309 Location* loc = loop_location;
1310 framepos_t effective_start = start;
1311 Evoral::Range<framepos_t>* loop_range (0);
1313 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1314 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1315 MidiChannelFilter* filter = 0;
1317 frameoffset_t loop_offset = 0;
1319 if (!reversed && loc) {
1320 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1325 /* take any loop into account. we can't read past the end of the loop. */
1327 if (loc && !reversed) {
1330 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1333 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1334 position within the loop.
1337 effective_start = loop_range->squish (effective_start);
1339 if ((loop_end - effective_start) <= dur) {
1340 /* too close to end of loop to read "dur", so
1343 this_read = loop_end - effective_start;
1352 if (this_read == 0) {
1356 this_read = min (dur,this_read);
1358 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1360 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1361 error << string_compose(
1362 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1363 id(), this_read, start) << endmsg;
1367 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1371 // Swap note ons with note offs here. etc?
1372 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1373 // CC values etc. hard.
1377 /* adjust passed-by-reference argument (note: this is
1378 monotonic and does not reflect looping.
1382 /* similarly adjust effective_start, but this may be
1383 readjusted for seamless looping as we continue around
1386 effective_start += this_read;
1390 //offset += this_read;
1397 DiskReader::refill_midi ()
1399 if (!_playlists[DataType::MIDI]) {
1403 size_t write_space = _midi_buf->write_space();
1404 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1406 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1407 //PBD::stacktrace (cerr, 20);
1409 /* no space to write */
1410 if (write_space == 0) {
1418 /* at end: nothing to do */
1420 if (file_frame == max_framepos) {
1425 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1426 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1428 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1432 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1434 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1435 to_read = min (to_read, (framecnt_t) write_space);
1437 if (midi_read (file_frame, to_read, reversed)) {