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/audio_port.h>
54 #include <ardour/source_factory.h>
60 using namespace ARDOUR;
63 size_t AudioDiskstream::_working_buffers_size = 0;
64 Sample* AudioDiskstream::_mixdown_buffer = 0;
65 gain_t* AudioDiskstream::_gain_buffer = 0;
67 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
68 : Diskstream(sess, name, flag)
69 , deprecated_io_node(NULL)
70 , channels (new ChannelList)
72 /* prevent any write sources from being created */
82 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
83 : Diskstream(sess, node)
84 , deprecated_io_node(NULL)
85 , channels (new ChannelList)
90 if (set_state (node)) {
92 throw failed_constructor();
98 use_destructive_playlist ();
103 AudioDiskstream::init (Diskstream::Flag f)
107 /* there are no channels at this point, so these
108 two calls just get speed_buffer_size and wrap_buffer
109 size setup without duplicating their code.
112 set_block_size (_session.get_block_size());
113 allocate_temporary_buffers ();
116 assert(_n_channels == ChanCount(DataType::AUDIO, 1));
119 AudioDiskstream::~AudioDiskstream ()
124 RCUWriter<ChannelList> writer (channels);
125 boost::shared_ptr<ChannelList> c = writer.get_copy();
127 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
138 AudioDiskstream::allocate_working_buffers()
140 assert(disk_io_frames() > 0);
142 _working_buffers_size = disk_io_frames();
143 _mixdown_buffer = new Sample[_working_buffers_size];
144 _gain_buffer = new gain_t[_working_buffers_size];
148 AudioDiskstream::free_working_buffers()
150 delete [] _mixdown_buffer;
151 delete [] _gain_buffer;
152 _working_buffers_size = 0;
158 AudioDiskstream::non_realtime_input_change ()
161 Glib::Mutex::Lock lm (state_lock);
163 if (input_change_pending == NoChange) {
168 RCUWriter<ChannelList> writer (channels);
169 boost::shared_ptr<ChannelList> c = writer.get_copy();
171 _n_channels.set(DataType::AUDIO, c->size());
173 if (_io->n_inputs().get(DataType::AUDIO) > _n_channels.get(DataType::AUDIO)) {
174 add_channel_to (c, _io->n_inputs().get(DataType::AUDIO) - _n_channels.get(DataType::AUDIO));
175 } else if (_io->n_inputs().get(DataType::AUDIO) < _n_channels.get(DataType::AUDIO)) {
176 remove_channel_from (c, _n_channels.get(DataType::AUDIO) - _io->n_inputs().get(DataType::AUDIO));
180 get_input_sources ();
181 set_capture_offset ();
183 if (first_input_change) {
184 set_align_style (_persistent_alignment_style);
185 first_input_change = false;
187 set_align_style_from_io ();
190 input_change_pending = NoChange;
192 /* implicit unlock */
195 /* reset capture files */
197 reset_write_sources (false);
199 /* now refill channel buffers */
201 if (speed() != 1.0f || speed() != -1.0f) {
202 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
204 seek (_session.transport_frame());
209 AudioDiskstream::get_input_sources ()
211 boost::shared_ptr<ChannelList> c = channels.reader();
214 ChannelList::iterator chan;
215 uint32_t ni = _io->n_inputs().get(DataType::AUDIO);
217 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
219 const char **connections = _io->input(n)->get_connections ();
221 if (connections == 0 || connections[0] == 0) {
223 if ((*chan)->source) {
224 // _source->disable_metering ();
230 (*chan)->source = dynamic_cast<AudioPort*>(
231 _session.engine().get_port_by_name (connections[0]) );
241 AudioDiskstream::find_and_use_playlist (const string& name)
243 boost::shared_ptr<AudioPlaylist> playlist;
245 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
246 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
250 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
254 return use_playlist (playlist);
258 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
260 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
262 Diskstream::use_playlist(playlist);
268 AudioDiskstream::use_new_playlist ()
271 boost::shared_ptr<AudioPlaylist> playlist;
273 if (!in_set_state && destructive()) {
278 newname = Playlist::bump_name (_playlist->name(), _session);
280 newname = Playlist::bump_name (_name, _session);
283 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
285 playlist->set_orig_diskstream_id (id());
286 return use_playlist (playlist);
294 AudioDiskstream::use_copy_playlist ()
296 assert(audio_playlist());
302 if (_playlist == 0) {
303 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
308 boost::shared_ptr<AudioPlaylist> playlist;
310 newname = Playlist::bump_name (_playlist->name(), _session);
312 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
313 playlist->set_orig_diskstream_id (id());
314 return use_playlist (playlist);
321 AudioDiskstream::setup_destructive_playlist ()
324 boost::shared_ptr<ChannelList> c = channels.reader();
326 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
327 srcs.push_back ((*chan)->write_source);
330 /* a single full-sized region */
332 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
333 _playlist->add_region (region, srcs.front()->natural_position());
337 AudioDiskstream::use_destructive_playlist ()
339 /* this is called from the XML-based constructor or ::set_destructive. when called,
340 we already have a playlist and a region, but we need to
341 set up our sources for write. we use the sources associated
342 with the (presumed single, full-extent) region.
345 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
348 reset_write_sources (false, true);
352 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
355 throw failed_constructor();
358 /* be sure to stretch the region out to the maximum length */
360 region->set_length (max_frames - region->position(), this);
363 ChannelList::iterator chan;
364 boost::shared_ptr<ChannelList> c = channels.reader();
366 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
367 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
368 assert((*chan)->write_source);
369 (*chan)->write_source->set_allow_remove_if_empty (false);
371 /* this might be false if we switched modes, so force it */
373 (*chan)->write_source->set_destructive (true);
376 /* the source list will never be reset for a destructive track */
380 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
382 int possibly_recording;
385 const int transport_rolling = 0x4;
386 const int track_rec_enabled = 0x2;
387 const int global_rec_enabled = 0x1;
389 /* merge together the 3 factors that affect record status, and compute
393 rolling = _session.transport_speed() != 0.0f;
394 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
395 change = possibly_recording ^ last_possibly_recording;
397 if (possibly_recording == last_possibly_recording) {
403 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
405 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
406 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
408 /* starting to record: compute first+last frames */
410 first_recordable_frame = transport_frame + _capture_offset;
411 last_recordable_frame = max_frames;
412 capture_start_frame = transport_frame;
414 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
416 /* was stopped, now rolling (and recording) */
418 if (_alignment_style == ExistingMaterial) {
419 first_recordable_frame += _session.worst_output_latency();
421 first_recordable_frame += _roll_delay;
426 /* was rolling, but record state changed */
428 if (_alignment_style == ExistingMaterial) {
430 if (!Config->get_punch_in()) {
432 /* manual punch in happens at the correct transport frame
433 because the user hit a button. but to get alignment correct
434 we have to back up the position of the new region to the
435 appropriate spot given the roll delay.
438 capture_start_frame -= _roll_delay;
440 /* XXX paul notes (august 2005): i don't know why
444 first_recordable_frame += _capture_offset;
448 /* autopunch toggles recording at the precise
449 transport frame, and then the DS waits
450 to start recording for a time that depends
451 on the output latency.
454 first_recordable_frame += _session.worst_output_latency();
459 if (Config->get_punch_in()) {
460 first_recordable_frame += _roll_delay;
462 capture_start_frame -= _roll_delay;
468 if (_flags & Recordable) {
469 boost::shared_ptr<ChannelList> c = channels.reader();
470 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
472 RingBufferNPT<CaptureTransition>::rw_vector transvec;
473 (*chan)->capture_transition_buf->get_write_vector(&transvec);
475 if (transvec.len[0] > 0) {
476 transvec.buf[0]->type = CaptureStart;
477 transvec.buf[0]->capture_val = capture_start_frame;
478 (*chan)->capture_transition_buf->increment_write_ptr(1);
482 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
488 } else if (!record_enabled() || !can_record) {
492 last_recordable_frame = transport_frame + _capture_offset;
494 if (_alignment_style == ExistingMaterial) {
495 last_recordable_frame += _session.worst_output_latency();
497 last_recordable_frame += _roll_delay;
501 last_possibly_recording = possibly_recording;
505 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
508 boost::shared_ptr<ChannelList> c = channels.reader();
509 ChannelList::iterator chan;
511 nframes_t rec_offset = 0;
512 nframes_t rec_nframes = 0;
513 bool nominally_recording;
514 bool re = record_enabled ();
515 bool collect_playback = false;
517 /* if we've already processed the frames corresponding to this call,
518 just return. this allows multiple routes that are taking input
519 from this diskstream to call our ::process() method, but have
520 this stuff only happen once. more commonly, it allows both
521 the AudioTrack that is using this AudioDiskstream *and* the Session
522 to call process() without problems.
529 commit_should_unlock = false;
531 check_record_status (transport_frame, nframes, can_record);
533 nominally_recording = (can_record && re);
540 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
541 must always be called as a pair. The only exception is if this function
542 returns a non-zero value, in which case, ::commit should not be called.
545 // If we can't take the state lock return.
546 if (!state_lock.trylock()) {
549 commit_should_unlock = true;
550 adjust_capture_position = 0;
552 for (chan = c->begin(); chan != c->end(); ++chan) {
553 (*chan)->current_capture_buffer = 0;
554 (*chan)->current_playback_buffer = 0;
557 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
560 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
567 case OverlapInternal:
568 /* ---------- recrange
571 rec_nframes = nframes;
576 /* |--------| recrange
579 rec_nframes = transport_frame + nframes - first_recordable_frame;
581 rec_offset = first_recordable_frame - transport_frame;
586 /* |--------| recrange
589 rec_nframes = last_recordable_frame - transport_frame;
593 case OverlapExternal:
594 /* |--------| recrange
595 -------------- transrange
597 rec_nframes = last_recordable_frame - last_recordable_frame;
598 rec_offset = first_recordable_frame - transport_frame;
602 if (rec_nframes && !was_recording) {
603 capture_captured = 0;
604 was_recording = true;
609 if (can_record && !_last_capture_regions.empty()) {
610 _last_capture_regions.clear ();
613 if (nominally_recording || rec_nframes) {
615 uint32_t limit = _io->n_inputs ().get(DataType::AUDIO);
617 /* one or more ports could already have been removed from _io, but our
618 channel setup hasn't yet been updated. prevent us from trying to
619 use channels that correspond to missing ports. note that the
620 process callback (from which this is called) is always atomic
621 with respect to port removal/addition.
624 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
626 ChannelInfo* chaninfo (*chan);
628 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
630 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
632 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
634 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
638 AudioPort* const ap = _io->audio_input(n);
640 assert(rec_nframes <= ap->get_audio_buffer().capacity());
641 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer().data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
645 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
647 if (rec_nframes > total) {
652 AudioPort* const ap = _io->audio_input(n);
655 Sample* buf = ap->get_audio_buffer().data(nframes, offset);
656 nframes_t first = chaninfo->capture_vector.len[0];
658 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
659 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
660 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
661 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
663 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
670 finish_capture (rec_monitors_input, c);
677 /* data will be written to disk */
679 if (rec_nframes == nframes && rec_offset == 0) {
681 for (chan = c->begin(); chan != c->end(); ++chan) {
682 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
685 playback_distance = nframes;
690 /* we can't use the capture buffer as the playback buffer, because
691 we recorded only a part of the current process' cycle data
695 collect_playback = true;
698 adjust_capture_position = rec_nframes;
700 } else if (nominally_recording) {
702 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
704 for (chan = c->begin(); chan != c->end(); ++chan) {
705 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
708 playback_distance = nframes;
712 collect_playback = true;
715 if (collect_playback) {
717 /* we're doing playback */
719 nframes_t necessary_samples;
721 /* no varispeed playback if we're recording, because the output .... TBD */
723 if (rec_nframes == 0 && _actual_speed != 1.0f) {
724 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
726 necessary_samples = nframes;
729 for (chan = c->begin(); chan != c->end(); ++chan) {
730 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
735 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
737 ChannelInfo* chaninfo (*chan);
739 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
741 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
744 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
746 if (necessary_samples > total) {
752 memcpy ((char *) chaninfo->playback_wrap_buffer, chaninfo->playback_vector.buf[0],
753 chaninfo->playback_vector.len[0] * sizeof (Sample));
754 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0], chaninfo->playback_vector.buf[1],
755 (necessary_samples - chaninfo->playback_vector.len[0]) * sizeof (Sample));
757 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
762 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
764 uint64_t phase = last_phase;
767 // Linearly interpolate into the alt buffer
768 // using 40.24 fixp maths (swh)
770 for (chan = c->begin(); chan != c->end(); ++chan) {
773 ChannelInfo* chaninfo (*chan);
778 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
780 fr = (phase & 0xFFFFFF) / 16777216.0f;
781 chaninfo->speed_buffer[outsample] =
782 chaninfo->current_playback_buffer[i] * (1.0f - fr) +
783 chaninfo->current_playback_buffer[i+1] * fr;
787 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
790 playback_distance = i + 1;
791 last_phase = (phase & 0xFFFFFF);
794 playback_distance = nframes;
806 /* we're exiting with failure, so ::commit will not
807 be called. unlock the state lock.
810 commit_should_unlock = false;
818 AudioDiskstream::commit (nframes_t nframes)
820 bool need_butler = false;
822 if (_actual_speed < 0.0) {
823 playback_sample -= playback_distance;
825 playback_sample += playback_distance;
828 boost::shared_ptr<ChannelList> c = channels.reader();
829 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
831 (*chan)->playback_buf->increment_read_ptr (playback_distance);
833 if (adjust_capture_position) {
834 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
838 if (adjust_capture_position != 0) {
839 capture_captured += adjust_capture_position;
840 adjust_capture_position = 0;
844 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
846 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
847 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
850 if (commit_should_unlock) {
860 AudioDiskstream::set_pending_overwrite (bool yn)
862 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
864 pending_overwrite = yn;
866 overwrite_frame = playback_sample;
867 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
871 AudioDiskstream::overwrite_existing_buffers ()
873 boost::shared_ptr<ChannelList> c = channels.reader();
874 Sample* mixdown_buffer;
877 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
879 overwrite_queued = false;
881 /* assume all are the same size */
882 nframes_t size = c->front()->playback_buf->bufsize();
884 mixdown_buffer = new Sample[size];
885 gain_buffer = new float[size];
887 /* reduce size so that we can fill the buffer correctly. */
893 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
895 start = overwrite_frame;
896 nframes_t cnt = size;
898 /* to fill the buffer without resetting the playback sample, we need to
899 do it one or two chunks (normally two).
901 |----------------------------------------------------------------------|
905 |<- second chunk->||<----------------- first chunk ------------------>|
909 nframes_t to_read = size - overwrite_offset;
911 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
912 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
913 _id, size, playback_sample) << endmsg;
921 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
922 start, cnt, *chan, n, reversed)) {
923 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
924 _id, size, playback_sample) << endmsg;
933 pending_overwrite = false;
934 delete [] gain_buffer;
935 delete [] mixdown_buffer;
940 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
944 ChannelList::iterator chan;
945 boost::shared_ptr<ChannelList> c = channels.reader();
947 Glib::Mutex::Lock lm (state_lock);
949 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
950 (*chan)->playback_buf->reset ();
951 (*chan)->capture_buf->reset ();
954 /* can't rec-enable in destructive mode if transport is before start */
956 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
957 disengage_record_enable ();
960 playback_sample = frame;
963 if (complete_refill) {
964 while ((ret = do_refill_with_alloc ()) > 0) ;
966 ret = do_refill_with_alloc ();
973 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
975 ChannelList::iterator chan;
976 boost::shared_ptr<ChannelList> c = channels.reader();
978 for (chan = c->begin(); chan != c->end(); ++chan) {
979 if ((*chan)->playback_buf->read_space() < distance) {
987 AudioDiskstream::internal_playback_seek (nframes_t distance)
989 ChannelList::iterator chan;
990 boost::shared_ptr<ChannelList> c = channels.reader();
992 for (chan = c->begin(); chan != c->end(); ++chan) {
993 (*chan)->playback_buf->increment_read_ptr (distance);
996 first_recordable_frame += distance;
997 playback_sample += distance;
1003 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1004 ChannelInfo* channel_info, int channel, bool reversed)
1006 nframes_t this_read = 0;
1007 bool reloop = false;
1008 nframes_t loop_end = 0;
1009 nframes_t loop_start = 0;
1010 nframes_t loop_length = 0;
1011 nframes_t offset = 0;
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 _read_data_count = _playlist->read_data_count();
1078 swap_by_ptr (buf, buf + this_read - 1);
1082 /* if we read to the end of the loop, go back to the beginning */
1092 offset += this_read;
1099 AudioDiskstream::do_refill_with_alloc ()
1101 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1102 float* gain_buf = new float[disk_io_chunk_frames];
1104 int ret = _do_refill(mix_buf, gain_buf);
1113 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1117 RingBufferNPT<Sample>::rw_vector vector;
1118 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1119 nframes_t total_space;
1120 nframes_t zero_fill;
1122 ChannelList::iterator i;
1123 boost::shared_ptr<ChannelList> c = channels.reader();
1130 assert(mixdown_buffer);
1131 assert(gain_buffer);
1138 c->front()->playback_buf->get_write_vector (&vector);
1140 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1144 /* if there are 2+ chunks of disk i/o possible for
1145 this track, let the caller know so that it can arrange
1146 for us to be called again, ASAP.
1149 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1153 /* if we're running close to normal speed and there isn't enough
1154 space to do disk_io_chunk_frames of I/O, then don't bother.
1156 at higher speeds, just do it because the sync between butler
1157 and audio thread may not be good enough.
1160 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1164 /* when slaved, don't try to get too close to the read pointer. this
1165 leaves space for the buffer reversal to have something useful to
1169 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1173 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1175 total_space = min (disk_io_chunk_frames, total_space);
1179 if (file_frame == 0) {
1181 /* at start: nothing to do but fill with silence */
1183 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1185 ChannelInfo* chan (*i);
1186 chan->playback_buf->get_write_vector (&vector);
1187 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1188 if (vector.len[1]) {
1189 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1191 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1196 if (file_frame < total_space) {
1198 /* too close to the start: read what we can,
1199 and then zero fill the rest
1202 zero_fill = total_space - file_frame;
1203 total_space = file_frame;
1213 if (file_frame == max_frames) {
1215 /* at end: nothing to do but fill with silence */
1217 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1219 ChannelInfo* chan (*i);
1220 chan->playback_buf->get_write_vector (&vector);
1221 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1222 if (vector.len[1]) {
1223 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1225 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1230 if (file_frame > max_frames - total_space) {
1232 /* to close to the end: read what we can, and zero fill the rest */
1234 zero_fill = total_space - (max_frames - file_frame);
1235 total_space = max_frames - file_frame;
1242 nframes_t file_frame_tmp = 0;
1244 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1246 ChannelInfo* chan (*i);
1249 nframes_t len1, len2;
1251 chan->playback_buf->get_write_vector (&vector);
1253 if (vector.len[0] > disk_io_chunk_frames) {
1255 /* we're not going to fill the first chunk, so certainly do not bother with the
1256 other part. it won't be connected with the part we do fill, as in:
1258 .... => writable space
1259 ++++ => readable space
1260 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1262 |......|+++++++++++++|...............................|
1267 So, just pretend that the buf1 part isn't there.
1277 file_frame_tmp = file_frame;
1279 buf1 = vector.buf[0];
1280 len1 = vector.len[0];
1281 buf2 = vector.buf[1];
1282 len2 = vector.len[1];
1284 to_read = min (ts, len1);
1285 to_read = min (to_read, disk_io_chunk_frames);
1289 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1294 chan->playback_buf->increment_write_ptr (to_read);
1298 to_read = min (ts, len2);
1302 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1303 so read some or all of vector.len[1] as well.
1306 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1311 chan->playback_buf->increment_write_ptr (to_read);
1320 file_frame = file_frame_tmp;
1327 /** Flush pending data to disk.
1329 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1330 * of data to disk. it will never write more than that. If it writes that
1331 * much and there is more than that waiting to be written, it will return 1,
1332 * otherwise 0 on success or -1 on failure.
1334 * If there is less than disk_io_chunk_frames to be written, no data will be
1335 * written at all unless @a force_flush is true.
1338 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1342 RingBufferNPT<Sample>::rw_vector vector;
1343 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1346 _write_data_count = 0;
1348 transvec.buf[0] = 0;
1349 transvec.buf[1] = 0;
1353 boost::shared_ptr<ChannelList> c = channels.reader();
1354 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1356 (*chan)->capture_buf->get_read_vector (&vector);
1358 total = vector.len[0] + vector.len[1];
1360 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1364 /* if there are 2+ chunks of disk i/o possible for
1365 this track, let the caller know so that it can arrange
1366 for us to be called again, ASAP.
1368 if we are forcing a flush, then if there is* any* extra
1369 work, let the caller know.
1371 if we are no longer recording and there is any extra work,
1372 let the caller know too.
1375 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1379 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1381 // check the transition buffer when recording destructive
1382 // important that we get this after the capture buf
1384 if (destructive()) {
1385 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1386 size_t transcount = transvec.len[0] + transvec.len[1];
1387 bool have_start = false;
1390 for (ti=0; ti < transcount; ++ti) {
1391 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1393 if (captrans.type == CaptureStart) {
1394 // by definition, the first data we got above represents the given capture pos
1396 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1397 (*chan)->curr_capture_cnt = 0;
1401 else if (captrans.type == CaptureEnd) {
1403 // capture end, the capture_val represents total frames in capture
1405 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1407 // shorten to make the write a perfect fit
1408 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1410 if (nto_write < to_write) {
1411 ret = 1; // should we?
1413 to_write = nto_write;
1415 (*chan)->write_source->mark_capture_end ();
1417 // increment past this transition, but go no further
1422 // actually ends just beyond this chunk, so force more work
1430 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1434 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1435 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1439 (*chan)->capture_buf->increment_read_ptr (to_write);
1440 (*chan)->curr_capture_cnt += to_write;
1442 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1444 /* we wrote all of vector.len[0] but it wasn't an entire
1445 disk_io_chunk_frames of data, so arrange for some part
1446 of vector.len[1] to be flushed to disk as well.
1449 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1451 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1452 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1456 _write_data_count += (*chan)->write_source->write_data_count();
1458 (*chan)->capture_buf->increment_read_ptr (to_write);
1459 (*chan)->curr_capture_cnt += to_write;
1468 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1470 uint32_t buffer_position;
1471 bool more_work = true;
1473 boost::shared_ptr<AudioRegion> region;
1474 nframes_t total_capture;
1476 SourceList::iterator src;
1477 ChannelList::iterator chan;
1478 vector<CaptureInfo*>::iterator ci;
1479 boost::shared_ptr<ChannelList> c = channels.reader();
1481 bool mark_write_completed = false;
1483 finish_capture (true, c);
1485 /* butler is already stopped, but there may be work to do
1486 to flush remaining data to disk.
1489 while (more_work && !err) {
1490 switch (do_flush (Session::TransportContext, true)) {
1497 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1502 /* XXX is there anything we can do if err != 0 ? */
1503 Glib::Mutex::Lock lm (capture_info_lock);
1505 if (capture_info.empty()) {
1509 if (abort_capture) {
1511 if (destructive()) {
1515 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1517 if ((*chan)->write_source) {
1519 (*chan)->write_source->mark_for_remove ();
1520 (*chan)->write_source->drop_references ();
1521 (*chan)->write_source.reset ();
1524 /* new source set up in "out" below */
1530 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1531 total_capture += (*ci)->frames;
1534 /* figure out the name for this take */
1536 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1538 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1542 s->update_header (capture_info.front()->start, when, twhen);
1543 s->set_captured_for (_name);
1544 s->mark_immutable ();
1548 /* destructive tracks have a single, never changing region */
1550 if (destructive()) {
1552 /* send a signal that any UI can pick up to do the right thing. there is
1553 a small problem here in that a UI may need the peak data to be ready
1554 for the data that was recorded and this isn't interlocked with that
1555 process. this problem is deferred to the UI.
1558 _playlist->Modified();
1562 string whole_file_region_name;
1563 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1565 /* Register a new region with the Session that
1566 describes the entire source. Do this first
1567 so that any sub-regions will obviously be
1568 children of this one (later!)
1572 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, c->front()->write_source->last_capture_start_frame(), total_capture,
1573 whole_file_region_name,
1574 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1576 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1577 region->special_set_position (capture_info.front()->start);
1581 catch (failed_constructor& err) {
1582 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1586 _last_capture_regions.push_back (region);
1588 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1590 XMLNode &before = _playlist->get_state();
1591 _playlist->freeze ();
1593 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1597 _session.region_name (region_name, whole_file_region_name, false);
1599 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1602 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1603 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1606 catch (failed_constructor& err) {
1607 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1608 continue; /* XXX is this OK? */
1611 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1613 _last_capture_regions.push_back (region);
1615 i_am_the_modifier++;
1616 _playlist->add_region (region, (*ci)->start);
1617 i_am_the_modifier--;
1619 buffer_position += (*ci)->frames;
1623 XMLNode &after = _playlist->get_state();
1624 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1627 mark_write_completed = true;
1630 reset_write_sources (mark_write_completed);
1634 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1638 capture_info.clear ();
1639 capture_start_frame = 0;
1643 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1645 was_recording = false;
1647 if (capture_captured == 0) {
1651 if (recordable() && destructive()) {
1652 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1654 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1655 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1658 if (transvec.len[0] > 0) {
1659 transvec.buf[0]->type = CaptureEnd;
1660 transvec.buf[0]->capture_val = capture_captured;
1661 (*chan)->capture_transition_buf->increment_write_ptr(1);
1665 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1671 CaptureInfo* ci = new CaptureInfo;
1673 ci->start = capture_start_frame;
1674 ci->frames = capture_captured;
1676 /* XXX theoretical race condition here. Need atomic exchange ?
1677 However, the circumstances when this is called right
1678 now (either on record-disable or transport_stopped)
1679 mean that no actual race exists. I think ...
1680 We now have a capture_info_lock, but it is only to be used
1681 to synchronize in the transport_stop and the capture info
1682 accessors, so that invalidation will not occur (both non-realtime).
1685 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1687 capture_info.push_back (ci);
1688 capture_captured = 0;
1692 AudioDiskstream::set_record_enabled (bool yn)
1694 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs().get(DataType::AUDIO) == 0) {
1698 /* can't rec-enable in destructive mode if transport is before start */
1700 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1704 if (yn && channels.reader()->front()->source == 0) {
1706 /* pick up connections not initiated *from* the IO object
1707 we're associated with.
1710 get_input_sources ();
1713 /* yes, i know that this not proof against race conditions, but its
1714 good enough. i think.
1717 if (record_enabled() != yn) {
1719 engage_record_enable ();
1721 disengage_record_enable ();
1727 AudioDiskstream::engage_record_enable ()
1729 bool rolling = _session.transport_speed() != 0.0f;
1730 boost::shared_ptr<ChannelList> c = channels.reader();
1732 g_atomic_int_set (&_record_enabled, 1);
1733 capturing_sources.clear ();
1735 if (Config->get_monitoring_model() == HardwareMonitoring) {
1737 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1738 if ((*chan)->source) {
1739 (*chan)->source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1741 capturing_sources.push_back ((*chan)->write_source);
1745 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1746 capturing_sources.push_back ((*chan)->write_source);
1750 RecordEnableChanged (); /* EMIT SIGNAL */
1754 AudioDiskstream::disengage_record_enable ()
1756 g_atomic_int_set (&_record_enabled, 0);
1757 boost::shared_ptr<ChannelList> c = channels.reader();
1758 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1759 if (Config->get_monitoring_model() == HardwareMonitoring) {
1760 if ((*chan)->source) {
1761 (*chan)->source->ensure_monitor_input (false);
1765 capturing_sources.clear ();
1766 RecordEnableChanged (); /* EMIT SIGNAL */
1770 AudioDiskstream::get_state ()
1772 XMLNode* node = new XMLNode ("AudioDiskstream");
1774 LocaleGuard lg (X_("POSIX"));
1775 boost::shared_ptr<ChannelList> c = channels.reader();
1777 node->add_property ("flags", enum_2_string (_flags));
1779 snprintf (buf, sizeof(buf), "%zd", c->size());
1780 node->add_property ("channels", buf);
1782 node->add_property ("playlist", _playlist->name());
1784 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1785 node->add_property ("speed", buf);
1787 node->add_property("name", _name);
1788 id().print (buf, sizeof (buf));
1789 node->add_property("id", buf);
1791 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1793 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1794 XMLNode* cs_grandchild;
1796 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1797 cs_grandchild = new XMLNode (X_("file"));
1798 cs_grandchild->add_property (X_("path"), (*i)->path());
1799 cs_child->add_child_nocopy (*cs_grandchild);
1802 /* store the location where capture will start */
1806 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1807 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1809 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1812 cs_child->add_property (X_("at"), buf);
1813 node->add_child_nocopy (*cs_child);
1817 node->add_child_copy (*_extra_xml);
1824 AudioDiskstream::set_state (const XMLNode& node)
1826 const XMLProperty* prop;
1827 XMLNodeList nlist = node.children();
1828 XMLNodeIterator niter;
1829 uint32_t nchans = 1;
1830 XMLNode* capture_pending_node = 0;
1831 LocaleGuard lg (X_("POSIX"));
1833 in_set_state = true;
1835 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1836 if ((*niter)->name() == IO::state_node_name) {
1837 deprecated_io_node = new XMLNode (**niter);
1840 if ((*niter)->name() == X_("CapturingSources")) {
1841 capture_pending_node = *niter;
1845 /* prevent write sources from being created */
1847 in_set_state = true;
1849 if ((prop = node.property ("name")) != 0) {
1850 _name = prop->value();
1853 if (deprecated_io_node) {
1854 if ((prop = deprecated_io_node->property ("id")) != 0) {
1855 _id = prop->value ();
1858 if ((prop = node.property ("id")) != 0) {
1859 _id = prop->value ();
1863 if ((prop = node.property ("flags")) != 0) {
1864 _flags = Flag (string_2_enum (prop->value(), _flags));
1867 if ((prop = node.property ("channels")) != 0) {
1868 nchans = atoi (prop->value().c_str());
1871 // create necessary extra channels
1872 // we are always constructed with one and we always need one
1874 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1876 if (nchans > _n_channels.get(DataType::AUDIO)) {
1878 add_channel (nchans - _n_channels.get(DataType::AUDIO));
1880 } else if (nchans < _n_channels.get(DataType::AUDIO)) {
1882 remove_channel (_n_channels.get(DataType::AUDIO) - nchans);
1885 if ((prop = node.property ("playlist")) == 0) {
1890 bool had_playlist = (_playlist != 0);
1892 if (find_and_use_playlist (prop->value())) {
1896 if (!had_playlist) {
1897 _playlist->set_orig_diskstream_id (_id);
1900 if (!destructive() && capture_pending_node) {
1901 /* destructive streams have one and only one source per channel,
1902 and so they never end up in pending capture in any useful
1905 use_pending_capture_data (*capture_pending_node);
1910 if ((prop = node.property ("speed")) != 0) {
1911 double sp = atof (prop->value().c_str());
1913 if (realtime_set_speed (sp, false)) {
1914 non_realtime_set_speed ();
1918 in_set_state = false;
1920 /* make sure this is clear before we do anything else */
1922 capturing_sources.clear ();
1924 /* write sources are handled when we handle the input set
1925 up of the IO that owns this DS (::non_realtime_input_change())
1928 in_set_state = false;
1934 AudioDiskstream::use_new_write_source (uint32_t n)
1936 boost::shared_ptr<ChannelList> c = channels.reader();
1938 if (!recordable()) {
1942 if (n >= c->size()) {
1943 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1947 ChannelInfo* chan = (*c)[n];
1949 if (chan->write_source) {
1950 chan->write_source->done_with_peakfile_writes ();
1951 chan->write_source->set_allow_remove_if_empty (true);
1952 chan->write_source.reset ();
1956 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1957 throw failed_constructor();
1961 catch (failed_constructor &err) {
1962 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1963 chan->write_source.reset ();
1967 /* do not remove destructive files even if they are empty */
1969 chan->write_source->set_allow_remove_if_empty (!destructive());
1975 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
1977 ChannelList::iterator chan;
1978 boost::shared_ptr<ChannelList> c = channels.reader();
1981 if (!recordable()) {
1985 capturing_sources.clear ();
1987 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1988 if (!destructive()) {
1990 if ((*chan)->write_source && mark_write_complete) {
1991 (*chan)->write_source->mark_streaming_write_completed ();
1993 use_new_write_source (n);
1995 if (record_enabled()) {
1996 capturing_sources.push_back ((*chan)->write_source);
2000 if ((*chan)->write_source == 0) {
2001 use_new_write_source (n);
2006 if (destructive()) {
2008 /* we now have all our write sources set up, so create the
2009 playlist's single region.
2012 if (_playlist->empty()) {
2013 setup_destructive_playlist ();
2019 AudioDiskstream::rename_write_sources ()
2021 ChannelList::iterator chan;
2022 boost::shared_ptr<ChannelList> c = channels.reader();
2025 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2026 if ((*chan)->write_source != 0) {
2027 (*chan)->write_source->set_name (_name, destructive());
2028 /* XXX what to do if one of them fails ? */
2036 AudioDiskstream::set_block_size (nframes_t nframes)
2038 if (_session.get_block_size() > speed_buffer_size) {
2039 speed_buffer_size = _session.get_block_size();
2040 boost::shared_ptr<ChannelList> c = channels.reader();
2042 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2043 if ((*chan)->speed_buffer) delete [] (*chan)->speed_buffer;
2044 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2047 allocate_temporary_buffers ();
2051 AudioDiskstream::allocate_temporary_buffers ()
2053 /* make sure the wrap buffer is at least large enough to deal
2054 with the speeds up to 1.2, to allow for micro-variation
2055 when slaving to MTC, SMPTE etc.
2058 double sp = max (fabsf (_actual_speed), 1.2f);
2059 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2061 if (required_wrap_size > wrap_buffer_size) {
2063 boost::shared_ptr<ChannelList> c = channels.reader();
2065 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2066 if ((*chan)->playback_wrap_buffer) delete [] (*chan)->playback_wrap_buffer;
2067 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2068 if ((*chan)->capture_wrap_buffer) delete [] (*chan)->capture_wrap_buffer;
2069 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2072 wrap_buffer_size = required_wrap_size;
2077 AudioDiskstream::monitor_input (bool yn)
2079 boost::shared_ptr<ChannelList> c = channels.reader();
2081 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2083 if ((*chan)->source) {
2084 (*chan)->source->ensure_monitor_input (yn);
2090 AudioDiskstream::set_align_style_from_io ()
2092 bool have_physical = false;
2098 get_input_sources ();
2100 boost::shared_ptr<ChannelList> c = channels.reader();
2102 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2103 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2104 have_physical = true;
2109 if (have_physical) {
2110 set_align_style (ExistingMaterial);
2112 set_align_style (CaptureTime);
2117 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2119 while (how_many--) {
2120 c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2123 _n_channels.set(DataType::AUDIO, c->size());
2129 AudioDiskstream::add_channel (uint32_t how_many)
2131 RCUWriter<ChannelList> writer (channels);
2132 boost::shared_ptr<ChannelList> c = writer.get_copy();
2134 return add_channel_to (c, how_many);
2138 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2140 while (--how_many && !c->empty()) {
2145 _n_channels.set(DataType::AUDIO, c->size());
2151 AudioDiskstream::remove_channel (uint32_t how_many)
2153 RCUWriter<ChannelList> writer (channels);
2154 boost::shared_ptr<ChannelList> c = writer.get_copy();
2156 return remove_channel_from (c, how_many);
2160 AudioDiskstream::playback_buffer_load () const
2162 boost::shared_ptr<ChannelList> c = channels.reader();
2164 return (float) ((double) c->front()->playback_buf->read_space()/
2165 (double) c->front()->playback_buf->bufsize());
2169 AudioDiskstream::capture_buffer_load () const
2171 boost::shared_ptr<ChannelList> c = channels.reader();
2173 return (float) ((double) c->front()->capture_buf->write_space()/
2174 (double) c->front()->capture_buf->bufsize());
2178 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2180 const XMLProperty* prop;
2181 XMLNodeList nlist = node.children();
2182 XMLNodeIterator niter;
2183 boost::shared_ptr<AudioFileSource> fs;
2184 boost::shared_ptr<AudioFileSource> first_fs;
2185 SourceList pending_sources;
2188 if ((prop = node.property (X_("at"))) == 0) {
2192 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2196 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2197 if ((*niter)->name() == X_("file")) {
2199 if ((prop = (*niter)->property (X_("path"))) == 0) {
2204 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2205 SourceFactory::createWritable (DataType::AUDIO, _session, prop->value(), false, _session.frame_rate()));
2208 catch (failed_constructor& err) {
2209 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2210 _name, prop->value())
2215 pending_sources.push_back (fs);
2217 if (first_fs == 0) {
2221 fs->set_captured_for (_name);
2225 if (pending_sources.size() == 0) {
2226 /* nothing can be done */
2230 if (pending_sources.size() != _n_channels.get(DataType::AUDIO)) {
2231 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2236 boost::shared_ptr<AudioRegion> region;
2239 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2240 region_name_from_path (first_fs->name(), true),
2241 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2242 region->special_set_position (0);
2245 catch (failed_constructor& err) {
2246 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2254 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2257 catch (failed_constructor& err) {
2258 error << string_compose (_("%1: cannot create region from pending capture sources"),
2265 _playlist->add_region (region, position);
2271 AudioDiskstream::set_destructive (bool yn)
2273 bool bounce_ignored;
2275 if (yn != destructive()) {
2278 /* requestor should already have checked this and
2279 bounced if necessary and desired
2281 if (!can_become_destructive (bounce_ignored)) {
2284 _flags = Flag (_flags | Destructive);
2285 use_destructive_playlist ();
2287 _flags = Flag (_flags & ~Destructive);
2288 reset_write_sources (true, true);
2296 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2299 requires_bounce = false;
2303 /* is there only one region ? */
2305 if (_playlist->n_regions() != 1) {
2306 requires_bounce = true;
2310 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2313 /* do the source(s) for the region cover the session start position ? */
2315 if (first->position() != _session.current_start_frame()) {
2316 if (first->start() > _session.current_start_frame()) {
2317 requires_bounce = true;
2322 /* is the source used by only 1 playlist ? */
2324 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2328 if (afirst->source()->used() > 1) {
2329 requires_bounce = true;
2333 requires_bounce = false;
2337 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2341 current_capture_buffer = 0;
2342 current_playback_buffer = 0;
2343 curr_capture_cnt = 0;
2345 speed_buffer = new Sample[speed_size];
2346 playback_wrap_buffer = new Sample[wrap_size];
2347 capture_wrap_buffer = new Sample[wrap_size];
2349 playback_buf = new RingBufferNPT<Sample> (bufsize);
2350 capture_buf = new RingBufferNPT<Sample> (bufsize);
2351 capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
2353 /* touch the ringbuffer buffers, which will cause
2354 them to be mapped into locked physical RAM if
2355 we're running with mlockall(). this doesn't do
2359 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2360 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2361 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2364 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2367 write_source.reset ();
2371 delete [] speed_buffer;
2375 if (playback_wrap_buffer) {
2376 delete [] playback_wrap_buffer;
2377 playback_wrap_buffer = 0;
2380 if (capture_wrap_buffer) {
2381 delete [] capture_wrap_buffer;
2382 capture_wrap_buffer = 0;
2386 delete playback_buf;
2395 if (capture_transition_buf) {
2396 delete capture_transition_buf;
2397 capture_transition_buf = 0;