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;
47 bool DiskReader::no_disk_output = false;
49 DiskReader::DiskReader (Session& s, string const & str, DiskIOProcessor::Flag f)
50 : DiskIOProcessor (s, str, f)
53 , overwrite_offset (0)
54 , _pending_overwrite (false)
55 , overwrite_queued (false)
56 , _gui_feed_buffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
60 DiskReader::~DiskReader ()
62 DEBUG_TRACE (DEBUG::Destruction, string_compose ("DiskReader %1 @ %2 deleted\n", _name, this));
64 for (uint32_t n = 0; n < DataType::num_types; ++n) {
66 _playlists[n]->release ();
71 RCUWriter<ChannelList> writer (channels);
72 boost::shared_ptr<ChannelList> c = writer.get_copy();
74 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
87 DiskReader::allocate_working_buffers()
89 /* with varifill buffer refilling, we compute the read size in bytes (to optimize
90 for disk i/o bandwidth) and then convert back into samples. These buffers
91 need to reflect the maximum size we could use, which is 4MB reads, or 2M samples
94 _mixdown_buffer = new Sample[2*1048576];
95 _gain_buffer = new gain_t[2*1048576];
99 DiskReader::free_working_buffers()
101 delete [] _mixdown_buffer;
102 delete [] _gain_buffer;
108 DiskReader::default_chunk_frames()
114 DiskReader::set_name (string const & str)
116 string my_name = X_("playback:");
119 if (_name != my_name) {
120 SessionObject::set_name (my_name);
127 DiskReader::set_roll_delay (ARDOUR::framecnt_t nframes)
129 _roll_delay = nframes;
133 DiskReader::state (bool full)
135 XMLNode& node (DiskIOProcessor::state (full));
136 node.set_property(X_("type"), X_("diskreader"));
141 DiskReader::set_state (const XMLNode& node, int version)
143 if (DiskIOProcessor::set_state (node, version)) {
151 DiskReader::realtime_handle_transport_stopped ()
153 realtime_speed_change ();
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 (_route);
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 frameoffset_t playback_distance;
244 MonitorState ms = _route->monitoring_state ();
247 if (!_pending_active) {
252 if (_pending_active) {
259 _need_butler = false;
261 if (speed == 0.0 && (ms == MonitoringDisk)) {
262 /* stopped. Don't accidentally pass any data from disk
263 * into our outputs (e.g. via interpolation)
265 bufs.silence (nframes, 0);
269 if (speed != 1.0f && speed != -1.0f) {
270 interpolation.set_speed (speed);
271 midi_interpolation.set_speed (speed);
272 playback_distance = midi_interpolation.distance (nframes);
274 playback_distance = -playback_distance;
277 playback_distance = nframes;
280 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
281 const bool still_locating = _session.global_locate_pending();
283 if (!result_required || ((ms & MonitoringDisk) == 0) || still_locating) {
285 /* no need for actual disk data, just advance read pointer and return */
287 if (!still_locating) {
288 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
289 (*chan)->buf->increment_read_ptr (playback_distance);
293 /* if monitoring disk but locating put silence in the buffers */
295 if (still_locating && (ms == MonitoringDisk)) {
296 bufs.silence (playback_distance, 0);
301 /* we need audio data from disk */
303 size_t n_buffers = bufs.count().n_audio();
304 size_t n_chans = c->size();
307 if (n_chans > n_buffers) {
308 scaling = ((float) n_buffers)/n_chans;
313 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
315 ChannelInfo* chaninfo (*chan);
316 AudioBuffer& output (bufs.get_audio (n%n_buffers));
317 Sample* disk_signal = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
319 if (ms & MonitoringInput) {
320 /* put disk stream in scratch buffer, blend at end */
321 disk_signal = scratch_bufs.get_audio(n).data ();
323 /* no input stream needed, just overwrite buffers */
324 disk_signal = output.data ();
327 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
329 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
331 if (fabsf (speed) != 1.0f) {
332 (void) interpolation.interpolate (
334 chaninfo->rw_vector.buf[0],
336 } else if (speed != 0.0) {
337 memcpy (disk_signal, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
342 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
344 if (playback_distance <= total) {
346 /* We have enough samples, but not in one lump.
349 if (fabsf (speed) != 1.0f) {
350 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
351 chaninfo->rw_vector.buf[0],
353 disk_signal += chaninfo->rw_vector.len[0];
354 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
355 chaninfo->rw_vector.buf[1],
357 } else if (speed != 0.0) {
359 chaninfo->rw_vector.buf[0],
360 chaninfo->rw_vector.len[0] * sizeof (Sample));
361 memcpy (disk_signal + chaninfo->rw_vector.len[0],
362 chaninfo->rw_vector.buf[1],
363 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
368 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
369 cerr << "underrun for " << _name << endl;
370 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
371 DEBUG_THREAD_SELF, name(), total));
378 if (scaling != 1.0f && speed != 0.0) {
379 apply_gain_to_buffer (disk_signal, nframes, scaling);
382 chaninfo->buf->increment_read_ptr (playback_distance);
384 if (!no_disk_output && (speed != 0.0) && (ms & MonitoringInput)) {
385 /* mix the disk signal into the input signal (already in bufs) */
386 mix_buffers_no_gain (output.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
391 /* MIDI data handling */
393 if (!_session.declick_out_pending()) {
394 if (ms & MonitoringDisk && !still_locating) {
395 get_midi_playback (bufs.get_midi (0), playback_distance, ms, scratch_bufs, speed, playback_distance);
399 if (!still_locating) {
402 playback_sample -= playback_distance;
404 playback_sample += playback_distance;
407 if (_playlists[DataType::AUDIO]) {
410 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
411 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
412 c->front()->buf->bufsize()));
416 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
417 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
425 if (_playlists[DataType::MIDI]) {
426 /* MIDI butler needed part */
428 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
429 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
432 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
433 " = " << frames_written - frames_read
434 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
437 /* frames_read will generally be less than frames_written, but
438 * immediately after an overwrite, we can end up having read some data
439 * before we've written any. we don't need to trip an assert() on this,
440 * but we do need to check so that the decision on whether or not we
441 * need the butler is done correctly.
446 * Doing heavy GUI operations[1] can stall also the butler.
447 * The RT-thread meanwhile will happily continue and
448 * ‘frames_read’ (from buffer to output) will become larger
449 * than ‘frames_written’ (from disk to buffer).
451 * The disk-stream is now behind..
453 * In those cases the butler needs to be summed to refill the buffer (done now)
454 * AND we need to skip (frames_read - frames_written). ie remove old events
455 * before playback_sample from the rinbuffer.
457 * [1] one way to do so is described at #6170.
458 * For me just popping up the context-menu on a MIDI-track header
459 * of a track with a large (think beethoven :) midi-region also did the
460 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
462 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
465 if (frames_read <= frames_written) {
466 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
476 // DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
480 DiskReader::set_pending_overwrite (bool yn)
482 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
484 _pending_overwrite = yn;
486 overwrite_frame = playback_sample;
488 boost::shared_ptr<ChannelList> c = channels.reader ();
490 overwrite_offset = c->front()->buf->get_read_ptr();
495 DiskReader::overwrite_existing_buffers ()
499 boost::shared_ptr<ChannelList> c = channels.reader();
501 overwrite_queued = false;
503 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
509 const bool reversed = _session.transport_speed() < 0.0f;
511 /* assume all are the same size */
512 framecnt_t size = c->front()->buf->bufsize();
514 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
515 std::auto_ptr<float> gain_buffer (new float[size]);
517 /* reduce size so that we can fill the buffer correctly (ringbuffers
518 can only handle size-1, otherwise they appear to be empty)
525 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
527 start = overwrite_frame;
528 framecnt_t cnt = size;
530 /* to fill the buffer without resetting the playback sample, we need to
531 do it one or two chunks (normally two).
533 |----------------------------------------------------------------------|
537 |<- second chunk->||<----------------- first chunk ------------------>|
541 framecnt_t to_read = size - overwrite_offset;
543 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
544 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
545 id(), size, playback_sample) << endmsg;
553 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
554 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
555 id(), size, playback_sample) << endmsg;
567 if (_midi_buf && _playlists[DataType::MIDI]) {
569 /* Clear the playback buffer contents. This is safe as long as the butler
570 thread is suspended, which it should be.
573 _midi_buf->reset_tracker ();
575 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
576 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
578 /* Resolve all currently active notes in the playlist. This is more
579 aggressive than it needs to be: ideally we would only resolve what is
580 absolutely necessary, but this seems difficult and/or impossible without
581 having the old data or knowing what change caused the overwrite.
583 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
585 midi_read (overwrite_frame, _chunk_frames, false);
587 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
590 _pending_overwrite = false;
596 DiskReader::seek (framepos_t frame, bool complete_refill)
600 ChannelList::iterator chan;
601 boost::shared_ptr<ChannelList> c = channels.reader();
603 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
604 (*chan)->buf->reset ();
607 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
608 /* we haven't read anything since the last seek,
609 so flush all note trackers to prevent
616 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
617 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
619 playback_sample = frame;
622 if (complete_refill) {
623 /* call _do_refill() to refill the entire buffer, using
624 the largest reads possible.
626 while ((ret = do_refill_with_alloc (false)) > 0) ;
628 /* call _do_refill() to refill just one chunk, and then
631 ret = do_refill_with_alloc (true);
639 DiskReader::can_internal_playback_seek (framecnt_t distance)
643 ChannelList::iterator chan;
644 boost::shared_ptr<ChannelList> c = channels.reader();
646 for (chan = c->begin(); chan != c->end(); ++chan) {
647 if ((*chan)->buf->read_space() < (size_t) distance) {
654 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
655 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
657 return ((frames_written - frames_read) < distance);
661 DiskReader::internal_playback_seek (framecnt_t distance)
663 ChannelList::iterator chan;
664 boost::shared_ptr<ChannelList> c = channels.reader();
666 for (chan = c->begin(); chan != c->end(); ++chan) {
667 (*chan)->buf->increment_read_ptr (::llabs(distance));
670 playback_sample += distance;
676 void swap_by_ptr (Sample *first, Sample *last)
678 while (first < last) {
685 /** Read some data for 1 channel from our playlist into a buffer.
686 * @param buf Buffer to write to.
687 * @param start Session frame to start reading from; updated to where we end up
689 * @param cnt Count of samples to read.
690 * @param reversed true if we are running backwards, otherwise false.
693 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
694 framepos_t& start, framecnt_t cnt,
695 int channel, bool reversed)
697 framecnt_t this_read = 0;
699 framepos_t loop_end = 0;
700 framepos_t loop_start = 0;
701 framecnt_t offset = 0;
704 if (!_playlists[DataType::AUDIO]) {
705 memset (buf, 0, sizeof (Sample) * cnt);
709 /* XXX we don't currently play loops in reverse. not sure why */
713 framecnt_t loop_length = 0;
715 /* Make the use of a Location atomic for this read operation.
717 Note: Locations don't get deleted, so all we care about
718 when I say "atomic" is that we are always pointing to
719 the same one and using a start/length values obtained
723 if ((loc = loop_location) != 0) {
724 loop_start = loc->start();
725 loop_end = loc->end();
726 loop_length = loop_end - loop_start;
729 /* if we are looping, ensure that the first frame we read is at the correct
730 position within the loop.
733 if (loc && start >= loop_end) {
734 start = loop_start + ((start - loop_start) % loop_length);
743 /* We need this while loop in case we hit a loop boundary, in which case our read from
744 the playlist must be split into more than one section.
749 /* take any loop into account. we can't read past the end of the loop. */
751 if (loc && (loop_end - start < cnt)) {
752 this_read = loop_end - start;
759 if (this_read == 0) {
763 this_read = min(cnt,this_read);
765 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
766 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
773 swap_by_ptr (buf, buf + this_read - 1);
777 /* if we read to the end of the loop, go back to the beginning */
794 DiskReader::_do_refill_with_alloc (bool partial_fill)
796 /* We limit disk reads to at most 4MB chunks, which with floating point
797 samples would be 1M samples. But we might use 16 or 14 bit samples,
798 in which case 4MB is more samples than that. Therefore size this for
799 the smallest sample value .. 4MB = 2M samples (16 bit).
803 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
804 std::auto_ptr<float> gain_buf (new float[2*1048576]);
806 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
813 return refill_midi ();
817 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
819 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
825 return refill_midi ();
829 /** Get some more data from disk and put it in our channels' bufs,
830 * if there is suitable space in them.
832 * If fill_level is non-zero, then we will refill the buffer so that there is
833 * still at least fill_level samples of space left to be filled. This is used
834 * after locates so that we do not need to wait to fill the entire buffer.
839 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
841 /* do not read from disk while session is marked as Loading, to avoid
842 useless redundant I/O.
845 if (_session.loading()) {
851 RingBufferNPT<Sample>::rw_vector vector;
852 bool const reversed = _session.transport_speed() < 0.0f;
853 framecnt_t total_space;
854 framecnt_t zero_fill;
856 ChannelList::iterator i;
857 boost::shared_ptr<ChannelList> c = channels.reader();
864 assert(mixdown_buffer);
872 c->front()->buf->get_write_vector (&vector);
874 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
875 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
876 /* nowhere to write to */
881 if (fill_level < total_space) {
882 total_space -= fill_level;
884 /* we can't do anything with it */
889 /* if we're running close to normal speed and there isn't enough
890 space to do disk_read_chunk_frames of I/O, then don't bother.
892 at higher speeds, just do it because the sync between butler
893 and audio thread may not be good enough.
895 Note: it is a design assumption that disk_read_chunk_frames is smaller
896 than the playback buffer size, so this check should never trip when
897 the playback buffer is empty.
900 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()));
901 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
905 /* when slaved, don't try to get too close to the read pointer. this
906 leaves space for the buffer reversal to have something useful to
910 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
911 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
917 if (file_frame == 0) {
919 /* at start: nothing to do but fill with silence */
921 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
923 ChannelInfo* chan (*i);
924 chan->buf->get_write_vector (&vector);
925 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
927 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
929 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
934 if (file_frame < total_space) {
936 /* too close to the start: read what we can,
937 and then zero fill the rest
940 zero_fill = total_space - file_frame;
941 total_space = file_frame;
950 if (file_frame == max_framepos) {
952 /* at end: nothing to do but fill with silence */
954 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
956 ChannelInfo* chan (*i);
957 chan->buf->get_write_vector (&vector);
958 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
960 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
962 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
967 if (file_frame > max_framepos - total_space) {
969 /* to close to the end: read what we can, and zero fill the rest */
971 zero_fill = total_space - (max_framepos - file_frame);
972 total_space = max_framepos - file_frame;
979 framepos_t file_frame_tmp = 0;
981 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
983 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
984 size_t total_bytes = total_space * bits_per_sample / 8;
986 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
988 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
990 /* find nearest (lower) multiple of 16384 */
992 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
994 /* now back to samples */
996 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
998 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
1000 // uint64_t before = g_get_monotonic_time ();
1001 // uint64_t elapsed;
1003 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1005 ChannelInfo* chan (*i);
1008 framecnt_t len1, len2;
1010 chan->buf->get_write_vector (&vector);
1012 if ((framecnt_t) vector.len[0] > samples_to_read) {
1014 /* we're not going to fill the first chunk, so certainly do not bother with the
1015 other part. it won't be connected with the part we do fill, as in:
1017 .... => writable space
1018 ++++ => readable space
1019 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1021 |......|+++++++++++++|...............................|
1026 So, just pretend that the buf1 part isn't there.
1036 file_frame_tmp = file_frame;
1038 buf1 = vector.buf[0];
1039 len1 = vector.len[0];
1040 buf2 = vector.buf[1];
1041 len2 = vector.len[1];
1043 to_read = min (ts, len1);
1044 to_read = min (to_read, (framecnt_t) samples_to_read);
1046 assert (to_read >= 0);
1050 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1055 chan->buf->increment_write_ptr (to_read);
1059 to_read = min (ts, len2);
1063 /* we read all of vector.len[0], but it wasn't the
1064 entire samples_to_read of data, so read some or
1065 all of vector.len[1] as well.
1068 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1073 chan->buf->increment_write_ptr (to_read);
1077 /* XXX: do something */
1082 // elapsed = g_get_monotonic_time () - before;
1083 // cerr << '\t' << name() << ": bandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1085 file_frame = file_frame_tmp;
1086 assert (file_frame >= 0);
1088 ret = ((total_space - samples_to_read) > _chunk_frames);
1090 c->front()->buf->get_write_vector (&vector);
1097 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1099 /* If we're coming from an undo, it will have handled
1100 automation undo (it must, since automation-follows-regions
1101 can lose automation data). Hence we can do nothing here.
1108 if (!_route || Config->get_automation_follows_regions () == false) {
1112 list< Evoral::RangeMove<double> > movements;
1114 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1115 i != movements_frames.end();
1118 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1121 /* move panner automation */
1122 boost::shared_ptr<Pannable> pannable = _route->pannable();
1123 Evoral::ControlSet::Controls& c (pannable->controls());
1125 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1126 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1130 boost::shared_ptr<AutomationList> alist = ac->alist();
1131 if (!alist->size()) {
1134 XMLNode & before = alist->get_state ();
1135 bool const things_moved = alist->move_ranges (movements);
1137 _session.add_command (new MementoCommand<AutomationList> (
1138 *alist.get(), &before, &alist->get_state ()));
1141 /* move processor automation */
1142 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1146 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1148 boost::shared_ptr<Processor> processor (p.lock ());
1153 list< Evoral::RangeMove<double> > movements;
1154 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1155 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1158 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1160 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1161 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1165 XMLNode & before = al->get_state ();
1166 bool const things_moved = al->move_ranges (movements);
1168 _session.add_command (
1169 new MementoCommand<AutomationList> (
1170 *al.get(), &before, &al->get_state ()
1177 boost::shared_ptr<MidiBuffer>
1178 DiskReader::get_gui_feed_buffer () const
1180 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1182 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1183 b->copy (_gui_feed_buffer);
1188 DiskReader::reset_tracker ()
1190 _midi_buf->reset_tracker ();
1192 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1195 mp->reset_note_trackers ();
1200 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1202 _midi_buf->resolve_tracker(buffer, time);
1204 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1207 mp->reset_note_trackers ();
1211 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1212 * so that an event at playback_sample has time = 0
1215 DiskReader::get_midi_playback (MidiBuffer& dst, framecnt_t nframes, MonitorState ms, BufferSet& scratch_bufs, double speed, framecnt_t playback_distance)
1219 if ((ms & MonitoringInput) == 0) {
1223 target = &scratch_bufs.get_midi (0);
1226 if (ms & MonitoringDisk) {
1227 /* no disk data needed */
1229 Location* loc = loop_location;
1231 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1232 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1233 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1234 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1236 //cerr << "======== PRE ========\n";
1237 //_midi_buf->dump (cerr);
1238 //cerr << "----------------\n";
1240 size_t events_read = 0;
1243 framepos_t effective_start;
1245 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1246 effective_start = loop_range.squish (playback_sample);
1248 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1250 if (effective_start == loc->start()) {
1251 /* We need to turn off notes that may extend
1252 beyond the loop end.
1255 _midi_buf->resolve_tracker (*target, 0);
1258 /* for split-cycles we need to offset the events */
1260 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1262 /* end of loop is within the range we are reading, so
1263 split the read in two, and lie about the location
1267 framecnt_t first, second;
1269 first = loc->end() - effective_start;
1270 second = nframes - first;
1272 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1273 effective_start, loc->end(), first, second));
1276 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1277 effective_start, first));
1278 events_read = _midi_buf->read (*target, effective_start, first);
1282 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1283 loc->start(), second));
1284 events_read += _midi_buf->read (*target, loc->start(), second);
1288 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1289 effective_start, nframes));
1290 events_read = _midi_buf->read (*target, effective_start, effective_start + nframes);
1293 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1294 if (n_skipped > 0) {
1295 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1297 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1298 events_read = _midi_buf->read (*target, playback_sample, playback_sample + nframes);
1301 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1302 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1303 _name, events_read, playback_sample, playback_sample + nframes,
1304 _midi_buf->read_space(), _midi_buf->write_space(),
1305 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1308 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1312 if (speed != 0.0 && fabsf (speed) != 1.0f) {
1313 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1314 MidiBuffer::TimeType *tme = i.timeptr();
1315 *tme = (*tme) * nframes / playback_distance;
1319 if (ms & MonitoringInput) {
1320 dst.merge_from (*target, nframes);
1323 //cerr << "======== POST ========\n";
1324 //_midi_buf->dump (cerr);
1325 //cerr << "----------------\n";
1328 /** @a start is set to the new frame position (TIME) read up to */
1330 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1332 framecnt_t this_read = 0;
1333 framepos_t loop_end = 0;
1334 framepos_t loop_start = 0;
1335 framecnt_t loop_length = 0;
1336 Location* loc = loop_location;
1337 framepos_t effective_start = start;
1338 Evoral::Range<framepos_t>* loop_range (0);
1340 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1341 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1342 MidiChannelFilter* filter = 0;
1344 frameoffset_t loop_offset = 0;
1346 if (!reversed && loc) {
1347 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1352 /* take any loop into account. we can't read past the end of the loop. */
1354 if (loc && !reversed) {
1357 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1360 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1361 position within the loop.
1364 effective_start = loop_range->squish (effective_start);
1366 if ((loop_end - effective_start) <= dur) {
1367 /* too close to end of loop to read "dur", so
1370 this_read = loop_end - effective_start;
1379 if (this_read == 0) {
1383 this_read = min (dur,this_read);
1385 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1387 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1388 error << string_compose(
1389 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1390 id(), this_read, start) << endmsg;
1394 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1398 // Swap note ons with note offs here. etc?
1399 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1400 // CC values etc. hard.
1404 /* adjust passed-by-reference argument (note: this is
1405 monotonic and does not reflect looping.
1409 /* similarly adjust effective_start, but this may be
1410 readjusted for seamless looping as we continue around
1413 effective_start += this_read;
1417 //offset += this_read;
1424 DiskReader::refill_midi ()
1426 if (!_playlists[DataType::MIDI]) {
1430 size_t write_space = _midi_buf->write_space();
1431 const bool reversed = _session.transport_speed() < 0.0f;
1433 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1435 /* no space to write */
1436 if (write_space == 0) {
1444 /* at end: nothing to do */
1446 if (file_frame == max_framepos) {
1451 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1452 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1454 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1458 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1460 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1461 to_read = min (to_read, (framecnt_t) write_space);
1463 if (midi_read (file_frame, to_read, reversed)) {
1471 DiskReader::set_no_disk_output (bool yn)
1473 /* this MUST be called as part of the process call tree, before any
1474 disk readers are invoked. We use it when the session needs the
1475 transport (and thus effective read position for DiskReaders) to keep
1476 advancing as part of syncing up with a transport master, but we
1477 don't want any actual disk output yet because we are still not
1480 no_disk_output = yn;