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/track.h"
60 #include "ardour/utils.h"
61 #include "ardour/session_playlists.h"
62 #include "ardour/route.h"
68 using namespace ARDOUR;
71 size_t AudioDiskstream::_working_buffers_size = 0;
72 Sample* AudioDiskstream::_mixdown_buffer = 0;
73 gain_t* AudioDiskstream::_gain_buffer = 0;
75 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
76 : Diskstream(sess, name, flag)
77 , channels (new ChannelList)
79 /* prevent any write sources from being created */
86 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
87 : Diskstream(sess, node)
88 , channels (new ChannelList)
93 if (set_state (node, Stateful::loading_state_version)) {
95 throw failed_constructor();
101 use_destructive_playlist ();
106 AudioDiskstream::init ()
108 /* there are no channels at this point, so these
109 two calls just get speed_buffer_size and wrap_buffer
110 size setup without duplicating their code.
113 set_block_size (_session.get_block_size());
114 allocate_temporary_buffers ();
117 AudioDiskstream::~AudioDiskstream ()
119 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
122 RCUWriter<ChannelList> writer (channels);
123 boost::shared_ptr<ChannelList> c = writer.get_copy();
125 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
136 AudioDiskstream::allocate_working_buffers()
138 assert(disk_io_frames() > 0);
140 _working_buffers_size = disk_io_frames();
141 _mixdown_buffer = new Sample[_working_buffers_size];
142 _gain_buffer = new gain_t[_working_buffers_size];
146 AudioDiskstream::free_working_buffers()
148 delete [] _mixdown_buffer;
149 delete [] _gain_buffer;
150 _working_buffers_size = 0;
156 AudioDiskstream::non_realtime_input_change ()
159 Glib::Mutex::Lock lm (state_lock);
161 if (input_change_pending.type == IOChange::NoChange) {
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());
178 if (input_change_pending.type & IOChange::ConnectionsChanged) {
179 get_input_sources ();
180 set_capture_offset ();
181 set_align_style_from_io ();
184 input_change_pending = IOChange::NoChange;
186 /* implicit unlock */
189 /* reset capture files */
191 reset_write_sources (false);
193 /* now refill channel buffers */
195 if (speed() != 1.0f || speed() != -1.0f) {
196 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
198 seek (_session.transport_frame());
203 AudioDiskstream::non_realtime_locate (framepos_t location)
205 /* now refill channel buffers */
207 if (speed() != 1.0f || speed() != -1.0f) {
208 seek ((framepos_t) (location * (double) speed()));
215 AudioDiskstream::get_input_sources ()
217 boost::shared_ptr<ChannelList> c = channels.reader();
220 ChannelList::iterator chan;
221 uint32_t ni = _io->n_ports().n_audio();
222 vector<string> connections;
224 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
226 connections.clear ();
228 if (_io->nth (n)->get_connections (connections) == 0) {
229 if (!(*chan)->source.name.empty()) {
230 // _source->disable_metering ();
232 (*chan)->source.name = string();
234 (*chan)->source.name = connections[0];
240 AudioDiskstream::find_and_use_playlist (const string& name)
242 boost::shared_ptr<AudioPlaylist> playlist;
244 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
245 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
249 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
253 return use_playlist (playlist);
257 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
259 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
261 Diskstream::use_playlist(playlist);
267 AudioDiskstream::use_new_playlist ()
270 boost::shared_ptr<AudioPlaylist> playlist;
272 if (!in_set_state && destructive()) {
277 newname = Playlist::bump_name (_playlist->name(), _session);
279 newname = Playlist::bump_name (_name, _session);
282 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
284 return use_playlist (playlist);
292 AudioDiskstream::use_copy_playlist ()
294 assert(audio_playlist());
300 if (_playlist == 0) {
301 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
306 boost::shared_ptr<AudioPlaylist> playlist;
308 newname = Playlist::bump_name (_playlist->name(), _session);
310 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
311 return use_playlist (playlist);
318 AudioDiskstream::setup_destructive_playlist ()
321 boost::shared_ptr<ChannelList> c = channels.reader();
323 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
324 srcs.push_back ((*chan)->write_source);
327 /* a single full-sized region */
329 assert (!srcs.empty ());
332 plist.add (Properties::name, _name.val());
333 plist.add (Properties::start, 0);
334 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
336 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
337 _playlist->add_region (region, srcs.front()->natural_position());
341 AudioDiskstream::use_destructive_playlist ()
343 /* this is called from the XML-based constructor or ::set_destructive. when called,
344 we already have a playlist and a region, but we need to
345 set up our sources for write. we use the sources associated
346 with the (presumed single, full-extent) region.
349 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
352 reset_write_sources (false, true);
356 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
359 throw failed_constructor();
362 /* be sure to stretch the region out to the maximum length */
364 region->set_length (max_framepos - region->position());
367 ChannelList::iterator chan;
368 boost::shared_ptr<ChannelList> c = channels.reader();
370 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
371 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
372 assert((*chan)->write_source);
373 (*chan)->write_source->set_allow_remove_if_empty (false);
375 /* this might be false if we switched modes, so force it */
377 (*chan)->write_source->set_destructive (true);
380 /* the source list will never be reset for a destructive track */
384 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
386 if (recordable() && destructive()) {
387 boost::shared_ptr<ChannelList> c = channels.reader();
388 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
390 RingBufferNPT<CaptureTransition>::rw_vector transitions;
391 (*chan)->capture_transition_buf->get_write_vector (&transitions);
393 if (transitions.len[0] > 0) {
394 transitions.buf[0]->type = CaptureStart;
395 transitions.buf[0]->capture_val = capture_start_frame;
396 (*chan)->capture_transition_buf->increment_write_ptr(1);
399 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
407 /** Do some record stuff [not described in this comment!]
410 * - Setup playback_distance with the nframes, or nframes adjusted
411 * for current varispeed, if appropriate.
412 * - Setup current_playback_buffer in each ChannelInfo to point to data
413 * that someone can read playback_distance worth of data from.
416 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance)
419 boost::shared_ptr<ChannelList> c = channels.reader();
420 ChannelList::iterator chan;
421 framecnt_t rec_offset = 0;
422 framecnt_t rec_nframes = 0;
423 bool collect_playback = false;
424 bool can_record = _session.actively_recording ();
426 playback_distance = 0;
428 if (!_io || !_io->active()) {
432 check_record_status (transport_frame, can_record);
438 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
444 adjust_capture_position = 0;
446 for (chan = c->begin(); chan != c->end(); ++chan) {
447 (*chan)->current_capture_buffer = 0;
448 (*chan)->current_playback_buffer = 0;
451 // Safeguard against situations where process() goes haywire when autopunching
452 // and last_recordable_frame < first_recordable_frame
454 if (last_recordable_frame < first_recordable_frame) {
455 last_recordable_frame = max_framepos;
458 if (record_enabled()) {
460 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
461 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
463 if (rec_nframes && !was_recording) {
464 capture_captured = 0;
465 was_recording = true;
469 if (can_record && !_last_capture_sources.empty()) {
470 _last_capture_sources.clear ();
475 uint32_t limit = _io->n_ports ().n_audio();
477 /* one or more ports could already have been removed from _io, but our
478 channel setup hasn't yet been updated. prevent us from trying to
479 use channels that correspond to missing ports. note that the
480 process callback (from which this is called) is always atomic
481 with respect to port removal/addition.
484 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
486 ChannelInfo* chaninfo (*chan);
488 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
490 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
492 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
494 /* note: grab the entire port buffer, but only copy what we were supposed to
495 for recording, and use rec_offset
498 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
500 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
502 Sample *buf = ap->get_audio_buffer (nframes).data (rec_offset);
503 memcpy (chaninfo->current_capture_buffer, buf, sizeof (Sample) * rec_nframes);
507 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
509 if (rec_nframes > total) {
514 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
517 Sample* buf = ap->get_audio_buffer(nframes).data (rec_offset);
518 framecnt_t first = chaninfo->capture_vector.len[0];
520 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
521 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
522 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
523 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
525 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
539 /* data will be written to disk */
541 if (rec_nframes == nframes && rec_offset == 0) {
543 for (chan = c->begin(); chan != c->end(); ++chan) {
544 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
547 playback_distance = nframes;
552 /* we can't use the capture buffer as the playback buffer, because
553 we recorded only a part of the current process' cycle data
557 collect_playback = true;
560 adjust_capture_position = rec_nframes;
562 } else if (can_record && record_enabled()) {
564 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
566 for (chan = c->begin(); chan != c->end(); ++chan) {
567 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
570 playback_distance = nframes;
574 collect_playback = true;
577 if ((_track->monitoring_state () & MonitoringDisk) || collect_playback) {
579 /* we're doing playback */
581 framecnt_t necessary_samples;
583 /* no varispeed playback if we're recording, because the output .... TBD */
585 if (rec_nframes == 0 && _actual_speed != 1.0f) {
586 necessary_samples = (framecnt_t) floor ((nframes * fabs (_actual_speed))) + 1;
588 necessary_samples = nframes;
591 for (chan = c->begin(); chan != c->end(); ++chan) {
592 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
597 /* Setup current_playback_buffer in each ChannelInfo to point to data that someone
598 can read necessary_samples (== nframes at a transport speed of 1) worth of data
602 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
604 ChannelInfo* chaninfo (*chan);
606 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
607 /* There are enough samples in the first part of the ringbuffer */
608 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
611 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
613 if (necessary_samples > total) {
614 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
615 cerr << "underrun for " << _name << endl;
621 /* We have enough samples, but not in one lump. Coalesce the two parts
622 into one in playback_wrap_buffer in our ChannelInfo, and specify that
623 as our current_playback_buffer.
626 /* Copy buf[0] from playback_buf */
627 memcpy ((char *) chaninfo->playback_wrap_buffer,
628 chaninfo->playback_vector.buf[0],
629 chaninfo->playback_vector.len[0] * sizeof (Sample));
631 /* Copy buf[1] from playback_buf */
632 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
633 chaninfo->playback_vector.buf[1],
634 (necessary_samples - chaninfo->playback_vector.len[0])
637 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
642 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
644 interpolation.set_speed (_target_speed);
647 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
648 ChannelInfo* chaninfo (*chan);
650 playback_distance = interpolation.interpolate (
651 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
653 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
657 playback_distance = nframes;
660 _speed = _target_speed;
666 /** Update various things including playback_sample, read pointer on each channel's playback_buf
667 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
668 * @return true if the butler is required.
671 AudioDiskstream::commit (framecnt_t playback_distance)
673 bool need_butler = false;
675 if (!_io || !_io->active()) {
679 if (_actual_speed < 0.0) {
680 playback_sample -= playback_distance;
682 playback_sample += playback_distance;
685 boost::shared_ptr<ChannelList> c = channels.reader();
686 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
688 (*chan)->playback_buf->increment_read_ptr (playback_distance);
690 if (adjust_capture_position) {
691 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
695 if (adjust_capture_position != 0) {
696 capture_captured += adjust_capture_position;
697 adjust_capture_position = 0;
705 if (_io && _io->active()) {
706 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
711 if (_io && _io->active()) {
712 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
713 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
715 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
723 AudioDiskstream::set_pending_overwrite (bool yn)
725 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
727 _pending_overwrite = yn;
729 overwrite_frame = playback_sample;
731 boost::shared_ptr<ChannelList> c = channels.reader ();
733 overwrite_offset = c->front()->playback_buf->get_read_ptr();
738 AudioDiskstream::overwrite_existing_buffers ()
740 boost::shared_ptr<ChannelList> c = channels.reader();
742 _pending_overwrite = false;
746 Sample* mixdown_buffer;
749 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
751 overwrite_queued = false;
753 /* assume all are the same size */
754 framecnt_t size = c->front()->playback_buf->bufsize();
756 mixdown_buffer = new Sample[size];
757 gain_buffer = new float[size];
759 /* reduce size so that we can fill the buffer correctly (ringbuffers
760 can only handle size-1, otherwise they appear to be empty)
767 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
769 start = overwrite_frame;
770 framecnt_t cnt = size;
772 /* to fill the buffer without resetting the playback sample, we need to
773 do it one or two chunks (normally two).
775 |----------------------------------------------------------------------|
779 |<- second chunk->||<----------------- first chunk ------------------>|
783 framecnt_t to_read = size - overwrite_offset;
785 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
786 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
787 id(), size, playback_sample) << endmsg;
795 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
796 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
797 id(), size, playback_sample) << endmsg;
806 _pending_overwrite = false;
807 delete [] gain_buffer;
808 delete [] mixdown_buffer;
813 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
817 ChannelList::iterator chan;
818 boost::shared_ptr<ChannelList> c = channels.reader();
820 Glib::Mutex::Lock lm (state_lock);
822 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
823 (*chan)->playback_buf->reset ();
824 (*chan)->capture_buf->reset ();
827 /* can't rec-enable in destructive mode if transport is before start */
829 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
830 disengage_record_enable ();
833 playback_sample = frame;
836 if (complete_refill) {
837 while ((ret = do_refill_with_alloc ()) > 0) ;
839 ret = do_refill_with_alloc ();
846 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
848 ChannelList::iterator chan;
849 boost::shared_ptr<ChannelList> c = channels.reader();
851 for (chan = c->begin(); chan != c->end(); ++chan) {
852 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
860 AudioDiskstream::internal_playback_seek (framecnt_t distance)
862 ChannelList::iterator chan;
863 boost::shared_ptr<ChannelList> c = channels.reader();
865 for (chan = c->begin(); chan != c->end(); ++chan) {
866 (*chan)->playback_buf->increment_read_ptr (distance);
869 if (first_recordable_frame < max_framepos) {
870 first_recordable_frame += distance;
872 playback_sample += distance;
877 /** Read some data for 1 channel from our playlist into a buffer.
878 * @param buf Buffer to write to.
879 * @param start Session frame to start reading from; updated to where we end up
881 * @param cnt Count of samples to read.
882 * @param reversed true if we are running backwards, otherwise false.
885 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
886 framepos_t& start, framecnt_t cnt,
887 int channel, bool reversed)
889 framecnt_t this_read = 0;
891 framepos_t loop_end = 0;
892 framepos_t loop_start = 0;
893 framecnt_t offset = 0;
896 /* XXX we don't currently play loops in reverse. not sure why */
900 framecnt_t loop_length = 0;
902 /* Make the use of a Location atomic for this read operation.
904 Note: Locations don't get deleted, so all we care about
905 when I say "atomic" is that we are always pointing to
906 the same one and using a start/length values obtained
910 if ((loc = loop_location) != 0) {
911 loop_start = loc->start();
912 loop_end = loc->end();
913 loop_length = loop_end - loop_start;
916 /* if we are looping, ensure that the first frame we read is at the correct
917 position within the loop.
920 if (loc && start >= loop_end) {
921 start = loop_start + ((start - loop_start) % loop_length);
929 /* We need this while loop in case we hit a loop boundary, in which case our read from
930 the playlist must be split into more than one section.
935 /* take any loop into account. we can't read past the end of the loop. */
937 if (loc && (loop_end - start < cnt)) {
938 this_read = loop_end - start;
945 if (this_read == 0) {
949 this_read = min(cnt,this_read);
951 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
952 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
959 swap_by_ptr (buf, buf + this_read - 1);
963 /* if we read to the end of the loop, go back to the beginning */
980 AudioDiskstream::do_refill_with_alloc ()
982 Sample* mix_buf = new Sample[disk_io_chunk_frames];
983 float* gain_buf = new float[disk_io_chunk_frames];
985 int ret = _do_refill(mix_buf, gain_buf);
993 /** Get some more data from disk and put it in our channels' playback_bufs,
994 * if there is suitable space in them.
997 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1001 RingBufferNPT<Sample>::rw_vector vector;
1002 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1003 framecnt_t total_space;
1004 framecnt_t zero_fill;
1006 ChannelList::iterator i;
1007 boost::shared_ptr<ChannelList> c = channels.reader();
1014 assert(mixdown_buffer);
1015 assert(gain_buffer);
1022 c->front()->playback_buf->get_write_vector (&vector);
1024 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1025 /* nowhere to write to */
1029 /* if there are 2+ chunks of disk i/o possible for
1030 this track, let the caller know so that it can arrange
1031 for us to be called again, ASAP.
1034 if (total_space >= (_slaved ? 3 : 2) * disk_io_chunk_frames) {
1038 /* if we're running close to normal speed and there isn't enough
1039 space to do disk_io_chunk_frames of I/O, then don't bother.
1041 at higher speeds, just do it because the sync between butler
1042 and audio thread may not be good enough.
1044 Note: it is a design assumption that disk_io_chunk_frames is smaller
1045 than the playback buffer size, so this check should never trip when
1046 the playback buffer is empty.
1049 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1053 /* when slaved, don't try to get too close to the read pointer. this
1054 leaves space for the buffer reversal to have something useful to
1058 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1062 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1064 total_space = min (disk_io_chunk_frames, total_space);
1068 if (file_frame == 0) {
1070 /* at start: nothing to do but fill with silence */
1072 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1074 ChannelInfo* chan (*i);
1075 chan->playback_buf->get_write_vector (&vector);
1076 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1077 if (vector.len[1]) {
1078 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1080 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1085 if (file_frame < total_space) {
1087 /* too close to the start: read what we can,
1088 and then zero fill the rest
1091 zero_fill = total_space - file_frame;
1092 total_space = file_frame;
1101 if (file_frame == max_framepos) {
1103 /* at end: nothing to do but fill with silence */
1105 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1107 ChannelInfo* chan (*i);
1108 chan->playback_buf->get_write_vector (&vector);
1109 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1110 if (vector.len[1]) {
1111 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1113 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1118 if (file_frame > max_framepos - total_space) {
1120 /* to close to the end: read what we can, and zero fill the rest */
1122 zero_fill = total_space - (max_framepos - file_frame);
1123 total_space = max_framepos - file_frame;
1130 framepos_t file_frame_tmp = 0;
1132 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1134 ChannelInfo* chan (*i);
1137 framecnt_t len1, len2;
1139 chan->playback_buf->get_write_vector (&vector);
1141 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1143 /* we're not going to fill the first chunk, so certainly do not bother with the
1144 other part. it won't be connected with the part we do fill, as in:
1146 .... => writable space
1147 ++++ => readable space
1148 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1150 |......|+++++++++++++|...............................|
1155 So, just pretend that the buf1 part isn't there.
1165 file_frame_tmp = file_frame;
1167 buf1 = vector.buf[0];
1168 len1 = vector.len[0];
1169 buf2 = vector.buf[1];
1170 len2 = vector.len[1];
1172 to_read = min (ts, len1);
1173 to_read = min (to_read, disk_io_chunk_frames);
1175 assert (to_read >= 0);
1179 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1184 chan->playback_buf->increment_write_ptr (to_read);
1188 to_read = min (ts, len2);
1192 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1193 so read some or all of vector.len[1] as well.
1196 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1201 chan->playback_buf->increment_write_ptr (to_read);
1205 /* XXX: do something */
1210 file_frame = file_frame_tmp;
1211 assert (file_frame >= 0);
1218 /** Flush pending data to disk.
1220 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1221 * of data to disk. it will never write more than that. If it writes that
1222 * much and there is more than that waiting to be written, it will return 1,
1223 * otherwise 0 on success or -1 on failure.
1225 * If there is less than disk_io_chunk_frames to be written, no data will be
1226 * written at all unless @a force_flush is true.
1229 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1233 RingBufferNPT<Sample>::rw_vector vector;
1234 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1237 transvec.buf[0] = 0;
1238 transvec.buf[1] = 0;
1242 boost::shared_ptr<ChannelList> c = channels.reader();
1243 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1245 (*chan)->capture_buf->get_read_vector (&vector);
1247 total = vector.len[0] + vector.len[1];
1249 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1253 /* if there are 2+ chunks of disk i/o possible for
1254 this track, let the caller know so that it can arrange
1255 for us to be called again, ASAP.
1257 if we are forcing a flush, then if there is* any* extra
1258 work, let the caller know.
1260 if we are no longer recording and there is any extra work,
1261 let the caller know too.
1264 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1268 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1270 // check the transition buffer when recording destructive
1271 // important that we get this after the capture buf
1273 if (destructive()) {
1274 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1275 size_t transcount = transvec.len[0] + transvec.len[1];
1278 for (ti=0; ti < transcount; ++ti) {
1279 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1281 if (captrans.type == CaptureStart) {
1282 // by definition, the first data we got above represents the given capture pos
1284 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1285 (*chan)->curr_capture_cnt = 0;
1287 } else if (captrans.type == CaptureEnd) {
1289 // capture end, the capture_val represents total frames in capture
1291 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1293 // shorten to make the write a perfect fit
1294 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1296 if (nto_write < to_write) {
1297 ret = 1; // should we?
1299 to_write = nto_write;
1301 (*chan)->write_source->mark_capture_end ();
1303 // increment past this transition, but go no further
1308 // actually ends just beyond this chunk, so force more work
1316 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1320 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1321 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1325 (*chan)->capture_buf->increment_read_ptr (to_write);
1326 (*chan)->curr_capture_cnt += to_write;
1328 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1330 /* we wrote all of vector.len[0] but it wasn't an entire
1331 disk_io_chunk_frames of data, so arrange for some part
1332 of vector.len[1] to be flushed to disk as well.
1335 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1337 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1338 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1342 (*chan)->capture_buf->increment_read_ptr (to_write);
1343 (*chan)->curr_capture_cnt += to_write;
1352 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1354 uint32_t buffer_position;
1355 bool more_work = true;
1357 boost::shared_ptr<AudioRegion> region;
1358 framecnt_t total_capture;
1360 SourceList::iterator src;
1361 ChannelList::iterator chan;
1362 vector<CaptureInfo*>::iterator ci;
1363 boost::shared_ptr<ChannelList> c = channels.reader();
1365 bool mark_write_completed = false;
1369 /* butler is already stopped, but there may be work to do
1370 to flush remaining data to disk.
1373 while (more_work && !err) {
1374 switch (do_flush (TransportContext, true)) {
1381 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1386 /* XXX is there anything we can do if err != 0 ? */
1387 Glib::Mutex::Lock lm (capture_info_lock);
1389 if (capture_info.empty()) {
1393 if (abort_capture) {
1395 if (destructive()) {
1399 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1401 if ((*chan)->write_source) {
1403 (*chan)->write_source->mark_for_remove ();
1404 (*chan)->write_source->drop_references ();
1405 (*chan)->write_source.reset ();
1408 /* new source set up in "out" below */
1414 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1415 total_capture += (*ci)->frames;
1418 /* figure out the name for this take */
1420 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1422 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1426 s->update_header (capture_info.front()->start, when, twhen);
1427 s->set_captured_for (_name.val());
1428 s->mark_immutable ();
1430 if (Config->get_auto_analyse_audio()) {
1431 Analyser::queue_source_for_analysis (s, true);
1436 /* destructive tracks have a single, never changing region */
1438 if (destructive()) {
1440 /* send a signal that any UI can pick up to do the right thing. there is
1441 a small problem here in that a UI may need the peak data to be ready
1442 for the data that was recorded and this isn't interlocked with that
1443 process. this problem is deferred to the UI.
1446 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1450 string whole_file_region_name;
1451 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1453 /* Register a new region with the Session that
1454 describes the entire source. Do this first
1455 so that any sub-regions will obviously be
1456 children of this one (later!)
1462 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1463 plist.add (Properties::length, total_capture);
1464 plist.add (Properties::name, whole_file_region_name);
1465 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1466 rx->set_automatic (true);
1467 rx->set_whole_file (true);
1469 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1470 region->special_set_position (capture_info.front()->start);
1474 catch (failed_constructor& err) {
1475 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1479 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1481 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1483 _playlist->clear_changes ();
1484 _playlist->freeze ();
1486 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1490 RegionFactory::region_name (region_name, whole_file_region_name, false);
1492 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1493 _name, (*ci)->start, (*ci)->frames, region_name));
1499 plist.add (Properties::start, buffer_position);
1500 plist.add (Properties::length, (*ci)->frames);
1501 plist.add (Properties::name, region_name);
1503 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1504 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1507 catch (failed_constructor& err) {
1508 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1509 continue; /* XXX is this OK? */
1512 i_am_the_modifier++;
1513 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1514 i_am_the_modifier--;
1516 buffer_position += (*ci)->frames;
1520 _session.add_command (new StatefulDiffCommand (_playlist));
1523 mark_write_completed = true;
1526 reset_write_sources (mark_write_completed);
1530 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1534 capture_info.clear ();
1535 capture_start_frame = 0;
1539 AudioDiskstream::transport_looped (framepos_t transport_frame)
1541 if (was_recording) {
1542 // all we need to do is finish this capture, with modified capture length
1543 boost::shared_ptr<ChannelList> c = channels.reader();
1545 // adjust the capture length knowing that the data will be recorded to disk
1546 // only necessary after the first loop where we're recording
1547 if (capture_info.size() == 0) {
1548 capture_captured += _capture_offset;
1550 if (_alignment_style == ExistingMaterial) {
1551 capture_captured += _session.worst_output_latency();
1553 capture_captured += _roll_delay;
1559 // the next region will start recording via the normal mechanism
1560 // we'll set the start position to the current transport pos
1561 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1562 capture_start_frame = transport_frame;
1563 first_recordable_frame = transport_frame; // mild lie
1564 last_recordable_frame = max_framepos;
1565 was_recording = true;
1567 if (recordable() && destructive()) {
1568 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1570 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1571 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1573 if (transvec.len[0] > 0) {
1574 transvec.buf[0]->type = CaptureStart;
1575 transvec.buf[0]->capture_val = capture_start_frame;
1576 (*chan)->capture_transition_buf->increment_write_ptr(1);
1580 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1590 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1592 was_recording = false;
1593 first_recordable_frame = max_framepos;
1594 last_recordable_frame = max_framepos;
1596 if (capture_captured == 0) {
1600 if (recordable() && destructive()) {
1601 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1603 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1604 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1606 if (transvec.len[0] > 0) {
1607 transvec.buf[0]->type = CaptureEnd;
1608 transvec.buf[0]->capture_val = capture_captured;
1609 (*chan)->capture_transition_buf->increment_write_ptr(1);
1613 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1619 CaptureInfo* ci = new CaptureInfo;
1621 ci->start = capture_start_frame;
1622 ci->frames = capture_captured;
1624 /* XXX theoretical race condition here. Need atomic exchange ?
1625 However, the circumstances when this is called right
1626 now (either on record-disable or transport_stopped)
1627 mean that no actual race exists. I think ...
1628 We now have a capture_info_lock, but it is only to be used
1629 to synchronize in the transport_stop and the capture info
1630 accessors, so that invalidation will not occur (both non-realtime).
1633 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1635 capture_info.push_back (ci);
1636 capture_captured = 0;
1638 /* now we've finished a capture, reset first_recordable_frame for next time */
1639 first_recordable_frame = max_framepos;
1643 AudioDiskstream::set_record_enabled (bool yn)
1645 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1649 /* can't rec-enable in destructive mode if transport is before start */
1651 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1655 /* yes, i know that this not proof against race conditions, but its
1656 good enough. i think.
1659 if (record_enabled() != yn) {
1661 engage_record_enable ();
1663 disengage_record_enable ();
1669 AudioDiskstream::engage_record_enable ()
1671 bool rolling = _session.transport_speed() != 0.0f;
1672 boost::shared_ptr<ChannelList> c = channels.reader();
1674 g_atomic_int_set (&_record_enabled, 1);
1675 capturing_sources.clear ();
1677 if (Config->get_monitoring_model() == HardwareMonitoring) {
1679 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1680 (*chan)->source.request_jack_monitors_input (!(_session.config.get_auto_input() && rolling));
1681 capturing_sources.push_back ((*chan)->write_source);
1682 (*chan)->write_source->mark_streaming_write_started ();
1686 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1687 capturing_sources.push_back ((*chan)->write_source);
1688 (*chan)->write_source->mark_streaming_write_started ();
1692 RecordEnableChanged (); /* EMIT SIGNAL */
1696 AudioDiskstream::disengage_record_enable ()
1698 g_atomic_int_set (&_record_enabled, 0);
1699 boost::shared_ptr<ChannelList> c = channels.reader();
1700 if (Config->get_monitoring_model() == HardwareMonitoring) {
1701 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1702 (*chan)->source.request_jack_monitors_input (false);
1705 capturing_sources.clear ();
1706 RecordEnableChanged (); /* EMIT SIGNAL */
1710 AudioDiskstream::get_state ()
1712 XMLNode& node (Diskstream::get_state());
1714 LocaleGuard lg (X_("POSIX"));
1716 boost::shared_ptr<ChannelList> c = channels.reader();
1717 snprintf (buf, sizeof(buf), "%zd", c->size());
1718 node.add_property ("channels", buf);
1720 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1722 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1723 XMLNode* cs_grandchild;
1725 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1726 cs_grandchild = new XMLNode (X_("file"));
1727 cs_grandchild->add_property (X_("path"), (*i)->path());
1728 cs_child->add_child_nocopy (*cs_grandchild);
1731 /* store the location where capture will start */
1735 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1736 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1738 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1741 cs_child->add_property (X_("at"), buf);
1742 node.add_child_nocopy (*cs_child);
1749 AudioDiskstream::set_state (const XMLNode& node, int version)
1751 const XMLProperty* prop;
1752 XMLNodeList nlist = node.children();
1753 XMLNodeIterator niter;
1754 uint32_t nchans = 1;
1755 XMLNode* capture_pending_node = 0;
1756 LocaleGuard lg (X_("POSIX"));
1758 /* prevent write sources from being created */
1760 in_set_state = true;
1762 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1763 if ((*niter)->name() == IO::state_node_name) {
1764 deprecated_io_node = new XMLNode (**niter);
1767 if ((*niter)->name() == X_("CapturingSources")) {
1768 capture_pending_node = *niter;
1772 if (Diskstream::set_state (node, version)) {
1776 if ((prop = node.property ("channels")) != 0) {
1777 nchans = atoi (prop->value().c_str());
1780 // create necessary extra channels
1781 // we are always constructed with one and we always need one
1783 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1785 if (nchans > _n_channels.n_audio()) {
1787 add_channel (nchans - _n_channels.n_audio());
1788 IO::PortCountChanged(_n_channels);
1790 } else if (nchans < _n_channels.n_audio()) {
1792 remove_channel (_n_channels.n_audio() - nchans);
1797 if (!destructive() && capture_pending_node) {
1798 /* destructive streams have one and only one source per channel,
1799 and so they never end up in pending capture in any useful
1802 use_pending_capture_data (*capture_pending_node);
1805 in_set_state = false;
1807 /* make sure this is clear before we do anything else */
1809 capturing_sources.clear ();
1811 /* write sources are handled when we handle the input set
1812 up of the IO that owns this DS (::non_realtime_input_change())
1819 AudioDiskstream::use_new_write_source (uint32_t n)
1821 boost::shared_ptr<ChannelList> c = channels.reader();
1823 if (!recordable()) {
1827 if (n >= c->size()) {
1828 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1832 ChannelInfo* chan = (*c)[n];
1835 if ((chan->write_source = _session.create_audio_source_for_session (
1836 n_channels().n_audio(), name(), n, destructive())) == 0) {
1837 throw failed_constructor();
1841 catch (failed_constructor &err) {
1842 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1843 chan->write_source.reset ();
1847 /* do not remove destructive files even if they are empty */
1849 chan->write_source->set_allow_remove_if_empty (!destructive());
1854 list<boost::shared_ptr<Source> >
1855 AudioDiskstream::steal_write_sources()
1857 /* not possible to steal audio write sources */
1858 list<boost::shared_ptr<Source> > ret;
1863 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1865 ChannelList::iterator chan;
1866 boost::shared_ptr<ChannelList> c = channels.reader();
1869 if (!_session.writable() || !recordable()) {
1873 capturing_sources.clear ();
1875 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1877 if (!destructive()) {
1879 if ((*chan)->write_source) {
1881 if (mark_write_complete) {
1882 (*chan)->write_source->mark_streaming_write_completed ();
1883 (*chan)->write_source->done_with_peakfile_writes ();
1886 if ((*chan)->write_source->removable()) {
1887 (*chan)->write_source->mark_for_remove ();
1888 (*chan)->write_source->drop_references ();
1891 (*chan)->write_source.reset ();
1894 use_new_write_source (n);
1896 if (record_enabled()) {
1897 capturing_sources.push_back ((*chan)->write_source);
1902 if ((*chan)->write_source == 0) {
1903 use_new_write_source (n);
1908 if (destructive() && !c->empty ()) {
1910 /* we now have all our write sources set up, so create the
1911 playlist's single region.
1914 if (_playlist->empty()) {
1915 setup_destructive_playlist ();
1921 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1923 if (_session.get_block_size() > speed_buffer_size) {
1924 speed_buffer_size = _session.get_block_size();
1925 boost::shared_ptr<ChannelList> c = channels.reader();
1927 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1928 if ((*chan)->speed_buffer)
1929 delete [] (*chan)->speed_buffer;
1930 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1933 allocate_temporary_buffers ();
1937 AudioDiskstream::allocate_temporary_buffers ()
1939 /* make sure the wrap buffer is at least large enough to deal
1940 with the speeds up to 1.2, to allow for micro-variation
1941 when slaving to MTC, Timecode etc.
1944 double const sp = max (fabsf (_actual_speed), 1.2f);
1945 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1947 if (required_wrap_size > wrap_buffer_size) {
1949 boost::shared_ptr<ChannelList> c = channels.reader();
1951 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1952 if ((*chan)->playback_wrap_buffer) {
1953 delete [] (*chan)->playback_wrap_buffer;
1955 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1956 if ((*chan)->capture_wrap_buffer) {
1957 delete [] (*chan)->capture_wrap_buffer;
1959 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1962 wrap_buffer_size = required_wrap_size;
1967 AudioDiskstream::request_jack_monitors_input (bool yn)
1969 boost::shared_ptr<ChannelList> c = channels.reader();
1971 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1972 (*chan)->source.request_jack_monitors_input (yn);
1977 AudioDiskstream::set_align_style_from_io ()
1979 bool have_physical = false;
1981 if (_alignment_choice != Automatic) {
1989 get_input_sources ();
1991 boost::shared_ptr<ChannelList> c = channels.reader();
1993 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1994 if ((*chan)->source.is_physical ()) {
1995 have_physical = true;
2000 if (have_physical) {
2001 set_align_style (ExistingMaterial);
2003 set_align_style (CaptureTime);
2008 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2010 while (how_many--) {
2011 c->push_back (new ChannelInfo(
2012 _session.butler()->audio_diskstream_playback_buffer_size(),
2013 _session.butler()->audio_diskstream_capture_buffer_size(),
2014 speed_buffer_size, wrap_buffer_size));
2015 interpolation.add_channel_to (
2016 _session.butler()->audio_diskstream_playback_buffer_size(),
2020 _n_channels.set(DataType::AUDIO, c->size());
2026 AudioDiskstream::add_channel (uint32_t how_many)
2028 RCUWriter<ChannelList> writer (channels);
2029 boost::shared_ptr<ChannelList> c = writer.get_copy();
2031 return add_channel_to (c, how_many);
2035 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2037 while (how_many-- && !c->empty()) {
2040 interpolation.remove_channel_from ();
2043 _n_channels.set(DataType::AUDIO, c->size());
2049 AudioDiskstream::remove_channel (uint32_t how_many)
2051 RCUWriter<ChannelList> writer (channels);
2052 boost::shared_ptr<ChannelList> c = writer.get_copy();
2054 return remove_channel_from (c, how_many);
2058 AudioDiskstream::playback_buffer_load () const
2060 boost::shared_ptr<ChannelList> c = channels.reader();
2066 return (float) ((double) c->front()->playback_buf->read_space()/
2067 (double) c->front()->playback_buf->bufsize());
2071 AudioDiskstream::capture_buffer_load () const
2073 boost::shared_ptr<ChannelList> c = channels.reader();
2079 return (float) ((double) c->front()->capture_buf->write_space()/
2080 (double) c->front()->capture_buf->bufsize());
2084 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2086 const XMLProperty* prop;
2087 XMLNodeList nlist = node.children();
2088 XMLNodeIterator niter;
2089 boost::shared_ptr<AudioFileSource> fs;
2090 boost::shared_ptr<AudioFileSource> first_fs;
2091 SourceList pending_sources;
2092 framepos_t position;
2094 if ((prop = node.property (X_("at"))) == 0) {
2098 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2102 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2103 if ((*niter)->name() == X_("file")) {
2105 if ((prop = (*niter)->property (X_("path"))) == 0) {
2109 // This protects sessions from errant CapturingSources in stored sessions
2111 if (stat (prop->value().c_str(), &sbuf)) {
2116 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2117 SourceFactory::createWritable (
2118 DataType::AUDIO, _session,
2119 prop->value(), string(), false, _session.frame_rate()));
2122 catch (failed_constructor& err) {
2123 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2124 _name, prop->value())
2129 pending_sources.push_back (fs);
2131 if (first_fs == 0) {
2135 fs->set_captured_for (_name.val());
2139 if (pending_sources.size() == 0) {
2140 /* nothing can be done */
2144 if (pending_sources.size() != _n_channels.n_audio()) {
2145 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2150 boost::shared_ptr<AudioRegion> region;
2156 plist.add (Properties::start, 0);
2157 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2158 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2160 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2162 region->set_automatic (true);
2163 region->set_whole_file (true);
2164 region->special_set_position (0);
2167 catch (failed_constructor& err) {
2168 error << string_compose (
2169 _("%1: cannot create whole-file region from pending capture sources"),
2175 _playlist->add_region (region, position);
2181 AudioDiskstream::set_non_layered (bool yn)
2183 if (yn != non_layered()) {
2186 _flags = Flag (_flags | NonLayered);
2188 _flags = Flag (_flags & ~NonLayered);
2196 AudioDiskstream::set_destructive (bool yn)
2198 if (yn != destructive()) {
2201 bool bounce_ignored;
2202 /* requestor should already have checked this and
2203 bounced if necessary and desired
2205 if (!can_become_destructive (bounce_ignored)) {
2208 _flags = Flag (_flags | Destructive);
2209 use_destructive_playlist ();
2211 _flags = Flag (_flags & ~Destructive);
2212 reset_write_sources (true, true);
2220 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2223 requires_bounce = false;
2227 /* is there only one region ? */
2229 if (_playlist->n_regions() != 1) {
2230 requires_bounce = true;
2234 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2236 requires_bounce = false;
2240 /* do the source(s) for the region cover the session start position ? */
2242 if (first->position() != _session.current_start_frame()) {
2243 if (first->start() > _session.current_start_frame()) {
2244 requires_bounce = true;
2249 /* is the source used by only 1 playlist ? */
2251 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2255 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2256 requires_bounce = true;
2260 requires_bounce = false;
2265 AudioDiskstream::adjust_playback_buffering ()
2267 boost::shared_ptr<ChannelList> c = channels.reader();
2269 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2270 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2275 AudioDiskstream::adjust_capture_buffering ()
2277 boost::shared_ptr<ChannelList> c = channels.reader();
2279 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2280 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2285 AudioDiskstream::ChannelSource::is_physical () const
2291 return AudioEngine::instance()->port_is_physical (name);
2295 AudioDiskstream::ChannelSource::request_jack_monitors_input (bool yn) const
2301 return AudioEngine::instance()->request_jack_monitors_input (name, yn);
2304 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2306 current_capture_buffer = 0;
2307 current_playback_buffer = 0;
2308 curr_capture_cnt = 0;
2310 speed_buffer = new Sample[speed_size];
2311 playback_wrap_buffer = new Sample[wrap_size];
2312 capture_wrap_buffer = new Sample[wrap_size];
2314 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2315 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2316 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2318 /* touch the ringbuffer buffers, which will cause
2319 them to be mapped into locked physical RAM if
2320 we're running with mlockall(). this doesn't do
2324 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2325 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2326 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2330 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2332 delete playback_buf;
2333 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2334 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2338 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2342 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2343 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2346 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2348 write_source.reset ();
2350 delete [] speed_buffer;
2353 delete [] playback_wrap_buffer;
2354 playback_wrap_buffer = 0;
2356 delete [] capture_wrap_buffer;
2357 capture_wrap_buffer = 0;
2359 delete playback_buf;
2365 delete capture_transition_buf;
2366 capture_transition_buf = 0;
2371 AudioDiskstream::set_name (string const & name)
2373 Diskstream::set_name (name);
2375 /* get a new write source so that its name reflects the new diskstream name */
2377 boost::shared_ptr<ChannelList> c = channels.reader();
2378 ChannelList::iterator i;
2381 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2382 use_new_write_source (n);