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 @ %2 deleted\n", _name, this));
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;
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);
273 playback_distance = -playback_distance;
276 playback_distance = nframes;
279 BufferSet& scratch_bufs (_session.get_scratch_buffers (bufs.count()));
280 const bool still_locating = _session.locate_pending();
282 if (!result_required || ((ms & MonitoringDisk) == 0) || still_locating) {
284 /* no need for actual disk data, just advance read pointer and return */
286 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
287 (*chan)->buf->increment_read_ptr (playback_distance);
290 /* if monitoring disk but locating, put silence in the buffers */
292 if (still_locating && (ms == MonitoringDisk)) {
293 bufs.silence (playback_distance, 0);
298 /* we need audio data from disk */
300 size_t n_buffers = bufs.count().n_audio();
301 size_t n_chans = c->size();
304 if (n_chans > n_buffers) {
305 scaling = ((float) n_buffers)/n_chans;
310 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
312 ChannelInfo* chaninfo (*chan);
313 AudioBuffer& output (bufs.get_audio (n%n_buffers));
314 Sample* disk_signal = 0; /* assignment not really needed but it keeps the compiler quiet and helps track bugs */
316 if (ms & MonitoringInput) {
317 /* put disk stream in scratch buffer, blend at end */
318 disk_signal = scratch_bufs.get_audio(n).data ();
320 /* no input stream needed, just overwrite buffers */
321 disk_signal = output.data ();
324 chaninfo->buf->get_read_vector (&(*chan)->rw_vector);
326 if (playback_distance <= (framecnt_t) chaninfo->rw_vector.len[0]) {
328 if (fabsf (speed) != 1.0f) {
329 (void) interpolation.interpolate (
331 chaninfo->rw_vector.buf[0],
333 } else if (speed != 0.0) {
334 memcpy (disk_signal, chaninfo->rw_vector.buf[0], sizeof (Sample) * playback_distance);
339 const framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
341 if (playback_distance <= total) {
343 /* We have enough samples, but not in one lump.
346 if (fabsf (speed) != 1.0f) {
347 interpolation.interpolate (n, chaninfo->rw_vector.len[0],
348 chaninfo->rw_vector.buf[0],
350 disk_signal += chaninfo->rw_vector.len[0];
351 interpolation.interpolate (n, playback_distance - chaninfo->rw_vector.len[0],
352 chaninfo->rw_vector.buf[1],
354 } else if (speed != 0.0) {
356 chaninfo->rw_vector.buf[0],
357 chaninfo->rw_vector.len[0] * sizeof (Sample));
358 disk_signal += chaninfo->rw_vector.len[0];
360 chaninfo->rw_vector.buf[1],
361 (playback_distance - chaninfo->rw_vector.len[0]) * sizeof (Sample));
366 cerr << _name << " Need " << playback_distance << " total = " << total << endl;
367 cerr << "underrun for " << _name << endl;
368 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, total space = %3\n",
369 DEBUG_THREAD_SELF, name(), total));
376 if (scaling != 1.0f && speed != 0.0) {
377 apply_gain_to_buffer (disk_signal, nframes, scaling);
380 chaninfo->buf->increment_read_ptr (playback_distance);
382 if ((speed != 0.0) && (ms & MonitoringInput)) {
383 /* mix the disk signal into the input signal (already in bufs) */
384 mix_buffers_no_gain (output.data(), disk_signal, speed == 0.0 ? nframes : playback_distance);
389 /* MIDI data handling */
391 if (!_session.declick_out_pending()) {
392 if (ms & MonitoringDisk && !still_locating) {
393 get_midi_playback (bufs.get_midi (0), playback_distance, ms, scratch_bufs, speed, playback_distance);
397 if (!still_locating) {
400 playback_sample -= playback_distance;
402 playback_sample += playback_distance;
405 if (_playlists[DataType::AUDIO]) {
408 if (c->front()->buf->write_space() >= c->front()->buf->bufsize() / 2) {
409 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: slaved, write space = %2 of %3\n", name(), c->front()->buf->write_space(),
410 c->front()->buf->bufsize()));
414 if ((framecnt_t) c->front()->buf->write_space() >= _chunk_frames) {
415 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1: write space = %2 of %3\n", name(), c->front()->buf->write_space(),
423 if (_playlists[DataType::MIDI]) {
424 /* MIDI butler needed part */
426 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
427 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
430 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
431 " = " << frames_written - frames_read
432 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
435 /* frames_read will generally be less than frames_written, but
436 * immediately after an overwrite, we can end up having read some data
437 * before we've written any. we don't need to trip an assert() on this,
438 * but we do need to check so that the decision on whether or not we
439 * need the butler is done correctly.
444 * Doing heavy GUI operations[1] can stall also the butler.
445 * The RT-thread meanwhile will happily continue and
446 * ‘frames_read’ (from buffer to output) will become larger
447 * than ‘frames_written’ (from disk to buffer).
449 * The disk-stream is now behind..
451 * In those cases the butler needs to be summed to refill the buffer (done now)
452 * AND we need to skip (frames_read - frames_written). ie remove old events
453 * before playback_sample from the rinbuffer.
455 * [1] one way to do so is described at #6170.
456 * For me just popping up the context-menu on a MIDI-track header
457 * of a track with a large (think beethoven :) midi-region also did the
458 * trick. The playhead stalls for 2 or 3 sec, until the context-menu shows.
460 * In both cases the root cause is that redrawing MIDI regions on the GUI is still very slow
463 if (frames_read <= frames_written) {
464 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
474 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 reader run, needs butler = %2\n", name(), _need_butler));
478 DiskReader::set_pending_overwrite (bool yn)
480 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
482 _pending_overwrite = yn;
484 overwrite_frame = playback_sample;
486 boost::shared_ptr<ChannelList> c = channels.reader ();
488 overwrite_offset = c->front()->buf->get_read_ptr();
493 DiskReader::overwrite_existing_buffers ()
497 boost::shared_ptr<ChannelList> c = channels.reader();
499 overwrite_queued = false;
501 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1 overwriting existing buffers at %2\n", overwrite_frame));
507 const bool reversed = _session.transport_speed() < 0.0f;
509 /* assume all are the same size */
510 framecnt_t size = c->front()->buf->bufsize();
512 std::auto_ptr<Sample> mixdown_buffer (new Sample[size]);
513 std::auto_ptr<float> gain_buffer (new float[size]);
515 /* reduce size so that we can fill the buffer correctly (ringbuffers
516 can only handle size-1, otherwise they appear to be empty)
523 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
525 start = overwrite_frame;
526 framecnt_t cnt = size;
528 /* to fill the buffer without resetting the playback sample, we need to
529 do it one or two chunks (normally two).
531 |----------------------------------------------------------------------|
535 |<- second chunk->||<----------------- first chunk ------------------>|
539 framecnt_t to_read = size - overwrite_offset;
541 if (audio_read ((*chan)->buf->buffer() + overwrite_offset, mixdown_buffer.get(), gain_buffer.get(), start, to_read, n, reversed)) {
542 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
543 id(), size, playback_sample) << endmsg;
551 if (audio_read ((*chan)->buf->buffer(), mixdown_buffer.get(), gain_buffer.get(), start, cnt, n, reversed)) {
552 error << string_compose(_("DiskReader %1: when refilling, cannot read %2 from playlist at frame %3"),
553 id(), size, playback_sample) << endmsg;
565 if (_midi_buf && _playlists[DataType::MIDI]) {
567 /* Clear the playback buffer contents. This is safe as long as the butler
568 thread is suspended, which it should be.
571 _midi_buf->reset_tracker ();
573 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
574 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
576 /* Resolve all currently active notes in the playlist. This is more
577 aggressive than it needs to be: ideally we would only resolve what is
578 absolutely necessary, but this seems difficult and/or impossible without
579 having the old data or knowing what change caused the overwrite.
581 midi_playlist()->resolve_note_trackers (*_midi_buf, overwrite_frame);
583 midi_read (overwrite_frame, _chunk_frames, false);
585 file_frame = overwrite_frame; // it was adjusted by ::midi_read()
588 _pending_overwrite = false;
594 DiskReader::seek (framepos_t frame, bool complete_refill)
598 ChannelList::iterator chan;
599 boost::shared_ptr<ChannelList> c = channels.reader();
601 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
602 (*chan)->buf->reset ();
605 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
606 /* we haven't read anything since the last seek,
607 so flush all note trackers to prevent
614 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
615 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
617 playback_sample = frame;
620 if (complete_refill) {
621 /* call _do_refill() to refill the entire buffer, using
622 the largest reads possible.
624 while ((ret = do_refill_with_alloc (false)) > 0) ;
626 /* call _do_refill() to refill just one chunk, and then
629 ret = do_refill_with_alloc (true);
637 DiskReader::can_internal_playback_seek (framecnt_t distance)
641 ChannelList::iterator chan;
642 boost::shared_ptr<ChannelList> c = channels.reader();
644 for (chan = c->begin(); chan != c->end(); ++chan) {
645 if ((*chan)->buf->read_space() < (size_t) distance) {
652 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
653 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
655 return ((frames_written - frames_read) < distance);
659 DiskReader::internal_playback_seek (framecnt_t distance)
661 ChannelList::iterator chan;
662 boost::shared_ptr<ChannelList> c = channels.reader();
664 for (chan = c->begin(); chan != c->end(); ++chan) {
665 (*chan)->buf->increment_read_ptr (::llabs(distance));
668 playback_sample += distance;
674 void swap_by_ptr (Sample *first, Sample *last)
676 while (first < last) {
683 /** Read some data for 1 channel from our playlist into a buffer.
684 * @param buf Buffer to write to.
685 * @param start Session frame to start reading from; updated to where we end up
687 * @param cnt Count of samples to read.
688 * @param reversed true if we are running backwards, otherwise false.
691 DiskReader::audio_read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
692 framepos_t& start, framecnt_t cnt,
693 int channel, bool reversed)
695 framecnt_t this_read = 0;
697 framepos_t loop_end = 0;
698 framepos_t loop_start = 0;
699 framecnt_t offset = 0;
702 if (!_playlists[DataType::AUDIO]) {
703 memset (buf, 0, sizeof (Sample) * cnt);
707 /* XXX we don't currently play loops in reverse. not sure why */
711 framecnt_t loop_length = 0;
713 /* Make the use of a Location atomic for this read operation.
715 Note: Locations don't get deleted, so all we care about
716 when I say "atomic" is that we are always pointing to
717 the same one and using a start/length values obtained
721 if ((loc = loop_location) != 0) {
722 loop_start = loc->start();
723 loop_end = loc->end();
724 loop_length = loop_end - loop_start;
727 /* if we are looping, ensure that the first frame we read is at the correct
728 position within the loop.
731 if (loc && start >= loop_end) {
732 start = loop_start + ((start - loop_start) % loop_length);
741 /* We need this while loop in case we hit a loop boundary, in which case our read from
742 the playlist must be split into more than one section.
747 /* take any loop into account. we can't read past the end of the loop. */
749 if (loc && (loop_end - start < cnt)) {
750 this_read = loop_end - start;
757 if (this_read == 0) {
761 this_read = min(cnt,this_read);
763 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
764 error << string_compose(_("DiskReader %1: cannot read %2 from playlist at frame %3"), id(), this_read,
771 swap_by_ptr (buf, buf + this_read - 1);
775 /* if we read to the end of the loop, go back to the beginning */
792 DiskReader::_do_refill_with_alloc (bool partial_fill)
794 /* We limit disk reads to at most 4MB chunks, which with floating point
795 samples would be 1M samples. But we might use 16 or 14 bit samples,
796 in which case 4MB is more samples than that. Therefore size this for
797 the smallest sample value .. 4MB = 2M samples (16 bit).
801 std::auto_ptr<Sample> mix_buf (new Sample[2*1048576]);
802 std::auto_ptr<float> gain_buf (new float[2*1048576]);
804 int ret = refill_audio (mix_buf.get(), gain_buf.get(), (partial_fill ? _chunk_frames : 0));
811 return refill_midi ();
815 DiskReader::refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
817 int ret = refill_audio (mixdown_buffer, gain_buffer, fill_level);
823 return refill_midi ();
827 /** Get some more data from disk and put it in our channels' bufs,
828 * if there is suitable space in them.
830 * If fill_level is non-zero, then we will refill the buffer so that there is
831 * still at least fill_level samples of space left to be filled. This is used
832 * after locates so that we do not need to wait to fill the entire buffer.
837 DiskReader::refill_audio (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
839 /* do not read from disk while session is marked as Loading, to avoid
840 useless redundant I/O.
843 if (_session.loading()) {
849 RingBufferNPT<Sample>::rw_vector vector;
850 bool const reversed = _session.transport_speed() < 0.0f;
851 framecnt_t total_space;
852 framecnt_t zero_fill;
854 ChannelList::iterator i;
855 boost::shared_ptr<ChannelList> c = channels.reader();
862 assert(mixdown_buffer);
870 c->front()->buf->get_write_vector (&vector);
872 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
873 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: no space to refill\n", name()));
874 /* nowhere to write to */
879 if (fill_level < total_space) {
880 total_space -= fill_level;
882 /* we can't do anything with it */
887 /* if we're running close to normal speed and there isn't enough
888 space to do disk_read_chunk_frames of I/O, then don't bother.
890 at higher speeds, just do it because the sync between butler
891 and audio thread may not be good enough.
893 Note: it is a design assumption that disk_read_chunk_frames is smaller
894 than the playback buffer size, so this check should never trip when
895 the playback buffer is empty.
898 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()));
899 if ((total_space < _chunk_frames) && fabs (_session.transport_speed()) < 2.0f) {
903 /* when slaved, don't try to get too close to the read pointer. this
904 leaves space for the buffer reversal to have something useful to
908 if (_slaved && total_space < (framecnt_t) (c->front()->buf->bufsize() / 2)) {
909 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: not enough to refill while slaved\n", this));
915 if (file_frame == 0) {
917 /* at start: nothing to do but fill with silence */
919 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
921 ChannelInfo* chan (*i);
922 chan->buf->get_write_vector (&vector);
923 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
925 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
927 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
932 if (file_frame < total_space) {
934 /* too close to the start: read what we can,
935 and then zero fill the rest
938 zero_fill = total_space - file_frame;
939 total_space = file_frame;
948 if (file_frame == max_framepos) {
950 /* at end: nothing to do but fill with silence */
952 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
954 ChannelInfo* chan (*i);
955 chan->buf->get_write_vector (&vector);
956 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
958 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
960 chan->buf->increment_write_ptr (vector.len[0] + vector.len[1]);
965 if (file_frame > max_framepos - total_space) {
967 /* to close to the end: read what we can, and zero fill the rest */
969 zero_fill = total_space - (max_framepos - file_frame);
970 total_space = max_framepos - file_frame;
977 framepos_t file_frame_tmp = 0;
979 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
981 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
982 size_t total_bytes = total_space * bits_per_sample / 8;
984 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
986 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
988 /* find nearest (lower) multiple of 16384 */
990 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
992 /* now back to samples */
994 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
996 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("%1: will refill %2 channels with %3 samples\n", name(), c->size(), total_space));
998 // uint64_t before = g_get_monotonic_time ();
1001 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1003 ChannelInfo* chan (*i);
1006 framecnt_t len1, len2;
1008 chan->buf->get_write_vector (&vector);
1010 if ((framecnt_t) vector.len[0] > samples_to_read) {
1012 /* we're not going to fill the first chunk, so certainly do not bother with the
1013 other part. it won't be connected with the part we do fill, as in:
1015 .... => writable space
1016 ++++ => readable space
1017 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1019 |......|+++++++++++++|...............................|
1024 So, just pretend that the buf1 part isn't there.
1034 file_frame_tmp = file_frame;
1036 buf1 = vector.buf[0];
1037 len1 = vector.len[0];
1038 buf2 = vector.buf[1];
1039 len2 = vector.len[1];
1041 to_read = min (ts, len1);
1042 to_read = min (to_read, (framecnt_t) samples_to_read);
1044 assert (to_read >= 0);
1048 if (audio_read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1053 chan->buf->increment_write_ptr (to_read);
1057 to_read = min (ts, len2);
1061 /* we read all of vector.len[0], but it wasn't the
1062 entire samples_to_read of data, so read some or
1063 all of vector.len[1] as well.
1066 if (audio_read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1071 chan->buf->increment_write_ptr (to_read);
1075 /* XXX: do something */
1080 // elapsed = g_get_monotonic_time () - before;
1081 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1083 file_frame = file_frame_tmp;
1084 assert (file_frame >= 0);
1086 ret = ((total_space - samples_to_read) > _chunk_frames);
1088 c->front()->buf->get_write_vector (&vector);
1095 DiskReader::playlist_ranges_moved (list< Evoral::RangeMove<framepos_t> > const & movements_frames, bool from_undo)
1097 /* If we're coming from an undo, it will have handled
1098 automation undo (it must, since automation-follows-regions
1099 can lose automation data). Hence we can do nothing here.
1106 if (!_route || Config->get_automation_follows_regions () == false) {
1110 list< Evoral::RangeMove<double> > movements;
1112 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin();
1113 i != movements_frames.end();
1116 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1119 /* move panner automation */
1120 boost::shared_ptr<Pannable> pannable = _route->pannable();
1121 Evoral::ControlSet::Controls& c (pannable->controls());
1123 for (Evoral::ControlSet::Controls::iterator ci = c.begin(); ci != c.end(); ++ci) {
1124 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl>(ci->second);
1128 boost::shared_ptr<AutomationList> alist = ac->alist();
1129 if (!alist->size()) {
1132 XMLNode & before = alist->get_state ();
1133 bool const things_moved = alist->move_ranges (movements);
1135 _session.add_command (new MementoCommand<AutomationList> (
1136 *alist.get(), &before, &alist->get_state ()));
1139 /* move processor automation */
1140 _route->foreach_processor (boost::bind (&DiskReader::move_processor_automation, this, _1, movements_frames));
1144 DiskReader::move_processor_automation (boost::weak_ptr<Processor> p, list< Evoral::RangeMove<framepos_t> > const & movements_frames)
1146 boost::shared_ptr<Processor> processor (p.lock ());
1151 list< Evoral::RangeMove<double> > movements;
1152 for (list< Evoral::RangeMove<framepos_t> >::const_iterator i = movements_frames.begin(); i != movements_frames.end(); ++i) {
1153 movements.push_back(Evoral::RangeMove<double>(i->from, i->length, i->to));
1156 set<Evoral::Parameter> const a = processor->what_can_be_automated ();
1158 for (set<Evoral::Parameter>::const_iterator i = a.begin (); i != a.end (); ++i) {
1159 boost::shared_ptr<AutomationList> al = processor->automation_control(*i)->alist();
1163 XMLNode & before = al->get_state ();
1164 bool const things_moved = al->move_ranges (movements);
1166 _session.add_command (
1167 new MementoCommand<AutomationList> (
1168 *al.get(), &before, &al->get_state ()
1175 boost::shared_ptr<MidiBuffer>
1176 DiskReader::get_gui_feed_buffer () const
1178 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1180 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1181 b->copy (_gui_feed_buffer);
1186 DiskReader::reset_tracker ()
1188 _midi_buf->reset_tracker ();
1190 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1193 mp->reset_note_trackers ();
1198 DiskReader::resolve_tracker (Evoral::EventSink<framepos_t>& buffer, framepos_t time)
1200 _midi_buf->resolve_tracker(buffer, time);
1202 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1205 mp->reset_note_trackers ();
1209 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1210 * so that an event at playback_sample has time = 0
1213 DiskReader::get_midi_playback (MidiBuffer& dst, framecnt_t nframes, MonitorState ms, BufferSet& scratch_bufs, double speed, framecnt_t playback_distance)
1217 if ((ms & MonitoringInput) == 0) {
1221 target = &scratch_bufs.get_midi (0);
1224 if (ms & MonitoringDisk) {
1225 /* no disk data needed */
1227 Location* loc = loop_location;
1229 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1230 "%1 MDS pre-read read %8 offset = %9 @ %4..%5 from %2 write to %3, LOOPED ? %6 .. %7\n", _name,
1231 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1232 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes, Port::port_offset()));
1234 //cerr << "======== PRE ========\n";
1235 //_midi_buf->dump (cerr);
1236 //cerr << "----------------\n";
1238 size_t events_read = 0;
1241 framepos_t effective_start;
1243 Evoral::Range<framepos_t> loop_range (loc->start(), loc->end() - 1);
1244 effective_start = loop_range.squish (playback_sample);
1246 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1248 if (effective_start == loc->start()) {
1249 /* We need to turn off notes that may extend
1250 beyond the loop end.
1253 _midi_buf->resolve_tracker (*target, 0);
1256 /* for split-cycles we need to offset the events */
1258 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1260 /* end of loop is within the range we are reading, so
1261 split the read in two, and lie about the location
1265 framecnt_t first, second;
1267 first = loc->end() - effective_start;
1268 second = nframes - first;
1270 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4, cycle offset %5\n",
1271 effective_start, loc->end(), first, second));
1274 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1275 effective_start, first));
1276 events_read = _midi_buf->read (*target, effective_start, first);
1280 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1281 loc->start(), second));
1282 events_read += _midi_buf->read (*target, loc->start(), second);
1286 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1287 effective_start, nframes));
1288 events_read = _midi_buf->read (*target, effective_start, effective_start + nframes);
1291 const size_t n_skipped = _midi_buf->skip_to (playback_sample);
1292 if (n_skipped > 0) {
1293 warning << string_compose(_("MidiDiskstream %1: skipped %2 events, possible underflow"), id(), n_skipped) << endmsg;
1295 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("playback buffer read, from %1 to %2 (%3)", playback_sample, playback_sample + nframes, nframes));
1296 events_read = _midi_buf->read (*target, playback_sample, playback_sample + nframes);
1299 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1300 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1301 _name, events_read, playback_sample, playback_sample + nframes,
1302 _midi_buf->read_space(), _midi_buf->write_space(),
1303 _midi_buf->get_read_ptr(), _midi_buf->get_write_ptr()));
1306 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1310 if (speed != 0.0 && fabsf (speed) != 1.0f) {
1311 for (MidiBuffer::iterator i = target->begin(); i != target->end(); ++i) {
1312 MidiBuffer::TimeType *tme = i.timeptr();
1313 *tme = (*tme) * nframes / playback_distance;
1317 if (ms & MonitoringInput) {
1318 dst.merge_from (*target, nframes);
1321 //cerr << "======== POST ========\n";
1322 //_midi_buf->dump (cerr);
1323 //cerr << "----------------\n";
1326 /** @a start is set to the new frame position (TIME) read up to */
1328 DiskReader::midi_read (framepos_t& start, framecnt_t dur, bool reversed)
1330 framecnt_t this_read = 0;
1331 framepos_t loop_end = 0;
1332 framepos_t loop_start = 0;
1333 framecnt_t loop_length = 0;
1334 Location* loc = loop_location;
1335 framepos_t effective_start = start;
1336 Evoral::Range<framepos_t>* loop_range (0);
1338 // MidiTrack* mt = dynamic_cast<MidiTrack*>(_track);
1339 // MidiChannelFilter* filter = mt ? &mt->playback_filter() : 0;
1340 MidiChannelFilter* filter = 0;
1342 frameoffset_t loop_offset = 0;
1344 if (!reversed && loc) {
1345 get_location_times (loc, &loop_start, &loop_end, &loop_length);
1350 /* take any loop into account. we can't read past the end of the loop. */
1352 if (loc && !reversed) {
1355 loop_range = new Evoral::Range<framepos_t> (loop_start, loop_end-1); // inclusive semantics require -1
1358 /* if we are (seamlessly) looping, ensure that the first frame we read is at the correct
1359 position within the loop.
1362 effective_start = loop_range->squish (effective_start);
1364 if ((loop_end - effective_start) <= dur) {
1365 /* too close to end of loop to read "dur", so
1368 this_read = loop_end - effective_start;
1377 if (this_read == 0) {
1381 this_read = min (dur,this_read);
1383 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("MDS ::read at %1 for %2 loffset %3\n", effective_start, this_read, loop_offset));
1385 if (midi_playlist()->read (*_midi_buf, effective_start, this_read, loop_range, 0, filter) != this_read) {
1386 error << string_compose(
1387 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
1388 id(), this_read, start) << endmsg;
1392 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
1396 // Swap note ons with note offs here. etc?
1397 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
1398 // CC values etc. hard.
1402 /* adjust passed-by-reference argument (note: this is
1403 monotonic and does not reflect looping.
1407 /* similarly adjust effective_start, but this may be
1408 readjusted for seamless looping as we continue around
1411 effective_start += this_read;
1415 //offset += this_read;
1422 DiskReader::refill_midi ()
1424 if (!_playlists[DataType::MIDI]) {
1428 size_t write_space = _midi_buf->write_space();
1429 const bool reversed = _session.transport_speed() < 0.0f;
1431 DEBUG_TRACE (DEBUG::DiskIO, string_compose ("MIDI refill, write space = %1 file frame = %2\n", write_space, file_frame));
1433 /* no space to write */
1434 if (write_space == 0) {
1442 /* at end: nothing to do */
1444 if (file_frame == max_framepos) {
1449 const uint32_t frames_read = g_atomic_int_get (&_frames_read_from_ringbuffer);
1450 const uint32_t frames_written = g_atomic_int_get (&_frames_written_to_ringbuffer);
1452 if ((frames_read < frames_written) && (frames_written - frames_read) >= midi_readahead) {
1456 framecnt_t to_read = midi_readahead - ((framecnt_t)frames_written - (framecnt_t)frames_read);
1458 to_read = min (to_read, (framecnt_t) (max_framepos - file_frame));
1459 to_read = min (to_read, (framecnt_t) write_space);
1461 if (midi_read (file_frame, to_read, reversed)) {