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::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 (framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance)
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::Mutex::Lock sm (state_lock, Glib::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 = ap->get_audio_buffer (nframes).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 = ap->get_audio_buffer(nframes).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) floor ((nframes * fabs (_actual_speed))) + 1;
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 /* Copy buf[0] from playback_buf */
622 memcpy ((char *) chaninfo->playback_wrap_buffer,
623 chaninfo->playback_vector.buf[0],
624 chaninfo->playback_vector.len[0] * sizeof (Sample));
626 /* Copy buf[1] from playback_buf */
627 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
628 chaninfo->playback_vector.buf[1],
629 (necessary_samples - chaninfo->playback_vector.len[0])
632 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
637 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
639 interpolation.set_speed (_target_speed);
642 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++channel) {
643 ChannelInfo* chaninfo (*chan);
645 playback_distance = interpolation.interpolate (
646 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
648 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
652 playback_distance = nframes;
655 _speed = _target_speed;
661 /** Update various things including playback_sample, read pointer on each channel's playback_buf
662 * and write pointer on each channel's capture_buf. Also wout whether the butler is needed.
663 * @return true if the butler is required.
666 AudioDiskstream::commit (framecnt_t playback_distance)
668 bool need_butler = false;
670 if (!_io || !_io->active()) {
674 if (_actual_speed < 0.0) {
675 playback_sample -= playback_distance;
677 playback_sample += playback_distance;
680 boost::shared_ptr<ChannelList> c = channels.reader();
681 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
683 (*chan)->playback_buf->increment_read_ptr (playback_distance);
685 if (adjust_capture_position) {
686 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
690 if (adjust_capture_position != 0) {
691 capture_captured += adjust_capture_position;
692 adjust_capture_position = 0;
700 if (_io && _io->active()) {
701 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
706 if (_io && _io->active()) {
707 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
708 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
710 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
718 AudioDiskstream::set_pending_overwrite (bool yn)
720 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
722 _pending_overwrite = yn;
724 overwrite_frame = playback_sample;
726 boost::shared_ptr<ChannelList> c = channels.reader ();
728 overwrite_offset = c->front()->playback_buf->get_read_ptr();
733 AudioDiskstream::overwrite_existing_buffers ()
735 boost::shared_ptr<ChannelList> c = channels.reader();
737 _pending_overwrite = false;
741 Sample* mixdown_buffer;
744 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
746 overwrite_queued = false;
748 /* assume all are the same size */
749 framecnt_t size = c->front()->playback_buf->bufsize();
751 mixdown_buffer = new Sample[size];
752 gain_buffer = new float[size];
754 /* reduce size so that we can fill the buffer correctly (ringbuffers
755 can only handle size-1, otherwise they appear to be empty)
762 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
764 start = overwrite_frame;
765 framecnt_t cnt = size;
767 /* to fill the buffer without resetting the playback sample, we need to
768 do it one or two chunks (normally two).
770 |----------------------------------------------------------------------|
774 |<- second chunk->||<----------------- first chunk ------------------>|
778 framecnt_t to_read = size - overwrite_offset;
780 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, n, reversed)) {
781 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
782 id(), size, playback_sample) << endmsg;
790 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer, start, cnt, n, reversed)) {
791 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
792 id(), size, playback_sample) << endmsg;
801 _pending_overwrite = false;
802 delete [] gain_buffer;
803 delete [] mixdown_buffer;
808 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
812 ChannelList::iterator chan;
813 boost::shared_ptr<ChannelList> c = channels.reader();
815 Glib::Mutex::Lock lm (state_lock);
817 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
818 (*chan)->playback_buf->reset ();
819 (*chan)->capture_buf->reset ();
822 /* can't rec-enable in destructive mode if transport is before start */
824 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
825 disengage_record_enable ();
828 playback_sample = frame;
831 if (complete_refill) {
832 while ((ret = do_refill_with_alloc ()) > 0) ;
834 ret = do_refill_with_alloc ();
841 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
843 ChannelList::iterator chan;
844 boost::shared_ptr<ChannelList> c = channels.reader();
846 for (chan = c->begin(); chan != c->end(); ++chan) {
847 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
855 AudioDiskstream::internal_playback_seek (framecnt_t distance)
857 ChannelList::iterator chan;
858 boost::shared_ptr<ChannelList> c = channels.reader();
860 for (chan = c->begin(); chan != c->end(); ++chan) {
861 (*chan)->playback_buf->increment_read_ptr (distance);
864 if (first_recordable_frame < max_framepos) {
865 first_recordable_frame += distance;
867 playback_sample += distance;
872 /** Read some data for 1 channel from our playlist into a buffer.
873 * @param buf Buffer to write to.
874 * @param start Session frame to start reading from; updated to where we end up
876 * @param cnt Count of samples to read.
877 * @param reversed true if we are running backwards, otherwise false.
880 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
881 framepos_t& start, framecnt_t cnt,
882 int channel, bool reversed)
884 framecnt_t this_read = 0;
886 framepos_t loop_end = 0;
887 framepos_t loop_start = 0;
888 framecnt_t offset = 0;
891 /* XXX we don't currently play loops in reverse. not sure why */
895 framecnt_t loop_length = 0;
897 /* Make the use of a Location atomic for this read operation.
899 Note: Locations don't get deleted, so all we care about
900 when I say "atomic" is that we are always pointing to
901 the same one and using a start/length values obtained
905 if ((loc = loop_location) != 0) {
906 loop_start = loc->start();
907 loop_end = loc->end();
908 loop_length = loop_end - loop_start;
911 /* if we are looping, ensure that the first frame we read is at the correct
912 position within the loop.
915 if (loc && start >= loop_end) {
916 start = loop_start + ((start - loop_start) % loop_length);
924 /* We need this while loop in case we hit a loop boundary, in which case our read from
925 the playlist must be split into more than one section.
930 /* take any loop into account. we can't read past the end of the loop. */
932 if (loc && (loop_end - start < cnt)) {
933 this_read = loop_end - start;
940 if (this_read == 0) {
944 this_read = min(cnt,this_read);
946 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
947 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), id(), this_read,
954 swap_by_ptr (buf, buf + this_read - 1);
958 /* if we read to the end of the loop, go back to the beginning */
975 AudioDiskstream::do_refill_with_alloc ()
977 Sample* mix_buf = new Sample[disk_io_chunk_frames];
978 float* gain_buf = new float[disk_io_chunk_frames];
980 int ret = _do_refill(mix_buf, gain_buf);
988 /** Get some more data from disk and put it in our channels' playback_bufs,
989 * if there is suitable space in them.
992 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
996 RingBufferNPT<Sample>::rw_vector vector;
997 bool const reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
998 framecnt_t total_space;
999 framecnt_t zero_fill;
1001 ChannelList::iterator i;
1002 boost::shared_ptr<ChannelList> c = channels.reader();
1009 assert(mixdown_buffer);
1010 assert(gain_buffer);
1017 c->front()->playback_buf->get_write_vector (&vector);
1019 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1020 /* nowhere to write to */
1024 /* if there are 2+ chunks of disk i/o possible for
1025 this track, let the caller know so that it can arrange
1026 for us to be called again, ASAP.
1029 if (total_space >= (_slaved ? 3 : 2) * disk_io_chunk_frames) {
1033 /* if we're running close to normal speed and there isn't enough
1034 space to do disk_io_chunk_frames of I/O, then don't bother.
1036 at higher speeds, just do it because the sync between butler
1037 and audio thread may not be good enough.
1039 Note: it is a design assumption that disk_io_chunk_frames is smaller
1040 than the playback buffer size, so this check should never trip when
1041 the playback buffer is empty.
1044 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1048 /* when slaved, don't try to get too close to the read pointer. this
1049 leaves space for the buffer reversal to have something useful to
1053 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1057 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1059 total_space = min (disk_io_chunk_frames, total_space);
1063 if (file_frame == 0) {
1065 /* at start: nothing to do but fill with silence */
1067 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1069 ChannelInfo* chan (*i);
1070 chan->playback_buf->get_write_vector (&vector);
1071 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1072 if (vector.len[1]) {
1073 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1075 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1080 if (file_frame < total_space) {
1082 /* too close to the start: read what we can,
1083 and then zero fill the rest
1086 zero_fill = total_space - file_frame;
1087 total_space = file_frame;
1096 if (file_frame == max_framepos) {
1098 /* at end: nothing to do but fill with silence */
1100 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1102 ChannelInfo* chan (*i);
1103 chan->playback_buf->get_write_vector (&vector);
1104 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1105 if (vector.len[1]) {
1106 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1108 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1113 if (file_frame > max_framepos - total_space) {
1115 /* to close to the end: read what we can, and zero fill the rest */
1117 zero_fill = total_space - (max_framepos - file_frame);
1118 total_space = max_framepos - file_frame;
1125 framepos_t file_frame_tmp = 0;
1127 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1129 ChannelInfo* chan (*i);
1132 framecnt_t len1, len2;
1134 chan->playback_buf->get_write_vector (&vector);
1136 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1138 /* we're not going to fill the first chunk, so certainly do not bother with the
1139 other part. it won't be connected with the part we do fill, as in:
1141 .... => writable space
1142 ++++ => readable space
1143 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1145 |......|+++++++++++++|...............................|
1150 So, just pretend that the buf1 part isn't there.
1160 file_frame_tmp = file_frame;
1162 buf1 = vector.buf[0];
1163 len1 = vector.len[0];
1164 buf2 = vector.buf[1];
1165 len2 = vector.len[1];
1167 to_read = min (ts, len1);
1168 to_read = min (to_read, disk_io_chunk_frames);
1170 assert (to_read >= 0);
1174 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1179 chan->playback_buf->increment_write_ptr (to_read);
1183 to_read = min (ts, len2);
1187 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1188 so read some or all of vector.len[1] as well.
1191 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan_n, reversed)) {
1196 chan->playback_buf->increment_write_ptr (to_read);
1200 /* XXX: do something */
1205 file_frame = file_frame_tmp;
1206 assert (file_frame >= 0);
1213 /** Flush pending data to disk.
1215 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1216 * of data to disk. it will never write more than that. If it writes that
1217 * much and there is more than that waiting to be written, it will return 1,
1218 * otherwise 0 on success or -1 on failure.
1220 * If there is less than disk_io_chunk_frames to be written, no data will be
1221 * written at all unless @a force_flush is true.
1224 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1228 RingBufferNPT<Sample>::rw_vector vector;
1229 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1232 transvec.buf[0] = 0;
1233 transvec.buf[1] = 0;
1237 boost::shared_ptr<ChannelList> c = channels.reader();
1238 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1240 (*chan)->capture_buf->get_read_vector (&vector);
1242 total = vector.len[0] + vector.len[1];
1244 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1248 /* if there are 2+ chunks of disk i/o possible for
1249 this track, let the caller know so that it can arrange
1250 for us to be called again, ASAP.
1252 if we are forcing a flush, then if there is* any* extra
1253 work, let the caller know.
1255 if we are no longer recording and there is any extra work,
1256 let the caller know too.
1259 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1263 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1265 // check the transition buffer when recording destructive
1266 // important that we get this after the capture buf
1268 if (destructive()) {
1269 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1270 size_t transcount = transvec.len[0] + transvec.len[1];
1273 for (ti=0; ti < transcount; ++ti) {
1274 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1276 if (captrans.type == CaptureStart) {
1277 // by definition, the first data we got above represents the given capture pos
1279 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1280 (*chan)->curr_capture_cnt = 0;
1282 } else if (captrans.type == CaptureEnd) {
1284 // capture end, the capture_val represents total frames in capture
1286 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1288 // shorten to make the write a perfect fit
1289 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1291 if (nto_write < to_write) {
1292 ret = 1; // should we?
1294 to_write = nto_write;
1296 (*chan)->write_source->mark_capture_end ();
1298 // increment past this transition, but go no further
1303 // actually ends just beyond this chunk, so force more work
1311 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1315 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1316 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1320 (*chan)->capture_buf->increment_read_ptr (to_write);
1321 (*chan)->curr_capture_cnt += to_write;
1323 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1325 /* we wrote all of vector.len[0] but it wasn't an entire
1326 disk_io_chunk_frames of data, so arrange for some part
1327 of vector.len[1] to be flushed to disk as well.
1330 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1332 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1333 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1337 (*chan)->capture_buf->increment_read_ptr (to_write);
1338 (*chan)->curr_capture_cnt += to_write;
1347 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1349 uint32_t buffer_position;
1350 bool more_work = true;
1352 boost::shared_ptr<AudioRegion> region;
1353 framecnt_t total_capture;
1355 SourceList::iterator src;
1356 ChannelList::iterator chan;
1357 vector<CaptureInfo*>::iterator ci;
1358 boost::shared_ptr<ChannelList> c = channels.reader();
1360 bool mark_write_completed = false;
1364 /* butler is already stopped, but there may be work to do
1365 to flush remaining data to disk.
1368 while (more_work && !err) {
1369 switch (do_flush (TransportContext, true)) {
1376 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1381 /* XXX is there anything we can do if err != 0 ? */
1382 Glib::Mutex::Lock lm (capture_info_lock);
1384 if (capture_info.empty()) {
1388 if (abort_capture) {
1390 if (destructive()) {
1394 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1396 if ((*chan)->write_source) {
1398 (*chan)->write_source->mark_for_remove ();
1399 (*chan)->write_source->drop_references ();
1400 (*chan)->write_source.reset ();
1403 /* new source set up in "out" below */
1409 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1410 total_capture += (*ci)->frames;
1413 /* figure out the name for this take */
1415 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1417 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1421 s->update_header (capture_info.front()->start, when, twhen);
1422 s->set_captured_for (_name.val());
1423 s->mark_immutable ();
1425 if (Config->get_auto_analyse_audio()) {
1426 Analyser::queue_source_for_analysis (s, true);
1431 /* destructive tracks have a single, never changing region */
1433 if (destructive()) {
1435 /* send a signal that any UI can pick up to do the right thing. there is
1436 a small problem here in that a UI may need the peak data to be ready
1437 for the data that was recorded and this isn't interlocked with that
1438 process. this problem is deferred to the UI.
1441 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1445 string whole_file_region_name;
1446 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1448 /* Register a new region with the Session that
1449 describes the entire source. Do this first
1450 so that any sub-regions will obviously be
1451 children of this one (later!)
1457 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1458 plist.add (Properties::length, total_capture);
1459 plist.add (Properties::name, whole_file_region_name);
1460 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1461 rx->set_automatic (true);
1462 rx->set_whole_file (true);
1464 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1465 region->special_set_position (capture_info.front()->start);
1469 catch (failed_constructor& err) {
1470 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1474 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1476 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1478 _playlist->clear_changes ();
1479 _playlist->set_capture_insertion_in_progress (true);
1480 _playlist->freeze ();
1482 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1486 RegionFactory::region_name (region_name, whole_file_region_name, false);
1488 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1489 _name, (*ci)->start, (*ci)->frames, region_name));
1495 plist.add (Properties::start, buffer_position);
1496 plist.add (Properties::length, (*ci)->frames);
1497 plist.add (Properties::name, region_name);
1499 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1500 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1503 catch (failed_constructor& err) {
1504 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1505 continue; /* XXX is this OK? */
1508 i_am_the_modifier++;
1510 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1511 _playlist->set_layer (region, DBL_MAX);
1512 i_am_the_modifier--;
1514 buffer_position += (*ci)->frames;
1518 _playlist->set_capture_insertion_in_progress (false);
1519 _session.add_command (new StatefulDiffCommand (_playlist));
1522 mark_write_completed = true;
1525 reset_write_sources (mark_write_completed);
1529 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1533 capture_info.clear ();
1534 capture_start_frame = 0;
1538 AudioDiskstream::transport_looped (framepos_t transport_frame)
1540 if (was_recording) {
1541 // all we need to do is finish this capture, with modified capture length
1542 boost::shared_ptr<ChannelList> c = channels.reader();
1544 // adjust the capture length knowing that the data will be recorded to disk
1545 // only necessary after the first loop where we're recording
1546 if (capture_info.size() == 0) {
1547 capture_captured += _capture_offset;
1549 if (_alignment_style == ExistingMaterial) {
1550 capture_captured += _session.worst_output_latency();
1552 capture_captured += _roll_delay;
1558 // the next region will start recording via the normal mechanism
1559 // we'll set the start position to the current transport pos
1560 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1561 capture_start_frame = transport_frame;
1562 first_recordable_frame = transport_frame; // mild lie
1563 last_recordable_frame = max_framepos;
1564 was_recording = true;
1566 if (recordable() && destructive()) {
1567 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1569 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1570 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1572 if (transvec.len[0] > 0) {
1573 transvec.buf[0]->type = CaptureStart;
1574 transvec.buf[0]->capture_val = capture_start_frame;
1575 (*chan)->capture_transition_buf->increment_write_ptr(1);
1579 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1589 AudioDiskstream::finish_capture (boost::shared_ptr<ChannelList> c)
1591 was_recording = false;
1592 first_recordable_frame = max_framepos;
1593 last_recordable_frame = max_framepos;
1595 if (capture_captured == 0) {
1599 if (recordable() && destructive()) {
1600 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1602 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1603 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1605 if (transvec.len[0] > 0) {
1606 transvec.buf[0]->type = CaptureEnd;
1607 transvec.buf[0]->capture_val = capture_captured;
1608 (*chan)->capture_transition_buf->increment_write_ptr(1);
1612 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1618 CaptureInfo* ci = new CaptureInfo;
1620 ci->start = capture_start_frame;
1621 ci->frames = capture_captured;
1623 /* XXX theoretical race condition here. Need atomic exchange ?
1624 However, the circumstances when this is called right
1625 now (either on record-disable or transport_stopped)
1626 mean that no actual race exists. I think ...
1627 We now have a capture_info_lock, but it is only to be used
1628 to synchronize in the transport_stop and the capture info
1629 accessors, so that invalidation will not occur (both non-realtime).
1632 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1634 capture_info.push_back (ci);
1635 capture_captured = 0;
1637 /* now we've finished a capture, reset first_recordable_frame for next time */
1638 first_recordable_frame = max_framepos;
1642 AudioDiskstream::set_record_enabled (bool yn)
1644 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1648 /* can't rec-enable in destructive mode if transport is before start */
1650 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1654 /* yes, i know that this not proof against race conditions, but its
1655 good enough. i think.
1658 if (record_enabled() != yn) {
1660 engage_record_enable ();
1662 disengage_record_enable ();
1668 AudioDiskstream::engage_record_enable ()
1670 bool rolling = _session.transport_speed() != 0.0f;
1671 boost::shared_ptr<ChannelList> c = channels.reader();
1673 g_atomic_int_set (&_record_enabled, 1);
1674 capturing_sources.clear ();
1676 if (Config->get_monitoring_model() == HardwareMonitoring) {
1678 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1679 (*chan)->source.request_jack_monitors_input (!(_session.config.get_auto_input() && rolling));
1680 capturing_sources.push_back ((*chan)->write_source);
1681 (*chan)->write_source->mark_streaming_write_started ();
1685 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1686 capturing_sources.push_back ((*chan)->write_source);
1687 (*chan)->write_source->mark_streaming_write_started ();
1691 RecordEnableChanged (); /* EMIT SIGNAL */
1695 AudioDiskstream::disengage_record_enable ()
1697 g_atomic_int_set (&_record_enabled, 0);
1698 boost::shared_ptr<ChannelList> c = channels.reader();
1699 if (Config->get_monitoring_model() == HardwareMonitoring) {
1700 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1701 (*chan)->source.request_jack_monitors_input (false);
1704 capturing_sources.clear ();
1705 RecordEnableChanged (); /* EMIT SIGNAL */
1709 AudioDiskstream::get_state ()
1711 XMLNode& node (Diskstream::get_state());
1713 LocaleGuard lg (X_("POSIX"));
1715 boost::shared_ptr<ChannelList> c = channels.reader();
1716 snprintf (buf, sizeof(buf), "%zd", c->size());
1717 node.add_property ("channels", buf);
1719 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1721 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1722 XMLNode* cs_grandchild;
1724 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1725 cs_grandchild = new XMLNode (X_("file"));
1726 cs_grandchild->add_property (X_("path"), (*i)->path());
1727 cs_child->add_child_nocopy (*cs_grandchild);
1730 /* store the location where capture will start */
1734 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1735 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1737 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1740 cs_child->add_property (X_("at"), buf);
1741 node.add_child_nocopy (*cs_child);
1748 AudioDiskstream::set_state (const XMLNode& node, int version)
1750 const XMLProperty* prop;
1751 XMLNodeList nlist = node.children();
1752 XMLNodeIterator niter;
1753 uint32_t nchans = 1;
1754 XMLNode* capture_pending_node = 0;
1755 LocaleGuard lg (X_("POSIX"));
1757 /* prevent write sources from being created */
1759 in_set_state = true;
1761 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1762 if ((*niter)->name() == IO::state_node_name) {
1763 deprecated_io_node = new XMLNode (**niter);
1766 if ((*niter)->name() == X_("CapturingSources")) {
1767 capture_pending_node = *niter;
1771 if (Diskstream::set_state (node, version)) {
1775 if ((prop = node.property ("channels")) != 0) {
1776 nchans = atoi (prop->value().c_str());
1779 // create necessary extra channels
1780 // we are always constructed with one and we always need one
1782 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1784 if (nchans > _n_channels.n_audio()) {
1786 add_channel (nchans - _n_channels.n_audio());
1787 IO::PortCountChanged(_n_channels);
1789 } else if (nchans < _n_channels.n_audio()) {
1791 remove_channel (_n_channels.n_audio() - nchans);
1796 if (!destructive() && capture_pending_node) {
1797 /* destructive streams have one and only one source per channel,
1798 and so they never end up in pending capture in any useful
1801 use_pending_capture_data (*capture_pending_node);
1804 in_set_state = false;
1806 /* make sure this is clear before we do anything else */
1808 capturing_sources.clear ();
1810 /* write sources are handled when we handle the input set
1811 up of the IO that owns this DS (::non_realtime_input_change())
1818 AudioDiskstream::use_new_write_source (uint32_t n)
1820 boost::shared_ptr<ChannelList> c = channels.reader();
1822 if (!recordable()) {
1826 if (n >= c->size()) {
1827 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1831 ChannelInfo* chan = (*c)[n];
1834 if ((chan->write_source = _session.create_audio_source_for_session (
1835 n_channels().n_audio(), name(), n, destructive())) == 0) {
1836 throw failed_constructor();
1840 catch (failed_constructor &err) {
1841 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1842 chan->write_source.reset ();
1846 /* do not remove destructive files even if they are empty */
1848 chan->write_source->set_allow_remove_if_empty (!destructive());
1853 list<boost::shared_ptr<Source> >
1854 AudioDiskstream::steal_write_sources()
1856 /* not possible to steal audio write sources */
1857 list<boost::shared_ptr<Source> > ret;
1862 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1864 ChannelList::iterator chan;
1865 boost::shared_ptr<ChannelList> c = channels.reader();
1868 if (!_session.writable() || !recordable()) {
1872 capturing_sources.clear ();
1874 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1876 if (!destructive()) {
1878 if ((*chan)->write_source) {
1880 if (mark_write_complete) {
1881 (*chan)->write_source->mark_streaming_write_completed ();
1882 (*chan)->write_source->done_with_peakfile_writes ();
1885 if ((*chan)->write_source->removable()) {
1886 (*chan)->write_source->mark_for_remove ();
1887 (*chan)->write_source->drop_references ();
1890 (*chan)->write_source.reset ();
1893 use_new_write_source (n);
1895 if (record_enabled()) {
1896 capturing_sources.push_back ((*chan)->write_source);
1901 if ((*chan)->write_source == 0) {
1902 use_new_write_source (n);
1907 if (destructive() && !c->empty ()) {
1909 /* we now have all our write sources set up, so create the
1910 playlist's single region.
1913 if (_playlist->empty()) {
1914 setup_destructive_playlist ();
1920 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1922 if (_session.get_block_size() > speed_buffer_size) {
1923 speed_buffer_size = _session.get_block_size();
1924 boost::shared_ptr<ChannelList> c = channels.reader();
1926 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1927 if ((*chan)->speed_buffer)
1928 delete [] (*chan)->speed_buffer;
1929 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1932 allocate_temporary_buffers ();
1936 AudioDiskstream::allocate_temporary_buffers ()
1938 /* make sure the wrap buffer is at least large enough to deal
1939 with the speeds up to 1.2, to allow for micro-variation
1940 when slaving to MTC, Timecode etc.
1943 double const sp = max (fabsf (_actual_speed), 1.2f);
1944 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1946 if (required_wrap_size > wrap_buffer_size) {
1948 boost::shared_ptr<ChannelList> c = channels.reader();
1950 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1951 if ((*chan)->playback_wrap_buffer) {
1952 delete [] (*chan)->playback_wrap_buffer;
1954 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1955 if ((*chan)->capture_wrap_buffer) {
1956 delete [] (*chan)->capture_wrap_buffer;
1958 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1961 wrap_buffer_size = required_wrap_size;
1966 AudioDiskstream::request_jack_monitors_input (bool yn)
1968 boost::shared_ptr<ChannelList> c = channels.reader();
1970 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1971 (*chan)->source.request_jack_monitors_input (yn);
1976 AudioDiskstream::set_align_style_from_io ()
1978 bool have_physical = false;
1980 if (_alignment_choice != Automatic) {
1988 get_input_sources ();
1990 boost::shared_ptr<ChannelList> c = channels.reader();
1992 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1993 if ((*chan)->source.is_physical ()) {
1994 have_physical = true;
1999 if (have_physical) {
2000 set_align_style (ExistingMaterial);
2002 set_align_style (CaptureTime);
2007 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2009 while (how_many--) {
2010 c->push_back (new ChannelInfo(
2011 _session.butler()->audio_diskstream_playback_buffer_size(),
2012 _session.butler()->audio_diskstream_capture_buffer_size(),
2013 speed_buffer_size, wrap_buffer_size));
2014 interpolation.add_channel_to (
2015 _session.butler()->audio_diskstream_playback_buffer_size(),
2019 _n_channels.set(DataType::AUDIO, c->size());
2025 AudioDiskstream::add_channel (uint32_t how_many)
2027 RCUWriter<ChannelList> writer (channels);
2028 boost::shared_ptr<ChannelList> c = writer.get_copy();
2030 return add_channel_to (c, how_many);
2034 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2036 while (how_many-- && !c->empty()) {
2039 interpolation.remove_channel_from ();
2042 _n_channels.set(DataType::AUDIO, c->size());
2048 AudioDiskstream::remove_channel (uint32_t how_many)
2050 RCUWriter<ChannelList> writer (channels);
2051 boost::shared_ptr<ChannelList> c = writer.get_copy();
2053 return remove_channel_from (c, how_many);
2057 AudioDiskstream::playback_buffer_load () const
2059 boost::shared_ptr<ChannelList> c = channels.reader();
2065 return (float) ((double) c->front()->playback_buf->read_space()/
2066 (double) c->front()->playback_buf->bufsize());
2070 AudioDiskstream::capture_buffer_load () const
2072 boost::shared_ptr<ChannelList> c = channels.reader();
2078 return (float) ((double) c->front()->capture_buf->write_space()/
2079 (double) c->front()->capture_buf->bufsize());
2083 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2085 const XMLProperty* prop;
2086 XMLNodeList nlist = node.children();
2087 XMLNodeIterator niter;
2088 boost::shared_ptr<AudioFileSource> fs;
2089 boost::shared_ptr<AudioFileSource> first_fs;
2090 SourceList pending_sources;
2091 framepos_t position;
2093 if ((prop = node.property (X_("at"))) == 0) {
2097 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2101 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2102 if ((*niter)->name() == X_("file")) {
2104 if ((prop = (*niter)->property (X_("path"))) == 0) {
2108 // This protects sessions from errant CapturingSources in stored sessions
2110 if (stat (prop->value().c_str(), &sbuf)) {
2115 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2116 SourceFactory::createWritable (
2117 DataType::AUDIO, _session,
2118 prop->value(), string(), false, _session.frame_rate()));
2121 catch (failed_constructor& err) {
2122 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2123 _name, prop->value())
2128 pending_sources.push_back (fs);
2130 if (first_fs == 0) {
2134 fs->set_captured_for (_name.val());
2138 if (pending_sources.size() == 0) {
2139 /* nothing can be done */
2143 if (pending_sources.size() != _n_channels.n_audio()) {
2144 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2149 boost::shared_ptr<AudioRegion> region;
2155 plist.add (Properties::start, 0);
2156 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2157 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2159 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2161 region->set_automatic (true);
2162 region->set_whole_file (true);
2163 region->special_set_position (0);
2166 catch (failed_constructor& err) {
2167 error << string_compose (
2168 _("%1: cannot create whole-file region from pending capture sources"),
2174 _playlist->add_region (region, position);
2180 AudioDiskstream::set_non_layered (bool yn)
2182 if (yn != non_layered()) {
2185 _flags = Flag (_flags | NonLayered);
2187 _flags = Flag (_flags & ~NonLayered);
2195 AudioDiskstream::set_destructive (bool yn)
2197 if (yn != destructive()) {
2200 bool bounce_ignored;
2201 /* requestor should already have checked this and
2202 bounced if necessary and desired
2204 if (!can_become_destructive (bounce_ignored)) {
2207 _flags = Flag (_flags | Destructive);
2208 use_destructive_playlist ();
2210 _flags = Flag (_flags & ~Destructive);
2211 reset_write_sources (true, true);
2219 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2222 requires_bounce = false;
2226 /* is there only one region ? */
2228 if (_playlist->n_regions() != 1) {
2229 requires_bounce = true;
2233 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2235 requires_bounce = false;
2239 /* do the source(s) for the region cover the session start position ? */
2241 if (first->position() != _session.current_start_frame()) {
2242 if (first->start() > _session.current_start_frame()) {
2243 requires_bounce = true;
2248 /* is the source used by only 1 playlist ? */
2250 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2254 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2255 requires_bounce = true;
2259 requires_bounce = false;
2264 AudioDiskstream::adjust_playback_buffering ()
2266 boost::shared_ptr<ChannelList> c = channels.reader();
2268 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2269 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2274 AudioDiskstream::adjust_capture_buffering ()
2276 boost::shared_ptr<ChannelList> c = channels.reader();
2278 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2279 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2284 AudioDiskstream::ChannelSource::is_physical () const
2290 return AudioEngine::instance()->port_is_physical (name);
2294 AudioDiskstream::ChannelSource::request_jack_monitors_input (bool yn) const
2300 return AudioEngine::instance()->request_jack_monitors_input (name, yn);
2303 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2305 current_capture_buffer = 0;
2306 current_playback_buffer = 0;
2307 curr_capture_cnt = 0;
2309 speed_buffer = new Sample[speed_size];
2310 playback_wrap_buffer = new Sample[wrap_size];
2311 capture_wrap_buffer = new Sample[wrap_size];
2313 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2314 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2315 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2317 /* touch the ringbuffer buffers, which will cause
2318 them to be mapped into locked physical RAM if
2319 we're running with mlockall(). this doesn't do
2323 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2324 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2325 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2329 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2331 delete playback_buf;
2332 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2333 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2337 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2341 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2342 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2345 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2347 write_source.reset ();
2349 delete [] speed_buffer;
2352 delete [] playback_wrap_buffer;
2353 playback_wrap_buffer = 0;
2355 delete [] capture_wrap_buffer;
2356 capture_wrap_buffer = 0;
2358 delete playback_buf;
2364 delete capture_transition_buf;
2365 capture_transition_buf = 0;
2370 AudioDiskstream::set_name (string const & name)
2372 Diskstream::set_name (name);
2374 /* get a new write source so that its name reflects the new diskstream name */
2376 boost::shared_ptr<ChannelList> c = channels.reader();
2377 ChannelList::iterator i;
2380 for (n = 0, i = c->begin(); i != c->end(); ++i, ++n) {
2381 use_new_write_source (n);