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 if (!_io->active()) {
534 check_record_status (transport_frame, nframes, can_record);
536 nominally_recording = (can_record && re);
543 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
544 must always be called as a pair. The only exception is if this function
545 returns a non-zero value, in which case, ::commit should not be called.
548 // If we can't take the state lock return.
549 if (!state_lock.trylock()) {
552 commit_should_unlock = true;
553 adjust_capture_position = 0;
555 for (chan = c->begin(); chan != c->end(); ++chan) {
556 (*chan)->current_capture_buffer = 0;
557 (*chan)->current_playback_buffer = 0;
560 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
563 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
564 if (last_recordable_frame < first_recordable_frame) {
565 last_recordable_frame = max_frames;
569 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
576 case OverlapInternal:
577 /* ---------- recrange
580 rec_nframes = nframes;
585 /* |--------| recrange
588 rec_nframes = transport_frame + nframes - first_recordable_frame;
590 rec_offset = first_recordable_frame - transport_frame;
595 /* |--------| recrange
598 rec_nframes = last_recordable_frame - transport_frame;
602 case OverlapExternal:
603 /* |--------| recrange
604 -------------- transrange
606 rec_nframes = last_recordable_frame - first_recordable_frame;
607 rec_offset = first_recordable_frame - transport_frame;
611 if (rec_nframes && !was_recording) {
612 capture_captured = 0;
613 was_recording = true;
618 if (can_record && !_last_capture_regions.empty()) {
619 _last_capture_regions.clear ();
622 if (nominally_recording || rec_nframes) {
624 uint32_t limit = _io->n_inputs ();
626 /* one or more ports could already have been removed from _io, but our
627 channel setup hasn't yet been updated. prevent us from trying to
628 use channels that correspond to missing ports. note that the
629 process callback (from which this is called) is always atomic
630 with respect to port removal/addition.
633 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
635 ChannelInfo* chaninfo (*chan);
637 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
639 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
641 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
643 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
647 memcpy (chaninfo->current_capture_buffer, _io->input(n)->get_buffer (rec_nframes) + offset + rec_offset, sizeof (Sample) * rec_nframes);
651 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
653 if (rec_nframes > total) {
658 Sample* buf = _io->input (n)->get_buffer (nframes) + offset;
659 nframes_t first = chaninfo->capture_vector.len[0];
661 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
662 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
663 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
664 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
666 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
673 finish_capture (rec_monitors_input, c);
680 /* data will be written to disk */
682 if (rec_nframes == nframes && rec_offset == 0) {
684 for (chan = c->begin(); chan != c->end(); ++chan) {
685 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
688 playback_distance = nframes;
693 /* we can't use the capture buffer as the playback buffer, because
694 we recorded only a part of the current process' cycle data
698 collect_playback = true;
701 adjust_capture_position = rec_nframes;
703 } else if (nominally_recording) {
705 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
707 for (chan = c->begin(); chan != c->end(); ++chan) {
708 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
711 playback_distance = nframes;
715 collect_playback = true;
718 if (collect_playback) {
720 /* we're doing playback */
722 nframes_t necessary_samples;
724 /* no varispeed playback if we're recording, because the output .... TBD */
726 if (rec_nframes == 0 && _actual_speed != 1.0f) {
727 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
729 necessary_samples = nframes;
732 for (chan = c->begin(); chan != c->end(); ++chan) {
733 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
738 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
740 ChannelInfo* chaninfo (*chan);
742 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
744 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
747 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
749 if (necessary_samples > total) {
750 cerr << "underrun for " << _name << endl;
756 memcpy ((char *) chaninfo->playback_wrap_buffer, chaninfo->playback_vector.buf[0],
757 chaninfo->playback_vector.len[0] * sizeof (Sample));
758 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0], chaninfo->playback_vector.buf[1],
759 (necessary_samples - chaninfo->playback_vector.len[0]) * sizeof (Sample));
761 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
766 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
768 uint64_t phase = last_phase;
772 // Linearly interpolate into the alt buffer
773 // using 40.24 fixp maths (swh)
775 if (phi != target_phi) {
776 phi_delta = ((int64_t)(target_phi - phi)) / nframes;
781 for (chan = c->begin(); chan != c->end(); ++chan) {
784 ChannelInfo* chaninfo (*chan);
789 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
791 fr = (phase & 0xFFFFFF) / 16777216.0f;
792 chaninfo->speed_buffer[outsample] =
793 chaninfo->current_playback_buffer[i] * (1.0f - fr) +
794 chaninfo->current_playback_buffer[i+1] * fr;
795 phase += phi + phi_delta;
798 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
801 playback_distance = i; // + 1;
802 last_phase = (phase & 0xFFFFFF);
805 playback_distance = nframes;
818 /* we're exiting with failure, so ::commit will not
819 be called. unlock the state lock.
822 commit_should_unlock = false;
830 AudioDiskstream::commit (nframes_t nframes)
832 bool need_butler = false;
834 if (!_io->active()) {
838 if (_actual_speed < 0.0) {
839 playback_sample -= playback_distance;
841 playback_sample += playback_distance;
844 boost::shared_ptr<ChannelList> c = channels.reader();
845 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
847 (*chan)->playback_buf->increment_read_ptr (playback_distance);
849 if (adjust_capture_position) {
850 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
854 if (adjust_capture_position != 0) {
855 capture_captured += adjust_capture_position;
856 adjust_capture_position = 0;
860 if (_io && _io->active()) {
861 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
866 if (_io && _io->active()) {
867 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
868 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
870 need_butler = c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
874 if (commit_should_unlock) {
884 AudioDiskstream::set_pending_overwrite (bool yn)
886 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
888 pending_overwrite = yn;
890 overwrite_frame = playback_sample;
891 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
895 AudioDiskstream::overwrite_existing_buffers ()
897 boost::shared_ptr<ChannelList> c = channels.reader();
898 Sample* mixdown_buffer;
901 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
903 overwrite_queued = false;
905 /* assume all are the same size */
906 nframes_t size = c->front()->playback_buf->bufsize();
908 mixdown_buffer = new Sample[size];
909 gain_buffer = new float[size];
911 /* reduce size so that we can fill the buffer correctly. */
917 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
919 start = overwrite_frame;
920 nframes_t cnt = size;
922 /* to fill the buffer without resetting the playback sample, we need to
923 do it one or two chunks (normally two).
925 |----------------------------------------------------------------------|
929 |<- second chunk->||<----------------- first chunk ------------------>|
933 nframes_t to_read = size - overwrite_offset;
935 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
936 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
937 _id, size, playback_sample) << endmsg;
945 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
946 start, cnt, *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;
957 pending_overwrite = false;
958 delete [] gain_buffer;
959 delete [] mixdown_buffer;
964 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
968 ChannelList::iterator chan;
969 boost::shared_ptr<ChannelList> c = channels.reader();
971 Glib::Mutex::Lock lm (state_lock);
973 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
974 (*chan)->playback_buf->reset ();
975 (*chan)->capture_buf->reset ();
978 /* can't rec-enable in destructive mode if transport is before start */
980 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
981 disengage_record_enable ();
984 playback_sample = frame;
987 if (complete_refill) {
988 while ((ret = do_refill_with_alloc ()) > 0) ;
990 ret = do_refill_with_alloc ();
997 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
999 ChannelList::iterator chan;
1000 boost::shared_ptr<ChannelList> c = channels.reader();
1002 for (chan = c->begin(); chan != c->end(); ++chan) {
1003 if ((*chan)->playback_buf->read_space() < distance) {
1011 AudioDiskstream::internal_playback_seek (nframes_t distance)
1013 ChannelList::iterator chan;
1014 boost::shared_ptr<ChannelList> c = channels.reader();
1016 for (chan = c->begin(); chan != c->end(); ++chan) {
1017 (*chan)->playback_buf->increment_read_ptr (distance);
1020 first_recordable_frame += distance;
1021 playback_sample += distance;
1027 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1028 ChannelInfo* channel_info, int channel, bool reversed)
1030 nframes_t this_read = 0;
1031 bool reloop = false;
1032 nframes_t loop_end = 0;
1033 nframes_t loop_start = 0;
1034 nframes_t loop_length = 0;
1035 nframes_t offset = 0;
1036 nframes_t xfade_samples = 0;
1037 Sample xfade_buf[128];
1040 /* XXX we don't currently play loops in reverse. not sure why */
1044 /* Make the use of a Location atomic for this read operation.
1046 Note: Locations don't get deleted, so all we care about
1047 when I say "atomic" is that we are always pointing to
1048 the same one and using a start/length values obtained
1052 if ((loc = loop_location) != 0) {
1053 loop_start = loc->start();
1054 loop_end = loc->end();
1055 loop_length = loop_end - loop_start;
1058 /* if we are looping, ensure that the first frame we read is at the correct
1059 position within the loop.
1062 if (loc && start >= loop_end) {
1063 //cerr << "start adjusted from " << start;
1064 start = loop_start + ((start - loop_start) % loop_length);
1065 //cerr << "to " << start << endl;
1068 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1077 /* take any loop into account. we can't read past the end of the loop. */
1079 if (loc && (loop_end - start < cnt)) {
1080 this_read = loop_end - start;
1081 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1088 if (this_read == 0) {
1092 this_read = min(cnt,this_read);
1094 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1095 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1100 // xfade loop boundary if appropriate
1102 if (xfade_samples > 0) {
1103 // just do a linear xfade for this short bit
1105 xfade_samples = min(xfade_samples, this_read);
1107 float delta = 1.0f / xfade_samples;
1109 Sample * tmpbuf = buf+offset;
1111 for (size_t i=0; i < xfade_samples; ++i) {
1112 *tmpbuf = (*tmpbuf * scale) + xfade_buf[i]*(1.0f - scale);
1120 _read_data_count = _playlist->read_data_count();
1124 swap_by_ptr (buf, buf + this_read - 1);
1129 /* if we read to the end of the loop, go back to the beginning */
1132 // read crossfade samples to apply to the next read
1134 xfade_samples = min((nframes_t) 128, cnt-this_read);
1136 if (audio_playlist()->read (xfade_buf, mixdown_buffer, gain_buffer, start, xfade_samples, channel) != xfade_samples) {
1137 error << string_compose(_("AudioDiskstream %1: cannot read xfade samples %2 from playlist at frame %3"),
1138 _id, xfade_samples,start) << endmsg;
1139 memset(xfade_buf, 0, xfade_samples * sizeof(Sample)); // just in case
1147 offset += this_read;
1154 AudioDiskstream::do_refill_with_alloc ()
1156 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1157 float* gain_buf = new float[disk_io_chunk_frames];
1159 int ret = _do_refill(mix_buf, gain_buf);
1168 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1172 RingBufferNPT<Sample>::rw_vector vector;
1173 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1174 nframes_t total_space;
1175 nframes_t zero_fill;
1177 ChannelList::iterator i;
1178 boost::shared_ptr<ChannelList> c = channels.reader();
1185 assert(mixdown_buffer);
1186 assert(gain_buffer);
1193 c->front()->playback_buf->get_write_vector (&vector);
1195 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1199 /* if there are 2+ chunks of disk i/o possible for
1200 this track, let the caller know so that it can arrange
1201 for us to be called again, ASAP.
1204 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1208 /* if we're running close to normal speed and there isn't enough
1209 space to do disk_io_chunk_frames of I/O, then don't bother.
1211 at higher speeds, just do it because the sync between butler
1212 and audio thread may not be good enough.
1215 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1219 /* when slaved, don't try to get too close to the read pointer. this
1220 leaves space for the buffer reversal to have something useful to
1224 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1228 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1230 total_space = min (disk_io_chunk_frames, total_space);
1234 if (file_frame == 0) {
1236 /* at start: nothing to do but fill with silence */
1238 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1240 ChannelInfo* chan (*i);
1241 chan->playback_buf->get_write_vector (&vector);
1242 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1243 if (vector.len[1]) {
1244 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1246 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1251 if (file_frame < total_space) {
1253 /* too close to the start: read what we can,
1254 and then zero fill the rest
1257 zero_fill = total_space - file_frame;
1258 total_space = file_frame;
1268 if (file_frame == max_frames) {
1270 /* at end: nothing to do but fill with silence */
1272 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1274 ChannelInfo* chan (*i);
1275 chan->playback_buf->get_write_vector (&vector);
1276 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1277 if (vector.len[1]) {
1278 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1280 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1285 if (file_frame > max_frames - total_space) {
1287 /* to close to the end: read what we can, and zero fill the rest */
1289 zero_fill = total_space - (max_frames - file_frame);
1290 total_space = max_frames - file_frame;
1297 nframes_t file_frame_tmp = 0;
1299 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1301 ChannelInfo* chan (*i);
1304 nframes_t len1, len2;
1306 chan->playback_buf->get_write_vector (&vector);
1308 if (vector.len[0] > disk_io_chunk_frames) {
1310 /* we're not going to fill the first chunk, so certainly do not bother with the
1311 other part. it won't be connected with the part we do fill, as in:
1313 .... => writable space
1314 ++++ => readable space
1315 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1317 |......|+++++++++++++|...............................|
1322 So, just pretend that the buf1 part isn't there.
1332 file_frame_tmp = file_frame;
1334 buf1 = vector.buf[0];
1335 len1 = vector.len[0];
1336 buf2 = vector.buf[1];
1337 len2 = vector.len[1];
1339 to_read = min (ts, len1);
1340 to_read = min (to_read, disk_io_chunk_frames);
1344 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1349 chan->playback_buf->increment_write_ptr (to_read);
1353 to_read = min (ts, len2);
1357 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1358 so read some or all of vector.len[1] as well.
1361 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1366 chan->playback_buf->increment_write_ptr (to_read);
1375 file_frame = file_frame_tmp;
1382 /** Flush pending data to disk.
1384 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1385 * of data to disk. it will never write more than that. If it writes that
1386 * much and there is more than that waiting to be written, it will return 1,
1387 * otherwise 0 on success or -1 on failure.
1389 * If there is less than disk_io_chunk_frames to be written, no data will be
1390 * written at all unless @a force_flush is true.
1393 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1397 RingBufferNPT<Sample>::rw_vector vector;
1398 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1401 _write_data_count = 0;
1403 transvec.buf[0] = 0;
1404 transvec.buf[1] = 0;
1408 boost::shared_ptr<ChannelList> c = channels.reader();
1409 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1411 (*chan)->capture_buf->get_read_vector (&vector);
1413 total = vector.len[0] + vector.len[1];
1415 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1419 /* if there are 2+ chunks of disk i/o possible for
1420 this track, let the caller know so that it can arrange
1421 for us to be called again, ASAP.
1423 if we are forcing a flush, then if there is* any* extra
1424 work, let the caller know.
1426 if we are no longer recording and there is any extra work,
1427 let the caller know too.
1430 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1434 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1436 // check the transition buffer when recording destructive
1437 // important that we get this after the capture buf
1439 if (destructive()) {
1440 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1441 size_t transcount = transvec.len[0] + transvec.len[1];
1442 bool have_start = false;
1445 for (ti=0; ti < transcount; ++ti) {
1446 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1448 if (captrans.type == CaptureStart) {
1449 // by definition, the first data we got above represents the given capture pos
1451 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1452 (*chan)->curr_capture_cnt = 0;
1456 else if (captrans.type == CaptureEnd) {
1458 // capture end, the capture_val represents total frames in capture
1460 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1462 // shorten to make the write a perfect fit
1463 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1465 if (nto_write < to_write) {
1466 ret = 1; // should we?
1468 to_write = nto_write;
1470 (*chan)->write_source->mark_capture_end ();
1472 // increment past this transition, but go no further
1477 // actually ends just beyond this chunk, so force more work
1485 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1489 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1490 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1494 (*chan)->capture_buf->increment_read_ptr (to_write);
1495 (*chan)->curr_capture_cnt += to_write;
1497 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1499 /* we wrote all of vector.len[0] but it wasn't an entire
1500 disk_io_chunk_frames of data, so arrange for some part
1501 of vector.len[1] to be flushed to disk as well.
1504 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1506 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1507 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1511 _write_data_count += (*chan)->write_source->write_data_count();
1513 (*chan)->capture_buf->increment_read_ptr (to_write);
1514 (*chan)->curr_capture_cnt += to_write;
1523 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1525 uint32_t buffer_position;
1526 bool more_work = true;
1528 boost::shared_ptr<AudioRegion> region;
1529 nframes_t total_capture;
1531 SourceList::iterator src;
1532 ChannelList::iterator chan;
1533 vector<CaptureInfo*>::iterator ci;
1534 boost::shared_ptr<ChannelList> c = channels.reader();
1536 bool mark_write_completed = false;
1538 finish_capture (true, c);
1540 /* butler is already stopped, but there may be work to do
1541 to flush remaining data to disk.
1544 while (more_work && !err) {
1545 switch (do_flush (Session::TransportContext, true)) {
1552 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1557 /* XXX is there anything we can do if err != 0 ? */
1558 Glib::Mutex::Lock lm (capture_info_lock);
1560 if (capture_info.empty()) {
1564 if (abort_capture) {
1566 if (destructive()) {
1570 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1572 if ((*chan)->write_source) {
1574 (*chan)->write_source->mark_for_remove ();
1575 (*chan)->write_source->drop_references ();
1576 (*chan)->write_source.reset ();
1579 /* new source set up in "out" below */
1585 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1586 total_capture += (*ci)->frames;
1589 /* figure out the name for this take */
1591 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1593 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1597 s->update_header (capture_info.front()->start, when, twhen);
1598 s->set_captured_for (_name);
1599 s->mark_immutable ();
1603 /* destructive tracks have a single, never changing region */
1605 if (destructive()) {
1607 /* send a signal that any UI can pick up to do the right thing. there is
1608 a small problem here in that a UI may need the peak data to be ready
1609 for the data that was recorded and this isn't interlocked with that
1610 process. this problem is deferred to the UI.
1613 _playlist->Modified();
1617 string whole_file_region_name;
1618 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1620 /* Register a new region with the Session that
1621 describes the entire source. Do this first
1622 so that any sub-regions will obviously be
1623 children of this one (later!)
1627 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, c->front()->write_source->last_capture_start_frame(), total_capture,
1628 whole_file_region_name,
1629 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1631 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1632 region->special_set_position (capture_info.front()->start);
1636 catch (failed_constructor& err) {
1637 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1641 _last_capture_regions.push_back (region);
1643 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1645 XMLNode &before = _playlist->get_state();
1646 _playlist->freeze ();
1648 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1652 _session.region_name (region_name, whole_file_region_name, false);
1654 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1657 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1658 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1661 catch (failed_constructor& err) {
1662 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1663 continue; /* XXX is this OK? */
1666 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1668 _last_capture_regions.push_back (region);
1670 i_am_the_modifier++;
1671 _playlist->add_region (region, (*ci)->start);
1672 i_am_the_modifier--;
1674 buffer_position += (*ci)->frames;
1678 XMLNode &after = _playlist->get_state();
1679 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1682 mark_write_completed = true;
1685 reset_write_sources (mark_write_completed);
1689 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1693 capture_info.clear ();
1694 capture_start_frame = 0;
1698 AudioDiskstream::transport_looped (nframes_t transport_frame)
1700 if (was_recording) {
1701 // all we need to do is finish this capture, with modified capture length
1702 boost::shared_ptr<ChannelList> c = channels.reader();
1704 // adjust the capture length knowing that the data will be recorded to disk
1705 // only necessary after the first loop where we're recording
1706 if (capture_info.size() == 0) {
1707 capture_captured += _capture_offset;
1709 if (_alignment_style == ExistingMaterial) {
1710 capture_captured += _session.worst_output_latency();
1712 capture_captured += _roll_delay;
1716 finish_capture (true, c);
1718 // the next region will start recording via the normal mechanism
1719 // we'll set the start position to the current transport pos
1720 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1721 capture_start_frame = transport_frame;
1722 first_recordable_frame = transport_frame; // mild lie
1723 last_recordable_frame = max_frames;
1724 was_recording = true;
1726 if (recordable() && destructive()) {
1727 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1729 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1730 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1732 if (transvec.len[0] > 0) {
1733 transvec.buf[0]->type = CaptureStart;
1734 transvec.buf[0]->capture_val = capture_start_frame;
1735 (*chan)->capture_transition_buf->increment_write_ptr(1);
1739 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1749 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1751 was_recording = false;
1753 if (capture_captured == 0) {
1757 if (recordable() && destructive()) {
1758 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1760 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1761 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1763 if (transvec.len[0] > 0) {
1764 transvec.buf[0]->type = CaptureEnd;
1765 transvec.buf[0]->capture_val = capture_captured;
1766 (*chan)->capture_transition_buf->increment_write_ptr(1);
1770 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1776 CaptureInfo* ci = new CaptureInfo;
1778 ci->start = capture_start_frame;
1779 ci->frames = capture_captured;
1781 /* XXX theoretical race condition here. Need atomic exchange ?
1782 However, the circumstances when this is called right
1783 now (either on record-disable or transport_stopped)
1784 mean that no actual race exists. I think ...
1785 We now have a capture_info_lock, but it is only to be used
1786 to synchronize in the transport_stop and the capture info
1787 accessors, so that invalidation will not occur (both non-realtime).
1790 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1792 capture_info.push_back (ci);
1793 capture_captured = 0;
1797 AudioDiskstream::set_record_enabled (bool yn)
1799 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs() == 0) {
1803 /* can't rec-enable in destructive mode if transport is before start */
1805 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1809 if (yn && channels.reader()->front()->source == 0) {
1811 /* pick up connections not initiated *from* the IO object
1812 we're associated with.
1815 get_input_sources ();
1818 /* yes, i know that this not proof against race conditions, but its
1819 good enough. i think.
1822 if (record_enabled() != yn) {
1824 engage_record_enable ();
1826 disengage_record_enable ();
1832 AudioDiskstream::engage_record_enable ()
1834 bool rolling = _session.transport_speed() != 0.0f;
1835 boost::shared_ptr<ChannelList> c = channels.reader();
1837 g_atomic_int_set (&_record_enabled, 1);
1838 capturing_sources.clear ();
1840 if (Config->get_monitoring_model() == HardwareMonitoring) {
1842 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1843 if ((*chan)->source) {
1844 (*chan)->source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1846 capturing_sources.push_back ((*chan)->write_source);
1850 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1851 capturing_sources.push_back ((*chan)->write_source);
1855 RecordEnableChanged (); /* EMIT SIGNAL */
1859 AudioDiskstream::disengage_record_enable ()
1861 g_atomic_int_set (&_record_enabled, 0);
1862 boost::shared_ptr<ChannelList> c = channels.reader();
1863 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1864 if (Config->get_monitoring_model() == HardwareMonitoring) {
1865 if ((*chan)->source) {
1866 (*chan)->source->ensure_monitor_input (false);
1870 capturing_sources.clear ();
1871 RecordEnableChanged (); /* EMIT SIGNAL */
1875 AudioDiskstream::get_state ()
1877 XMLNode* node = new XMLNode ("AudioDiskstream");
1879 LocaleGuard lg (X_("POSIX"));
1880 boost::shared_ptr<ChannelList> c = channels.reader();
1882 node->add_property ("flags", enum_2_string (_flags));
1884 snprintf (buf, sizeof(buf), "%zd", c->size());
1885 node->add_property ("channels", buf);
1887 node->add_property ("playlist", _playlist->name());
1889 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1890 node->add_property ("speed", buf);
1892 node->add_property("name", _name);
1893 id().print (buf, sizeof (buf));
1894 node->add_property("id", buf);
1896 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1898 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1899 XMLNode* cs_grandchild;
1901 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1902 cs_grandchild = new XMLNode (X_("file"));
1903 cs_grandchild->add_property (X_("path"), (*i)->path());
1904 cs_child->add_child_nocopy (*cs_grandchild);
1907 /* store the location where capture will start */
1911 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1912 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1914 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1917 cs_child->add_property (X_("at"), buf);
1918 node->add_child_nocopy (*cs_child);
1922 node->add_child_copy (*_extra_xml);
1929 AudioDiskstream::set_state (const XMLNode& node)
1931 const XMLProperty* prop;
1932 XMLNodeList nlist = node.children();
1933 XMLNodeIterator niter;
1934 uint32_t nchans = 1;
1935 XMLNode* capture_pending_node = 0;
1936 LocaleGuard lg (X_("POSIX"));
1938 in_set_state = true;
1940 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1941 if ((*niter)->name() == IO::state_node_name) {
1942 deprecated_io_node = new XMLNode (**niter);
1945 if ((*niter)->name() == X_("CapturingSources")) {
1946 capture_pending_node = *niter;
1950 /* prevent write sources from being created */
1952 in_set_state = true;
1954 if ((prop = node.property ("name")) != 0) {
1955 _name = prop->value();
1958 if (deprecated_io_node) {
1959 if ((prop = deprecated_io_node->property ("id")) != 0) {
1960 _id = prop->value ();
1963 if ((prop = node.property ("id")) != 0) {
1964 _id = prop->value ();
1968 if ((prop = node.property ("flags")) != 0) {
1969 _flags = Flag (string_2_enum (prop->value(), _flags));
1972 if ((prop = node.property ("channels")) != 0) {
1973 nchans = atoi (prop->value().c_str());
1976 // create necessary extra channels
1977 // we are always constructed with one and we always need one
1979 _n_channels = channels.reader()->size();
1981 if (nchans > _n_channels) {
1983 add_channel (nchans - _n_channels);
1984 IO::MoreOutputs(_n_channels);
1986 } else if (nchans < _n_channels) {
1988 remove_channel (_n_channels - nchans);
1991 if ((prop = node.property ("playlist")) == 0) {
1996 bool had_playlist = (_playlist != 0);
1998 if (find_and_use_playlist (prop->value())) {
2002 if (!had_playlist) {
2003 _playlist->set_orig_diskstream_id (_id);
2006 if (!destructive() && capture_pending_node) {
2007 /* destructive streams have one and only one source per channel,
2008 and so they never end up in pending capture in any useful
2011 use_pending_capture_data (*capture_pending_node);
2016 if ((prop = node.property ("speed")) != 0) {
2017 double sp = atof (prop->value().c_str());
2019 if (realtime_set_speed (sp, false)) {
2020 non_realtime_set_speed ();
2024 in_set_state = false;
2026 /* make sure this is clear before we do anything else */
2028 capturing_sources.clear ();
2030 /* write sources are handled when we handle the input set
2031 up of the IO that owns this DS (::non_realtime_input_change())
2038 AudioDiskstream::use_new_write_source (uint32_t n)
2040 boost::shared_ptr<ChannelList> c = channels.reader();
2042 if (!recordable()) {
2046 if (n >= c->size()) {
2047 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
2051 ChannelInfo* chan = (*c)[n];
2053 if (chan->write_source) {
2054 chan->write_source->done_with_peakfile_writes ();
2055 chan->write_source->set_allow_remove_if_empty (true);
2056 chan->write_source.reset ();
2060 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
2061 throw failed_constructor();
2065 catch (failed_constructor &err) {
2066 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2067 chan->write_source.reset ();
2071 /* do not remove destructive files even if they are empty */
2073 chan->write_source->set_allow_remove_if_empty (!destructive());
2079 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
2081 ChannelList::iterator chan;
2082 boost::shared_ptr<ChannelList> c = channels.reader();
2085 if (!recordable()) {
2089 capturing_sources.clear ();
2091 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2092 if (!destructive()) {
2094 if ((*chan)->write_source && mark_write_complete) {
2095 (*chan)->write_source->mark_streaming_write_completed ();
2097 use_new_write_source (n);
2099 if (record_enabled()) {
2100 capturing_sources.push_back ((*chan)->write_source);
2104 if ((*chan)->write_source == 0) {
2105 use_new_write_source (n);
2110 if (destructive()) {
2112 /* we now have all our write sources set up, so create the
2113 playlist's single region.
2116 if (_playlist->empty()) {
2117 setup_destructive_playlist ();
2123 AudioDiskstream::rename_write_sources ()
2125 ChannelList::iterator chan;
2126 boost::shared_ptr<ChannelList> c = channels.reader();
2129 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2130 if ((*chan)->write_source != 0) {
2131 (*chan)->write_source->set_name (_name, destructive());
2132 /* XXX what to do if one of them fails ? */
2140 AudioDiskstream::set_block_size (nframes_t nframes)
2142 if (_session.get_block_size() > speed_buffer_size) {
2143 speed_buffer_size = _session.get_block_size();
2144 boost::shared_ptr<ChannelList> c = channels.reader();
2146 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2147 if ((*chan)->speed_buffer) delete [] (*chan)->speed_buffer;
2148 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2151 allocate_temporary_buffers ();
2155 AudioDiskstream::allocate_temporary_buffers ()
2157 /* make sure the wrap buffer is at least large enough to deal
2158 with the speeds up to 1.2, to allow for micro-variation
2159 when slaving to MTC, SMPTE etc.
2162 double sp = max (fabsf (_actual_speed), 1.2f);
2163 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2165 if (required_wrap_size > wrap_buffer_size) {
2167 boost::shared_ptr<ChannelList> c = channels.reader();
2169 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2170 if ((*chan)->playback_wrap_buffer) delete [] (*chan)->playback_wrap_buffer;
2171 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2172 if ((*chan)->capture_wrap_buffer) delete [] (*chan)->capture_wrap_buffer;
2173 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2176 wrap_buffer_size = required_wrap_size;
2181 AudioDiskstream::monitor_input (bool yn)
2183 boost::shared_ptr<ChannelList> c = channels.reader();
2185 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2187 if ((*chan)->source) {
2188 (*chan)->source->ensure_monitor_input (yn);
2194 AudioDiskstream::set_align_style_from_io ()
2196 bool have_physical = false;
2202 get_input_sources ();
2204 boost::shared_ptr<ChannelList> c = channels.reader();
2206 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2207 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2208 have_physical = true;
2213 if (have_physical) {
2214 set_align_style (ExistingMaterial);
2216 set_align_style (CaptureTime);
2221 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2223 while (how_many--) {
2224 c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2227 _n_channels = c->size();
2233 AudioDiskstream::add_channel (uint32_t how_many)
2235 RCUWriter<ChannelList> writer (channels);
2236 boost::shared_ptr<ChannelList> c = writer.get_copy();
2238 return add_channel_to (c, how_many);
2242 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2244 while (--how_many && !c->empty()) {
2249 _n_channels = c->size();
2255 AudioDiskstream::remove_channel (uint32_t how_many)
2257 RCUWriter<ChannelList> writer (channels);
2258 boost::shared_ptr<ChannelList> c = writer.get_copy();
2260 return remove_channel_from (c, how_many);
2264 AudioDiskstream::playback_buffer_load () const
2266 boost::shared_ptr<ChannelList> c = channels.reader();
2268 return (float) ((double) c->front()->playback_buf->read_space()/
2269 (double) c->front()->playback_buf->bufsize());
2273 AudioDiskstream::capture_buffer_load () const
2275 boost::shared_ptr<ChannelList> c = channels.reader();
2277 return (float) ((double) c->front()->capture_buf->write_space()/
2278 (double) c->front()->capture_buf->bufsize());
2282 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2284 const XMLProperty* prop;
2285 XMLNodeList nlist = node.children();
2286 XMLNodeIterator niter;
2287 boost::shared_ptr<AudioFileSource> fs;
2288 boost::shared_ptr<AudioFileSource> first_fs;
2289 SourceList pending_sources;
2292 if ((prop = node.property (X_("at"))) == 0) {
2296 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2300 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2301 if ((*niter)->name() == X_("file")) {
2303 if ((prop = (*niter)->property (X_("path"))) == 0) {
2307 // This protects sessions from errant CapturingSources in stored sessions
2309 if (stat (prop->value().c_str(), &sbuf)) {
2314 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (_session, prop->value(), false, _session.frame_rate()));
2317 catch (failed_constructor& err) {
2318 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2319 _name, prop->value())
2324 pending_sources.push_back (fs);
2326 if (first_fs == 0) {
2330 fs->set_captured_for (_name);
2334 if (pending_sources.size() == 0) {
2335 /* nothing can be done */
2339 if (pending_sources.size() != _n_channels) {
2340 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2345 boost::shared_ptr<AudioRegion> region;
2348 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2349 region_name_from_path (first_fs->name(), true),
2350 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2351 region->special_set_position (0);
2354 catch (failed_constructor& err) {
2355 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2363 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2366 catch (failed_constructor& err) {
2367 error << string_compose (_("%1: cannot create region from pending capture sources"),
2374 _playlist->add_region (region, position);
2380 AudioDiskstream::set_destructive (bool yn)
2382 bool bounce_ignored;
2384 if (yn != destructive()) {
2387 /* requestor should already have checked this and
2388 bounced if necessary and desired
2390 if (!can_become_destructive (bounce_ignored)) {
2393 _flags = Flag (_flags | Destructive);
2394 use_destructive_playlist ();
2396 _flags = Flag (_flags & ~Destructive);
2397 reset_write_sources (true, true);
2405 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2408 requires_bounce = false;
2412 /* is there only one region ? */
2414 if (_playlist->n_regions() != 1) {
2415 requires_bounce = true;
2419 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2422 /* do the source(s) for the region cover the session start position ? */
2424 if (first->position() != _session.current_start_frame()) {
2425 if (first->start() > _session.current_start_frame()) {
2426 requires_bounce = true;
2431 /* is the source used by only 1 playlist ? */
2433 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2437 if (afirst->source()->used() > 1) {
2438 requires_bounce = true;
2442 requires_bounce = false;
2446 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2450 current_capture_buffer = 0;
2451 current_playback_buffer = 0;
2452 curr_capture_cnt = 0;
2454 speed_buffer = new Sample[speed_size];
2455 playback_wrap_buffer = new Sample[wrap_size];
2456 capture_wrap_buffer = new Sample[wrap_size];
2458 playback_buf = new RingBufferNPT<Sample> (bufsize);
2459 capture_buf = new RingBufferNPT<Sample> (bufsize);
2460 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2462 /* touch the ringbuffer buffers, which will cause
2463 them to be mapped into locked physical RAM if
2464 we're running with mlockall(). this doesn't do
2468 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2469 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2470 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2473 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2476 write_source.reset ();
2480 delete [] speed_buffer;
2484 if (playback_wrap_buffer) {
2485 delete [] playback_wrap_buffer;
2486 playback_wrap_buffer = 0;
2489 if (capture_wrap_buffer) {
2490 delete [] capture_wrap_buffer;
2491 capture_wrap_buffer = 0;
2495 delete playback_buf;
2504 if (capture_transition_buf) {
2505 delete capture_transition_buf;
2506 capture_transition_buf = 0;