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"
67 using namespace ARDOUR;
70 size_t AudioDiskstream::_working_buffers_size = 0;
71 Sample* AudioDiskstream::_mixdown_buffer = 0;
72 gain_t* AudioDiskstream::_gain_buffer = 0;
74 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
75 : Diskstream(sess, name, flag)
76 , deprecated_io_node(NULL)
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 , deprecated_io_node(NULL)
89 , channels (new ChannelList)
94 if (set_state (node, Stateful::loading_state_version)) {
96 throw failed_constructor();
102 use_destructive_playlist ();
107 AudioDiskstream::init ()
109 /* there are no channels at this point, so these
110 two calls just get speed_buffer_size and wrap_buffer
111 size setup without duplicating their code.
114 set_block_size (_session.get_block_size());
115 allocate_temporary_buffers ();
118 assert(_n_channels == ChanCount(DataType::AUDIO, 1));
121 AudioDiskstream::~AudioDiskstream ()
123 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
126 RCUWriter<ChannelList> writer (channels);
127 boost::shared_ptr<ChannelList> c = writer.get_copy();
129 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
138 delete deprecated_io_node;
142 AudioDiskstream::allocate_working_buffers()
144 assert(disk_io_frames() > 0);
146 _working_buffers_size = disk_io_frames();
147 _mixdown_buffer = new Sample[_working_buffers_size];
148 _gain_buffer = new gain_t[_working_buffers_size];
152 AudioDiskstream::free_working_buffers()
154 delete [] _mixdown_buffer;
155 delete [] _gain_buffer;
156 _working_buffers_size = 0;
162 AudioDiskstream::non_realtime_input_change ()
165 Glib::Mutex::Lock lm (state_lock);
167 if (input_change_pending == NoChange) {
172 RCUWriter<ChannelList> writer (channels);
173 boost::shared_ptr<ChannelList> c = writer.get_copy();
175 _n_channels.set(DataType::AUDIO, c->size());
177 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
178 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
179 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
180 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
184 get_input_sources ();
185 set_capture_offset ();
187 if (first_input_change) {
188 set_align_style (_persistent_alignment_style);
189 first_input_change = false;
191 set_align_style_from_io ();
194 input_change_pending = NoChange;
196 /* implicit unlock */
199 /* reset capture files */
201 reset_write_sources (false);
203 /* now refill channel buffers */
205 if (speed() != 1.0f || speed() != -1.0f) {
206 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
208 seek (_session.transport_frame());
213 AudioDiskstream::non_realtime_locate (nframes_t location)
215 /* now refill channel buffers */
217 if (speed() != 1.0f || speed() != -1.0f) {
218 seek ((nframes_t) (location * (double) speed()));
225 AudioDiskstream::get_input_sources ()
227 boost::shared_ptr<ChannelList> c = channels.reader();
230 ChannelList::iterator chan;
231 uint32_t ni = _io->n_ports().n_audio();
232 vector<string> connections;
234 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
236 connections.clear ();
238 if (_io->nth (n)->get_connections (connections) == 0) {
240 if ((*chan)->source) {
241 // _source->disable_metering ();
247 (*chan)->source = dynamic_cast<AudioPort*>(_session.engine().get_port_by_name (connections[0]) );
253 AudioDiskstream::find_and_use_playlist (const string& name)
255 boost::shared_ptr<AudioPlaylist> playlist;
257 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
258 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
262 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
266 return use_playlist (playlist);
270 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
272 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
274 Diskstream::use_playlist(playlist);
280 AudioDiskstream::use_new_playlist ()
283 boost::shared_ptr<AudioPlaylist> playlist;
285 if (!in_set_state && destructive()) {
290 newname = Playlist::bump_name (_playlist->name(), _session);
292 newname = Playlist::bump_name (_name, _session);
295 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
297 playlist->set_orig_diskstream_id (id());
298 return use_playlist (playlist);
306 AudioDiskstream::use_copy_playlist ()
308 assert(audio_playlist());
314 if (_playlist == 0) {
315 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
320 boost::shared_ptr<AudioPlaylist> playlist;
322 newname = Playlist::bump_name (_playlist->name(), _session);
324 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
325 playlist->set_orig_diskstream_id (id());
326 return use_playlist (playlist);
333 AudioDiskstream::setup_destructive_playlist ()
336 boost::shared_ptr<ChannelList> c = channels.reader();
338 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
339 srcs.push_back ((*chan)->write_source);
342 /* a single full-sized region */
344 assert (!srcs.empty ());
347 plist.add (Properties::name, _name.val());
348 plist.add (Properties::start, 0);
349 plist.add (Properties::length, max_frames - max_frames - srcs.front()->natural_position());
351 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
352 _playlist->add_region (region, srcs.front()->natural_position());
356 AudioDiskstream::use_destructive_playlist ()
358 /* this is called from the XML-based constructor or ::set_destructive. when called,
359 we already have a playlist and a region, but we need to
360 set up our sources for write. we use the sources associated
361 with the (presumed single, full-extent) region.
364 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
367 reset_write_sources (false, true);
371 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
374 throw failed_constructor();
377 /* be sure to stretch the region out to the maximum length */
379 region->set_length (max_frames - region->position(), this);
382 ChannelList::iterator chan;
383 boost::shared_ptr<ChannelList> c = channels.reader();
385 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
386 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
387 assert((*chan)->write_source);
388 (*chan)->write_source->set_allow_remove_if_empty (false);
390 /* this might be false if we switched modes, so force it */
392 (*chan)->write_source->set_destructive (true);
395 /* the source list will never be reset for a destructive track */
399 AudioDiskstream::prepare_record_status(nframes_t capture_start_frame)
401 if (recordable() && destructive()) {
402 boost::shared_ptr<ChannelList> c = channels.reader();
403 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
405 RingBufferNPT<CaptureTransition>::rw_vector transvec;
406 (*chan)->capture_transition_buf->get_write_vector(&transvec);
408 if (transvec.len[0] > 0) {
409 transvec.buf[0]->type = CaptureStart;
410 transvec.buf[0]->capture_val = capture_start_frame;
411 (*chan)->capture_transition_buf->increment_write_ptr(1);
415 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
423 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can_record, bool rec_monitors_input, bool& need_butler)
426 boost::shared_ptr<ChannelList> c = channels.reader();
427 ChannelList::iterator chan;
429 nframes_t rec_offset = 0;
430 nframes_t rec_nframes = 0;
431 bool nominally_recording;
432 bool re = record_enabled ();
433 bool collect_playback = false;
435 playback_distance = 0;
437 if (!_io || !_io->active()) {
441 check_record_status (transport_frame, nframes, can_record);
443 nominally_recording = (can_record && re);
449 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
455 adjust_capture_position = 0;
457 for (chan = c->begin(); chan != c->end(); ++chan) {
458 (*chan)->current_capture_buffer = 0;
459 (*chan)->current_playback_buffer = 0;
462 if (nominally_recording || (_session.get_record_enabled() && _session.config.get_punch_in())) {
463 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
464 if (last_recordable_frame < first_recordable_frame) {
465 last_recordable_frame = max_frames;
468 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
470 calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset);
472 if (rec_nframes && !was_recording) {
473 capture_captured = 0;
474 was_recording = true;
478 if (can_record && !_last_capture_regions.empty()) {
479 _last_capture_regions.clear ();
482 if (nominally_recording || rec_nframes) {
484 uint32_t limit = _io->n_ports ().n_audio();
486 /* one or more ports could already have been removed from _io, but our
487 channel setup hasn't yet been updated. prevent us from trying to
488 use channels that correspond to missing ports. note that the
489 process callback (from which this is called) is always atomic
490 with respect to port removal/addition.
493 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
495 ChannelInfo* chaninfo (*chan);
497 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
499 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
501 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
503 /* note: grab the entire port buffer, but only copy what we were supposed to
504 for recording, and use rec_offset
507 AudioPort* const ap = _io->audio (n);
509 assert(rec_nframes <= ap->get_audio_buffer(nframes).capacity());
510 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (rec_nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
515 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
517 if (rec_nframes > total) {
522 AudioPort* const ap = _io->audio (n);
525 Sample* buf = ap->get_audio_buffer(nframes).data();
526 nframes_t first = chaninfo->capture_vector.len[0];
528 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
529 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
530 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
531 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
533 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
540 finish_capture (rec_monitors_input, c);
547 /* data will be written to disk */
549 if (rec_nframes == nframes && rec_offset == 0) {
551 for (chan = c->begin(); chan != c->end(); ++chan) {
552 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
555 playback_distance = nframes;
560 /* we can't use the capture buffer as the playback buffer, because
561 we recorded only a part of the current process' cycle data
565 collect_playback = true;
568 adjust_capture_position = rec_nframes;
570 } else if (nominally_recording) {
572 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
574 for (chan = c->begin(); chan != c->end(); ++chan) {
575 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
578 playback_distance = nframes;
582 collect_playback = true;
585 if (collect_playback) {
587 /* we're doing playback */
589 nframes_t necessary_samples;
591 /* no varispeed playback if we're recording, because the output .... TBD */
593 if (rec_nframes == 0 && _actual_speed != 1.0f) {
594 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
596 necessary_samples = nframes;
599 for (chan = c->begin(); chan != c->end(); ++chan) {
600 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
605 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
607 ChannelInfo* chaninfo (*chan);
609 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
611 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
614 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
616 if (necessary_samples > total) {
617 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
618 cerr << "underrun for " << _name << endl;
624 memcpy ((char *) chaninfo->playback_wrap_buffer,
625 chaninfo->playback_vector.buf[0],
626 chaninfo->playback_vector.len[0] * sizeof (Sample));
627 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
628 chaninfo->playback_vector.buf[1],
629 (necessary_samples - chaninfo->playback_vector.len[0])
632 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
637 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
638 process_varispeed_playback(nframes, c);
640 playback_distance = nframes;
643 _speed = _target_speed;
649 if (commit (nframes)) {
658 AudioDiskstream::process_varispeed_playback(nframes_t nframes, boost::shared_ptr<ChannelList> c)
660 ChannelList::iterator chan;
662 interpolation.set_speed (_target_speed);
665 for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
666 ChannelInfo* chaninfo (*chan);
668 playback_distance = interpolation.interpolate (
669 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
671 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
676 AudioDiskstream::commit (nframes_t /* nframes */)
678 bool need_butler = false;
680 if (!_io || !_io->active()) {
684 if (_actual_speed < 0.0) {
685 playback_sample -= playback_distance;
687 playback_sample += playback_distance;
690 boost::shared_ptr<ChannelList> c = channels.reader();
691 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
693 (*chan)->playback_buf->increment_read_ptr (playback_distance);
695 if (adjust_capture_position) {
696 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
700 if (adjust_capture_position != 0) {
701 capture_captured += adjust_capture_position;
702 adjust_capture_position = 0;
706 if (_io && _io->active()) {
707 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
712 if (_io && _io->active()) {
713 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
714 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
716 need_butler = c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
724 AudioDiskstream::set_pending_overwrite (bool yn)
726 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
728 pending_overwrite = yn;
730 overwrite_frame = playback_sample;
731 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
735 AudioDiskstream::overwrite_existing_buffers ()
737 boost::shared_ptr<ChannelList> c = channels.reader();
738 Sample* mixdown_buffer;
741 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
743 overwrite_queued = false;
745 /* assume all are the same size */
746 nframes_t size = c->front()->playback_buf->bufsize();
748 mixdown_buffer = new Sample[size];
749 gain_buffer = new float[size];
751 /* reduce size so that we can fill the buffer correctly. */
757 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
759 start = overwrite_frame;
760 nframes_t cnt = size;
762 /* to fill the buffer without resetting the playback sample, we need to
763 do it one or two chunks (normally two).
765 |----------------------------------------------------------------------|
769 |<- second chunk->||<----------------- first chunk ------------------>|
773 nframes_t to_read = size - overwrite_offset;
775 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
776 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
777 _id, size, playback_sample) << endmsg;
785 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
786 start, cnt, *chan, n, reversed)) {
787 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
788 _id, size, playback_sample) << endmsg;
797 pending_overwrite = false;
798 delete [] gain_buffer;
799 delete [] mixdown_buffer;
804 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
808 ChannelList::iterator chan;
809 boost::shared_ptr<ChannelList> c = channels.reader();
811 Glib::Mutex::Lock lm (state_lock);
813 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
814 (*chan)->playback_buf->reset ();
815 (*chan)->capture_buf->reset ();
818 /* can't rec-enable in destructive mode if transport is before start */
820 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
821 disengage_record_enable ();
824 playback_sample = frame;
827 if (complete_refill) {
828 while ((ret = do_refill_with_alloc ()) > 0) ;
830 ret = do_refill_with_alloc ();
837 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
839 ChannelList::iterator chan;
840 boost::shared_ptr<ChannelList> c = channels.reader();
842 for (chan = c->begin(); chan != c->end(); ++chan) {
843 if ((*chan)->playback_buf->read_space() < distance) {
851 AudioDiskstream::internal_playback_seek (nframes_t distance)
853 ChannelList::iterator chan;
854 boost::shared_ptr<ChannelList> c = channels.reader();
856 for (chan = c->begin(); chan != c->end(); ++chan) {
857 (*chan)->playback_buf->increment_read_ptr (distance);
860 first_recordable_frame += distance;
861 playback_sample += distance;
867 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
868 ChannelInfo* /*channel_info*/, int channel, bool reversed)
870 nframes_t this_read = 0;
872 nframes_t loop_end = 0;
873 nframes_t loop_start = 0;
874 nframes_t offset = 0;
877 /* XXX we don't currently play loops in reverse. not sure why */
881 nframes_t loop_length = 0;
883 /* Make the use of a Location atomic for this read operation.
885 Note: Locations don't get deleted, so all we care about
886 when I say "atomic" is that we are always pointing to
887 the same one and using a start/length values obtained
891 if ((loc = loop_location) != 0) {
892 loop_start = loc->start();
893 loop_end = loc->end();
894 loop_length = loop_end - loop_start;
897 /* if we are looping, ensure that the first frame we read is at the correct
898 position within the loop.
901 if (loc && start >= loop_end) {
902 //cerr << "start adjusted from " << start;
903 start = loop_start + ((start - loop_start) % loop_length);
904 //cerr << "to " << start << endl;
907 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
916 /* take any loop into account. we can't read past the end of the loop. */
918 if (loc && (loop_end - start < cnt)) {
919 this_read = loop_end - start;
920 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
927 if (this_read == 0) {
931 this_read = min(cnt,this_read);
933 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
934 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
939 _read_data_count = _playlist->read_data_count();
943 swap_by_ptr (buf, buf + this_read - 1);
947 /* if we read to the end of the loop, go back to the beginning */
964 AudioDiskstream::do_refill_with_alloc ()
966 Sample* mix_buf = new Sample[disk_io_chunk_frames];
967 float* gain_buf = new float[disk_io_chunk_frames];
969 int ret = _do_refill(mix_buf, gain_buf);
978 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
982 RingBufferNPT<Sample>::rw_vector vector;
983 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
984 nframes_t total_space;
987 ChannelList::iterator i;
988 boost::shared_ptr<ChannelList> c = channels.reader();
995 assert(mixdown_buffer);
1003 c->front()->playback_buf->get_write_vector (&vector);
1005 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1009 /* if there are 2+ chunks of disk i/o possible for
1010 this track, let the caller know so that it can arrange
1011 for us to be called again, ASAP.
1014 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1018 /* if we're running close to normal speed and there isn't enough
1019 space to do disk_io_chunk_frames of I/O, then don't bother.
1021 at higher speeds, just do it because the sync between butler
1022 and audio thread may not be good enough.
1025 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1029 /* when slaved, don't try to get too close to the read pointer. this
1030 leaves space for the buffer reversal to have something useful to
1034 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1038 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1040 total_space = min (disk_io_chunk_frames, total_space);
1044 if (file_frame == 0) {
1046 /* at start: nothing to do but fill with silence */
1048 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1050 ChannelInfo* chan (*i);
1051 chan->playback_buf->get_write_vector (&vector);
1052 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1053 if (vector.len[1]) {
1054 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1056 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1061 if (file_frame < total_space) {
1063 /* too close to the start: read what we can,
1064 and then zero fill the rest
1067 zero_fill = total_space - file_frame;
1068 total_space = file_frame;
1078 if (file_frame == max_frames) {
1080 /* at end: nothing to do but fill with silence */
1082 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1084 ChannelInfo* chan (*i);
1085 chan->playback_buf->get_write_vector (&vector);
1086 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1087 if (vector.len[1]) {
1088 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1090 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1095 if (file_frame > max_frames - total_space) {
1097 /* to close to the end: read what we can, and zero fill the rest */
1099 zero_fill = total_space - (max_frames - file_frame);
1100 total_space = max_frames - file_frame;
1107 nframes_t file_frame_tmp = 0;
1109 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1111 ChannelInfo* chan (*i);
1114 nframes_t len1, len2;
1116 chan->playback_buf->get_write_vector (&vector);
1118 if (vector.len[0] > disk_io_chunk_frames) {
1120 /* we're not going to fill the first chunk, so certainly do not bother with the
1121 other part. it won't be connected with the part we do fill, as in:
1123 .... => writable space
1124 ++++ => readable space
1125 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1127 |......|+++++++++++++|...............................|
1132 So, just pretend that the buf1 part isn't there.
1142 file_frame_tmp = file_frame;
1144 buf1 = vector.buf[0];
1145 len1 = vector.len[0];
1146 buf2 = vector.buf[1];
1147 len2 = vector.len[1];
1149 to_read = min (ts, len1);
1150 to_read = min (to_read, disk_io_chunk_frames);
1154 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1159 chan->playback_buf->increment_write_ptr (to_read);
1163 to_read = min (ts, len2);
1167 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1168 so read some or all of vector.len[1] as well.
1171 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1176 chan->playback_buf->increment_write_ptr (to_read);
1185 file_frame = file_frame_tmp;
1192 /** Flush pending data to disk.
1194 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1195 * of data to disk. it will never write more than that. If it writes that
1196 * much and there is more than that waiting to be written, it will return 1,
1197 * otherwise 0 on success or -1 on failure.
1199 * If there is less than disk_io_chunk_frames to be written, no data will be
1200 * written at all unless @a force_flush is true.
1203 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1207 RingBufferNPT<Sample>::rw_vector vector;
1208 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1211 _write_data_count = 0;
1213 transvec.buf[0] = 0;
1214 transvec.buf[1] = 0;
1218 boost::shared_ptr<ChannelList> c = channels.reader();
1219 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1221 (*chan)->capture_buf->get_read_vector (&vector);
1223 total = vector.len[0] + vector.len[1];
1225 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1229 /* if there are 2+ chunks of disk i/o possible for
1230 this track, let the caller know so that it can arrange
1231 for us to be called again, ASAP.
1233 if we are forcing a flush, then if there is* any* extra
1234 work, let the caller know.
1236 if we are no longer recording and there is any extra work,
1237 let the caller know too.
1240 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1244 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1246 // check the transition buffer when recording destructive
1247 // important that we get this after the capture buf
1249 if (destructive()) {
1250 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1251 size_t transcount = transvec.len[0] + transvec.len[1];
1252 bool have_start = false;
1255 for (ti=0; ti < transcount; ++ti) {
1256 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1258 if (captrans.type == CaptureStart) {
1259 // by definition, the first data we got above represents the given capture pos
1261 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1262 (*chan)->curr_capture_cnt = 0;
1266 else if (captrans.type == CaptureEnd) {
1268 // capture end, the capture_val represents total frames in capture
1270 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1272 // shorten to make the write a perfect fit
1273 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1275 if (nto_write < to_write) {
1276 ret = 1; // should we?
1278 to_write = nto_write;
1280 (*chan)->write_source->mark_capture_end ();
1282 // increment past this transition, but go no further
1287 // actually ends just beyond this chunk, so force more work
1295 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1299 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1300 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1304 (*chan)->capture_buf->increment_read_ptr (to_write);
1305 (*chan)->curr_capture_cnt += to_write;
1307 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1309 /* we wrote all of vector.len[0] but it wasn't an entire
1310 disk_io_chunk_frames of data, so arrange for some part
1311 of vector.len[1] to be flushed to disk as well.
1314 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1316 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1317 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1321 _write_data_count += (*chan)->write_source->write_data_count();
1323 (*chan)->capture_buf->increment_read_ptr (to_write);
1324 (*chan)->curr_capture_cnt += to_write;
1333 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1335 uint32_t buffer_position;
1336 bool more_work = true;
1338 boost::shared_ptr<AudioRegion> region;
1339 nframes_t total_capture;
1341 SourceList::iterator src;
1342 ChannelList::iterator chan;
1343 vector<CaptureInfo*>::iterator ci;
1344 boost::shared_ptr<ChannelList> c = channels.reader();
1346 bool mark_write_completed = false;
1348 finish_capture (true, c);
1350 /* butler is already stopped, but there may be work to do
1351 to flush remaining data to disk.
1354 while (more_work && !err) {
1355 switch (do_flush (TransportContext, true)) {
1362 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1367 /* XXX is there anything we can do if err != 0 ? */
1368 Glib::Mutex::Lock lm (capture_info_lock);
1370 if (capture_info.empty()) {
1374 if (abort_capture) {
1376 if (destructive()) {
1380 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1382 if ((*chan)->write_source) {
1384 (*chan)->write_source->mark_for_remove ();
1385 (*chan)->write_source->drop_references ();
1386 (*chan)->write_source.reset ();
1389 /* new source set up in "out" below */
1395 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1396 total_capture += (*ci)->frames;
1399 /* figure out the name for this take */
1401 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1403 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1407 s->update_header (capture_info.front()->start, when, twhen);
1408 s->set_captured_for (_name.val());
1409 s->mark_immutable ();
1410 if (Config->get_auto_analyse_audio()) {
1411 Analyser::queue_source_for_analysis (s, true);
1416 /* destructive tracks have a single, never changing region */
1418 if (destructive()) {
1420 /* send a signal that any UI can pick up to do the right thing. there is
1421 a small problem here in that a UI may need the peak data to be ready
1422 for the data that was recorded and this isn't interlocked with that
1423 process. this problem is deferred to the UI.
1426 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1430 string whole_file_region_name;
1431 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1433 /* Register a new region with the Session that
1434 describes the entire source. Do this first
1435 so that any sub-regions will obviously be
1436 children of this one (later!)
1442 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1443 plist.add (Properties::length, total_capture);
1444 plist.add (Properties::name, whole_file_region_name);
1446 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1447 rx->set_automatic (true);
1448 rx->set_whole_file (true);
1450 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1451 region->special_set_position (capture_info.front()->start);
1455 catch (failed_constructor& err) {
1456 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1460 _last_capture_regions.push_back (region);
1462 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1464 _playlist->clear_history ();
1465 _playlist->freeze ();
1467 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1471 RegionFactory::region_name (region_name, whole_file_region_name, false);
1473 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1479 plist.add (Properties::start, buffer_position);
1480 plist.add (Properties::length, (*ci)->frames);
1481 plist.add (Properties::name, region_name);
1483 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1484 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1487 catch (failed_constructor& err) {
1488 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1489 continue; /* XXX is this OK? */
1492 region->DropReferences.connect_same_thread (*this, boost::bind (&Diskstream::remove_region_from_last_capture, this, boost::weak_ptr<Region>(region)));
1494 _last_capture_regions.push_back (region);
1496 i_am_the_modifier++;
1497 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1498 i_am_the_modifier--;
1500 buffer_position += (*ci)->frames;
1504 _session.add_command (new StatefulDiffCommand (_playlist));
1507 mark_write_completed = true;
1510 reset_write_sources (mark_write_completed);
1514 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1518 capture_info.clear ();
1519 capture_start_frame = 0;
1523 AudioDiskstream::transport_looped (nframes_t transport_frame)
1525 if (was_recording) {
1526 // all we need to do is finish this capture, with modified capture length
1527 boost::shared_ptr<ChannelList> c = channels.reader();
1529 // adjust the capture length knowing that the data will be recorded to disk
1530 // only necessary after the first loop where we're recording
1531 if (capture_info.size() == 0) {
1532 capture_captured += _capture_offset;
1534 if (_alignment_style == ExistingMaterial) {
1535 capture_captured += _session.worst_output_latency();
1537 capture_captured += _roll_delay;
1541 finish_capture (true, c);
1543 // the next region will start recording via the normal mechanism
1544 // we'll set the start position to the current transport pos
1545 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1546 capture_start_frame = transport_frame;
1547 first_recordable_frame = transport_frame; // mild lie
1548 last_recordable_frame = max_frames;
1549 was_recording = true;
1551 if (recordable() && destructive()) {
1552 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1554 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1555 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1557 if (transvec.len[0] > 0) {
1558 transvec.buf[0]->type = CaptureStart;
1559 transvec.buf[0]->capture_val = capture_start_frame;
1560 (*chan)->capture_transition_buf->increment_write_ptr(1);
1564 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1574 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1576 was_recording = false;
1578 if (capture_captured == 0) {
1582 if (recordable() && destructive()) {
1583 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1585 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1586 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1588 if (transvec.len[0] > 0) {
1589 transvec.buf[0]->type = CaptureEnd;
1590 transvec.buf[0]->capture_val = capture_captured;
1591 (*chan)->capture_transition_buf->increment_write_ptr(1);
1595 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1601 CaptureInfo* ci = new CaptureInfo;
1603 ci->start = capture_start_frame;
1604 ci->frames = capture_captured;
1606 /* XXX theoretical race condition here. Need atomic exchange ?
1607 However, the circumstances when this is called right
1608 now (either on record-disable or transport_stopped)
1609 mean that no actual race exists. I think ...
1610 We now have a capture_info_lock, but it is only to be used
1611 to synchronize in the transport_stop and the capture info
1612 accessors, so that invalidation will not occur (both non-realtime).
1615 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1617 capture_info.push_back (ci);
1618 capture_captured = 0;
1620 /* now we've finished a capture, reset first_recordable_frame for next time */
1621 first_recordable_frame = max_frames;
1625 AudioDiskstream::set_record_enabled (bool yn)
1627 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1631 /* can't rec-enable in destructive mode if transport is before start */
1633 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1637 /* yes, i know that this not proof against race conditions, but its
1638 good enough. i think.
1641 if (record_enabled() != yn) {
1643 engage_record_enable ();
1645 disengage_record_enable ();
1651 AudioDiskstream::engage_record_enable ()
1653 bool rolling = _session.transport_speed() != 0.0f;
1654 boost::shared_ptr<ChannelList> c = channels.reader();
1656 g_atomic_int_set (&_record_enabled, 1);
1657 capturing_sources.clear ();
1659 if (Config->get_monitoring_model() == HardwareMonitoring) {
1661 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1662 if ((*chan)->source) {
1663 (*chan)->source->ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1665 capturing_sources.push_back ((*chan)->write_source);
1666 (*chan)->write_source->mark_streaming_write_started ();
1670 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1671 capturing_sources.push_back ((*chan)->write_source);
1672 (*chan)->write_source->mark_streaming_write_started ();
1676 RecordEnableChanged (); /* EMIT SIGNAL */
1680 AudioDiskstream::disengage_record_enable ()
1682 g_atomic_int_set (&_record_enabled, 0);
1683 boost::shared_ptr<ChannelList> c = channels.reader();
1684 if (Config->get_monitoring_model() == HardwareMonitoring) {
1685 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1686 if ((*chan)->source) {
1687 (*chan)->source->ensure_monitor_input (false);
1691 capturing_sources.clear ();
1692 RecordEnableChanged (); /* EMIT SIGNAL */
1696 AudioDiskstream::get_state ()
1698 XMLNode* node = new XMLNode ("AudioDiskstream");
1700 LocaleGuard lg (X_("POSIX"));
1701 boost::shared_ptr<ChannelList> c = channels.reader();
1703 node->add_property ("flags", enum_2_string (_flags));
1705 snprintf (buf, sizeof(buf), "%zd", c->size());
1706 node->add_property ("channels", buf);
1708 node->add_property ("playlist", _playlist->name());
1710 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1711 node->add_property ("speed", buf);
1713 node->add_property("name", _name);
1714 id().print (buf, sizeof (buf));
1715 node->add_property("id", buf);
1717 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1719 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1720 XMLNode* cs_grandchild;
1722 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1723 cs_grandchild = new XMLNode (X_("file"));
1724 cs_grandchild->add_property (X_("path"), (*i)->path());
1725 cs_child->add_child_nocopy (*cs_grandchild);
1728 /* store the location where capture will start */
1732 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1733 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1735 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1738 cs_child->add_property (X_("at"), buf);
1739 node->add_child_nocopy (*cs_child);
1743 node->add_child_copy (*_extra_xml);
1750 AudioDiskstream::set_state (const XMLNode& node, int /*version*/)
1752 const XMLProperty* prop;
1753 XMLNodeList nlist = node.children();
1754 XMLNodeIterator niter;
1755 uint32_t nchans = 1;
1756 XMLNode* capture_pending_node = 0;
1757 LocaleGuard lg (X_("POSIX"));
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 /* prevent write sources from being created */
1773 in_set_state = true;
1775 if ((prop = node.property ("name")) != 0) {
1776 _name = prop->value();
1779 if (deprecated_io_node) {
1780 if ((prop = deprecated_io_node->property ("id")) != 0) {
1781 _id = prop->value ();
1784 if ((prop = node.property ("id")) != 0) {
1785 _id = prop->value ();
1789 if ((prop = node.property ("flags")) != 0) {
1790 _flags = Flag (string_2_enum (prop->value(), _flags));
1793 if ((prop = node.property ("channels")) != 0) {
1794 nchans = atoi (prop->value().c_str());
1797 // create necessary extra channels
1798 // we are always constructed with one and we always need one
1800 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1802 if (nchans > _n_channels.n_audio()) {
1804 add_channel (nchans - _n_channels.n_audio());
1805 IO::PortCountChanged(_n_channels);
1807 } else if (nchans < _n_channels.n_audio()) {
1809 remove_channel (_n_channels.n_audio() - nchans);
1812 if ((prop = node.property ("playlist")) == 0) {
1817 bool had_playlist = (_playlist != 0);
1819 if (find_and_use_playlist (prop->value())) {
1823 if (!had_playlist) {
1824 _playlist->set_orig_diskstream_id (_id);
1827 if (!destructive() && capture_pending_node) {
1828 /* destructive streams have one and only one source per channel,
1829 and so they never end up in pending capture in any useful
1832 use_pending_capture_data (*capture_pending_node);
1837 if ((prop = node.property ("speed")) != 0) {
1838 double sp = atof (prop->value().c_str());
1840 if (realtime_set_speed (sp, false)) {
1841 non_realtime_set_speed ();
1845 in_set_state = false;
1847 /* make sure this is clear before we do anything else */
1849 capturing_sources.clear ();
1851 /* write sources are handled when we handle the input set
1852 up of the IO that owns this DS (::non_realtime_input_change())
1859 AudioDiskstream::use_new_write_source (uint32_t n)
1861 boost::shared_ptr<ChannelList> c = channels.reader();
1863 if (!recordable()) {
1867 if (n >= c->size()) {
1868 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1872 ChannelInfo* chan = (*c)[n];
1874 if (chan->write_source) {
1875 chan->write_source->done_with_peakfile_writes ();
1876 chan->write_source->set_allow_remove_if_empty (true);
1877 chan->write_source.reset ();
1881 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1882 throw failed_constructor();
1886 catch (failed_constructor &err) {
1887 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1888 chan->write_source.reset ();
1892 /* do not remove destructive files even if they are empty */
1894 chan->write_source->set_allow_remove_if_empty (!destructive());
1896 /* until we write, this file is considered removable */
1898 chan->write_source->mark_for_remove ();
1904 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1906 ChannelList::iterator chan;
1907 boost::shared_ptr<ChannelList> c = channels.reader();
1910 if (!_session.writable() || !recordable()) {
1914 capturing_sources.clear ();
1916 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1917 if (!destructive()) {
1919 if ((*chan)->write_source && mark_write_complete) {
1920 (*chan)->write_source->mark_streaming_write_completed ();
1922 use_new_write_source (n);
1924 if (record_enabled()) {
1925 capturing_sources.push_back ((*chan)->write_source);
1929 if ((*chan)->write_source == 0) {
1930 use_new_write_source (n);
1935 if (destructive() && !c->empty ()) {
1937 /* we now have all our write sources set up, so create the
1938 playlist's single region.
1941 if (_playlist->empty()) {
1942 setup_destructive_playlist ();
1948 AudioDiskstream::rename_write_sources ()
1950 ChannelList::iterator chan;
1951 boost::shared_ptr<ChannelList> c = channels.reader();
1954 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1955 if ((*chan)->write_source != 0) {
1956 (*chan)->write_source->set_source_name (_name.val(), destructive());
1957 /* XXX what to do if one of them fails ? */
1965 AudioDiskstream::set_block_size (nframes_t /*nframes*/)
1967 if (_session.get_block_size() > speed_buffer_size) {
1968 speed_buffer_size = _session.get_block_size();
1969 boost::shared_ptr<ChannelList> c = channels.reader();
1971 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1972 if ((*chan)->speed_buffer)
1973 delete [] (*chan)->speed_buffer;
1974 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1977 allocate_temporary_buffers ();
1981 AudioDiskstream::allocate_temporary_buffers ()
1983 /* make sure the wrap buffer is at least large enough to deal
1984 with the speeds up to 1.2, to allow for micro-variation
1985 when slaving to MTC, Timecode etc.
1988 double sp = max (fabsf (_actual_speed), 1.2f);
1989 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
1991 if (required_wrap_size > wrap_buffer_size) {
1993 boost::shared_ptr<ChannelList> c = channels.reader();
1995 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1996 if ((*chan)->playback_wrap_buffer)
1997 delete [] (*chan)->playback_wrap_buffer;
1998 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1999 if ((*chan)->capture_wrap_buffer)
2000 delete [] (*chan)->capture_wrap_buffer;
2001 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2004 wrap_buffer_size = required_wrap_size;
2009 AudioDiskstream::monitor_input (bool yn)
2011 boost::shared_ptr<ChannelList> c = channels.reader();
2013 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2015 if ((*chan)->source) {
2016 (*chan)->source->ensure_monitor_input (yn);
2022 AudioDiskstream::set_align_style_from_io ()
2024 bool have_physical = false;
2030 get_input_sources ();
2032 boost::shared_ptr<ChannelList> c = channels.reader();
2034 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2035 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2036 have_physical = true;
2041 if (have_physical) {
2042 set_align_style (ExistingMaterial);
2044 set_align_style (CaptureTime);
2049 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2051 while (how_many--) {
2052 c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2053 interpolation.add_channel_to (_session.butler()->audio_diskstream_buffer_size(), speed_buffer_size);
2056 _n_channels.set(DataType::AUDIO, c->size());
2062 AudioDiskstream::add_channel (uint32_t how_many)
2064 RCUWriter<ChannelList> writer (channels);
2065 boost::shared_ptr<ChannelList> c = writer.get_copy();
2067 return add_channel_to (c, how_many);
2071 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2073 while (how_many-- && !c->empty()) {
2076 interpolation.remove_channel_from ();
2079 _n_channels.set(DataType::AUDIO, c->size());
2085 AudioDiskstream::remove_channel (uint32_t how_many)
2087 RCUWriter<ChannelList> writer (channels);
2088 boost::shared_ptr<ChannelList> c = writer.get_copy();
2090 return remove_channel_from (c, how_many);
2094 AudioDiskstream::playback_buffer_load () const
2096 boost::shared_ptr<ChannelList> c = channels.reader();
2098 return (float) ((double) c->front()->playback_buf->read_space()/
2099 (double) c->front()->playback_buf->bufsize());
2103 AudioDiskstream::capture_buffer_load () const
2105 boost::shared_ptr<ChannelList> c = channels.reader();
2107 return (float) ((double) c->front()->capture_buf->write_space()/
2108 (double) c->front()->capture_buf->bufsize());
2112 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2114 const XMLProperty* prop;
2115 XMLNodeList nlist = node.children();
2116 XMLNodeIterator niter;
2117 boost::shared_ptr<AudioFileSource> fs;
2118 boost::shared_ptr<AudioFileSource> first_fs;
2119 SourceList pending_sources;
2122 if ((prop = node.property (X_("at"))) == 0) {
2126 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2130 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2131 if ((*niter)->name() == X_("file")) {
2133 if ((prop = (*niter)->property (X_("path"))) == 0) {
2137 // This protects sessions from errant CapturingSources in stored sessions
2139 if (stat (prop->value().c_str(), &sbuf)) {
2144 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2145 SourceFactory::createWritable (DataType::AUDIO, _session,
2146 prop->value(), false, _session.frame_rate()));
2149 catch (failed_constructor& err) {
2150 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2151 _name, prop->value())
2156 pending_sources.push_back (fs);
2158 if (first_fs == 0) {
2162 fs->set_captured_for (_name.val());
2166 if (pending_sources.size() == 0) {
2167 /* nothing can be done */
2171 if (pending_sources.size() != _n_channels.n_audio()) {
2172 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2177 boost::shared_ptr<AudioRegion> region;
2183 plist.add (Properties::start, 0);
2184 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2185 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2187 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2189 region->set_automatic (true);
2190 region->set_whole_file (true);
2191 region->special_set_position (0);
2194 catch (failed_constructor& err) {
2195 error << string_compose (
2196 _("%1: cannot create whole-file region from pending capture sources"),
2202 _playlist->add_region (region, position);
2208 AudioDiskstream::set_non_layered (bool yn)
2210 if (yn != non_layered()) {
2213 _flags = Flag (_flags | NonLayered);
2215 _flags = Flag (_flags & ~NonLayered);
2223 AudioDiskstream::set_destructive (bool yn)
2225 if (yn != destructive()) {
2228 bool bounce_ignored;
2229 /* requestor should already have checked this and
2230 bounced if necessary and desired
2232 if (!can_become_destructive (bounce_ignored)) {
2235 _flags = Flag (_flags | Destructive);
2236 use_destructive_playlist ();
2238 _flags = Flag (_flags & ~Destructive);
2239 reset_write_sources (true, true);
2247 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2250 requires_bounce = false;
2254 /* is there only one region ? */
2256 if (_playlist->n_regions() != 1) {
2257 requires_bounce = true;
2261 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2263 requires_bounce = false;
2267 /* do the source(s) for the region cover the session start position ? */
2269 if (first->position() != _session.current_start_frame()) {
2270 if (first->start() > _session.current_start_frame()) {
2271 requires_bounce = true;
2276 /* is the source used by only 1 playlist ? */
2278 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2282 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2283 requires_bounce = true;
2287 requires_bounce = false;
2291 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2295 current_capture_buffer = 0;
2296 current_playback_buffer = 0;
2297 curr_capture_cnt = 0;
2299 speed_buffer = new Sample[speed_size];
2300 playback_wrap_buffer = new Sample[wrap_size];
2301 capture_wrap_buffer = new Sample[wrap_size];
2303 playback_buf = new RingBufferNPT<Sample> (bufsize);
2304 capture_buf = new RingBufferNPT<Sample> (bufsize);
2305 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2307 /* touch the ringbuffer buffers, which will cause
2308 them to be mapped into locked physical RAM if
2309 we're running with mlockall(). this doesn't do
2313 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2314 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2315 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2318 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2320 write_source.reset ();
2322 delete [] speed_buffer;
2325 delete [] playback_wrap_buffer;
2326 playback_wrap_buffer = 0;
2328 delete [] capture_wrap_buffer;
2329 capture_wrap_buffer = 0;
2331 delete playback_buf;
2337 delete capture_transition_buf;
2338 capture_transition_buf = 0;