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.
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/region_factory.h"
50 #include "ardour/session.h"
51 #include "ardour/session_playlists.h"
52 #include "ardour/source_factory.h"
53 #include "ardour/track.h"
54 #include "ardour/types.h"
55 #include "ardour/utils.h"
61 using namespace ARDOUR;
64 size_t AudioDiskstream::_working_buffers_size = 0;
65 Sample* AudioDiskstream::_mixdown_buffer = 0;
66 gain_t* AudioDiskstream::_gain_buffer = 0;
68 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
69 : Diskstream(sess, name, flag)
70 , channels (new ChannelList)
72 /* prevent any write sources from being created */
79 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
80 : Diskstream(sess, node)
81 , channels (new ChannelList)
86 if (set_state (node, Stateful::loading_state_version)) {
88 throw failed_constructor();
94 use_destructive_playlist ();
99 AudioDiskstream::init ()
101 /* there are no channels at this point, so these
102 two calls just get speed_buffer_size and wrap_buffer
103 size setup without duplicating their code.
106 set_block_size (_session.get_block_size());
107 allocate_temporary_buffers ();
110 AudioDiskstream::~AudioDiskstream ()
112 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
115 RCUWriter<ChannelList> writer (channels);
116 boost::shared_ptr<ChannelList> c = writer.get_copy();
118 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
129 AudioDiskstream::allocate_working_buffers()
131 _working_buffers_size = max (disk_write_chunk_frames, disk_read_chunk_frames);
132 _mixdown_buffer = new Sample[_working_buffers_size];
133 _gain_buffer = new gain_t[_working_buffers_size];
137 AudioDiskstream::free_working_buffers()
139 delete [] _mixdown_buffer;
140 delete [] _gain_buffer;
141 _working_buffers_size = 0;
147 AudioDiskstream::non_realtime_input_change ()
149 bool need_write_sources = false;
152 Glib::Threads::Mutex::Lock lm (state_lock);
154 if (input_change_pending.type == IOChange::NoChange) {
158 boost::shared_ptr<ChannelList> cr = channels.reader();
159 if (!cr->empty() && !cr->front()->write_source) {
160 need_write_sources = true;
163 if (input_change_pending.type == IOChange::ConfigurationChanged) {
164 RCUWriter<ChannelList> writer (channels);
165 boost::shared_ptr<ChannelList> c = writer.get_copy();
167 _n_channels.set(DataType::AUDIO, c->size());
169 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
170 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
171 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
172 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
175 need_write_sources = true;
178 if (input_change_pending.type & IOChange::ConnectionsChanged) {
179 get_input_sources ();
180 set_capture_offset ();
181 set_align_style_from_io ();
184 input_change_pending = IOChange::NoChange;
186 /* implicit unlock */
189 if (need_write_sources) {
190 reset_write_sources (false);
193 /* now refill channel buffers */
195 if (speed() != 1.0f || speed() != -1.0f) {
196 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
198 seek (_session.transport_frame());
203 AudioDiskstream::non_realtime_locate (framepos_t location)
205 /* now refill channel buffers */
207 if (speed() != 1.0f || speed() != -1.0f) {
208 seek ((framepos_t) (location * (double) speed()));
215 AudioDiskstream::get_input_sources ()
217 boost::shared_ptr<ChannelList> c = channels.reader();
220 ChannelList::iterator chan;
221 uint32_t ni = _io->n_ports().n_audio();
222 vector<string> connections;
224 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
226 connections.clear ();
228 if ((_io->nth (n).get()) && (_io->nth (n)->get_connections (connections) == 0)) {
229 if (!(*chan)->source.name.empty()) {
230 // _source->disable_metering ();
232 (*chan)->source.name = string();
234 (*chan)->source.name = connections[0];
240 AudioDiskstream::find_and_use_playlist (const string& name)
242 boost::shared_ptr<AudioPlaylist> playlist;
244 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
245 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
249 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
253 return use_playlist (playlist);
257 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
259 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
261 Diskstream::use_playlist(playlist);
267 AudioDiskstream::use_new_playlist ()
270 boost::shared_ptr<AudioPlaylist> playlist;
272 if (!in_set_state && destructive()) {
277 newname = Playlist::bump_name (_playlist->name(), _session);
279 newname = Playlist::bump_name (_name, _session);
282 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
284 return use_playlist (playlist);
292 AudioDiskstream::use_copy_playlist ()
294 assert(audio_playlist());
300 if (_playlist == 0) {
301 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
306 boost::shared_ptr<AudioPlaylist> playlist;
308 newname = Playlist::bump_name (_playlist->name(), _session);
310 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
311 return use_playlist (playlist);
318 AudioDiskstream::setup_destructive_playlist ()
321 boost::shared_ptr<ChannelList> c = channels.reader();
323 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
324 srcs.push_back ((*chan)->write_source);
327 /* a single full-sized region */
329 assert (!srcs.empty ());
332 plist.add (Properties::name, _name.val());
333 plist.add (Properties::start, 0);
334 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
336 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
337 _playlist->add_region (region, srcs.front()->natural_position());
341 AudioDiskstream::use_destructive_playlist ()
343 /* this is called from the XML-based constructor or ::set_destructive. when called,
344 we already have a playlist and a region, but we need to
345 set up our sources for write. we use the sources associated
346 with the (presumed single, full-extent) region.
349 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
352 reset_write_sources (false, true);
356 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
359 throw failed_constructor();
362 /* be sure to stretch the region out to the maximum length */
364 region->set_length (max_framepos - region->position());
367 ChannelList::iterator chan;
368 boost::shared_ptr<ChannelList> c = channels.reader();
370 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
371 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
372 assert((*chan)->write_source);
373 (*chan)->write_source->set_allow_remove_if_empty (false);
375 /* this might be false if we switched modes, so force it */
377 (*chan)->write_source->set_destructive (true);
380 /* the source list will never be reset for a destructive track */
384 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
386 if (recordable() && destructive()) {
387 boost::shared_ptr<ChannelList> c = channels.reader();
388 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
390 RingBufferNPT<CaptureTransition>::rw_vector transitions;
391 (*chan)->capture_transition_buf->get_write_vector (&transitions);
393 if (transitions.len[0] > 0) {
394 transitions.buf[0]->type = CaptureStart;
395 transitions.buf[0]->capture_val = capture_start_frame;
396 (*chan)->capture_transition_buf->increment_write_ptr(1);
399 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
407 /** Do some record stuff [not described in this comment!]
410 * - Setup playback_distance with the nframes, or nframes adjusted
411 * for current varispeed, if appropriate.
412 * - Setup current_playback_buffer in each ChannelInfo to point to data
413 * that someone can read playback_distance worth of data from.
416 AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
419 boost::shared_ptr<ChannelList> c = channels.reader();
420 ChannelList::iterator chan;
421 framecnt_t rec_offset = 0;
422 framecnt_t rec_nframes = 0;
423 bool collect_playback = false;
424 bool can_record = _session.actively_recording ();
426 playback_distance = 0;
428 if (!_io || !_io->active()) {
432 check_record_status (transport_frame, can_record);
438 Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK);
444 adjust_capture_position = 0;
446 for (chan = c->begin(); chan != c->end(); ++chan) {
447 (*chan)->current_capture_buffer = 0;
448 (*chan)->current_playback_buffer = 0;
451 // Safeguard against situations where process() goes haywire when autopunching
452 // and last_recordable_frame < first_recordable_frame
454 if (last_recordable_frame < first_recordable_frame) {
455 last_recordable_frame = max_framepos;
458 if (record_enabled()) {
460 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
461 // XXX should this be transport_frame + nframes - 1 ? coverage() expects its parameter ranges to include their end points
462 // XXX also, first_recordable_frame & last_recordable_frame may both be == max_framepos: coverage() will return OverlapNone in that case. Is thak OK?
463 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
465 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: this time record %2 of %3 frames, offset %4\n", _name, rec_nframes, nframes, rec_offset));
467 if (rec_nframes && !was_recording) {
468 capture_captured = 0;
469 was_recording = true;
473 if (can_record && !_last_capture_sources.empty()) {
474 _last_capture_sources.clear ();
479 uint32_t limit = _io->n_ports ().n_audio();
481 /* one or more ports could already have been removed from _io, but our
482 channel setup hasn't yet been updated. prevent us from trying to
483 use channels that correspond to missing ports. note that the
484 process callback (from which this is called) is always atomic
485 with respect to port removal/addition.
488 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
490 ChannelInfo* chaninfo (*chan);
492 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
494 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
496 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
498 /* note: grab the entire port buffer, but only copy what we were supposed to
499 for recording, and use rec_offset
502 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
504 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
506 Sample *buf = bufs.get_audio (n).data(rec_offset);
507 memcpy (chaninfo->current_capture_buffer, buf, sizeof (Sample) * rec_nframes);
511 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
513 if (rec_nframes > total) {
514 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 overrun in %2, rec_nframes = %3 total space = %4\n",
515 DEBUG_THREAD_SELF, name(), rec_nframes, total));
520 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
523 Sample *buf = bufs.get_audio (n).data(rec_offset);
524 framecnt_t first = chaninfo->capture_vector.len[0];
526 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
527 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
528 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
529 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
531 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
545 /* data will be written to disk */
547 if (rec_nframes == nframes && rec_offset == 0) {
549 for (chan = c->begin(); chan != c->end(); ++chan) {
550 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
553 playback_distance = nframes;
558 /* we can't use the capture buffer as the playback buffer, because
559 we recorded only a part of the current process' cycle data
563 collect_playback = true;
566 adjust_capture_position = rec_nframes;
568 } else if (can_record && record_enabled()) {
570 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
572 for (chan = c->begin(); chan != c->end(); ++chan) {
573 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
576 playback_distance = nframes;
580 collect_playback = true;
583 if ((_track->monitoring_state () & MonitoringDisk) || collect_playback) {
585 /* we're doing playback */
587 framecnt_t necessary_samples;
589 /* no varispeed playback if we're recording, because the output .... TBD */
591 if (rec_nframes == 0 && _actual_speed != 1.0f) {
592 necessary_samples = (framecnt_t) ceil ((nframes * fabs (_actual_speed))) + 2;
594 necessary_samples = nframes;
597 for (chan = c->begin(); chan != c->end(); ++chan) {
598 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
603 /* Setup current_playback_buffer in each ChannelInfo to point to data that someone
604 can read necessary_samples (== nframes at a transport speed of 1) worth of data
608 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
610 ChannelInfo* chaninfo (*chan);
612 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
613 /* There are enough samples in the first part of the ringbuffer */
614 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
617 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
619 if (necessary_samples > total) {
620 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
621 cerr << "underrun for " << _name << endl;
622 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 underrun in %2, rec_nframes = %3 total space = %4\n",
623 DEBUG_THREAD_SELF, name(), rec_nframes, total));
629 /* We have enough samples, but not in one lump. Coalesce the two parts
630 into one in playback_wrap_buffer in our ChannelInfo, and specify that
631 as our current_playback_buffer.
634 assert(wrap_buffer_size >= necessary_samples);
636 /* Copy buf[0] from playback_buf */
637 memcpy ((char *) chaninfo->playback_wrap_buffer,
638 chaninfo->playback_vector.buf[0],
639 chaninfo->playback_vector.len[0] * sizeof (Sample));
641 /* Copy buf[1] from playback_buf */
642 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
643 chaninfo->playback_vector.buf[1],
644 (necessary_samples - chaninfo->playback_vector.len[0])
647 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
652 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
654 interpolation.set_speed (_target_speed);
657 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
658 ChannelInfo* chaninfo (*chan);
660 playback_distance = interpolation.interpolate (
661 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
663 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
667 playback_distance = nframes;
670 _speed = _target_speed;
673 if (need_disk_signal) {
675 /* copy data over to buffer set */
677 size_t n_buffers = bufs.count().n_audio();
678 size_t n_chans = c->size();
679 gain_t scaling = 1.0f;
681 if (n_chans > n_buffers) {
682 scaling = ((float) n_buffers)/n_chans;
685 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
687 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
688 ChannelInfo* chaninfo (*chan);
691 if (scaling != 1.0f) {
692 buf.read_from_with_gain (chaninfo->current_playback_buffer, nframes, scaling);
694 buf.read_from (chaninfo->current_playback_buffer, nframes);
697 if (scaling != 1.0f) {
698 buf.accumulate_with_gain_from (chaninfo->current_playback_buffer, nframes, scaling);
700 buf.accumulate_from (chaninfo->current_playback_buffer, nframes);
705 /* leave the MIDI count alone */
706 ChanCount cnt (DataType::AUDIO, n_chans);
707 cnt.set (DataType::MIDI, bufs.count().n_midi());
708 bufs.set_count (cnt);
710 /* extra buffers will already be silent, so leave them alone */
717 AudioDiskstream::calculate_playback_distance (pframes_t nframes)
719 frameoffset_t playback_distance = nframes;
721 if (record_enabled()) {
722 playback_distance = nframes;
723 } else if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
724 interpolation.set_speed (_target_speed);
725 boost::shared_ptr<ChannelList> c = channels.reader();
727 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
728 playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
731 playback_distance = nframes;
734 if (_actual_speed < 0.0) {
735 return -playback_distance;
737 return playback_distance;
741 /** Update various things including playback_sample, read pointer on each channel's playback_buf
742 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
743 * @return true if the butler is required.
746 AudioDiskstream::commit (framecnt_t playback_distance)
748 bool need_butler = false;
750 if (!_io || !_io->active()) {
754 if (_actual_speed < 0.0) {
755 playback_sample -= playback_distance;
757 playback_sample += playback_distance;
760 boost::shared_ptr<ChannelList> c = channels.reader();
761 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
763 (*chan)->playback_buf->increment_read_ptr (playback_distance);
765 if (adjust_capture_position) {
766 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
770 if (adjust_capture_position != 0) {
771 capture_captured += adjust_capture_position;
772 adjust_capture_position = 0;
780 if (_io && _io->active()) {
781 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
786 if (_io && _io->active()) {
787 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_read_chunk_frames)
788 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_write_chunk_frames);
790 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_write_chunk_frames);
798 AudioDiskstream::set_pending_overwrite (bool yn)
800 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
802 _pending_overwrite = yn;
804 overwrite_frame = playback_sample;
806 boost::shared_ptr<ChannelList> c = channels.reader ();
808 overwrite_offset = c->front()->playback_buf->get_read_ptr();
813 AudioDiskstream::overwrite_existing_buffers ()
815 boost::shared_ptr<ChannelList> c = channels.reader();
817 _pending_overwrite = false;
821 Sample* mixdown_buffer;
824 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
826 overwrite_queued = false;
828 /* assume all are the same size */
829 framecnt_t size = c->front()->playback_buf->bufsize();
831 mixdown_buffer = new Sample[size];
832 gain_buffer = new float[size];
834 /* reduce size so that we can fill the buffer correctly (ringbuffers
835 can only handle size-1, otherwise they appear to be empty)
842 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
844 start = overwrite_frame;
845 framecnt_t cnt = size;
847 /* to fill the buffer without resetting the playback sample, we need to
848 do it one or two chunks (normally two).
850 |----------------------------------------------------------------------|
854 |<- second chunk->||<----------------- first chunk ------------------>|
858 framecnt_t to_read = size - overwrite_offset;
860 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
861 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
862 id(), size, playback_sample) << endmsg;
870 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
871 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
872 id(), size, playback_sample) << endmsg;
881 _pending_overwrite = false;
882 delete [] gain_buffer;
883 delete [] mixdown_buffer;
888 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
892 ChannelList::iterator chan;
893 boost::shared_ptr<ChannelList> c = channels.reader();
895 Glib::Threads::Mutex::Lock lm (state_lock);
897 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
898 (*chan)->playback_buf->reset ();
899 (*chan)->capture_buf->reset ();
902 /* can't rec-enable in destructive mode if transport is before start */
904 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
905 disengage_record_enable ();
908 playback_sample = frame;
911 if (complete_refill) {
912 while ((ret = do_refill_with_alloc ()) > 0) ;
914 ret = do_refill_with_alloc ();
921 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
923 ChannelList::iterator chan;
924 boost::shared_ptr<ChannelList> c = channels.reader();
926 for (chan = c->begin(); chan != c->end(); ++chan) {
927 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
935 AudioDiskstream::internal_playback_seek (framecnt_t distance)
937 ChannelList::iterator chan;
938 boost::shared_ptr<ChannelList> c = channels.reader();
940 for (chan = c->begin(); chan != c->end(); ++chan) {
941 (*chan)->playback_buf->increment_read_ptr (llabs(distance));
944 if (first_recordable_frame < max_framepos) {
945 first_recordable_frame += distance;
947 playback_sample += distance;
952 /** Read some data for 1 channel from our playlist into a buffer.
953 * @param buf Buffer to write to.
954 * @param start Session frame to start reading from; updated to where we end up
956 * @param cnt Count of samples to read.
957 * @param reversed true if we are running backwards, otherwise false.
960 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
961 framepos_t& start, framecnt_t cnt,
962 int channel, bool reversed)
964 framecnt_t this_read = 0;
966 framepos_t loop_end = 0;
967 framepos_t loop_start = 0;
968 framecnt_t offset = 0;
971 /* XXX we don't currently play loops in reverse. not sure why */
975 framecnt_t loop_length = 0;
977 /* Make the use of a Location atomic for this read operation.
979 Note: Locations don't get deleted, so all we care about
980 when I say "atomic" is that we are always pointing to
981 the same one and using a start/length values obtained
985 if ((loc = loop_location) != 0) {
986 loop_start = loc->start();
987 loop_end = loc->end();
988 loop_length = loop_end - loop_start;
991 /* if we are looping, ensure that the first frame we read is at the correct
992 position within the loop.
995 if (loc && start >= loop_end) {
996 start = loop_start + ((start - loop_start) % loop_length);
1005 /* We need this while loop in case we hit a loop boundary, in which case our read from
1006 the playlist must be split into more than one section.
1011 /* take any loop into account. we can't read past the end of the loop. */
1013 if (loc && (loop_end - start < cnt)) {
1014 this_read = loop_end - start;
1021 if (this_read == 0) {
1025 this_read = min(cnt,this_read);
1027 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1028 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
1035 swap_by_ptr (buf, buf + this_read - 1);
1039 /* if we read to the end of the loop, go back to the beginning */
1049 offset += this_read;
1056 AudioDiskstream::do_refill_with_alloc ()
1058 Sample* mix_buf = new Sample[disk_read_chunk_frames];
1059 float* gain_buf = new float[disk_read_chunk_frames];
1061 int ret = _do_refill(mix_buf, gain_buf);
1069 /** Get some more data from disk and put it in our channels' playback_bufs,
1070 * if there is suitable space in them.
1073 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1077 RingBufferNPT<Sample>::rw_vector vector;
1078 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1079 framecnt_t total_space;
1080 framecnt_t zero_fill;
1082 ChannelList::iterator i;
1083 boost::shared_ptr<ChannelList> c = channels.reader();
1090 assert(mixdown_buffer);
1091 assert(gain_buffer);
1098 c->front()->playback_buf->get_write_vector (&vector);
1100 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1101 /* nowhere to write to */
1105 /* if there are 2+ chunks of disk i/o possible for
1106 this track, let the caller know so that it can arrange
1107 for us to be called again, ASAP.
1110 if (total_space >= (_slaved ? 3 : 2) * disk_read_chunk_frames) {
1114 /* if we're running close to normal speed and there isn't enough
1115 space to do disk_read_chunk_frames of I/O, then don't bother.
1117 at higher speeds, just do it because the sync between butler
1118 and audio thread may not be good enough.
1120 Note: it is a design assumption that disk_read_chunk_frames is smaller
1121 than the playback buffer size, so this check should never trip when
1122 the playback buffer is empty.
1125 if ((total_space < disk_read_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1129 /* when slaved, don't try to get too close to the read pointer. this
1130 leaves space for the buffer reversal to have something useful to
1134 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1138 /* never do more than disk_read_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1140 total_space = min (disk_read_chunk_frames, total_space);
1144 if (file_frame == 0) {
1146 /* at start: nothing to do but fill with silence */
1148 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1150 ChannelInfo* chan (*i);
1151 chan->playback_buf->get_write_vector (&vector);
1152 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1153 if (vector.len[1]) {
1154 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1156 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1161 if (file_frame < total_space) {
1163 /* too close to the start: read what we can,
1164 and then zero fill the rest
1167 zero_fill = total_space - file_frame;
1168 total_space = file_frame;
1177 if (file_frame == max_framepos) {
1179 /* at end: nothing to do but fill with silence */
1181 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1183 ChannelInfo* chan (*i);
1184 chan->playback_buf->get_write_vector (&vector);
1185 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1186 if (vector.len[1]) {
1187 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1189 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1194 if (file_frame > max_framepos - total_space) {
1196 /* to close to the end: read what we can, and zero fill the rest */
1198 zero_fill = total_space - (max_framepos - file_frame);
1199 total_space = max_framepos - file_frame;
1206 framepos_t file_frame_tmp = 0;
1208 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1210 ChannelInfo* chan (*i);
1213 framecnt_t len1, len2;
1215 chan->playback_buf->get_write_vector (&vector);
1217 if ((framecnt_t) vector.len[0] > disk_read_chunk_frames) {
1219 /* we're not going to fill the first chunk, so certainly do not bother with the
1220 other part. it won't be connected with the part we do fill, as in:
1222 .... => writable space
1223 ++++ => readable space
1224 ^^^^ => 1 x disk_read_chunk_frames that would be filled
1226 |......|+++++++++++++|...............................|
1231 So, just pretend that the buf1 part isn't there.
1241 file_frame_tmp = file_frame;
1243 buf1 = vector.buf[0];
1244 len1 = vector.len[0];
1245 buf2 = vector.buf[1];
1246 len2 = vector.len[1];
1248 to_read = min (ts, len1);
1249 to_read = min (to_read, disk_read_chunk_frames);
1251 assert (to_read >= 0);
1255 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1260 chan->playback_buf->increment_write_ptr (to_read);
1264 to_read = min (ts, len2);
1268 /* we read all of vector.len[0], but it wasn't an entire disk_read_chunk_frames of data,
1269 so read some or all of vector.len[1] as well.
1272 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1277 chan->playback_buf->increment_write_ptr (to_read);
1281 /* XXX: do something */
1286 file_frame = file_frame_tmp;
1287 assert (file_frame >= 0);
1294 /** Flush pending data to disk.
1296 * Important note: this function will write *AT MOST* disk_write_chunk_frames
1297 * of data to disk. it will never write more than that. If it writes that
1298 * much and there is more than that waiting to be written, it will return 1,
1299 * otherwise 0 on success or -1 on failure.
1301 * If there is less than disk_write_chunk_frames to be written, no data will be
1302 * written at all unless @a force_flush is true.
1305 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1309 RingBufferNPT<Sample>::rw_vector vector;
1310 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1313 transvec.buf[0] = 0;
1314 transvec.buf[1] = 0;
1318 boost::shared_ptr<ChannelList> c = channels.reader();
1319 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1321 (*chan)->capture_buf->get_read_vector (&vector);
1323 total = vector.len[0] + vector.len[1];
1325 if (total == 0 || (total < disk_write_chunk_frames && !force_flush && was_recording)) {
1329 /* if there are 2+ chunks of disk i/o possible for
1330 this track, let the caller know so that it can arrange
1331 for us to be called again, ASAP.
1333 if we are forcing a flush, then if there is* any* extra
1334 work, let the caller know.
1336 if we are no longer recording and there is any extra work,
1337 let the caller know too.
1340 if (total >= 2 * disk_write_chunk_frames || ((force_flush || !was_recording) && total > disk_write_chunk_frames)) {
1344 to_write = min (disk_write_chunk_frames, (framecnt_t) vector.len[0]);
1346 // check the transition buffer when recording destructive
1347 // important that we get this after the capture buf
1349 if (destructive()) {
1350 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1351 size_t transcount = transvec.len[0] + transvec.len[1];
1354 for (ti=0; ti < transcount; ++ti) {
1355 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1357 if (captrans.type == CaptureStart) {
1358 // by definition, the first data we got above represents the given capture pos
1360 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1361 (*chan)->curr_capture_cnt = 0;
1363 } else if (captrans.type == CaptureEnd) {
1365 // capture end, the capture_val represents total frames in capture
1367 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1369 // shorten to make the write a perfect fit
1370 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1372 if (nto_write < to_write) {
1373 ret = 1; // should we?
1375 to_write = nto_write;
1377 (*chan)->write_source->mark_capture_end ();
1379 // increment past this transition, but go no further
1384 // actually ends just beyond this chunk, so force more work
1392 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1396 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1397 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1401 (*chan)->capture_buf->increment_read_ptr (to_write);
1402 (*chan)->curr_capture_cnt += to_write;
1404 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_write_chunk_frames) && !destructive()) {
1406 /* we wrote all of vector.len[0] but it wasn't an entire
1407 disk_write_chunk_frames of data, so arrange for some part
1408 of vector.len[1] to be flushed to disk as well.
1411 to_write = min ((framecnt_t)(disk_write_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1413 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 additional write of %2\n", name(), to_write));
1415 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1416 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1420 (*chan)->capture_buf->increment_read_ptr (to_write);
1421 (*chan)->curr_capture_cnt += to_write;
1430 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1432 uint32_t buffer_position;
1433 bool more_work = true;
1435 boost::shared_ptr<AudioRegion> region;
1436 framecnt_t total_capture;
1438 SourceList::iterator src;
1439 ChannelList::iterator chan;
1440 vector<CaptureInfo*>::iterator ci;
1441 boost::shared_ptr<ChannelList> c = channels.reader();
1443 bool mark_write_completed = false;
1447 /* butler is already stopped, but there may be work to do
1448 to flush remaining data to disk.
1451 while (more_work && !err) {
1452 switch (do_flush (TransportContext, true)) {
1459 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1464 /* XXX is there anything we can do if err != 0 ? */
1465 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1467 if (capture_info.empty()) {
1471 if (abort_capture) {
1473 if (destructive()) {
1477 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1479 if ((*chan)->write_source) {
1481 (*chan)->write_source->mark_for_remove ();
1482 (*chan)->write_source->drop_references ();
1483 (*chan)->write_source.reset ();
1486 /* new source set up in "out" below */
1492 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1493 total_capture += (*ci)->frames;
1496 /* figure out the name for this take */
1498 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1500 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1504 s->update_header (capture_info.front()->start, when, twhen);
1505 s->set_captured_for (_name.val());
1506 s->mark_immutable ();
1508 if (Config->get_auto_analyse_audio()) {
1509 Analyser::queue_source_for_analysis (s, true);
1514 /* destructive tracks have a single, never changing region */
1516 if (destructive()) {
1518 /* send a signal that any UI can pick up to do the right thing. there is
1519 a small problem here in that a UI may need the peak data to be ready
1520 for the data that was recorded and this isn't interlocked with that
1521 process. this problem is deferred to the UI.
1524 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1528 string whole_file_region_name;
1529 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1531 /* Register a new region with the Session that
1532 describes the entire source. Do this first
1533 so that any sub-regions will obviously be
1534 children of this one (later!)
1540 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1541 plist.add (Properties::length, total_capture);
1542 plist.add (Properties::name, whole_file_region_name);
1543 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1544 rx->set_automatic (true);
1545 rx->set_whole_file (true);
1547 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1548 region->special_set_position (capture_info.front()->start);
1552 catch (failed_constructor& err) {
1553 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1557 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1559 _playlist->clear_changes ();
1560 _playlist->set_capture_insertion_in_progress (true);
1561 _playlist->freeze ();
1563 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1567 RegionFactory::region_name (region_name, whole_file_region_name, false);
1569 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1570 _name, (*ci)->start, (*ci)->frames, region_name));
1576 plist.add (Properties::start, buffer_position);
1577 plist.add (Properties::length, (*ci)->frames);
1578 plist.add (Properties::name, region_name);
1580 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1581 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1584 catch (failed_constructor& err) {
1585 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1586 continue; /* XXX is this OK? */
1589 i_am_the_modifier++;
1591 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1592 _playlist->set_layer (region, DBL_MAX);
1593 i_am_the_modifier--;
1595 buffer_position += (*ci)->frames;
1599 _playlist->set_capture_insertion_in_progress (false);
1600 _session.add_command (new StatefulDiffCommand (_playlist));
1603 mark_write_completed = true;
1606 reset_write_sources (mark_write_completed);
1610 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1614 capture_info.clear ();
1615 capture_start_frame = 0;
1619 AudioDiskstream::transport_looped (framepos_t transport_frame)
1621 if (was_recording) {
1622 // all we need to do is finish this capture, with modified capture length
1623 boost::shared_ptr<ChannelList> c = channels.reader();
1625 // adjust the capture length knowing that the data will be recorded to disk
1626 // only necessary after the first loop where we're recording
1627 if (capture_info.size() == 0) {
1628 capture_captured += _capture_offset;
1630 if (_alignment_style == ExistingMaterial) {
1631 capture_captured += _session.worst_output_latency();
1633 capture_captured += _roll_delay;
1639 // the next region will start recording via the normal mechanism
1640 // we'll set the start position to the current transport pos
1641 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1642 capture_start_frame = transport_frame;
1643 first_recordable_frame = transport_frame; // mild lie
1644 last_recordable_frame = max_framepos;
1645 was_recording = true;
1647 if (recordable() && destructive()) {
1648 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1650 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1651 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1653 if (transvec.len[0] > 0) {
1654 transvec.buf[0]->type = CaptureStart;
1655 transvec.buf[0]->capture_val = capture_start_frame;
1656 (*chan)->capture_transition_buf->increment_write_ptr(1);
1660 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1670 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1672 was_recording = false;
1673 first_recordable_frame = max_framepos;
1674 last_recordable_frame = max_framepos;
1676 if (capture_captured == 0) {
1680 if (recordable() && destructive()) {
1681 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1683 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1684 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1686 if (transvec.len[0] > 0) {
1687 transvec.buf[0]->type = CaptureEnd;
1688 transvec.buf[0]->capture_val = capture_captured;
1689 (*chan)->capture_transition_buf->increment_write_ptr(1);
1693 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1699 CaptureInfo* ci = new CaptureInfo;
1701 ci->start = capture_start_frame;
1702 ci->frames = capture_captured;
1704 /* XXX theoretical race condition here. Need atomic exchange ?
1705 However, the circumstances when this is called right
1706 now (either on record-disable or transport_stopped)
1707 mean that no actual race exists. I think ...
1708 We now have a capture_info_lock, but it is only to be used
1709 to synchronize in the transport_stop and the capture info
1710 accessors, so that invalidation will not occur (both non-realtime).
1713 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->frames));
1715 capture_info.push_back (ci);
1716 capture_captured = 0;
1718 /* now we've finished a capture, reset first_recordable_frame for next time */
1719 first_recordable_frame = max_framepos;
1723 AudioDiskstream::set_record_enabled (bool yn)
1725 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1729 /* can't rec-enable in destructive mode if transport is before start */
1731 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1735 /* yes, i know that this not proof against race conditions, but its
1736 good enough. i think.
1739 if (record_enabled() != yn) {
1741 engage_record_enable ();
1743 disengage_record_enable ();
1746 RecordEnableChanged (); /* EMIT SIGNAL */
1751 AudioDiskstream::prep_record_enable ()
1753 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1757 /* can't rec-enable in destructive mode if transport is before start */
1759 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
1763 bool rolling = _session.transport_speed() != 0.0f;
1764 boost::shared_ptr<ChannelList> c = channels.reader();
1766 capturing_sources.clear ();
1768 if (Config->get_monitoring_model() == HardwareMonitoring) {
1770 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1771 (*chan)->source.request_input_monitoring (!(_session.config.get_auto_input() && rolling));
1772 capturing_sources.push_back ((*chan)->write_source);
1773 Source::Lock lock((*chan)->write_source->mutex());
1774 (*chan)->write_source->mark_streaming_write_started (lock);
1778 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1779 capturing_sources.push_back ((*chan)->write_source);
1780 Source::Lock lock((*chan)->write_source->mutex());
1781 (*chan)->write_source->mark_streaming_write_started (lock);
1789 AudioDiskstream::prep_record_disable ()
1791 boost::shared_ptr<ChannelList> c = channels.reader();
1792 if (Config->get_monitoring_model() == HardwareMonitoring) {
1793 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1794 (*chan)->source.request_input_monitoring (false);
1797 capturing_sources.clear ();
1803 AudioDiskstream::get_state ()
1805 XMLNode& node (Diskstream::get_state());
1807 LocaleGuard lg (X_("C"));
1809 boost::shared_ptr<ChannelList> c = channels.reader();
1810 snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
1811 node.add_property ("channels", buf);
1813 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1815 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1816 XMLNode* cs_grandchild;
1818 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1819 cs_grandchild = new XMLNode (X_("file"));
1820 cs_grandchild->add_property (X_("path"), (*i)->path());
1821 cs_child->add_child_nocopy (*cs_grandchild);
1824 /* store the location where capture will start */
1828 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1829 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1831 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1834 cs_child->add_property (X_("at"), buf);
1835 node.add_child_nocopy (*cs_child);
1842 AudioDiskstream::set_state (const XMLNode& node, int version)
1844 const XMLProperty* prop;
1845 XMLNodeList nlist = node.children();
1846 XMLNodeIterator niter;
1847 uint32_t nchans = 1;
1848 XMLNode* capture_pending_node = 0;
1849 LocaleGuard lg (X_("C"));
1851 /* prevent write sources from being created */
1853 in_set_state = true;
1855 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1856 if ((*niter)->name() == IO::state_node_name) {
1857 deprecated_io_node = new XMLNode (**niter);
1860 if ((*niter)->name() == X_("CapturingSources")) {
1861 capture_pending_node = *niter;
1865 if (Diskstream::set_state (node, version)) {
1869 if ((prop = node.property ("channels")) != 0) {
1870 nchans = atoi (prop->value().c_str());
1873 // create necessary extra channels
1874 // we are always constructed with one and we always need one
1876 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1878 if (nchans > _n_channels.n_audio()) {
1880 add_channel (nchans - _n_channels.n_audio());
1881 IO::PortCountChanged(_n_channels);
1883 } else if (nchans < _n_channels.n_audio()) {
1885 remove_channel (_n_channels.n_audio() - nchans);
1890 if (!destructive() && capture_pending_node) {
1891 /* destructive streams have one and only one source per channel,
1892 and so they never end up in pending capture in any useful
1895 use_pending_capture_data (*capture_pending_node);
1898 in_set_state = false;
1900 /* make sure this is clear before we do anything else */
1902 capturing_sources.clear ();
1904 /* write sources are handled when we handle the input set
1905 up of the IO that owns this DS (::non_realtime_input_change())
1912 AudioDiskstream::use_new_write_source (uint32_t n)
1914 boost::shared_ptr<ChannelList> c = channels.reader();
1916 if (!recordable()) {
1920 if (n >= c->size()) {
1921 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1925 ChannelInfo* chan = (*c)[n];
1928 if ((chan->write_source = _session.create_audio_source_for_session (
1929 n_channels().n_audio(), write_source_name(), n, destructive())) == 0) {
1930 throw failed_constructor();
1934 catch (failed_constructor &err) {
1935 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1936 chan->write_source.reset ();
1940 /* do not remove destructive files even if they are empty */
1942 chan->write_source->set_allow_remove_if_empty (!destructive());
1948 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1950 ChannelList::iterator chan;
1951 boost::shared_ptr<ChannelList> c = channels.reader();
1954 if (!_session.writable() || !recordable()) {
1958 capturing_sources.clear ();
1960 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1962 if (!destructive()) {
1964 if ((*chan)->write_source) {
1966 if (mark_write_complete) {
1967 Source::Lock lock((*chan)->write_source->mutex());
1968 (*chan)->write_source->mark_streaming_write_completed (lock);
1969 (*chan)->write_source->done_with_peakfile_writes ();
1972 if ((*chan)->write_source->removable()) {
1973 (*chan)->write_source->mark_for_remove ();
1974 (*chan)->write_source->drop_references ();
1977 (*chan)->write_source.reset ();
1980 use_new_write_source (n);
1982 if (record_enabled()) {
1983 capturing_sources.push_back ((*chan)->write_source);
1988 if ((*chan)->write_source == 0) {
1989 use_new_write_source (n);
1994 if (destructive() && !c->empty ()) {
1996 /* we now have all our write sources set up, so create the
1997 playlist's single region.
2000 if (_playlist->empty()) {
2001 setup_destructive_playlist ();
2007 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
2009 if (_session.get_block_size() > speed_buffer_size) {
2010 speed_buffer_size = _session.get_block_size();
2011 boost::shared_ptr<ChannelList> c = channels.reader();
2013 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2014 if ((*chan)->speed_buffer)
2015 delete [] (*chan)->speed_buffer;
2016 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2019 allocate_temporary_buffers ();
2023 AudioDiskstream::allocate_temporary_buffers ()
2025 /* make sure the wrap buffer is at least large enough to deal
2026 with the speeds up to 1.2, to allow for micro-variation
2027 when slaving to MTC, Timecode etc.
2030 double const sp = max (fabsf (_actual_speed), 1.2f);
2031 framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * sp) + 2;
2033 if (required_wrap_size > wrap_buffer_size) {
2035 boost::shared_ptr<ChannelList> c = channels.reader();
2037 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2038 if ((*chan)->playback_wrap_buffer) {
2039 delete [] (*chan)->playback_wrap_buffer;
2041 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2042 if ((*chan)->capture_wrap_buffer) {
2043 delete [] (*chan)->capture_wrap_buffer;
2045 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2048 wrap_buffer_size = required_wrap_size;
2053 AudioDiskstream::request_input_monitoring (bool yn)
2055 boost::shared_ptr<ChannelList> c = channels.reader();
2057 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2058 (*chan)->source.request_input_monitoring (yn);
2063 AudioDiskstream::set_align_style_from_io ()
2065 bool have_physical = false;
2067 if (_alignment_choice != Automatic) {
2075 get_input_sources ();
2077 boost::shared_ptr<ChannelList> c = channels.reader();
2079 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2080 if ((*chan)->source.is_physical ()) {
2081 have_physical = true;
2086 if (have_physical) {
2087 set_align_style (ExistingMaterial);
2089 set_align_style (CaptureTime);
2094 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2096 while (how_many--) {
2097 c->push_back (new ChannelInfo(
2098 _session.butler()->audio_diskstream_playback_buffer_size(),
2099 _session.butler()->audio_diskstream_capture_buffer_size(),
2100 speed_buffer_size, wrap_buffer_size));
2101 interpolation.add_channel_to (
2102 _session.butler()->audio_diskstream_playback_buffer_size(),
2106 _n_channels.set(DataType::AUDIO, c->size());
2112 AudioDiskstream::add_channel (uint32_t how_many)
2114 RCUWriter<ChannelList> writer (channels);
2115 boost::shared_ptr<ChannelList> c = writer.get_copy();
2117 return add_channel_to (c, how_many);
2121 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2123 while (how_many-- && !c->empty()) {
2126 interpolation.remove_channel_from ();
2129 _n_channels.set(DataType::AUDIO, c->size());
2135 AudioDiskstream::remove_channel (uint32_t how_many)
2137 RCUWriter<ChannelList> writer (channels);
2138 boost::shared_ptr<ChannelList> c = writer.get_copy();
2140 return remove_channel_from (c, how_many);
2144 AudioDiskstream::playback_buffer_load () const
2146 boost::shared_ptr<ChannelList> c = channels.reader();
2152 return (float) ((double) c->front()->playback_buf->read_space()/
2153 (double) c->front()->playback_buf->bufsize());
2157 AudioDiskstream::capture_buffer_load () const
2159 boost::shared_ptr<ChannelList> c = channels.reader();
2165 return (float) ((double) c->front()->capture_buf->write_space()/
2166 (double) c->front()->capture_buf->bufsize());
2170 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2172 const XMLProperty* prop;
2173 XMLNodeList nlist = node.children();
2174 XMLNodeIterator niter;
2175 boost::shared_ptr<AudioFileSource> fs;
2176 boost::shared_ptr<AudioFileSource> first_fs;
2177 SourceList pending_sources;
2178 framepos_t position;
2180 if ((prop = node.property (X_("at"))) == 0) {
2184 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2188 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2189 if ((*niter)->name() == X_("file")) {
2191 if ((prop = (*niter)->property (X_("path"))) == 0) {
2195 // This protects sessions from errant CapturingSources in stored sessions
2197 if (stat (prop->value().c_str(), &sbuf)) {
2201 /* XXX as of June 2014, we always record to mono
2202 files. Since this Source is being created as part of
2203 crash recovery, we know that we need the first
2204 channel (the final argument to the SourceFactory
2205 call below). If we ever support non-mono files for
2206 capture, this will need rethinking.
2210 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createForRecovery (DataType::AUDIO, _session, prop->value(), 0));
2213 catch (failed_constructor& err) {
2214 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2215 _name, prop->value())
2220 pending_sources.push_back (fs);
2222 if (first_fs == 0) {
2226 fs->set_captured_for (_name.val());
2230 if (pending_sources.size() == 0) {
2231 /* nothing can be done */
2235 if (pending_sources.size() != _n_channels.n_audio()) {
2236 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2243 boost::shared_ptr<AudioRegion> wf_region;
2244 boost::shared_ptr<AudioRegion> region;
2246 /* First create the whole file region */
2250 plist.add (Properties::start, 0);
2251 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2252 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2254 wf_region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2256 wf_region->set_automatic (true);
2257 wf_region->set_whole_file (true);
2258 wf_region->special_set_position (position);
2260 /* Now create a region that isn't the whole file for adding to
2263 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2265 _playlist->add_region (region, position);
2268 catch (failed_constructor& err) {
2269 error << string_compose (
2270 _("%1: cannot create whole-file region from pending capture sources"),
2281 AudioDiskstream::set_non_layered (bool yn)
2283 if (yn != non_layered()) {
2286 _flags = Flag (_flags | NonLayered);
2288 _flags = Flag (_flags & ~NonLayered);
2296 AudioDiskstream::set_destructive (bool yn)
2298 if (yn != destructive()) {
2301 bool bounce_ignored;
2302 /* requestor should already have checked this and
2303 bounced if necessary and desired
2305 if (!can_become_destructive (bounce_ignored)) {
2308 _flags = Flag (_flags | Destructive);
2309 use_destructive_playlist ();
2311 _flags = Flag (_flags & ~Destructive);
2312 reset_write_sources (true, true);
2320 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2323 requires_bounce = false;
2327 /* is there only one region ? */
2329 if (_playlist->n_regions() != 1) {
2330 requires_bounce = true;
2334 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2336 requires_bounce = false;
2340 /* do the source(s) for the region cover the session start position ? */
2342 if (first->position() != _session.current_start_frame()) {
2343 if (first->start() > _session.current_start_frame()) {
2344 requires_bounce = true;
2349 /* is the source used by only 1 playlist ? */
2351 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2355 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2356 requires_bounce = true;
2360 requires_bounce = false;
2365 AudioDiskstream::adjust_playback_buffering ()
2367 boost::shared_ptr<ChannelList> c = channels.reader();
2369 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2370 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2375 AudioDiskstream::adjust_capture_buffering ()
2377 boost::shared_ptr<ChannelList> c = channels.reader();
2379 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2380 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2385 AudioDiskstream::ChannelSource::is_physical () const
2391 return AudioEngine::instance()->port_is_physical (name);
2395 AudioDiskstream::ChannelSource::request_input_monitoring (bool yn) const
2401 return AudioEngine::instance()->request_input_monitoring (name, yn);
2404 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2406 current_capture_buffer = 0;
2407 current_playback_buffer = 0;
2408 curr_capture_cnt = 0;
2410 speed_buffer = new Sample[speed_size];
2411 playback_wrap_buffer = new Sample[wrap_size];
2412 capture_wrap_buffer = new Sample[wrap_size];
2414 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2415 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2416 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2418 /* touch the ringbuffer buffers, which will cause
2419 them to be mapped into locked physical RAM if
2420 we're running with mlockall(). this doesn't do
2424 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2425 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2426 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2430 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2432 delete playback_buf;
2433 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2434 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2438 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2442 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2443 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2446 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2449 if (write_source->removable()) {
2450 /* this is a "stub" write source which exists in the
2451 Session source list, but is removable. We must emit
2452 a drop references call because it should not
2453 continue to exist. If we do not do this, then the
2454 Session retains a reference to it, it is not
2455 deleted, and later attempts to create a new source
2456 file will use wierd naming because it already
2459 XXX longer term TO-DO: do not add to session source
2460 list until we write to the source.
2462 write_source->drop_references ();
2466 write_source.reset ();
2468 delete [] speed_buffer;
2471 delete [] playback_wrap_buffer;
2472 playback_wrap_buffer = 0;
2474 delete [] capture_wrap_buffer;
2475 capture_wrap_buffer = 0;
2477 delete playback_buf;
2483 delete capture_transition_buf;
2484 capture_transition_buf = 0;
2489 AudioDiskstream::set_name (string const & name)
2491 if (_name == name) {
2494 Diskstream::set_name (name);
2496 /* get a new write source so that its name reflects the new diskstream name */
2498 boost::shared_ptr<ChannelList> c = channels.reader();
2499 ChannelList::iterator i;
2502 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2503 use_new_write_source (n);
2510 AudioDiskstream::set_write_source_name (const std::string& str) {
2511 if (_write_source_name == str) {
2515 Diskstream::set_write_source_name (str);
2517 if (_write_source_name == name()) {
2520 boost::shared_ptr<ChannelList> c = channels.reader();
2521 ChannelList::iterator i;
2524 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2525 use_new_write_source (n);