2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include <pbd/error.h>
34 #include <glibmm/thread.h>
35 #include <pbd/xml++.h>
36 #include <pbd/memento_command.h>
37 #include <pbd/enumwriter.h>
38 #include <pbd/stacktrace.h>
40 #include <ardour/ardour.h>
41 #include <ardour/audioengine.h>
42 #include <ardour/audio_diskstream.h>
43 #include <ardour/utils.h>
44 #include <ardour/configuration.h>
45 #include <ardour/audiofilesource.h>
46 #include <ardour/send.h>
47 #include <ardour/region_factory.h>
48 #include <ardour/audioplaylist.h>
49 #include <ardour/playlist_factory.h>
50 #include <ardour/cycle_timer.h>
51 #include <ardour/audioregion.h>
52 #include <ardour/audio_port.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 == ChanCount(DataType::AUDIO, 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.set(DataType::AUDIO, c->size());
172 if (_io->n_inputs().n_audio() > _n_channels.n_audio()) {
173 add_channel_to (c, _io->n_inputs().n_audio() - _n_channels.n_audio());
174 } else if (_io->n_inputs().n_audio() < _n_channels.n_audio()) {
175 remove_channel_from (c, _n_channels.n_audio() - _io->n_inputs().n_audio());
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().n_audio();
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 = dynamic_cast<AudioPort*>(
230 _session.engine().get_port_by_name (connections[0]) );
240 AudioDiskstream::find_and_use_playlist (const string& name)
242 boost::shared_ptr<AudioPlaylist> playlist;
244 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
245 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
249 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
253 return use_playlist (playlist);
257 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
259 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
261 Diskstream::use_playlist(playlist);
267 AudioDiskstream::use_new_playlist ()
270 boost::shared_ptr<AudioPlaylist> playlist;
272 if (!in_set_state && destructive()) {
277 newname = Playlist::bump_name (_playlist->name(), _session);
279 newname = Playlist::bump_name (_name, _session);
282 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
284 playlist->set_orig_diskstream_id (id());
285 return use_playlist (playlist);
293 AudioDiskstream::use_copy_playlist ()
295 assert(audio_playlist());
301 if (_playlist == 0) {
302 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
307 boost::shared_ptr<AudioPlaylist> playlist;
309 newname = Playlist::bump_name (_playlist->name(), _session);
311 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
312 playlist->set_orig_diskstream_id (id());
313 return use_playlist (playlist);
320 AudioDiskstream::setup_destructive_playlist ()
323 boost::shared_ptr<ChannelList> c = channels.reader();
325 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
326 srcs.push_back ((*chan)->write_source);
329 /* a single full-sized region */
331 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
332 _playlist->add_region (region, srcs.front()->natural_position());
336 AudioDiskstream::use_destructive_playlist ()
338 /* this is called from the XML-based constructor or ::set_destructive. when called,
339 we already have a playlist and a region, but we need to
340 set up our sources for write. we use the sources associated
341 with the (presumed single, full-extent) region.
344 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
347 reset_write_sources (false, true);
351 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
354 throw failed_constructor();
357 /* be sure to stretch the region out to the maximum length */
359 region->set_length (max_frames - region->position(), this);
362 ChannelList::iterator chan;
363 boost::shared_ptr<ChannelList> c = channels.reader();
365 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
366 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
367 assert((*chan)->write_source);
368 (*chan)->write_source->set_allow_remove_if_empty (false);
370 /* this might be false if we switched modes, so force it */
372 (*chan)->write_source->set_destructive (true);
375 /* the source list will never be reset for a destructive track */
379 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
381 int possibly_recording;
384 const int transport_rolling = 0x4;
385 const int track_rec_enabled = 0x2;
386 const int global_rec_enabled = 0x1;
388 /* merge together the 3 factors that affect record status, and compute
392 rolling = _session.transport_speed() != 0.0f;
393 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
394 change = possibly_recording ^ last_possibly_recording;
396 if (possibly_recording == last_possibly_recording) {
402 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
404 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
405 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
407 /* starting to record: compute first+last frames */
409 first_recordable_frame = transport_frame + _capture_offset;
410 last_recordable_frame = max_frames;
411 capture_start_frame = transport_frame;
413 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
415 /* was stopped, now rolling (and recording) */
417 if (_alignment_style == ExistingMaterial) {
418 first_recordable_frame += _session.worst_output_latency();
420 first_recordable_frame += _roll_delay;
425 /* was rolling, but record state changed */
427 if (_alignment_style == ExistingMaterial) {
429 if (!Config->get_punch_in()) {
431 /* manual punch in happens at the correct transport frame
432 because the user hit a button. but to get alignment correct
433 we have to back up the position of the new region to the
434 appropriate spot given the roll delay.
437 capture_start_frame -= _roll_delay;
439 /* XXX paul notes (august 2005): i don't know why
443 first_recordable_frame += _capture_offset;
447 /* autopunch toggles recording at the precise
448 transport frame, and then the DS waits
449 to start recording for a time that depends
450 on the output latency.
453 first_recordable_frame += _session.worst_output_latency();
458 if (Config->get_punch_in()) {
459 first_recordable_frame += _roll_delay;
461 capture_start_frame -= _roll_delay;
467 if (recordable() && destructive()) {
468 boost::shared_ptr<ChannelList> c = channels.reader();
469 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
471 RingBufferNPT<CaptureTransition>::rw_vector transvec;
472 (*chan)->capture_transition_buf->get_write_vector(&transvec);
474 if (transvec.len[0] > 0) {
475 transvec.buf[0]->type = CaptureStart;
476 transvec.buf[0]->capture_val = capture_start_frame;
477 (*chan)->capture_transition_buf->increment_write_ptr(1);
481 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
487 } else if (!record_enabled() || !can_record) {
491 last_recordable_frame = transport_frame + _capture_offset;
493 if (_alignment_style == ExistingMaterial) {
494 last_recordable_frame += _session.worst_output_latency();
496 last_recordable_frame += _roll_delay;
500 last_possibly_recording = possibly_recording;
504 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
507 boost::shared_ptr<ChannelList> c = channels.reader();
508 ChannelList::iterator chan;
510 nframes_t rec_offset = 0;
511 nframes_t rec_nframes = 0;
512 bool nominally_recording;
513 bool re = record_enabled ();
514 bool collect_playback = false;
516 /* if we've already processed the frames corresponding to this call,
517 just return. this allows multiple routes that are taking input
518 from this diskstream to call our ::process() method, but have
519 this stuff only happen once. more commonly, it allows both
520 the AudioTrack that is using this AudioDiskstream *and* the Session
521 to call process() without problems.
528 commit_should_unlock = false;
530 check_record_status (transport_frame, nframes, can_record);
532 nominally_recording = (can_record && re);
539 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
540 must always be called as a pair. The only exception is if this function
541 returns a non-zero value, in which case, ::commit should not be called.
544 // If we can't take the state lock return.
545 if (!state_lock.trylock()) {
548 commit_should_unlock = true;
549 adjust_capture_position = 0;
551 for (chan = c->begin(); chan != c->end(); ++chan) {
552 (*chan)->current_capture_buffer = 0;
553 (*chan)->current_playback_buffer = 0;
556 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
559 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
560 if (last_recordable_frame < first_recordable_frame) {
561 last_recordable_frame = max_frames;
564 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
571 case OverlapInternal:
572 /* ---------- recrange
575 rec_nframes = nframes;
580 /* |--------| recrange
583 rec_nframes = transport_frame + nframes - first_recordable_frame;
585 rec_offset = first_recordable_frame - transport_frame;
590 /* |--------| recrange
593 rec_nframes = last_recordable_frame - transport_frame;
597 case OverlapExternal:
598 /* |--------| recrange
599 -------------- transrange
601 rec_nframes = last_recordable_frame - first_recordable_frame;
602 rec_offset = first_recordable_frame - transport_frame;
606 if (rec_nframes && !was_recording) {
607 capture_captured = 0;
608 was_recording = true;
613 if (can_record && !_last_capture_regions.empty()) {
614 _last_capture_regions.clear ();
617 if (nominally_recording || rec_nframes) {
619 uint32_t limit = _io->n_inputs ().n_audio();
621 /* one or more ports could already have been removed from _io, but our
622 channel setup hasn't yet been updated. prevent us from trying to
623 use channels that correspond to missing ports. note that the
624 process callback (from which this is called) is always atomic
625 with respect to port removal/addition.
628 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
630 ChannelInfo* chaninfo (*chan);
632 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
634 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
636 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
638 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
642 AudioPort* const ap = _io->audio_input(n);
644 assert(rec_nframes <= ap->get_audio_buffer().capacity());
645 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer().data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
649 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
651 if (rec_nframes > total) {
656 AudioPort* const ap = _io->audio_input(n);
659 Sample* buf = ap->get_audio_buffer().data(nframes, offset);
660 nframes_t first = chaninfo->capture_vector.len[0];
662 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
663 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
664 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
665 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
667 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
674 finish_capture (rec_monitors_input, c);
681 /* data will be written to disk */
683 if (rec_nframes == nframes && rec_offset == 0) {
685 for (chan = c->begin(); chan != c->end(); ++chan) {
686 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
689 playback_distance = nframes;
694 /* we can't use the capture buffer as the playback buffer, because
695 we recorded only a part of the current process' cycle data
699 collect_playback = true;
702 adjust_capture_position = rec_nframes;
704 } else if (nominally_recording) {
706 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
708 for (chan = c->begin(); chan != c->end(); ++chan) {
709 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
712 playback_distance = nframes;
716 collect_playback = true;
719 if (collect_playback) {
721 /* we're doing playback */
723 nframes_t necessary_samples;
725 /* no varispeed playback if we're recording, because the output .... TBD */
727 if (rec_nframes == 0 && _actual_speed != 1.0f) {
728 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
730 necessary_samples = nframes;
733 for (chan = c->begin(); chan != c->end(); ++chan) {
734 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
739 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
741 ChannelInfo* chaninfo (*chan);
743 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
745 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
748 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
750 if (necessary_samples > total) {
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;
819 /* we're exiting with failure, so ::commit will not
820 be called. unlock the state lock.
823 commit_should_unlock = false;
831 AudioDiskstream::commit (nframes_t nframes)
833 bool need_butler = false;
835 if (_actual_speed < 0.0) {
836 playback_sample -= playback_distance;
838 playback_sample += playback_distance;
841 boost::shared_ptr<ChannelList> c = channels.reader();
842 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
844 (*chan)->playback_buf->increment_read_ptr (playback_distance);
846 if (adjust_capture_position) {
847 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
851 if (adjust_capture_position != 0) {
852 capture_captured += adjust_capture_position;
853 adjust_capture_position = 0;
857 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
859 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
860 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
863 if (commit_should_unlock) {
873 AudioDiskstream::set_pending_overwrite (bool yn)
875 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
877 pending_overwrite = yn;
879 overwrite_frame = playback_sample;
880 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
884 AudioDiskstream::overwrite_existing_buffers ()
886 boost::shared_ptr<ChannelList> c = channels.reader();
887 Sample* mixdown_buffer;
890 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
892 overwrite_queued = false;
894 /* assume all are the same size */
895 nframes_t size = c->front()->playback_buf->bufsize();
897 mixdown_buffer = new Sample[size];
898 gain_buffer = new float[size];
900 /* reduce size so that we can fill the buffer correctly. */
906 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
908 start = overwrite_frame;
909 nframes_t cnt = size;
911 /* to fill the buffer without resetting the playback sample, we need to
912 do it one or two chunks (normally two).
914 |----------------------------------------------------------------------|
918 |<- second chunk->||<----------------- first chunk ------------------>|
922 nframes_t to_read = size - overwrite_offset;
924 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
925 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
926 _id, size, playback_sample) << endmsg;
934 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
935 start, cnt, *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;
946 pending_overwrite = false;
947 delete [] gain_buffer;
948 delete [] mixdown_buffer;
953 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
957 ChannelList::iterator chan;
958 boost::shared_ptr<ChannelList> c = channels.reader();
960 Glib::Mutex::Lock lm (state_lock);
962 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
963 (*chan)->playback_buf->reset ();
964 (*chan)->capture_buf->reset ();
967 /* can't rec-enable in destructive mode if transport is before start */
969 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
970 disengage_record_enable ();
973 playback_sample = frame;
976 if (complete_refill) {
977 while ((ret = do_refill_with_alloc ()) > 0) ;
979 ret = do_refill_with_alloc ();
986 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
988 ChannelList::iterator chan;
989 boost::shared_ptr<ChannelList> c = channels.reader();
991 for (chan = c->begin(); chan != c->end(); ++chan) {
992 if ((*chan)->playback_buf->read_space() < distance) {
1000 AudioDiskstream::internal_playback_seek (nframes_t distance)
1002 ChannelList::iterator chan;
1003 boost::shared_ptr<ChannelList> c = channels.reader();
1005 for (chan = c->begin(); chan != c->end(); ++chan) {
1006 (*chan)->playback_buf->increment_read_ptr (distance);
1009 first_recordable_frame += distance;
1010 playback_sample += distance;
1016 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1017 ChannelInfo* channel_info, int channel, bool reversed)
1019 nframes_t this_read = 0;
1020 bool reloop = false;
1021 nframes_t loop_end = 0;
1022 nframes_t loop_start = 0;
1023 nframes_t loop_length = 0;
1024 nframes_t offset = 0;
1027 /* XXX we don't currently play loops in reverse. not sure why */
1031 /* Make the use of a Location atomic for this read operation.
1033 Note: Locations don't get deleted, so all we care about
1034 when I say "atomic" is that we are always pointing to
1035 the same one and using a start/length values obtained
1039 if ((loc = loop_location) != 0) {
1040 loop_start = loc->start();
1041 loop_end = loc->end();
1042 loop_length = loop_end - loop_start;
1045 /* if we are looping, ensure that the first frame we read is at the correct
1046 position within the loop.
1049 if (loc && start >= loop_end) {
1050 //cerr << "start adjusted from " << start;
1051 start = loop_start + ((start - loop_start) % loop_length);
1052 //cerr << "to " << start << endl;
1055 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1064 /* take any loop into account. we can't read past the end of the loop. */
1066 if (loc && (loop_end - start < cnt)) {
1067 this_read = loop_end - start;
1068 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1075 if (this_read == 0) {
1079 this_read = min(cnt,this_read);
1081 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1082 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1087 _read_data_count = _playlist->read_data_count();
1091 swap_by_ptr (buf, buf + this_read - 1);
1095 /* if we read to the end of the loop, go back to the beginning */
1105 offset += this_read;
1112 AudioDiskstream::do_refill_with_alloc ()
1114 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1115 float* gain_buf = new float[disk_io_chunk_frames];
1117 int ret = _do_refill(mix_buf, gain_buf);
1126 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1130 RingBufferNPT<Sample>::rw_vector vector;
1131 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1132 nframes_t total_space;
1133 nframes_t zero_fill;
1135 ChannelList::iterator i;
1136 boost::shared_ptr<ChannelList> c = channels.reader();
1143 assert(mixdown_buffer);
1144 assert(gain_buffer);
1151 c->front()->playback_buf->get_write_vector (&vector);
1153 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1157 /* if there are 2+ chunks of disk i/o possible for
1158 this track, let the caller know so that it can arrange
1159 for us to be called again, ASAP.
1162 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1166 /* if we're running close to normal speed and there isn't enough
1167 space to do disk_io_chunk_frames of I/O, then don't bother.
1169 at higher speeds, just do it because the sync between butler
1170 and audio thread may not be good enough.
1173 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1177 /* when slaved, don't try to get too close to the read pointer. this
1178 leaves space for the buffer reversal to have something useful to
1182 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1186 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1188 total_space = min (disk_io_chunk_frames, total_space);
1192 if (file_frame == 0) {
1194 /* at start: nothing to do but fill with silence */
1196 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1198 ChannelInfo* chan (*i);
1199 chan->playback_buf->get_write_vector (&vector);
1200 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1201 if (vector.len[1]) {
1202 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1204 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1209 if (file_frame < total_space) {
1211 /* too close to the start: read what we can,
1212 and then zero fill the rest
1215 zero_fill = total_space - file_frame;
1216 total_space = file_frame;
1226 if (file_frame == max_frames) {
1228 /* at end: nothing to do but fill with silence */
1230 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1232 ChannelInfo* chan (*i);
1233 chan->playback_buf->get_write_vector (&vector);
1234 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1235 if (vector.len[1]) {
1236 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1238 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1243 if (file_frame > max_frames - total_space) {
1245 /* to close to the end: read what we can, and zero fill the rest */
1247 zero_fill = total_space - (max_frames - file_frame);
1248 total_space = max_frames - file_frame;
1255 nframes_t file_frame_tmp = 0;
1257 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1259 ChannelInfo* chan (*i);
1262 nframes_t len1, len2;
1264 chan->playback_buf->get_write_vector (&vector);
1266 if (vector.len[0] > disk_io_chunk_frames) {
1268 /* we're not going to fill the first chunk, so certainly do not bother with the
1269 other part. it won't be connected with the part we do fill, as in:
1271 .... => writable space
1272 ++++ => readable space
1273 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1275 |......|+++++++++++++|...............................|
1280 So, just pretend that the buf1 part isn't there.
1290 file_frame_tmp = file_frame;
1292 buf1 = vector.buf[0];
1293 len1 = vector.len[0];
1294 buf2 = vector.buf[1];
1295 len2 = vector.len[1];
1297 to_read = min (ts, len1);
1298 to_read = min (to_read, disk_io_chunk_frames);
1302 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1307 chan->playback_buf->increment_write_ptr (to_read);
1311 to_read = min (ts, len2);
1315 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1316 so read some or all of vector.len[1] as well.
1319 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1324 chan->playback_buf->increment_write_ptr (to_read);
1333 file_frame = file_frame_tmp;
1340 /** Flush pending data to disk.
1342 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1343 * of data to disk. it will never write more than that. If it writes that
1344 * much and there is more than that waiting to be written, it will return 1,
1345 * otherwise 0 on success or -1 on failure.
1347 * If there is less than disk_io_chunk_frames to be written, no data will be
1348 * written at all unless @a force_flush is true.
1351 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1355 RingBufferNPT<Sample>::rw_vector vector;
1356 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1359 _write_data_count = 0;
1361 transvec.buf[0] = 0;
1362 transvec.buf[1] = 0;
1366 boost::shared_ptr<ChannelList> c = channels.reader();
1367 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1369 (*chan)->capture_buf->get_read_vector (&vector);
1371 total = vector.len[0] + vector.len[1];
1373 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1377 /* if there are 2+ chunks of disk i/o possible for
1378 this track, let the caller know so that it can arrange
1379 for us to be called again, ASAP.
1381 if we are forcing a flush, then if there is* any* extra
1382 work, let the caller know.
1384 if we are no longer recording and there is any extra work,
1385 let the caller know too.
1388 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1392 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1394 // check the transition buffer when recording destructive
1395 // important that we get this after the capture buf
1397 if (destructive()) {
1398 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1399 size_t transcount = transvec.len[0] + transvec.len[1];
1400 bool have_start = false;
1403 for (ti=0; ti < transcount; ++ti) {
1404 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1406 if (captrans.type == CaptureStart) {
1407 // by definition, the first data we got above represents the given capture pos
1409 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1410 (*chan)->curr_capture_cnt = 0;
1414 else if (captrans.type == CaptureEnd) {
1416 // capture end, the capture_val represents total frames in capture
1418 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1420 // shorten to make the write a perfect fit
1421 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1423 if (nto_write < to_write) {
1424 ret = 1; // should we?
1426 to_write = nto_write;
1428 (*chan)->write_source->mark_capture_end ();
1430 // increment past this transition, but go no further
1435 // actually ends just beyond this chunk, so force more work
1443 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1447 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1448 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1452 (*chan)->capture_buf->increment_read_ptr (to_write);
1453 (*chan)->curr_capture_cnt += to_write;
1455 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1457 /* we wrote all of vector.len[0] but it wasn't an entire
1458 disk_io_chunk_frames of data, so arrange for some part
1459 of vector.len[1] to be flushed to disk as well.
1462 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1464 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1465 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1469 _write_data_count += (*chan)->write_source->write_data_count();
1471 (*chan)->capture_buf->increment_read_ptr (to_write);
1472 (*chan)->curr_capture_cnt += to_write;
1481 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1483 uint32_t buffer_position;
1484 bool more_work = true;
1486 boost::shared_ptr<AudioRegion> region;
1487 nframes_t total_capture;
1489 SourceList::iterator src;
1490 ChannelList::iterator chan;
1491 vector<CaptureInfo*>::iterator ci;
1492 boost::shared_ptr<ChannelList> c = channels.reader();
1494 bool mark_write_completed = false;
1496 finish_capture (true, c);
1498 /* butler is already stopped, but there may be work to do
1499 to flush remaining data to disk.
1502 while (more_work && !err) {
1503 switch (do_flush (Session::TransportContext, true)) {
1510 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1515 /* XXX is there anything we can do if err != 0 ? */
1516 Glib::Mutex::Lock lm (capture_info_lock);
1518 if (capture_info.empty()) {
1522 if (abort_capture) {
1524 if (destructive()) {
1528 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1530 if ((*chan)->write_source) {
1532 (*chan)->write_source->mark_for_remove ();
1533 (*chan)->write_source->drop_references ();
1534 (*chan)->write_source.reset ();
1537 /* new source set up in "out" below */
1543 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1544 total_capture += (*ci)->frames;
1547 /* figure out the name for this take */
1549 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1551 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1555 s->update_header (capture_info.front()->start, when, twhen);
1556 s->set_captured_for (_name);
1557 s->mark_immutable ();
1561 /* destructive tracks have a single, never changing region */
1563 if (destructive()) {
1565 /* send a signal that any UI can pick up to do the right thing. there is
1566 a small problem here in that a UI may need the peak data to be ready
1567 for the data that was recorded and this isn't interlocked with that
1568 process. this problem is deferred to the UI.
1571 _playlist->Modified();
1575 string whole_file_region_name;
1576 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1578 /* Register a new region with the Session that
1579 describes the entire source. Do this first
1580 so that any sub-regions will obviously be
1581 children of this one (later!)
1585 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, c->front()->write_source->last_capture_start_frame(), total_capture,
1586 whole_file_region_name,
1587 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1589 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1590 region->special_set_position (capture_info.front()->start);
1594 catch (failed_constructor& err) {
1595 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1599 _last_capture_regions.push_back (region);
1601 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1603 XMLNode &before = _playlist->get_state();
1604 _playlist->freeze ();
1606 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1610 _session.region_name (region_name, whole_file_region_name, false);
1612 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1615 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1616 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1619 catch (failed_constructor& err) {
1620 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1621 continue; /* XXX is this OK? */
1624 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1626 _last_capture_regions.push_back (region);
1628 i_am_the_modifier++;
1629 _playlist->add_region (region, (*ci)->start);
1630 i_am_the_modifier--;
1632 buffer_position += (*ci)->frames;
1636 XMLNode &after = _playlist->get_state();
1637 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1640 mark_write_completed = true;
1643 reset_write_sources (mark_write_completed);
1647 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1651 capture_info.clear ();
1652 capture_start_frame = 0;
1656 AudioDiskstream::transport_looped (nframes_t transport_frame)
1658 if (was_recording) {
1659 // all we need to do is finish this capture, with modified capture length
1660 boost::shared_ptr<ChannelList> c = channels.reader();
1662 // adjust the capture length knowing that the data will be recorded to disk
1663 // only necessary after the first loop where we're recording
1664 if (capture_info.size() == 0) {
1665 capture_captured += _capture_offset;
1667 if (_alignment_style == ExistingMaterial) {
1668 capture_captured += _session.worst_output_latency();
1670 capture_captured += _roll_delay;
1674 finish_capture (true, c);
1676 // the next region will start recording via the normal mechanism
1677 // we'll set the start position to the current transport pos
1678 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1679 capture_start_frame = transport_frame;
1680 first_recordable_frame = transport_frame; // mild lie
1681 last_recordable_frame = max_frames;
1682 was_recording = true;
1684 if (recordable() && destructive()) {
1685 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1687 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1688 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1690 if (transvec.len[0] > 0) {
1691 transvec.buf[0]->type = CaptureStart;
1692 transvec.buf[0]->capture_val = capture_start_frame;
1693 (*chan)->capture_transition_buf->increment_write_ptr(1);
1697 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1707 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1709 was_recording = false;
1711 if (capture_captured == 0) {
1715 if (recordable() && destructive()) {
1716 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1718 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1719 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1721 if (transvec.len[0] > 0) {
1722 transvec.buf[0]->type = CaptureEnd;
1723 transvec.buf[0]->capture_val = capture_captured;
1724 (*chan)->capture_transition_buf->increment_write_ptr(1);
1728 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1734 CaptureInfo* ci = new CaptureInfo;
1736 ci->start = capture_start_frame;
1737 ci->frames = capture_captured;
1739 /* XXX theoretical race condition here. Need atomic exchange ?
1740 However, the circumstances when this is called right
1741 now (either on record-disable or transport_stopped)
1742 mean that no actual race exists. I think ...
1743 We now have a capture_info_lock, but it is only to be used
1744 to synchronize in the transport_stop and the capture info
1745 accessors, so that invalidation will not occur (both non-realtime).
1748 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1750 capture_info.push_back (ci);
1751 capture_captured = 0;
1755 AudioDiskstream::set_record_enabled (bool yn)
1757 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs().n_audio() == 0) {
1761 /* can't rec-enable in destructive mode if transport is before start */
1763 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1767 if (yn && channels.reader()->front()->source == 0) {
1769 /* pick up connections not initiated *from* the IO object
1770 we're associated with.
1773 get_input_sources ();
1776 /* yes, i know that this not proof against race conditions, but its
1777 good enough. i think.
1780 if (record_enabled() != yn) {
1782 engage_record_enable ();
1784 disengage_record_enable ();
1790 AudioDiskstream::engage_record_enable ()
1792 bool rolling = _session.transport_speed() != 0.0f;
1793 boost::shared_ptr<ChannelList> c = channels.reader();
1795 g_atomic_int_set (&_record_enabled, 1);
1796 capturing_sources.clear ();
1798 if (Config->get_monitoring_model() == HardwareMonitoring) {
1800 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1801 if ((*chan)->source) {
1802 (*chan)->source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1804 capturing_sources.push_back ((*chan)->write_source);
1805 (*chan)->write_source->mark_streaming_write_started ();
1809 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1810 capturing_sources.push_back ((*chan)->write_source);
1811 (*chan)->write_source->mark_streaming_write_started ();
1815 RecordEnableChanged (); /* EMIT SIGNAL */
1819 AudioDiskstream::disengage_record_enable ()
1821 g_atomic_int_set (&_record_enabled, 0);
1822 boost::shared_ptr<ChannelList> c = channels.reader();
1823 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1824 if (Config->get_monitoring_model() == HardwareMonitoring) {
1825 if ((*chan)->source) {
1826 (*chan)->source->ensure_monitor_input (false);
1830 capturing_sources.clear ();
1831 RecordEnableChanged (); /* EMIT SIGNAL */
1835 AudioDiskstream::get_state ()
1837 XMLNode* node = new XMLNode ("AudioDiskstream");
1839 LocaleGuard lg (X_("POSIX"));
1840 boost::shared_ptr<ChannelList> c = channels.reader();
1842 node->add_property ("flags", enum_2_string (_flags));
1844 snprintf (buf, sizeof(buf), "%zd", c->size());
1845 node->add_property ("channels", buf);
1847 node->add_property ("playlist", _playlist->name());
1849 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1850 node->add_property ("speed", buf);
1852 node->add_property("name", _name);
1853 id().print (buf, sizeof (buf));
1854 node->add_property("id", buf);
1856 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1858 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1859 XMLNode* cs_grandchild;
1861 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1862 cs_grandchild = new XMLNode (X_("file"));
1863 cs_grandchild->add_property (X_("path"), (*i)->path());
1864 cs_child->add_child_nocopy (*cs_grandchild);
1867 /* store the location where capture will start */
1871 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1872 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1874 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1877 cs_child->add_property (X_("at"), buf);
1878 node->add_child_nocopy (*cs_child);
1882 node->add_child_copy (*_extra_xml);
1889 AudioDiskstream::set_state (const XMLNode& node)
1891 const XMLProperty* prop;
1892 XMLNodeList nlist = node.children();
1893 XMLNodeIterator niter;
1894 uint32_t nchans = 1;
1895 XMLNode* capture_pending_node = 0;
1896 LocaleGuard lg (X_("POSIX"));
1898 in_set_state = true;
1900 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1901 if ((*niter)->name() == IO::state_node_name) {
1902 deprecated_io_node = new XMLNode (**niter);
1905 if ((*niter)->name() == X_("CapturingSources")) {
1906 capture_pending_node = *niter;
1910 /* prevent write sources from being created */
1912 in_set_state = true;
1914 if ((prop = node.property ("name")) != 0) {
1915 _name = prop->value();
1918 if (deprecated_io_node) {
1919 if ((prop = deprecated_io_node->property ("id")) != 0) {
1920 _id = prop->value ();
1923 if ((prop = node.property ("id")) != 0) {
1924 _id = prop->value ();
1928 if ((prop = node.property ("flags")) != 0) {
1929 _flags = Flag (string_2_enum (prop->value(), _flags));
1932 if ((prop = node.property ("channels")) != 0) {
1933 nchans = atoi (prop->value().c_str());
1936 // create necessary extra channels
1937 // we are always constructed with one and we always need one
1939 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1941 if (nchans > _n_channels.n_audio()) {
1943 add_channel (nchans - _n_channels.n_audio());
1945 } else if (nchans < _n_channels.n_audio()) {
1947 remove_channel (_n_channels.n_audio() - nchans);
1950 if ((prop = node.property ("playlist")) == 0) {
1955 bool had_playlist = (_playlist != 0);
1957 if (find_and_use_playlist (prop->value())) {
1961 if (!had_playlist) {
1962 _playlist->set_orig_diskstream_id (_id);
1965 if (!destructive() && capture_pending_node) {
1966 /* destructive streams have one and only one source per channel,
1967 and so they never end up in pending capture in any useful
1970 use_pending_capture_data (*capture_pending_node);
1975 if ((prop = node.property ("speed")) != 0) {
1976 double sp = atof (prop->value().c_str());
1978 if (realtime_set_speed (sp, false)) {
1979 non_realtime_set_speed ();
1983 in_set_state = false;
1985 /* make sure this is clear before we do anything else */
1987 capturing_sources.clear ();
1989 /* write sources are handled when we handle the input set
1990 up of the IO that owns this DS (::non_realtime_input_change())
1993 in_set_state = false;
1999 AudioDiskstream::use_new_write_source (uint32_t n)
2001 boost::shared_ptr<ChannelList> c = channels.reader();
2003 if (!recordable()) {
2007 if (n >= c->size()) {
2008 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
2012 ChannelInfo* chan = (*c)[n];
2014 if (chan->write_source) {
2015 chan->write_source->done_with_peakfile_writes ();
2016 chan->write_source->set_allow_remove_if_empty (true);
2017 chan->write_source.reset ();
2021 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
2022 throw failed_constructor();
2026 catch (failed_constructor &err) {
2027 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2028 chan->write_source.reset ();
2032 /* do not remove destructive files even if they are empty */
2034 chan->write_source->set_allow_remove_if_empty (!destructive());
2040 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
2042 ChannelList::iterator chan;
2043 boost::shared_ptr<ChannelList> c = channels.reader();
2046 if (!recordable()) {
2050 capturing_sources.clear ();
2052 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2053 if (!destructive()) {
2055 if ((*chan)->write_source && mark_write_complete) {
2056 (*chan)->write_source->mark_streaming_write_completed ();
2058 use_new_write_source (n);
2060 if (record_enabled()) {
2061 capturing_sources.push_back ((*chan)->write_source);
2065 if ((*chan)->write_source == 0) {
2066 use_new_write_source (n);
2071 if (destructive()) {
2073 /* we now have all our write sources set up, so create the
2074 playlist's single region.
2077 if (_playlist->empty()) {
2078 setup_destructive_playlist ();
2084 AudioDiskstream::rename_write_sources ()
2086 ChannelList::iterator chan;
2087 boost::shared_ptr<ChannelList> c = channels.reader();
2090 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2091 if ((*chan)->write_source != 0) {
2092 (*chan)->write_source->set_source_name (_name, destructive());
2093 /* XXX what to do if one of them fails ? */
2101 AudioDiskstream::set_block_size (nframes_t nframes)
2103 if (_session.get_block_size() > speed_buffer_size) {
2104 speed_buffer_size = _session.get_block_size();
2105 boost::shared_ptr<ChannelList> c = channels.reader();
2107 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2108 if ((*chan)->speed_buffer) delete [] (*chan)->speed_buffer;
2109 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2112 allocate_temporary_buffers ();
2116 AudioDiskstream::allocate_temporary_buffers ()
2118 /* make sure the wrap buffer is at least large enough to deal
2119 with the speeds up to 1.2, to allow for micro-variation
2120 when slaving to MTC, SMPTE etc.
2123 double sp = max (fabsf (_actual_speed), 1.2f);
2124 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2126 if (required_wrap_size > wrap_buffer_size) {
2128 boost::shared_ptr<ChannelList> c = channels.reader();
2130 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2131 if ((*chan)->playback_wrap_buffer) delete [] (*chan)->playback_wrap_buffer;
2132 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2133 if ((*chan)->capture_wrap_buffer) delete [] (*chan)->capture_wrap_buffer;
2134 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2137 wrap_buffer_size = required_wrap_size;
2142 AudioDiskstream::monitor_input (bool yn)
2144 boost::shared_ptr<ChannelList> c = channels.reader();
2146 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2148 if ((*chan)->source) {
2149 (*chan)->source->ensure_monitor_input (yn);
2155 AudioDiskstream::set_align_style_from_io ()
2157 bool have_physical = false;
2163 get_input_sources ();
2165 boost::shared_ptr<ChannelList> c = channels.reader();
2167 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2168 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2169 have_physical = true;
2174 if (have_physical) {
2175 set_align_style (ExistingMaterial);
2177 set_align_style (CaptureTime);
2182 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2184 while (how_many--) {
2185 c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2188 _n_channels.set(DataType::AUDIO, c->size());
2194 AudioDiskstream::add_channel (uint32_t how_many)
2196 RCUWriter<ChannelList> writer (channels);
2197 boost::shared_ptr<ChannelList> c = writer.get_copy();
2199 return add_channel_to (c, how_many);
2203 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2205 while (--how_many && !c->empty()) {
2210 _n_channels.set(DataType::AUDIO, c->size());
2216 AudioDiskstream::remove_channel (uint32_t how_many)
2218 RCUWriter<ChannelList> writer (channels);
2219 boost::shared_ptr<ChannelList> c = writer.get_copy();
2221 return remove_channel_from (c, how_many);
2225 AudioDiskstream::playback_buffer_load () const
2227 boost::shared_ptr<ChannelList> c = channels.reader();
2229 return (float) ((double) c->front()->playback_buf->read_space()/
2230 (double) c->front()->playback_buf->bufsize());
2234 AudioDiskstream::capture_buffer_load () const
2236 boost::shared_ptr<ChannelList> c = channels.reader();
2238 return (float) ((double) c->front()->capture_buf->write_space()/
2239 (double) c->front()->capture_buf->bufsize());
2243 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2245 const XMLProperty* prop;
2246 XMLNodeList nlist = node.children();
2247 XMLNodeIterator niter;
2248 boost::shared_ptr<AudioFileSource> fs;
2249 boost::shared_ptr<AudioFileSource> first_fs;
2250 SourceList pending_sources;
2253 if ((prop = node.property (X_("at"))) == 0) {
2257 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2261 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2262 if ((*niter)->name() == X_("file")) {
2264 if ((prop = (*niter)->property (X_("path"))) == 0) {
2268 // This protects sessions from errant CapturingSources in stored sessions
2270 if (stat (prop->value().c_str(), &sbuf)) {
2275 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2276 SourceFactory::createWritable (DataType::AUDIO, _session, prop->value(), false, _session.frame_rate()));
2279 catch (failed_constructor& err) {
2280 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2281 _name, prop->value())
2286 pending_sources.push_back (fs);
2288 if (first_fs == 0) {
2292 fs->set_captured_for (_name);
2296 if (pending_sources.size() == 0) {
2297 /* nothing can be done */
2301 if (pending_sources.size() != _n_channels.n_audio()) {
2302 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2307 boost::shared_ptr<AudioRegion> region;
2310 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2311 region_name_from_path (first_fs->name(), true),
2312 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2313 region->special_set_position (0);
2316 catch (failed_constructor& err) {
2317 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2325 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2328 catch (failed_constructor& err) {
2329 error << string_compose (_("%1: cannot create region from pending capture sources"),
2336 _playlist->add_region (region, position);
2342 AudioDiskstream::set_destructive (bool yn)
2344 bool bounce_ignored;
2346 if (yn != destructive()) {
2349 /* requestor should already have checked this and
2350 bounced if necessary and desired
2352 if (!can_become_destructive (bounce_ignored)) {
2355 _flags = Flag (_flags | Destructive);
2356 use_destructive_playlist ();
2358 _flags = Flag (_flags & ~Destructive);
2359 reset_write_sources (true, true);
2367 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2370 requires_bounce = false;
2374 /* is there only one region ? */
2376 if (_playlist->n_regions() != 1) {
2377 requires_bounce = true;
2381 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2384 /* do the source(s) for the region cover the session start position ? */
2386 if (first->position() != _session.current_start_frame()) {
2387 if (first->start() > _session.current_start_frame()) {
2388 requires_bounce = true;
2393 /* is the source used by only 1 playlist ? */
2395 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2399 if (afirst->source()->used() > 1) {
2400 requires_bounce = true;
2404 requires_bounce = false;
2408 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2412 current_capture_buffer = 0;
2413 current_playback_buffer = 0;
2414 curr_capture_cnt = 0;
2416 speed_buffer = new Sample[speed_size];
2417 playback_wrap_buffer = new Sample[wrap_size];
2418 capture_wrap_buffer = new Sample[wrap_size];
2420 playback_buf = new RingBufferNPT<Sample> (bufsize);
2421 capture_buf = new RingBufferNPT<Sample> (bufsize);
2422 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2424 /* touch the ringbuffer buffers, which will cause
2425 them to be mapped into locked physical RAM if
2426 we're running with mlockall(). this doesn't do
2430 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2431 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2432 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2435 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2438 write_source.reset ();
2442 delete [] speed_buffer;
2446 if (playback_wrap_buffer) {
2447 delete [] playback_wrap_buffer;
2448 playback_wrap_buffer = 0;
2451 if (capture_wrap_buffer) {
2452 delete [] capture_wrap_buffer;
2453 capture_wrap_buffer = 0;
2457 delete playback_buf;
2466 if (capture_transition_buf) {
2467 delete capture_transition_buf;
2468 capture_transition_buf = 0;