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 <glibmm/thread.h>
35 #include "pbd/xml++.h"
36 #include "pbd/memento_command.h"
37 #include "pbd/enumwriter.h"
38 #include "pbd/stateful_diff_command.h"
40 #include "ardour/analyser.h"
41 #include "ardour/ardour.h"
42 #include "ardour/audio_buffer.h"
43 #include "ardour/audio_diskstream.h"
44 #include "ardour/audio_port.h"
45 #include "ardour/audioengine.h"
46 #include "ardour/audiofilesource.h"
48 #include "ardour/audioplaylist.h"
49 #include "ardour/audioregion.h"
50 #include "ardour/butler.h"
51 #include "ardour/configuration.h"
52 #include "ardour/cycle_timer.h"
53 #include "ardour/debug.h"
54 #include "ardour/io.h"
55 #include "ardour/playlist_factory.h"
56 #include "ardour/region_factory.h"
57 #include "ardour/send.h"
58 #include "ardour/session.h"
59 #include "ardour/source_factory.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(), this);
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 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool rec_monitors_input, bool& need_butler)
412 boost::shared_ptr<ChannelList> c = channels.reader();
413 ChannelList::iterator chan;
415 framecnt_t rec_offset = 0;
416 framecnt_t rec_nframes = 0;
417 bool collect_playback = false;
419 playback_distance = 0;
421 if (!_io || !_io->active()) {
425 check_record_status (transport_frame, can_record);
431 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
437 adjust_capture_position = 0;
439 for (chan = c->begin(); chan != c->end(); ++chan) {
440 (*chan)->current_capture_buffer = 0;
441 (*chan)->current_playback_buffer = 0;
444 /* two conditions to test for here:
446 A: this track is rec-enabled, and the session has confirmed that we can record
447 B: this track is rec-enabled, has been recording, and we are set up for auto-punch-in
449 The second test is necessary to capture the extra material that arrives AFTER the transport
450 frame has left the punch range (which will cause the "can_record" argument to be false).
454 // Safeguard against situations where process() goes haywire when autopunching
455 // and last_recordable_frame < first_recordable_frame
457 if (last_recordable_frame < first_recordable_frame) {
458 last_recordable_frame = max_framepos;
461 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;
470 if (can_record && !_last_capture_sources.empty()) {
471 _last_capture_sources.clear ();
476 uint32_t limit = _io->n_ports ().n_audio();
478 /* one or more ports could already have been removed from _io, but our
479 channel setup hasn't yet been updated. prevent us from trying to
480 use channels that correspond to missing ports. note that the
481 process callback (from which this is called) is always atomic
482 with respect to port removal/addition.
485 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
487 ChannelInfo* chaninfo (*chan);
489 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
491 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
493 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
495 /* note: grab the entire port buffer, but only copy what we were supposed to
496 for recording, and use rec_offset
499 AudioPort* const ap = _io->audio (n);
501 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
502 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
507 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
509 if (rec_nframes > total) {
514 AudioPort* const ap = _io->audio (n);
517 Sample* buf = ap->get_audio_buffer(nframes).data();
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;
532 finish_capture (rec_monitors_input, c);
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 (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 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
599 ChannelInfo* chaninfo (*chan);
601 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
603 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
606 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
608 if (necessary_samples > total) {
609 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
610 cerr << "underrun for " << _name << endl;
616 memcpy ((char *) chaninfo->playback_wrap_buffer,
617 chaninfo->playback_vector.buf[0],
618 chaninfo->playback_vector.len[0] * sizeof (Sample));
619 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
620 chaninfo->playback_vector.buf[1],
621 (necessary_samples - chaninfo->playback_vector.len[0])
624 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
629 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
630 process_varispeed_playback(nframes, c);
632 playback_distance = nframes;
635 _speed = _target_speed;
641 if (commit (nframes)) {
650 AudioDiskstream::process_varispeed_playback (pframes_t nframes, boost::shared_ptr<ChannelList> c)
652 ChannelList::iterator chan;
654 interpolation.set_speed (_target_speed);
657 for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
658 ChannelInfo* chaninfo (*chan);
660 playback_distance = interpolation.interpolate (
661 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
663 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
668 AudioDiskstream::commit (framecnt_t /* nframes */)
670 bool need_butler = false;
672 if (!_io || !_io->active()) {
676 if (_actual_speed < 0.0) {
677 playback_sample -= playback_distance;
679 playback_sample += playback_distance;
682 boost::shared_ptr<ChannelList> c = channels.reader();
683 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
685 (*chan)->playback_buf->increment_read_ptr (playback_distance);
687 if (adjust_capture_position) {
688 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
692 if (adjust_capture_position != 0) {
693 capture_captured += adjust_capture_position;
694 adjust_capture_position = 0;
702 if (_io && _io->active()) {
703 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
708 if (_io && _io->active()) {
709 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
710 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
712 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
720 AudioDiskstream::set_pending_overwrite (bool yn)
722 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
724 _pending_overwrite = yn;
726 overwrite_frame = playback_sample;
728 boost::shared_ptr<ChannelList> c = channels.reader ();
730 overwrite_offset = c->front()->playback_buf->get_read_ptr();
735 AudioDiskstream::overwrite_existing_buffers ()
737 boost::shared_ptr<ChannelList> c = channels.reader();
739 _pending_overwrite = false;
743 Sample* mixdown_buffer;
746 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
748 overwrite_queued = false;
750 /* assume all are the same size */
751 framecnt_t size = c->front()->playback_buf->bufsize();
753 mixdown_buffer = new Sample[size];
754 gain_buffer = new float[size];
756 /* reduce size so that we can fill the buffer correctly. */
762 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
764 start = overwrite_frame;
765 framecnt_t cnt = size;
767 /* to fill the buffer without resetting the playback sample, we need to
768 do it one or two chunks (normally two).
770 |----------------------------------------------------------------------|
774 |<- second chunk->||<----------------- first chunk ------------------>|
778 framecnt_t to_read = size - overwrite_offset;
780 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
781 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
782 _id, size, playback_sample) << endmsg;
790 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
791 start, cnt, *chan, n, reversed)) {
792 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
793 _id, size, playback_sample) << endmsg;
802 _pending_overwrite = false;
803 delete [] gain_buffer;
804 delete [] mixdown_buffer;
809 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
813 ChannelList::iterator chan;
814 boost::shared_ptr<ChannelList> c = channels.reader();
816 Glib::Mutex::Lock lm (state_lock);
818 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
819 (*chan)->playback_buf->reset ();
820 (*chan)->capture_buf->reset ();
823 /* can't rec-enable in destructive mode if transport is before start */
825 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
826 disengage_record_enable ();
829 playback_sample = frame;
832 if (complete_refill) {
833 while ((ret = do_refill_with_alloc ()) > 0) ;
835 ret = do_refill_with_alloc ();
842 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
844 ChannelList::iterator chan;
845 boost::shared_ptr<ChannelList> c = channels.reader();
847 for (chan = c->begin(); chan != c->end(); ++chan) {
848 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
856 AudioDiskstream::internal_playback_seek (framecnt_t distance)
858 ChannelList::iterator chan;
859 boost::shared_ptr<ChannelList> c = channels.reader();
861 for (chan = c->begin(); chan != c->end(); ++chan) {
862 (*chan)->playback_buf->increment_read_ptr (distance);
865 if (first_recordable_frame < max_framepos) {
866 first_recordable_frame += distance;
868 playback_sample += distance;
874 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
875 framepos_t& start, framecnt_t cnt,
876 ChannelInfo* /*channel_info*/, int channel, bool reversed)
878 framecnt_t this_read = 0;
880 framepos_t loop_end = 0;
881 framepos_t loop_start = 0;
882 framecnt_t offset = 0;
885 /* XXX we don't currently play loops in reverse. not sure why */
889 framecnt_t loop_length = 0;
891 /* Make the use of a Location atomic for this read operation.
893 Note: Locations don't get deleted, so all we care about
894 when I say "atomic" is that we are always pointing to
895 the same one and using a start/length values obtained
899 if ((loc = loop_location) != 0) {
900 loop_start = loc->start();
901 loop_end = loc->end();
902 loop_length = loop_end - loop_start;
905 /* if we are looping, ensure that the first frame we read is at the correct
906 position within the loop.
909 if (loc && start >= loop_end) {
910 //cerr << "start adjusted from " << start;
911 start = loop_start + ((start - loop_start) % loop_length);
912 //cerr << "to " << start << endl;
915 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
924 /* take any loop into account. we can't read past the end of the loop. */
926 if (loc && (loop_end - start < cnt)) {
927 this_read = loop_end - start;
928 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
935 if (this_read == 0) {
939 this_read = min(cnt,this_read);
941 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
942 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
947 _read_data_count = _playlist->read_data_count();
951 swap_by_ptr (buf, buf + this_read - 1);
955 /* if we read to the end of the loop, go back to the beginning */
972 AudioDiskstream::do_refill_with_alloc ()
974 Sample* mix_buf = new Sample[disk_io_chunk_frames];
975 float* gain_buf = new float[disk_io_chunk_frames];
977 int ret = _do_refill(mix_buf, gain_buf);
986 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
990 RingBufferNPT<Sample>::rw_vector vector;
991 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
992 framecnt_t total_space;
993 framecnt_t zero_fill;
995 ChannelList::iterator i;
996 boost::shared_ptr<ChannelList> c = channels.reader();
1003 assert(mixdown_buffer);
1004 assert(gain_buffer);
1011 c->front()->playback_buf->get_write_vector (&vector);
1013 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1017 /* if there are 2+ chunks of disk i/o possible for
1018 this track, let the caller know so that it can arrange
1019 for us to be called again, ASAP.
1022 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1026 /* if we're running close to normal speed and there isn't enough
1027 space to do disk_io_chunk_frames of I/O, then don't bother.
1029 at higher speeds, just do it because the sync between butler
1030 and audio thread may not be good enough.
1033 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1037 /* when slaved, don't try to get too close to the read pointer. this
1038 leaves space for the buffer reversal to have something useful to
1042 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1046 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1048 total_space = min (disk_io_chunk_frames, total_space);
1052 if (file_frame == 0) {
1054 /* at start: nothing to do but fill with silence */
1056 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1058 ChannelInfo* chan (*i);
1059 chan->playback_buf->get_write_vector (&vector);
1060 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1061 if (vector.len[1]) {
1062 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1064 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1069 if (file_frame < total_space) {
1071 /* too close to the start: read what we can,
1072 and then zero fill the rest
1075 zero_fill = total_space - file_frame;
1076 total_space = file_frame;
1085 if (file_frame == max_framepos) {
1087 /* at end: nothing to do but fill with silence */
1089 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1091 ChannelInfo* chan (*i);
1092 chan->playback_buf->get_write_vector (&vector);
1093 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1094 if (vector.len[1]) {
1095 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1097 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1102 if (file_frame > max_framepos - total_space) {
1104 /* to close to the end: read what we can, and zero fill the rest */
1106 zero_fill = total_space - (max_framepos - file_frame);
1107 total_space = max_framepos - file_frame;
1114 framepos_t file_frame_tmp = 0;
1116 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1118 ChannelInfo* chan (*i);
1121 framecnt_t len1, len2;
1123 chan->playback_buf->get_write_vector (&vector);
1125 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1127 /* we're not going to fill the first chunk, so certainly do not bother with the
1128 other part. it won't be connected with the part we do fill, as in:
1130 .... => writable space
1131 ++++ => readable space
1132 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1134 |......|+++++++++++++|...............................|
1139 So, just pretend that the buf1 part isn't there.
1149 file_frame_tmp = file_frame;
1151 buf1 = vector.buf[0];
1152 len1 = vector.len[0];
1153 buf2 = vector.buf[1];
1154 len2 = vector.len[1];
1156 to_read = min (ts, len1);
1157 to_read = min (to_read, disk_io_chunk_frames);
1159 assert (to_read >= 0);
1163 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1168 chan->playback_buf->increment_write_ptr (to_read);
1172 to_read = min (ts, len2);
1176 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1177 so read some or all of vector.len[1] as well.
1180 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1185 chan->playback_buf->increment_write_ptr (to_read);
1194 file_frame = file_frame_tmp;
1195 assert (file_frame >= 0);
1202 /** Flush pending data to disk.
1204 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1205 * of data to disk. it will never write more than that. If it writes that
1206 * much and there is more than that waiting to be written, it will return 1,
1207 * otherwise 0 on success or -1 on failure.
1209 * If there is less than disk_io_chunk_frames to be written, no data will be
1210 * written at all unless @a force_flush is true.
1213 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1217 RingBufferNPT<Sample>::rw_vector vector;
1218 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1221 _write_data_count = 0;
1223 transvec.buf[0] = 0;
1224 transvec.buf[1] = 0;
1228 boost::shared_ptr<ChannelList> c = channels.reader();
1229 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1231 (*chan)->capture_buf->get_read_vector (&vector);
1233 total = vector.len[0] + vector.len[1];
1235 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1239 /* if there are 2+ chunks of disk i/o possible for
1240 this track, let the caller know so that it can arrange
1241 for us to be called again, ASAP.
1243 if we are forcing a flush, then if there is* any* extra
1244 work, let the caller know.
1246 if we are no longer recording and there is any extra work,
1247 let the caller know too.
1250 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1254 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1256 // check the transition buffer when recording destructive
1257 // important that we get this after the capture buf
1259 if (destructive()) {
1260 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1261 size_t transcount = transvec.len[0] + transvec.len[1];
1262 bool have_start = false;
1265 for (ti=0; ti < transcount; ++ti) {
1266 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1268 if (captrans.type == CaptureStart) {
1269 // by definition, the first data we got above represents the given capture pos
1271 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1272 (*chan)->curr_capture_cnt = 0;
1276 else if (captrans.type == CaptureEnd) {
1278 // capture end, the capture_val represents total frames in capture
1280 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1282 // shorten to make the write a perfect fit
1283 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1285 if (nto_write < to_write) {
1286 ret = 1; // should we?
1288 to_write = nto_write;
1290 (*chan)->write_source->mark_capture_end ();
1292 // increment past this transition, but go no further
1297 // actually ends just beyond this chunk, so force more work
1305 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1309 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1310 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1314 (*chan)->capture_buf->increment_read_ptr (to_write);
1315 (*chan)->curr_capture_cnt += to_write;
1317 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1319 /* we wrote all of vector.len[0] but it wasn't an entire
1320 disk_io_chunk_frames of data, so arrange for some part
1321 of vector.len[1] to be flushed to disk as well.
1324 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1326 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1327 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1331 _write_data_count += (*chan)->write_source->write_data_count();
1333 (*chan)->capture_buf->increment_read_ptr (to_write);
1334 (*chan)->curr_capture_cnt += to_write;
1343 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1345 uint32_t buffer_position;
1346 bool more_work = true;
1348 boost::shared_ptr<AudioRegion> region;
1349 framecnt_t total_capture;
1351 SourceList::iterator src;
1352 ChannelList::iterator chan;
1353 vector<CaptureInfo*>::iterator ci;
1354 boost::shared_ptr<ChannelList> c = channels.reader();
1356 bool mark_write_completed = false;
1358 finish_capture (true, c);
1360 /* butler is already stopped, but there may be work to do
1361 to flush remaining data to disk.
1364 while (more_work && !err) {
1365 switch (do_flush (TransportContext, true)) {
1372 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1377 /* XXX is there anything we can do if err != 0 ? */
1378 Glib::Mutex::Lock lm (capture_info_lock);
1380 if (capture_info.empty()) {
1384 if (abort_capture) {
1386 if (destructive()) {
1390 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1392 if ((*chan)->write_source) {
1394 (*chan)->write_source->mark_for_remove ();
1395 (*chan)->write_source->drop_references ();
1396 (*chan)->write_source.reset ();
1399 /* new source set up in "out" below */
1405 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1406 total_capture += (*ci)->frames;
1409 /* figure out the name for this take */
1411 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1413 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1417 s->update_header (capture_info.front()->start, when, twhen);
1418 s->set_captured_for (_name.val());
1419 s->mark_immutable ();
1421 if (Config->get_auto_analyse_audio()) {
1422 Analyser::queue_source_for_analysis (s, true);
1427 /* destructive tracks have a single, never changing region */
1429 if (destructive()) {
1431 /* send a signal that any UI can pick up to do the right thing. there is
1432 a small problem here in that a UI may need the peak data to be ready
1433 for the data that was recorded and this isn't interlocked with that
1434 process. this problem is deferred to the UI.
1437 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1441 string whole_file_region_name;
1442 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1444 /* Register a new region with the Session that
1445 describes the entire source. Do this first
1446 so that any sub-regions will obviously be
1447 children of this one (later!)
1453 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1454 plist.add (Properties::length, total_capture);
1455 plist.add (Properties::name, whole_file_region_name);
1456 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1457 rx->set_automatic (true);
1458 rx->set_whole_file (true);
1460 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1461 region->special_set_position (capture_info.front()->start);
1465 catch (failed_constructor& err) {
1466 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1470 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1472 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1474 _playlist->clear_changes ();
1475 _playlist->freeze ();
1477 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1481 RegionFactory::region_name (region_name, whole_file_region_name, false);
1483 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1489 plist.add (Properties::start, buffer_position);
1490 plist.add (Properties::length, (*ci)->frames);
1491 plist.add (Properties::name, region_name);
1493 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1494 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1497 catch (failed_constructor& err) {
1498 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1499 continue; /* XXX is this OK? */
1502 i_am_the_modifier++;
1504 if (_playlist->explicit_relayering()) {
1505 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1506 should end up on. Put it at the top.
1508 region->set_layer (_playlist->top_layer() + 1);
1509 region->set_pending_explicit_relayer (true);
1512 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1513 i_am_the_modifier--;
1515 buffer_position += (*ci)->frames;
1519 _session.add_command (new StatefulDiffCommand (_playlist));
1522 mark_write_completed = true;
1525 reset_write_sources (mark_write_completed);
1529 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1533 capture_info.clear ();
1534 capture_start_frame = 0;
1538 AudioDiskstream::transport_looped (framepos_t transport_frame)
1540 if (was_recording) {
1541 // all we need to do is finish this capture, with modified capture length
1542 boost::shared_ptr<ChannelList> c = channels.reader();
1544 // adjust the capture length knowing that the data will be recorded to disk
1545 // only necessary after the first loop where we're recording
1546 if (capture_info.size() == 0) {
1547 capture_captured += _capture_offset;
1549 if (_alignment_style == ExistingMaterial) {
1550 capture_captured += _session.worst_output_latency();
1552 capture_captured += _roll_delay;
1556 finish_capture (true, c);
1558 // the next region will start recording via the normal mechanism
1559 // we'll set the start position to the current transport pos
1560 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1561 capture_start_frame = transport_frame;
1562 first_recordable_frame = transport_frame; // mild lie
1563 last_recordable_frame = max_framepos;
1564 was_recording = true;
1566 if (recordable() && destructive()) {
1567 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1569 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1570 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1572 if (transvec.len[0] > 0) {
1573 transvec.buf[0]->type = CaptureStart;
1574 transvec.buf[0]->capture_val = capture_start_frame;
1575 (*chan)->capture_transition_buf->increment_write_ptr(1);
1579 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1589 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1591 was_recording = false;
1592 first_recordable_frame = max_framepos;
1593 last_recordable_frame = max_framepos;
1595 if (capture_captured == 0) {
1599 if (recordable() && destructive()) {
1600 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1602 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1603 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1605 if (transvec.len[0] > 0) {
1606 transvec.buf[0]->type = CaptureEnd;
1607 transvec.buf[0]->capture_val = capture_captured;
1608 (*chan)->capture_transition_buf->increment_write_ptr(1);
1612 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1618 CaptureInfo* ci = new CaptureInfo;
1620 ci->start = capture_start_frame;
1621 ci->frames = capture_captured;
1623 /* XXX theoretical race condition here. Need atomic exchange ?
1624 However, the circumstances when this is called right
1625 now (either on record-disable or transport_stopped)
1626 mean that no actual race exists. I think ...
1627 We now have a capture_info_lock, but it is only to be used
1628 to synchronize in the transport_stop and the capture info
1629 accessors, so that invalidation will not occur (both non-realtime).
1632 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1634 capture_info.push_back (ci);
1635 capture_captured = 0;
1637 /* now we've finished a capture, reset first_recordable_frame for next time */
1638 first_recordable_frame = max_framepos;
1642 AudioDiskstream::set_record_enabled (bool yn)
1644 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1648 /* can't rec-enable in destructive mode if transport is before start */
1650 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1654 /* yes, i know that this not proof against race conditions, but its
1655 good enough. i think.
1658 if (record_enabled() != yn) {
1660 engage_record_enable ();
1662 disengage_record_enable ();
1668 AudioDiskstream::engage_record_enable ()
1670 bool rolling = _session.transport_speed() != 0.0f;
1671 boost::shared_ptr<ChannelList> c = channels.reader();
1673 g_atomic_int_set (&_record_enabled, 1);
1674 capturing_sources.clear ();
1676 if (Config->get_monitoring_model() == HardwareMonitoring) {
1678 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1679 (*chan)->source.ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1680 capturing_sources.push_back ((*chan)->write_source);
1681 (*chan)->write_source->mark_streaming_write_started ();
1685 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1686 capturing_sources.push_back ((*chan)->write_source);
1687 (*chan)->write_source->mark_streaming_write_started ();
1691 RecordEnableChanged (); /* EMIT SIGNAL */
1695 AudioDiskstream::disengage_record_enable ()
1697 g_atomic_int_set (&_record_enabled, 0);
1698 boost::shared_ptr<ChannelList> c = channels.reader();
1699 if (Config->get_monitoring_model() == HardwareMonitoring) {
1700 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1701 (*chan)->source.ensure_monitor_input (false);
1704 capturing_sources.clear ();
1705 RecordEnableChanged (); /* EMIT SIGNAL */
1709 AudioDiskstream::get_state ()
1711 XMLNode& node (Diskstream::get_state());
1713 LocaleGuard lg (X_("POSIX"));
1715 boost::shared_ptr<ChannelList> c = channels.reader();
1716 snprintf (buf, sizeof(buf), "%zd", c->size());
1717 node.add_property ("channels", buf);
1719 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1721 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1722 XMLNode* cs_grandchild;
1724 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1725 cs_grandchild = new XMLNode (X_("file"));
1726 cs_grandchild->add_property (X_("path"), (*i)->path());
1727 cs_child->add_child_nocopy (*cs_grandchild);
1730 /* store the location where capture will start */
1734 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1735 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1737 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1740 cs_child->add_property (X_("at"), buf);
1741 node.add_child_nocopy (*cs_child);
1748 AudioDiskstream::set_state (const XMLNode& node, int version)
1750 const XMLProperty* prop;
1751 XMLNodeList nlist = node.children();
1752 XMLNodeIterator niter;
1753 uint32_t nchans = 1;
1754 XMLNode* capture_pending_node = 0;
1755 LocaleGuard lg (X_("POSIX"));
1757 /* prevent write sources from being created */
1759 in_set_state = true;
1761 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1762 if ((*niter)->name() == IO::state_node_name) {
1763 deprecated_io_node = new XMLNode (**niter);
1766 if ((*niter)->name() == X_("CapturingSources")) {
1767 capture_pending_node = *niter;
1771 if (Diskstream::set_state (node, version)) {
1775 if ((prop = node.property ("channels")) != 0) {
1776 nchans = atoi (prop->value().c_str());
1779 // create necessary extra channels
1780 // we are always constructed with one and we always need one
1782 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1784 if (nchans > _n_channels.n_audio()) {
1786 add_channel (nchans - _n_channels.n_audio());
1787 IO::PortCountChanged(_n_channels);
1789 } else if (nchans < _n_channels.n_audio()) {
1791 remove_channel (_n_channels.n_audio() - nchans);
1796 if (!destructive() && capture_pending_node) {
1797 /* destructive streams have one and only one source per channel,
1798 and so they never end up in pending capture in any useful
1801 use_pending_capture_data (*capture_pending_node);
1804 in_set_state = false;
1806 /* make sure this is clear before we do anything else */
1808 capturing_sources.clear ();
1810 /* write sources are handled when we handle the input set
1811 up of the IO that owns this DS (::non_realtime_input_change())
1818 AudioDiskstream::use_new_write_source (uint32_t n)
1820 boost::shared_ptr<ChannelList> c = channels.reader();
1822 if (!recordable()) {
1826 if (n >= c->size()) {
1827 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1831 ChannelInfo* chan = (*c)[n];
1834 if ((chan->write_source = _session.create_audio_source_for_session (
1835 n_channels().n_audio(), name(), n, destructive())) == 0) {
1836 throw failed_constructor();
1840 catch (failed_constructor &err) {
1841 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1842 chan->write_source.reset ();
1846 /* do not remove destructive files even if they are empty */
1848 chan->write_source->set_allow_remove_if_empty (!destructive());
1853 list<boost::shared_ptr<Source> >
1854 AudioDiskstream::steal_write_sources()
1856 /* not possible to steal audio write sources */
1857 list<boost::shared_ptr<Source> > ret;
1862 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1864 ChannelList::iterator chan;
1865 boost::shared_ptr<ChannelList> c = channels.reader();
1868 if (!_session.writable() || !recordable()) {
1872 capturing_sources.clear ();
1874 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1876 if (!destructive()) {
1878 if ((*chan)->write_source) {
1880 if (mark_write_complete) {
1881 (*chan)->write_source->mark_streaming_write_completed ();
1882 (*chan)->write_source->done_with_peakfile_writes ();
1885 if ((*chan)->write_source->removable()) {
1886 (*chan)->write_source->mark_for_remove ();
1887 (*chan)->write_source->drop_references ();
1890 (*chan)->write_source.reset ();
1893 use_new_write_source (n);
1895 if (record_enabled()) {
1896 capturing_sources.push_back ((*chan)->write_source);
1901 if ((*chan)->write_source == 0) {
1902 use_new_write_source (n);
1907 if (destructive() && !c->empty ()) {
1909 /* we now have all our write sources set up, so create the
1910 playlist's single region.
1913 if (_playlist->empty()) {
1914 setup_destructive_playlist ();
1920 AudioDiskstream::rename_write_sources ()
1922 ChannelList::iterator chan;
1923 boost::shared_ptr<ChannelList> c = channels.reader();
1926 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1927 if ((*chan)->write_source != 0) {
1928 (*chan)->write_source->set_source_name (_name.val(), destructive());
1929 /* XXX what to do if one of them fails ? */
1937 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1939 if (_session.get_block_size() > speed_buffer_size) {
1940 speed_buffer_size = _session.get_block_size();
1941 boost::shared_ptr<ChannelList> c = channels.reader();
1943 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1944 if ((*chan)->speed_buffer)
1945 delete [] (*chan)->speed_buffer;
1946 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1949 allocate_temporary_buffers ();
1953 AudioDiskstream::allocate_temporary_buffers ()
1955 /* make sure the wrap buffer is at least large enough to deal
1956 with the speeds up to 1.2, to allow for micro-variation
1957 when slaving to MTC, Timecode etc.
1960 double const sp = max (fabsf (_actual_speed), 1.2f);
1961 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1963 if (required_wrap_size > wrap_buffer_size) {
1965 boost::shared_ptr<ChannelList> c = channels.reader();
1967 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1968 if ((*chan)->playback_wrap_buffer)
1969 delete [] (*chan)->playback_wrap_buffer;
1970 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1971 if ((*chan)->capture_wrap_buffer)
1972 delete [] (*chan)->capture_wrap_buffer;
1973 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1976 wrap_buffer_size = required_wrap_size;
1981 AudioDiskstream::monitor_input (bool yn)
1983 boost::shared_ptr<ChannelList> c = channels.reader();
1985 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1986 (*chan)->source.ensure_monitor_input (yn);
1991 AudioDiskstream::set_align_style_from_io ()
1993 bool have_physical = false;
1995 if (_alignment_choice != Automatic) {
2003 get_input_sources ();
2005 boost::shared_ptr<ChannelList> c = channels.reader();
2007 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2008 if ((*chan)->source.is_physical ()) {
2009 have_physical = true;
2014 if (have_physical) {
2015 set_align_style (ExistingMaterial);
2017 set_align_style (CaptureTime);
2022 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2024 while (how_many--) {
2025 c->push_back (new ChannelInfo(
2026 _session.butler()->audio_diskstream_playback_buffer_size(),
2027 _session.butler()->audio_diskstream_capture_buffer_size(),
2028 speed_buffer_size, wrap_buffer_size));
2029 interpolation.add_channel_to (
2030 _session.butler()->audio_diskstream_playback_buffer_size(),
2034 _n_channels.set(DataType::AUDIO, c->size());
2040 AudioDiskstream::add_channel (uint32_t how_many)
2042 RCUWriter<ChannelList> writer (channels);
2043 boost::shared_ptr<ChannelList> c = writer.get_copy();
2045 return add_channel_to (c, how_many);
2049 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2051 while (how_many-- && !c->empty()) {
2054 interpolation.remove_channel_from ();
2057 _n_channels.set(DataType::AUDIO, c->size());
2063 AudioDiskstream::remove_channel (uint32_t how_many)
2065 RCUWriter<ChannelList> writer (channels);
2066 boost::shared_ptr<ChannelList> c = writer.get_copy();
2068 return remove_channel_from (c, how_many);
2072 AudioDiskstream::playback_buffer_load () const
2074 boost::shared_ptr<ChannelList> c = channels.reader();
2080 return (float) ((double) c->front()->playback_buf->read_space()/
2081 (double) c->front()->playback_buf->bufsize());
2085 AudioDiskstream::capture_buffer_load () const
2087 boost::shared_ptr<ChannelList> c = channels.reader();
2093 return (float) ((double) c->front()->capture_buf->write_space()/
2094 (double) c->front()->capture_buf->bufsize());
2098 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2100 const XMLProperty* prop;
2101 XMLNodeList nlist = node.children();
2102 XMLNodeIterator niter;
2103 boost::shared_ptr<AudioFileSource> fs;
2104 boost::shared_ptr<AudioFileSource> first_fs;
2105 SourceList pending_sources;
2106 framepos_t position;
2108 if ((prop = node.property (X_("at"))) == 0) {
2112 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2116 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2117 if ((*niter)->name() == X_("file")) {
2119 if ((prop = (*niter)->property (X_("path"))) == 0) {
2123 // This protects sessions from errant CapturingSources in stored sessions
2125 if (stat (prop->value().c_str(), &sbuf)) {
2130 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2131 SourceFactory::createWritable (
2132 DataType::AUDIO, _session,
2133 prop->value(), string(), false, _session.frame_rate()));
2136 catch (failed_constructor& err) {
2137 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2138 _name, prop->value())
2143 pending_sources.push_back (fs);
2145 if (first_fs == 0) {
2149 fs->set_captured_for (_name.val());
2153 if (pending_sources.size() == 0) {
2154 /* nothing can be done */
2158 if (pending_sources.size() != _n_channels.n_audio()) {
2159 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2164 boost::shared_ptr<AudioRegion> region;
2170 plist.add (Properties::start, 0);
2171 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2172 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2174 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2176 region->set_automatic (true);
2177 region->set_whole_file (true);
2178 region->special_set_position (0);
2181 catch (failed_constructor& err) {
2182 error << string_compose (
2183 _("%1: cannot create whole-file region from pending capture sources"),
2189 _playlist->add_region (region, position);
2195 AudioDiskstream::set_non_layered (bool yn)
2197 if (yn != non_layered()) {
2200 _flags = Flag (_flags | NonLayered);
2202 _flags = Flag (_flags & ~NonLayered);
2210 AudioDiskstream::set_destructive (bool yn)
2212 if (yn != destructive()) {
2215 bool bounce_ignored;
2216 /* requestor should already have checked this and
2217 bounced if necessary and desired
2219 if (!can_become_destructive (bounce_ignored)) {
2222 _flags = Flag (_flags | Destructive);
2223 use_destructive_playlist ();
2225 _flags = Flag (_flags & ~Destructive);
2226 reset_write_sources (true, true);
2234 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2237 requires_bounce = false;
2241 /* is there only one region ? */
2243 if (_playlist->n_regions() != 1) {
2244 requires_bounce = true;
2248 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2250 requires_bounce = false;
2254 /* do the source(s) for the region cover the session start position ? */
2256 if (first->position() != _session.current_start_frame()) {
2257 if (first->start() > _session.current_start_frame()) {
2258 requires_bounce = true;
2263 /* is the source used by only 1 playlist ? */
2265 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2269 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2270 requires_bounce = true;
2274 requires_bounce = false;
2279 AudioDiskstream::adjust_playback_buffering ()
2281 boost::shared_ptr<ChannelList> c = channels.reader();
2283 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2284 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2289 AudioDiskstream::adjust_capture_buffering ()
2291 boost::shared_ptr<ChannelList> c = channels.reader();
2293 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2294 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2299 AudioDiskstream::ChannelSource::is_physical () const
2305 return AudioEngine::instance()->port_is_physical (name);
2309 AudioDiskstream::ChannelSource::ensure_monitor_input (bool yn) const
2315 return AudioEngine::instance()->ensure_monitor_input (name, yn);
2318 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2321 current_capture_buffer = 0;
2322 current_playback_buffer = 0;
2323 curr_capture_cnt = 0;
2325 speed_buffer = new Sample[speed_size];
2326 playback_wrap_buffer = new Sample[wrap_size];
2327 capture_wrap_buffer = new Sample[wrap_size];
2329 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2330 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2331 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2333 /* touch the ringbuffer buffers, which will cause
2334 them to be mapped into locked physical RAM if
2335 we're running with mlockall(). this doesn't do
2339 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2340 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2341 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2345 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2347 delete playback_buf;
2348 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2349 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2353 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2357 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2358 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2361 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2363 write_source.reset ();
2365 delete [] speed_buffer;
2368 delete [] playback_wrap_buffer;
2369 playback_wrap_buffer = 0;
2371 delete [] capture_wrap_buffer;
2372 capture_wrap_buffer = 0;
2374 delete playback_buf;
2380 delete capture_transition_buf;
2381 capture_transition_buf = 0;