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 , deprecated_io_node(NULL)
78 , channels (new ChannelList)
80 /* prevent any write sources from being created */
87 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
88 : Diskstream(sess, node)
89 , deprecated_io_node(NULL)
90 , channels (new ChannelList)
95 if (set_state (node, Stateful::loading_state_version)) {
97 throw failed_constructor();
100 in_set_state = false;
103 use_destructive_playlist ();
108 AudioDiskstream::init ()
110 /* there are no channels at this point, so these
111 two calls just get speed_buffer_size and wrap_buffer
112 size setup without duplicating their code.
115 set_block_size (_session.get_block_size());
116 allocate_temporary_buffers ();
119 AudioDiskstream::~AudioDiskstream ()
121 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
124 RCUWriter<ChannelList> writer (channels);
125 boost::shared_ptr<ChannelList> c = writer.get_copy();
127 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
136 delete deprecated_io_node;
140 AudioDiskstream::allocate_working_buffers()
142 assert(disk_io_frames() > 0);
144 _working_buffers_size = disk_io_frames();
145 _mixdown_buffer = new Sample[_working_buffers_size];
146 _gain_buffer = new gain_t[_working_buffers_size];
150 AudioDiskstream::free_working_buffers()
152 delete [] _mixdown_buffer;
153 delete [] _gain_buffer;
154 _working_buffers_size = 0;
160 AudioDiskstream::non_realtime_input_change ()
163 Glib::Mutex::Lock lm (state_lock);
165 if (input_change_pending.type == IOChange::NoChange) {
170 RCUWriter<ChannelList> writer (channels);
171 boost::shared_ptr<ChannelList> c = writer.get_copy();
173 _n_channels.set(DataType::AUDIO, c->size());
175 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
176 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
177 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
178 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
182 get_input_sources ();
183 set_capture_offset ();
185 if (first_input_change) {
186 set_align_style (_persistent_alignment_style);
187 first_input_change = false;
189 set_align_style_from_io ();
192 input_change_pending = IOChange::NoChange;
194 /* implicit unlock */
197 /* reset capture files */
199 reset_write_sources (false);
201 /* now refill channel buffers */
203 if (speed() != 1.0f || speed() != -1.0f) {
204 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
206 seek (_session.transport_frame());
211 AudioDiskstream::non_realtime_locate (framepos_t location)
213 /* now refill channel buffers */
215 if (speed() != 1.0f || speed() != -1.0f) {
216 seek ((framepos_t) (location * (double) speed()));
223 AudioDiskstream::get_input_sources ()
225 boost::shared_ptr<ChannelList> c = channels.reader();
228 ChannelList::iterator chan;
229 uint32_t ni = _io->n_ports().n_audio();
230 vector<string> connections;
232 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
234 connections.clear ();
236 if (_io->nth (n)->get_connections (connections) == 0) {
238 if ((*chan)->source) {
239 // _source->disable_metering ();
245 (*chan)->source = dynamic_cast<AudioPort*>(_session.engine().get_port_by_name (connections[0]) );
251 AudioDiskstream::find_and_use_playlist (const string& name)
253 boost::shared_ptr<AudioPlaylist> playlist;
255 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
256 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
260 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
264 return use_playlist (playlist);
268 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
270 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
272 Diskstream::use_playlist(playlist);
278 AudioDiskstream::use_new_playlist ()
281 boost::shared_ptr<AudioPlaylist> playlist;
283 if (!in_set_state && destructive()) {
288 newname = Playlist::bump_name (_playlist->name(), _session);
290 newname = Playlist::bump_name (_name, _session);
293 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
295 playlist->set_orig_diskstream_id (id());
296 return use_playlist (playlist);
304 AudioDiskstream::use_copy_playlist ()
306 assert(audio_playlist());
312 if (_playlist == 0) {
313 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
318 boost::shared_ptr<AudioPlaylist> playlist;
320 newname = Playlist::bump_name (_playlist->name(), _session);
322 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
323 playlist->set_orig_diskstream_id (id());
324 return use_playlist (playlist);
331 AudioDiskstream::setup_destructive_playlist ()
334 boost::shared_ptr<ChannelList> c = channels.reader();
336 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
337 srcs.push_back ((*chan)->write_source);
340 /* a single full-sized region */
342 assert (!srcs.empty ());
345 plist.add (Properties::name, _name.val());
346 plist.add (Properties::start, 0);
347 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
349 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
350 _playlist->add_region (region, srcs.front()->natural_position());
354 AudioDiskstream::use_destructive_playlist ()
356 /* this is called from the XML-based constructor or ::set_destructive. when called,
357 we already have a playlist and a region, but we need to
358 set up our sources for write. we use the sources associated
359 with the (presumed single, full-extent) region.
362 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
365 reset_write_sources (false, true);
369 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
372 throw failed_constructor();
375 /* be sure to stretch the region out to the maximum length */
377 region->set_length (max_framepos - region->position(), this);
380 ChannelList::iterator chan;
381 boost::shared_ptr<ChannelList> c = channels.reader();
383 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
384 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
385 assert((*chan)->write_source);
386 (*chan)->write_source->set_allow_remove_if_empty (false);
388 /* this might be false if we switched modes, so force it */
390 (*chan)->write_source->set_destructive (true);
393 /* the source list will never be reset for a destructive track */
397 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
399 if (recordable() && destructive()) {
400 boost::shared_ptr<ChannelList> c = channels.reader();
401 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
403 RingBufferNPT<CaptureTransition>::rw_vector transvec;
404 (*chan)->capture_transition_buf->get_write_vector(&transvec);
406 if (transvec.len[0] > 0) {
407 transvec.buf[0]->type = CaptureStart;
408 transvec.buf[0]->capture_val = capture_start_frame;
409 (*chan)->capture_transition_buf->increment_write_ptr(1);
412 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
420 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool rec_monitors_input, bool& need_butler)
423 boost::shared_ptr<ChannelList> c = channels.reader();
424 ChannelList::iterator chan;
426 framecnt_t rec_offset = 0;
427 framecnt_t rec_nframes = 0;
428 bool collect_playback = false;
430 playback_distance = 0;
432 if (!_io || !_io->active()) {
436 check_record_status (transport_frame, can_record);
442 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
448 adjust_capture_position = 0;
450 for (chan = c->begin(); chan != c->end(); ++chan) {
451 (*chan)->current_capture_buffer = 0;
452 (*chan)->current_playback_buffer = 0;
455 /* two conditions to test for here:
457 A: this track is rec-enabled, and the session has confirmed that we can record
458 B: this track is rec-enabled, has been recording, and we are set up for auto-punch-in
460 The second test is necessary to capture the extra material that arrives AFTER the transport
461 frame has left the punch range (which will cause the "can_record" argument to be false).
465 // Safeguard against situations where process() goes haywire when autopunching
466 // and last_recordable_frame < first_recordable_frame
468 if (last_recordable_frame < first_recordable_frame) {
469 last_recordable_frame = max_framepos;
472 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
474 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
476 if (rec_nframes && !was_recording) {
477 capture_captured = 0;
478 was_recording = true;
481 if (can_record && !_last_capture_sources.empty()) {
482 _last_capture_sources.clear ();
487 uint32_t limit = _io->n_ports ().n_audio();
489 /* one or more ports could already have been removed from _io, but our
490 channel setup hasn't yet been updated. prevent us from trying to
491 use channels that correspond to missing ports. note that the
492 process callback (from which this is called) is always atomic
493 with respect to port removal/addition.
496 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
498 ChannelInfo* chaninfo (*chan);
500 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
502 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
504 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
506 /* note: grab the entire port buffer, but only copy what we were supposed to
507 for recording, and use rec_offset
510 AudioPort* const ap = _io->audio (n);
512 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
513 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
518 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
520 if (rec_nframes > total) {
525 AudioPort* const ap = _io->audio (n);
528 Sample* buf = ap->get_audio_buffer(nframes).data();
529 framecnt_t first = chaninfo->capture_vector.len[0];
531 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
532 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
533 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
534 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
536 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
543 finish_capture (rec_monitors_input, c);
550 /* data will be written to disk */
552 if (rec_nframes == nframes && rec_offset == 0) {
554 for (chan = c->begin(); chan != c->end(); ++chan) {
555 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
558 playback_distance = nframes;
563 /* we can't use the capture buffer as the playback buffer, because
564 we recorded only a part of the current process' cycle data
568 collect_playback = true;
571 adjust_capture_position = rec_nframes;
573 } else if (can_record && record_enabled()) {
575 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
577 for (chan = c->begin(); chan != c->end(); ++chan) {
578 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
581 playback_distance = nframes;
585 collect_playback = true;
588 if (collect_playback) {
590 /* we're doing playback */
592 framecnt_t necessary_samples;
594 /* no varispeed playback if we're recording, because the output .... TBD */
596 if (rec_nframes == 0 && _actual_speed != 1.0f) {
597 necessary_samples = (framecnt_t) floor ((nframes * fabs (_actual_speed))) + 1;
599 necessary_samples = nframes;
602 for (chan = c->begin(); chan != c->end(); ++chan) {
603 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
608 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
610 ChannelInfo* chaninfo (*chan);
612 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
614 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
617 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
619 if (necessary_samples > total) {
620 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
621 cerr << "underrun for " << _name << endl;
627 memcpy ((char *) chaninfo->playback_wrap_buffer,
628 chaninfo->playback_vector.buf[0],
629 chaninfo->playback_vector.len[0] * sizeof (Sample));
630 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
631 chaninfo->playback_vector.buf[1],
632 (necessary_samples - chaninfo->playback_vector.len[0])
635 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
640 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
641 process_varispeed_playback(nframes, c);
643 playback_distance = nframes;
646 _speed = _target_speed;
652 if (commit (nframes)) {
661 AudioDiskstream::process_varispeed_playback (pframes_t nframes, boost::shared_ptr<ChannelList> c)
663 ChannelList::iterator chan;
665 interpolation.set_speed (_target_speed);
668 for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
669 ChannelInfo* chaninfo (*chan);
671 playback_distance = interpolation.interpolate (
672 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
674 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
679 AudioDiskstream::commit (framecnt_t /* nframes */)
681 bool need_butler = false;
683 if (!_io || !_io->active()) {
687 if (_actual_speed < 0.0) {
688 playback_sample -= playback_distance;
690 playback_sample += playback_distance;
693 boost::shared_ptr<ChannelList> c = channels.reader();
694 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
696 (*chan)->playback_buf->increment_read_ptr (playback_distance);
698 if (adjust_capture_position) {
699 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
703 if (adjust_capture_position != 0) {
704 capture_captured += adjust_capture_position;
705 adjust_capture_position = 0;
713 if (_io && _io->active()) {
714 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
719 if (_io && _io->active()) {
720 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
721 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
723 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
731 AudioDiskstream::set_pending_overwrite (bool yn)
733 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
735 _pending_overwrite = yn;
737 overwrite_frame = playback_sample;
739 boost::shared_ptr<ChannelList> c = channels.reader ();
741 overwrite_offset = c->front()->playback_buf->get_read_ptr();
746 AudioDiskstream::overwrite_existing_buffers ()
748 boost::shared_ptr<ChannelList> c = channels.reader();
750 _pending_overwrite = false;
754 Sample* mixdown_buffer;
757 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
759 overwrite_queued = false;
761 /* assume all are the same size */
762 framecnt_t size = c->front()->playback_buf->bufsize();
764 mixdown_buffer = new Sample[size];
765 gain_buffer = new float[size];
767 /* reduce size so that we can fill the buffer correctly. */
773 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
775 start = overwrite_frame;
776 framecnt_t cnt = size;
778 /* to fill the buffer without resetting the playback sample, we need to
779 do it one or two chunks (normally two).
781 |----------------------------------------------------------------------|
785 |<- second chunk->||<----------------- first chunk ------------------>|
789 framecnt_t to_read = size - overwrite_offset;
791 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *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;
801 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
802 start, cnt, *chan, n, reversed)) {
803 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
804 _id, size, playback_sample) << endmsg;
813 _pending_overwrite = false;
814 delete [] gain_buffer;
815 delete [] mixdown_buffer;
820 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
824 ChannelList::iterator chan;
825 boost::shared_ptr<ChannelList> c = channels.reader();
827 Glib::Mutex::Lock lm (state_lock);
829 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
830 (*chan)->playback_buf->reset ();
831 (*chan)->capture_buf->reset ();
834 /* can't rec-enable in destructive mode if transport is before start */
836 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
837 disengage_record_enable ();
840 playback_sample = frame;
843 if (complete_refill) {
844 while ((ret = do_refill_with_alloc ()) > 0) ;
846 ret = do_refill_with_alloc ();
853 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
855 ChannelList::iterator chan;
856 boost::shared_ptr<ChannelList> c = channels.reader();
858 for (chan = c->begin(); chan != c->end(); ++chan) {
859 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
867 AudioDiskstream::internal_playback_seek (framecnt_t distance)
869 ChannelList::iterator chan;
870 boost::shared_ptr<ChannelList> c = channels.reader();
872 for (chan = c->begin(); chan != c->end(); ++chan) {
873 (*chan)->playback_buf->increment_read_ptr (distance);
876 if (first_recordable_frame < max_framepos) {
877 first_recordable_frame += distance;
879 playback_sample += distance;
885 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
886 framepos_t& start, framecnt_t cnt,
887 ChannelInfo* /*channel_info*/, int channel, bool reversed)
889 framecnt_t this_read = 0;
891 framepos_t loop_end = 0;
892 framepos_t loop_start = 0;
893 framecnt_t offset = 0;
896 /* XXX we don't currently play loops in reverse. not sure why */
900 framecnt_t loop_length = 0;
902 /* Make the use of a Location atomic for this read operation.
904 Note: Locations don't get deleted, so all we care about
905 when I say "atomic" is that we are always pointing to
906 the same one and using a start/length values obtained
910 if ((loc = loop_location) != 0) {
911 loop_start = loc->start();
912 loop_end = loc->end();
913 loop_length = loop_end - loop_start;
916 /* if we are looping, ensure that the first frame we read is at the correct
917 position within the loop.
920 if (loc && start >= loop_end) {
921 //cerr << "start adjusted from " << start;
922 start = loop_start + ((start - loop_start) % loop_length);
923 //cerr << "to " << start << endl;
926 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
935 /* take any loop into account. we can't read past the end of the loop. */
937 if (loc && (loop_end - start < cnt)) {
938 this_read = loop_end - start;
939 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
946 if (this_read == 0) {
950 this_read = min(cnt,this_read);
952 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
953 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
958 _read_data_count = _playlist->read_data_count();
962 swap_by_ptr (buf, buf + this_read - 1);
966 /* if we read to the end of the loop, go back to the beginning */
983 AudioDiskstream::do_refill_with_alloc ()
985 Sample* mix_buf = new Sample[disk_io_chunk_frames];
986 float* gain_buf = new float[disk_io_chunk_frames];
988 int ret = _do_refill(mix_buf, gain_buf);
997 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1001 RingBufferNPT<Sample>::rw_vector vector;
1002 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1003 framecnt_t total_space;
1004 framecnt_t zero_fill;
1006 ChannelList::iterator i;
1007 boost::shared_ptr<ChannelList> c = channels.reader();
1014 assert(mixdown_buffer);
1015 assert(gain_buffer);
1022 c->front()->playback_buf->get_write_vector (&vector);
1024 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1028 /* if there are 2+ chunks of disk i/o possible for
1029 this track, let the caller know so that it can arrange
1030 for us to be called again, ASAP.
1033 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1037 /* if we're running close to normal speed and there isn't enough
1038 space to do disk_io_chunk_frames of I/O, then don't bother.
1040 at higher speeds, just do it because the sync between butler
1041 and audio thread may not be good enough.
1044 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1048 /* when slaved, don't try to get too close to the read pointer. this
1049 leaves space for the buffer reversal to have something useful to
1053 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1057 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1059 total_space = min (disk_io_chunk_frames, total_space);
1063 if (file_frame == 0) {
1065 /* at start: nothing to do but fill with silence */
1067 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1069 ChannelInfo* chan (*i);
1070 chan->playback_buf->get_write_vector (&vector);
1071 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1072 if (vector.len[1]) {
1073 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1075 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1080 if (file_frame < total_space) {
1082 /* too close to the start: read what we can,
1083 and then zero fill the rest
1086 zero_fill = total_space - file_frame;
1087 total_space = file_frame;
1096 if (file_frame == max_framepos) {
1098 /* at end: nothing to do but fill with silence */
1100 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1102 ChannelInfo* chan (*i);
1103 chan->playback_buf->get_write_vector (&vector);
1104 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1105 if (vector.len[1]) {
1106 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1108 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1113 if (file_frame > max_framepos - total_space) {
1115 /* to close to the end: read what we can, and zero fill the rest */
1117 zero_fill = total_space - (max_framepos - file_frame);
1118 total_space = max_framepos - file_frame;
1125 framepos_t file_frame_tmp = 0;
1127 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1129 ChannelInfo* chan (*i);
1132 framecnt_t len1, len2;
1134 chan->playback_buf->get_write_vector (&vector);
1136 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1138 /* we're not going to fill the first chunk, so certainly do not bother with the
1139 other part. it won't be connected with the part we do fill, as in:
1141 .... => writable space
1142 ++++ => readable space
1143 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1145 |......|+++++++++++++|...............................|
1150 So, just pretend that the buf1 part isn't there.
1160 file_frame_tmp = file_frame;
1162 buf1 = vector.buf[0];
1163 len1 = vector.len[0];
1164 buf2 = vector.buf[1];
1165 len2 = vector.len[1];
1167 to_read = min (ts, len1);
1168 to_read = min (to_read, disk_io_chunk_frames);
1170 assert (to_read >= 0);
1174 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1179 chan->playback_buf->increment_write_ptr (to_read);
1183 to_read = min (ts, len2);
1187 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1188 so read some or all of vector.len[1] as well.
1191 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1196 chan->playback_buf->increment_write_ptr (to_read);
1205 file_frame = file_frame_tmp;
1206 assert (file_frame >= 0);
1213 /** Flush pending data to disk.
1215 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1216 * of data to disk. it will never write more than that. If it writes that
1217 * much and there is more than that waiting to be written, it will return 1,
1218 * otherwise 0 on success or -1 on failure.
1220 * If there is less than disk_io_chunk_frames to be written, no data will be
1221 * written at all unless @a force_flush is true.
1224 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1228 RingBufferNPT<Sample>::rw_vector vector;
1229 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1232 _write_data_count = 0;
1234 transvec.buf[0] = 0;
1235 transvec.buf[1] = 0;
1239 boost::shared_ptr<ChannelList> c = channels.reader();
1240 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1242 (*chan)->capture_buf->get_read_vector (&vector);
1244 total = vector.len[0] + vector.len[1];
1246 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1250 /* if there are 2+ chunks of disk i/o possible for
1251 this track, let the caller know so that it can arrange
1252 for us to be called again, ASAP.
1254 if we are forcing a flush, then if there is* any* extra
1255 work, let the caller know.
1257 if we are no longer recording and there is any extra work,
1258 let the caller know too.
1261 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1265 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1267 // check the transition buffer when recording destructive
1268 // important that we get this after the capture buf
1270 if (destructive()) {
1271 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1272 size_t transcount = transvec.len[0] + transvec.len[1];
1273 bool have_start = false;
1276 for (ti=0; ti < transcount; ++ti) {
1277 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1279 if (captrans.type == CaptureStart) {
1280 // by definition, the first data we got above represents the given capture pos
1282 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1283 (*chan)->curr_capture_cnt = 0;
1287 else if (captrans.type == CaptureEnd) {
1289 // capture end, the capture_val represents total frames in capture
1291 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1293 // shorten to make the write a perfect fit
1294 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1296 if (nto_write < to_write) {
1297 ret = 1; // should we?
1299 to_write = nto_write;
1301 (*chan)->write_source->mark_capture_end ();
1303 // increment past this transition, but go no further
1308 // actually ends just beyond this chunk, so force more work
1316 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1320 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1321 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1325 (*chan)->capture_buf->increment_read_ptr (to_write);
1326 (*chan)->curr_capture_cnt += to_write;
1328 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1330 /* we wrote all of vector.len[0] but it wasn't an entire
1331 disk_io_chunk_frames of data, so arrange for some part
1332 of vector.len[1] to be flushed to disk as well.
1335 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1337 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1338 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1342 _write_data_count += (*chan)->write_source->write_data_count();
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;
1369 finish_capture (true, c);
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 _session.remove_source ((*chan)->write_source);
1408 (*chan)->write_source.reset ();
1411 /* new source set up in "out" below */
1417 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1418 total_capture += (*ci)->frames;
1421 /* figure out the name for this take */
1423 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1425 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1429 if (s->unstubify ()) {
1430 error << string_compose (_("Could not move capture file from %1"), s->path()) << endmsg;
1432 s->update_header (capture_info.front()->start, when, twhen);
1433 s->set_captured_for (_name.val());
1434 s->mark_immutable ();
1436 if (Config->get_auto_analyse_audio()) {
1437 Analyser::queue_source_for_analysis (s, true);
1442 /* destructive tracks have a single, never changing region */
1444 if (destructive()) {
1446 /* send a signal that any UI can pick up to do the right thing. there is
1447 a small problem here in that a UI may need the peak data to be ready
1448 for the data that was recorded and this isn't interlocked with that
1449 process. this problem is deferred to the UI.
1452 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1456 string whole_file_region_name;
1457 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1459 /* Register a new region with the Session that
1460 describes the entire source. Do this first
1461 so that any sub-regions will obviously be
1462 children of this one (later!)
1468 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1469 plist.add (Properties::length, total_capture);
1470 plist.add (Properties::name, whole_file_region_name);
1471 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1472 rx->set_automatic (true);
1473 rx->set_whole_file (true);
1475 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1476 region->special_set_position (capture_info.front()->start);
1480 catch (failed_constructor& err) {
1481 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1485 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1487 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1489 _playlist->clear_changes ();
1490 _playlist->freeze ();
1492 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1496 RegionFactory::region_name (region_name, whole_file_region_name, false);
1498 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1504 plist.add (Properties::start, buffer_position);
1505 plist.add (Properties::length, (*ci)->frames);
1506 plist.add (Properties::name, region_name);
1508 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1509 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1512 catch (failed_constructor& err) {
1513 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1514 continue; /* XXX is this OK? */
1517 i_am_the_modifier++;
1519 if (_playlist->explicit_relayering()) {
1520 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1521 should end up on. Put it at the top.
1523 region->set_layer (_playlist->top_layer() + 1);
1524 region->set_pending_explicit_relayer (true);
1527 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1528 i_am_the_modifier--;
1530 buffer_position += (*ci)->frames;
1534 _session.add_command (new StatefulDiffCommand (_playlist));
1537 mark_write_completed = true;
1540 reset_write_sources (mark_write_completed);
1544 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1548 capture_info.clear ();
1549 capture_start_frame = 0;
1553 AudioDiskstream::transport_looped (framepos_t transport_frame)
1555 if (was_recording) {
1556 // all we need to do is finish this capture, with modified capture length
1557 boost::shared_ptr<ChannelList> c = channels.reader();
1559 // adjust the capture length knowing that the data will be recorded to disk
1560 // only necessary after the first loop where we're recording
1561 if (capture_info.size() == 0) {
1562 capture_captured += _capture_offset;
1564 if (_alignment_style == ExistingMaterial) {
1565 capture_captured += _session.worst_output_latency();
1567 capture_captured += _roll_delay;
1571 finish_capture (true, c);
1573 // the next region will start recording via the normal mechanism
1574 // we'll set the start position to the current transport pos
1575 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1576 capture_start_frame = transport_frame;
1577 first_recordable_frame = transport_frame; // mild lie
1578 last_recordable_frame = max_framepos;
1579 was_recording = true;
1581 if (recordable() && destructive()) {
1582 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1584 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1585 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1587 if (transvec.len[0] > 0) {
1588 transvec.buf[0]->type = CaptureStart;
1589 transvec.buf[0]->capture_val = capture_start_frame;
1590 (*chan)->capture_transition_buf->increment_write_ptr(1);
1594 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1604 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1606 was_recording = false;
1607 first_recordable_frame = max_framepos;
1608 last_recordable_frame = max_framepos;
1610 if (capture_captured == 0) {
1614 if (recordable() && destructive()) {
1615 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1617 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1618 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1620 if (transvec.len[0] > 0) {
1621 transvec.buf[0]->type = CaptureEnd;
1622 transvec.buf[0]->capture_val = capture_captured;
1623 (*chan)->capture_transition_buf->increment_write_ptr(1);
1627 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1633 CaptureInfo* ci = new CaptureInfo;
1635 ci->start = capture_start_frame;
1636 ci->frames = capture_captured;
1638 /* XXX theoretical race condition here. Need atomic exchange ?
1639 However, the circumstances when this is called right
1640 now (either on record-disable or transport_stopped)
1641 mean that no actual race exists. I think ...
1642 We now have a capture_info_lock, but it is only to be used
1643 to synchronize in the transport_stop and the capture info
1644 accessors, so that invalidation will not occur (both non-realtime).
1647 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1649 capture_info.push_back (ci);
1650 capture_captured = 0;
1652 /* now we've finished a capture, reset first_recordable_frame for next time */
1653 first_recordable_frame = max_framepos;
1657 AudioDiskstream::set_record_enabled (bool yn)
1659 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1663 /* can't rec-enable in destructive mode if transport is before start */
1665 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1669 /* yes, i know that this not proof against race conditions, but its
1670 good enough. i think.
1673 if (record_enabled() != yn) {
1675 engage_record_enable ();
1677 disengage_record_enable ();
1683 AudioDiskstream::engage_record_enable ()
1685 bool rolling = _session.transport_speed() != 0.0f;
1686 boost::shared_ptr<ChannelList> c = channels.reader();
1688 g_atomic_int_set (&_record_enabled, 1);
1689 capturing_sources.clear ();
1691 if (Config->get_monitoring_model() == HardwareMonitoring) {
1693 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1694 if ((*chan)->source) {
1695 (*chan)->source->ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1697 capturing_sources.push_back ((*chan)->write_source);
1698 (*chan)->write_source->mark_streaming_write_started ();
1702 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1703 capturing_sources.push_back ((*chan)->write_source);
1704 (*chan)->write_source->mark_streaming_write_started ();
1708 RecordEnableChanged (); /* EMIT SIGNAL */
1712 AudioDiskstream::disengage_record_enable ()
1714 g_atomic_int_set (&_record_enabled, 0);
1715 boost::shared_ptr<ChannelList> c = channels.reader();
1716 if (Config->get_monitoring_model() == HardwareMonitoring) {
1717 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1718 if ((*chan)->source) {
1719 (*chan)->source->ensure_monitor_input (false);
1723 capturing_sources.clear ();
1724 RecordEnableChanged (); /* EMIT SIGNAL */
1728 AudioDiskstream::get_state ()
1730 XMLNode* node = new XMLNode ("Diskstream");
1732 LocaleGuard lg (X_("POSIX"));
1733 boost::shared_ptr<ChannelList> c = channels.reader();
1735 node->add_property ("flags", enum_2_string (_flags));
1737 snprintf (buf, sizeof(buf), "%zd", c->size());
1738 node->add_property ("channels", buf);
1740 node->add_property ("playlist", _playlist->name());
1742 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1743 node->add_property ("speed", buf);
1745 node->add_property("name", _name);
1746 id().print (buf, sizeof (buf));
1747 node->add_property("id", buf);
1749 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1751 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1752 XMLNode* cs_grandchild;
1754 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1755 cs_grandchild = new XMLNode (X_("file"));
1756 cs_grandchild->add_property (X_("path"), (*i)->path());
1757 cs_child->add_child_nocopy (*cs_grandchild);
1760 /* store the location where capture will start */
1764 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1765 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1767 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1770 cs_child->add_property (X_("at"), buf);
1771 node->add_child_nocopy (*cs_child);
1775 node->add_child_copy (*_extra_xml);
1782 AudioDiskstream::set_state (const XMLNode& node, int /*version*/)
1784 const XMLProperty* prop;
1785 XMLNodeList nlist = node.children();
1786 XMLNodeIterator niter;
1787 uint32_t nchans = 1;
1788 XMLNode* capture_pending_node = 0;
1789 LocaleGuard lg (X_("POSIX"));
1791 in_set_state = true;
1793 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1794 if ((*niter)->name() == IO::state_node_name) {
1795 deprecated_io_node = new XMLNode (**niter);
1798 if ((*niter)->name() == X_("CapturingSources")) {
1799 capture_pending_node = *niter;
1803 /* prevent write sources from being created */
1805 in_set_state = true;
1807 if ((prop = node.property ("name")) != 0) {
1808 _name = prop->value();
1811 if (deprecated_io_node) {
1812 if ((prop = deprecated_io_node->property ("id")) != 0) {
1813 _id = prop->value ();
1816 if ((prop = node.property ("id")) != 0) {
1817 _id = prop->value ();
1821 if ((prop = node.property ("flags")) != 0) {
1822 _flags = Flag (string_2_enum (prop->value(), _flags));
1825 if ((prop = node.property ("channels")) != 0) {
1826 nchans = atoi (prop->value().c_str());
1829 // create necessary extra channels
1830 // we are always constructed with one and we always need one
1832 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1834 if (nchans > _n_channels.n_audio()) {
1836 add_channel (nchans - _n_channels.n_audio());
1837 IO::PortCountChanged(_n_channels);
1839 } else if (nchans < _n_channels.n_audio()) {
1841 remove_channel (_n_channels.n_audio() - nchans);
1844 if ((prop = node.property ("playlist")) == 0) {
1849 bool had_playlist = (_playlist != 0);
1851 if (find_and_use_playlist (prop->value())) {
1855 if (!had_playlist) {
1856 _playlist->set_orig_diskstream_id (id());
1859 if (!destructive() && capture_pending_node) {
1860 /* destructive streams have one and only one source per channel,
1861 and so they never end up in pending capture in any useful
1864 use_pending_capture_data (*capture_pending_node);
1869 if ((prop = node.property ("speed")) != 0) {
1870 double sp = atof (prop->value().c_str());
1872 if (realtime_set_speed (sp, false)) {
1873 non_realtime_set_speed ();
1877 in_set_state = false;
1879 /* make sure this is clear before we do anything else */
1881 capturing_sources.clear ();
1883 /* write sources are handled when we handle the input set
1884 up of the IO that owns this DS (::non_realtime_input_change())
1891 AudioDiskstream::use_new_write_source (uint32_t n)
1893 boost::shared_ptr<ChannelList> c = channels.reader();
1895 if (!recordable()) {
1899 if (n >= c->size()) {
1900 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1904 ChannelInfo* chan = (*c)[n];
1907 /* file starts off as a stub file, it will be converted
1908 when we're done with a capture pass.
1911 if ((chan->write_source = _session.create_audio_source_for_session (n_channels().n_audio(),
1912 name(), n, destructive(),
1914 throw failed_constructor();
1918 catch (failed_constructor &err) {
1919 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1920 chan->write_source.reset ();
1924 /* do not remove destructive files even if they are empty */
1926 chan->write_source->set_allow_remove_if_empty (!destructive());
1931 list<boost::shared_ptr<Source> >
1932 AudioDiskstream::steal_write_sources()
1934 /* not possible to steal audio write sources */
1935 list<boost::shared_ptr<Source> > ret;
1940 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1942 ChannelList::iterator chan;
1943 boost::shared_ptr<ChannelList> c = channels.reader();
1946 if (!_session.writable() || !recordable()) {
1950 capturing_sources.clear ();
1952 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1954 if (!destructive()) {
1956 if ((*chan)->write_source) {
1958 if (mark_write_complete) {
1959 (*chan)->write_source->mark_streaming_write_completed ();
1960 (*chan)->write_source->done_with_peakfile_writes ();
1963 if ((*chan)->write_source->removable()) {
1964 (*chan)->write_source->mark_for_remove ();
1965 (*chan)->write_source->drop_references ();
1966 _session.remove_source ((*chan)->write_source);
1969 (*chan)->write_source.reset ();
1972 use_new_write_source (n);
1974 if (record_enabled()) {
1975 capturing_sources.push_back ((*chan)->write_source);
1980 if ((*chan)->write_source == 0) {
1981 use_new_write_source (n);
1986 if (destructive() && !c->empty ()) {
1988 /* we now have all our write sources set up, so create the
1989 playlist's single region.
1992 if (_playlist->empty()) {
1993 setup_destructive_playlist ();
1999 AudioDiskstream::rename_write_sources ()
2001 ChannelList::iterator chan;
2002 boost::shared_ptr<ChannelList> c = channels.reader();
2005 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2006 if ((*chan)->write_source != 0) {
2007 (*chan)->write_source->set_source_name (_name.val(), destructive());
2008 /* XXX what to do if one of them fails ? */
2016 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
2018 if (_session.get_block_size() > speed_buffer_size) {
2019 speed_buffer_size = _session.get_block_size();
2020 boost::shared_ptr<ChannelList> c = channels.reader();
2022 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2023 if ((*chan)->speed_buffer)
2024 delete [] (*chan)->speed_buffer;
2025 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2028 allocate_temporary_buffers ();
2032 AudioDiskstream::allocate_temporary_buffers ()
2034 /* make sure the wrap buffer is at least large enough to deal
2035 with the speeds up to 1.2, to allow for micro-variation
2036 when slaving to MTC, Timecode etc.
2039 double const sp = max (fabsf (_actual_speed), 1.2f);
2040 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
2042 if (required_wrap_size > wrap_buffer_size) {
2044 boost::shared_ptr<ChannelList> c = channels.reader();
2046 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2047 if ((*chan)->playback_wrap_buffer)
2048 delete [] (*chan)->playback_wrap_buffer;
2049 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2050 if ((*chan)->capture_wrap_buffer)
2051 delete [] (*chan)->capture_wrap_buffer;
2052 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2055 wrap_buffer_size = required_wrap_size;
2060 AudioDiskstream::monitor_input (bool yn)
2062 boost::shared_ptr<ChannelList> c = channels.reader();
2064 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2066 if ((*chan)->source) {
2067 (*chan)->source->ensure_monitor_input (yn);
2073 AudioDiskstream::set_align_style_from_io ()
2075 bool have_physical = false;
2081 get_input_sources ();
2083 boost::shared_ptr<ChannelList> c = channels.reader();
2085 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2086 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2087 have_physical = true;
2092 if (have_physical) {
2093 set_align_style (ExistingMaterial);
2095 set_align_style (CaptureTime);
2100 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2102 while (how_many--) {
2103 c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_playback_buffer_size(),
2104 _session.butler()->audio_diskstream_capture_buffer_size(),
2105 speed_buffer_size, wrap_buffer_size));
2106 interpolation.add_channel_to (_session.butler()->audio_diskstream_playback_buffer_size(), speed_buffer_size);
2109 _n_channels.set(DataType::AUDIO, c->size());
2115 AudioDiskstream::add_channel (uint32_t how_many)
2117 RCUWriter<ChannelList> writer (channels);
2118 boost::shared_ptr<ChannelList> c = writer.get_copy();
2120 return add_channel_to (c, how_many);
2124 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2126 while (how_many-- && !c->empty()) {
2129 interpolation.remove_channel_from ();
2132 _n_channels.set(DataType::AUDIO, c->size());
2138 AudioDiskstream::remove_channel (uint32_t how_many)
2140 RCUWriter<ChannelList> writer (channels);
2141 boost::shared_ptr<ChannelList> c = writer.get_copy();
2143 return remove_channel_from (c, how_many);
2147 AudioDiskstream::playback_buffer_load () const
2149 boost::shared_ptr<ChannelList> c = channels.reader();
2155 return (float) ((double) c->front()->playback_buf->read_space()/
2156 (double) c->front()->playback_buf->bufsize());
2160 AudioDiskstream::capture_buffer_load () const
2162 boost::shared_ptr<ChannelList> c = channels.reader();
2168 return (float) ((double) c->front()->capture_buf->write_space()/
2169 (double) c->front()->capture_buf->bufsize());
2173 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2175 const XMLProperty* prop;
2176 XMLNodeList nlist = node.children();
2177 XMLNodeIterator niter;
2178 boost::shared_ptr<AudioFileSource> fs;
2179 boost::shared_ptr<AudioFileSource> first_fs;
2180 SourceList pending_sources;
2181 framepos_t position;
2183 if ((prop = node.property (X_("at"))) == 0) {
2187 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2191 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2192 if ((*niter)->name() == X_("file")) {
2194 if ((prop = (*niter)->property (X_("path"))) == 0) {
2198 // This protects sessions from errant CapturingSources in stored sessions
2200 if (stat (prop->value().c_str(), &sbuf)) {
2205 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2206 SourceFactory::createWritable (DataType::AUDIO, _session,
2207 prop->value(), string(), false, _session.frame_rate()));
2210 catch (failed_constructor& err) {
2211 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2212 _name, prop->value())
2217 pending_sources.push_back (fs);
2219 if (first_fs == 0) {
2223 fs->set_captured_for (_name.val());
2227 if (pending_sources.size() == 0) {
2228 /* nothing can be done */
2232 if (pending_sources.size() != _n_channels.n_audio()) {
2233 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2238 boost::shared_ptr<AudioRegion> region;
2244 plist.add (Properties::start, 0);
2245 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2246 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2248 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2250 region->set_automatic (true);
2251 region->set_whole_file (true);
2252 region->special_set_position (0);
2255 catch (failed_constructor& err) {
2256 error << string_compose (
2257 _("%1: cannot create whole-file region from pending capture sources"),
2263 _playlist->add_region (region, position);
2269 AudioDiskstream::set_non_layered (bool yn)
2271 if (yn != non_layered()) {
2274 _flags = Flag (_flags | NonLayered);
2276 _flags = Flag (_flags & ~NonLayered);
2284 AudioDiskstream::set_destructive (bool yn)
2286 if (yn != destructive()) {
2289 bool bounce_ignored;
2290 /* requestor should already have checked this and
2291 bounced if necessary and desired
2293 if (!can_become_destructive (bounce_ignored)) {
2296 _flags = Flag (_flags | Destructive);
2297 use_destructive_playlist ();
2299 _flags = Flag (_flags & ~Destructive);
2300 reset_write_sources (true, true);
2308 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2311 requires_bounce = false;
2315 /* is there only one region ? */
2317 if (_playlist->n_regions() != 1) {
2318 requires_bounce = true;
2322 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2324 requires_bounce = false;
2328 /* do the source(s) for the region cover the session start position ? */
2330 if (first->position() != _session.current_start_frame()) {
2331 if (first->start() > _session.current_start_frame()) {
2332 requires_bounce = true;
2337 /* is the source used by only 1 playlist ? */
2339 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2343 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2344 requires_bounce = true;
2348 requires_bounce = false;
2353 AudioDiskstream::adjust_playback_buffering ()
2355 boost::shared_ptr<ChannelList> c = channels.reader();
2357 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2358 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2363 AudioDiskstream::adjust_capture_buffering ()
2365 boost::shared_ptr<ChannelList> c = channels.reader();
2367 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2368 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2372 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2376 current_capture_buffer = 0;
2377 current_playback_buffer = 0;
2378 curr_capture_cnt = 0;
2380 speed_buffer = new Sample[speed_size];
2381 playback_wrap_buffer = new Sample[wrap_size];
2382 capture_wrap_buffer = new Sample[wrap_size];
2384 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2385 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2386 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2388 /* touch the ringbuffer buffers, which will cause
2389 them to be mapped into locked physical RAM if
2390 we're running with mlockall(). this doesn't do
2394 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2395 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2396 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2400 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2402 delete playback_buf;
2403 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2404 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2408 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2412 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2413 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2416 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2418 write_source.reset ();
2420 delete [] speed_buffer;
2423 delete [] playback_wrap_buffer;
2424 playback_wrap_buffer = 0;
2426 delete [] capture_wrap_buffer;
2427 capture_wrap_buffer = 0;
2429 delete playback_buf;
2435 delete capture_transition_buf;
2436 capture_transition_buf = 0;