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/xml++.h"
35 #include "pbd/memento_command.h"
36 #include "pbd/enumwriter.h"
37 #include "pbd/stateful_diff_command.h"
39 #include "ardour/analyser.h"
40 #include "ardour/audio_buffer.h"
41 #include "ardour/audio_diskstream.h"
42 #include "ardour/audio_port.h"
43 #include "ardour/audioengine.h"
44 #include "ardour/audiofilesource.h"
45 #include "ardour/audioplaylist.h"
46 #include "ardour/audioregion.h"
47 #include "ardour/butler.h"
48 #include "ardour/debug.h"
49 #include "ardour/io.h"
50 #include "ardour/playlist_factory.h"
51 #include "ardour/region_factory.h"
52 #include "ardour/session.h"
53 #include "ardour/session_playlists.h"
54 #include "ardour/source_factory.h"
55 #include "ardour/track.h"
56 #include "ardour/types.h"
57 #include "ardour/utils.h"
63 using namespace ARDOUR;
66 size_t AudioDiskstream::_working_buffers_size = 0;
67 Sample* AudioDiskstream::_mixdown_buffer = 0;
68 gain_t* AudioDiskstream::_gain_buffer = 0;
70 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
71 : Diskstream(sess, name, flag)
72 , channels (new ChannelList)
74 /* prevent any write sources from being created */
81 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
82 : Diskstream(sess, node)
83 , channels (new ChannelList)
88 if (set_state (node, Stateful::loading_state_version)) {
90 throw failed_constructor();
96 use_destructive_playlist ();
101 AudioDiskstream::init ()
103 /* there are no channels at this point, so these
104 two calls just get speed_buffer_size and wrap_buffer
105 size setup without duplicating their code.
108 set_block_size (_session.get_block_size());
109 allocate_temporary_buffers ();
112 AudioDiskstream::~AudioDiskstream ()
114 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
117 RCUWriter<ChannelList> writer (channels);
118 boost::shared_ptr<ChannelList> c = writer.get_copy();
120 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
131 AudioDiskstream::allocate_working_buffers()
133 assert(disk_io_frames() > 0);
135 _working_buffers_size = disk_io_frames();
136 _mixdown_buffer = new Sample[_working_buffers_size];
137 _gain_buffer = new gain_t[_working_buffers_size];
141 AudioDiskstream::free_working_buffers()
143 delete [] _mixdown_buffer;
144 delete [] _gain_buffer;
145 _working_buffers_size = 0;
151 AudioDiskstream::non_realtime_input_change ()
154 Glib::Threads::Mutex::Lock lm (state_lock);
156 if (input_change_pending.type == IOChange::NoChange) {
160 if (input_change_pending.type == IOChange::ConfigurationChanged) {
161 RCUWriter<ChannelList> writer (channels);
162 boost::shared_ptr<ChannelList> c = writer.get_copy();
164 _n_channels.set(DataType::AUDIO, c->size());
166 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
167 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
168 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
169 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
173 if (input_change_pending.type & IOChange::ConnectionsChanged) {
174 get_input_sources ();
175 set_capture_offset ();
176 set_align_style_from_io ();
179 input_change_pending = IOChange::NoChange;
181 /* implicit unlock */
184 /* reset capture files */
186 reset_write_sources (false);
188 /* now refill channel buffers */
190 if (speed() != 1.0f || speed() != -1.0f) {
191 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
193 seek (_session.transport_frame());
198 AudioDiskstream::non_realtime_locate (framepos_t location)
200 /* now refill channel buffers */
202 if (speed() != 1.0f || speed() != -1.0f) {
203 seek ((framepos_t) (location * (double) speed()));
210 AudioDiskstream::get_input_sources ()
212 boost::shared_ptr<ChannelList> c = channels.reader();
215 ChannelList::iterator chan;
216 uint32_t ni = _io->n_ports().n_audio();
217 vector<string> connections;
219 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
221 connections.clear ();
223 if (_io->nth (n)->get_connections (connections) == 0) {
224 if (!(*chan)->source.name.empty()) {
225 // _source->disable_metering ();
227 (*chan)->source.name = string();
229 (*chan)->source.name = connections[0];
235 AudioDiskstream::find_and_use_playlist (const string& name)
237 boost::shared_ptr<AudioPlaylist> playlist;
239 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
240 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
244 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
248 return use_playlist (playlist);
252 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
254 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
256 Diskstream::use_playlist(playlist);
262 AudioDiskstream::use_new_playlist ()
265 boost::shared_ptr<AudioPlaylist> playlist;
267 if (!in_set_state && destructive()) {
272 newname = Playlist::bump_name (_playlist->name(), _session);
274 newname = Playlist::bump_name (_name, _session);
277 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
279 return use_playlist (playlist);
287 AudioDiskstream::use_copy_playlist ()
289 assert(audio_playlist());
295 if (_playlist == 0) {
296 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
301 boost::shared_ptr<AudioPlaylist> playlist;
303 newname = Playlist::bump_name (_playlist->name(), _session);
305 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
306 return use_playlist (playlist);
313 AudioDiskstream::setup_destructive_playlist ()
316 boost::shared_ptr<ChannelList> c = channels.reader();
318 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
319 srcs.push_back ((*chan)->write_source);
322 /* a single full-sized region */
324 assert (!srcs.empty ());
327 plist.add (Properties::name, _name.val());
328 plist.add (Properties::start, 0);
329 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
331 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
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_framepos - region->position());
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::prepare_record_status(framepos_t capture_start_frame)
381 if (recordable() && destructive()) {
382 boost::shared_ptr<ChannelList> c = channels.reader();
383 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
385 RingBufferNPT<CaptureTransition>::rw_vector transitions;
386 (*chan)->capture_transition_buf->get_write_vector (&transitions);
388 if (transitions.len[0] > 0) {
389 transitions.buf[0]->type = CaptureStart;
390 transitions.buf[0]->capture_val = capture_start_frame;
391 (*chan)->capture_transition_buf->increment_write_ptr(1);
394 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
402 /** Do some record stuff [not described in this comment!]
405 * - Setup playback_distance with the nframes, or nframes adjusted
406 * for current varispeed, if appropriate.
407 * - Setup current_playback_buffer in each ChannelInfo to point to data
408 * that someone can read playback_distance worth of data from.
411 AudioDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
414 boost::shared_ptr<ChannelList> c = channels.reader();
415 ChannelList::iterator chan;
416 framecnt_t rec_offset = 0;
417 framecnt_t rec_nframes = 0;
418 bool collect_playback = false;
419 bool can_record = _session.actively_recording ();
421 playback_distance = 0;
423 if (!_io || !_io->active()) {
427 check_record_status (transport_frame, can_record);
433 Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK);
439 adjust_capture_position = 0;
441 for (chan = c->begin(); chan != c->end(); ++chan) {
442 (*chan)->current_capture_buffer = 0;
443 (*chan)->current_playback_buffer = 0;
446 // Safeguard against situations where process() goes haywire when autopunching
447 // and last_recordable_frame < first_recordable_frame
449 if (last_recordable_frame < first_recordable_frame) {
450 last_recordable_frame = max_framepos;
453 if (record_enabled()) {
455 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
456 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
458 if (rec_nframes && !was_recording) {
459 capture_captured = 0;
460 was_recording = true;
464 if (can_record && !_last_capture_sources.empty()) {
465 _last_capture_sources.clear ();
470 uint32_t limit = _io->n_ports ().n_audio();
472 /* one or more ports could already have been removed from _io, but our
473 channel setup hasn't yet been updated. prevent us from trying to
474 use channels that correspond to missing ports. note that the
475 process callback (from which this is called) is always atomic
476 with respect to port removal/addition.
479 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
481 ChannelInfo* chaninfo (*chan);
483 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
485 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
487 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
489 /* note: grab the entire port buffer, but only copy what we were supposed to
490 for recording, and use rec_offset
493 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
495 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
497 Sample *buf = bufs.get_audio (n).data(rec_offset);
498 memcpy (chaninfo->current_capture_buffer, buf, sizeof (Sample) * rec_nframes);
502 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
504 if (rec_nframes > total) {
509 boost::shared_ptr<AudioPort> const ap = _io->audio (n);
512 Sample *buf = bufs.get_audio (n).data(rec_offset);
513 framecnt_t first = chaninfo->capture_vector.len[0];
515 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
516 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
517 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
518 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
520 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
534 /* data will be written to disk */
536 if (rec_nframes == nframes && rec_offset == 0) {
538 for (chan = c->begin(); chan != c->end(); ++chan) {
539 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
542 playback_distance = nframes;
547 /* we can't use the capture buffer as the playback buffer, because
548 we recorded only a part of the current process' cycle data
552 collect_playback = true;
555 adjust_capture_position = rec_nframes;
557 } else if (can_record && record_enabled()) {
559 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
561 for (chan = c->begin(); chan != c->end(); ++chan) {
562 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
565 playback_distance = nframes;
569 collect_playback = true;
572 if ((_track->monitoring_state () & MonitoringDisk) || collect_playback) {
574 /* we're doing playback */
576 framecnt_t necessary_samples;
578 /* no varispeed playback if we're recording, because the output .... TBD */
580 if (rec_nframes == 0 && _actual_speed != 1.0f) {
581 necessary_samples = (framecnt_t) ceil ((nframes * fabs (_actual_speed))) + 2;
583 necessary_samples = nframes;
586 for (chan = c->begin(); chan != c->end(); ++chan) {
587 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
592 /* Setup current_playback_buffer in each ChannelInfo to point to data that someone
593 can read necessary_samples (== nframes at a transport speed of 1) worth of data
597 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
599 ChannelInfo* chaninfo (*chan);
601 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
602 /* There are enough samples in the first part of the ringbuffer */
603 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
606 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
608 if (necessary_samples > total) {
609 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
610 cerr << "underrun for " << _name << endl;
616 /* We have enough samples, but not in one lump. Coalesce the two parts
617 into one in playback_wrap_buffer in our ChannelInfo, and specify that
618 as our current_playback_buffer.
621 assert(wrap_buffer_size >= necessary_samples);
623 /* Copy buf[0] from playback_buf */
624 memcpy ((char *) chaninfo->playback_wrap_buffer,
625 chaninfo->playback_vector.buf[0],
626 chaninfo->playback_vector.len[0] * sizeof (Sample));
628 /* Copy buf[1] from playback_buf */
629 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
630 chaninfo->playback_vector.buf[1],
631 (necessary_samples - chaninfo->playback_vector.len[0])
634 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
639 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
641 interpolation.set_speed (_target_speed);
644 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
645 ChannelInfo* chaninfo (*chan);
647 playback_distance = interpolation.interpolate (
648 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
650 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
654 playback_distance = nframes;
657 _speed = _target_speed;
660 if (need_disk_signal) {
662 /* copy data over to buffer set */
664 size_t n_buffers = bufs.count().n_audio();
665 size_t n_chans = c->size();
666 gain_t scaling = 1.0f;
668 if (n_chans > n_buffers) {
669 scaling = ((float) n_buffers)/n_chans;
672 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
674 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
675 ChannelInfo* chaninfo (*chan);
678 if (scaling != 1.0f) {
679 buf.read_from_with_gain (chaninfo->current_playback_buffer, nframes, scaling);
681 buf.read_from (chaninfo->current_playback_buffer, nframes);
684 if (scaling != 1.0f) {
685 buf.accumulate_with_gain_from (chaninfo->current_playback_buffer, nframes, scaling);
687 buf.accumulate_from (chaninfo->current_playback_buffer, nframes);
692 /* leave the MIDI count alone */
693 ChanCount cnt (DataType::AUDIO, n_chans);
694 cnt.set (DataType::MIDI, bufs.count().n_midi());
695 bufs.set_count (cnt);
697 /* extra buffers will already be silent, so leave them alone */
704 AudioDiskstream::calculate_playback_distance (pframes_t nframes)
706 frameoffset_t playback_distance = nframes;
708 if (record_enabled()) {
709 playback_distance = nframes;
710 } else if (_actual_speed != 1.0f && _actual_speed != -1.0f) {
711 interpolation.set_speed (_target_speed);
712 boost::shared_ptr<ChannelList> c = channels.reader();
714 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
715 playback_distance = interpolation.interpolate (channel, nframes, NULL, NULL);
718 playback_distance = nframes;
721 if (_actual_speed < 0.0) {
722 return -playback_distance;
724 return playback_distance;
728 /** Update various things including playback_sample, read pointer on each channel's playback_buf
729 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
730 * @return true if the butler is required.
733 AudioDiskstream::commit (framecnt_t playback_distance)
735 bool need_butler = false;
737 if (!_io || !_io->active()) {
741 if (_actual_speed < 0.0) {
742 playback_sample -= playback_distance;
744 playback_sample += playback_distance;
747 boost::shared_ptr<ChannelList> c = channels.reader();
748 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
750 (*chan)->playback_buf->increment_read_ptr (playback_distance);
752 if (adjust_capture_position) {
753 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
757 if (adjust_capture_position != 0) {
758 capture_captured += adjust_capture_position;
759 adjust_capture_position = 0;
767 if (_io && _io->active()) {
768 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
773 if (_io && _io->active()) {
774 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
775 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
777 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
785 AudioDiskstream::set_pending_overwrite (bool yn)
787 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
789 _pending_overwrite = yn;
791 overwrite_frame = playback_sample;
793 boost::shared_ptr<ChannelList> c = channels.reader ();
795 overwrite_offset = c->front()->playback_buf->get_read_ptr();
800 AudioDiskstream::overwrite_existing_buffers ()
802 boost::shared_ptr<ChannelList> c = channels.reader();
804 _pending_overwrite = false;
808 Sample* mixdown_buffer;
811 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
813 overwrite_queued = false;
815 /* assume all are the same size */
816 framecnt_t size = c->front()->playback_buf->bufsize();
818 mixdown_buffer = new Sample[size];
819 gain_buffer = new float[size];
821 /* reduce size so that we can fill the buffer correctly (ringbuffers
822 can only handle size-1, otherwise they appear to be empty)
829 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
831 start = overwrite_frame;
832 framecnt_t cnt = size;
834 /* to fill the buffer without resetting the playback sample, we need to
835 do it one or two chunks (normally two).
837 |----------------------------------------------------------------------|
841 |<- second chunk->||<----------------- first chunk ------------------>|
845 framecnt_t to_read = size - overwrite_offset;
847 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
848 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
849 id(), size, playback_sample) << endmsg;
857 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
858 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
859 id(), size, playback_sample) << endmsg;
868 _pending_overwrite = false;
869 delete [] gain_buffer;
870 delete [] mixdown_buffer;
875 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
879 ChannelList::iterator chan;
880 boost::shared_ptr<ChannelList> c = channels.reader();
882 Glib::Threads::Mutex::Lock lm (state_lock);
884 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
885 (*chan)->playback_buf->reset ();
886 (*chan)->capture_buf->reset ();
889 /* can't rec-enable in destructive mode if transport is before start */
891 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
892 disengage_record_enable ();
895 playback_sample = frame;
898 if (complete_refill) {
899 while ((ret = do_refill_with_alloc ()) > 0) ;
901 ret = do_refill_with_alloc ();
908 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
910 ChannelList::iterator chan;
911 boost::shared_ptr<ChannelList> c = channels.reader();
913 for (chan = c->begin(); chan != c->end(); ++chan) {
914 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
922 AudioDiskstream::internal_playback_seek (framecnt_t distance)
924 ChannelList::iterator chan;
925 boost::shared_ptr<ChannelList> c = channels.reader();
927 for (chan = c->begin(); chan != c->end(); ++chan) {
928 (*chan)->playback_buf->increment_read_ptr (std::llabs(distance));
931 if (first_recordable_frame < max_framepos) {
932 first_recordable_frame += distance;
934 playback_sample += distance;
939 /** Read some data for 1 channel from our playlist into a buffer.
940 * @param buf Buffer to write to.
941 * @param start Session frame to start reading from; updated to where we end up
943 * @param cnt Count of samples to read.
944 * @param reversed true if we are running backwards, otherwise false.
947 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
948 framepos_t& start, framecnt_t cnt,
949 int channel, bool reversed)
951 framecnt_t this_read = 0;
953 framepos_t loop_end = 0;
954 framepos_t loop_start = 0;
955 framecnt_t offset = 0;
958 /* XXX we don't currently play loops in reverse. not sure why */
962 framecnt_t loop_length = 0;
964 /* Make the use of a Location atomic for this read operation.
966 Note: Locations don't get deleted, so all we care about
967 when I say "atomic" is that we are always pointing to
968 the same one and using a start/length values obtained
972 if ((loc = loop_location) != 0) {
973 loop_start = loc->start();
974 loop_end = loc->end();
975 loop_length = loop_end - loop_start;
978 /* if we are looping, ensure that the first frame we read is at the correct
979 position within the loop.
982 if (loc && start >= loop_end) {
983 start = loop_start + ((start - loop_start) % loop_length);
991 /* We need this while loop in case we hit a loop boundary, in which case our read from
992 the playlist must be split into more than one section.
997 /* take any loop into account. we can't read past the end of the loop. */
999 if (loc && (loop_end - start < cnt)) {
1000 this_read = loop_end - start;
1007 if (this_read == 0) {
1011 this_read = min(cnt,this_read);
1013 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1014 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
1021 swap_by_ptr (buf, buf + this_read - 1);
1025 /* if we read to the end of the loop, go back to the beginning */
1035 offset += this_read;
1042 AudioDiskstream::do_refill_with_alloc ()
1044 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1045 float* gain_buf = new float[disk_io_chunk_frames];
1047 int ret = _do_refill(mix_buf, gain_buf);
1055 /** Get some more data from disk and put it in our channels' playback_bufs,
1056 * if there is suitable space in them.
1059 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1063 RingBufferNPT<Sample>::rw_vector vector;
1064 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1065 framecnt_t total_space;
1066 framecnt_t zero_fill;
1068 ChannelList::iterator i;
1069 boost::shared_ptr<ChannelList> c = channels.reader();
1076 assert(mixdown_buffer);
1077 assert(gain_buffer);
1084 c->front()->playback_buf->get_write_vector (&vector);
1086 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1087 /* nowhere to write to */
1091 /* if there are 2+ chunks of disk i/o possible for
1092 this track, let the caller know so that it can arrange
1093 for us to be called again, ASAP.
1096 if (total_space >= (_slaved ? 3 : 2) * disk_io_chunk_frames) {
1100 /* if we're running close to normal speed and there isn't enough
1101 space to do disk_io_chunk_frames of I/O, then don't bother.
1103 at higher speeds, just do it because the sync between butler
1104 and audio thread may not be good enough.
1106 Note: it is a design assumption that disk_io_chunk_frames is smaller
1107 than the playback buffer size, so this check should never trip when
1108 the playback buffer is empty.
1111 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1115 /* when slaved, don't try to get too close to the read pointer. this
1116 leaves space for the buffer reversal to have something useful to
1120 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1124 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1126 total_space = min (disk_io_chunk_frames, total_space);
1130 if (file_frame == 0) {
1132 /* at start: nothing to do but fill with silence */
1134 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1136 ChannelInfo* chan (*i);
1137 chan->playback_buf->get_write_vector (&vector);
1138 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1139 if (vector.len[1]) {
1140 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1142 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1147 if (file_frame < total_space) {
1149 /* too close to the start: read what we can,
1150 and then zero fill the rest
1153 zero_fill = total_space - file_frame;
1154 total_space = file_frame;
1163 if (file_frame == max_framepos) {
1165 /* at end: nothing to do but fill with silence */
1167 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1169 ChannelInfo* chan (*i);
1170 chan->playback_buf->get_write_vector (&vector);
1171 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1172 if (vector.len[1]) {
1173 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1175 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1180 if (file_frame > max_framepos - total_space) {
1182 /* to close to the end: read what we can, and zero fill the rest */
1184 zero_fill = total_space - (max_framepos - file_frame);
1185 total_space = max_framepos - file_frame;
1192 framepos_t file_frame_tmp = 0;
1194 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1196 ChannelInfo* chan (*i);
1199 framecnt_t len1, len2;
1201 chan->playback_buf->get_write_vector (&vector);
1203 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1205 /* we're not going to fill the first chunk, so certainly do not bother with the
1206 other part. it won't be connected with the part we do fill, as in:
1208 .... => writable space
1209 ++++ => readable space
1210 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1212 |......|+++++++++++++|...............................|
1217 So, just pretend that the buf1 part isn't there.
1227 file_frame_tmp = file_frame;
1229 buf1 = vector.buf[0];
1230 len1 = vector.len[0];
1231 buf2 = vector.buf[1];
1232 len2 = vector.len[1];
1234 to_read = min (ts, len1);
1235 to_read = min (to_read, disk_io_chunk_frames);
1237 assert (to_read >= 0);
1241 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1246 chan->playback_buf->increment_write_ptr (to_read);
1250 to_read = min (ts, len2);
1254 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1255 so read some or all of vector.len[1] as well.
1258 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1263 chan->playback_buf->increment_write_ptr (to_read);
1267 /* XXX: do something */
1272 file_frame = file_frame_tmp;
1273 assert (file_frame >= 0);
1280 /** Flush pending data to disk.
1282 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1283 * of data to disk. it will never write more than that. If it writes that
1284 * much and there is more than that waiting to be written, it will return 1,
1285 * otherwise 0 on success or -1 on failure.
1287 * If there is less than disk_io_chunk_frames to be written, no data will be
1288 * written at all unless @a force_flush is true.
1291 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1295 RingBufferNPT<Sample>::rw_vector vector;
1296 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1299 transvec.buf[0] = 0;
1300 transvec.buf[1] = 0;
1304 boost::shared_ptr<ChannelList> c = channels.reader();
1305 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1307 (*chan)->capture_buf->get_read_vector (&vector);
1309 total = vector.len[0] + vector.len[1];
1311 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1315 /* if there are 2+ chunks of disk i/o possible for
1316 this track, let the caller know so that it can arrange
1317 for us to be called again, ASAP.
1319 if we are forcing a flush, then if there is* any* extra
1320 work, let the caller know.
1322 if we are no longer recording and there is any extra work,
1323 let the caller know too.
1326 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1330 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1332 // check the transition buffer when recording destructive
1333 // important that we get this after the capture buf
1335 if (destructive()) {
1336 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1337 size_t transcount = transvec.len[0] + transvec.len[1];
1340 for (ti=0; ti < transcount; ++ti) {
1341 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1343 if (captrans.type == CaptureStart) {
1344 // by definition, the first data we got above represents the given capture pos
1346 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1347 (*chan)->curr_capture_cnt = 0;
1349 } else if (captrans.type == CaptureEnd) {
1351 // capture end, the capture_val represents total frames in capture
1353 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1355 // shorten to make the write a perfect fit
1356 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1358 if (nto_write < to_write) {
1359 ret = 1; // should we?
1361 to_write = nto_write;
1363 (*chan)->write_source->mark_capture_end ();
1365 // increment past this transition, but go no further
1370 // actually ends just beyond this chunk, so force more work
1378 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1382 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1383 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1387 (*chan)->capture_buf->increment_read_ptr (to_write);
1388 (*chan)->curr_capture_cnt += to_write;
1390 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1392 /* we wrote all of vector.len[0] but it wasn't an entire
1393 disk_io_chunk_frames of data, so arrange for some part
1394 of vector.len[1] to be flushed to disk as well.
1397 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1399 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1400 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1404 (*chan)->capture_buf->increment_read_ptr (to_write);
1405 (*chan)->curr_capture_cnt += to_write;
1414 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1416 uint32_t buffer_position;
1417 bool more_work = true;
1419 boost::shared_ptr<AudioRegion> region;
1420 framecnt_t total_capture;
1422 SourceList::iterator src;
1423 ChannelList::iterator chan;
1424 vector<CaptureInfo*>::iterator ci;
1425 boost::shared_ptr<ChannelList> c = channels.reader();
1427 bool mark_write_completed = false;
1431 /* butler is already stopped, but there may be work to do
1432 to flush remaining data to disk.
1435 while (more_work && !err) {
1436 switch (do_flush (TransportContext, true)) {
1443 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1448 /* XXX is there anything we can do if err != 0 ? */
1449 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1451 if (capture_info.empty()) {
1455 if (abort_capture) {
1457 if (destructive()) {
1461 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1463 if ((*chan)->write_source) {
1465 (*chan)->write_source->mark_for_remove ();
1466 (*chan)->write_source->drop_references ();
1467 (*chan)->write_source.reset ();
1470 /* new source set up in "out" below */
1476 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1477 total_capture += (*ci)->frames;
1480 /* figure out the name for this take */
1482 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1484 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1488 s->update_header (capture_info.front()->start, when, twhen);
1489 s->set_captured_for (_name.val());
1490 s->mark_immutable ();
1492 if (Config->get_auto_analyse_audio()) {
1493 Analyser::queue_source_for_analysis (s, true);
1498 /* destructive tracks have a single, never changing region */
1500 if (destructive()) {
1502 /* send a signal that any UI can pick up to do the right thing. there is
1503 a small problem here in that a UI may need the peak data to be ready
1504 for the data that was recorded and this isn't interlocked with that
1505 process. this problem is deferred to the UI.
1508 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1512 string whole_file_region_name;
1513 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1515 /* Register a new region with the Session that
1516 describes the entire source. Do this first
1517 so that any sub-regions will obviously be
1518 children of this one (later!)
1524 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1525 plist.add (Properties::length, total_capture);
1526 plist.add (Properties::name, whole_file_region_name);
1527 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1528 rx->set_automatic (true);
1529 rx->set_whole_file (true);
1531 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1532 region->special_set_position (capture_info.front()->start);
1536 catch (failed_constructor& err) {
1537 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1541 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1543 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1545 _playlist->clear_changes ();
1546 _playlist->set_capture_insertion_in_progress (true);
1547 _playlist->freeze ();
1549 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1553 RegionFactory::region_name (region_name, whole_file_region_name, false);
1555 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1556 _name, (*ci)->start, (*ci)->frames, region_name));
1562 plist.add (Properties::start, buffer_position);
1563 plist.add (Properties::length, (*ci)->frames);
1564 plist.add (Properties::name, region_name);
1566 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1567 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1570 catch (failed_constructor& err) {
1571 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1572 continue; /* XXX is this OK? */
1575 i_am_the_modifier++;
1577 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1578 _playlist->set_layer (region, DBL_MAX);
1579 i_am_the_modifier--;
1581 buffer_position += (*ci)->frames;
1585 _playlist->set_capture_insertion_in_progress (false);
1586 _session.add_command (new StatefulDiffCommand (_playlist));
1589 mark_write_completed = true;
1592 reset_write_sources (mark_write_completed);
1596 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1600 capture_info.clear ();
1601 capture_start_frame = 0;
1605 AudioDiskstream::transport_looped (framepos_t transport_frame)
1607 if (was_recording) {
1608 // all we need to do is finish this capture, with modified capture length
1609 boost::shared_ptr<ChannelList> c = channels.reader();
1611 // adjust the capture length knowing that the data will be recorded to disk
1612 // only necessary after the first loop where we're recording
1613 if (capture_info.size() == 0) {
1614 capture_captured += _capture_offset;
1616 if (_alignment_style == ExistingMaterial) {
1617 capture_captured += _session.worst_output_latency();
1619 capture_captured += _roll_delay;
1625 // the next region will start recording via the normal mechanism
1626 // we'll set the start position to the current transport pos
1627 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1628 capture_start_frame = transport_frame;
1629 first_recordable_frame = transport_frame; // mild lie
1630 last_recordable_frame = max_framepos;
1631 was_recording = true;
1633 if (recordable() && destructive()) {
1634 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1636 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1637 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1639 if (transvec.len[0] > 0) {
1640 transvec.buf[0]->type = CaptureStart;
1641 transvec.buf[0]->capture_val = capture_start_frame;
1642 (*chan)->capture_transition_buf->increment_write_ptr(1);
1646 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1656 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1658 was_recording = false;
1659 first_recordable_frame = max_framepos;
1660 last_recordable_frame = max_framepos;
1662 if (capture_captured == 0) {
1666 if (recordable() && destructive()) {
1667 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1669 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1670 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1672 if (transvec.len[0] > 0) {
1673 transvec.buf[0]->type = CaptureEnd;
1674 transvec.buf[0]->capture_val = capture_captured;
1675 (*chan)->capture_transition_buf->increment_write_ptr(1);
1679 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1685 CaptureInfo* ci = new CaptureInfo;
1687 ci->start = capture_start_frame;
1688 ci->frames = capture_captured;
1690 /* XXX theoretical race condition here. Need atomic exchange ?
1691 However, the circumstances when this is called right
1692 now (either on record-disable or transport_stopped)
1693 mean that no actual race exists. I think ...
1694 We now have a capture_info_lock, but it is only to be used
1695 to synchronize in the transport_stop and the capture info
1696 accessors, so that invalidation will not occur (both non-realtime).
1699 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1701 capture_info.push_back (ci);
1702 capture_captured = 0;
1704 /* now we've finished a capture, reset first_recordable_frame for next time */
1705 first_recordable_frame = max_framepos;
1709 AudioDiskstream::set_record_enabled (bool yn)
1711 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1715 /* can't rec-enable in destructive mode if transport is before start */
1717 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1721 /* yes, i know that this not proof against race conditions, but its
1722 good enough. i think.
1725 if (record_enabled() != yn) {
1727 engage_record_enable ();
1729 disengage_record_enable ();
1732 RecordEnableChanged (); /* EMIT SIGNAL */
1737 AudioDiskstream::prep_record_enable ()
1739 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1743 /* can't rec-enable in destructive mode if transport is before start */
1745 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
1749 bool rolling = _session.transport_speed() != 0.0f;
1750 boost::shared_ptr<ChannelList> c = channels.reader();
1752 capturing_sources.clear ();
1754 if (Config->get_monitoring_model() == HardwareMonitoring) {
1756 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1757 (*chan)->source.request_input_monitoring (!(_session.config.get_auto_input() && rolling));
1758 capturing_sources.push_back ((*chan)->write_source);
1759 (*chan)->write_source->mark_streaming_write_started ();
1763 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1764 capturing_sources.push_back ((*chan)->write_source);
1765 (*chan)->write_source->mark_streaming_write_started ();
1773 AudioDiskstream::prep_record_disable ()
1775 boost::shared_ptr<ChannelList> c = channels.reader();
1776 if (Config->get_monitoring_model() == HardwareMonitoring) {
1777 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1778 (*chan)->source.request_input_monitoring (false);
1781 capturing_sources.clear ();
1787 AudioDiskstream::get_state ()
1789 XMLNode& node (Diskstream::get_state());
1791 LocaleGuard lg (X_("POSIX"));
1793 boost::shared_ptr<ChannelList> c = channels.reader();
1794 snprintf (buf, sizeof(buf), "%zd", c->size());
1795 node.add_property ("channels", buf);
1797 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1799 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1800 XMLNode* cs_grandchild;
1802 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1803 cs_grandchild = new XMLNode (X_("file"));
1804 cs_grandchild->add_property (X_("path"), (*i)->path());
1805 cs_child->add_child_nocopy (*cs_grandchild);
1808 /* store the location where capture will start */
1812 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1813 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1815 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1818 cs_child->add_property (X_("at"), buf);
1819 node.add_child_nocopy (*cs_child);
1826 AudioDiskstream::set_state (const XMLNode& node, int version)
1828 const XMLProperty* prop;
1829 XMLNodeList nlist = node.children();
1830 XMLNodeIterator niter;
1831 uint32_t nchans = 1;
1832 XMLNode* capture_pending_node = 0;
1833 LocaleGuard lg (X_("POSIX"));
1835 /* prevent write sources from being created */
1837 in_set_state = true;
1839 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1840 if ((*niter)->name() == IO::state_node_name) {
1841 deprecated_io_node = new XMLNode (**niter);
1844 if ((*niter)->name() == X_("CapturingSources")) {
1845 capture_pending_node = *niter;
1849 if (Diskstream::set_state (node, version)) {
1853 if ((prop = node.property ("channels")) != 0) {
1854 nchans = atoi (prop->value().c_str());
1857 // create necessary extra channels
1858 // we are always constructed with one and we always need one
1860 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1862 if (nchans > _n_channels.n_audio()) {
1864 add_channel (nchans - _n_channels.n_audio());
1865 IO::PortCountChanged(_n_channels);
1867 } else if (nchans < _n_channels.n_audio()) {
1869 remove_channel (_n_channels.n_audio() - nchans);
1874 if (!destructive() && capture_pending_node) {
1875 /* destructive streams have one and only one source per channel,
1876 and so they never end up in pending capture in any useful
1879 use_pending_capture_data (*capture_pending_node);
1882 in_set_state = false;
1884 /* make sure this is clear before we do anything else */
1886 capturing_sources.clear ();
1888 /* write sources are handled when we handle the input set
1889 up of the IO that owns this DS (::non_realtime_input_change())
1896 AudioDiskstream::use_new_write_source (uint32_t n)
1898 boost::shared_ptr<ChannelList> c = channels.reader();
1900 if (!recordable()) {
1904 if (n >= c->size()) {
1905 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1909 ChannelInfo* chan = (*c)[n];
1912 if ((chan->write_source = _session.create_audio_source_for_session (
1913 n_channels().n_audio(), name(), n, destructive())) == 0) {
1914 throw failed_constructor();
1918 catch (failed_constructor &err) {
1919 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1920 chan->write_source.reset ();
1924 /* do not remove destructive files even if they are empty */
1926 chan->write_source->set_allow_remove_if_empty (!destructive());
1932 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1934 ChannelList::iterator chan;
1935 boost::shared_ptr<ChannelList> c = channels.reader();
1938 if (!_session.writable() || !recordable()) {
1942 capturing_sources.clear ();
1944 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1946 if (!destructive()) {
1948 if ((*chan)->write_source) {
1950 if (mark_write_complete) {
1951 (*chan)->write_source->mark_streaming_write_completed ();
1952 (*chan)->write_source->done_with_peakfile_writes ();
1955 if ((*chan)->write_source->removable()) {
1956 (*chan)->write_source->mark_for_remove ();
1957 (*chan)->write_source->drop_references ();
1960 (*chan)->write_source.reset ();
1963 use_new_write_source (n);
1965 if (record_enabled()) {
1966 capturing_sources.push_back ((*chan)->write_source);
1971 if ((*chan)->write_source == 0) {
1972 use_new_write_source (n);
1977 if (destructive() && !c->empty ()) {
1979 /* we now have all our write sources set up, so create the
1980 playlist's single region.
1983 if (_playlist->empty()) {
1984 setup_destructive_playlist ();
1990 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1992 if (_session.get_block_size() > speed_buffer_size) {
1993 speed_buffer_size = _session.get_block_size();
1994 boost::shared_ptr<ChannelList> c = channels.reader();
1996 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1997 if ((*chan)->speed_buffer)
1998 delete [] (*chan)->speed_buffer;
1999 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2002 allocate_temporary_buffers ();
2006 AudioDiskstream::allocate_temporary_buffers ()
2008 /* make sure the wrap buffer is at least large enough to deal
2009 with the speeds up to 1.2, to allow for micro-variation
2010 when slaving to MTC, Timecode etc.
2013 double const sp = max (fabsf (_actual_speed), 1.2f);
2014 framecnt_t required_wrap_size = (framecnt_t) ceil (_session.get_block_size() * sp) + 2;
2016 if (required_wrap_size > wrap_buffer_size) {
2018 boost::shared_ptr<ChannelList> c = channels.reader();
2020 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2021 if ((*chan)->playback_wrap_buffer) {
2022 delete [] (*chan)->playback_wrap_buffer;
2024 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2025 if ((*chan)->capture_wrap_buffer) {
2026 delete [] (*chan)->capture_wrap_buffer;
2028 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2031 wrap_buffer_size = required_wrap_size;
2036 AudioDiskstream::request_input_monitoring (bool yn)
2038 boost::shared_ptr<ChannelList> c = channels.reader();
2040 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2041 (*chan)->source.request_input_monitoring (yn);
2046 AudioDiskstream::set_align_style_from_io ()
2048 bool have_physical = false;
2050 if (_alignment_choice != Automatic) {
2058 get_input_sources ();
2060 boost::shared_ptr<ChannelList> c = channels.reader();
2062 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2063 if ((*chan)->source.is_physical ()) {
2064 have_physical = true;
2069 if (have_physical) {
2070 set_align_style (ExistingMaterial);
2072 set_align_style (CaptureTime);
2077 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2079 while (how_many--) {
2080 c->push_back (new ChannelInfo(
2081 _session.butler()->audio_diskstream_playback_buffer_size(),
2082 _session.butler()->audio_diskstream_capture_buffer_size(),
2083 speed_buffer_size, wrap_buffer_size));
2084 interpolation.add_channel_to (
2085 _session.butler()->audio_diskstream_playback_buffer_size(),
2089 _n_channels.set(DataType::AUDIO, c->size());
2095 AudioDiskstream::add_channel (uint32_t how_many)
2097 RCUWriter<ChannelList> writer (channels);
2098 boost::shared_ptr<ChannelList> c = writer.get_copy();
2100 return add_channel_to (c, how_many);
2104 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2106 while (how_many-- && !c->empty()) {
2109 interpolation.remove_channel_from ();
2112 _n_channels.set(DataType::AUDIO, c->size());
2118 AudioDiskstream::remove_channel (uint32_t how_many)
2120 RCUWriter<ChannelList> writer (channels);
2121 boost::shared_ptr<ChannelList> c = writer.get_copy();
2123 return remove_channel_from (c, how_many);
2127 AudioDiskstream::playback_buffer_load () const
2129 boost::shared_ptr<ChannelList> c = channels.reader();
2135 return (float) ((double) c->front()->playback_buf->read_space()/
2136 (double) c->front()->playback_buf->bufsize());
2140 AudioDiskstream::capture_buffer_load () const
2142 boost::shared_ptr<ChannelList> c = channels.reader();
2148 return (float) ((double) c->front()->capture_buf->write_space()/
2149 (double) c->front()->capture_buf->bufsize());
2153 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2155 const XMLProperty* prop;
2156 XMLNodeList nlist = node.children();
2157 XMLNodeIterator niter;
2158 boost::shared_ptr<AudioFileSource> fs;
2159 boost::shared_ptr<AudioFileSource> first_fs;
2160 SourceList pending_sources;
2161 framepos_t position;
2163 if ((prop = node.property (X_("at"))) == 0) {
2167 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2171 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2172 if ((*niter)->name() == X_("file")) {
2174 if ((prop = (*niter)->property (X_("path"))) == 0) {
2178 // This protects sessions from errant CapturingSources in stored sessions
2180 if (stat (prop->value().c_str(), &sbuf)) {
2185 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2186 SourceFactory::createWritable (
2187 DataType::AUDIO, _session,
2188 prop->value(), false, _session.frame_rate()));
2191 catch (failed_constructor& err) {
2192 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2193 _name, prop->value())
2198 pending_sources.push_back (fs);
2200 if (first_fs == 0) {
2204 fs->set_captured_for (_name.val());
2208 if (pending_sources.size() == 0) {
2209 /* nothing can be done */
2213 if (pending_sources.size() != _n_channels.n_audio()) {
2214 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2219 boost::shared_ptr<AudioRegion> region;
2225 plist.add (Properties::start, 0);
2226 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2227 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2229 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2231 region->set_automatic (true);
2232 region->set_whole_file (true);
2233 region->special_set_position (0);
2236 catch (failed_constructor& err) {
2237 error << string_compose (
2238 _("%1: cannot create whole-file region from pending capture sources"),
2244 _playlist->add_region (region, position);
2250 AudioDiskstream::set_non_layered (bool yn)
2252 if (yn != non_layered()) {
2255 _flags = Flag (_flags | NonLayered);
2257 _flags = Flag (_flags & ~NonLayered);
2265 AudioDiskstream::set_destructive (bool yn)
2267 if (yn != destructive()) {
2270 bool bounce_ignored;
2271 /* requestor should already have checked this and
2272 bounced if necessary and desired
2274 if (!can_become_destructive (bounce_ignored)) {
2277 _flags = Flag (_flags | Destructive);
2278 use_destructive_playlist ();
2280 _flags = Flag (_flags & ~Destructive);
2281 reset_write_sources (true, true);
2289 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2292 requires_bounce = false;
2296 /* is there only one region ? */
2298 if (_playlist->n_regions() != 1) {
2299 requires_bounce = true;
2303 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2305 requires_bounce = false;
2309 /* do the source(s) for the region cover the session start position ? */
2311 if (first->position() != _session.current_start_frame()) {
2312 if (first->start() > _session.current_start_frame()) {
2313 requires_bounce = true;
2318 /* is the source used by only 1 playlist ? */
2320 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2324 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2325 requires_bounce = true;
2329 requires_bounce = false;
2334 AudioDiskstream::adjust_playback_buffering ()
2336 boost::shared_ptr<ChannelList> c = channels.reader();
2338 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2339 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2344 AudioDiskstream::adjust_capture_buffering ()
2346 boost::shared_ptr<ChannelList> c = channels.reader();
2348 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2349 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2354 AudioDiskstream::ChannelSource::is_physical () const
2360 return AudioEngine::instance()->port_is_physical (name);
2364 AudioDiskstream::ChannelSource::request_input_monitoring (bool yn) const
2370 return AudioEngine::instance()->request_input_monitoring (name, yn);
2373 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2375 current_capture_buffer = 0;
2376 current_playback_buffer = 0;
2377 curr_capture_cnt = 0;
2379 speed_buffer = new Sample[speed_size];
2380 playback_wrap_buffer = new Sample[wrap_size];
2381 capture_wrap_buffer = new Sample[wrap_size];
2383 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2384 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2385 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2387 /* touch the ringbuffer buffers, which will cause
2388 them to be mapped into locked physical RAM if
2389 we're running with mlockall(). this doesn't do
2393 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2394 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2395 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2399 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2401 delete playback_buf;
2402 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2403 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2407 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2411 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2412 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2415 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2417 write_source.reset ();
2419 delete [] speed_buffer;
2422 delete [] playback_wrap_buffer;
2423 playback_wrap_buffer = 0;
2425 delete [] capture_wrap_buffer;
2426 capture_wrap_buffer = 0;
2428 delete playback_buf;
2434 delete capture_transition_buf;
2435 capture_transition_buf = 0;
2440 AudioDiskstream::set_name (string const & name)
2442 Diskstream::set_name (name);
2444 /* get a new write source so that its name reflects the new diskstream name */
2446 boost::shared_ptr<ChannelList> c = channels.reader();
2447 ChannelList::iterator i;
2450 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2451 use_new_write_source (n);