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 playlist->set_orig_diskstream_id (id());
285 return use_playlist (playlist);
293 AudioDiskstream::use_copy_playlist ()
295 assert(audio_playlist());
301 if (_playlist == 0) {
302 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
307 boost::shared_ptr<AudioPlaylist> playlist;
309 newname = Playlist::bump_name (_playlist->name(), _session);
311 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
312 playlist->set_orig_diskstream_id (id());
313 return use_playlist (playlist);
320 AudioDiskstream::setup_destructive_playlist ()
323 boost::shared_ptr<ChannelList> c = channels.reader();
325 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
326 srcs.push_back ((*chan)->write_source);
329 /* a single full-sized region */
331 assert (!srcs.empty ());
334 plist.add (Properties::name, _name.val());
335 plist.add (Properties::start, 0);
336 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
338 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
339 _playlist->add_region (region, srcs.front()->natural_position());
343 AudioDiskstream::use_destructive_playlist ()
345 /* this is called from the XML-based constructor or ::set_destructive. when called,
346 we already have a playlist and a region, but we need to
347 set up our sources for write. we use the sources associated
348 with the (presumed single, full-extent) region.
351 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
354 reset_write_sources (false, true);
358 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
361 throw failed_constructor();
364 /* be sure to stretch the region out to the maximum length */
366 region->set_length (max_framepos - region->position());
369 ChannelList::iterator chan;
370 boost::shared_ptr<ChannelList> c = channels.reader();
372 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
373 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
374 assert((*chan)->write_source);
375 (*chan)->write_source->set_allow_remove_if_empty (false);
377 /* this might be false if we switched modes, so force it */
379 (*chan)->write_source->set_destructive (true);
382 /* the source list will never be reset for a destructive track */
386 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
388 if (recordable() && destructive()) {
389 boost::shared_ptr<ChannelList> c = channels.reader();
390 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
392 RingBufferNPT<CaptureTransition>::rw_vector transitions;
393 (*chan)->capture_transition_buf->get_write_vector (&transitions);
395 if (transitions.len[0] > 0) {
396 transitions.buf[0]->type = CaptureStart;
397 transitions.buf[0]->capture_val = capture_start_frame;
398 (*chan)->capture_transition_buf->increment_write_ptr(1);
401 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
409 /** Do some record stuff [not described in this comment!]
412 * - Setup playback_distance with the nframes, or nframes adjusted
413 * for current varispeed, if appropriate.
414 * - Setup current_playback_buffer in each ChannelInfo to point to data
415 * that someone can read playback_distance worth of data from.
418 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance)
421 boost::shared_ptr<ChannelList> c = channels.reader();
422 ChannelList::iterator chan;
423 framecnt_t rec_offset = 0;
424 framecnt_t rec_nframes = 0;
425 bool collect_playback = false;
426 bool can_record = _session.actively_recording ();
428 playback_distance = 0;
430 if (!_io || !_io->active()) {
434 check_record_status (transport_frame, can_record);
440 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
446 adjust_capture_position = 0;
448 for (chan = c->begin(); chan != c->end(); ++chan) {
449 (*chan)->current_capture_buffer = 0;
450 (*chan)->current_playback_buffer = 0;
453 // Safeguard against situations where process() goes haywire when autopunching
454 // and last_recordable_frame < first_recordable_frame
456 if (last_recordable_frame < first_recordable_frame) {
457 last_recordable_frame = max_framepos;
460 if (record_enabled()) {
462 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
463 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
465 if (rec_nframes && !was_recording) {
466 capture_captured = 0;
467 was_recording = true;
471 if (can_record && !_last_capture_sources.empty()) {
472 _last_capture_sources.clear ();
477 uint32_t limit = _io->n_ports ().n_audio();
479 /* one or more ports could already have been removed from _io, but our
480 channel setup hasn't yet been updated. prevent us from trying to
481 use channels that correspond to missing ports. note that the
482 process callback (from which this is called) is always atomic
483 with respect to port removal/addition.
486 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
488 ChannelInfo* chaninfo (*chan);
490 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
492 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
494 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
496 /* note: grab the entire port buffer, but only copy what we were supposed to
497 for recording, and use rec_offset
500 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
502 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
504 Sample *buf = ap->get_audio_buffer (nframes).data (rec_offset);
505 memcpy (chaninfo->current_capture_buffer, buf, sizeof (Sample) * rec_nframes);
509 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
511 if (rec_nframes > total) {
516 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
519 Sample* buf = ap->get_audio_buffer(nframes).data (rec_offset);
520 framecnt_t first = chaninfo->capture_vector.len[0];
522 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
523 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
524 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
525 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
527 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
541 /* data will be written to disk */
543 if (rec_nframes == nframes && rec_offset == 0) {
545 for (chan = c->begin(); chan != c->end(); ++chan) {
546 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
549 playback_distance = nframes;
554 /* we can't use the capture buffer as the playback buffer, because
555 we recorded only a part of the current process' cycle data
559 collect_playback = true;
562 adjust_capture_position = rec_nframes;
564 } else if (can_record && record_enabled()) {
566 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
568 for (chan = c->begin(); chan != c->end(); ++chan) {
569 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
572 playback_distance = nframes;
576 collect_playback = true;
579 if ((_track->monitoring_state () & MonitoringDisk) || collect_playback) {
581 /* we're doing playback */
583 framecnt_t necessary_samples;
585 /* no varispeed playback if we're recording, because the output .... TBD */
587 if (rec_nframes == 0 && _actual_speed != 1.0f) {
588 necessary_samples = (framecnt_t) floor ((nframes * fabs (_actual_speed))) + 1;
590 necessary_samples = nframes;
593 for (chan = c->begin(); chan != c->end(); ++chan) {
594 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
599 /* Setup current_playback_buffer in each ChannelInfo to point to data that someone
600 can read necessary_samples (== nframes at a transport speed of 1) worth of data
604 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
606 ChannelInfo* chaninfo (*chan);
608 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
609 /* There are enough samples in the first part of the ringbuffer */
610 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
613 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
615 if (necessary_samples > total) {
616 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
617 cerr << "underrun for " << _name << endl;
623 /* We have enough samples, but not in one lump. Coalesce the two parts
624 into one in playback_wrap_buffer in our ChannelInfo, and specify that
625 as our current_playback_buffer.
628 /* Copy buf[0] from playback_buf */
629 memcpy ((char *) chaninfo->playback_wrap_buffer,
630 chaninfo->playback_vector.buf[0],
631 chaninfo->playback_vector.len[0] * sizeof (Sample));
633 /* Copy buf[1] from playback_buf */
634 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
635 chaninfo->playback_vector.buf[1],
636 (necessary_samples - chaninfo->playback_vector.len[0])
639 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
644 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
646 interpolation.set_speed (_target_speed);
649 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
650 ChannelInfo* chaninfo (*chan);
652 playback_distance = interpolation.interpolate (
653 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
655 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
659 playback_distance = nframes;
662 _speed = _target_speed;
668 /** Update various things including playback_sample, read pointer on each channel's playback_buf
669 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
670 * @return true if the butler is required.
673 AudioDiskstream::commit (framecnt_t playback_distance)
675 bool need_butler = false;
677 if (!_io || !_io->active()) {
681 if (_actual_speed < 0.0) {
682 playback_sample -= playback_distance;
684 playback_sample += playback_distance;
687 boost::shared_ptr<ChannelList> c = channels.reader();
688 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
690 (*chan)->playback_buf->increment_read_ptr (playback_distance);
692 if (adjust_capture_position) {
693 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
697 if (adjust_capture_position != 0) {
698 capture_captured += adjust_capture_position;
699 adjust_capture_position = 0;
707 if (_io && _io->active()) {
708 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
713 if (_io && _io->active()) {
714 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
715 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
717 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
725 AudioDiskstream::set_pending_overwrite (bool yn)
727 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
729 _pending_overwrite = yn;
731 overwrite_frame = playback_sample;
733 boost::shared_ptr<ChannelList> c = channels.reader ();
735 overwrite_offset = c->front()->playback_buf->get_read_ptr();
740 AudioDiskstream::overwrite_existing_buffers ()
742 boost::shared_ptr<ChannelList> c = channels.reader();
744 _pending_overwrite = false;
748 Sample* mixdown_buffer;
751 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
753 overwrite_queued = false;
755 /* assume all are the same size */
756 framecnt_t size = c->front()->playback_buf->bufsize();
758 mixdown_buffer = new Sample[size];
759 gain_buffer = new float[size];
761 /* reduce size so that we can fill the buffer correctly (ringbuffers
762 can only handle size-1, otherwise they appear to be empty)
769 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
771 start = overwrite_frame;
772 framecnt_t cnt = size;
774 /* to fill the buffer without resetting the playback sample, we need to
775 do it one or two chunks (normally two).
777 |----------------------------------------------------------------------|
781 |<- second chunk->||<----------------- first chunk ------------------>|
785 framecnt_t to_read = size - overwrite_offset;
787 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
788 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
789 id(), size, playback_sample) << endmsg;
797 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
798 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
799 id(), size, playback_sample) << endmsg;
808 _pending_overwrite = false;
809 delete [] gain_buffer;
810 delete [] mixdown_buffer;
815 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
819 ChannelList::iterator chan;
820 boost::shared_ptr<ChannelList> c = channels.reader();
822 Glib::Mutex::Lock lm (state_lock);
824 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
825 (*chan)->playback_buf->reset ();
826 (*chan)->capture_buf->reset ();
829 /* can't rec-enable in destructive mode if transport is before start */
831 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
832 disengage_record_enable ();
835 playback_sample = frame;
838 if (complete_refill) {
839 while ((ret = do_refill_with_alloc ()) > 0) ;
841 ret = do_refill_with_alloc ();
848 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
850 ChannelList::iterator chan;
851 boost::shared_ptr<ChannelList> c = channels.reader();
853 for (chan = c->begin(); chan != c->end(); ++chan) {
854 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
862 AudioDiskstream::internal_playback_seek (framecnt_t distance)
864 ChannelList::iterator chan;
865 boost::shared_ptr<ChannelList> c = channels.reader();
867 for (chan = c->begin(); chan != c->end(); ++chan) {
868 (*chan)->playback_buf->increment_read_ptr (distance);
871 if (first_recordable_frame < max_framepos) {
872 first_recordable_frame += distance;
874 playback_sample += distance;
879 /** Read some data for 1 channel from our playlist into a buffer.
880 * @param buf Buffer to write to.
881 * @param start Session frame to start reading from; updated to where we end up
883 * @param cnt Count of samples to read.
884 * @param reversed true if we are running backwards, otherwise false.
887 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
888 framepos_t& start, framecnt_t cnt,
889 int channel, bool reversed)
891 framecnt_t this_read = 0;
893 framepos_t loop_end = 0;
894 framepos_t loop_start = 0;
895 framecnt_t offset = 0;
898 /* XXX we don't currently play loops in reverse. not sure why */
902 framecnt_t loop_length = 0;
904 /* Make the use of a Location atomic for this read operation.
906 Note: Locations don't get deleted, so all we care about
907 when I say "atomic" is that we are always pointing to
908 the same one and using a start/length values obtained
912 if ((loc = loop_location) != 0) {
913 loop_start = loc->start();
914 loop_end = loc->end();
915 loop_length = loop_end - loop_start;
918 /* if we are looping, ensure that the first frame we read is at the correct
919 position within the loop.
922 if (loc && start >= loop_end) {
923 start = loop_start + ((start - loop_start) % loop_length);
931 /* We need this while loop in case we hit a loop boundary, in which case our read from
932 the playlist must be split into more than one section.
937 /* take any loop into account. we can't read past the end of the loop. */
939 if (loc && (loop_end - start < cnt)) {
940 this_read = loop_end - start;
947 if (this_read == 0) {
951 this_read = min(cnt,this_read);
953 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
954 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
961 swap_by_ptr (buf, buf + this_read - 1);
965 /* if we read to the end of the loop, go back to the beginning */
982 AudioDiskstream::do_refill_with_alloc ()
984 Sample* mix_buf = new Sample[disk_io_chunk_frames];
985 float* gain_buf = new float[disk_io_chunk_frames];
987 int ret = _do_refill(mix_buf, gain_buf);
995 /** Get some more data from disk and put it in our channels' playback_bufs,
996 * if there is suitable space in them.
999 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1003 RingBufferNPT<Sample>::rw_vector vector;
1004 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1005 framecnt_t total_space;
1006 framecnt_t zero_fill;
1008 ChannelList::iterator i;
1009 boost::shared_ptr<ChannelList> c = channels.reader();
1016 assert(mixdown_buffer);
1017 assert(gain_buffer);
1024 c->front()->playback_buf->get_write_vector (&vector);
1026 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1027 /* nowhere to write to */
1031 /* if there are 2+ chunks of disk i/o possible for
1032 this track, let the caller know so that it can arrange
1033 for us to be called again, ASAP.
1036 if (total_space >= (_slaved ? 3 : 2) * disk_io_chunk_frames) {
1040 /* if we're running close to normal speed and there isn't enough
1041 space to do disk_io_chunk_frames of I/O, then don't bother.
1043 at higher speeds, just do it because the sync between butler
1044 and audio thread may not be good enough.
1046 Note: it is a design assumption that disk_io_chunk_frames is smaller
1047 than the playback buffer size, so this check should never trip when
1048 the playback buffer is empty.
1051 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1055 /* when slaved, don't try to get too close to the read pointer. this
1056 leaves space for the buffer reversal to have something useful to
1060 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1064 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1066 total_space = min (disk_io_chunk_frames, total_space);
1070 if (file_frame == 0) {
1072 /* at start: nothing to do but fill with silence */
1074 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1076 ChannelInfo* chan (*i);
1077 chan->playback_buf->get_write_vector (&vector);
1078 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1079 if (vector.len[1]) {
1080 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1082 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1087 if (file_frame < total_space) {
1089 /* too close to the start: read what we can,
1090 and then zero fill the rest
1093 zero_fill = total_space - file_frame;
1094 total_space = file_frame;
1103 if (file_frame == max_framepos) {
1105 /* at end: nothing to do but fill with silence */
1107 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1109 ChannelInfo* chan (*i);
1110 chan->playback_buf->get_write_vector (&vector);
1111 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1112 if (vector.len[1]) {
1113 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1115 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1120 if (file_frame > max_framepos - total_space) {
1122 /* to close to the end: read what we can, and zero fill the rest */
1124 zero_fill = total_space - (max_framepos - file_frame);
1125 total_space = max_framepos - file_frame;
1132 framepos_t file_frame_tmp = 0;
1134 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1136 ChannelInfo* chan (*i);
1139 framecnt_t len1, len2;
1141 chan->playback_buf->get_write_vector (&vector);
1143 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1145 /* we're not going to fill the first chunk, so certainly do not bother with the
1146 other part. it won't be connected with the part we do fill, as in:
1148 .... => writable space
1149 ++++ => readable space
1150 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1152 |......|+++++++++++++|...............................|
1157 So, just pretend that the buf1 part isn't there.
1167 file_frame_tmp = file_frame;
1169 buf1 = vector.buf[0];
1170 len1 = vector.len[0];
1171 buf2 = vector.buf[1];
1172 len2 = vector.len[1];
1174 to_read = min (ts, len1);
1175 to_read = min (to_read, disk_io_chunk_frames);
1177 assert (to_read >= 0);
1181 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1186 chan->playback_buf->increment_write_ptr (to_read);
1190 to_read = min (ts, len2);
1194 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1195 so read some or all of vector.len[1] as well.
1198 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1203 chan->playback_buf->increment_write_ptr (to_read);
1207 /* XXX: do something */
1212 file_frame = file_frame_tmp;
1213 assert (file_frame >= 0);
1220 /** Flush pending data to disk.
1222 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1223 * of data to disk. it will never write more than that. If it writes that
1224 * much and there is more than that waiting to be written, it will return 1,
1225 * otherwise 0 on success or -1 on failure.
1227 * If there is less than disk_io_chunk_frames to be written, no data will be
1228 * written at all unless @a force_flush is true.
1231 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1235 RingBufferNPT<Sample>::rw_vector vector;
1236 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1239 transvec.buf[0] = 0;
1240 transvec.buf[1] = 0;
1244 boost::shared_ptr<ChannelList> c = channels.reader();
1245 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1247 (*chan)->capture_buf->get_read_vector (&vector);
1249 total = vector.len[0] + vector.len[1];
1251 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1255 /* if there are 2+ chunks of disk i/o possible for
1256 this track, let the caller know so that it can arrange
1257 for us to be called again, ASAP.
1259 if we are forcing a flush, then if there is* any* extra
1260 work, let the caller know.
1262 if we are no longer recording and there is any extra work,
1263 let the caller know too.
1266 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1270 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1272 // check the transition buffer when recording destructive
1273 // important that we get this after the capture buf
1275 if (destructive()) {
1276 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1277 size_t transcount = transvec.len[0] + transvec.len[1];
1280 for (ti=0; ti < transcount; ++ti) {
1281 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1283 if (captrans.type == CaptureStart) {
1284 // by definition, the first data we got above represents the given capture pos
1286 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1287 (*chan)->curr_capture_cnt = 0;
1289 } else if (captrans.type == CaptureEnd) {
1291 // capture end, the capture_val represents total frames in capture
1293 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1295 // shorten to make the write a perfect fit
1296 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1298 if (nto_write < to_write) {
1299 ret = 1; // should we?
1301 to_write = nto_write;
1303 (*chan)->write_source->mark_capture_end ();
1305 // increment past this transition, but go no further
1310 // actually ends just beyond this chunk, so force more work
1318 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1322 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1323 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1327 (*chan)->capture_buf->increment_read_ptr (to_write);
1328 (*chan)->curr_capture_cnt += to_write;
1330 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1332 /* we wrote all of vector.len[0] but it wasn't an entire
1333 disk_io_chunk_frames of data, so arrange for some part
1334 of vector.len[1] to be flushed to disk as well.
1337 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1339 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1340 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1344 (*chan)->capture_buf->increment_read_ptr (to_write);
1345 (*chan)->curr_capture_cnt += to_write;
1354 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1356 uint32_t buffer_position;
1357 bool more_work = true;
1359 boost::shared_ptr<AudioRegion> region;
1360 framecnt_t total_capture;
1362 SourceList::iterator src;
1363 ChannelList::iterator chan;
1364 vector<CaptureInfo*>::iterator ci;
1365 boost::shared_ptr<ChannelList> c = channels.reader();
1367 bool mark_write_completed = false;
1371 /* butler is already stopped, but there may be work to do
1372 to flush remaining data to disk.
1375 while (more_work && !err) {
1376 switch (do_flush (TransportContext, true)) {
1383 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1388 /* XXX is there anything we can do if err != 0 ? */
1389 Glib::Mutex::Lock lm (capture_info_lock);
1391 if (capture_info.empty()) {
1395 if (abort_capture) {
1397 if (destructive()) {
1401 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1403 if ((*chan)->write_source) {
1405 (*chan)->write_source->mark_for_remove ();
1406 (*chan)->write_source->drop_references ();
1407 (*chan)->write_source.reset ();
1410 /* new source set up in "out" below */
1416 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1417 total_capture += (*ci)->frames;
1420 /* figure out the name for this take */
1422 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1424 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1428 s->update_header (capture_info.front()->start, when, twhen);
1429 s->set_captured_for (_name.val());
1430 s->mark_immutable ();
1432 if (Config->get_auto_analyse_audio()) {
1433 Analyser::queue_source_for_analysis (s, true);
1438 /* destructive tracks have a single, never changing region */
1440 if (destructive()) {
1442 /* send a signal that any UI can pick up to do the right thing. there is
1443 a small problem here in that a UI may need the peak data to be ready
1444 for the data that was recorded and this isn't interlocked with that
1445 process. this problem is deferred to the UI.
1448 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1452 string whole_file_region_name;
1453 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1455 /* Register a new region with the Session that
1456 describes the entire source. Do this first
1457 so that any sub-regions will obviously be
1458 children of this one (later!)
1464 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1465 plist.add (Properties::length, total_capture);
1466 plist.add (Properties::name, whole_file_region_name);
1467 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1468 rx->set_automatic (true);
1469 rx->set_whole_file (true);
1471 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1472 region->special_set_position (capture_info.front()->start);
1476 catch (failed_constructor& err) {
1477 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1481 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1483 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1485 _playlist->clear_changes ();
1486 _playlist->freeze ();
1488 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1492 RegionFactory::region_name (region_name, whole_file_region_name, false);
1494 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1495 _name, (*ci)->start, (*ci)->frames, region_name));
1501 plist.add (Properties::start, buffer_position);
1502 plist.add (Properties::length, (*ci)->frames);
1503 plist.add (Properties::name, region_name);
1505 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1506 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1509 catch (failed_constructor& err) {
1510 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1511 continue; /* XXX is this OK? */
1514 i_am_the_modifier++;
1516 if (_playlist->explicit_relayering()) {
1517 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1518 should end up on. Put it at the top.
1520 region->set_layer (_playlist->top_layer() + 1);
1521 region->set_pending_explicit_relayer (true);
1524 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1525 i_am_the_modifier--;
1527 buffer_position += (*ci)->frames;
1531 _session.add_command (new StatefulDiffCommand (_playlist));
1534 mark_write_completed = true;
1537 reset_write_sources (mark_write_completed);
1541 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1545 capture_info.clear ();
1546 capture_start_frame = 0;
1550 AudioDiskstream::transport_looped (framepos_t transport_frame)
1552 if (was_recording) {
1553 // all we need to do is finish this capture, with modified capture length
1554 boost::shared_ptr<ChannelList> c = channels.reader();
1556 // adjust the capture length knowing that the data will be recorded to disk
1557 // only necessary after the first loop where we're recording
1558 if (capture_info.size() == 0) {
1559 capture_captured += _capture_offset;
1561 if (_alignment_style == ExistingMaterial) {
1562 capture_captured += _session.worst_output_latency();
1564 capture_captured += _roll_delay;
1570 // the next region will start recording via the normal mechanism
1571 // we'll set the start position to the current transport pos
1572 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1573 capture_start_frame = transport_frame;
1574 first_recordable_frame = transport_frame; // mild lie
1575 last_recordable_frame = max_framepos;
1576 was_recording = true;
1578 if (recordable() && destructive()) {
1579 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1581 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1582 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1584 if (transvec.len[0] > 0) {
1585 transvec.buf[0]->type = CaptureStart;
1586 transvec.buf[0]->capture_val = capture_start_frame;
1587 (*chan)->capture_transition_buf->increment_write_ptr(1);
1591 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1601 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1603 was_recording = false;
1604 first_recordable_frame = max_framepos;
1605 last_recordable_frame = max_framepos;
1607 if (capture_captured == 0) {
1611 if (recordable() && destructive()) {
1612 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1614 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1615 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1617 if (transvec.len[0] > 0) {
1618 transvec.buf[0]->type = CaptureEnd;
1619 transvec.buf[0]->capture_val = capture_captured;
1620 (*chan)->capture_transition_buf->increment_write_ptr(1);
1624 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1630 CaptureInfo* ci = new CaptureInfo;
1632 ci->start = capture_start_frame;
1633 ci->frames = capture_captured;
1635 /* XXX theoretical race condition here. Need atomic exchange ?
1636 However, the circumstances when this is called right
1637 now (either on record-disable or transport_stopped)
1638 mean that no actual race exists. I think ...
1639 We now have a capture_info_lock, but it is only to be used
1640 to synchronize in the transport_stop and the capture info
1641 accessors, so that invalidation will not occur (both non-realtime).
1644 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1646 capture_info.push_back (ci);
1647 capture_captured = 0;
1649 /* now we've finished a capture, reset first_recordable_frame for next time */
1650 first_recordable_frame = max_framepos;
1654 AudioDiskstream::set_record_enabled (bool yn)
1656 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1660 /* can't rec-enable in destructive mode if transport is before start */
1662 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1666 /* yes, i know that this not proof against race conditions, but its
1667 good enough. i think.
1670 if (record_enabled() != yn) {
1672 engage_record_enable ();
1674 disengage_record_enable ();
1680 AudioDiskstream::engage_record_enable ()
1682 bool rolling = _session.transport_speed() != 0.0f;
1683 boost::shared_ptr<ChannelList> c = channels.reader();
1685 g_atomic_int_set (&_record_enabled, 1);
1686 capturing_sources.clear ();
1688 if (Config->get_monitoring_model() == HardwareMonitoring) {
1690 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1691 (*chan)->source.ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1692 capturing_sources.push_back ((*chan)->write_source);
1693 (*chan)->write_source->mark_streaming_write_started ();
1697 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1698 capturing_sources.push_back ((*chan)->write_source);
1699 (*chan)->write_source->mark_streaming_write_started ();
1703 RecordEnableChanged (); /* EMIT SIGNAL */
1707 AudioDiskstream::disengage_record_enable ()
1709 g_atomic_int_set (&_record_enabled, 0);
1710 boost::shared_ptr<ChannelList> c = channels.reader();
1711 if (Config->get_monitoring_model() == HardwareMonitoring) {
1712 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1713 (*chan)->source.ensure_monitor_input (false);
1716 capturing_sources.clear ();
1717 RecordEnableChanged (); /* EMIT SIGNAL */
1721 AudioDiskstream::get_state ()
1723 XMLNode& node (Diskstream::get_state());
1725 LocaleGuard lg (X_("POSIX"));
1727 boost::shared_ptr<ChannelList> c = channels.reader();
1728 snprintf (buf, sizeof(buf), "%zd", c->size());
1729 node.add_property ("channels", buf);
1731 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1733 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1734 XMLNode* cs_grandchild;
1736 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1737 cs_grandchild = new XMLNode (X_("file"));
1738 cs_grandchild->add_property (X_("path"), (*i)->path());
1739 cs_child->add_child_nocopy (*cs_grandchild);
1742 /* store the location where capture will start */
1746 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1747 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1749 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1752 cs_child->add_property (X_("at"), buf);
1753 node.add_child_nocopy (*cs_child);
1760 AudioDiskstream::set_state (const XMLNode& node, int version)
1762 const XMLProperty* prop;
1763 XMLNodeList nlist = node.children();
1764 XMLNodeIterator niter;
1765 uint32_t nchans = 1;
1766 XMLNode* capture_pending_node = 0;
1767 LocaleGuard lg (X_("POSIX"));
1769 /* prevent write sources from being created */
1771 in_set_state = true;
1773 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1774 if ((*niter)->name() == IO::state_node_name) {
1775 deprecated_io_node = new XMLNode (**niter);
1778 if ((*niter)->name() == X_("CapturingSources")) {
1779 capture_pending_node = *niter;
1783 if (Diskstream::set_state (node, version)) {
1787 if ((prop = node.property ("channels")) != 0) {
1788 nchans = atoi (prop->value().c_str());
1791 // create necessary extra channels
1792 // we are always constructed with one and we always need one
1794 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1796 if (nchans > _n_channels.n_audio()) {
1798 add_channel (nchans - _n_channels.n_audio());
1799 IO::PortCountChanged(_n_channels);
1801 } else if (nchans < _n_channels.n_audio()) {
1803 remove_channel (_n_channels.n_audio() - nchans);
1808 if (!destructive() && capture_pending_node) {
1809 /* destructive streams have one and only one source per channel,
1810 and so they never end up in pending capture in any useful
1813 use_pending_capture_data (*capture_pending_node);
1816 in_set_state = false;
1818 /* make sure this is clear before we do anything else */
1820 capturing_sources.clear ();
1822 /* write sources are handled when we handle the input set
1823 up of the IO that owns this DS (::non_realtime_input_change())
1830 AudioDiskstream::use_new_write_source (uint32_t n)
1832 boost::shared_ptr<ChannelList> c = channels.reader();
1834 if (!recordable()) {
1838 if (n >= c->size()) {
1839 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1843 ChannelInfo* chan = (*c)[n];
1846 if ((chan->write_source = _session.create_audio_source_for_session (
1847 n_channels().n_audio(), name(), n, destructive())) == 0) {
1848 throw failed_constructor();
1852 catch (failed_constructor &err) {
1853 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1854 chan->write_source.reset ();
1858 /* do not remove destructive files even if they are empty */
1860 chan->write_source->set_allow_remove_if_empty (!destructive());
1865 list<boost::shared_ptr<Source> >
1866 AudioDiskstream::steal_write_sources()
1868 /* not possible to steal audio write sources */
1869 list<boost::shared_ptr<Source> > ret;
1874 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1876 ChannelList::iterator chan;
1877 boost::shared_ptr<ChannelList> c = channels.reader();
1880 if (!_session.writable() || !recordable()) {
1884 capturing_sources.clear ();
1886 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1888 if (!destructive()) {
1890 if ((*chan)->write_source) {
1892 if (mark_write_complete) {
1893 (*chan)->write_source->mark_streaming_write_completed ();
1894 (*chan)->write_source->done_with_peakfile_writes ();
1897 if ((*chan)->write_source->removable()) {
1898 (*chan)->write_source->mark_for_remove ();
1899 (*chan)->write_source->drop_references ();
1902 (*chan)->write_source.reset ();
1905 use_new_write_source (n);
1907 if (record_enabled()) {
1908 capturing_sources.push_back ((*chan)->write_source);
1913 if ((*chan)->write_source == 0) {
1914 use_new_write_source (n);
1919 if (destructive() && !c->empty ()) {
1921 /* we now have all our write sources set up, so create the
1922 playlist's single region.
1925 if (_playlist->empty()) {
1926 setup_destructive_playlist ();
1932 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1934 if (_session.get_block_size() > speed_buffer_size) {
1935 speed_buffer_size = _session.get_block_size();
1936 boost::shared_ptr<ChannelList> c = channels.reader();
1938 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1939 if ((*chan)->speed_buffer)
1940 delete [] (*chan)->speed_buffer;
1941 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1944 allocate_temporary_buffers ();
1948 AudioDiskstream::allocate_temporary_buffers ()
1950 /* make sure the wrap buffer is at least large enough to deal
1951 with the speeds up to 1.2, to allow for micro-variation
1952 when slaving to MTC, Timecode etc.
1955 double const sp = max (fabsf (_actual_speed), 1.2f);
1956 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1958 if (required_wrap_size > wrap_buffer_size) {
1960 boost::shared_ptr<ChannelList> c = channels.reader();
1962 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1963 if ((*chan)->playback_wrap_buffer) {
1964 delete [] (*chan)->playback_wrap_buffer;
1966 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1967 if ((*chan)->capture_wrap_buffer) {
1968 delete [] (*chan)->capture_wrap_buffer;
1970 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1973 wrap_buffer_size = required_wrap_size;
1978 AudioDiskstream::monitor_input (bool yn)
1980 boost::shared_ptr<ChannelList> c = channels.reader();
1982 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1983 (*chan)->source.ensure_monitor_input (yn);
1988 AudioDiskstream::set_align_style_from_io ()
1990 bool have_physical = false;
1992 if (_alignment_choice != Automatic) {
2000 get_input_sources ();
2002 boost::shared_ptr<ChannelList> c = channels.reader();
2004 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2005 if ((*chan)->source.is_physical ()) {
2006 have_physical = true;
2011 if (have_physical) {
2012 set_align_style (ExistingMaterial);
2014 set_align_style (CaptureTime);
2019 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2021 while (how_many--) {
2022 c->push_back (new ChannelInfo(
2023 _session.butler()->audio_diskstream_playback_buffer_size(),
2024 _session.butler()->audio_diskstream_capture_buffer_size(),
2025 speed_buffer_size, wrap_buffer_size));
2026 interpolation.add_channel_to (
2027 _session.butler()->audio_diskstream_playback_buffer_size(),
2031 _n_channels.set(DataType::AUDIO, c->size());
2037 AudioDiskstream::add_channel (uint32_t how_many)
2039 RCUWriter<ChannelList> writer (channels);
2040 boost::shared_ptr<ChannelList> c = writer.get_copy();
2042 return add_channel_to (c, how_many);
2046 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2048 while (how_many-- && !c->empty()) {
2051 interpolation.remove_channel_from ();
2054 _n_channels.set(DataType::AUDIO, c->size());
2060 AudioDiskstream::remove_channel (uint32_t how_many)
2062 RCUWriter<ChannelList> writer (channels);
2063 boost::shared_ptr<ChannelList> c = writer.get_copy();
2065 return remove_channel_from (c, how_many);
2069 AudioDiskstream::playback_buffer_load () const
2071 boost::shared_ptr<ChannelList> c = channels.reader();
2077 return (float) ((double) c->front()->playback_buf->read_space()/
2078 (double) c->front()->playback_buf->bufsize());
2082 AudioDiskstream::capture_buffer_load () const
2084 boost::shared_ptr<ChannelList> c = channels.reader();
2090 return (float) ((double) c->front()->capture_buf->write_space()/
2091 (double) c->front()->capture_buf->bufsize());
2095 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2097 const XMLProperty* prop;
2098 XMLNodeList nlist = node.children();
2099 XMLNodeIterator niter;
2100 boost::shared_ptr<AudioFileSource> fs;
2101 boost::shared_ptr<AudioFileSource> first_fs;
2102 SourceList pending_sources;
2103 framepos_t position;
2105 if ((prop = node.property (X_("at"))) == 0) {
2109 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2113 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2114 if ((*niter)->name() == X_("file")) {
2116 if ((prop = (*niter)->property (X_("path"))) == 0) {
2120 // This protects sessions from errant CapturingSources in stored sessions
2122 if (stat (prop->value().c_str(), &sbuf)) {
2127 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2128 SourceFactory::createWritable (
2129 DataType::AUDIO, _session,
2130 prop->value(), string(), false, _session.frame_rate()));
2133 catch (failed_constructor& err) {
2134 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2135 _name, prop->value())
2140 pending_sources.push_back (fs);
2142 if (first_fs == 0) {
2146 fs->set_captured_for (_name.val());
2150 if (pending_sources.size() == 0) {
2151 /* nothing can be done */
2155 if (pending_sources.size() != _n_channels.n_audio()) {
2156 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2161 boost::shared_ptr<AudioRegion> region;
2167 plist.add (Properties::start, 0);
2168 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2169 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2171 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2173 region->set_automatic (true);
2174 region->set_whole_file (true);
2175 region->special_set_position (0);
2178 catch (failed_constructor& err) {
2179 error << string_compose (
2180 _("%1: cannot create whole-file region from pending capture sources"),
2186 _playlist->add_region (region, position);
2192 AudioDiskstream::set_non_layered (bool yn)
2194 if (yn != non_layered()) {
2197 _flags = Flag (_flags | NonLayered);
2199 _flags = Flag (_flags & ~NonLayered);
2207 AudioDiskstream::set_destructive (bool yn)
2209 if (yn != destructive()) {
2212 bool bounce_ignored;
2213 /* requestor should already have checked this and
2214 bounced if necessary and desired
2216 if (!can_become_destructive (bounce_ignored)) {
2219 _flags = Flag (_flags | Destructive);
2220 use_destructive_playlist ();
2222 _flags = Flag (_flags & ~Destructive);
2223 reset_write_sources (true, true);
2231 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2234 requires_bounce = false;
2238 /* is there only one region ? */
2240 if (_playlist->n_regions() != 1) {
2241 requires_bounce = true;
2245 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2247 requires_bounce = false;
2251 /* do the source(s) for the region cover the session start position ? */
2253 if (first->position() != _session.current_start_frame()) {
2254 if (first->start() > _session.current_start_frame()) {
2255 requires_bounce = true;
2260 /* is the source used by only 1 playlist ? */
2262 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2266 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2267 requires_bounce = true;
2271 requires_bounce = false;
2276 AudioDiskstream::adjust_playback_buffering ()
2278 boost::shared_ptr<ChannelList> c = channels.reader();
2280 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2281 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2286 AudioDiskstream::adjust_capture_buffering ()
2288 boost::shared_ptr<ChannelList> c = channels.reader();
2290 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2291 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2296 AudioDiskstream::ChannelSource::is_physical () const
2302 return AudioEngine::instance()->port_is_physical (name);
2306 AudioDiskstream::ChannelSource::ensure_monitor_input (bool yn) const
2312 return AudioEngine::instance()->ensure_monitor_input (name, yn);
2315 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2317 current_capture_buffer = 0;
2318 current_playback_buffer = 0;
2319 curr_capture_cnt = 0;
2321 speed_buffer = new Sample[speed_size];
2322 playback_wrap_buffer = new Sample[wrap_size];
2323 capture_wrap_buffer = new Sample[wrap_size];
2325 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2326 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2327 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2329 /* touch the ringbuffer buffers, which will cause
2330 them to be mapped into locked physical RAM if
2331 we're running with mlockall(). this doesn't do
2335 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2336 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2337 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2341 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2343 delete playback_buf;
2344 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2345 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2349 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2353 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2354 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2357 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2359 write_source.reset ();
2361 delete [] speed_buffer;
2364 delete [] playback_wrap_buffer;
2365 playback_wrap_buffer = 0;
2367 delete [] capture_wrap_buffer;
2368 capture_wrap_buffer = 0;
2370 delete playback_buf;
2376 delete capture_transition_buf;
2377 capture_transition_buf = 0;
2382 AudioDiskstream::set_name (string const & name)
2384 Diskstream::set_name (name);
2386 /* get a new write source so that its name reflects the new diskstream name */
2388 boost::shared_ptr<ChannelList> c = channels.reader();
2389 ChannelList::iterator i;
2392 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2393 use_new_write_source (n);