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/audio_diskstream.h>
44 #include <ardour/utils.h>
45 #include <ardour/configuration.h>
46 #include <ardour/audiofilesource.h>
47 #include <ardour/send.h>
48 #include <ardour/region_factory.h>
49 #include <ardour/audioplaylist.h>
50 #include <ardour/playlist_factory.h>
51 #include <ardour/cycle_timer.h>
52 #include <ardour/audioregion.h>
53 #include <ardour/source_factory.h>
59 using namespace ARDOUR;
62 size_t AudioDiskstream::_working_buffers_size = 0;
63 Sample* AudioDiskstream::_mixdown_buffer = 0;
64 gain_t* AudioDiskstream::_gain_buffer = 0;
66 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
67 : Diskstream(sess, name, flag)
68 , deprecated_io_node(NULL)
69 , channels (new ChannelList)
71 /* prevent any write sources from being created */
81 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
82 : Diskstream(sess, node)
83 , deprecated_io_node(NULL)
84 , channels (new ChannelList)
89 if (set_state (node)) {
91 throw failed_constructor();
97 use_destructive_playlist ();
102 AudioDiskstream::init (Diskstream::Flag f)
106 /* there are no channels at this point, so these
107 two calls just get speed_buffer_size and wrap_buffer
108 size setup without duplicating their code.
111 set_block_size (_session.get_block_size());
112 allocate_temporary_buffers ();
115 assert(_n_channels == 1);
118 AudioDiskstream::~AudioDiskstream ()
123 RCUWriter<ChannelList> writer (channels);
124 boost::shared_ptr<ChannelList> c = writer.get_copy();
126 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
137 AudioDiskstream::allocate_working_buffers()
139 assert(disk_io_frames() > 0);
141 _working_buffers_size = disk_io_frames();
142 _mixdown_buffer = new Sample[_working_buffers_size];
143 _gain_buffer = new gain_t[_working_buffers_size];
147 AudioDiskstream::free_working_buffers()
149 delete [] _mixdown_buffer;
150 delete [] _gain_buffer;
151 _working_buffers_size = 0;
157 AudioDiskstream::non_realtime_input_change ()
160 Glib::Mutex::Lock lm (state_lock);
162 if (input_change_pending == NoChange) {
167 RCUWriter<ChannelList> writer (channels);
168 boost::shared_ptr<ChannelList> c = writer.get_copy();
170 _n_channels = c->size();
172 if (_io->n_inputs() > _n_channels) {
173 add_channel_to (c, _io->n_inputs() - _n_channels);
174 } else if (_io->n_inputs() < _n_channels) {
175 remove_channel_from (c, _n_channels - _io->n_inputs());
179 get_input_sources ();
180 set_capture_offset ();
182 if (first_input_change) {
183 set_align_style (_persistent_alignment_style);
184 first_input_change = false;
186 set_align_style_from_io ();
189 input_change_pending = NoChange;
191 /* implicit unlock */
194 /* reset capture files */
196 reset_write_sources (false);
198 /* now refill channel buffers */
200 if (speed() != 1.0f || speed() != -1.0f) {
201 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
203 seek (_session.transport_frame());
208 AudioDiskstream::get_input_sources ()
210 boost::shared_ptr<ChannelList> c = channels.reader();
213 ChannelList::iterator chan;
214 uint32_t ni = _io->n_inputs();
216 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
218 const char **connections = _io->input(n)->get_connections ();
220 if (connections == 0 || connections[0] == 0) {
222 if ((*chan)->source) {
223 // _source->disable_metering ();
229 (*chan)->source = _session.engine().get_port_by_name (connections[0]);
239 AudioDiskstream::find_and_use_playlist (const string& name)
241 boost::shared_ptr<AudioPlaylist> playlist;
243 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
244 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, name));
248 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
252 return use_playlist (playlist);
256 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
258 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
260 Diskstream::use_playlist(playlist);
266 AudioDiskstream::use_new_playlist ()
269 boost::shared_ptr<AudioPlaylist> playlist;
271 if (!in_set_state && destructive()) {
276 newname = Playlist::bump_name (_playlist->name(), _session);
278 newname = Playlist::bump_name (_name, _session);
281 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, newname, hidden()))) != 0) {
283 playlist->set_orig_diskstream_id (id());
284 return use_playlist (playlist);
292 AudioDiskstream::use_copy_playlist ()
294 assert(audio_playlist());
300 if (_playlist == 0) {
301 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
306 boost::shared_ptr<AudioPlaylist> playlist;
308 newname = Playlist::bump_name (_playlist->name(), _session);
310 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
311 playlist->set_orig_diskstream_id (id());
312 return use_playlist (playlist);
319 AudioDiskstream::setup_destructive_playlist ()
322 boost::shared_ptr<ChannelList> c = channels.reader();
324 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
325 srcs.push_back ((*chan)->write_source);
328 /* a single full-sized region */
330 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
331 _playlist->add_region (region, srcs.front()->natural_position());
335 AudioDiskstream::use_destructive_playlist ()
337 /* this is called from the XML-based constructor or ::set_destructive. when called,
338 we already have a playlist and a region, but we need to
339 set up our sources for write. we use the sources associated
340 with the (presumed single, full-extent) region.
343 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
346 reset_write_sources (false, true);
350 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
353 throw failed_constructor();
356 /* be sure to stretch the region out to the maximum length */
358 region->set_length (max_frames - region->position(), this);
361 ChannelList::iterator chan;
362 boost::shared_ptr<ChannelList> c = channels.reader();
364 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
365 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
366 assert((*chan)->write_source);
367 (*chan)->write_source->set_allow_remove_if_empty (false);
369 /* this might be false if we switched modes, so force it */
371 (*chan)->write_source->set_destructive (true);
374 /* the source list will never be reset for a destructive track */
378 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
380 int possibly_recording;
383 const int transport_rolling = 0x4;
384 const int track_rec_enabled = 0x2;
385 const int global_rec_enabled = 0x1;
387 /* merge together the 3 factors that affect record status, and compute
391 rolling = _session.transport_speed() != 0.0f;
392 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
393 change = possibly_recording ^ last_possibly_recording;
395 if (possibly_recording == last_possibly_recording) {
401 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
403 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
404 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
406 /* starting to record: compute first+last frames */
408 first_recordable_frame = transport_frame + _capture_offset;
409 last_recordable_frame = max_frames;
410 capture_start_frame = transport_frame;
412 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
414 /* was stopped, now rolling (and recording) */
416 if (_alignment_style == ExistingMaterial) {
417 first_recordable_frame += _session.worst_output_latency();
419 first_recordable_frame += _roll_delay;
424 /* was rolling, but record state changed */
426 if (_alignment_style == ExistingMaterial) {
428 if (!Config->get_punch_in()) {
430 /* manual punch in happens at the correct transport frame
431 because the user hit a button. but to get alignment correct
432 we have to back up the position of the new region to the
433 appropriate spot given the roll delay.
436 capture_start_frame -= _roll_delay;
438 /* XXX paul notes (august 2005): i don't know why
442 first_recordable_frame += _capture_offset;
446 /* autopunch toggles recording at the precise
447 transport frame, and then the DS waits
448 to start recording for a time that depends
449 on the output latency.
452 first_recordable_frame += _session.worst_output_latency();
457 if (Config->get_punch_in()) {
458 first_recordable_frame += _roll_delay;
460 capture_start_frame -= _roll_delay;
466 if (recordable() && destructive()) {
467 boost::shared_ptr<ChannelList> c = channels.reader();
468 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
470 RingBufferNPT<CaptureTransition>::rw_vector transvec;
471 (*chan)->capture_transition_buf->get_write_vector(&transvec);
473 if (transvec.len[0] > 0) {
474 transvec.buf[0]->type = CaptureStart;
475 transvec.buf[0]->capture_val = capture_start_frame;
476 (*chan)->capture_transition_buf->increment_write_ptr(1);
480 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
486 } else if (!record_enabled() || !can_record) {
490 last_recordable_frame = transport_frame + _capture_offset;
492 if (_alignment_style == ExistingMaterial) {
493 last_recordable_frame += _session.worst_output_latency();
495 last_recordable_frame += _roll_delay;
499 last_possibly_recording = possibly_recording;
503 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
506 boost::shared_ptr<ChannelList> c = channels.reader();
507 ChannelList::iterator chan;
509 nframes_t rec_offset = 0;
510 nframes_t rec_nframes = 0;
511 bool nominally_recording;
512 bool re = record_enabled ();
513 bool collect_playback = false;
515 /* if we've already processed the frames corresponding to this call,
516 just return. this allows multiple routes that are taking input
517 from this diskstream to call our ::process() method, but have
518 this stuff only happen once. more commonly, it allows both
519 the AudioTrack that is using this AudioDiskstream *and* the Session
520 to call process() without problems.
527 commit_should_unlock = false;
529 check_record_status (transport_frame, nframes, can_record);
531 nominally_recording = (can_record && re);
538 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
539 must always be called as a pair. The only exception is if this function
540 returns a non-zero value, in which case, ::commit should not be called.
543 // If we can't take the state lock return.
544 if (!state_lock.trylock()) {
547 commit_should_unlock = true;
548 adjust_capture_position = 0;
550 for (chan = c->begin(); chan != c->end(); ++chan) {
551 (*chan)->current_capture_buffer = 0;
552 (*chan)->current_playback_buffer = 0;
555 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
558 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
559 if (last_recordable_frame < first_recordable_frame) {
560 last_recordable_frame = max_frames;
564 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
571 case OverlapInternal:
572 /* ---------- recrange
575 rec_nframes = nframes;
580 /* |--------| recrange
583 rec_nframes = transport_frame + nframes - first_recordable_frame;
585 rec_offset = first_recordable_frame - transport_frame;
590 /* |--------| recrange
593 rec_nframes = last_recordable_frame - transport_frame;
597 case OverlapExternal:
598 /* |--------| recrange
599 -------------- transrange
601 rec_nframes = last_recordable_frame - first_recordable_frame;
602 rec_offset = first_recordable_frame - transport_frame;
606 if (rec_nframes && !was_recording) {
607 capture_captured = 0;
608 was_recording = true;
613 if (can_record && !_last_capture_regions.empty()) {
614 _last_capture_regions.clear ();
617 if (nominally_recording || rec_nframes) {
619 uint32_t limit = _io->n_inputs ();
621 /* one or more ports could already have been removed from _io, but our
622 channel setup hasn't yet been updated. prevent us from trying to
623 use channels that correspond to missing ports. note that the
624 process callback (from which this is called) is always atomic
625 with respect to port removal/addition.
628 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
630 ChannelInfo* chaninfo (*chan);
632 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
634 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
636 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
638 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
642 memcpy (chaninfo->current_capture_buffer, _io->input(n)->get_buffer (rec_nframes) + offset + rec_offset, sizeof (Sample) * rec_nframes);
646 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
648 if (rec_nframes > total) {
653 Sample* buf = _io->input (n)->get_buffer (nframes) + offset;
654 nframes_t first = chaninfo->capture_vector.len[0];
656 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
657 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
658 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
659 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
661 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
668 finish_capture (rec_monitors_input, c);
675 /* data will be written to disk */
677 if (rec_nframes == nframes && rec_offset == 0) {
679 for (chan = c->begin(); chan != c->end(); ++chan) {
680 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
683 playback_distance = nframes;
688 /* we can't use the capture buffer as the playback buffer, because
689 we recorded only a part of the current process' cycle data
693 collect_playback = true;
696 adjust_capture_position = rec_nframes;
698 } else if (nominally_recording) {
700 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
702 for (chan = c->begin(); chan != c->end(); ++chan) {
703 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
706 playback_distance = nframes;
710 collect_playback = true;
713 if (collect_playback) {
715 /* we're doing playback */
717 nframes_t necessary_samples;
719 /* no varispeed playback if we're recording, because the output .... TBD */
721 if (rec_nframes == 0 && _actual_speed != 1.0f) {
722 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
724 necessary_samples = nframes;
727 for (chan = c->begin(); chan != c->end(); ++chan) {
728 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
733 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
735 ChannelInfo* chaninfo (*chan);
737 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
739 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
742 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
744 if (necessary_samples > total) {
750 memcpy ((char *) chaninfo->playback_wrap_buffer, chaninfo->playback_vector.buf[0],
751 chaninfo->playback_vector.len[0] * sizeof (Sample));
752 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0], chaninfo->playback_vector.buf[1],
753 (necessary_samples - chaninfo->playback_vector.len[0]) * sizeof (Sample));
755 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
760 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
762 uint64_t phase = last_phase;
765 // Linearly interpolate into the alt buffer
766 // using 40.24 fixp maths (swh)
768 for (chan = c->begin(); chan != c->end(); ++chan) {
771 ChannelInfo* chaninfo (*chan);
776 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
778 fr = (phase & 0xFFFFFF) / 16777216.0f;
779 chaninfo->speed_buffer[outsample] =
780 chaninfo->current_playback_buffer[i] * (1.0f - fr) +
781 chaninfo->current_playback_buffer[i+1] * fr;
785 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
788 playback_distance = i + 1;
789 last_phase = (phase & 0xFFFFFF);
792 playback_distance = nframes;
804 /* we're exiting with failure, so ::commit will not
805 be called. unlock the state lock.
808 commit_should_unlock = false;
816 AudioDiskstream::commit (nframes_t nframes)
818 bool need_butler = false;
820 if (_actual_speed < 0.0) {
821 playback_sample -= playback_distance;
823 playback_sample += playback_distance;
826 boost::shared_ptr<ChannelList> c = channels.reader();
827 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
829 (*chan)->playback_buf->increment_read_ptr (playback_distance);
831 if (adjust_capture_position) {
832 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
836 if (adjust_capture_position != 0) {
837 capture_captured += adjust_capture_position;
838 adjust_capture_position = 0;
842 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
844 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
845 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
848 if (commit_should_unlock) {
858 AudioDiskstream::set_pending_overwrite (bool yn)
860 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
862 pending_overwrite = yn;
864 overwrite_frame = playback_sample;
865 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
869 AudioDiskstream::overwrite_existing_buffers ()
871 boost::shared_ptr<ChannelList> c = channels.reader();
872 Sample* mixdown_buffer;
875 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
877 overwrite_queued = false;
879 /* assume all are the same size */
880 nframes_t size = c->front()->playback_buf->bufsize();
882 mixdown_buffer = new Sample[size];
883 gain_buffer = new float[size];
885 /* reduce size so that we can fill the buffer correctly. */
891 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
893 start = overwrite_frame;
894 nframes_t cnt = size;
896 /* to fill the buffer without resetting the playback sample, we need to
897 do it one or two chunks (normally two).
899 |----------------------------------------------------------------------|
903 |<- second chunk->||<----------------- first chunk ------------------>|
907 nframes_t to_read = size - overwrite_offset;
909 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
910 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
911 _id, size, playback_sample) << endmsg;
919 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
920 start, cnt, *chan, n, reversed)) {
921 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
922 _id, size, playback_sample) << endmsg;
931 pending_overwrite = false;
932 delete [] gain_buffer;
933 delete [] mixdown_buffer;
938 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
942 ChannelList::iterator chan;
943 boost::shared_ptr<ChannelList> c = channels.reader();
945 Glib::Mutex::Lock lm (state_lock);
947 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
948 (*chan)->playback_buf->reset ();
949 (*chan)->capture_buf->reset ();
952 /* can't rec-enable in destructive mode if transport is before start */
954 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
955 disengage_record_enable ();
958 playback_sample = frame;
961 if (complete_refill) {
962 while ((ret = do_refill_with_alloc ()) > 0) ;
964 ret = do_refill_with_alloc ();
971 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
973 ChannelList::iterator chan;
974 boost::shared_ptr<ChannelList> c = channels.reader();
976 for (chan = c->begin(); chan != c->end(); ++chan) {
977 if ((*chan)->playback_buf->read_space() < distance) {
985 AudioDiskstream::internal_playback_seek (nframes_t distance)
987 ChannelList::iterator chan;
988 boost::shared_ptr<ChannelList> c = channels.reader();
990 for (chan = c->begin(); chan != c->end(); ++chan) {
991 (*chan)->playback_buf->increment_read_ptr (distance);
994 first_recordable_frame += distance;
995 playback_sample += distance;
1001 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1002 ChannelInfo* channel_info, int channel, bool reversed)
1004 nframes_t this_read = 0;
1005 bool reloop = false;
1006 nframes_t loop_end = 0;
1007 nframes_t loop_start = 0;
1008 nframes_t loop_length = 0;
1009 nframes_t offset = 0;
1010 nframes_t xfade_samples = 0;
1011 Sample xfade_buf[128];
1014 /* XXX we don't currently play loops in reverse. not sure why */
1018 /* Make the use of a Location atomic for this read operation.
1020 Note: Locations don't get deleted, so all we care about
1021 when I say "atomic" is that we are always pointing to
1022 the same one and using a start/length values obtained
1026 if ((loc = loop_location) != 0) {
1027 loop_start = loc->start();
1028 loop_end = loc->end();
1029 loop_length = loop_end - loop_start;
1032 /* if we are looping, ensure that the first frame we read is at the correct
1033 position within the loop.
1036 if (loc && start >= loop_end) {
1037 //cerr << "start adjusted from " << start;
1038 start = loop_start + ((start - loop_start) % loop_length);
1039 //cerr << "to " << start << endl;
1042 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1051 /* take any loop into account. we can't read past the end of the loop. */
1053 if (loc && (loop_end - start < cnt)) {
1054 this_read = loop_end - start;
1055 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1062 if (this_read == 0) {
1066 this_read = min(cnt,this_read);
1068 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1069 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1074 // xfade loop boundary if appropriate
1076 if (xfade_samples > 0) {
1077 // just do a linear xfade for this short bit
1079 xfade_samples = min(xfade_samples, this_read);
1081 float delta = 1.0f / xfade_samples;
1083 Sample * tmpbuf = buf+offset;
1085 for (size_t i=0; i < xfade_samples; ++i) {
1086 *tmpbuf = (*tmpbuf * scale) + xfade_buf[i]*(1.0f - scale);
1094 _read_data_count = _playlist->read_data_count();
1098 swap_by_ptr (buf, buf + this_read - 1);
1103 /* if we read to the end of the loop, go back to the beginning */
1106 // read crossfade samples to apply to the next read
1108 xfade_samples = min((nframes_t) 128, cnt-this_read);
1110 if (audio_playlist()->read (xfade_buf, mixdown_buffer, gain_buffer, start, xfade_samples, channel) != xfade_samples) {
1111 error << string_compose(_("AudioDiskstream %1: cannot read xfade samples %2 from playlist at frame %3"),
1112 _id, xfade_samples,start) << endmsg;
1113 memset(xfade_buf, 0, xfade_samples * sizeof(Sample)); // just in case
1121 offset += this_read;
1128 AudioDiskstream::do_refill_with_alloc ()
1130 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1131 float* gain_buf = new float[disk_io_chunk_frames];
1133 int ret = _do_refill(mix_buf, gain_buf);
1142 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1146 RingBufferNPT<Sample>::rw_vector vector;
1147 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1148 nframes_t total_space;
1149 nframes_t zero_fill;
1151 ChannelList::iterator i;
1152 boost::shared_ptr<ChannelList> c = channels.reader();
1159 assert(mixdown_buffer);
1160 assert(gain_buffer);
1167 c->front()->playback_buf->get_write_vector (&vector);
1169 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1173 /* if there are 2+ chunks of disk i/o possible for
1174 this track, let the caller know so that it can arrange
1175 for us to be called again, ASAP.
1178 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1182 /* if we're running close to normal speed and there isn't enough
1183 space to do disk_io_chunk_frames of I/O, then don't bother.
1185 at higher speeds, just do it because the sync between butler
1186 and audio thread may not be good enough.
1189 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1193 /* when slaved, don't try to get too close to the read pointer. this
1194 leaves space for the buffer reversal to have something useful to
1198 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1202 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1204 total_space = min (disk_io_chunk_frames, total_space);
1208 if (file_frame == 0) {
1210 /* at start: nothing to do but fill with silence */
1212 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1214 ChannelInfo* chan (*i);
1215 chan->playback_buf->get_write_vector (&vector);
1216 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1217 if (vector.len[1]) {
1218 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1220 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1225 if (file_frame < total_space) {
1227 /* too close to the start: read what we can,
1228 and then zero fill the rest
1231 zero_fill = total_space - file_frame;
1232 total_space = file_frame;
1242 if (file_frame == max_frames) {
1244 /* at end: nothing to do but fill with silence */
1246 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1248 ChannelInfo* chan (*i);
1249 chan->playback_buf->get_write_vector (&vector);
1250 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1251 if (vector.len[1]) {
1252 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1254 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1259 if (file_frame > max_frames - total_space) {
1261 /* to close to the end: read what we can, and zero fill the rest */
1263 zero_fill = total_space - (max_frames - file_frame);
1264 total_space = max_frames - file_frame;
1271 nframes_t file_frame_tmp = 0;
1273 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1275 ChannelInfo* chan (*i);
1278 nframes_t len1, len2;
1280 chan->playback_buf->get_write_vector (&vector);
1282 if (vector.len[0] > disk_io_chunk_frames) {
1284 /* we're not going to fill the first chunk, so certainly do not bother with the
1285 other part. it won't be connected with the part we do fill, as in:
1287 .... => writable space
1288 ++++ => readable space
1289 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1291 |......|+++++++++++++|...............................|
1296 So, just pretend that the buf1 part isn't there.
1306 file_frame_tmp = file_frame;
1308 buf1 = vector.buf[0];
1309 len1 = vector.len[0];
1310 buf2 = vector.buf[1];
1311 len2 = vector.len[1];
1313 to_read = min (ts, len1);
1314 to_read = min (to_read, disk_io_chunk_frames);
1318 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1323 chan->playback_buf->increment_write_ptr (to_read);
1327 to_read = min (ts, len2);
1331 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1332 so read some or all of vector.len[1] as well.
1335 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1340 chan->playback_buf->increment_write_ptr (to_read);
1349 file_frame = file_frame_tmp;
1356 /** Flush pending data to disk.
1358 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1359 * of data to disk. it will never write more than that. If it writes that
1360 * much and there is more than that waiting to be written, it will return 1,
1361 * otherwise 0 on success or -1 on failure.
1363 * If there is less than disk_io_chunk_frames to be written, no data will be
1364 * written at all unless @a force_flush is true.
1367 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1371 RingBufferNPT<Sample>::rw_vector vector;
1372 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1375 _write_data_count = 0;
1377 transvec.buf[0] = 0;
1378 transvec.buf[1] = 0;
1382 boost::shared_ptr<ChannelList> c = channels.reader();
1383 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1385 (*chan)->capture_buf->get_read_vector (&vector);
1387 total = vector.len[0] + vector.len[1];
1389 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1393 /* if there are 2+ chunks of disk i/o possible for
1394 this track, let the caller know so that it can arrange
1395 for us to be called again, ASAP.
1397 if we are forcing a flush, then if there is* any* extra
1398 work, let the caller know.
1400 if we are no longer recording and there is any extra work,
1401 let the caller know too.
1404 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1408 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1410 // check the transition buffer when recording destructive
1411 // important that we get this after the capture buf
1413 if (destructive()) {
1414 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1415 size_t transcount = transvec.len[0] + transvec.len[1];
1416 bool have_start = false;
1419 for (ti=0; ti < transcount; ++ti) {
1420 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1422 if (captrans.type == CaptureStart) {
1423 // by definition, the first data we got above represents the given capture pos
1425 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1426 (*chan)->curr_capture_cnt = 0;
1430 else if (captrans.type == CaptureEnd) {
1432 // capture end, the capture_val represents total frames in capture
1434 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1436 // shorten to make the write a perfect fit
1437 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1439 if (nto_write < to_write) {
1440 ret = 1; // should we?
1442 to_write = nto_write;
1444 (*chan)->write_source->mark_capture_end ();
1446 // increment past this transition, but go no further
1451 // actually ends just beyond this chunk, so force more work
1459 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1463 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1464 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1468 (*chan)->capture_buf->increment_read_ptr (to_write);
1469 (*chan)->curr_capture_cnt += to_write;
1471 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1473 /* we wrote all of vector.len[0] but it wasn't an entire
1474 disk_io_chunk_frames of data, so arrange for some part
1475 of vector.len[1] to be flushed to disk as well.
1478 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1480 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1481 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1485 _write_data_count += (*chan)->write_source->write_data_count();
1487 (*chan)->capture_buf->increment_read_ptr (to_write);
1488 (*chan)->curr_capture_cnt += to_write;
1497 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1499 uint32_t buffer_position;
1500 bool more_work = true;
1502 boost::shared_ptr<AudioRegion> region;
1503 nframes_t total_capture;
1505 SourceList::iterator src;
1506 ChannelList::iterator chan;
1507 vector<CaptureInfo*>::iterator ci;
1508 boost::shared_ptr<ChannelList> c = channels.reader();
1510 bool mark_write_completed = false;
1512 finish_capture (true, c);
1514 /* butler is already stopped, but there may be work to do
1515 to flush remaining data to disk.
1518 while (more_work && !err) {
1519 switch (do_flush (Session::TransportContext, true)) {
1526 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1531 /* XXX is there anything we can do if err != 0 ? */
1532 Glib::Mutex::Lock lm (capture_info_lock);
1534 if (capture_info.empty()) {
1538 if (abort_capture) {
1540 if (destructive()) {
1544 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1546 if ((*chan)->write_source) {
1548 (*chan)->write_source->mark_for_remove ();
1549 (*chan)->write_source->drop_references ();
1550 (*chan)->write_source.reset ();
1553 /* new source set up in "out" below */
1559 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1560 total_capture += (*ci)->frames;
1563 /* figure out the name for this take */
1565 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1567 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1571 s->update_header (capture_info.front()->start, when, twhen);
1572 s->set_captured_for (_name);
1573 s->mark_immutable ();
1577 /* destructive tracks have a single, never changing region */
1579 if (destructive()) {
1581 /* send a signal that any UI can pick up to do the right thing. there is
1582 a small problem here in that a UI may need the peak data to be ready
1583 for the data that was recorded and this isn't interlocked with that
1584 process. this problem is deferred to the UI.
1587 _playlist->Modified();
1591 string whole_file_region_name;
1592 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1594 /* Register a new region with the Session that
1595 describes the entire source. Do this first
1596 so that any sub-regions will obviously be
1597 children of this one (later!)
1601 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, c->front()->write_source->last_capture_start_frame(), total_capture,
1602 whole_file_region_name,
1603 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1605 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1606 region->special_set_position (capture_info.front()->start);
1610 catch (failed_constructor& err) {
1611 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1615 _last_capture_regions.push_back (region);
1617 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1619 XMLNode &before = _playlist->get_state();
1620 _playlist->freeze ();
1622 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1626 _session.region_name (region_name, whole_file_region_name, false);
1628 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1631 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1632 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1635 catch (failed_constructor& err) {
1636 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1637 continue; /* XXX is this OK? */
1640 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1642 _last_capture_regions.push_back (region);
1644 i_am_the_modifier++;
1645 _playlist->add_region (region, (*ci)->start);
1646 i_am_the_modifier--;
1648 buffer_position += (*ci)->frames;
1652 XMLNode &after = _playlist->get_state();
1653 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1656 mark_write_completed = true;
1659 reset_write_sources (mark_write_completed);
1663 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1667 capture_info.clear ();
1668 capture_start_frame = 0;
1672 AudioDiskstream::transport_looped (nframes_t transport_frame)
1674 if (was_recording) {
1675 // all we need to do is finish this capture, with modified capture length
1676 boost::shared_ptr<ChannelList> c = channels.reader();
1678 // adjust the capture length knowing that the data will be recorded to disk
1679 // only necessary after the first loop where we're recording
1680 if (capture_info.size() == 0) {
1681 capture_captured += _capture_offset;
1683 if (_alignment_style == ExistingMaterial) {
1684 capture_captured += _session.worst_output_latency();
1686 capture_captured += _roll_delay;
1690 finish_capture (true, c);
1692 // the next region will start recording via the normal mechanism
1693 // we'll set the start position to the current transport pos
1694 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1695 capture_start_frame = transport_frame;
1696 first_recordable_frame = transport_frame; // mild lie
1697 last_recordable_frame = max_frames;
1698 was_recording = true;
1700 if (recordable() && destructive()) {
1701 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1703 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1704 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1706 if (transvec.len[0] > 0) {
1707 transvec.buf[0]->type = CaptureStart;
1708 transvec.buf[0]->capture_val = capture_start_frame;
1709 (*chan)->capture_transition_buf->increment_write_ptr(1);
1713 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1723 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1725 was_recording = false;
1727 if (capture_captured == 0) {
1731 if (recordable() && destructive()) {
1732 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1734 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1735 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1737 if (transvec.len[0] > 0) {
1738 transvec.buf[0]->type = CaptureEnd;
1739 transvec.buf[0]->capture_val = capture_captured;
1740 (*chan)->capture_transition_buf->increment_write_ptr(1);
1744 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1750 CaptureInfo* ci = new CaptureInfo;
1752 ci->start = capture_start_frame;
1753 ci->frames = capture_captured;
1755 /* XXX theoretical race condition here. Need atomic exchange ?
1756 However, the circumstances when this is called right
1757 now (either on record-disable or transport_stopped)
1758 mean that no actual race exists. I think ...
1759 We now have a capture_info_lock, but it is only to be used
1760 to synchronize in the transport_stop and the capture info
1761 accessors, so that invalidation will not occur (both non-realtime).
1764 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1766 capture_info.push_back (ci);
1767 capture_captured = 0;
1771 AudioDiskstream::set_record_enabled (bool yn)
1773 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs() == 0) {
1777 /* can't rec-enable in destructive mode if transport is before start */
1779 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1783 if (yn && channels.reader()->front()->source == 0) {
1785 /* pick up connections not initiated *from* the IO object
1786 we're associated with.
1789 get_input_sources ();
1792 /* yes, i know that this not proof against race conditions, but its
1793 good enough. i think.
1796 if (record_enabled() != yn) {
1798 engage_record_enable ();
1800 disengage_record_enable ();
1806 AudioDiskstream::engage_record_enable ()
1808 bool rolling = _session.transport_speed() != 0.0f;
1809 boost::shared_ptr<ChannelList> c = channels.reader();
1811 g_atomic_int_set (&_record_enabled, 1);
1812 capturing_sources.clear ();
1814 if (Config->get_monitoring_model() == HardwareMonitoring) {
1816 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1817 if ((*chan)->source) {
1818 (*chan)->source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1820 capturing_sources.push_back ((*chan)->write_source);
1824 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1825 capturing_sources.push_back ((*chan)->write_source);
1829 RecordEnableChanged (); /* EMIT SIGNAL */
1833 AudioDiskstream::disengage_record_enable ()
1835 g_atomic_int_set (&_record_enabled, 0);
1836 boost::shared_ptr<ChannelList> c = channels.reader();
1837 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1838 if (Config->get_monitoring_model() == HardwareMonitoring) {
1839 if ((*chan)->source) {
1840 (*chan)->source->ensure_monitor_input (false);
1844 capturing_sources.clear ();
1845 RecordEnableChanged (); /* EMIT SIGNAL */
1849 AudioDiskstream::get_state ()
1851 XMLNode* node = new XMLNode ("AudioDiskstream");
1853 LocaleGuard lg (X_("POSIX"));
1854 boost::shared_ptr<ChannelList> c = channels.reader();
1856 node->add_property ("flags", enum_2_string (_flags));
1858 snprintf (buf, sizeof(buf), "%zd", c->size());
1859 node->add_property ("channels", buf);
1861 node->add_property ("playlist", _playlist->name());
1863 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1864 node->add_property ("speed", buf);
1866 node->add_property("name", _name);
1867 id().print (buf, sizeof (buf));
1868 node->add_property("id", buf);
1870 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1872 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1873 XMLNode* cs_grandchild;
1875 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1876 cs_grandchild = new XMLNode (X_("file"));
1877 cs_grandchild->add_property (X_("path"), (*i)->path());
1878 cs_child->add_child_nocopy (*cs_grandchild);
1881 /* store the location where capture will start */
1885 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1886 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1888 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1891 cs_child->add_property (X_("at"), buf);
1892 node->add_child_nocopy (*cs_child);
1896 node->add_child_copy (*_extra_xml);
1903 AudioDiskstream::set_state (const XMLNode& node)
1905 const XMLProperty* prop;
1906 XMLNodeList nlist = node.children();
1907 XMLNodeIterator niter;
1908 uint32_t nchans = 1;
1909 XMLNode* capture_pending_node = 0;
1910 LocaleGuard lg (X_("POSIX"));
1912 in_set_state = true;
1914 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1915 if ((*niter)->name() == IO::state_node_name) {
1916 deprecated_io_node = new XMLNode (**niter);
1919 if ((*niter)->name() == X_("CapturingSources")) {
1920 capture_pending_node = *niter;
1924 /* prevent write sources from being created */
1926 in_set_state = true;
1928 if ((prop = node.property ("name")) != 0) {
1929 _name = prop->value();
1932 if (deprecated_io_node) {
1933 if ((prop = deprecated_io_node->property ("id")) != 0) {
1934 _id = prop->value ();
1937 if ((prop = node.property ("id")) != 0) {
1938 _id = prop->value ();
1942 if ((prop = node.property ("flags")) != 0) {
1943 _flags = Flag (string_2_enum (prop->value(), _flags));
1946 if ((prop = node.property ("channels")) != 0) {
1947 nchans = atoi (prop->value().c_str());
1950 // create necessary extra channels
1951 // we are always constructed with one and we always need one
1953 _n_channels = channels.reader()->size();
1955 if (nchans > _n_channels) {
1957 add_channel (nchans - _n_channels);
1959 } else if (nchans < _n_channels) {
1961 remove_channel (_n_channels - nchans);
1964 if ((prop = node.property ("playlist")) == 0) {
1969 bool had_playlist = (_playlist != 0);
1971 if (find_and_use_playlist (prop->value())) {
1975 if (!had_playlist) {
1976 _playlist->set_orig_diskstream_id (_id);
1979 if (!destructive() && capture_pending_node) {
1980 /* destructive streams have one and only one source per channel,
1981 and so they never end up in pending capture in any useful
1984 use_pending_capture_data (*capture_pending_node);
1989 if ((prop = node.property ("speed")) != 0) {
1990 double sp = atof (prop->value().c_str());
1992 if (realtime_set_speed (sp, false)) {
1993 non_realtime_set_speed ();
1997 in_set_state = false;
1999 /* make sure this is clear before we do anything else */
2001 capturing_sources.clear ();
2003 /* write sources are handled when we handle the input set
2004 up of the IO that owns this DS (::non_realtime_input_change())
2007 in_set_state = false;
2013 AudioDiskstream::use_new_write_source (uint32_t n)
2015 boost::shared_ptr<ChannelList> c = channels.reader();
2017 if (!recordable()) {
2021 if (n >= c->size()) {
2022 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
2026 ChannelInfo* chan = (*c)[n];
2028 if (chan->write_source) {
2029 chan->write_source->done_with_peakfile_writes ();
2030 chan->write_source->set_allow_remove_if_empty (true);
2031 chan->write_source.reset ();
2035 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
2036 throw failed_constructor();
2040 catch (failed_constructor &err) {
2041 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2042 chan->write_source.reset ();
2046 /* do not remove destructive files even if they are empty */
2048 chan->write_source->set_allow_remove_if_empty (!destructive());
2054 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
2056 ChannelList::iterator chan;
2057 boost::shared_ptr<ChannelList> c = channels.reader();
2060 if (!recordable()) {
2064 capturing_sources.clear ();
2066 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2067 if (!destructive()) {
2069 if ((*chan)->write_source && mark_write_complete) {
2070 (*chan)->write_source->mark_streaming_write_completed ();
2072 use_new_write_source (n);
2074 if (record_enabled()) {
2075 capturing_sources.push_back ((*chan)->write_source);
2079 if ((*chan)->write_source == 0) {
2080 use_new_write_source (n);
2085 if (destructive()) {
2087 /* we now have all our write sources set up, so create the
2088 playlist's single region.
2091 if (_playlist->empty()) {
2092 setup_destructive_playlist ();
2098 AudioDiskstream::rename_write_sources ()
2100 ChannelList::iterator chan;
2101 boost::shared_ptr<ChannelList> c = channels.reader();
2104 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2105 if ((*chan)->write_source != 0) {
2106 (*chan)->write_source->set_name (_name, destructive());
2107 /* XXX what to do if one of them fails ? */
2115 AudioDiskstream::set_block_size (nframes_t nframes)
2117 if (_session.get_block_size() > speed_buffer_size) {
2118 speed_buffer_size = _session.get_block_size();
2119 boost::shared_ptr<ChannelList> c = channels.reader();
2121 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2122 if ((*chan)->speed_buffer) delete [] (*chan)->speed_buffer;
2123 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2126 allocate_temporary_buffers ();
2130 AudioDiskstream::allocate_temporary_buffers ()
2132 /* make sure the wrap buffer is at least large enough to deal
2133 with the speeds up to 1.2, to allow for micro-variation
2134 when slaving to MTC, SMPTE etc.
2137 double sp = max (fabsf (_actual_speed), 1.2f);
2138 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2140 if (required_wrap_size > wrap_buffer_size) {
2142 boost::shared_ptr<ChannelList> c = channels.reader();
2144 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2145 if ((*chan)->playback_wrap_buffer) delete [] (*chan)->playback_wrap_buffer;
2146 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2147 if ((*chan)->capture_wrap_buffer) delete [] (*chan)->capture_wrap_buffer;
2148 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2151 wrap_buffer_size = required_wrap_size;
2156 AudioDiskstream::monitor_input (bool yn)
2158 boost::shared_ptr<ChannelList> c = channels.reader();
2160 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2162 if ((*chan)->source) {
2163 (*chan)->source->ensure_monitor_input (yn);
2169 AudioDiskstream::set_align_style_from_io ()
2171 bool have_physical = false;
2177 get_input_sources ();
2179 boost::shared_ptr<ChannelList> c = channels.reader();
2181 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2182 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2183 have_physical = true;
2188 if (have_physical) {
2189 set_align_style (ExistingMaterial);
2191 set_align_style (CaptureTime);
2196 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2198 while (how_many--) {
2199 c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2202 _n_channels = c->size();
2208 AudioDiskstream::add_channel (uint32_t how_many)
2210 RCUWriter<ChannelList> writer (channels);
2211 boost::shared_ptr<ChannelList> c = writer.get_copy();
2213 return add_channel_to (c, how_many);
2217 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2219 while (--how_many && !c->empty()) {
2224 _n_channels = c->size();
2230 AudioDiskstream::remove_channel (uint32_t how_many)
2232 RCUWriter<ChannelList> writer (channels);
2233 boost::shared_ptr<ChannelList> c = writer.get_copy();
2235 return remove_channel_from (c, how_many);
2239 AudioDiskstream::playback_buffer_load () const
2241 boost::shared_ptr<ChannelList> c = channels.reader();
2243 return (float) ((double) c->front()->playback_buf->read_space()/
2244 (double) c->front()->playback_buf->bufsize());
2248 AudioDiskstream::capture_buffer_load () const
2250 boost::shared_ptr<ChannelList> c = channels.reader();
2252 return (float) ((double) c->front()->capture_buf->write_space()/
2253 (double) c->front()->capture_buf->bufsize());
2257 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2259 const XMLProperty* prop;
2260 XMLNodeList nlist = node.children();
2261 XMLNodeIterator niter;
2262 boost::shared_ptr<AudioFileSource> fs;
2263 boost::shared_ptr<AudioFileSource> first_fs;
2264 SourceList pending_sources;
2267 if ((prop = node.property (X_("at"))) == 0) {
2271 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2275 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2276 if ((*niter)->name() == X_("file")) {
2278 if ((prop = (*niter)->property (X_("path"))) == 0) {
2283 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (_session, prop->value(), false, _session.frame_rate()));
2286 catch (failed_constructor& err) {
2287 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2288 _name, prop->value())
2293 pending_sources.push_back (fs);
2295 if (first_fs == 0) {
2299 fs->set_captured_for (_name);
2303 if (pending_sources.size() == 0) {
2304 /* nothing can be done */
2308 if (pending_sources.size() != _n_channels) {
2309 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2314 boost::shared_ptr<AudioRegion> region;
2317 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2318 region_name_from_path (first_fs->name(), true),
2319 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2320 region->special_set_position (0);
2323 catch (failed_constructor& err) {
2324 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2332 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2335 catch (failed_constructor& err) {
2336 error << string_compose (_("%1: cannot create region from pending capture sources"),
2343 _playlist->add_region (region, position);
2349 AudioDiskstream::set_destructive (bool yn)
2351 bool bounce_ignored;
2353 if (yn != destructive()) {
2356 /* requestor should already have checked this and
2357 bounced if necessary and desired
2359 if (!can_become_destructive (bounce_ignored)) {
2362 _flags = Flag (_flags | Destructive);
2363 use_destructive_playlist ();
2365 _flags = Flag (_flags & ~Destructive);
2366 reset_write_sources (true, true);
2374 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2377 requires_bounce = false;
2381 /* is there only one region ? */
2383 if (_playlist->n_regions() != 1) {
2384 requires_bounce = true;
2388 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2391 /* do the source(s) for the region cover the session start position ? */
2393 if (first->position() != _session.current_start_frame()) {
2394 if (first->start() > _session.current_start_frame()) {
2395 requires_bounce = true;
2400 /* is the source used by only 1 playlist ? */
2402 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2406 if (afirst->source()->used() > 1) {
2407 requires_bounce = true;
2411 requires_bounce = false;
2415 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2419 current_capture_buffer = 0;
2420 current_playback_buffer = 0;
2421 curr_capture_cnt = 0;
2423 speed_buffer = new Sample[speed_size];
2424 playback_wrap_buffer = new Sample[wrap_size];
2425 capture_wrap_buffer = new Sample[wrap_size];
2427 playback_buf = new RingBufferNPT<Sample> (bufsize);
2428 capture_buf = new RingBufferNPT<Sample> (bufsize);
2429 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2431 /* touch the ringbuffer buffers, which will cause
2432 them to be mapped into locked physical RAM if
2433 we're running with mlockall(). this doesn't do
2437 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2438 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2439 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2442 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2445 write_source.reset ();
2449 delete [] speed_buffer;
2453 if (playback_wrap_buffer) {
2454 delete [] playback_wrap_buffer;
2455 playback_wrap_buffer = 0;
2458 if (capture_wrap_buffer) {
2459 delete [] capture_wrap_buffer;
2460 capture_wrap_buffer = 0;
2464 delete playback_buf;
2473 if (capture_transition_buf) {
2474 delete capture_transition_buf;
2475 capture_transition_buf = 0;