2 Copyright (C) 2000-2006 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.
30 #include "pbd/gstdio_compat.h"
31 #include "pbd/error.h"
32 #include "pbd/xml++.h"
33 #include "pbd/memento_command.h"
34 #include "pbd/enumwriter.h"
35 #include "pbd/stateful_diff_command.h"
37 #include "ardour/analyser.h"
38 #include "ardour/audio_buffer.h"
39 #include "ardour/audio_diskstream.h"
40 #include "ardour/audio_port.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/audiofilesource.h"
43 #include "ardour/audioplaylist.h"
44 #include "ardour/audioregion.h"
45 #include "ardour/butler.h"
46 #include "ardour/debug.h"
47 #include "ardour/io.h"
48 #include "ardour/playlist_factory.h"
49 #include "ardour/profile.h"
50 #include "ardour/region_factory.h"
51 #include "ardour/session.h"
52 #include "ardour/session_playlists.h"
53 #include "ardour/sndfile_helpers.h"
54 #include "ardour/source_factory.h"
55 #include "ardour/track.h"
56 #include "ardour/types.h"
57 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 Sample* AudioDiskstream::_mixdown_buffer = 0;
67 gain_t* AudioDiskstream::_gain_buffer = 0;
69 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
70 : Diskstream(sess, name, flag)
71 , channels (new ChannelList)
73 /* prevent any write sources from being created */
79 if (flag & Destructive) {
80 use_destructive_playlist ();
84 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
85 : Diskstream(sess, node)
86 , channels (new ChannelList)
91 if (set_state (node, Stateful::loading_state_version)) {
93 throw failed_constructor();
99 use_destructive_playlist ();
104 AudioDiskstream::init ()
106 /* there are no channels at this point, so these
107 two calls just get speed_buffer_size and wrap_buffer
108 size setup without duplicating their code.
111 set_block_size (_session.get_block_size());
112 allocate_temporary_buffers ();
115 AudioDiskstream::~AudioDiskstream ()
117 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
120 RCUWriter<ChannelList> writer (channels);
121 boost::shared_ptr<ChannelList> c = writer.get_copy();
123 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
134 AudioDiskstream::allocate_working_buffers()
136 /* with varifill buffer refilling, we compute the read size in bytes (to optimize
137 for disk i/o bandwidth) and then convert back into samples. These buffers
138 need to reflect the maximum size we could use, which is 4MB reads, or 2M samples
139 using 16 bit samples.
141 _mixdown_buffer = new Sample[2*1048576];
142 _gain_buffer = new gain_t[2*1048576];
146 AudioDiskstream::free_working_buffers()
148 delete [] _mixdown_buffer;
149 delete [] _gain_buffer;
155 AudioDiskstream::non_realtime_input_change ()
157 bool need_write_sources = false;
160 Glib::Threads::Mutex::Lock lm (state_lock);
162 if (input_change_pending.type == IOChange::NoChange) {
166 boost::shared_ptr<ChannelList> cr = channels.reader();
167 if (!cr->empty() && !cr->front()->write_source) {
168 need_write_sources = true;
171 if (input_change_pending.type & IOChange::ConfigurationChanged) {
172 RCUWriter<ChannelList> writer (channels);
173 boost::shared_ptr<ChannelList> c = writer.get_copy();
175 _n_channels.set(DataType::AUDIO, c->size());
177 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
178 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
179 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
180 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
183 need_write_sources = true;
186 if (input_change_pending.type & IOChange::ConnectionsChanged) {
187 get_input_sources ();
188 set_capture_offset ();
189 set_align_style_from_io ();
192 input_change_pending = IOChange::NoChange;
194 /* implicit unlock */
197 if (need_write_sources) {
198 reset_write_sources (false);
201 /* now refill channel buffers */
203 if (speed() != 1.0f || speed() != -1.0f) {
204 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
206 seek (_session.transport_frame());
211 AudioDiskstream::non_realtime_locate (framepos_t location)
213 /* now refill channel buffers */
215 if (speed() != 1.0f || speed() != -1.0f) {
216 seek ((framepos_t) (location * (double) speed()), true);
218 seek (location, true);
223 AudioDiskstream::get_input_sources ()
225 boost::shared_ptr<ChannelList> c = channels.reader();
228 ChannelList::iterator chan;
229 uint32_t ni = _io->n_ports().n_audio();
230 vector<string> connections;
232 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
234 connections.clear ();
236 if ((_io->nth (n).get()) && (_io->nth (n)->get_connections (connections) == 0)) {
237 if (!(*chan)->source.name.empty()) {
238 // _source->disable_metering ();
240 (*chan)->source.name = string();
242 (*chan)->source.name = connections[0];
248 AudioDiskstream::find_and_use_playlist (const string& name)
250 boost::shared_ptr<AudioPlaylist> playlist;
252 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
253 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
257 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
261 return use_playlist (playlist);
265 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
267 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
269 Diskstream::use_playlist(playlist);
275 AudioDiskstream::use_new_playlist ()
278 boost::shared_ptr<AudioPlaylist> playlist;
280 if (!in_set_state && destructive()) {
285 newname = Playlist::bump_name (_playlist->name(), _session);
287 newname = Playlist::bump_name (_name, _session);
290 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
292 return use_playlist (playlist);
300 AudioDiskstream::use_copy_playlist ()
302 assert(audio_playlist());
308 if (_playlist == 0) {
309 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
314 boost::shared_ptr<AudioPlaylist> playlist;
316 newname = Playlist::bump_name (_playlist->name(), _session);
318 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
319 playlist->reset_shares();
320 return use_playlist (playlist);
327 AudioDiskstream::setup_destructive_playlist ()
330 boost::shared_ptr<ChannelList> c = channels.reader();
332 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
333 srcs.push_back ((*chan)->write_source);
336 /* a single full-sized region */
338 assert (!srcs.empty ());
341 plist.add (Properties::name, _name.val());
342 plist.add (Properties::start, 0);
343 plist.add (Properties::length, max_framepos - srcs.front()->natural_position());
345 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
346 _playlist->add_region (region, srcs.front()->natural_position());
348 /* apply region properties and update write sources */
349 use_destructive_playlist();
353 AudioDiskstream::use_destructive_playlist ()
355 /* this is called from the XML-based constructor or ::set_destructive. when called,
356 we already have a playlist and a region, but we need to
357 set up our sources for write. we use the sources associated
358 with the (presumed single, full-extent) region.
361 boost::shared_ptr<Region> rp;
363 const RegionList& rl (_playlist->region_list_property().rlist());
365 /* this can happen when dragging a region onto a tape track */
366 assert((rl.size() == 1));
372 reset_write_sources (false, true);
376 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
379 throw failed_constructor();
382 /* be sure to stretch the region out to the maximum length (non-musical)*/
384 region->set_length (max_framepos - region->position(), 0);
387 ChannelList::iterator chan;
388 boost::shared_ptr<ChannelList> c = channels.reader();
390 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
391 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
392 assert((*chan)->write_source);
393 (*chan)->write_source->set_allow_remove_if_empty (false);
395 /* this might be false if we switched modes, so force it */
397 #ifdef XXX_OLD_DESTRUCTIVE_API_XXX
398 (*chan)->write_source->set_destructive (true);
400 // should be set when creating the source or loading the state
401 assert ((*chan)->write_source->destructive());
405 /* the source list will never be reset for a destructive track */
409 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
411 if (recordable() && destructive()) {
412 boost::shared_ptr<ChannelList> c = channels.reader();
413 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
415 RingBufferNPT<CaptureTransition>::rw_vector transitions;
416 (*chan)->capture_transition_buf->get_write_vector (&transitions);
418 if (transitions.len[0] > 0) {
419 transitions.buf[0]->type = CaptureStart;
420 transitions.buf[0]->capture_val = capture_start_frame;
421 (*chan)->capture_transition_buf->increment_write_ptr(1);
424 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
432 /** Do some record stuff [not described in this comment!]
435 * - Setup playback_distance with the nframes, or nframes adjusted
436 * for current varispeed, if appropriate.
437 * - Setup current_playback_buffer in each ChannelInfo to point to data
438 * that someone can read playback_distance worth of data from.
441 AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
444 boost::shared_ptr<ChannelList> c = channels.reader();
445 ChannelList::iterator chan;
446 framecnt_t rec_offset = 0;
447 framecnt_t rec_nframes = 0;
448 bool collect_playback = false;
449 bool can_record = _session.actively_recording ();
451 playback_distance = 0;
453 if (!_io || !_io->active()) {
457 check_record_status (transport_frame, can_record);
463 Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK);
469 adjust_capture_position = 0;
471 for (chan = c->begin(); chan != c->end(); ++chan) {
472 (*chan)->current_capture_buffer = 0;
473 (*chan)->current_playback_buffer = 0;
476 // Safeguard against situations where process() goes haywire when autopunching
477 // and last_recordable_frame < first_recordable_frame
479 if (last_recordable_frame < first_recordable_frame) {
480 last_recordable_frame = max_framepos;
483 if (record_enabled()) {
485 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
486 // XXX should this be transport_frame + nframes - 1 ? coverage() expects its parameter ranges to include their end points
487 // XXX also, first_recordable_frame & last_recordable_frame may both be == max_framepos: coverage() will return OverlapNone in that case. Is thak OK?
488 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
490 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: this time record %2 of %3 frames, offset %4\n", _name, rec_nframes, nframes, rec_offset));
492 if (rec_nframes && !was_recording) {
493 capture_captured = 0;
494 was_recording = true;
498 if (can_record && !_last_capture_sources.empty()) {
499 _last_capture_sources.clear ();
504 uint32_t limit = _io->n_ports ().n_audio();
506 /* one or more ports could already have been removed from _io, but our
507 channel setup hasn't yet been updated. prevent us from trying to
508 use channels that correspond to missing ports. note that the
509 process callback (from which this is called) is always atomic
510 with respect to port removal/addition.
513 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
515 ChannelInfo* chaninfo (*chan);
517 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
519 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
521 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
523 /* note: grab the entire port buffer, but only copy what we were supposed to
524 for recording, and use rec_offset
527 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
529 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
531 Sample *buf = bufs.get_audio (n).data(rec_offset);
532 memcpy (chaninfo->current_capture_buffer, buf, sizeof (Sample) * rec_nframes);
536 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
538 if (rec_nframes > total) {
539 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 overrun in %2, rec_nframes = %3 total space = %4\n",
540 DEBUG_THREAD_SELF, name(), rec_nframes, total));
545 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
548 Sample *buf = bufs.get_audio (n).data(rec_offset);
549 framecnt_t first = chaninfo->capture_vector.len[0];
551 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
552 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
553 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
554 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
556 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
570 /* data will be written to disk */
572 if (rec_nframes == nframes && rec_offset == 0) {
574 for (chan = c->begin(); chan != c->end(); ++chan) {
575 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
578 playback_distance = nframes;
583 /* we can't use the capture buffer as the playback buffer, because
584 we recorded only a part of the current process' cycle data
588 collect_playback = true;
591 adjust_capture_position = rec_nframes;
593 } else if (can_record && record_enabled()) {
595 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
597 for (chan = c->begin(); chan != c->end(); ++chan) {
598 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
601 playback_distance = nframes;
605 collect_playback = true;
608 if ((_track->monitoring_state () & MonitoringDisk) || collect_playback) {
610 /* we're doing playback */
612 framecnt_t necessary_samples;
614 /* no varispeed playback if we're recording, because the output .... TBD */
616 if (rec_nframes == 0 && _actual_speed != 1.0) {
617 necessary_samples = (framecnt_t) ceil ((nframes * fabs (_actual_speed))) + 2;
619 necessary_samples = nframes;
622 for (chan = c->begin(); chan != c->end(); ++chan) {
623 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
628 /* Setup current_playback_buffer in each ChannelInfo to point to data that someone
629 can read necessary_samples (== nframes at a transport speed of 1) worth of data
633 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
635 ChannelInfo* chaninfo (*chan);
637 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
638 /* There are enough samples in the first part of the ringbuffer */
639 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
642 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
644 if (necessary_samples > total) {
645 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
646 cerr << "underrun for " << _name << endl;
647 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, rec_nframes = %3 total space = %4\n",
648 DEBUG_THREAD_SELF, name(), rec_nframes, total));
654 /* We have enough samples, but not in one lump. Coalesce the two parts
655 into one in playback_wrap_buffer in our ChannelInfo, and specify that
656 as our current_playback_buffer.
659 assert(wrap_buffer_size >= necessary_samples);
661 /* Copy buf[0] from playback_buf */
662 memcpy ((char *) chaninfo->playback_wrap_buffer,
663 chaninfo->playback_vector.buf[0],
664 chaninfo->playback_vector.len[0] * sizeof (Sample));
666 /* Copy buf[1] from playback_buf */
667 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
668 chaninfo->playback_vector.buf[1],
669 (necessary_samples - chaninfo->playback_vector.len[0])
672 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
677 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
679 interpolation.set_speed (_target_speed);
682 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
683 ChannelInfo* chaninfo (*chan);
685 playback_distance = interpolation.interpolate (
686 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
688 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
692 playback_distance = nframes;
695 _speed = _target_speed;
698 if (need_disk_signal) {
700 /* copy data over to buffer set */
702 size_t n_buffers = bufs.count().n_audio();
703 size_t n_chans = c->size();
704 gain_t scaling = 1.0f;
706 if (n_chans > n_buffers) {
707 scaling = ((float) n_buffers)/n_chans;
710 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
712 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
713 ChannelInfo* chaninfo (*chan);
716 if (scaling != 1.0f) {
717 buf.read_from_with_gain (chaninfo->current_playback_buffer, nframes, scaling);
719 buf.read_from (chaninfo->current_playback_buffer, nframes);
722 if (scaling != 1.0f) {
723 buf.accumulate_with_gain_from (chaninfo->current_playback_buffer, nframes, scaling);
725 buf.accumulate_from (chaninfo->current_playback_buffer, nframes);
730 /* leave the MIDI count alone */
731 ChanCount cnt (DataType::AUDIO, n_chans);
732 cnt.set (DataType::MIDI, bufs.count().n_midi());
733 bufs.set_count (cnt);
735 /* extra buffers will already be silent, so leave them alone */
742 AudioDiskstream::calculate_playback_distance (pframes_t nframes)
744 frameoffset_t playback_distance = nframes;
746 if (record_enabled()) {
747 playback_distance = nframes;
748 } else if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
749 interpolation.set_speed (_target_speed);
750 boost::shared_ptr<ChannelList> c = channels.reader();
752 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
753 playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
756 playback_distance = nframes;
759 if (_actual_speed < 0.0) {
760 return -playback_distance;
762 return playback_distance;
766 /** Update various things including playback_sample, read pointer on each channel's playback_buf
767 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
768 * @return true if the butler is required.
771 AudioDiskstream::commit (framecnt_t playback_distance)
773 bool need_butler = false;
775 if (!_io || !_io->active()) {
779 if (_actual_speed < 0.0) {
780 playback_sample -= playback_distance;
782 playback_sample += playback_distance;
785 boost::shared_ptr<ChannelList> c = channels.reader();
786 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
788 (*chan)->playback_buf->increment_read_ptr (playback_distance);
790 if (adjust_capture_position) {
791 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
795 if (adjust_capture_position != 0) {
796 capture_captured += adjust_capture_position;
797 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 now captured %2 (by %3)\n", name(), capture_captured, adjust_capture_position));
798 adjust_capture_position = 0;
806 if (_io && _io->active()) {
807 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
812 if (_io && _io->active()) {
813 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_read_chunk_frames)
814 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_write_chunk_frames);
816 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_write_chunk_frames);
824 AudioDiskstream::set_pending_overwrite (bool yn)
826 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
828 _pending_overwrite = yn;
830 overwrite_frame = playback_sample;
832 boost::shared_ptr<ChannelList> c = channels.reader ();
834 overwrite_offset = c->front()->playback_buf->get_read_ptr();
839 AudioDiskstream::overwrite_existing_buffers ()
841 boost::shared_ptr<ChannelList> c = channels.reader();
843 _pending_overwrite = false;
847 Sample* mixdown_buffer;
850 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
852 overwrite_queued = false;
854 /* assume all are the same size */
855 framecnt_t size = c->front()->playback_buf->bufsize();
857 mixdown_buffer = new Sample[size];
858 gain_buffer = new float[size];
860 /* reduce size so that we can fill the buffer correctly (ringbuffers
861 can only handle size-1, otherwise they appear to be empty)
868 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
870 start = overwrite_frame;
871 framecnt_t cnt = size;
873 /* to fill the buffer without resetting the playback sample, we need to
874 do it one or two chunks (normally two).
876 |----------------------------------------------------------------------|
880 |<- second chunk->||<----------------- first chunk ------------------>|
884 framecnt_t to_read = size - overwrite_offset;
886 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
887 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
888 id(), size, playback_sample) << endmsg;
896 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
897 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
898 id(), size, playback_sample) << endmsg;
907 _pending_overwrite = false;
908 delete [] gain_buffer;
909 delete [] mixdown_buffer;
914 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
918 ChannelList::iterator chan;
919 boost::shared_ptr<ChannelList> c = channels.reader();
921 Glib::Threads::Mutex::Lock lm (state_lock);
923 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
924 (*chan)->playback_buf->reset ();
925 (*chan)->capture_buf->reset ();
928 /* can't rec-enable in destructive mode if transport is before start */
930 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
931 disengage_record_enable ();
934 playback_sample = frame;
937 if (complete_refill) {
938 /* call _do_refill() to refill the entire buffer, using
939 the largest reads possible.
941 while ((ret = do_refill_with_alloc (false)) > 0) ;
943 /* call _do_refill() to refill just one chunk, and then
946 ret = do_refill_with_alloc (true);
953 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
955 ChannelList::iterator chan;
956 boost::shared_ptr<ChannelList> c = channels.reader();
958 for (chan = c->begin(); chan != c->end(); ++chan) {
959 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
967 AudioDiskstream::internal_playback_seek (framecnt_t distance)
969 ChannelList::iterator chan;
970 boost::shared_ptr<ChannelList> c = channels.reader();
972 for (chan = c->begin(); chan != c->end(); ++chan) {
973 (*chan)->playback_buf->increment_read_ptr (::llabs(distance));
976 if (first_recordable_frame < max_framepos) {
977 first_recordable_frame += distance;
979 playback_sample += distance;
984 /** Read some data for 1 channel from our playlist into a buffer.
985 * @param buf Buffer to write to.
986 * @param start Session frame to start reading from; updated to where we end up
988 * @param cnt Count of samples to read.
989 * @param reversed true if we are running backwards, otherwise false.
992 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
993 framepos_t& start, framecnt_t cnt,
994 int channel, bool reversed)
996 framecnt_t this_read = 0;
998 framepos_t loop_end = 0;
999 framepos_t loop_start = 0;
1000 framecnt_t offset = 0;
1003 /* XXX we don't currently play loops in reverse. not sure why */
1007 framecnt_t loop_length = 0;
1009 /* Make the use of a Location atomic for this read operation.
1011 Note: Locations don't get deleted, so all we care about
1012 when I say "atomic" is that we are always pointing to
1013 the same one and using a start/length values obtained
1017 if ((loc = loop_location) != 0) {
1018 loop_start = loc->start();
1019 loop_end = loc->end();
1020 loop_length = loop_end - loop_start;
1023 /* if we are looping, ensure that the first frame we read is at the correct
1024 position within the loop.
1027 if (loc && start >= loop_end) {
1028 start = loop_start + ((start - loop_start) % loop_length);
1037 /* We need this while loop in case we hit a loop boundary, in which case our read from
1038 the playlist must be split into more than one section.
1043 /* take any loop into account. we can't read past the end of the loop. */
1045 if (loc && (loop_end - start < cnt)) {
1046 this_read = loop_end - start;
1053 if (this_read == 0) {
1057 this_read = min(cnt,this_read);
1059 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1060 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
1067 swap_by_ptr (buf, buf + this_read - 1);
1071 /* if we read to the end of the loop, go back to the beginning */
1081 offset += this_read;
1088 AudioDiskstream::_do_refill_with_alloc (bool partial_fill)
1090 /* We limit disk reads to at most 4MB chunks, which with floating point
1091 samples would be 1M samples. But we might use 16 or 14 bit samples,
1092 in which case 4MB is more samples than that. Therefore size this for
1093 the smallest sample value .. 4MB = 2M samples (16 bit).
1096 Sample* mix_buf = new Sample[2*1048576];
1097 float* gain_buf = new float[2*1048576];
1099 int ret = _do_refill (mix_buf, gain_buf, (partial_fill ? disk_read_chunk_frames : 0));
1107 /** Get some more data from disk and put it in our channels' playback_bufs,
1108 * if there is suitable space in them.
1110 * If fill_level is non-zero, then we will refill the buffer so that there is
1111 * still at least fill_level samples of space left to be filled. This is used
1112 * after locates so that we do not need to wait to fill the entire buffer.
1117 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer, framecnt_t fill_level)
1121 RingBufferNPT<Sample>::rw_vector vector;
1122 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1123 framecnt_t total_space;
1124 framecnt_t zero_fill;
1126 ChannelList::iterator i;
1127 boost::shared_ptr<ChannelList> c = channels.reader();
1130 /* do not read from disk while session is marked as Loading, to avoid
1131 useless redundant I/O.
1134 if (_session.state_of_the_state() & Session::Loading) {
1142 assert(mixdown_buffer);
1143 assert(gain_buffer);
1150 c->front()->playback_buf->get_write_vector (&vector);
1152 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1153 /* nowhere to write to */
1158 if (fill_level < total_space) {
1159 total_space -= fill_level;
1161 /* we can't do anything with it */
1166 /* if we're running close to normal speed and there isn't enough
1167 space to do disk_read_chunk_frames of I/O, then don't bother.
1169 at higher speeds, just do it because the sync between butler
1170 and audio thread may not be good enough.
1172 Note: it is a design assumption that disk_read_chunk_frames is smaller
1173 than the playback buffer size, so this check should never trip when
1174 the playback buffer is empty.
1177 if ((total_space < disk_read_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1181 /* when slaved, don't try to get too close to the read pointer. this
1182 leaves space for the buffer reversal to have something useful to
1186 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1192 if (file_frame == 0) {
1194 /* at start: nothing to do but fill with silence */
1196 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1198 ChannelInfo* chan (*i);
1199 chan->playback_buf->get_write_vector (&vector);
1200 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1201 if (vector.len[1]) {
1202 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1204 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1209 if (file_frame < total_space) {
1211 /* too close to the start: read what we can,
1212 and then zero fill the rest
1215 zero_fill = total_space - file_frame;
1216 total_space = file_frame;
1225 if (file_frame == max_framepos) {
1227 /* at end: nothing to do but fill with silence */
1229 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1231 ChannelInfo* chan (*i);
1232 chan->playback_buf->get_write_vector (&vector);
1233 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1234 if (vector.len[1]) {
1235 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1237 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1242 if (file_frame > max_framepos - total_space) {
1244 /* to close to the end: read what we can, and zero fill the rest */
1246 zero_fill = total_space - (max_framepos - file_frame);
1247 total_space = max_framepos - file_frame;
1254 framepos_t file_frame_tmp = 0;
1256 /* total_space is in samples. We want to optimize read sizes in various sizes using bytes */
1258 const size_t bits_per_sample = format_data_width (_session.config.get_native_file_data_format());
1259 size_t total_bytes = total_space * bits_per_sample / 8;
1261 /* chunk size range is 256kB to 4MB. Bigger is faster in terms of MB/sec, but bigger chunk size always takes longer
1263 size_t byte_size_for_read = max ((size_t) (256 * 1024), min ((size_t) (4 * 1048576), total_bytes));
1265 /* find nearest (lower) multiple of 16384 */
1267 byte_size_for_read = (byte_size_for_read / 16384) * 16384;
1269 /* now back to samples */
1271 framecnt_t samples_to_read = byte_size_for_read / (bits_per_sample / 8);
1273 //cerr << name() << " will read " << byte_size_for_read << " out of total bytes " << total_bytes << " in buffer of "
1274 // << c->front()->playback_buf->bufsize() * bits_per_sample / 8 << " bps = " << bits_per_sample << endl;
1275 // cerr << name () << " read samples = " << samples_to_read << " out of total space " << total_space << " in buffer of " << c->front()->playback_buf->bufsize() << " samples\n";
1277 // uint64_t before = g_get_monotonic_time ();
1278 // uint64_t elapsed;
1280 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1282 ChannelInfo* chan (*i);
1285 framecnt_t len1, len2;
1287 chan->playback_buf->get_write_vector (&vector);
1289 if ((framecnt_t) vector.len[0] > samples_to_read) {
1291 /* we're not going to fill the first chunk, so certainly do not bother with the
1292 other part. it won't be connected with the part we do fill, as in:
1294 .... => writable space
1295 ++++ => readable space
1296 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1298 |......|+++++++++++++|...............................|
1303 So, just pretend that the buf1 part isn't there.
1313 file_frame_tmp = file_frame;
1315 buf1 = vector.buf[0];
1316 len1 = vector.len[0];
1317 buf2 = vector.buf[1];
1318 len2 = vector.len[1];
1320 to_read = min (ts, len1);
1321 to_read = min (to_read, (framecnt_t) samples_to_read);
1323 assert (to_read >= 0);
1327 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1332 chan->playback_buf->increment_write_ptr (to_read);
1336 to_read = min (ts, len2);
1340 /* we read all of vector.len[0], but it wasn't the
1341 entire samples_to_read of data, so read some or
1342 all of vector.len[1] as well.
1345 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1350 chan->playback_buf->increment_write_ptr (to_read);
1354 /* XXX: do something */
1359 // elapsed = g_get_monotonic_time () - before;
1360 // cerr << "\tbandwidth = " << (byte_size_for_read / 1048576.0) / (elapsed/1000000.0) << "MB/sec\n";
1362 file_frame = file_frame_tmp;
1363 assert (file_frame >= 0);
1365 ret = ((total_space - samples_to_read) > disk_read_chunk_frames);
1367 c->front()->playback_buf->get_write_vector (&vector);
1373 /** Flush pending data to disk.
1375 * Important note: this function will write *AT MOST* disk_write_chunk_frames
1376 * of data to disk. it will never write more than that. If it writes that
1377 * much and there is more than that waiting to be written, it will return 1,
1378 * otherwise 0 on success or -1 on failure.
1380 * If there is less than disk_write_chunk_frames to be written, no data will be
1381 * written at all unless @a force_flush is true.
1384 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1388 RingBufferNPT<Sample>::rw_vector vector;
1389 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1392 transvec.buf[0] = 0;
1393 transvec.buf[1] = 0;
1397 boost::shared_ptr<ChannelList> c = channels.reader();
1398 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1400 (*chan)->capture_buf->get_read_vector (&vector);
1402 total = vector.len[0] + vector.len[1];
1404 if (total == 0 || (total < disk_write_chunk_frames && !force_flush && was_recording)) {
1408 /* if there are 2+ chunks of disk i/o possible for
1409 this track, let the caller know so that it can arrange
1410 for us to be called again, ASAP.
1412 if we are forcing a flush, then if there is* any* extra
1413 work, let the caller know.
1415 if we are no longer recording and there is any extra work,
1416 let the caller know too.
1419 if (total >= 2 * disk_write_chunk_frames || ((force_flush || !was_recording) && total > disk_write_chunk_frames)) {
1423 to_write = min (disk_write_chunk_frames, (framecnt_t) vector.len[0]);
1425 // check the transition buffer when recording destructive
1426 // important that we get this after the capture buf
1428 if (destructive()) {
1429 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1430 size_t transcount = transvec.len[0] + transvec.len[1];
1433 for (ti=0; ti < transcount; ++ti) {
1434 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1436 if (captrans.type == CaptureStart) {
1437 // by definition, the first data we got above represents the given capture pos
1439 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1440 (*chan)->curr_capture_cnt = 0;
1442 } else if (captrans.type == CaptureEnd) {
1444 // capture end, the capture_val represents total frames in capture
1446 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1448 // shorten to make the write a perfect fit
1449 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1451 if (nto_write < to_write) {
1452 ret = 1; // should we?
1454 to_write = nto_write;
1456 (*chan)->write_source->mark_capture_end ();
1458 // increment past this transition, but go no further
1463 // actually ends just beyond this chunk, so force more work
1471 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1475 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1476 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1480 (*chan)->capture_buf->increment_read_ptr (to_write);
1481 (*chan)->curr_capture_cnt += to_write;
1483 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_write_chunk_frames) && !destructive()) {
1485 /* we wrote all of vector.len[0] but it wasn't an entire
1486 disk_write_chunk_frames of data, so arrange for some part
1487 of vector.len[1] to be flushed to disk as well.
1490 to_write = min ((framecnt_t)(disk_write_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1492 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 additional write of %2\n", name(), to_write));
1494 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1495 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1499 (*chan)->capture_buf->increment_read_ptr (to_write);
1500 (*chan)->curr_capture_cnt += to_write;
1509 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1511 uint32_t buffer_position;
1512 bool more_work = true;
1514 boost::shared_ptr<AudioRegion> region;
1515 framecnt_t total_capture;
1517 SourceList::iterator src;
1518 ChannelList::iterator chan;
1519 vector<CaptureInfo*>::iterator ci;
1520 boost::shared_ptr<ChannelList> c = channels.reader();
1522 bool mark_write_completed = false;
1526 /* butler is already stopped, but there may be work to do
1527 to flush remaining data to disk.
1530 while (more_work && !err) {
1531 switch (do_flush (TransportContext, true)) {
1538 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1543 /* XXX is there anything we can do if err != 0 ? */
1544 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1546 if (capture_info.empty()) {
1550 if (abort_capture) {
1552 if (destructive()) {
1556 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1558 if ((*chan)->write_source) {
1560 (*chan)->write_source->mark_for_remove ();
1561 (*chan)->write_source->drop_references ();
1562 (*chan)->write_source.reset ();
1565 /* new source set up in "out" below */
1571 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1572 total_capture += (*ci)->frames;
1575 /* figure out the name for this take */
1577 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1579 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1583 s->update_header (capture_info.front()->start, when, twhen);
1584 s->set_captured_for (_name.val());
1585 s->mark_immutable ();
1587 if (Config->get_auto_analyse_audio()) {
1588 Analyser::queue_source_for_analysis (s, true);
1591 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("newly captured source %1 length %2\n", s->path(), s->length (0)));
1595 /* destructive tracks have a single, never changing region */
1597 if (destructive()) {
1599 /* send a signal that any UI can pick up to do the right thing. there is
1600 a small problem here in that a UI may need the peak data to be ready
1601 for the data that was recorded and this isn't interlocked with that
1602 process. this problem is deferred to the UI.
1605 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1609 string whole_file_region_name;
1610 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1612 /* Register a new region with the Session that
1613 describes the entire source. Do this first
1614 so that any sub-regions will obviously be
1615 children of this one (later!)
1621 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1622 plist.add (Properties::length, total_capture);
1623 plist.add (Properties::name, whole_file_region_name);
1624 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1625 rx->set_automatic (true);
1626 rx->set_whole_file (true);
1628 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1629 region->special_set_position (capture_info.front()->start);
1633 catch (failed_constructor& err) {
1634 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1638 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1640 _playlist->clear_changes ();
1641 _playlist->set_capture_insertion_in_progress (true);
1642 _playlist->freeze ();
1644 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1645 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1649 RegionFactory::region_name (region_name, whole_file_region_name, false);
1651 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1652 _name, (*ci)->start, (*ci)->frames, region_name, buffer_position));
1658 plist.add (Properties::start, buffer_position);
1659 plist.add (Properties::length, (*ci)->frames);
1660 plist.add (Properties::name, region_name);
1662 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1663 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1664 if (preroll_off > 0) {
1665 region->trim_front (buffer_position + preroll_off);
1669 catch (failed_constructor& err) {
1670 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1671 continue; /* XXX is this OK? */
1674 i_am_the_modifier++;
1676 _playlist->add_region (region, (*ci)->start + preroll_off, 1, non_layered());
1677 _playlist->set_layer (region, DBL_MAX);
1678 i_am_the_modifier--;
1680 buffer_position += (*ci)->frames;
1684 _playlist->set_capture_insertion_in_progress (false);
1685 _session.add_command (new StatefulDiffCommand (_playlist));
1688 mark_write_completed = true;
1691 reset_write_sources (mark_write_completed);
1695 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1699 capture_info.clear ();
1700 capture_start_frame = 0;
1704 AudioDiskstream::transport_looped (framepos_t transport_frame)
1706 if (was_recording) {
1707 // all we need to do is finish this capture, with modified capture length
1708 boost::shared_ptr<ChannelList> c = channels.reader();
1712 // the next region will start recording via the normal mechanism
1713 // we'll set the start position to the current transport pos
1714 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1715 capture_start_frame = transport_frame;
1716 first_recordable_frame = transport_frame; // mild lie
1717 last_recordable_frame = max_framepos;
1718 was_recording = true;
1720 if (recordable() && destructive()) {
1721 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1723 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1724 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1726 if (transvec.len[0] > 0) {
1727 transvec.buf[0]->type = CaptureStart;
1728 transvec.buf[0]->capture_val = capture_start_frame;
1729 (*chan)->capture_transition_buf->increment_write_ptr(1);
1733 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1743 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1745 was_recording = false;
1746 first_recordable_frame = max_framepos;
1747 last_recordable_frame = max_framepos;
1749 if (capture_captured == 0) {
1753 if (recordable() && destructive()) {
1754 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1756 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1757 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1759 if (transvec.len[0] > 0) {
1760 transvec.buf[0]->type = CaptureEnd;
1761 transvec.buf[0]->capture_val = capture_captured;
1762 (*chan)->capture_transition_buf->increment_write_ptr(1);
1766 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1772 CaptureInfo* ci = new CaptureInfo;
1774 ci->start = capture_start_frame;
1775 ci->frames = capture_captured;
1777 /* XXX theoretical race condition here. Need atomic exchange ?
1778 However, the circumstances when this is called right
1779 now (either on record-disable or transport_stopped)
1780 mean that no actual race exists. I think ...
1781 We now have a capture_info_lock, but it is only to be used
1782 to synchronize in the transport_stop and the capture info
1783 accessors, so that invalidation will not occur (both non-realtime).
1786 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->frames));
1788 capture_info.push_back (ci);
1789 capture_captured = 0;
1791 /* now we've finished a capture, reset first_recordable_frame for next time */
1792 first_recordable_frame = max_framepos;
1796 AudioDiskstream::set_record_enabled (bool yn)
1798 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0 || record_safe ()) {
1802 /* can't rec-enable in destructive mode if transport is before start */
1804 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1808 /* yes, i know that this not proof against race conditions, but its
1809 good enough. i think.
1812 if (record_enabled() != yn) {
1814 engage_record_enable ();
1816 disengage_record_enable ();
1819 RecordEnableChanged (); /* EMIT SIGNAL */
1824 AudioDiskstream::set_record_safe (bool yn)
1826 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1830 /* can't rec-safe in destructive mode if transport is before start ????
1833 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1837 /* yes, i know that this not proof against race conditions, but its
1838 good enough. i think.
1841 if (record_safe () != yn) {
1843 engage_record_safe ();
1845 disengage_record_safe ();
1848 RecordSafeChanged (); /* EMIT SIGNAL */
1853 AudioDiskstream::prep_record_enable ()
1855 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0 || record_safe ()) { // REQUIRES REVIEW "|| record_safe ()"
1859 /* can't rec-enable in destructive mode if transport is before start */
1861 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
1865 bool rolling = _session.transport_speed() != 0.0f;
1866 boost::shared_ptr<ChannelList> c = channels.reader();
1868 capturing_sources.clear ();
1870 if (Config->get_monitoring_model() == HardwareMonitoring) {
1872 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1873 (*chan)->source.request_input_monitoring (!(_session.config.get_auto_input() && rolling));
1874 capturing_sources.push_back ((*chan)->write_source);
1875 Source::Lock lock((*chan)->write_source->mutex());
1876 (*chan)->write_source->mark_streaming_write_started (lock);
1880 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1881 capturing_sources.push_back ((*chan)->write_source);
1882 Source::Lock lock((*chan)->write_source->mutex());
1883 (*chan)->write_source->mark_streaming_write_started (lock);
1891 AudioDiskstream::prep_record_disable ()
1893 boost::shared_ptr<ChannelList> c = channels.reader();
1894 if (Config->get_monitoring_model() == HardwareMonitoring) {
1895 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1896 (*chan)->source.request_input_monitoring (false);
1899 capturing_sources.clear ();
1905 AudioDiskstream::get_state ()
1907 XMLNode& node (Diskstream::get_state());
1911 boost::shared_ptr<ChannelList> c = channels.reader();
1912 snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
1913 node.add_property ("channels", buf);
1915 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1917 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1918 XMLNode* cs_grandchild;
1920 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1921 cs_grandchild = new XMLNode (X_("file"));
1922 cs_grandchild->add_property (X_("path"), (*i)->path());
1923 cs_child->add_child_nocopy (*cs_grandchild);
1926 /* store the location where capture will start */
1930 if (_session.preroll_record_punch_enabled ()) {
1931 snprintf (buf, sizeof (buf), "%" PRId64, _session.preroll_record_punch_pos ());
1932 } else if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1933 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1935 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1938 cs_child->add_property (X_("at"), buf);
1939 node.add_child_nocopy (*cs_child);
1946 AudioDiskstream::set_state (const XMLNode& node, int version)
1948 XMLProperty const * prop;
1949 XMLNodeList nlist = node.children();
1950 XMLNodeIterator niter;
1951 uint32_t nchans = 1;
1952 XMLNode* capture_pending_node = 0;
1955 /* prevent write sources from being created */
1957 in_set_state = true;
1959 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1960 if ((*niter)->name() == IO::state_node_name) {
1961 deprecated_io_node = new XMLNode (**niter);
1964 if ((*niter)->name() == X_("CapturingSources")) {
1965 capture_pending_node = *niter;
1969 if (Diskstream::set_state (node, version)) {
1973 if ((prop = node.property ("channels")) != 0) {
1974 nchans = atoi (prop->value().c_str());
1977 // create necessary extra channels
1978 // we are always constructed with one and we always need one
1980 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1982 if (nchans > _n_channels.n_audio()) {
1984 add_channel (nchans - _n_channels.n_audio());
1985 IO::PortCountChanged(_n_channels);
1987 } else if (nchans < _n_channels.n_audio()) {
1989 remove_channel (_n_channels.n_audio() - nchans);
1994 if (!destructive() && capture_pending_node) {
1995 /* destructive streams have one and only one source per channel,
1996 and so they never end up in pending capture in any useful
1999 use_pending_capture_data (*capture_pending_node);
2002 in_set_state = false;
2004 /* make sure this is clear before we do anything else */
2006 capturing_sources.clear ();
2008 /* write sources are handled when we handle the input set
2009 up of the IO that owns this DS (::non_realtime_input_change())
2016 AudioDiskstream::use_new_write_source (uint32_t n)
2018 boost::shared_ptr<ChannelList> c = channels.reader();
2020 if (!recordable()) {
2024 if (n >= c->size()) {
2025 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
2029 ChannelInfo* chan = (*c)[n];
2032 if ((chan->write_source = _session.create_audio_source_for_session (
2033 n_channels().n_audio(), write_source_name(), n, destructive())) == 0) {
2034 throw failed_constructor();
2038 catch (failed_constructor &err) {
2039 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2040 chan->write_source.reset ();
2044 /* do not remove destructive files even if they are empty */
2046 chan->write_source->set_allow_remove_if_empty (!destructive());
2052 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
2054 ChannelList::iterator chan;
2055 boost::shared_ptr<ChannelList> c = channels.reader();
2058 if (!_session.writable() || !recordable()) {
2062 capturing_sources.clear ();
2064 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2066 if (!destructive()) {
2068 if ((*chan)->write_source) {
2070 if (mark_write_complete) {
2071 Source::Lock lock((*chan)->write_source->mutex());
2072 (*chan)->write_source->mark_streaming_write_completed (lock);
2073 (*chan)->write_source->done_with_peakfile_writes ();
2076 if ((*chan)->write_source->removable()) {
2077 (*chan)->write_source->mark_for_remove ();
2078 (*chan)->write_source->drop_references ();
2081 (*chan)->write_source.reset ();
2084 use_new_write_source (n);
2086 if (record_enabled()) {
2087 capturing_sources.push_back ((*chan)->write_source);
2092 if ((*chan)->write_source == 0) {
2093 use_new_write_source (n);
2098 if (destructive() && !c->empty ()) {
2100 /* we now have all our write sources set up, so create the
2101 playlist's single region.
2104 if (_playlist->empty()) {
2105 setup_destructive_playlist ();
2111 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
2113 if (_session.get_block_size() > speed_buffer_size) {
2114 speed_buffer_size = _session.get_block_size();
2115 boost::shared_ptr<ChannelList> c = channels.reader();
2117 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2118 if ((*chan)->speed_buffer)
2119 delete [] (*chan)->speed_buffer;
2120 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2123 allocate_temporary_buffers ();
2127 AudioDiskstream::allocate_temporary_buffers ()
2129 /* make sure the wrap buffer is at least large enough to deal
2130 with the speeds up to 1.2, to allow for micro-variation
2131 when slaving to MTC, Timecode etc.
2134 double const sp = max (fabs (_actual_speed), 1.2);
2135 framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * sp) + 2;
2137 if (required_wrap_size > wrap_buffer_size) {
2139 boost::shared_ptr<ChannelList> c = channels.reader();
2141 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2142 if ((*chan)->playback_wrap_buffer) {
2143 delete [] (*chan)->playback_wrap_buffer;
2145 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2146 if ((*chan)->capture_wrap_buffer) {
2147 delete [] (*chan)->capture_wrap_buffer;
2149 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2152 wrap_buffer_size = required_wrap_size;
2157 AudioDiskstream::request_input_monitoring (bool yn)
2159 boost::shared_ptr<ChannelList> c = channels.reader();
2161 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2162 (*chan)->source.request_input_monitoring (yn);
2167 AudioDiskstream::set_align_style_from_io ()
2169 bool have_physical = false;
2171 if (_alignment_choice != Automatic) {
2179 get_input_sources ();
2181 boost::shared_ptr<ChannelList> c = channels.reader();
2183 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2184 if ((*chan)->source.is_physical ()) {
2185 have_physical = true;
2191 // compensate for latency when bouncing from master or mixbus.
2192 // we need to use "ExistingMaterial" to pick up the master bus' latency
2193 // see also Route::direct_feeds_according_to_reality
2195 ios.push_back (_io);
2196 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
2197 have_physical = true;
2199 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
2200 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
2201 have_physical = true;
2206 if (have_physical) {
2207 set_align_style (ExistingMaterial);
2209 set_align_style (CaptureTime);
2214 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2216 while (how_many--) {
2217 c->push_back (new ChannelInfo(
2218 _session.butler()->audio_diskstream_playback_buffer_size(),
2219 _session.butler()->audio_diskstream_capture_buffer_size(),
2220 speed_buffer_size, wrap_buffer_size));
2221 interpolation.add_channel_to (
2222 _session.butler()->audio_diskstream_playback_buffer_size(),
2226 _n_channels.set(DataType::AUDIO, c->size());
2232 AudioDiskstream::add_channel (uint32_t how_many)
2234 RCUWriter<ChannelList> writer (channels);
2235 boost::shared_ptr<ChannelList> c = writer.get_copy();
2237 return add_channel_to (c, how_many);
2241 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2243 while (how_many-- && !c->empty()) {
2246 interpolation.remove_channel_from ();
2249 _n_channels.set(DataType::AUDIO, c->size());
2255 AudioDiskstream::remove_channel (uint32_t how_many)
2257 RCUWriter<ChannelList> writer (channels);
2258 boost::shared_ptr<ChannelList> c = writer.get_copy();
2260 return remove_channel_from (c, how_many);
2264 AudioDiskstream::playback_buffer_load () const
2266 boost::shared_ptr<ChannelList> c = channels.reader();
2272 return (float) ((double) c->front()->playback_buf->read_space()/
2273 (double) c->front()->playback_buf->bufsize());
2277 AudioDiskstream::capture_buffer_load () const
2279 boost::shared_ptr<ChannelList> c = channels.reader();
2285 return (float) ((double) c->front()->capture_buf->write_space()/
2286 (double) c->front()->capture_buf->bufsize());
2290 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2292 XMLProperty const * prop;
2293 XMLNodeList nlist = node.children();
2294 XMLNodeIterator niter;
2295 boost::shared_ptr<AudioFileSource> fs;
2296 boost::shared_ptr<AudioFileSource> first_fs;
2297 SourceList pending_sources;
2298 framepos_t position;
2300 if ((prop = node.property (X_("at"))) == 0) {
2304 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2308 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2309 if ((*niter)->name() == X_("file")) {
2311 if ((prop = (*niter)->property (X_("path"))) == 0) {
2315 // This protects sessions from errant CapturingSources in stored sessions
2317 if (g_stat (prop->value().c_str(), &sbuf)) {
2321 /* XXX as of June 2014, we always record to mono
2322 files. Since this Source is being created as part of
2323 crash recovery, we know that we need the first
2324 channel (the final argument to the SourceFactory
2325 call below). If we ever support non-mono files for
2326 capture, this will need rethinking.
2330 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createForRecovery (DataType::AUDIO, _session, prop->value(), 0));
2333 catch (failed_constructor& err) {
2334 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2335 _name, prop->value())
2340 pending_sources.push_back (fs);
2342 if (first_fs == 0) {
2346 fs->set_captured_for (_name.val());
2350 if (pending_sources.size() == 0) {
2351 /* nothing can be done */
2355 if (pending_sources.size() != _n_channels.n_audio()) {
2356 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2363 boost::shared_ptr<AudioRegion> wf_region;
2364 boost::shared_ptr<AudioRegion> region;
2366 /* First create the whole file region */
2370 plist.add (Properties::start, 0);
2371 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2372 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2374 wf_region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2376 wf_region->set_automatic (true);
2377 wf_region->set_whole_file (true);
2378 wf_region->special_set_position (position);
2380 /* Now create a region that isn't the whole file for adding to
2383 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2385 _playlist->add_region (region, position);
2388 catch (failed_constructor& err) {
2389 error << string_compose (
2390 _("%1: cannot create whole-file region from pending capture sources"),
2400 #ifdef XXX_OLD_DESTRUCTIVE_API_XXX
2402 AudioDiskstream::set_non_layered (bool yn)
2404 if (yn != non_layered()) {
2407 _flags = Flag (_flags | NonLayered);
2409 _flags = Flag (_flags & ~NonLayered);
2417 AudioDiskstream::set_destructive (bool yn)
2419 if (yn != destructive()) {
2422 bool bounce_ignored;
2423 /* requestor should already have checked this and
2424 bounced if necessary and desired
2426 if (!can_become_destructive (bounce_ignored)) {
2429 _flags = Flag (_flags | Destructive);
2430 use_destructive_playlist ();
2432 _flags = Flag (_flags & ~Destructive);
2433 reset_write_sources (true, true);
2441 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2443 if (Profile->get_trx()) {
2448 requires_bounce = false;
2452 /* if no regions are present: easy */
2454 if (_playlist->n_regions() == 0) {
2455 requires_bounce = false;
2459 /* is there only one region ? */
2461 if (_playlist->n_regions() != 1) {
2462 requires_bounce = true;
2466 boost::shared_ptr<Region> first;
2468 const RegionList& rl (_playlist->region_list_property().rlist());
2469 assert((rl.size() == 1));
2475 requires_bounce = false;
2479 /* do the source(s) for the region cover the session start position ? */
2481 if (first->position() != _session.current_start_frame()) {
2482 // what is the idea here? why start() ??
2483 if (first->start() > _session.current_start_frame()) {
2484 requires_bounce = true;
2489 /* currently RouteTimeAxisView::set_track_mode does not
2490 * implement bounce. Existing regions cannot be converted.
2492 * so let's make sure this region is already set up
2493 * as tape-track (spanning the complete range)
2495 if (first->length() != max_framepos - first->position()) {
2496 requires_bounce = true;
2500 /* is the source used by only 1 playlist ? */
2502 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2506 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2507 requires_bounce = true;
2511 requires_bounce = false;
2517 AudioDiskstream::adjust_playback_buffering ()
2519 boost::shared_ptr<ChannelList> c = channels.reader();
2521 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2522 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2527 AudioDiskstream::adjust_capture_buffering ()
2529 boost::shared_ptr<ChannelList> c = channels.reader();
2531 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2532 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2537 AudioDiskstream::ChannelSource::is_physical () const
2543 return AudioEngine::instance()->port_is_physical (name);
2547 AudioDiskstream::ChannelSource::request_input_monitoring (bool yn) const
2553 return AudioEngine::instance()->request_input_monitoring (name, yn);
2556 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2558 current_capture_buffer = 0;
2559 current_playback_buffer = 0;
2560 curr_capture_cnt = 0;
2562 speed_buffer = new Sample[speed_size];
2563 playback_wrap_buffer = new Sample[wrap_size];
2564 capture_wrap_buffer = new Sample[wrap_size];
2566 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2567 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2568 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2570 /* touch the ringbuffer buffers, which will cause
2571 them to be mapped into locked physical RAM if
2572 we're running with mlockall(). this doesn't do
2576 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2577 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2578 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2582 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2584 delete playback_buf;
2585 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2586 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2590 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2594 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2595 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2598 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2601 if (write_source->removable()) {
2602 /* this is a "stub" write source which exists in the
2603 Session source list, but is removable. We must emit
2604 a drop references call because it should not
2605 continue to exist. If we do not do this, then the
2606 Session retains a reference to it, it is not
2607 deleted, and later attempts to create a new source
2608 file will use wierd naming because it already
2611 XXX longer term TO-DO: do not add to session source
2612 list until we write to the source.
2614 write_source->drop_references ();
2618 write_source.reset ();
2620 delete [] speed_buffer;
2623 delete [] playback_wrap_buffer;
2624 playback_wrap_buffer = 0;
2626 delete [] capture_wrap_buffer;
2627 capture_wrap_buffer = 0;
2629 delete playback_buf;
2635 delete capture_transition_buf;
2636 capture_transition_buf = 0;
2641 AudioDiskstream::set_name (string const & name)
2643 if (_name == name) {
2646 Diskstream::set_name (name);
2648 /* get a new write source so that its name reflects the new diskstream name */
2650 boost::shared_ptr<ChannelList> c = channels.reader();
2651 ChannelList::iterator i;
2654 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2655 use_new_write_source (n);
2662 AudioDiskstream::set_write_source_name (const std::string& str) {
2663 if (_write_source_name == str) {
2667 Diskstream::set_write_source_name (str);
2669 if (_write_source_name == name()) {
2672 boost::shared_ptr<ChannelList> c = channels.reader();
2673 ChannelList::iterator i;
2676 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2677 use_new_write_source (n);