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++;
1514 if (_playlist->explicit_relayering()) {
1515 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1516 should end up on. Put it at the top.
1518 region->set_layer (_playlist->top_layer() + 1);
1519 region->set_pending_explicit_relayer (true);
1522 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1523 i_am_the_modifier--;
1525 buffer_position += (*ci)->frames;
1529 _session.add_command (new StatefulDiffCommand (_playlist));
1532 mark_write_completed = true;
1535 reset_write_sources (mark_write_completed);
1539 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1543 capture_info.clear ();
1544 capture_start_frame = 0;
1548 AudioDiskstream::transport_looped (framepos_t transport_frame)
1550 if (was_recording) {
1551 // all we need to do is finish this capture, with modified capture length
1552 boost::shared_ptr<ChannelList> c = channels.reader();
1554 // adjust the capture length knowing that the data will be recorded to disk
1555 // only necessary after the first loop where we're recording
1556 if (capture_info.size() == 0) {
1557 capture_captured += _capture_offset;
1559 if (_alignment_style == ExistingMaterial) {
1560 capture_captured += _session.worst_output_latency();
1562 capture_captured += _roll_delay;
1568 // the next region will start recording via the normal mechanism
1569 // we'll set the start position to the current transport pos
1570 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1571 capture_start_frame = transport_frame;
1572 first_recordable_frame = transport_frame; // mild lie
1573 last_recordable_frame = max_framepos;
1574 was_recording = true;
1576 if (recordable() && destructive()) {
1577 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1579 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1580 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1582 if (transvec.len[0] > 0) {
1583 transvec.buf[0]->type = CaptureStart;
1584 transvec.buf[0]->capture_val = capture_start_frame;
1585 (*chan)->capture_transition_buf->increment_write_ptr(1);
1589 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1599 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1601 was_recording = false;
1602 first_recordable_frame = max_framepos;
1603 last_recordable_frame = max_framepos;
1605 if (capture_captured == 0) {
1609 if (recordable() && destructive()) {
1610 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1612 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1613 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1615 if (transvec.len[0] > 0) {
1616 transvec.buf[0]->type = CaptureEnd;
1617 transvec.buf[0]->capture_val = capture_captured;
1618 (*chan)->capture_transition_buf->increment_write_ptr(1);
1622 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1628 CaptureInfo* ci = new CaptureInfo;
1630 ci->start = capture_start_frame;
1631 ci->frames = capture_captured;
1633 /* XXX theoretical race condition here. Need atomic exchange ?
1634 However, the circumstances when this is called right
1635 now (either on record-disable or transport_stopped)
1636 mean that no actual race exists. I think ...
1637 We now have a capture_info_lock, but it is only to be used
1638 to synchronize in the transport_stop and the capture info
1639 accessors, so that invalidation will not occur (both non-realtime).
1642 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1644 capture_info.push_back (ci);
1645 capture_captured = 0;
1647 /* now we've finished a capture, reset first_recordable_frame for next time */
1648 first_recordable_frame = max_framepos;
1652 AudioDiskstream::set_record_enabled (bool yn)
1654 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1658 /* can't rec-enable in destructive mode if transport is before start */
1660 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1664 /* yes, i know that this not proof against race conditions, but its
1665 good enough. i think.
1668 if (record_enabled() != yn) {
1670 engage_record_enable ();
1672 disengage_record_enable ();
1678 AudioDiskstream::engage_record_enable ()
1680 bool rolling = _session.transport_speed() != 0.0f;
1681 boost::shared_ptr<ChannelList> c = channels.reader();
1683 g_atomic_int_set (&_record_enabled, 1);
1684 capturing_sources.clear ();
1686 if (Config->get_monitoring_model() == HardwareMonitoring) {
1688 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1689 (*chan)->source.request_jack_monitors_input (!(_session.config.get_auto_input() && rolling));
1690 capturing_sources.push_back ((*chan)->write_source);
1691 (*chan)->write_source->mark_streaming_write_started ();
1695 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1696 capturing_sources.push_back ((*chan)->write_source);
1697 (*chan)->write_source->mark_streaming_write_started ();
1701 RecordEnableChanged (); /* EMIT SIGNAL */
1705 AudioDiskstream::disengage_record_enable ()
1707 g_atomic_int_set (&_record_enabled, 0);
1708 boost::shared_ptr<ChannelList> c = channels.reader();
1709 if (Config->get_monitoring_model() == HardwareMonitoring) {
1710 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1711 (*chan)->source.request_jack_monitors_input (false);
1714 capturing_sources.clear ();
1715 RecordEnableChanged (); /* EMIT SIGNAL */
1719 AudioDiskstream::get_state ()
1721 XMLNode& node (Diskstream::get_state());
1723 LocaleGuard lg (X_("POSIX"));
1725 boost::shared_ptr<ChannelList> c = channels.reader();
1726 snprintf (buf, sizeof(buf), "%zd", c->size());
1727 node.add_property ("channels", buf);
1729 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1731 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1732 XMLNode* cs_grandchild;
1734 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1735 cs_grandchild = new XMLNode (X_("file"));
1736 cs_grandchild->add_property (X_("path"), (*i)->path());
1737 cs_child->add_child_nocopy (*cs_grandchild);
1740 /* store the location where capture will start */
1744 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1745 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1747 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1750 cs_child->add_property (X_("at"), buf);
1751 node.add_child_nocopy (*cs_child);
1758 AudioDiskstream::set_state (const XMLNode& node, int version)
1760 const XMLProperty* prop;
1761 XMLNodeList nlist = node.children();
1762 XMLNodeIterator niter;
1763 uint32_t nchans = 1;
1764 XMLNode* capture_pending_node = 0;
1765 LocaleGuard lg (X_("POSIX"));
1767 /* prevent write sources from being created */
1769 in_set_state = true;
1771 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1772 if ((*niter)->name() == IO::state_node_name) {
1773 deprecated_io_node = new XMLNode (**niter);
1776 if ((*niter)->name() == X_("CapturingSources")) {
1777 capture_pending_node = *niter;
1781 if (Diskstream::set_state (node, version)) {
1785 if ((prop = node.property ("channels")) != 0) {
1786 nchans = atoi (prop->value().c_str());
1789 // create necessary extra channels
1790 // we are always constructed with one and we always need one
1792 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1794 if (nchans > _n_channels.n_audio()) {
1796 add_channel (nchans - _n_channels.n_audio());
1797 IO::PortCountChanged(_n_channels);
1799 } else if (nchans < _n_channels.n_audio()) {
1801 remove_channel (_n_channels.n_audio() - nchans);
1806 if (!destructive() && capture_pending_node) {
1807 /* destructive streams have one and only one source per channel,
1808 and so they never end up in pending capture in any useful
1811 use_pending_capture_data (*capture_pending_node);
1814 in_set_state = false;
1816 /* make sure this is clear before we do anything else */
1818 capturing_sources.clear ();
1820 /* write sources are handled when we handle the input set
1821 up of the IO that owns this DS (::non_realtime_input_change())
1828 AudioDiskstream::use_new_write_source (uint32_t n)
1830 boost::shared_ptr<ChannelList> c = channels.reader();
1832 if (!recordable()) {
1836 if (n >= c->size()) {
1837 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1841 ChannelInfo* chan = (*c)[n];
1844 if ((chan->write_source = _session.create_audio_source_for_session (
1845 n_channels().n_audio(), name(), n, destructive())) == 0) {
1846 throw failed_constructor();
1850 catch (failed_constructor &err) {
1851 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1852 chan->write_source.reset ();
1856 /* do not remove destructive files even if they are empty */
1858 chan->write_source->set_allow_remove_if_empty (!destructive());
1863 list<boost::shared_ptr<Source> >
1864 AudioDiskstream::steal_write_sources()
1866 /* not possible to steal audio write sources */
1867 list<boost::shared_ptr<Source> > ret;
1872 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1874 ChannelList::iterator chan;
1875 boost::shared_ptr<ChannelList> c = channels.reader();
1878 if (!_session.writable() || !recordable()) {
1882 capturing_sources.clear ();
1884 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1886 if (!destructive()) {
1888 if ((*chan)->write_source) {
1890 if (mark_write_complete) {
1891 (*chan)->write_source->mark_streaming_write_completed ();
1892 (*chan)->write_source->done_with_peakfile_writes ();
1895 if ((*chan)->write_source->removable()) {
1896 (*chan)->write_source->mark_for_remove ();
1897 (*chan)->write_source->drop_references ();
1900 (*chan)->write_source.reset ();
1903 use_new_write_source (n);
1905 if (record_enabled()) {
1906 capturing_sources.push_back ((*chan)->write_source);
1911 if ((*chan)->write_source == 0) {
1912 use_new_write_source (n);
1917 if (destructive() && !c->empty ()) {
1919 /* we now have all our write sources set up, so create the
1920 playlist's single region.
1923 if (_playlist->empty()) {
1924 setup_destructive_playlist ();
1930 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1932 if (_session.get_block_size() > speed_buffer_size) {
1933 speed_buffer_size = _session.get_block_size();
1934 boost::shared_ptr<ChannelList> c = channels.reader();
1936 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1937 if ((*chan)->speed_buffer)
1938 delete [] (*chan)->speed_buffer;
1939 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1942 allocate_temporary_buffers ();
1946 AudioDiskstream::allocate_temporary_buffers ()
1948 /* make sure the wrap buffer is at least large enough to deal
1949 with the speeds up to 1.2, to allow for micro-variation
1950 when slaving to MTC, Timecode etc.
1953 double const sp = max (fabsf (_actual_speed), 1.2f);
1954 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1956 if (required_wrap_size > wrap_buffer_size) {
1958 boost::shared_ptr<ChannelList> c = channels.reader();
1960 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1961 if ((*chan)->playback_wrap_buffer) {
1962 delete [] (*chan)->playback_wrap_buffer;
1964 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1965 if ((*chan)->capture_wrap_buffer) {
1966 delete [] (*chan)->capture_wrap_buffer;
1968 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1971 wrap_buffer_size = required_wrap_size;
1976 AudioDiskstream::request_jack_monitors_input (bool yn)
1978 boost::shared_ptr<ChannelList> c = channels.reader();
1980 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1981 (*chan)->source.request_jack_monitors_input (yn);
1986 AudioDiskstream::set_align_style_from_io ()
1988 bool have_physical = false;
1990 if (_alignment_choice != Automatic) {
1998 get_input_sources ();
2000 boost::shared_ptr<ChannelList> c = channels.reader();
2002 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2003 if ((*chan)->source.is_physical ()) {
2004 have_physical = true;
2009 if (have_physical) {
2010 set_align_style (ExistingMaterial);
2012 set_align_style (CaptureTime);
2017 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2019 while (how_many--) {
2020 c->push_back (new ChannelInfo(
2021 _session.butler()->audio_diskstream_playback_buffer_size(),
2022 _session.butler()->audio_diskstream_capture_buffer_size(),
2023 speed_buffer_size, wrap_buffer_size));
2024 interpolation.add_channel_to (
2025 _session.butler()->audio_diskstream_playback_buffer_size(),
2029 _n_channels.set(DataType::AUDIO, c->size());
2035 AudioDiskstream::add_channel (uint32_t how_many)
2037 RCUWriter<ChannelList> writer (channels);
2038 boost::shared_ptr<ChannelList> c = writer.get_copy();
2040 return add_channel_to (c, how_many);
2044 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2046 while (how_many-- && !c->empty()) {
2049 interpolation.remove_channel_from ();
2052 _n_channels.set(DataType::AUDIO, c->size());
2058 AudioDiskstream::remove_channel (uint32_t how_many)
2060 RCUWriter<ChannelList> writer (channels);
2061 boost::shared_ptr<ChannelList> c = writer.get_copy();
2063 return remove_channel_from (c, how_many);
2067 AudioDiskstream::playback_buffer_load () const
2069 boost::shared_ptr<ChannelList> c = channels.reader();
2075 return (float) ((double) c->front()->playback_buf->read_space()/
2076 (double) c->front()->playback_buf->bufsize());
2080 AudioDiskstream::capture_buffer_load () const
2082 boost::shared_ptr<ChannelList> c = channels.reader();
2088 return (float) ((double) c->front()->capture_buf->write_space()/
2089 (double) c->front()->capture_buf->bufsize());
2093 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2095 const XMLProperty* prop;
2096 XMLNodeList nlist = node.children();
2097 XMLNodeIterator niter;
2098 boost::shared_ptr<AudioFileSource> fs;
2099 boost::shared_ptr<AudioFileSource> first_fs;
2100 SourceList pending_sources;
2101 framepos_t position;
2103 if ((prop = node.property (X_("at"))) == 0) {
2107 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2111 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2112 if ((*niter)->name() == X_("file")) {
2114 if ((prop = (*niter)->property (X_("path"))) == 0) {
2118 // This protects sessions from errant CapturingSources in stored sessions
2120 if (stat (prop->value().c_str(), &sbuf)) {
2125 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2126 SourceFactory::createWritable (
2127 DataType::AUDIO, _session,
2128 prop->value(), string(), false, _session.frame_rate()));
2131 catch (failed_constructor& err) {
2132 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2133 _name, prop->value())
2138 pending_sources.push_back (fs);
2140 if (first_fs == 0) {
2144 fs->set_captured_for (_name.val());
2148 if (pending_sources.size() == 0) {
2149 /* nothing can be done */
2153 if (pending_sources.size() != _n_channels.n_audio()) {
2154 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2159 boost::shared_ptr<AudioRegion> region;
2165 plist.add (Properties::start, 0);
2166 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2167 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2169 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2171 region->set_automatic (true);
2172 region->set_whole_file (true);
2173 region->special_set_position (0);
2176 catch (failed_constructor& err) {
2177 error << string_compose (
2178 _("%1: cannot create whole-file region from pending capture sources"),
2184 _playlist->add_region (region, position);
2190 AudioDiskstream::set_non_layered (bool yn)
2192 if (yn != non_layered()) {
2195 _flags = Flag (_flags | NonLayered);
2197 _flags = Flag (_flags & ~NonLayered);
2205 AudioDiskstream::set_destructive (bool yn)
2207 if (yn != destructive()) {
2210 bool bounce_ignored;
2211 /* requestor should already have checked this and
2212 bounced if necessary and desired
2214 if (!can_become_destructive (bounce_ignored)) {
2217 _flags = Flag (_flags | Destructive);
2218 use_destructive_playlist ();
2220 _flags = Flag (_flags & ~Destructive);
2221 reset_write_sources (true, true);
2229 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2232 requires_bounce = false;
2236 /* is there only one region ? */
2238 if (_playlist->n_regions() != 1) {
2239 requires_bounce = true;
2243 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2245 requires_bounce = false;
2249 /* do the source(s) for the region cover the session start position ? */
2251 if (first->position() != _session.current_start_frame()) {
2252 if (first->start() > _session.current_start_frame()) {
2253 requires_bounce = true;
2258 /* is the source used by only 1 playlist ? */
2260 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2264 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2265 requires_bounce = true;
2269 requires_bounce = false;
2274 AudioDiskstream::adjust_playback_buffering ()
2276 boost::shared_ptr<ChannelList> c = channels.reader();
2278 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2279 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2284 AudioDiskstream::adjust_capture_buffering ()
2286 boost::shared_ptr<ChannelList> c = channels.reader();
2288 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2289 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2294 AudioDiskstream::ChannelSource::is_physical () const
2300 return AudioEngine::instance()->port_is_physical (name);
2304 AudioDiskstream::ChannelSource::request_jack_monitors_input (bool yn) const
2310 return AudioEngine::instance()->request_jack_monitors_input (name, yn);
2313 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2315 current_capture_buffer = 0;
2316 current_playback_buffer = 0;
2317 curr_capture_cnt = 0;
2319 speed_buffer = new Sample[speed_size];
2320 playback_wrap_buffer = new Sample[wrap_size];
2321 capture_wrap_buffer = new Sample[wrap_size];
2323 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2324 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2325 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2327 /* touch the ringbuffer buffers, which will cause
2328 them to be mapped into locked physical RAM if
2329 we're running with mlockall(). this doesn't do
2333 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2334 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2335 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2339 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2341 delete playback_buf;
2342 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2343 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2347 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2351 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2352 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2355 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2357 write_source.reset ();
2359 delete [] speed_buffer;
2362 delete [] playback_wrap_buffer;
2363 playback_wrap_buffer = 0;
2365 delete [] capture_wrap_buffer;
2366 capture_wrap_buffer = 0;
2368 delete playback_buf;
2374 delete capture_transition_buf;
2375 capture_transition_buf = 0;
2380 AudioDiskstream::set_name (string const & name)
2382 Diskstream::set_name (name);
2384 /* get a new write source so that its name reflects the new diskstream name */
2386 boost::shared_ptr<ChannelList> c = channels.reader();
2387 ChannelList::iterator i;
2390 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2391 use_new_write_source (n);