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.
33 #include "pbd/error.h"
34 #include "pbd/xml++.h"
35 #include "pbd/memento_command.h"
36 #include "pbd/enumwriter.h"
37 #include "pbd/stateful_diff_command.h"
39 #include "ardour/analyser.h"
40 #include "ardour/ardour.h"
41 #include "ardour/audio_buffer.h"
42 #include "ardour/audio_diskstream.h"
43 #include "ardour/audio_port.h"
44 #include "ardour/audioengine.h"
45 #include "ardour/audiofilesource.h"
47 #include "ardour/audioplaylist.h"
48 #include "ardour/audioregion.h"
49 #include "ardour/butler.h"
50 #include "ardour/configuration.h"
51 #include "ardour/cycle_timer.h"
52 #include "ardour/debug.h"
53 #include "ardour/io.h"
54 #include "ardour/playlist_factory.h"
55 #include "ardour/region_factory.h"
56 #include "ardour/send.h"
57 #include "ardour/session.h"
58 #include "ardour/source_factory.h"
59 #include "ardour/utils.h"
60 #include "ardour/session_playlists.h"
61 #include "ardour/route.h"
67 using namespace ARDOUR;
70 size_t AudioDiskstream::_working_buffers_size = 0;
71 Sample* AudioDiskstream::_mixdown_buffer = 0;
72 gain_t* AudioDiskstream::_gain_buffer = 0;
74 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
75 : Diskstream(sess, name, flag)
76 , channels (new ChannelList)
78 /* prevent any write sources from being created */
85 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
86 : Diskstream(sess, node)
87 , channels (new ChannelList)
92 if (set_state (node, Stateful::loading_state_version)) {
94 throw failed_constructor();
100 use_destructive_playlist ();
105 AudioDiskstream::init ()
107 /* there are no channels at this point, so these
108 two calls just get speed_buffer_size and wrap_buffer
109 size setup without duplicating their code.
112 set_block_size (_session.get_block_size());
113 allocate_temporary_buffers ();
116 AudioDiskstream::~AudioDiskstream ()
118 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
121 RCUWriter<ChannelList> writer (channels);
122 boost::shared_ptr<ChannelList> c = writer.get_copy();
124 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
135 AudioDiskstream::allocate_working_buffers()
137 assert(disk_io_frames() > 0);
139 _working_buffers_size = disk_io_frames();
140 _mixdown_buffer = new Sample[_working_buffers_size];
141 _gain_buffer = new gain_t[_working_buffers_size];
145 AudioDiskstream::free_working_buffers()
147 delete [] _mixdown_buffer;
148 delete [] _gain_buffer;
149 _working_buffers_size = 0;
155 AudioDiskstream::non_realtime_input_change ()
158 Glib::Mutex::Lock lm (state_lock);
160 if (input_change_pending.type == IOChange::NoChange) {
164 if (input_change_pending.type == IOChange::ConfigurationChanged) {
165 RCUWriter<ChannelList> writer (channels);
166 boost::shared_ptr<ChannelList> c = writer.get_copy();
168 _n_channels.set(DataType::AUDIO, c->size());
170 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
171 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
172 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
173 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
177 if (input_change_pending.type & IOChange::ConnectionsChanged) {
178 get_input_sources ();
179 set_capture_offset ();
180 set_align_style_from_io ();
183 input_change_pending = IOChange::NoChange;
185 /* implicit unlock */
188 /* reset capture files */
190 reset_write_sources (false);
192 /* now refill channel buffers */
194 if (speed() != 1.0f || speed() != -1.0f) {
195 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
197 seek (_session.transport_frame());
202 AudioDiskstream::non_realtime_locate (framepos_t location)
204 /* now refill channel buffers */
206 if (speed() != 1.0f || speed() != -1.0f) {
207 seek ((framepos_t) (location * (double) speed()));
214 AudioDiskstream::get_input_sources ()
216 boost::shared_ptr<ChannelList> c = channels.reader();
219 ChannelList::iterator chan;
220 uint32_t ni = _io->n_ports().n_audio();
221 vector<string> connections;
223 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
225 connections.clear ();
227 if (_io->nth (n)->get_connections (connections) == 0) {
228 if (!(*chan)->source.name.empty()) {
229 // _source->disable_metering ();
231 (*chan)->source.name = string();
233 (*chan)->source.name = connections[0];
239 AudioDiskstream::find_and_use_playlist (const string& name)
241 boost::shared_ptr<AudioPlaylist> playlist;
243 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
244 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
248 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
252 return use_playlist (playlist);
256 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
258 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
260 Diskstream::use_playlist(playlist);
266 AudioDiskstream::use_new_playlist ()
269 boost::shared_ptr<AudioPlaylist> playlist;
271 if (!in_set_state && destructive()) {
276 newname = Playlist::bump_name (_playlist->name(), _session);
278 newname = Playlist::bump_name (_name, _session);
281 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
283 playlist->set_orig_diskstream_id (id());
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 playlist->set_orig_diskstream_id (id());
312 return use_playlist (playlist);
319 AudioDiskstream::setup_destructive_playlist ()
322 boost::shared_ptr<ChannelList> c = channels.reader();
324 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
325 srcs.push_back ((*chan)->write_source);
328 /* a single full-sized region */
330 assert (!srcs.empty ());
333 plist.add (Properties::name, _name.val());
334 plist.add (Properties::start, 0);
335 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
337 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
338 _playlist->add_region (region, srcs.front()->natural_position());
342 AudioDiskstream::use_destructive_playlist ()
344 /* this is called from the XML-based constructor or ::set_destructive. when called,
345 we already have a playlist and a region, but we need to
346 set up our sources for write. we use the sources associated
347 with the (presumed single, full-extent) region.
350 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
353 reset_write_sources (false, true);
357 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
360 throw failed_constructor();
363 /* be sure to stretch the region out to the maximum length */
365 region->set_length (max_framepos - region->position());
368 ChannelList::iterator chan;
369 boost::shared_ptr<ChannelList> c = channels.reader();
371 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
372 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
373 assert((*chan)->write_source);
374 (*chan)->write_source->set_allow_remove_if_empty (false);
376 /* this might be false if we switched modes, so force it */
378 (*chan)->write_source->set_destructive (true);
381 /* the source list will never be reset for a destructive track */
385 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
387 if (recordable() && destructive()) {
388 boost::shared_ptr<ChannelList> c = channels.reader();
389 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
391 RingBufferNPT<CaptureTransition>::rw_vector transitions;
392 (*chan)->capture_transition_buf->get_write_vector (&transitions);
394 if (transitions.len[0] > 0) {
395 transitions.buf[0]->type = CaptureStart;
396 transitions.buf[0]->capture_val = capture_start_frame;
397 (*chan)->capture_transition_buf->increment_write_ptr(1);
400 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
408 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool& need_butler)
411 boost::shared_ptr<ChannelList> c = channels.reader();
412 ChannelList::iterator chan;
414 framecnt_t rec_offset = 0;
415 framecnt_t rec_nframes = 0;
416 bool collect_playback = false;
418 playback_distance = 0;
420 if (!_io || !_io->active()) {
424 check_record_status (transport_frame, can_record);
430 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
436 adjust_capture_position = 0;
438 for (chan = c->begin(); chan != c->end(); ++chan) {
439 (*chan)->current_capture_buffer = 0;
440 (*chan)->current_playback_buffer = 0;
443 // Safeguard against situations where process() goes haywire when autopunching
444 // and last_recordable_frame < first_recordable_frame
446 if (last_recordable_frame < first_recordable_frame) {
447 last_recordable_frame = max_framepos;
450 if (record_enabled()) {
452 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
453 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
455 if (rec_nframes && !was_recording) {
456 capture_captured = 0;
457 was_recording = true;
461 if (can_record && !_last_capture_sources.empty()) {
462 _last_capture_sources.clear ();
467 uint32_t limit = _io->n_ports ().n_audio();
469 /* one or more ports could already have been removed from _io, but our
470 channel setup hasn't yet been updated. prevent us from trying to
471 use channels that correspond to missing ports. note that the
472 process callback (from which this is called) is always atomic
473 with respect to port removal/addition.
476 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
478 ChannelInfo* chaninfo (*chan);
480 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
482 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
484 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
486 /* note: grab the entire port buffer, but only copy what we were supposed to
487 for recording, and use rec_offset
490 AudioPort* const ap = _io->audio (n);
492 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
494 Sample *bbuf = ap->get_audio_buffer (nframes).data(rec_offset);
497 for (jack_nframes_t _xx = 0; _xx != rec_nframes; ++_xx) {
498 if (bbuf[_xx] != 0.0) {
499 cerr << name() << " @ " << transport_frame << " + " << _xx << " = " << bbuf[_xx]
506 memcpy (chaninfo->current_capture_buffer, bbuf, sizeof (Sample) * rec_nframes);
511 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
513 if (rec_nframes > total) {
518 AudioPort* const ap = _io->audio (n);
521 Sample* buf = ap->get_audio_buffer(nframes).data();
522 framecnt_t first = chaninfo->capture_vector.len[0];
524 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
525 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
526 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
527 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
529 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
543 /* data will be written to disk */
545 if (rec_nframes == nframes && rec_offset == 0) {
547 for (chan = c->begin(); chan != c->end(); ++chan) {
548 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
551 playback_distance = nframes;
556 /* we can't use the capture buffer as the playback buffer, because
557 we recorded only a part of the current process' cycle data
561 collect_playback = true;
564 adjust_capture_position = rec_nframes;
566 } else if (can_record && record_enabled()) {
568 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
570 for (chan = c->begin(); chan != c->end(); ++chan) {
571 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
574 playback_distance = nframes;
578 collect_playback = true;
581 if (collect_playback) {
583 /* we're doing playback */
585 framecnt_t necessary_samples;
587 /* no varispeed playback if we're recording, because the output .... TBD */
589 if (rec_nframes == 0 && _actual_speed != 1.0f) {
590 necessary_samples = (framecnt_t) floor ((nframes * fabs (_actual_speed))) + 1;
592 necessary_samples = nframes;
595 for (chan = c->begin(); chan != c->end(); ++chan) {
596 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
601 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
603 ChannelInfo* chaninfo (*chan);
605 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
607 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
610 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
612 if (necessary_samples > total) {
613 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
614 cerr << "underrun for " << _name << endl;
620 memcpy ((char *) chaninfo->playback_wrap_buffer,
621 chaninfo->playback_vector.buf[0],
622 chaninfo->playback_vector.len[0] * sizeof (Sample));
623 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
624 chaninfo->playback_vector.buf[1],
625 (necessary_samples - chaninfo->playback_vector.len[0])
628 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
633 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
634 process_varispeed_playback(nframes, c);
636 playback_distance = nframes;
639 _speed = _target_speed;
645 if (commit (nframes)) {
654 AudioDiskstream::process_varispeed_playback (pframes_t nframes, boost::shared_ptr<ChannelList> c)
656 ChannelList::iterator chan;
658 interpolation.set_speed (_target_speed);
661 for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
662 ChannelInfo* chaninfo (*chan);
664 playback_distance = interpolation.interpolate (
665 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
667 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
672 AudioDiskstream::commit (framecnt_t /* nframes */)
674 bool need_butler = false;
676 if (!_io || !_io->active()) {
680 if (_actual_speed < 0.0) {
681 playback_sample -= playback_distance;
683 playback_sample += playback_distance;
686 boost::shared_ptr<ChannelList> c = channels.reader();
687 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
689 (*chan)->playback_buf->increment_read_ptr (playback_distance);
691 if (adjust_capture_position) {
692 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
696 if (adjust_capture_position != 0) {
697 capture_captured += adjust_capture_position;
698 adjust_capture_position = 0;
706 if (_io && _io->active()) {
707 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
712 if (_io && _io->active()) {
713 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
714 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
716 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
724 AudioDiskstream::set_pending_overwrite (bool yn)
726 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
728 _pending_overwrite = yn;
730 overwrite_frame = playback_sample;
732 boost::shared_ptr<ChannelList> c = channels.reader ();
734 overwrite_offset = c->front()->playback_buf->get_read_ptr();
739 AudioDiskstream::overwrite_existing_buffers ()
741 boost::shared_ptr<ChannelList> c = channels.reader();
743 _pending_overwrite = false;
747 Sample* mixdown_buffer;
750 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
752 overwrite_queued = false;
754 /* assume all are the same size */
755 framecnt_t size = c->front()->playback_buf->bufsize();
757 mixdown_buffer = new Sample[size];
758 gain_buffer = new float[size];
760 /* reduce size so that we can fill the buffer correctly (ringbuffers
761 can only handle size-1, otherwise they appear to be empty)
768 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
770 start = overwrite_frame;
771 framecnt_t cnt = size;
773 /* to fill the buffer without resetting the playback sample, we need to
774 do it one or two chunks (normally two).
776 |----------------------------------------------------------------------|
780 |<- second chunk->||<----------------- first chunk ------------------>|
784 framecnt_t to_read = size - overwrite_offset;
786 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
787 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
788 _id, size, playback_sample) << endmsg;
796 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
797 start, cnt, *chan, n, reversed)) {
798 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
799 _id, size, playback_sample) << endmsg;
808 _pending_overwrite = false;
809 delete [] gain_buffer;
810 delete [] mixdown_buffer;
815 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
819 ChannelList::iterator chan;
820 boost::shared_ptr<ChannelList> c = channels.reader();
822 Glib::Mutex::Lock lm (state_lock);
824 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
825 (*chan)->playback_buf->reset ();
826 (*chan)->capture_buf->reset ();
829 /* can't rec-enable in destructive mode if transport is before start */
831 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
832 disengage_record_enable ();
835 playback_sample = frame;
838 if (complete_refill) {
839 while ((ret = do_refill_with_alloc ()) > 0) ;
841 ret = do_refill_with_alloc ();
848 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
850 ChannelList::iterator chan;
851 boost::shared_ptr<ChannelList> c = channels.reader();
853 for (chan = c->begin(); chan != c->end(); ++chan) {
854 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
862 AudioDiskstream::internal_playback_seek (framecnt_t distance)
864 ChannelList::iterator chan;
865 boost::shared_ptr<ChannelList> c = channels.reader();
867 for (chan = c->begin(); chan != c->end(); ++chan) {
868 (*chan)->playback_buf->increment_read_ptr (distance);
871 if (first_recordable_frame < max_framepos) {
872 first_recordable_frame += distance;
874 playback_sample += distance;
880 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
881 framepos_t& start, framecnt_t cnt,
882 ChannelInfo* /*channel_info*/, int channel, bool reversed)
884 framecnt_t this_read = 0;
886 framepos_t loop_end = 0;
887 framepos_t loop_start = 0;
888 framecnt_t offset = 0;
891 /* XXX we don't currently play loops in reverse. not sure why */
895 framecnt_t loop_length = 0;
897 /* Make the use of a Location atomic for this read operation.
899 Note: Locations don't get deleted, so all we care about
900 when I say "atomic" is that we are always pointing to
901 the same one and using a start/length values obtained
905 if ((loc = loop_location) != 0) {
906 loop_start = loc->start();
907 loop_end = loc->end();
908 loop_length = loop_end - loop_start;
911 /* if we are looping, ensure that the first frame we read is at the correct
912 position within the loop.
915 if (loc && start >= loop_end) {
916 //cerr << "start adjusted from " << start;
917 start = loop_start + ((start - loop_start) % loop_length);
918 //cerr << "to " << start << endl;
921 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
930 /* take any loop into account. we can't read past the end of the loop. */
932 if (loc && (loop_end - start < cnt)) {
933 this_read = loop_end - start;
934 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
941 if (this_read == 0) {
945 this_read = min(cnt,this_read);
947 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
948 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
953 _read_data_count = _playlist->read_data_count();
957 swap_by_ptr (buf, buf + this_read - 1);
961 /* if we read to the end of the loop, go back to the beginning */
978 AudioDiskstream::do_refill_with_alloc ()
980 Sample* mix_buf = new Sample[disk_io_chunk_frames];
981 float* gain_buf = new float[disk_io_chunk_frames];
983 int ret = _do_refill(mix_buf, gain_buf);
992 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
996 RingBufferNPT<Sample>::rw_vector vector;
997 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
998 framecnt_t total_space;
999 framecnt_t zero_fill;
1001 ChannelList::iterator i;
1002 boost::shared_ptr<ChannelList> c = channels.reader();
1009 assert(mixdown_buffer);
1010 assert(gain_buffer);
1017 c->front()->playback_buf->get_write_vector (&vector);
1019 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1023 /* if there are 2+ chunks of disk i/o possible for
1024 this track, let the caller know so that it can arrange
1025 for us to be called again, ASAP.
1028 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1032 /* if we're running close to normal speed and there isn't enough
1033 space to do disk_io_chunk_frames of I/O, then don't bother.
1035 at higher speeds, just do it because the sync between butler
1036 and audio thread may not be good enough.
1038 Note: it is a design assumption that disk_io_chunk_frames is smaller
1039 than the playback buffer size, so this check should never trip when
1040 the playback buffer is empty.
1043 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1047 /* when slaved, don't try to get too close to the read pointer. this
1048 leaves space for the buffer reversal to have something useful to
1052 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1056 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1058 total_space = min (disk_io_chunk_frames, total_space);
1062 if (file_frame == 0) {
1064 /* at start: nothing to do but fill with silence */
1066 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1068 ChannelInfo* chan (*i);
1069 chan->playback_buf->get_write_vector (&vector);
1070 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1071 if (vector.len[1]) {
1072 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1074 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1079 if (file_frame < total_space) {
1081 /* too close to the start: read what we can,
1082 and then zero fill the rest
1085 zero_fill = total_space - file_frame;
1086 total_space = file_frame;
1095 if (file_frame == max_framepos) {
1097 /* at end: nothing to do but fill with silence */
1099 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1101 ChannelInfo* chan (*i);
1102 chan->playback_buf->get_write_vector (&vector);
1103 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1104 if (vector.len[1]) {
1105 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1107 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1112 if (file_frame > max_framepos - total_space) {
1114 /* to close to the end: read what we can, and zero fill the rest */
1116 zero_fill = total_space - (max_framepos - file_frame);
1117 total_space = max_framepos - file_frame;
1124 framepos_t file_frame_tmp = 0;
1126 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1128 ChannelInfo* chan (*i);
1131 framecnt_t len1, len2;
1133 chan->playback_buf->get_write_vector (&vector);
1135 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1137 /* we're not going to fill the first chunk, so certainly do not bother with the
1138 other part. it won't be connected with the part we do fill, as in:
1140 .... => writable space
1141 ++++ => readable space
1142 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1144 |......|+++++++++++++|...............................|
1149 So, just pretend that the buf1 part isn't there.
1159 file_frame_tmp = file_frame;
1161 buf1 = vector.buf[0];
1162 len1 = vector.len[0];
1163 buf2 = vector.buf[1];
1164 len2 = vector.len[1];
1166 to_read = min (ts, len1);
1167 to_read = min (to_read, disk_io_chunk_frames);
1169 assert (to_read >= 0);
1173 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1178 chan->playback_buf->increment_write_ptr (to_read);
1182 to_read = min (ts, len2);
1186 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1187 so read some or all of vector.len[1] as well.
1190 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1195 chan->playback_buf->increment_write_ptr (to_read);
1204 file_frame = file_frame_tmp;
1205 assert (file_frame >= 0);
1212 /** Flush pending data to disk.
1214 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1215 * of data to disk. it will never write more than that. If it writes that
1216 * much and there is more than that waiting to be written, it will return 1,
1217 * otherwise 0 on success or -1 on failure.
1219 * If there is less than disk_io_chunk_frames to be written, no data will be
1220 * written at all unless @a force_flush is true.
1223 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1227 RingBufferNPT<Sample>::rw_vector vector;
1228 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1231 _write_data_count = 0;
1233 transvec.buf[0] = 0;
1234 transvec.buf[1] = 0;
1238 boost::shared_ptr<ChannelList> c = channels.reader();
1239 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1241 (*chan)->capture_buf->get_read_vector (&vector);
1243 total = vector.len[0] + vector.len[1];
1245 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1249 /* if there are 2+ chunks of disk i/o possible for
1250 this track, let the caller know so that it can arrange
1251 for us to be called again, ASAP.
1253 if we are forcing a flush, then if there is* any* extra
1254 work, let the caller know.
1256 if we are no longer recording and there is any extra work,
1257 let the caller know too.
1260 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1264 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1266 // check the transition buffer when recording destructive
1267 // important that we get this after the capture buf
1269 if (destructive()) {
1270 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1271 size_t transcount = transvec.len[0] + transvec.len[1];
1274 for (ti=0; ti < transcount; ++ti) {
1275 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1277 if (captrans.type == CaptureStart) {
1278 // by definition, the first data we got above represents the given capture pos
1280 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1281 (*chan)->curr_capture_cnt = 0;
1283 } else if (captrans.type == CaptureEnd) {
1285 // capture end, the capture_val represents total frames in capture
1287 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1289 // shorten to make the write a perfect fit
1290 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1292 if (nto_write < to_write) {
1293 ret = 1; // should we?
1295 to_write = nto_write;
1297 (*chan)->write_source->mark_capture_end ();
1299 // increment past this transition, but go no further
1304 // actually ends just beyond this chunk, so force more work
1312 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1316 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1317 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1321 (*chan)->capture_buf->increment_read_ptr (to_write);
1322 (*chan)->curr_capture_cnt += to_write;
1324 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1326 /* we wrote all of vector.len[0] but it wasn't an entire
1327 disk_io_chunk_frames of data, so arrange for some part
1328 of vector.len[1] to be flushed to disk as well.
1331 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1333 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1334 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1338 _write_data_count += (*chan)->write_source->write_data_count();
1340 (*chan)->capture_buf->increment_read_ptr (to_write);
1341 (*chan)->curr_capture_cnt += to_write;
1350 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1352 uint32_t buffer_position;
1353 bool more_work = true;
1355 boost::shared_ptr<AudioRegion> region;
1356 framecnt_t total_capture;
1358 SourceList::iterator src;
1359 ChannelList::iterator chan;
1360 vector<CaptureInfo*>::iterator ci;
1361 boost::shared_ptr<ChannelList> c = channels.reader();
1363 bool mark_write_completed = false;
1367 /* butler is already stopped, but there may be work to do
1368 to flush remaining data to disk.
1371 while (more_work && !err) {
1372 switch (do_flush (TransportContext, true)) {
1379 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1384 /* XXX is there anything we can do if err != 0 ? */
1385 Glib::Mutex::Lock lm (capture_info_lock);
1387 if (capture_info.empty()) {
1391 if (abort_capture) {
1393 if (destructive()) {
1397 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1399 if ((*chan)->write_source) {
1401 (*chan)->write_source->mark_for_remove ();
1402 (*chan)->write_source->drop_references ();
1403 (*chan)->write_source.reset ();
1406 /* new source set up in "out" below */
1412 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1413 total_capture += (*ci)->frames;
1416 /* figure out the name for this take */
1418 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1420 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1424 s->update_header (capture_info.front()->start, when, twhen);
1425 s->set_captured_for (_name.val());
1426 s->mark_immutable ();
1428 if (Config->get_auto_analyse_audio()) {
1429 Analyser::queue_source_for_analysis (s, true);
1434 /* destructive tracks have a single, never changing region */
1436 if (destructive()) {
1438 /* send a signal that any UI can pick up to do the right thing. there is
1439 a small problem here in that a UI may need the peak data to be ready
1440 for the data that was recorded and this isn't interlocked with that
1441 process. this problem is deferred to the UI.
1444 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1448 string whole_file_region_name;
1449 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1451 /* Register a new region with the Session that
1452 describes the entire source. Do this first
1453 so that any sub-regions will obviously be
1454 children of this one (later!)
1460 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1461 plist.add (Properties::length, total_capture);
1462 plist.add (Properties::name, whole_file_region_name);
1463 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1464 rx->set_automatic (true);
1465 rx->set_whole_file (true);
1467 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1468 region->special_set_position (capture_info.front()->start);
1472 catch (failed_constructor& err) {
1473 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1477 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1479 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1481 _playlist->clear_changes ();
1482 _playlist->freeze ();
1484 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1488 RegionFactory::region_name (region_name, whole_file_region_name, false);
1490 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1491 _name, (*ci)->start, (*ci)->frames, region_name));
1497 plist.add (Properties::start, buffer_position);
1498 plist.add (Properties::length, (*ci)->frames);
1499 plist.add (Properties::name, region_name);
1501 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1502 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1505 catch (failed_constructor& err) {
1506 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1507 continue; /* XXX is this OK? */
1510 i_am_the_modifier++;
1512 if (_playlist->explicit_relayering()) {
1513 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1514 should end up on. Put it at the top.
1516 region->set_layer (_playlist->top_layer() + 1);
1517 region->set_pending_explicit_relayer (true);
1520 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1521 i_am_the_modifier--;
1523 buffer_position += (*ci)->frames;
1527 _session.add_command (new StatefulDiffCommand (_playlist));
1530 mark_write_completed = true;
1533 reset_write_sources (mark_write_completed);
1537 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1541 capture_info.clear ();
1542 capture_start_frame = 0;
1546 AudioDiskstream::transport_looped (framepos_t transport_frame)
1548 if (was_recording) {
1549 // all we need to do is finish this capture, with modified capture length
1550 boost::shared_ptr<ChannelList> c = channels.reader();
1552 // adjust the capture length knowing that the data will be recorded to disk
1553 // only necessary after the first loop where we're recording
1554 if (capture_info.size() == 0) {
1555 capture_captured += _capture_offset;
1557 if (_alignment_style == ExistingMaterial) {
1558 capture_captured += _session.worst_output_latency();
1560 capture_captured += _roll_delay;
1566 // the next region will start recording via the normal mechanism
1567 // we'll set the start position to the current transport pos
1568 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1569 capture_start_frame = transport_frame;
1570 first_recordable_frame = transport_frame; // mild lie
1571 last_recordable_frame = max_framepos;
1572 was_recording = true;
1574 if (recordable() && destructive()) {
1575 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1577 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1578 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1580 if (transvec.len[0] > 0) {
1581 transvec.buf[0]->type = CaptureStart;
1582 transvec.buf[0]->capture_val = capture_start_frame;
1583 (*chan)->capture_transition_buf->increment_write_ptr(1);
1587 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1597 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1599 was_recording = false;
1600 first_recordable_frame = max_framepos;
1601 last_recordable_frame = max_framepos;
1603 if (capture_captured == 0) {
1607 if (recordable() && destructive()) {
1608 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1610 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1611 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1613 if (transvec.len[0] > 0) {
1614 transvec.buf[0]->type = CaptureEnd;
1615 transvec.buf[0]->capture_val = capture_captured;
1616 (*chan)->capture_transition_buf->increment_write_ptr(1);
1620 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1626 CaptureInfo* ci = new CaptureInfo;
1628 ci->start = capture_start_frame;
1629 ci->frames = capture_captured;
1631 /* XXX theoretical race condition here. Need atomic exchange ?
1632 However, the circumstances when this is called right
1633 now (either on record-disable or transport_stopped)
1634 mean that no actual race exists. I think ...
1635 We now have a capture_info_lock, but it is only to be used
1636 to synchronize in the transport_stop and the capture info
1637 accessors, so that invalidation will not occur (both non-realtime).
1640 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1642 capture_info.push_back (ci);
1643 capture_captured = 0;
1645 /* now we've finished a capture, reset first_recordable_frame for next time */
1646 first_recordable_frame = max_framepos;
1650 AudioDiskstream::set_record_enabled (bool yn)
1652 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1656 /* can't rec-enable in destructive mode if transport is before start */
1658 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1662 /* yes, i know that this not proof against race conditions, but its
1663 good enough. i think.
1666 if (record_enabled() != yn) {
1668 engage_record_enable ();
1670 disengage_record_enable ();
1676 AudioDiskstream::engage_record_enable ()
1678 bool rolling = _session.transport_speed() != 0.0f;
1679 boost::shared_ptr<ChannelList> c = channels.reader();
1681 g_atomic_int_set (&_record_enabled, 1);
1682 capturing_sources.clear ();
1684 if (Config->get_monitoring_model() == HardwareMonitoring) {
1686 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1687 (*chan)->source.ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1688 capturing_sources.push_back ((*chan)->write_source);
1689 (*chan)->write_source->mark_streaming_write_started ();
1693 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1694 capturing_sources.push_back ((*chan)->write_source);
1695 (*chan)->write_source->mark_streaming_write_started ();
1699 RecordEnableChanged (); /* EMIT SIGNAL */
1703 AudioDiskstream::disengage_record_enable ()
1705 g_atomic_int_set (&_record_enabled, 0);
1706 boost::shared_ptr<ChannelList> c = channels.reader();
1707 if (Config->get_monitoring_model() == HardwareMonitoring) {
1708 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1709 (*chan)->source.ensure_monitor_input (false);
1712 capturing_sources.clear ();
1713 RecordEnableChanged (); /* EMIT SIGNAL */
1717 AudioDiskstream::get_state ()
1719 XMLNode& node (Diskstream::get_state());
1721 LocaleGuard lg (X_("POSIX"));
1723 boost::shared_ptr<ChannelList> c = channels.reader();
1724 snprintf (buf, sizeof(buf), "%zd", c->size());
1725 node.add_property ("channels", buf);
1727 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1729 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1730 XMLNode* cs_grandchild;
1732 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1733 cs_grandchild = new XMLNode (X_("file"));
1734 cs_grandchild->add_property (X_("path"), (*i)->path());
1735 cs_child->add_child_nocopy (*cs_grandchild);
1738 /* store the location where capture will start */
1742 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1743 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1745 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1748 cs_child->add_property (X_("at"), buf);
1749 node.add_child_nocopy (*cs_child);
1756 AudioDiskstream::set_state (const XMLNode& node, int version)
1758 const XMLProperty* prop;
1759 XMLNodeList nlist = node.children();
1760 XMLNodeIterator niter;
1761 uint32_t nchans = 1;
1762 XMLNode* capture_pending_node = 0;
1763 LocaleGuard lg (X_("POSIX"));
1765 /* prevent write sources from being created */
1767 in_set_state = true;
1769 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1770 if ((*niter)->name() == IO::state_node_name) {
1771 deprecated_io_node = new XMLNode (**niter);
1774 if ((*niter)->name() == X_("CapturingSources")) {
1775 capture_pending_node = *niter;
1779 if (Diskstream::set_state (node, version)) {
1783 if ((prop = node.property ("channels")) != 0) {
1784 nchans = atoi (prop->value().c_str());
1787 // create necessary extra channels
1788 // we are always constructed with one and we always need one
1790 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1792 if (nchans > _n_channels.n_audio()) {
1794 add_channel (nchans - _n_channels.n_audio());
1795 IO::PortCountChanged(_n_channels);
1797 } else if (nchans < _n_channels.n_audio()) {
1799 remove_channel (_n_channels.n_audio() - nchans);
1804 if (!destructive() && capture_pending_node) {
1805 /* destructive streams have one and only one source per channel,
1806 and so they never end up in pending capture in any useful
1809 use_pending_capture_data (*capture_pending_node);
1812 in_set_state = false;
1814 /* make sure this is clear before we do anything else */
1816 capturing_sources.clear ();
1818 /* write sources are handled when we handle the input set
1819 up of the IO that owns this DS (::non_realtime_input_change())
1826 AudioDiskstream::use_new_write_source (uint32_t n)
1828 boost::shared_ptr<ChannelList> c = channels.reader();
1830 if (!recordable()) {
1834 if (n >= c->size()) {
1835 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1839 ChannelInfo* chan = (*c)[n];
1842 if ((chan->write_source = _session.create_audio_source_for_session (
1843 n_channels().n_audio(), name(), n, destructive())) == 0) {
1844 throw failed_constructor();
1848 catch (failed_constructor &err) {
1849 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1850 chan->write_source.reset ();
1854 /* do not remove destructive files even if they are empty */
1856 chan->write_source->set_allow_remove_if_empty (!destructive());
1861 list<boost::shared_ptr<Source> >
1862 AudioDiskstream::steal_write_sources()
1864 /* not possible to steal audio write sources */
1865 list<boost::shared_ptr<Source> > ret;
1870 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1872 ChannelList::iterator chan;
1873 boost::shared_ptr<ChannelList> c = channels.reader();
1876 if (!_session.writable() || !recordable()) {
1880 capturing_sources.clear ();
1882 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1884 if (!destructive()) {
1886 if ((*chan)->write_source) {
1888 if (mark_write_complete) {
1889 (*chan)->write_source->mark_streaming_write_completed ();
1890 (*chan)->write_source->done_with_peakfile_writes ();
1893 if ((*chan)->write_source->removable()) {
1894 (*chan)->write_source->mark_for_remove ();
1895 (*chan)->write_source->drop_references ();
1898 (*chan)->write_source.reset ();
1901 use_new_write_source (n);
1903 if (record_enabled()) {
1904 capturing_sources.push_back ((*chan)->write_source);
1909 if ((*chan)->write_source == 0) {
1910 use_new_write_source (n);
1915 if (destructive() && !c->empty ()) {
1917 /* we now have all our write sources set up, so create the
1918 playlist's single region.
1921 if (_playlist->empty()) {
1922 setup_destructive_playlist ();
1928 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1930 if (_session.get_block_size() > speed_buffer_size) {
1931 speed_buffer_size = _session.get_block_size();
1932 boost::shared_ptr<ChannelList> c = channels.reader();
1934 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1935 if ((*chan)->speed_buffer)
1936 delete [] (*chan)->speed_buffer;
1937 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1940 allocate_temporary_buffers ();
1944 AudioDiskstream::allocate_temporary_buffers ()
1946 /* make sure the wrap buffer is at least large enough to deal
1947 with the speeds up to 1.2, to allow for micro-variation
1948 when slaving to MTC, Timecode etc.
1951 double const sp = max (fabsf (_actual_speed), 1.2f);
1952 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1954 if (required_wrap_size > wrap_buffer_size) {
1956 boost::shared_ptr<ChannelList> c = channels.reader();
1958 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1959 if ((*chan)->playback_wrap_buffer)
1960 delete [] (*chan)->playback_wrap_buffer;
1961 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1962 if ((*chan)->capture_wrap_buffer)
1963 delete [] (*chan)->capture_wrap_buffer;
1964 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1967 wrap_buffer_size = required_wrap_size;
1972 AudioDiskstream::monitor_input (bool yn)
1974 boost::shared_ptr<ChannelList> c = channels.reader();
1976 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1977 (*chan)->source.ensure_monitor_input (yn);
1982 AudioDiskstream::set_align_style_from_io ()
1984 bool have_physical = false;
1986 if (_alignment_choice != Automatic) {
1994 get_input_sources ();
1996 boost::shared_ptr<ChannelList> c = channels.reader();
1998 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1999 if ((*chan)->source.is_physical ()) {
2000 have_physical = true;
2005 if (have_physical) {
2006 set_align_style (ExistingMaterial);
2008 set_align_style (CaptureTime);
2013 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2015 while (how_many--) {
2016 c->push_back (new ChannelInfo(
2017 _session.butler()->audio_diskstream_playback_buffer_size(),
2018 _session.butler()->audio_diskstream_capture_buffer_size(),
2019 speed_buffer_size, wrap_buffer_size));
2020 interpolation.add_channel_to (
2021 _session.butler()->audio_diskstream_playback_buffer_size(),
2025 _n_channels.set(DataType::AUDIO, c->size());
2031 AudioDiskstream::add_channel (uint32_t how_many)
2033 RCUWriter<ChannelList> writer (channels);
2034 boost::shared_ptr<ChannelList> c = writer.get_copy();
2036 return add_channel_to (c, how_many);
2040 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2042 while (how_many-- && !c->empty()) {
2045 interpolation.remove_channel_from ();
2048 _n_channels.set(DataType::AUDIO, c->size());
2054 AudioDiskstream::remove_channel (uint32_t how_many)
2056 RCUWriter<ChannelList> writer (channels);
2057 boost::shared_ptr<ChannelList> c = writer.get_copy();
2059 return remove_channel_from (c, how_many);
2063 AudioDiskstream::playback_buffer_load () const
2065 boost::shared_ptr<ChannelList> c = channels.reader();
2071 return (float) ((double) c->front()->playback_buf->read_space()/
2072 (double) c->front()->playback_buf->bufsize());
2076 AudioDiskstream::capture_buffer_load () const
2078 boost::shared_ptr<ChannelList> c = channels.reader();
2084 return (float) ((double) c->front()->capture_buf->write_space()/
2085 (double) c->front()->capture_buf->bufsize());
2089 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2091 const XMLProperty* prop;
2092 XMLNodeList nlist = node.children();
2093 XMLNodeIterator niter;
2094 boost::shared_ptr<AudioFileSource> fs;
2095 boost::shared_ptr<AudioFileSource> first_fs;
2096 SourceList pending_sources;
2097 framepos_t position;
2099 if ((prop = node.property (X_("at"))) == 0) {
2103 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2107 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2108 if ((*niter)->name() == X_("file")) {
2110 if ((prop = (*niter)->property (X_("path"))) == 0) {
2114 // This protects sessions from errant CapturingSources in stored sessions
2116 if (stat (prop->value().c_str(), &sbuf)) {
2121 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2122 SourceFactory::createWritable (
2123 DataType::AUDIO, _session,
2124 prop->value(), string(), false, _session.frame_rate()));
2127 catch (failed_constructor& err) {
2128 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2129 _name, prop->value())
2134 pending_sources.push_back (fs);
2136 if (first_fs == 0) {
2140 fs->set_captured_for (_name.val());
2144 if (pending_sources.size() == 0) {
2145 /* nothing can be done */
2149 if (pending_sources.size() != _n_channels.n_audio()) {
2150 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2155 boost::shared_ptr<AudioRegion> region;
2161 plist.add (Properties::start, 0);
2162 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2163 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2165 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2167 region->set_automatic (true);
2168 region->set_whole_file (true);
2169 region->special_set_position (0);
2172 catch (failed_constructor& err) {
2173 error << string_compose (
2174 _("%1: cannot create whole-file region from pending capture sources"),
2180 _playlist->add_region (region, position);
2186 AudioDiskstream::set_non_layered (bool yn)
2188 if (yn != non_layered()) {
2191 _flags = Flag (_flags | NonLayered);
2193 _flags = Flag (_flags & ~NonLayered);
2201 AudioDiskstream::set_destructive (bool yn)
2203 if (yn != destructive()) {
2206 bool bounce_ignored;
2207 /* requestor should already have checked this and
2208 bounced if necessary and desired
2210 if (!can_become_destructive (bounce_ignored)) {
2213 _flags = Flag (_flags | Destructive);
2214 use_destructive_playlist ();
2216 _flags = Flag (_flags & ~Destructive);
2217 reset_write_sources (true, true);
2225 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2228 requires_bounce = false;
2232 /* is there only one region ? */
2234 if (_playlist->n_regions() != 1) {
2235 requires_bounce = true;
2239 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2241 requires_bounce = false;
2245 /* do the source(s) for the region cover the session start position ? */
2247 if (first->position() != _session.current_start_frame()) {
2248 if (first->start() > _session.current_start_frame()) {
2249 requires_bounce = true;
2254 /* is the source used by only 1 playlist ? */
2256 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2260 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2261 requires_bounce = true;
2265 requires_bounce = false;
2270 AudioDiskstream::adjust_playback_buffering ()
2272 boost::shared_ptr<ChannelList> c = channels.reader();
2274 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2275 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2280 AudioDiskstream::adjust_capture_buffering ()
2282 boost::shared_ptr<ChannelList> c = channels.reader();
2284 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2285 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2290 AudioDiskstream::ChannelSource::is_physical () const
2296 return AudioEngine::instance()->port_is_physical (name);
2300 AudioDiskstream::ChannelSource::ensure_monitor_input (bool yn) const
2306 return AudioEngine::instance()->ensure_monitor_input (name, yn);
2309 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2312 current_capture_buffer = 0;
2313 current_playback_buffer = 0;
2314 curr_capture_cnt = 0;
2316 speed_buffer = new Sample[speed_size];
2317 playback_wrap_buffer = new Sample[wrap_size];
2318 capture_wrap_buffer = new Sample[wrap_size];
2320 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2321 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2322 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2324 /* touch the ringbuffer buffers, which will cause
2325 them to be mapped into locked physical RAM if
2326 we're running with mlockall(). this doesn't do
2330 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2331 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2332 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2336 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2338 delete playback_buf;
2339 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2340 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2344 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2348 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2349 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2352 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2354 write_source.reset ();
2356 delete [] speed_buffer;
2359 delete [] playback_wrap_buffer;
2360 playback_wrap_buffer = 0;
2362 delete [] capture_wrap_buffer;
2363 capture_wrap_buffer = 0;
2365 delete playback_buf;
2371 delete capture_transition_buf;
2372 capture_transition_buf = 0;
2377 AudioDiskstream::set_name (string const & name)
2379 Diskstream::set_name (name);
2381 /* get a new write source so that its name reflects the new diskstream name */
2383 boost::shared_ptr<ChannelList> c = channels.reader();
2384 ChannelList::iterator i;
2387 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2388 use_new_write_source (n);