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 assert(disk_io_frames() > 0);
133 _working_buffers_size = disk_io_frames();
134 _mixdown_buffer = new Sample[_working_buffers_size];
135 _gain_buffer = new gain_t[_working_buffers_size];
139 AudioDiskstream::free_working_buffers()
141 delete [] _mixdown_buffer;
142 delete [] _gain_buffer;
143 _working_buffers_size = 0;
149 AudioDiskstream::non_realtime_input_change ()
151 bool need_write_sources = false;
154 Glib::Threads::Mutex::Lock lm (state_lock);
156 if (input_change_pending.type == IOChange::NoChange) {
160 boost::shared_ptr<ChannelList> cr = channels.reader();
161 if (!cr->empty() && !cr->front()->write_source) {
162 need_write_sources = true;
165 if (input_change_pending.type == IOChange::ConfigurationChanged) {
166 RCUWriter<ChannelList> writer (channels);
167 boost::shared_ptr<ChannelList> c = writer.get_copy();
169 _n_channels.set(DataType::AUDIO, c->size());
171 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
172 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
173 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
174 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
177 need_write_sources = true;
180 if (input_change_pending.type & IOChange::ConnectionsChanged) {
181 get_input_sources ();
182 set_capture_offset ();
183 set_align_style_from_io ();
186 input_change_pending = IOChange::NoChange;
188 /* implicit unlock */
191 if (need_write_sources) {
192 reset_write_sources (false);
195 /* now refill channel buffers */
197 if (speed() != 1.0f || speed() != -1.0f) {
198 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
200 seek (_session.transport_frame());
205 AudioDiskstream::non_realtime_locate (framepos_t location)
207 /* now refill channel buffers */
209 if (speed() != 1.0f || speed() != -1.0f) {
210 seek ((framepos_t) (location * (double) speed()));
217 AudioDiskstream::get_input_sources ()
219 boost::shared_ptr<ChannelList> c = channels.reader();
222 ChannelList::iterator chan;
223 uint32_t ni = _io->n_ports().n_audio();
224 vector<string> connections;
226 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
228 connections.clear ();
230 if (_io->nth (n)->get_connections (connections) == 0) {
231 if (!(*chan)->source.name.empty()) {
232 // _source->disable_metering ();
234 (*chan)->source.name = string();
236 (*chan)->source.name = connections[0];
242 AudioDiskstream::find_and_use_playlist (const string& name)
244 boost::shared_ptr<AudioPlaylist> playlist;
246 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
247 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
251 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
255 return use_playlist (playlist);
259 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
261 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
263 Diskstream::use_playlist(playlist);
269 AudioDiskstream::use_new_playlist ()
272 boost::shared_ptr<AudioPlaylist> playlist;
274 if (!in_set_state && destructive()) {
279 newname = Playlist::bump_name (_playlist->name(), _session);
281 newname = Playlist::bump_name (_name, _session);
284 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
286 return use_playlist (playlist);
294 AudioDiskstream::use_copy_playlist ()
296 assert(audio_playlist());
302 if (_playlist == 0) {
303 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
308 boost::shared_ptr<AudioPlaylist> playlist;
310 newname = Playlist::bump_name (_playlist->name(), _session);
312 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
313 return use_playlist (playlist);
320 AudioDiskstream::setup_destructive_playlist ()
323 boost::shared_ptr<ChannelList> c = channels.reader();
325 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
326 srcs.push_back ((*chan)->write_source);
329 /* a single full-sized region */
331 assert (!srcs.empty ());
334 plist.add (Properties::name, _name.val());
335 plist.add (Properties::start, 0);
336 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
338 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
339 _playlist->add_region (region, srcs.front()->natural_position());
343 AudioDiskstream::use_destructive_playlist ()
345 /* this is called from the XML-based constructor or ::set_destructive. when called,
346 we already have a playlist and a region, but we need to
347 set up our sources for write. we use the sources associated
348 with the (presumed single, full-extent) region.
351 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
354 reset_write_sources (false, true);
358 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
361 throw failed_constructor();
364 /* be sure to stretch the region out to the maximum length */
366 region->set_length (max_framepos - region->position());
369 ChannelList::iterator chan;
370 boost::shared_ptr<ChannelList> c = channels.reader();
372 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
373 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
374 assert((*chan)->write_source);
375 (*chan)->write_source->set_allow_remove_if_empty (false);
377 /* this might be false if we switched modes, so force it */
379 (*chan)->write_source->set_destructive (true);
382 /* the source list will never be reset for a destructive track */
386 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
388 if (recordable() && destructive()) {
389 boost::shared_ptr<ChannelList> c = channels.reader();
390 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
392 RingBufferNPT<CaptureTransition>::rw_vector transitions;
393 (*chan)->capture_transition_buf->get_write_vector (&transitions);
395 if (transitions.len[0] > 0) {
396 transitions.buf[0]->type = CaptureStart;
397 transitions.buf[0]->capture_val = capture_start_frame;
398 (*chan)->capture_transition_buf->increment_write_ptr(1);
401 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
409 /** Do some record stuff [not described in this comment!]
412 * - Setup playback_distance with the nframes, or nframes adjusted
413 * for current varispeed, if appropriate.
414 * - Setup current_playback_buffer in each ChannelInfo to point to data
415 * that someone can read playback_distance worth of data from.
418 AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
421 boost::shared_ptr<ChannelList> c = channels.reader();
422 ChannelList::iterator chan;
423 framecnt_t rec_offset = 0;
424 framecnt_t rec_nframes = 0;
425 bool collect_playback = false;
426 bool can_record = _session.actively_recording ();
428 playback_distance = 0;
430 if (!_io || !_io->active()) {
434 check_record_status (transport_frame, can_record);
440 Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK);
446 adjust_capture_position = 0;
448 for (chan = c->begin(); chan != c->end(); ++chan) {
449 (*chan)->current_capture_buffer = 0;
450 (*chan)->current_playback_buffer = 0;
453 // Safeguard against situations where process() goes haywire when autopunching
454 // and last_recordable_frame < first_recordable_frame
456 if (last_recordable_frame < first_recordable_frame) {
457 last_recordable_frame = max_framepos;
460 if (record_enabled()) {
462 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
463 // XXX should this be transport_frame + nframes - 1 ? coverage() expects its parameter ranges to include their end points
464 // XXX also, first_recordable_frame & last_recordable_frame may both be == max_framepos: coverage() will return OverlapNone in that case. Is thak OK?
465 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
467 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: this time record %2 of %3 frames, offset %4\n", _name, rec_nframes, nframes, rec_offset));
469 if (rec_nframes && !was_recording) {
470 capture_captured = 0;
471 was_recording = true;
475 if (can_record && !_last_capture_sources.empty()) {
476 _last_capture_sources.clear ();
481 uint32_t limit = _io->n_ports ().n_audio();
483 /* one or more ports could already have been removed from _io, but our
484 channel setup hasn't yet been updated. prevent us from trying to
485 use channels that correspond to missing ports. note that the
486 process callback (from which this is called) is always atomic
487 with respect to port removal/addition.
490 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
492 ChannelInfo* chaninfo (*chan);
494 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
496 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
498 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
500 /* note: grab the entire port buffer, but only copy what we were supposed to
501 for recording, and use rec_offset
504 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
506 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
508 Sample *buf = bufs.get_audio (n).data(rec_offset);
509 memcpy (chaninfo->current_capture_buffer, buf, sizeof (Sample) * rec_nframes);
513 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
515 if (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;
627 /* We have enough samples, but not in one lump. Coalesce the two parts
628 into one in playback_wrap_buffer in our ChannelInfo, and specify that
629 as our current_playback_buffer.
632 assert(wrap_buffer_size >= necessary_samples);
634 /* Copy buf[0] from playback_buf */
635 memcpy ((char *) chaninfo->playback_wrap_buffer,
636 chaninfo->playback_vector.buf[0],
637 chaninfo->playback_vector.len[0] * sizeof (Sample));
639 /* Copy buf[1] from playback_buf */
640 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
641 chaninfo->playback_vector.buf[1],
642 (necessary_samples - chaninfo->playback_vector.len[0])
645 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
650 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
652 interpolation.set_speed (_target_speed);
655 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
656 ChannelInfo* chaninfo (*chan);
658 playback_distance = interpolation.interpolate (
659 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
661 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
665 playback_distance = nframes;
668 _speed = _target_speed;
671 if (need_disk_signal) {
673 /* copy data over to buffer set */
675 size_t n_buffers = bufs.count().n_audio();
676 size_t n_chans = c->size();
677 gain_t scaling = 1.0f;
679 if (n_chans > n_buffers) {
680 scaling = ((float) n_buffers)/n_chans;
683 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
685 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
686 ChannelInfo* chaninfo (*chan);
689 if (scaling != 1.0f) {
690 buf.read_from_with_gain (chaninfo->current_playback_buffer, nframes, scaling);
692 buf.read_from (chaninfo->current_playback_buffer, nframes);
695 if (scaling != 1.0f) {
696 buf.accumulate_with_gain_from (chaninfo->current_playback_buffer, nframes, scaling);
698 buf.accumulate_from (chaninfo->current_playback_buffer, nframes);
703 /* leave the MIDI count alone */
704 ChanCount cnt (DataType::AUDIO, n_chans);
705 cnt.set (DataType::MIDI, bufs.count().n_midi());
706 bufs.set_count (cnt);
708 /* extra buffers will already be silent, so leave them alone */
715 AudioDiskstream::calculate_playback_distance (pframes_t nframes)
717 frameoffset_t playback_distance = nframes;
719 if (record_enabled()) {
720 playback_distance = nframes;
721 } else if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
722 interpolation.set_speed (_target_speed);
723 boost::shared_ptr<ChannelList> c = channels.reader();
725 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
726 playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
729 playback_distance = nframes;
732 if (_actual_speed < 0.0) {
733 return -playback_distance;
735 return playback_distance;
739 /** Update various things including playback_sample, read pointer on each channel's playback_buf
740 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
741 * @return true if the butler is required.
744 AudioDiskstream::commit (framecnt_t playback_distance)
746 bool need_butler = false;
748 if (!_io || !_io->active()) {
752 if (_actual_speed < 0.0) {
753 playback_sample -= playback_distance;
755 playback_sample += playback_distance;
758 boost::shared_ptr<ChannelList> c = channels.reader();
759 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
761 (*chan)->playback_buf->increment_read_ptr (playback_distance);
763 if (adjust_capture_position) {
764 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
768 if (adjust_capture_position != 0) {
769 capture_captured += adjust_capture_position;
770 adjust_capture_position = 0;
778 if (_io && _io->active()) {
779 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
784 if (_io && _io->active()) {
785 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
786 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
788 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
796 AudioDiskstream::set_pending_overwrite (bool yn)
798 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
800 _pending_overwrite = yn;
802 overwrite_frame = playback_sample;
804 boost::shared_ptr<ChannelList> c = channels.reader ();
806 overwrite_offset = c->front()->playback_buf->get_read_ptr();
811 AudioDiskstream::overwrite_existing_buffers ()
813 boost::shared_ptr<ChannelList> c = channels.reader();
815 _pending_overwrite = false;
819 Sample* mixdown_buffer;
822 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
824 overwrite_queued = false;
826 /* assume all are the same size */
827 framecnt_t size = c->front()->playback_buf->bufsize();
829 mixdown_buffer = new Sample[size];
830 gain_buffer = new float[size];
832 /* reduce size so that we can fill the buffer correctly (ringbuffers
833 can only handle size-1, otherwise they appear to be empty)
840 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
842 start = overwrite_frame;
843 framecnt_t cnt = size;
845 /* to fill the buffer without resetting the playback sample, we need to
846 do it one or two chunks (normally two).
848 |----------------------------------------------------------------------|
852 |<- second chunk->||<----------------- first chunk ------------------>|
856 framecnt_t to_read = size - overwrite_offset;
858 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
859 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
860 id(), size, playback_sample) << endmsg;
868 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
869 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
870 id(), size, playback_sample) << endmsg;
879 _pending_overwrite = false;
880 delete [] gain_buffer;
881 delete [] mixdown_buffer;
886 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
890 ChannelList::iterator chan;
891 boost::shared_ptr<ChannelList> c = channels.reader();
893 Glib::Threads::Mutex::Lock lm (state_lock);
895 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
896 (*chan)->playback_buf->reset ();
897 (*chan)->capture_buf->reset ();
900 /* can't rec-enable in destructive mode if transport is before start */
902 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
903 disengage_record_enable ();
906 playback_sample = frame;
909 if (complete_refill) {
910 while ((ret = do_refill_with_alloc ()) > 0) ;
912 ret = do_refill_with_alloc ();
919 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
921 ChannelList::iterator chan;
922 boost::shared_ptr<ChannelList> c = channels.reader();
924 for (chan = c->begin(); chan != c->end(); ++chan) {
925 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
933 AudioDiskstream::internal_playback_seek (framecnt_t distance)
935 ChannelList::iterator chan;
936 boost::shared_ptr<ChannelList> c = channels.reader();
938 for (chan = c->begin(); chan != c->end(); ++chan) {
939 (*chan)->playback_buf->increment_read_ptr (llabs(distance));
942 if (first_recordable_frame < max_framepos) {
943 first_recordable_frame += distance;
945 playback_sample += distance;
950 /** Read some data for 1 channel from our playlist into a buffer.
951 * @param buf Buffer to write to.
952 * @param start Session frame to start reading from; updated to where we end up
954 * @param cnt Count of samples to read.
955 * @param reversed true if we are running backwards, otherwise false.
958 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
959 framepos_t& start, framecnt_t cnt,
960 int channel, bool reversed)
962 framecnt_t this_read = 0;
964 framepos_t loop_end = 0;
965 framepos_t loop_start = 0;
966 framecnt_t offset = 0;
969 /* XXX we don't currently play loops in reverse. not sure why */
973 framecnt_t loop_length = 0;
975 /* Make the use of a Location atomic for this read operation.
977 Note: Locations don't get deleted, so all we care about
978 when I say "atomic" is that we are always pointing to
979 the same one and using a start/length values obtained
983 if ((loc = loop_location) != 0) {
984 loop_start = loc->start();
985 loop_end = loc->end();
986 loop_length = loop_end - loop_start;
989 /* if we are looping, ensure that the first frame we read is at the correct
990 position within the loop.
993 if (loc && start >= loop_end) {
994 start = loop_start + ((start - loop_start) % loop_length);
1002 /* We need this while loop in case we hit a loop boundary, in which case our read from
1003 the playlist must be split into more than one section.
1008 /* take any loop into account. we can't read past the end of the loop. */
1010 if (loc && (loop_end - start < cnt)) {
1011 this_read = loop_end - start;
1018 if (this_read == 0) {
1022 this_read = min(cnt,this_read);
1024 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1025 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
1032 swap_by_ptr (buf, buf + this_read - 1);
1036 /* if we read to the end of the loop, go back to the beginning */
1046 offset += this_read;
1053 AudioDiskstream::do_refill_with_alloc ()
1055 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1056 float* gain_buf = new float[disk_io_chunk_frames];
1058 int ret = _do_refill(mix_buf, gain_buf);
1066 /** Get some more data from disk and put it in our channels' playback_bufs,
1067 * if there is suitable space in them.
1070 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1074 RingBufferNPT<Sample>::rw_vector vector;
1075 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1076 framecnt_t total_space;
1077 framecnt_t zero_fill;
1079 ChannelList::iterator i;
1080 boost::shared_ptr<ChannelList> c = channels.reader();
1087 assert(mixdown_buffer);
1088 assert(gain_buffer);
1095 c->front()->playback_buf->get_write_vector (&vector);
1097 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1098 /* nowhere to write to */
1102 /* if there are 2+ chunks of disk i/o possible for
1103 this track, let the caller know so that it can arrange
1104 for us to be called again, ASAP.
1107 if (total_space >= (_slaved ? 3 : 2) * disk_io_chunk_frames) {
1111 /* if we're running close to normal speed and there isn't enough
1112 space to do disk_io_chunk_frames of I/O, then don't bother.
1114 at higher speeds, just do it because the sync between butler
1115 and audio thread may not be good enough.
1117 Note: it is a design assumption that disk_io_chunk_frames is smaller
1118 than the playback buffer size, so this check should never trip when
1119 the playback buffer is empty.
1122 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1126 /* when slaved, don't try to get too close to the read pointer. this
1127 leaves space for the buffer reversal to have something useful to
1131 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1135 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1137 total_space = min (disk_io_chunk_frames, total_space);
1141 if (file_frame == 0) {
1143 /* at start: nothing to do but fill with silence */
1145 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1147 ChannelInfo* chan (*i);
1148 chan->playback_buf->get_write_vector (&vector);
1149 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1150 if (vector.len[1]) {
1151 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1153 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1158 if (file_frame < total_space) {
1160 /* too close to the start: read what we can,
1161 and then zero fill the rest
1164 zero_fill = total_space - file_frame;
1165 total_space = file_frame;
1174 if (file_frame == max_framepos) {
1176 /* at end: nothing to do but fill with silence */
1178 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1180 ChannelInfo* chan (*i);
1181 chan->playback_buf->get_write_vector (&vector);
1182 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1183 if (vector.len[1]) {
1184 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1186 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1191 if (file_frame > max_framepos - total_space) {
1193 /* to close to the end: read what we can, and zero fill the rest */
1195 zero_fill = total_space - (max_framepos - file_frame);
1196 total_space = max_framepos - file_frame;
1203 framepos_t file_frame_tmp = 0;
1205 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1207 ChannelInfo* chan (*i);
1210 framecnt_t len1, len2;
1212 chan->playback_buf->get_write_vector (&vector);
1214 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1216 /* we're not going to fill the first chunk, so certainly do not bother with the
1217 other part. it won't be connected with the part we do fill, as in:
1219 .... => writable space
1220 ++++ => readable space
1221 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1223 |......|+++++++++++++|...............................|
1228 So, just pretend that the buf1 part isn't there.
1238 file_frame_tmp = file_frame;
1240 buf1 = vector.buf[0];
1241 len1 = vector.len[0];
1242 buf2 = vector.buf[1];
1243 len2 = vector.len[1];
1245 to_read = min (ts, len1);
1246 to_read = min (to_read, disk_io_chunk_frames);
1248 assert (to_read >= 0);
1252 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1257 chan->playback_buf->increment_write_ptr (to_read);
1261 to_read = min (ts, len2);
1265 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1266 so read some or all of vector.len[1] as well.
1269 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1274 chan->playback_buf->increment_write_ptr (to_read);
1278 /* XXX: do something */
1283 file_frame = file_frame_tmp;
1284 assert (file_frame >= 0);
1291 /** Flush pending data to disk.
1293 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1294 * of data to disk. it will never write more than that. If it writes that
1295 * much and there is more than that waiting to be written, it will return 1,
1296 * otherwise 0 on success or -1 on failure.
1298 * If there is less than disk_io_chunk_frames to be written, no data will be
1299 * written at all unless @a force_flush is true.
1302 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1306 RingBufferNPT<Sample>::rw_vector vector;
1307 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1310 transvec.buf[0] = 0;
1311 transvec.buf[1] = 0;
1315 boost::shared_ptr<ChannelList> c = channels.reader();
1316 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1318 (*chan)->capture_buf->get_read_vector (&vector);
1320 total = vector.len[0] + vector.len[1];
1322 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1326 /* if there are 2+ chunks of disk i/o possible for
1327 this track, let the caller know so that it can arrange
1328 for us to be called again, ASAP.
1330 if we are forcing a flush, then if there is* any* extra
1331 work, let the caller know.
1333 if we are no longer recording and there is any extra work,
1334 let the caller know too.
1337 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1341 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1343 // check the transition buffer when recording destructive
1344 // important that we get this after the capture buf
1346 if (destructive()) {
1347 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1348 size_t transcount = transvec.len[0] + transvec.len[1];
1351 for (ti=0; ti < transcount; ++ti) {
1352 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1354 if (captrans.type == CaptureStart) {
1355 // by definition, the first data we got above represents the given capture pos
1357 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1358 (*chan)->curr_capture_cnt = 0;
1360 } else if (captrans.type == CaptureEnd) {
1362 // capture end, the capture_val represents total frames in capture
1364 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1366 // shorten to make the write a perfect fit
1367 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1369 if (nto_write < to_write) {
1370 ret = 1; // should we?
1372 to_write = nto_write;
1374 (*chan)->write_source->mark_capture_end ();
1376 // increment past this transition, but go no further
1381 // actually ends just beyond this chunk, so force more work
1389 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1393 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1394 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1398 (*chan)->capture_buf->increment_read_ptr (to_write);
1399 (*chan)->curr_capture_cnt += to_write;
1401 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1403 /* we wrote all of vector.len[0] but it wasn't an entire
1404 disk_io_chunk_frames of data, so arrange for some part
1405 of vector.len[1] to be flushed to disk as well.
1408 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1410 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1411 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1415 (*chan)->capture_buf->increment_read_ptr (to_write);
1416 (*chan)->curr_capture_cnt += to_write;
1425 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1427 uint32_t buffer_position;
1428 bool more_work = true;
1430 boost::shared_ptr<AudioRegion> region;
1431 framecnt_t total_capture;
1433 SourceList::iterator src;
1434 ChannelList::iterator chan;
1435 vector<CaptureInfo*>::iterator ci;
1436 boost::shared_ptr<ChannelList> c = channels.reader();
1438 bool mark_write_completed = false;
1442 /* butler is already stopped, but there may be work to do
1443 to flush remaining data to disk.
1446 while (more_work && !err) {
1447 switch (do_flush (TransportContext, true)) {
1454 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1459 /* XXX is there anything we can do if err != 0 ? */
1460 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1462 if (capture_info.empty()) {
1466 if (abort_capture) {
1468 if (destructive()) {
1472 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1474 if ((*chan)->write_source) {
1476 (*chan)->write_source->mark_for_remove ();
1477 (*chan)->write_source->drop_references ();
1478 (*chan)->write_source.reset ();
1481 /* new source set up in "out" below */
1487 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1488 total_capture += (*ci)->frames;
1491 /* figure out the name for this take */
1493 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1495 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1499 s->update_header (capture_info.front()->start, when, twhen);
1500 s->set_captured_for (_name.val());
1501 s->mark_immutable ();
1503 if (Config->get_auto_analyse_audio()) {
1504 Analyser::queue_source_for_analysis (s, true);
1509 /* destructive tracks have a single, never changing region */
1511 if (destructive()) {
1513 /* send a signal that any UI can pick up to do the right thing. there is
1514 a small problem here in that a UI may need the peak data to be ready
1515 for the data that was recorded and this isn't interlocked with that
1516 process. this problem is deferred to the UI.
1519 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1523 string whole_file_region_name;
1524 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1526 /* Register a new region with the Session that
1527 describes the entire source. Do this first
1528 so that any sub-regions will obviously be
1529 children of this one (later!)
1535 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1536 plist.add (Properties::length, total_capture);
1537 plist.add (Properties::name, whole_file_region_name);
1538 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1539 rx->set_automatic (true);
1540 rx->set_whole_file (true);
1542 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1543 region->special_set_position (capture_info.front()->start);
1547 catch (failed_constructor& err) {
1548 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1552 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1554 _playlist->clear_changes ();
1555 _playlist->set_capture_insertion_in_progress (true);
1556 _playlist->freeze ();
1558 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1562 RegionFactory::region_name (region_name, whole_file_region_name, false);
1564 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1565 _name, (*ci)->start, (*ci)->frames, region_name));
1571 plist.add (Properties::start, buffer_position);
1572 plist.add (Properties::length, (*ci)->frames);
1573 plist.add (Properties::name, region_name);
1575 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1576 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1579 catch (failed_constructor& err) {
1580 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1581 continue; /* XXX is this OK? */
1584 i_am_the_modifier++;
1586 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1587 _playlist->set_layer (region, DBL_MAX);
1588 i_am_the_modifier--;
1590 buffer_position += (*ci)->frames;
1594 _playlist->set_capture_insertion_in_progress (false);
1595 _session.add_command (new StatefulDiffCommand (_playlist));
1598 mark_write_completed = true;
1601 reset_write_sources (mark_write_completed);
1605 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1609 capture_info.clear ();
1610 capture_start_frame = 0;
1614 AudioDiskstream::transport_looped (framepos_t transport_frame)
1616 if (was_recording) {
1617 // all we need to do is finish this capture, with modified capture length
1618 boost::shared_ptr<ChannelList> c = channels.reader();
1620 // adjust the capture length knowing that the data will be recorded to disk
1621 // only necessary after the first loop where we're recording
1622 if (capture_info.size() == 0) {
1623 capture_captured += _capture_offset;
1625 if (_alignment_style == ExistingMaterial) {
1626 capture_captured += _session.worst_output_latency();
1628 capture_captured += _roll_delay;
1634 // the next region will start recording via the normal mechanism
1635 // we'll set the start position to the current transport pos
1636 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1637 capture_start_frame = transport_frame;
1638 first_recordable_frame = transport_frame; // mild lie
1639 last_recordable_frame = max_framepos;
1640 was_recording = true;
1642 if (recordable() && destructive()) {
1643 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1645 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1646 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1648 if (transvec.len[0] > 0) {
1649 transvec.buf[0]->type = CaptureStart;
1650 transvec.buf[0]->capture_val = capture_start_frame;
1651 (*chan)->capture_transition_buf->increment_write_ptr(1);
1655 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1665 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1667 was_recording = false;
1668 first_recordable_frame = max_framepos;
1669 last_recordable_frame = max_framepos;
1671 if (capture_captured == 0) {
1675 if (recordable() && destructive()) {
1676 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1678 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1679 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1681 if (transvec.len[0] > 0) {
1682 transvec.buf[0]->type = CaptureEnd;
1683 transvec.buf[0]->capture_val = capture_captured;
1684 (*chan)->capture_transition_buf->increment_write_ptr(1);
1688 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1694 CaptureInfo* ci = new CaptureInfo;
1696 ci->start = capture_start_frame;
1697 ci->frames = capture_captured;
1699 /* XXX theoretical race condition here. Need atomic exchange ?
1700 However, the circumstances when this is called right
1701 now (either on record-disable or transport_stopped)
1702 mean that no actual race exists. I think ...
1703 We now have a capture_info_lock, but it is only to be used
1704 to synchronize in the transport_stop and the capture info
1705 accessors, so that invalidation will not occur (both non-realtime).
1708 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->frames));
1710 capture_info.push_back (ci);
1711 capture_captured = 0;
1713 /* now we've finished a capture, reset first_recordable_frame for next time */
1714 first_recordable_frame = max_framepos;
1718 AudioDiskstream::set_record_enabled (bool yn)
1720 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1724 /* can't rec-enable in destructive mode if transport is before start */
1726 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1730 /* yes, i know that this not proof against race conditions, but its
1731 good enough. i think.
1734 if (record_enabled() != yn) {
1736 engage_record_enable ();
1738 disengage_record_enable ();
1741 RecordEnableChanged (); /* EMIT SIGNAL */
1746 AudioDiskstream::prep_record_enable ()
1748 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1752 /* can't rec-enable in destructive mode if transport is before start */
1754 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
1758 bool rolling = _session.transport_speed() != 0.0f;
1759 boost::shared_ptr<ChannelList> c = channels.reader();
1761 capturing_sources.clear ();
1763 if (Config->get_monitoring_model() == HardwareMonitoring) {
1765 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1766 (*chan)->source.request_input_monitoring (!(_session.config.get_auto_input() && rolling));
1767 capturing_sources.push_back ((*chan)->write_source);
1768 (*chan)->write_source->mark_streaming_write_started ();
1772 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1773 capturing_sources.push_back ((*chan)->write_source);
1774 (*chan)->write_source->mark_streaming_write_started ();
1782 AudioDiskstream::prep_record_disable ()
1784 boost::shared_ptr<ChannelList> c = channels.reader();
1785 if (Config->get_monitoring_model() == HardwareMonitoring) {
1786 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1787 (*chan)->source.request_input_monitoring (false);
1790 capturing_sources.clear ();
1796 AudioDiskstream::get_state ()
1798 XMLNode& node (Diskstream::get_state());
1800 LocaleGuard lg (X_("POSIX"));
1802 boost::shared_ptr<ChannelList> c = channels.reader();
1803 snprintf (buf, sizeof(buf), "%u", (unsigned int) c->size());
1804 node.add_property ("channels", buf);
1806 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1808 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1809 XMLNode* cs_grandchild;
1811 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1812 cs_grandchild = new XMLNode (X_("file"));
1813 cs_grandchild->add_property (X_("path"), (*i)->path());
1814 cs_child->add_child_nocopy (*cs_grandchild);
1817 /* store the location where capture will start */
1821 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1822 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1824 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1827 cs_child->add_property (X_("at"), buf);
1828 node.add_child_nocopy (*cs_child);
1835 AudioDiskstream::set_state (const XMLNode& node, int version)
1837 const XMLProperty* prop;
1838 XMLNodeList nlist = node.children();
1839 XMLNodeIterator niter;
1840 uint32_t nchans = 1;
1841 XMLNode* capture_pending_node = 0;
1842 LocaleGuard lg (X_("POSIX"));
1844 /* prevent write sources from being created */
1846 in_set_state = true;
1848 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1849 if ((*niter)->name() == IO::state_node_name) {
1850 deprecated_io_node = new XMLNode (**niter);
1853 if ((*niter)->name() == X_("CapturingSources")) {
1854 capture_pending_node = *niter;
1858 if (Diskstream::set_state (node, version)) {
1862 if ((prop = node.property ("channels")) != 0) {
1863 nchans = atoi (prop->value().c_str());
1866 // create necessary extra channels
1867 // we are always constructed with one and we always need one
1869 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1871 if (nchans > _n_channels.n_audio()) {
1873 add_channel (nchans - _n_channels.n_audio());
1874 IO::PortCountChanged(_n_channels);
1876 } else if (nchans < _n_channels.n_audio()) {
1878 remove_channel (_n_channels.n_audio() - nchans);
1883 if (!destructive() && capture_pending_node) {
1884 /* destructive streams have one and only one source per channel,
1885 and so they never end up in pending capture in any useful
1888 use_pending_capture_data (*capture_pending_node);
1891 in_set_state = false;
1893 /* make sure this is clear before we do anything else */
1895 capturing_sources.clear ();
1897 /* write sources are handled when we handle the input set
1898 up of the IO that owns this DS (::non_realtime_input_change())
1905 AudioDiskstream::use_new_write_source (uint32_t n)
1907 boost::shared_ptr<ChannelList> c = channels.reader();
1909 if (!recordable()) {
1913 if (n >= c->size()) {
1914 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1918 ChannelInfo* chan = (*c)[n];
1921 if ((chan->write_source = _session.create_audio_source_for_session (
1922 n_channels().n_audio(), write_source_name(), n, destructive())) == 0) {
1923 throw failed_constructor();
1927 catch (failed_constructor &err) {
1928 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1929 chan->write_source.reset ();
1933 /* do not remove destructive files even if they are empty */
1935 chan->write_source->set_allow_remove_if_empty (!destructive());
1941 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1943 ChannelList::iterator chan;
1944 boost::shared_ptr<ChannelList> c = channels.reader();
1947 if (!_session.writable() || !recordable()) {
1951 capturing_sources.clear ();
1953 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1955 if (!destructive()) {
1957 if ((*chan)->write_source) {
1959 if (mark_write_complete) {
1960 (*chan)->write_source->mark_streaming_write_completed ();
1961 (*chan)->write_source->done_with_peakfile_writes ();
1964 if ((*chan)->write_source->removable()) {
1965 (*chan)->write_source->mark_for_remove ();
1966 (*chan)->write_source->drop_references ();
1969 (*chan)->write_source.reset ();
1972 use_new_write_source (n);
1974 if (record_enabled()) {
1975 capturing_sources.push_back ((*chan)->write_source);
1980 if ((*chan)->write_source == 0) {
1981 use_new_write_source (n);
1986 if (destructive() && !c->empty ()) {
1988 /* we now have all our write sources set up, so create the
1989 playlist's single region.
1992 if (_playlist->empty()) {
1993 setup_destructive_playlist ();
1999 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
2001 if (_session.get_block_size() > speed_buffer_size) {
2002 speed_buffer_size = _session.get_block_size();
2003 boost::shared_ptr<ChannelList> c = channels.reader();
2005 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2006 if ((*chan)->speed_buffer)
2007 delete [] (*chan)->speed_buffer;
2008 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2011 allocate_temporary_buffers ();
2015 AudioDiskstream::allocate_temporary_buffers ()
2017 /* make sure the wrap buffer is at least large enough to deal
2018 with the speeds up to 1.2, to allow for micro-variation
2019 when slaving to MTC, Timecode etc.
2022 double const sp = max (fabsf (_actual_speed), 1.2f);
2023 framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * sp) + 2;
2025 if (required_wrap_size > wrap_buffer_size) {
2027 boost::shared_ptr<ChannelList> c = channels.reader();
2029 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2030 if ((*chan)->playback_wrap_buffer) {
2031 delete [] (*chan)->playback_wrap_buffer;
2033 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2034 if ((*chan)->capture_wrap_buffer) {
2035 delete [] (*chan)->capture_wrap_buffer;
2037 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2040 wrap_buffer_size = required_wrap_size;
2045 AudioDiskstream::request_input_monitoring (bool yn)
2047 boost::shared_ptr<ChannelList> c = channels.reader();
2049 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2050 (*chan)->source.request_input_monitoring (yn);
2055 AudioDiskstream::set_align_style_from_io ()
2057 bool have_physical = false;
2059 if (_alignment_choice != Automatic) {
2067 get_input_sources ();
2069 boost::shared_ptr<ChannelList> c = channels.reader();
2071 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2072 if ((*chan)->source.is_physical ()) {
2073 have_physical = true;
2078 if (have_physical) {
2079 set_align_style (ExistingMaterial);
2081 set_align_style (CaptureTime);
2086 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2088 while (how_many--) {
2089 c->push_back (new ChannelInfo(
2090 _session.butler()->audio_diskstream_playback_buffer_size(),
2091 _session.butler()->audio_diskstream_capture_buffer_size(),
2092 speed_buffer_size, wrap_buffer_size));
2093 interpolation.add_channel_to (
2094 _session.butler()->audio_diskstream_playback_buffer_size(),
2098 _n_channels.set(DataType::AUDIO, c->size());
2104 AudioDiskstream::add_channel (uint32_t how_many)
2106 RCUWriter<ChannelList> writer (channels);
2107 boost::shared_ptr<ChannelList> c = writer.get_copy();
2109 return add_channel_to (c, how_many);
2113 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2115 while (how_many-- && !c->empty()) {
2118 interpolation.remove_channel_from ();
2121 _n_channels.set(DataType::AUDIO, c->size());
2127 AudioDiskstream::remove_channel (uint32_t how_many)
2129 RCUWriter<ChannelList> writer (channels);
2130 boost::shared_ptr<ChannelList> c = writer.get_copy();
2132 return remove_channel_from (c, how_many);
2136 AudioDiskstream::playback_buffer_load () const
2138 boost::shared_ptr<ChannelList> c = channels.reader();
2144 return (float) ((double) c->front()->playback_buf->read_space()/
2145 (double) c->front()->playback_buf->bufsize());
2149 AudioDiskstream::capture_buffer_load () const
2151 boost::shared_ptr<ChannelList> c = channels.reader();
2157 return (float) ((double) c->front()->capture_buf->write_space()/
2158 (double) c->front()->capture_buf->bufsize());
2162 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2164 const XMLProperty* prop;
2165 XMLNodeList nlist = node.children();
2166 XMLNodeIterator niter;
2167 boost::shared_ptr<AudioFileSource> fs;
2168 boost::shared_ptr<AudioFileSource> first_fs;
2169 SourceList pending_sources;
2170 framepos_t position;
2172 if ((prop = node.property (X_("at"))) == 0) {
2176 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2180 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2181 if ((*niter)->name() == X_("file")) {
2183 if ((prop = (*niter)->property (X_("path"))) == 0) {
2187 // This protects sessions from errant CapturingSources in stored sessions
2189 if (stat (prop->value().c_str(), &sbuf)) {
2193 /* XXX as of June 2014, we always record to mono
2194 files. Since this Source is being created as part of
2195 crash recovery, we know that we need the first
2196 channel (the final argument to the SourceFactory
2197 call below). If we ever support non-mono files for
2198 capture, this will need rethinking.
2202 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createForRecovery (DataType::AUDIO, _session, prop->value(), 0));
2205 catch (failed_constructor& err) {
2206 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2207 _name, prop->value())
2212 pending_sources.push_back (fs);
2214 if (first_fs == 0) {
2218 fs->set_captured_for (_name.val());
2222 if (pending_sources.size() == 0) {
2223 /* nothing can be done */
2227 if (pending_sources.size() != _n_channels.n_audio()) {
2228 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2235 boost::shared_ptr<AudioRegion> wf_region;
2236 boost::shared_ptr<AudioRegion> region;
2238 /* First create the whole file region */
2242 plist.add (Properties::start, 0);
2243 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2244 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2246 wf_region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2248 wf_region->set_automatic (true);
2249 wf_region->set_whole_file (true);
2250 wf_region->special_set_position (position);
2252 /* Now create a region that isn't the whole file for adding to
2255 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2257 _playlist->add_region (region, position);
2260 catch (failed_constructor& err) {
2261 error << string_compose (
2262 _("%1: cannot create whole-file region from pending capture sources"),
2273 AudioDiskstream::set_non_layered (bool yn)
2275 if (yn != non_layered()) {
2278 _flags = Flag (_flags | NonLayered);
2280 _flags = Flag (_flags & ~NonLayered);
2288 AudioDiskstream::set_destructive (bool yn)
2290 if (yn != destructive()) {
2293 bool bounce_ignored;
2294 /* requestor should already have checked this and
2295 bounced if necessary and desired
2297 if (!can_become_destructive (bounce_ignored)) {
2300 _flags = Flag (_flags | Destructive);
2301 use_destructive_playlist ();
2303 _flags = Flag (_flags & ~Destructive);
2304 reset_write_sources (true, true);
2312 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2315 requires_bounce = false;
2319 /* is there only one region ? */
2321 if (_playlist->n_regions() != 1) {
2322 requires_bounce = true;
2326 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2328 requires_bounce = false;
2332 /* do the source(s) for the region cover the session start position ? */
2334 if (first->position() != _session.current_start_frame()) {
2335 if (first->start() > _session.current_start_frame()) {
2336 requires_bounce = true;
2341 /* is the source used by only 1 playlist ? */
2343 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2347 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2348 requires_bounce = true;
2352 requires_bounce = false;
2357 AudioDiskstream::adjust_playback_buffering ()
2359 boost::shared_ptr<ChannelList> c = channels.reader();
2361 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2362 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2367 AudioDiskstream::adjust_capture_buffering ()
2369 boost::shared_ptr<ChannelList> c = channels.reader();
2371 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2372 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2377 AudioDiskstream::ChannelSource::is_physical () const
2383 return AudioEngine::instance()->port_is_physical (name);
2387 AudioDiskstream::ChannelSource::request_input_monitoring (bool yn) const
2393 return AudioEngine::instance()->request_input_monitoring (name, yn);
2396 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2398 current_capture_buffer = 0;
2399 current_playback_buffer = 0;
2400 curr_capture_cnt = 0;
2402 speed_buffer = new Sample[speed_size];
2403 playback_wrap_buffer = new Sample[wrap_size];
2404 capture_wrap_buffer = new Sample[wrap_size];
2406 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2407 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2408 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2410 /* touch the ringbuffer buffers, which will cause
2411 them to be mapped into locked physical RAM if
2412 we're running with mlockall(). this doesn't do
2416 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2417 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2418 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2422 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2424 delete playback_buf;
2425 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2426 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2430 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2434 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2435 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2438 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2440 write_source.reset ();
2442 delete [] speed_buffer;
2445 delete [] playback_wrap_buffer;
2446 playback_wrap_buffer = 0;
2448 delete [] capture_wrap_buffer;
2449 capture_wrap_buffer = 0;
2451 delete playback_buf;
2457 delete capture_transition_buf;
2458 capture_transition_buf = 0;
2463 AudioDiskstream::set_name (string const & name)
2465 if (_name == name) {
2468 Diskstream::set_name (name);
2470 /* get a new write source so that its name reflects the new diskstream name */
2472 boost::shared_ptr<ChannelList> c = channels.reader();
2473 ChannelList::iterator i;
2476 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2477 use_new_write_source (n);
2484 AudioDiskstream::set_write_source_name (const std::string& str) {
2485 if (_write_source_name == str) {
2489 Diskstream::set_write_source_name (str);
2491 if (_write_source_name == name()) {
2494 boost::shared_ptr<ChannelList> c = channels.reader();
2495 ChannelList::iterator i;
2498 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2499 use_new_write_source (n);