2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include <pbd/error.h>
34 #include <pbd/basename.h>
35 #include <glibmm/thread.h>
36 #include <pbd/xml++.h>
37 #include <pbd/memento_command.h>
38 #include <pbd/enumwriter.h>
39 #include <pbd/stacktrace.h>
41 #include <ardour/ardour.h>
42 #include <ardour/audioengine.h>
43 #include <ardour/analyser.h>
44 #include <ardour/audio_diskstream.h>
45 #include <ardour/utils.h>
46 #include <ardour/configuration.h>
47 #include <ardour/audiofilesource.h>
48 #include <ardour/send.h>
49 #include <ardour/region_factory.h>
50 #include <ardour/audioplaylist.h>
51 #include <ardour/playlist_factory.h>
52 #include <ardour/cycle_timer.h>
53 #include <ardour/audioregion.h>
54 #include <ardour/source_factory.h>
60 using namespace ARDOUR;
63 size_t AudioDiskstream::_working_buffers_size = 0;
64 Sample* AudioDiskstream::_mixdown_buffer = 0;
65 gain_t* AudioDiskstream::_gain_buffer = 0;
67 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
68 : Diskstream(sess, name, flag)
69 , deprecated_io_node(NULL)
70 , channels (new ChannelList)
72 /* prevent any write sources from being created */
82 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
83 : Diskstream(sess, node)
84 , deprecated_io_node(NULL)
85 , channels (new ChannelList)
90 if (set_state (node)) {
92 throw failed_constructor();
98 use_destructive_playlist ();
103 AudioDiskstream::init (Diskstream::Flag f)
107 /* there are no channels at this point, so these
108 two calls just get speed_buffer_size and wrap_buffer
109 size setup without duplicating their code.
112 set_block_size (_session.get_block_size());
113 allocate_temporary_buffers ();
116 assert(_n_channels == 1);
119 AudioDiskstream::~AudioDiskstream ()
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) {
138 AudioDiskstream::allocate_working_buffers()
140 assert(disk_io_frames() > 0);
142 _working_buffers_size = disk_io_frames();
143 _mixdown_buffer = new Sample[_working_buffers_size];
144 _gain_buffer = new gain_t[_working_buffers_size];
148 AudioDiskstream::free_working_buffers()
150 delete [] _mixdown_buffer;
151 delete [] _gain_buffer;
152 _working_buffers_size = 0;
158 AudioDiskstream::non_realtime_input_change ()
161 Glib::Mutex::Lock lm (state_lock);
163 if (input_change_pending == NoChange) {
168 RCUWriter<ChannelList> writer (channels);
169 boost::shared_ptr<ChannelList> c = writer.get_copy();
171 _n_channels = c->size();
173 if (_io->n_inputs() > _n_channels) {
174 add_channel_to (c, _io->n_inputs() - _n_channels);
175 } else if (_io->n_inputs() < _n_channels) {
176 remove_channel_from (c, _n_channels - _io->n_inputs());
180 get_input_sources ();
181 set_capture_offset ();
183 if (first_input_change) {
184 set_align_style (_persistent_alignment_style);
185 first_input_change = false;
187 set_align_style_from_io ();
190 input_change_pending = NoChange;
192 /* implicit unlock */
195 /* reset capture files */
197 reset_write_sources (false);
199 /* now refill channel buffers */
201 if (speed() != 1.0f || speed() != -1.0f) {
202 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
204 seek (_session.transport_frame());
209 AudioDiskstream::get_input_sources ()
211 boost::shared_ptr<ChannelList> c = channels.reader();
214 ChannelList::iterator chan;
215 uint32_t ni = _io->n_inputs();
217 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
219 const char **connections = _io->input(n)->get_connections ();
221 if (connections == 0 || connections[0] == 0) {
223 if ((*chan)->source) {
224 // _source->disable_metering ();
230 (*chan)->source = _session.engine().get_port_by_name (connections[0]);
240 AudioDiskstream::find_and_use_playlist (const string& name)
242 boost::shared_ptr<AudioPlaylist> playlist;
244 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
245 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, name));
249 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
253 return use_playlist (playlist);
257 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
259 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
261 Diskstream::use_playlist(playlist);
267 AudioDiskstream::use_new_playlist ()
270 boost::shared_ptr<AudioPlaylist> playlist;
272 if (!in_set_state && destructive()) {
277 newname = Playlist::bump_name (_playlist->name(), _session);
279 newname = Playlist::bump_name (_name, _session);
282 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, newname, hidden()))) != 0) {
284 playlist->set_orig_diskstream_id (id());
285 return use_playlist (playlist);
293 AudioDiskstream::use_copy_playlist ()
295 assert(audio_playlist());
301 if (_playlist == 0) {
302 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
307 boost::shared_ptr<AudioPlaylist> playlist;
309 newname = Playlist::bump_name (_playlist->name(), _session);
311 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
312 playlist->set_orig_diskstream_id (id());
313 return use_playlist (playlist);
320 AudioDiskstream::setup_destructive_playlist ()
323 boost::shared_ptr<ChannelList> c = channels.reader();
325 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
326 srcs.push_back ((*chan)->write_source);
329 /* a single full-sized region */
331 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
332 _playlist->add_region (region, srcs.front()->natural_position());
336 AudioDiskstream::use_destructive_playlist ()
338 /* this is called from the XML-based constructor or ::set_destructive. when called,
339 we already have a playlist and a region, but we need to
340 set up our sources for write. we use the sources associated
341 with the (presumed single, full-extent) region.
344 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
347 reset_write_sources (false, true);
351 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
354 throw failed_constructor();
357 /* be sure to stretch the region out to the maximum length */
359 region->set_length (max_frames - region->position(), this);
362 ChannelList::iterator chan;
363 boost::shared_ptr<ChannelList> c = channels.reader();
365 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
366 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
367 assert((*chan)->write_source);
368 (*chan)->write_source->set_allow_remove_if_empty (false);
370 /* this might be false if we switched modes, so force it */
372 (*chan)->write_source->set_destructive (true);
375 /* the source list will never be reset for a destructive track */
379 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
381 int possibly_recording;
384 const int transport_rolling = 0x4;
385 const int track_rec_enabled = 0x2;
386 const int global_rec_enabled = 0x1;
388 /* merge together the 3 factors that affect record status, and compute
392 rolling = _session.transport_speed() != 0.0f;
393 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
394 change = possibly_recording ^ last_possibly_recording;
396 if (possibly_recording == last_possibly_recording) {
402 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
404 if (((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record)) ||
405 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
407 /* starting to record: compute first+last frames */
409 first_recordable_frame = transport_frame + _capture_offset;
410 // cerr << "set FRF = " << transport_frame << " + " << _capture_offset << " = " << first_recordable_frame << endl;
411 last_recordable_frame = max_frames;
412 capture_start_frame = transport_frame;
414 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
416 /* was stopped, now rolling (and recording) */
418 if (_alignment_style == ExistingMaterial) {
419 //cerr << "A FRF += " << _session.worst_output_latency () << endl;
420 // first_recordable_frame += _session.worst_output_latency();
422 // cerr << "B FRF += " << _roll_delay<< endl;
423 // first_recordable_frame += _roll_delay;
428 /* was rolling, but record state changed */
430 if (_alignment_style == ExistingMaterial) {
432 if (!Config->get_punch_in()) {
434 /* manual punch in happens at the correct transport frame
435 because the user hit a button. but to get alignment correct
436 we have to back up the position of the new region to the
437 appropriate spot given the roll delay.
440 capture_start_frame -= _roll_delay;
442 /* XXX paul notes (august 2005): i don't know why
446 // cerr << "1 FRF += " << _capture_offset << endl;
447 first_recordable_frame += _capture_offset;
451 /* autopunch toggles recording at the precise
452 transport frame, and then the DS waits
453 to start recording for a time that depends
454 on the output latency.
457 // cerr << "2 FRF += " << _session.worst_output_latency() << endl;
458 first_recordable_frame += _session.worst_output_latency();
463 if (Config->get_punch_in()) {
464 // cerr << "3 FRF += " << _roll_delay << endl;
465 first_recordable_frame += _roll_delay;
467 capture_start_frame -= _roll_delay;
473 // cerr << _name << " FRF = " << first_recordable_frame << " CSF = " << capture_start_frame << endl;
475 if (recordable() && destructive()) {
476 boost::shared_ptr<ChannelList> c = channels.reader();
477 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
479 RingBufferNPT<CaptureTransition>::rw_vector transvec;
480 (*chan)->capture_transition_buf->get_write_vector(&transvec);
482 if (transvec.len[0] > 0) {
483 transvec.buf[0]->type = CaptureStart;
484 transvec.buf[0]->capture_val = capture_start_frame;
485 (*chan)->capture_transition_buf->increment_write_ptr(1);
489 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
495 } else if (!record_enabled() || !can_record) {
499 last_recordable_frame = transport_frame + _capture_offset;
501 if (_alignment_style == ExistingMaterial) {
502 last_recordable_frame += _session.worst_output_latency();
504 last_recordable_frame += _roll_delay;
507 first_recordable_frame = max_frames;
510 last_possibly_recording = possibly_recording;
514 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can_record, bool rec_monitors_input)
517 boost::shared_ptr<ChannelList> c = channels.reader();
518 ChannelList::iterator chan;
520 nframes_t rec_offset = 0;
521 nframes_t rec_nframes = 0;
522 bool nominally_recording;
523 bool re = record_enabled ();
524 bool collect_playback = false;
526 /* if we've already processed the frames corresponding to this call,
527 just return. this allows multiple routes that are taking input
528 from this diskstream to call our ::process() method, but have
529 this stuff only happen once. more commonly, it allows both
530 the AudioTrack that is using this AudioDiskstream *and* the Session
531 to call process() without problems.
538 commit_should_unlock = false;
540 if (!_io || !_io->active()) {
545 check_record_status (transport_frame, nframes, can_record);
547 nominally_recording = (can_record && re);
554 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
555 must always be called as a pair. The only exception is if this function
556 returns a non-zero value, in which case, ::commit should not be called.
559 // If we can't take the state lock return.
560 if (!state_lock.trylock()) {
563 commit_should_unlock = true;
564 adjust_capture_position = 0;
566 for (chan = c->begin(); chan != c->end(); ++chan) {
567 (*chan)->current_capture_buffer = 0;
568 (*chan)->current_playback_buffer = 0;
571 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
574 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
575 if (last_recordable_frame < first_recordable_frame) {
576 last_recordable_frame = max_frames;
580 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
587 case OverlapInternal:
588 /* ---------- recrange
591 rec_nframes = nframes;
596 /* |--------| recrange
599 rec_nframes = transport_frame + nframes - first_recordable_frame;
601 rec_offset = first_recordable_frame - transport_frame;
606 /* |--------| recrange
609 rec_nframes = last_recordable_frame - transport_frame;
613 case OverlapExternal:
614 /* |--------| recrange
615 -------------- transrange
617 rec_nframes = last_recordable_frame - first_recordable_frame;
618 rec_offset = first_recordable_frame - transport_frame;
622 if (rec_nframes && !was_recording) {
623 capture_captured = 0;
624 was_recording = true;
629 if (can_record && !_last_capture_regions.empty()) {
630 _last_capture_regions.clear ();
633 if (nominally_recording || rec_nframes) {
635 uint32_t limit = _io->n_inputs ();
637 /* one or more ports could already have been removed from _io, but our
638 channel setup hasn't yet been updated. prevent us from trying to
639 use channels that correspond to missing ports. note that the
640 process callback (from which this is called) is always atomic
641 with respect to port removal/addition.
644 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
646 ChannelInfo* chaninfo (*chan);
648 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
650 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
652 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
654 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
658 memcpy (chaninfo->current_capture_buffer, _io->get_input_buffer (n, rec_nframes) + rec_offset, sizeof (Sample) * rec_nframes);
662 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
664 if (rec_nframes > total) {
669 Sample* buf = _io->get_input_buffer (n, nframes);
670 nframes_t first = chaninfo->capture_vector.len[0];
672 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
673 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
674 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
675 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
677 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
684 finish_capture (rec_monitors_input, c);
691 /* data will be written to disk */
693 if (rec_nframes == nframes && rec_offset == 0) {
695 for (chan = c->begin(); chan != c->end(); ++chan) {
696 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
699 playback_distance = nframes;
704 /* we can't use the capture buffer as the playback buffer, because
705 we recorded only a part of the current process' cycle data
709 collect_playback = true;
712 adjust_capture_position = rec_nframes;
714 } else if (nominally_recording) {
716 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
718 for (chan = c->begin(); chan != c->end(); ++chan) {
719 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
722 playback_distance = nframes;
726 collect_playback = true;
729 if (collect_playback) {
731 /* we're doing playback */
733 nframes_t necessary_samples;
735 /* no varispeed playback if we're recording, because the output .... TBD */
737 if (rec_nframes == 0 && _actual_speed != 1.0f) {
738 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
740 necessary_samples = nframes;
743 for (chan = c->begin(); chan != c->end(); ++chan) {
744 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
749 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
751 ChannelInfo* chaninfo (*chan);
753 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
755 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
758 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
760 if (necessary_samples > total) {
761 cerr << "underrun for " << _name << endl;
767 memcpy ((char *) chaninfo->playback_wrap_buffer, chaninfo->playback_vector.buf[0],
768 chaninfo->playback_vector.len[0] * sizeof (Sample));
769 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0], chaninfo->playback_vector.buf[1],
770 (necessary_samples - chaninfo->playback_vector.len[0]) * sizeof (Sample));
772 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
777 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
779 uint64_t phase = last_phase;
783 // Linearly interpolate into the alt buffer
784 // using 40.24 fixp maths (swh)
786 if (phi != target_phi) {
787 phi_delta = ((int64_t)(target_phi - phi)) / nframes;
792 for (chan = c->begin(); chan != c->end(); ++chan) {
795 ChannelInfo* chaninfo (*chan);
800 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
802 fr = (phase & 0xFFFFFF) / 16777216.0f;
803 chaninfo->speed_buffer[outsample] =
804 chaninfo->current_playback_buffer[i] * (1.0f - fr) +
805 chaninfo->current_playback_buffer[i+1] * fr;
806 phase += phi + phi_delta;
809 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
812 playback_distance = i; // + 1;
813 last_phase = (phase & 0xFFFFFF);
816 playback_distance = nframes;
829 /* we're exiting with failure, so ::commit will not
830 be called. unlock the state lock.
833 commit_should_unlock = false;
841 AudioDiskstream::commit (nframes_t nframes)
843 bool need_butler = false;
845 if (!_io || !_io->active()) {
849 if (_actual_speed < 0.0) {
850 playback_sample -= playback_distance;
852 playback_sample += playback_distance;
855 boost::shared_ptr<ChannelList> c = channels.reader();
856 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
858 (*chan)->playback_buf->increment_read_ptr (playback_distance);
860 if (adjust_capture_position) {
861 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
865 if (adjust_capture_position != 0) {
866 capture_captured += adjust_capture_position;
867 adjust_capture_position = 0;
871 if (_io && _io->active()) {
872 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
877 if (_io && _io->active()) {
878 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
879 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
881 need_butler = c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
885 if (commit_should_unlock) {
895 AudioDiskstream::set_pending_overwrite (bool yn)
897 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
899 pending_overwrite = yn;
901 overwrite_frame = playback_sample;
902 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
906 AudioDiskstream::overwrite_existing_buffers ()
908 boost::shared_ptr<ChannelList> c = channels.reader();
909 Sample* mixdown_buffer;
912 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
914 overwrite_queued = false;
916 /* assume all are the same size */
917 nframes_t size = c->front()->playback_buf->bufsize();
919 mixdown_buffer = new Sample[size];
920 gain_buffer = new float[size];
922 /* reduce size so that we can fill the buffer correctly. */
928 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
930 start = overwrite_frame;
931 nframes_t cnt = size;
933 /* to fill the buffer without resetting the playback sample, we need to
934 do it one or two chunks (normally two).
936 |----------------------------------------------------------------------|
940 |<- second chunk->||<----------------- first chunk ------------------>|
944 nframes_t to_read = size - overwrite_offset;
946 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
947 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
948 _id, size, playback_sample) << endmsg;
956 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
957 start, cnt, *chan, n, reversed)) {
958 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
959 _id, size, playback_sample) << endmsg;
968 pending_overwrite = false;
969 delete [] gain_buffer;
970 delete [] mixdown_buffer;
975 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
979 ChannelList::iterator chan;
980 boost::shared_ptr<ChannelList> c = channels.reader();
982 Glib::Mutex::Lock lm (state_lock);
984 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
985 (*chan)->playback_buf->reset ();
986 (*chan)->capture_buf->reset ();
989 /* can't rec-enable in destructive mode if transport is before start */
991 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
992 disengage_record_enable ();
995 playback_sample = frame;
998 if (complete_refill) {
999 while ((ret = do_refill_with_alloc ()) > 0) ;
1001 ret = do_refill_with_alloc ();
1008 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
1010 ChannelList::iterator chan;
1011 boost::shared_ptr<ChannelList> c = channels.reader();
1013 for (chan = c->begin(); chan != c->end(); ++chan) {
1014 if ((*chan)->playback_buf->read_space() < distance) {
1022 AudioDiskstream::internal_playback_seek (nframes_t distance)
1024 ChannelList::iterator chan;
1025 boost::shared_ptr<ChannelList> c = channels.reader();
1027 for (chan = c->begin(); chan != c->end(); ++chan) {
1028 (*chan)->playback_buf->increment_read_ptr (distance);
1031 first_recordable_frame += distance;
1032 playback_sample += distance;
1038 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1039 ChannelInfo* channel_info, int channel, bool reversed)
1041 nframes_t this_read = 0;
1042 bool reloop = false;
1043 nframes_t loop_end = 0;
1044 nframes_t loop_start = 0;
1045 nframes_t loop_length = 0;
1046 nframes_t offset = 0;
1047 nframes_t xfade_samples = 0;
1048 Sample xfade_buf[128];
1051 /* XXX we don't currently play loops in reverse. not sure why */
1055 /* Make the use of a Location atomic for this read operation.
1057 Note: Locations don't get deleted, so all we care about
1058 when I say "atomic" is that we are always pointing to
1059 the same one and using a start/length values obtained
1063 if ((loc = loop_location) != 0) {
1064 loop_start = loc->start();
1065 loop_end = loc->end();
1066 loop_length = loop_end - loop_start;
1069 /* if we are looping, ensure that the first frame we read is at the correct
1070 position within the loop.
1073 if (loc && start >= loop_end) {
1074 //cerr << "start adjusted from " << start;
1075 start = loop_start + ((start - loop_start) % loop_length);
1076 //cerr << "to " << start << endl;
1079 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1088 /* take any loop into account. we can't read past the end of the loop. */
1090 if (loc && (loop_end - start < cnt)) {
1091 this_read = loop_end - start;
1092 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1099 if (this_read == 0) {
1103 this_read = min(cnt,this_read);
1105 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1106 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1111 // xfade loop boundary if appropriate
1113 if (xfade_samples > 0) {
1114 // just do a linear xfade for this short bit
1116 xfade_samples = min(xfade_samples, this_read);
1118 float delta = 1.0f / xfade_samples;
1120 Sample * tmpbuf = buf+offset;
1122 for (size_t i=0; i < xfade_samples; ++i) {
1123 *tmpbuf = (*tmpbuf * scale) + xfade_buf[i]*(1.0f - scale);
1131 _read_data_count = _playlist->read_data_count();
1135 swap_by_ptr (buf, buf + this_read - 1);
1140 /* if we read to the end of the loop, go back to the beginning */
1143 // read crossfade samples to apply to the next read
1145 xfade_samples = min((nframes_t) 128, cnt-this_read);
1147 if (audio_playlist()->read (xfade_buf, mixdown_buffer, gain_buffer, start, xfade_samples, channel) != xfade_samples) {
1148 error << string_compose(_("AudioDiskstream %1: cannot read xfade samples %2 from playlist at frame %3"),
1149 _id, xfade_samples,start) << endmsg;
1150 memset(xfade_buf, 0, xfade_samples * sizeof(Sample)); // just in case
1158 offset += this_read;
1165 AudioDiskstream::do_refill_with_alloc ()
1167 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1168 float* gain_buf = new float[disk_io_chunk_frames];
1170 int ret = _do_refill(mix_buf, gain_buf);
1179 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1183 RingBufferNPT<Sample>::rw_vector vector;
1184 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1185 nframes_t total_space;
1186 nframes_t zero_fill;
1188 ChannelList::iterator i;
1189 boost::shared_ptr<ChannelList> c = channels.reader();
1196 assert(mixdown_buffer);
1197 assert(gain_buffer);
1204 c->front()->playback_buf->get_write_vector (&vector);
1206 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1210 /* if there are 2+ chunks of disk i/o possible for
1211 this track, let the caller know so that it can arrange
1212 for us to be called again, ASAP.
1215 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1219 /* if we're running close to normal speed and there isn't enough
1220 space to do disk_io_chunk_frames of I/O, then don't bother.
1222 at higher speeds, just do it because the sync between butler
1223 and audio thread may not be good enough.
1226 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1230 /* when slaved, don't try to get too close to the read pointer. this
1231 leaves space for the buffer reversal to have something useful to
1235 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1239 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1241 total_space = min (disk_io_chunk_frames, total_space);
1245 if (file_frame == 0) {
1247 /* at start: nothing to do but fill with silence */
1249 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1251 ChannelInfo* chan (*i);
1252 chan->playback_buf->get_write_vector (&vector);
1253 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1254 if (vector.len[1]) {
1255 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1257 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1262 if (file_frame < total_space) {
1264 /* too close to the start: read what we can,
1265 and then zero fill the rest
1268 zero_fill = total_space - file_frame;
1269 total_space = file_frame;
1279 if (file_frame == max_frames) {
1281 /* at end: nothing to do but fill with silence */
1283 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1285 ChannelInfo* chan (*i);
1286 chan->playback_buf->get_write_vector (&vector);
1287 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1288 if (vector.len[1]) {
1289 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1291 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1296 if (file_frame > max_frames - total_space) {
1298 /* to close to the end: read what we can, and zero fill the rest */
1300 zero_fill = total_space - (max_frames - file_frame);
1301 total_space = max_frames - file_frame;
1308 nframes_t file_frame_tmp = 0;
1310 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1312 ChannelInfo* chan (*i);
1315 nframes_t len1, len2;
1317 chan->playback_buf->get_write_vector (&vector);
1319 if (vector.len[0] > disk_io_chunk_frames) {
1321 /* we're not going to fill the first chunk, so certainly do not bother with the
1322 other part. it won't be connected with the part we do fill, as in:
1324 .... => writable space
1325 ++++ => readable space
1326 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1328 |......|+++++++++++++|...............................|
1333 So, just pretend that the buf1 part isn't there.
1343 file_frame_tmp = file_frame;
1345 buf1 = vector.buf[0];
1346 len1 = vector.len[0];
1347 buf2 = vector.buf[1];
1348 len2 = vector.len[1];
1350 to_read = min (ts, len1);
1351 to_read = min (to_read, disk_io_chunk_frames);
1355 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1360 chan->playback_buf->increment_write_ptr (to_read);
1364 to_read = min (ts, len2);
1368 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1369 so read some or all of vector.len[1] as well.
1372 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1377 chan->playback_buf->increment_write_ptr (to_read);
1386 file_frame = file_frame_tmp;
1393 /** Flush pending data to disk.
1395 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1396 * of data to disk. it will never write more than that. If it writes that
1397 * much and there is more than that waiting to be written, it will return 1,
1398 * otherwise 0 on success or -1 on failure.
1400 * If there is less than disk_io_chunk_frames to be written, no data will be
1401 * written at all unless @a force_flush is true.
1404 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1408 RingBufferNPT<Sample>::rw_vector vector;
1409 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1412 _write_data_count = 0;
1414 transvec.buf[0] = 0;
1415 transvec.buf[1] = 0;
1419 boost::shared_ptr<ChannelList> c = channels.reader();
1421 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++nn) {
1423 (*chan)->capture_buf->get_read_vector (&vector);
1425 total = vector.len[0] + vector.len[1];
1427 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1431 /* if there are 2+ chunks of disk i/o possible for
1432 this track, let the caller know so that it can arrange
1433 for us to be called again, ASAP.
1435 if we are forcing a flush, then if there is* any* extra
1436 work, let the caller know.
1438 if we are no longer recording and there is any extra work,
1439 let the caller know too.
1442 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1446 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1448 // check the transition buffer when recording destructive
1449 // important that we get this after the capture buf
1451 if (destructive()) {
1452 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1453 size_t transcount = transvec.len[0] + transvec.len[1];
1454 bool have_start = false;
1457 for (ti=0; ti < transcount; ++ti) {
1458 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1460 if (captrans.type == CaptureStart) {
1461 // by definition, the first data we got above represents the given capture pos
1463 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1464 (*chan)->curr_capture_cnt = 0;
1468 else if (captrans.type == CaptureEnd) {
1470 // capture end, the capture_val represents total frames in capture
1472 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1474 // shorten to make the write a perfect fit
1475 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1477 if (nto_write < to_write) {
1478 ret = 1; // should we?
1480 to_write = nto_write;
1482 (*chan)->write_source->mark_capture_end ();
1484 // increment past this transition, but go no further
1489 // actually ends just beyond this chunk, so force more work
1497 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1501 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1502 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1506 (*chan)->capture_buf->increment_read_ptr (to_write);
1507 (*chan)->curr_capture_cnt += to_write;
1509 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1511 /* we wrote all of vector.len[0] but it wasn't an entire
1512 disk_io_chunk_frames of data, so arrange for some part
1513 of vector.len[1] to be flushed to disk as well.
1516 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1518 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1519 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1523 _write_data_count += (*chan)->write_source->write_data_count();
1525 (*chan)->capture_buf->increment_read_ptr (to_write);
1526 (*chan)->curr_capture_cnt += to_write;
1535 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1537 uint32_t buffer_position;
1538 bool more_work = true;
1540 boost::shared_ptr<AudioRegion> region;
1541 nframes_t total_capture;
1543 SourceList::iterator src;
1544 ChannelList::iterator chan;
1545 vector<CaptureInfo*>::iterator ci;
1546 boost::shared_ptr<ChannelList> c = channels.reader();
1548 bool mark_write_completed = false;
1550 finish_capture (true, c);
1552 /* butler is already stopped, but there may be work to do
1553 to flush remaining data to disk.
1556 while (more_work && !err) {
1557 switch (do_flush (Session::TransportContext, true)) {
1564 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1569 /* XXX is there anything we can do if err != 0 ? */
1570 Glib::Mutex::Lock lm (capture_info_lock);
1572 if (capture_info.empty()) {
1576 if (abort_capture) {
1578 if (destructive()) {
1582 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1584 if ((*chan)->write_source) {
1586 (*chan)->write_source->mark_for_remove ();
1587 (*chan)->write_source->drop_references ();
1588 (*chan)->write_source.reset ();
1591 /* new source set up in "out" below */
1597 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1598 total_capture += (*ci)->frames;
1601 /* figure out the name for this take */
1603 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1605 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1609 s->update_header (capture_info.front()->start, when, twhen);
1610 s->set_captured_for (_name);
1611 s->mark_immutable ();
1612 if (Config->get_auto_analyse_audio()) {
1613 Analyser::queue_source_for_analysis (s, true);
1618 /* destructive tracks have a single, never changing region */
1620 if (destructive()) {
1622 /* send a signal that any UI can pick up to do the right thing. there is
1623 a small problem here in that a UI may need the peak data to be ready
1624 for the data that was recorded and this isn't interlocked with that
1625 process. this problem is deferred to the UI.
1628 _playlist->Modified();
1632 string whole_file_region_name;
1633 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1635 /* Register a new region with the Session that
1636 describes the entire source. Do this first
1637 so that any sub-regions will obviously be
1638 children of this one (later!)
1642 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, c->front()->write_source->last_capture_start_frame(), total_capture,
1643 whole_file_region_name,
1644 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1646 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1647 region->special_set_position (capture_info.front()->start);
1651 catch (failed_constructor& err) {
1652 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1656 _last_capture_regions.push_back (region);
1658 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1660 XMLNode &before = _playlist->get_state();
1661 _playlist->freeze ();
1663 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1667 _session.region_name (region_name, whole_file_region_name, false);
1669 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1672 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1673 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1676 catch (failed_constructor& err) {
1677 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1678 continue; /* XXX is this OK? */
1681 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1683 _last_capture_regions.push_back (region);
1685 i_am_the_modifier++;
1686 _playlist->add_region (region, (*ci)->start);
1687 i_am_the_modifier--;
1689 buffer_position += (*ci)->frames;
1693 XMLNode &after = _playlist->get_state();
1694 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1697 mark_write_completed = true;
1700 reset_write_sources (mark_write_completed);
1704 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1708 capture_info.clear ();
1709 capture_start_frame = 0;
1713 AudioDiskstream::transport_looped (nframes_t transport_frame)
1715 if (was_recording) {
1716 // all we need to do is finish this capture, with modified capture length
1717 boost::shared_ptr<ChannelList> c = channels.reader();
1719 // adjust the capture length knowing that the data will be recorded to disk
1720 // only necessary after the first loop where we're recording
1721 if (capture_info.size() == 0) {
1722 capture_captured += _capture_offset;
1724 if (_alignment_style == ExistingMaterial) {
1725 capture_captured += _session.worst_output_latency();
1727 capture_captured += _roll_delay;
1731 finish_capture (true, c);
1733 // the next region will start recording via the normal mechanism
1734 // we'll set the start position to the current transport pos
1735 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1736 capture_start_frame = transport_frame;
1737 first_recordable_frame = transport_frame; // mild lie
1738 last_recordable_frame = max_frames;
1739 was_recording = true;
1741 if (recordable() && destructive()) {
1742 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1744 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1745 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1747 if (transvec.len[0] > 0) {
1748 transvec.buf[0]->type = CaptureStart;
1749 transvec.buf[0]->capture_val = capture_start_frame;
1750 (*chan)->capture_transition_buf->increment_write_ptr(1);
1754 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1764 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1766 was_recording = false;
1768 if (capture_captured == 0) {
1772 if (recordable() && destructive()) {
1773 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1775 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1776 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1778 if (transvec.len[0] > 0) {
1779 transvec.buf[0]->type = CaptureEnd;
1780 transvec.buf[0]->capture_val = capture_captured;
1781 (*chan)->capture_transition_buf->increment_write_ptr(1);
1785 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1791 CaptureInfo* ci = new CaptureInfo;
1793 ci->start = capture_start_frame;
1794 ci->frames = capture_captured;
1796 /* XXX theoretical race condition here. Need atomic exchange ?
1797 However, the circumstances when this is called right
1798 now (either on record-disable or transport_stopped)
1799 mean that no actual race exists. I think ...
1800 We now have a capture_info_lock, but it is only to be used
1801 to synchronize in the transport_stop and the capture info
1802 accessors, so that invalidation will not occur (both non-realtime).
1805 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1807 capture_info.push_back (ci);
1808 capture_captured = 0;
1812 AudioDiskstream::set_record_enabled (bool yn)
1814 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs() == 0) {
1818 /* can't rec-enable in destructive mode if transport is before start */
1820 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1824 if (yn && channels.reader()->front()->source == 0) {
1826 /* pick up connections not initiated *from* the IO object
1827 we're associated with.
1830 get_input_sources ();
1833 /* yes, i know that this not proof against race conditions, but its
1834 good enough. i think.
1837 if (record_enabled() != yn) {
1839 engage_record_enable ();
1841 disengage_record_enable ();
1847 AudioDiskstream::engage_record_enable ()
1849 bool rolling = _session.transport_speed() != 0.0f;
1850 boost::shared_ptr<ChannelList> c = channels.reader();
1852 g_atomic_int_set (&_record_enabled, 1);
1853 capturing_sources.clear ();
1855 if (Config->get_monitoring_model() == HardwareMonitoring) {
1857 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1858 if ((*chan)->source) {
1859 (*chan)->source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1861 capturing_sources.push_back ((*chan)->write_source);
1865 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1866 capturing_sources.push_back ((*chan)->write_source);
1870 RecordEnableChanged (); /* EMIT SIGNAL */
1874 AudioDiskstream::disengage_record_enable ()
1876 g_atomic_int_set (&_record_enabled, 0);
1877 boost::shared_ptr<ChannelList> c = channels.reader();
1878 if (Config->get_monitoring_model() == HardwareMonitoring) {
1879 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1880 if ((*chan)->source) {
1881 (*chan)->source->ensure_monitor_input (false);
1885 capturing_sources.clear ();
1886 RecordEnableChanged (); /* EMIT SIGNAL */
1890 AudioDiskstream::get_state ()
1892 XMLNode* node = new XMLNode ("AudioDiskstream");
1894 LocaleGuard lg (X_("POSIX"));
1895 boost::shared_ptr<ChannelList> c = channels.reader();
1897 node->add_property ("flags", enum_2_string (_flags));
1899 snprintf (buf, sizeof(buf), "%zd", c->size());
1900 node->add_property ("channels", buf);
1902 node->add_property ("playlist", _playlist->name());
1904 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1905 node->add_property ("speed", buf);
1907 node->add_property("name", _name);
1908 id().print (buf, sizeof (buf));
1909 node->add_property("id", buf);
1911 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1913 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1914 XMLNode* cs_grandchild;
1916 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1917 cs_grandchild = new XMLNode (X_("file"));
1918 cs_grandchild->add_property (X_("path"), (*i)->path());
1919 cs_child->add_child_nocopy (*cs_grandchild);
1922 /* store the location where capture will start */
1926 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1927 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1929 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1932 cs_child->add_property (X_("at"), buf);
1933 node->add_child_nocopy (*cs_child);
1937 node->add_child_copy (*_extra_xml);
1944 AudioDiskstream::set_state (const XMLNode& node)
1946 const XMLProperty* prop;
1947 XMLNodeList nlist = node.children();
1948 XMLNodeIterator niter;
1949 uint32_t nchans = 1;
1950 XMLNode* capture_pending_node = 0;
1951 LocaleGuard lg (X_("POSIX"));
1953 in_set_state = true;
1955 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1956 if ((*niter)->name() == IO::state_node_name) {
1957 deprecated_io_node = new XMLNode (**niter);
1960 if ((*niter)->name() == X_("CapturingSources")) {
1961 capture_pending_node = *niter;
1965 /* prevent write sources from being created */
1967 in_set_state = true;
1969 if ((prop = node.property ("name")) != 0) {
1970 _name = prop->value();
1973 if (deprecated_io_node) {
1974 if ((prop = deprecated_io_node->property ("id")) != 0) {
1975 _id = prop->value ();
1978 if ((prop = node.property ("id")) != 0) {
1979 _id = prop->value ();
1983 if ((prop = node.property ("flags")) != 0) {
1984 _flags = Flag (string_2_enum (prop->value(), _flags));
1987 if ((prop = node.property ("channels")) != 0) {
1988 nchans = atoi (prop->value().c_str());
1991 // create necessary extra channels
1992 // we are always constructed with one and we always need one
1994 _n_channels = channels.reader()->size();
1996 if (nchans > _n_channels) {
1998 add_channel (nchans - _n_channels);
1999 IO::MoreOutputs(_n_channels);
2001 } else if (nchans < _n_channels) {
2003 remove_channel (_n_channels - nchans);
2006 if ((prop = node.property ("playlist")) == 0) {
2011 bool had_playlist = (_playlist != 0);
2013 if (find_and_use_playlist (prop->value())) {
2017 if (!had_playlist) {
2018 _playlist->set_orig_diskstream_id (_id);
2021 if (!destructive() && capture_pending_node) {
2022 /* destructive streams have one and only one source per channel,
2023 and so they never end up in pending capture in any useful
2026 use_pending_capture_data (*capture_pending_node);
2031 if ((prop = node.property ("speed")) != 0) {
2032 double sp = atof (prop->value().c_str());
2034 if (realtime_set_speed (sp, false)) {
2035 non_realtime_set_speed ();
2039 in_set_state = false;
2041 /* make sure this is clear before we do anything else */
2043 capturing_sources.clear ();
2045 /* write sources are handled when we handle the input set
2046 up of the IO that owns this DS (::non_realtime_input_change())
2053 AudioDiskstream::use_new_write_source (uint32_t n)
2055 boost::shared_ptr<ChannelList> c = channels.reader();
2057 if (!recordable()) {
2061 if (n >= c->size()) {
2062 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
2066 ChannelInfo* chan = (*c)[n];
2068 if (chan->write_source) {
2069 chan->write_source->done_with_peakfile_writes ();
2070 chan->write_source->set_allow_remove_if_empty (true);
2071 chan->write_source.reset ();
2075 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
2076 throw failed_constructor();
2080 catch (failed_constructor &err) {
2081 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2082 chan->write_source.reset ();
2086 /* do not remove destructive files even if they are empty */
2088 chan->write_source->set_allow_remove_if_empty (!destructive());
2094 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
2096 ChannelList::iterator chan;
2097 boost::shared_ptr<ChannelList> c = channels.reader();
2100 if (!_session.writable() || !recordable()) {
2104 capturing_sources.clear ();
2106 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2107 if (!destructive()) {
2109 if ((*chan)->write_source && mark_write_complete) {
2110 (*chan)->write_source->mark_streaming_write_completed ();
2112 use_new_write_source (n);
2114 if (record_enabled()) {
2115 capturing_sources.push_back ((*chan)->write_source);
2119 if ((*chan)->write_source == 0) {
2120 use_new_write_source (n);
2125 if (destructive()) {
2127 /* we now have all our write sources set up, so create the
2128 playlist's single region.
2131 if (_playlist->empty()) {
2132 setup_destructive_playlist ();
2138 AudioDiskstream::rename_write_sources ()
2140 ChannelList::iterator chan;
2141 boost::shared_ptr<ChannelList> c = channels.reader();
2144 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2145 if ((*chan)->write_source != 0) {
2146 (*chan)->write_source->set_name (_name, destructive());
2147 /* XXX what to do if one of them fails ? */
2155 AudioDiskstream::set_block_size (nframes_t nframes)
2157 if (_session.get_block_size() > speed_buffer_size) {
2158 speed_buffer_size = _session.get_block_size();
2159 boost::shared_ptr<ChannelList> c = channels.reader();
2161 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2162 if ((*chan)->speed_buffer) delete [] (*chan)->speed_buffer;
2163 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2166 allocate_temporary_buffers ();
2170 AudioDiskstream::allocate_temporary_buffers ()
2172 /* make sure the wrap buffer is at least large enough to deal
2173 with the speeds up to 1.2, to allow for micro-variation
2174 when slaving to MTC, SMPTE etc.
2177 double sp = max (fabsf (_actual_speed), 1.2f);
2178 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2180 if (required_wrap_size > wrap_buffer_size) {
2182 boost::shared_ptr<ChannelList> c = channels.reader();
2184 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2185 if ((*chan)->playback_wrap_buffer) delete [] (*chan)->playback_wrap_buffer;
2186 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2187 if ((*chan)->capture_wrap_buffer) delete [] (*chan)->capture_wrap_buffer;
2188 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2191 wrap_buffer_size = required_wrap_size;
2196 AudioDiskstream::monitor_input (bool yn)
2198 boost::shared_ptr<ChannelList> c = channels.reader();
2200 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2202 if ((*chan)->source) {
2203 (*chan)->source->ensure_monitor_input (yn);
2209 AudioDiskstream::set_align_style_from_io ()
2211 bool have_physical = false;
2217 get_input_sources ();
2219 boost::shared_ptr<ChannelList> c = channels.reader();
2221 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2222 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2223 have_physical = true;
2228 if (have_physical) {
2229 set_align_style (ExistingMaterial);
2231 set_align_style (CaptureTime);
2236 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2238 while (how_many--) {
2239 c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2242 _n_channels = c->size();
2248 AudioDiskstream::add_channel (uint32_t how_many)
2250 RCUWriter<ChannelList> writer (channels);
2251 boost::shared_ptr<ChannelList> c = writer.get_copy();
2253 return add_channel_to (c, how_many);
2257 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2259 while (how_many-- && !c->empty()) {
2264 _n_channels = c->size();
2270 AudioDiskstream::remove_channel (uint32_t how_many)
2272 RCUWriter<ChannelList> writer (channels);
2273 boost::shared_ptr<ChannelList> c = writer.get_copy();
2275 return remove_channel_from (c, how_many);
2279 AudioDiskstream::playback_buffer_load () const
2281 boost::shared_ptr<ChannelList> c = channels.reader();
2283 return (float) ((double) c->front()->playback_buf->read_space()/
2284 (double) c->front()->playback_buf->bufsize());
2288 AudioDiskstream::capture_buffer_load () const
2290 boost::shared_ptr<ChannelList> c = channels.reader();
2292 return (float) ((double) c->front()->capture_buf->write_space()/
2293 (double) c->front()->capture_buf->bufsize());
2297 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2299 const XMLProperty* prop;
2300 XMLNodeList nlist = node.children();
2301 XMLNodeIterator niter;
2302 boost::shared_ptr<AudioFileSource> fs;
2303 boost::shared_ptr<AudioFileSource> first_fs;
2304 SourceList pending_sources;
2307 if ((prop = node.property (X_("at"))) == 0) {
2311 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2315 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2316 if ((*niter)->name() == X_("file")) {
2318 if ((prop = (*niter)->property (X_("path"))) == 0) {
2322 // This protects sessions from errant CapturingSources in stored sessions
2324 if (stat (prop->value().c_str(), &sbuf)) {
2329 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (_session, prop->value(), false, _session.frame_rate()));
2332 catch (failed_constructor& err) {
2333 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2334 _name, prop->value())
2339 pending_sources.push_back (fs);
2341 if (first_fs == 0) {
2345 fs->set_captured_for (_name);
2349 if (pending_sources.size() == 0) {
2350 /* nothing can be done */
2354 if (pending_sources.size() != _n_channels) {
2355 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2360 boost::shared_ptr<AudioRegion> region;
2363 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2364 region_name_from_path (first_fs->name(), true),
2365 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2366 region->special_set_position (0);
2369 catch (failed_constructor& err) {
2370 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2378 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2381 catch (failed_constructor& err) {
2382 error << string_compose (_("%1: cannot create region from pending capture sources"),
2389 _playlist->add_region (region, position);
2395 AudioDiskstream::set_destructive (bool yn)
2397 bool bounce_ignored;
2399 if (yn != destructive()) {
2402 /* requestor should already have checked this and
2403 bounced if necessary and desired
2405 if (!can_become_destructive (bounce_ignored)) {
2408 _flags = Flag (_flags | Destructive);
2409 use_destructive_playlist ();
2411 _flags = Flag (_flags & ~Destructive);
2412 reset_write_sources (true, true);
2420 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2423 requires_bounce = false;
2427 /* is there only one region ? */
2429 if (_playlist->n_regions() != 1) {
2430 requires_bounce = true;
2434 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2437 /* do the source(s) for the region cover the session start position ? */
2439 if (first->position() != _session.current_start_frame()) {
2440 if (first->start() > _session.current_start_frame()) {
2441 requires_bounce = true;
2446 /* is the source used by only 1 playlist ? */
2448 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2452 if (afirst->source()->used() > 1) {
2453 requires_bounce = true;
2457 requires_bounce = false;
2461 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2465 current_capture_buffer = 0;
2466 current_playback_buffer = 0;
2467 curr_capture_cnt = 0;
2469 speed_buffer = new Sample[speed_size];
2470 playback_wrap_buffer = new Sample[wrap_size];
2471 capture_wrap_buffer = new Sample[wrap_size];
2473 playback_buf = new RingBufferNPT<Sample> (bufsize);
2474 capture_buf = new RingBufferNPT<Sample> (bufsize);
2475 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2477 /* touch the ringbuffer buffers, which will cause
2478 them to be mapped into locked physical RAM if
2479 we're running with mlockall(). this doesn't do
2483 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2484 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2485 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2488 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2491 write_source.reset ();
2495 delete [] speed_buffer;
2499 if (playback_wrap_buffer) {
2500 delete [] playback_wrap_buffer;
2501 playback_wrap_buffer = 0;
2504 if (capture_wrap_buffer) {
2505 delete [] capture_wrap_buffer;
2506 capture_wrap_buffer = 0;
2510 delete playback_buf;
2519 if (capture_transition_buf) {
2520 delete capture_transition_buf;
2521 capture_transition_buf = 0;