2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include "pbd/error.h"
34 #include <glibmm/thread.h>
35 #include "pbd/xml++.h"
36 #include "pbd/memento_command.h"
37 #include "pbd/enumwriter.h"
38 #include "pbd/stacktrace.h"
40 #include "ardour/analyser.h"
41 #include "ardour/ardour.h"
42 #include "ardour/audio_buffer.h"
43 #include "ardour/audio_diskstream.h"
44 #include "ardour/audio_port.h"
45 #include "ardour/audioengine.h"
46 #include "ardour/audiofilesource.h"
48 #include "ardour/audioplaylist.h"
49 #include "ardour/audioregion.h"
50 #include "ardour/butler.h"
51 #include "ardour/configuration.h"
52 #include "ardour/cycle_timer.h"
53 #include "ardour/debug.h"
54 #include "ardour/io.h"
55 #include "ardour/playlist_factory.h"
56 #include "ardour/region_factory.h"
57 #include "ardour/send.h"
58 #include "ardour/session.h"
59 #include "ardour/source_factory.h"
60 #include "ardour/utils.h"
61 #include "ardour/session_playlists.h"
67 using namespace ARDOUR;
70 size_t AudioDiskstream::_working_buffers_size = 0;
71 Sample* AudioDiskstream::_mixdown_buffer = 0;
72 gain_t* AudioDiskstream::_gain_buffer = 0;
74 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
75 : Diskstream(sess, name, flag)
76 , deprecated_io_node(NULL)
77 , channels (new ChannelList)
79 /* prevent any write sources from being created */
89 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
90 : Diskstream(sess, node)
91 , deprecated_io_node(NULL)
92 , channels (new ChannelList)
97 if (set_state (node, Stateful::loading_state_version)) {
99 throw failed_constructor();
102 in_set_state = false;
105 use_destructive_playlist ();
110 AudioDiskstream::init (Diskstream::Flag f)
114 /* there are no channels at this point, so these
115 two calls just get speed_buffer_size and wrap_buffer
116 size setup without duplicating their code.
119 set_block_size (_session.get_block_size());
120 allocate_temporary_buffers ();
123 assert(_n_channels == ChanCount(DataType::AUDIO, 1));
126 AudioDiskstream::~AudioDiskstream ()
128 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
131 RCUWriter<ChannelList> writer (channels);
132 boost::shared_ptr<ChannelList> c = writer.get_copy();
134 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
143 delete deprecated_io_node;
147 AudioDiskstream::allocate_working_buffers()
149 assert(disk_io_frames() > 0);
151 _working_buffers_size = disk_io_frames();
152 _mixdown_buffer = new Sample[_working_buffers_size];
153 _gain_buffer = new gain_t[_working_buffers_size];
157 AudioDiskstream::free_working_buffers()
159 delete [] _mixdown_buffer;
160 delete [] _gain_buffer;
161 _working_buffers_size = 0;
167 AudioDiskstream::non_realtime_input_change ()
170 Glib::Mutex::Lock lm (state_lock);
172 if (input_change_pending == NoChange) {
177 RCUWriter<ChannelList> writer (channels);
178 boost::shared_ptr<ChannelList> c = writer.get_copy();
180 _n_channels.set(DataType::AUDIO, c->size());
182 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
183 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
184 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
185 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
189 get_input_sources ();
190 set_capture_offset ();
192 if (first_input_change) {
193 set_align_style (_persistent_alignment_style);
194 first_input_change = false;
196 set_align_style_from_io ();
199 input_change_pending = NoChange;
201 /* implicit unlock */
204 /* reset capture files */
206 reset_write_sources (false);
208 /* now refill channel buffers */
210 if (speed() != 1.0f || speed() != -1.0f) {
211 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
213 seek (_session.transport_frame());
218 AudioDiskstream::non_realtime_locate (nframes_t location)
220 /* now refill channel buffers */
222 if (speed() != 1.0f || speed() != -1.0f) {
223 seek ((nframes_t) (location * (double) speed()));
230 AudioDiskstream::get_input_sources ()
232 boost::shared_ptr<ChannelList> c = channels.reader();
235 ChannelList::iterator chan;
236 uint32_t ni = _io->n_ports().n_audio();
237 vector<string> connections;
239 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
241 connections.clear ();
243 if (_io->nth (n)->get_connections (connections) == 0) {
245 if ((*chan)->source) {
246 // _source->disable_metering ();
252 (*chan)->source = dynamic_cast<AudioPort*>(_session.engine().get_port_by_name (connections[0]) );
258 AudioDiskstream::find_and_use_playlist (const string& name)
260 boost::shared_ptr<AudioPlaylist> playlist;
262 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
263 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
267 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
271 return use_playlist (playlist);
275 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
277 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
279 Diskstream::use_playlist(playlist);
285 AudioDiskstream::use_new_playlist ()
288 boost::shared_ptr<AudioPlaylist> playlist;
290 if (!in_set_state && destructive()) {
295 newname = Playlist::bump_name (_playlist->name(), _session);
297 newname = Playlist::bump_name (_name, _session);
300 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
302 playlist->set_orig_diskstream_id (id());
303 return use_playlist (playlist);
311 AudioDiskstream::use_copy_playlist ()
313 assert(audio_playlist());
319 if (_playlist == 0) {
320 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
325 boost::shared_ptr<AudioPlaylist> playlist;
327 newname = Playlist::bump_name (_playlist->name(), _session);
329 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
330 playlist->set_orig_diskstream_id (id());
331 return use_playlist (playlist);
338 AudioDiskstream::setup_destructive_playlist ()
341 boost::shared_ptr<ChannelList> c = channels.reader();
343 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
344 srcs.push_back ((*chan)->write_source);
347 /* a single full-sized region */
350 plist.add (Properties::name, _name.val());
351 plist.add (Properties::start, 0);
352 plist.add (Properties::length, max_frames - max_frames - srcs.front()->natural_position());
354 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
355 _playlist->add_region (region, srcs.front()->natural_position());
359 AudioDiskstream::use_destructive_playlist ()
361 /* this is called from the XML-based constructor or ::set_destructive. when called,
362 we already have a playlist and a region, but we need to
363 set up our sources for write. we use the sources associated
364 with the (presumed single, full-extent) region.
367 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
370 reset_write_sources (false, true);
374 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
377 throw failed_constructor();
380 /* be sure to stretch the region out to the maximum length */
382 region->set_length (max_frames - region->position(), this);
385 ChannelList::iterator chan;
386 boost::shared_ptr<ChannelList> c = channels.reader();
388 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
389 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
390 assert((*chan)->write_source);
391 (*chan)->write_source->set_allow_remove_if_empty (false);
393 /* this might be false if we switched modes, so force it */
395 (*chan)->write_source->set_destructive (true);
398 /* the source list will never be reset for a destructive track */
402 AudioDiskstream::prepare_record_status(nframes_t capture_start_frame)
404 if (recordable() && destructive()) {
405 boost::shared_ptr<ChannelList> c = channels.reader();
406 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
408 RingBufferNPT<CaptureTransition>::rw_vector transvec;
409 (*chan)->capture_transition_buf->get_write_vector(&transvec);
411 if (transvec.len[0] > 0) {
412 transvec.buf[0]->type = CaptureStart;
413 transvec.buf[0]->capture_val = capture_start_frame;
414 (*chan)->capture_transition_buf->increment_write_ptr(1);
418 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
426 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can_record, bool rec_monitors_input)
429 boost::shared_ptr<ChannelList> c = channels.reader();
430 ChannelList::iterator chan;
432 nframes_t rec_offset = 0;
433 nframes_t rec_nframes = 0;
434 bool nominally_recording;
435 bool re = record_enabled ();
436 bool collect_playback = false;
438 /* if we've already processed the frames corresponding to this call,
439 just return. this allows multiple routes that are taking input
440 from this diskstream to call our ::process() method, but have
441 this stuff only happen once. more commonly, it allows both
442 the AudioTrack that is using this AudioDiskstream *and* the Session
443 to call process() without problems.
450 commit_should_unlock = false;
452 if (!_io || !_io->active()) {
457 check_record_status (transport_frame, nframes, can_record);
459 nominally_recording = (can_record && re);
466 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
467 must always be called as a pair. The only exception is if this function
468 returns a non-zero value, in which case, ::commit should not be called.
471 // If we can't take the state lock return.
472 if (!state_lock.trylock()) {
475 commit_should_unlock = true;
476 adjust_capture_position = 0;
478 for (chan = c->begin(); chan != c->end(); ++chan) {
479 (*chan)->current_capture_buffer = 0;
480 (*chan)->current_playback_buffer = 0;
483 if (nominally_recording || (_session.get_record_enabled() && _session.config.get_punch_in())) {
484 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
485 if (last_recordable_frame < first_recordable_frame) {
486 last_recordable_frame = max_frames;
489 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
491 calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset);
493 if (rec_nframes && !was_recording) {
494 capture_captured = 0;
495 was_recording = true;
500 if (can_record && !_last_capture_regions.empty()) {
501 _last_capture_regions.clear ();
504 if (nominally_recording || rec_nframes) {
506 uint32_t limit = _io->n_ports ().n_audio();
508 /* one or more ports could already have been removed from _io, but our
509 channel setup hasn't yet been updated. prevent us from trying to
510 use channels that correspond to missing ports. note that the
511 process callback (from which this is called) is always atomic
512 with respect to port removal/addition.
515 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
517 ChannelInfo* chaninfo (*chan);
519 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
521 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
523 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
525 /* note: grab the entire port buffer, but only copy what we were supposed to
526 for recording, and use rec_offset
529 AudioPort* const ap = _io->audio (n);
531 assert(rec_nframes <= ap->get_audio_buffer(nframes).capacity());
532 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (rec_nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
537 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
539 if (rec_nframes > total) {
544 AudioPort* const ap = _io->audio (n);
547 Sample* buf = ap->get_audio_buffer(nframes).data();
548 nframes_t first = chaninfo->capture_vector.len[0];
550 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
551 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
552 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
553 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
555 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
562 finish_capture (rec_monitors_input, c);
569 /* data will be written to disk */
571 if (rec_nframes == nframes && rec_offset == 0) {
573 for (chan = c->begin(); chan != c->end(); ++chan) {
574 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
577 playback_distance = nframes;
582 /* we can't use the capture buffer as the playback buffer, because
583 we recorded only a part of the current process' cycle data
587 collect_playback = true;
590 adjust_capture_position = rec_nframes;
592 } else if (nominally_recording) {
594 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
596 for (chan = c->begin(); chan != c->end(); ++chan) {
597 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
600 playback_distance = nframes;
604 collect_playback = true;
607 if (collect_playback) {
609 /* we're doing playback */
611 nframes_t necessary_samples;
613 /* no varispeed playback if we're recording, because the output .... TBD */
615 if (rec_nframes == 0 && _actual_speed != 1.0f) {
616 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
618 necessary_samples = nframes;
621 for (chan = c->begin(); chan != c->end(); ++chan) {
622 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
627 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
629 ChannelInfo* chaninfo (*chan);
631 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
633 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
636 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
638 if (necessary_samples > total) {
639 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
640 cerr << "underrun for " << _name << endl;
646 memcpy ((char *) chaninfo->playback_wrap_buffer,
647 chaninfo->playback_vector.buf[0],
648 chaninfo->playback_vector.len[0] * sizeof (Sample));
649 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
650 chaninfo->playback_vector.buf[1],
651 (necessary_samples - chaninfo->playback_vector.len[0])
654 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
659 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
660 process_varispeed_playback(nframes, c);
662 playback_distance = nframes;
665 _speed = _target_speed;
676 /* we're exiting with failure, so ::commit will not
677 be called. unlock the state lock.
680 commit_should_unlock = false;
688 AudioDiskstream::process_varispeed_playback(nframes_t nframes, boost::shared_ptr<ChannelList> c)
690 ChannelList::iterator chan;
692 interpolation.set_speed (_target_speed);
695 for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
696 ChannelInfo* chaninfo (*chan);
698 playback_distance = interpolation.interpolate (
699 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
701 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
706 AudioDiskstream::commit (nframes_t /*nframes*/)
708 bool need_butler = false;
710 if (!_io || !_io->active()) {
714 if (_actual_speed < 0.0) {
715 playback_sample -= playback_distance;
717 playback_sample += playback_distance;
720 boost::shared_ptr<ChannelList> c = channels.reader();
721 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
723 (*chan)->playback_buf->increment_read_ptr (playback_distance);
725 if (adjust_capture_position) {
726 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
730 if (adjust_capture_position != 0) {
731 capture_captured += adjust_capture_position;
732 adjust_capture_position = 0;
736 if (_io && _io->active()) {
737 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
742 if (_io && _io->active()) {
743 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
744 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
746 need_butler = c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
750 if (commit_should_unlock) {
760 AudioDiskstream::set_pending_overwrite (bool yn)
762 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
764 pending_overwrite = yn;
766 overwrite_frame = playback_sample;
767 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
771 AudioDiskstream::overwrite_existing_buffers ()
773 boost::shared_ptr<ChannelList> c = channels.reader();
774 Sample* mixdown_buffer;
777 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
779 overwrite_queued = false;
781 /* assume all are the same size */
782 nframes_t size = c->front()->playback_buf->bufsize();
784 mixdown_buffer = new Sample[size];
785 gain_buffer = new float[size];
787 /* reduce size so that we can fill the buffer correctly. */
793 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
795 start = overwrite_frame;
796 nframes_t cnt = size;
798 /* to fill the buffer without resetting the playback sample, we need to
799 do it one or two chunks (normally two).
801 |----------------------------------------------------------------------|
805 |<- second chunk->||<----------------- first chunk ------------------>|
809 nframes_t to_read = size - overwrite_offset;
811 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
812 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
813 _id, size, playback_sample) << endmsg;
821 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
822 start, cnt, *chan, n, reversed)) {
823 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
824 _id, size, playback_sample) << endmsg;
833 pending_overwrite = false;
834 delete [] gain_buffer;
835 delete [] mixdown_buffer;
840 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
844 ChannelList::iterator chan;
845 boost::shared_ptr<ChannelList> c = channels.reader();
847 Glib::Mutex::Lock lm (state_lock);
849 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
850 (*chan)->playback_buf->reset ();
851 (*chan)->capture_buf->reset ();
854 /* can't rec-enable in destructive mode if transport is before start */
856 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
857 disengage_record_enable ();
860 playback_sample = frame;
863 if (complete_refill) {
864 while ((ret = do_refill_with_alloc ()) > 0) ;
866 ret = do_refill_with_alloc ();
873 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
875 ChannelList::iterator chan;
876 boost::shared_ptr<ChannelList> c = channels.reader();
878 for (chan = c->begin(); chan != c->end(); ++chan) {
879 if ((*chan)->playback_buf->read_space() < distance) {
887 AudioDiskstream::internal_playback_seek (nframes_t distance)
889 ChannelList::iterator chan;
890 boost::shared_ptr<ChannelList> c = channels.reader();
892 for (chan = c->begin(); chan != c->end(); ++chan) {
893 (*chan)->playback_buf->increment_read_ptr (distance);
896 first_recordable_frame += distance;
897 playback_sample += distance;
903 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
904 ChannelInfo* /*channel_info*/, int channel, bool reversed)
906 nframes_t this_read = 0;
908 nframes_t loop_end = 0;
909 nframes_t loop_start = 0;
910 nframes_t offset = 0;
913 /* XXX we don't currently play loops in reverse. not sure why */
917 nframes_t loop_length = 0;
919 /* Make the use of a Location atomic for this read operation.
921 Note: Locations don't get deleted, so all we care about
922 when I say "atomic" is that we are always pointing to
923 the same one and using a start/length values obtained
927 if ((loc = loop_location) != 0) {
928 loop_start = loc->start();
929 loop_end = loc->end();
930 loop_length = loop_end - loop_start;
933 /* if we are looping, ensure that the first frame we read is at the correct
934 position within the loop.
937 if (loc && start >= loop_end) {
938 //cerr << "start adjusted from " << start;
939 start = loop_start + ((start - loop_start) % loop_length);
940 //cerr << "to " << start << endl;
943 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
952 /* take any loop into account. we can't read past the end of the loop. */
954 if (loc && (loop_end - start < cnt)) {
955 this_read = loop_end - start;
956 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
963 if (this_read == 0) {
967 this_read = min(cnt,this_read);
969 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
970 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
975 _read_data_count = _playlist->read_data_count();
979 swap_by_ptr (buf, buf + this_read - 1);
983 /* if we read to the end of the loop, go back to the beginning */
1000 AudioDiskstream::do_refill_with_alloc ()
1002 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1003 float* gain_buf = new float[disk_io_chunk_frames];
1005 int ret = _do_refill(mix_buf, gain_buf);
1014 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1018 RingBufferNPT<Sample>::rw_vector vector;
1019 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1020 nframes_t total_space;
1021 nframes_t zero_fill;
1023 ChannelList::iterator i;
1024 boost::shared_ptr<ChannelList> c = channels.reader();
1031 assert(mixdown_buffer);
1032 assert(gain_buffer);
1039 c->front()->playback_buf->get_write_vector (&vector);
1041 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1045 /* if there are 2+ chunks of disk i/o possible for
1046 this track, let the caller know so that it can arrange
1047 for us to be called again, ASAP.
1050 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1054 /* if we're running close to normal speed and there isn't enough
1055 space to do disk_io_chunk_frames of I/O, then don't bother.
1057 at higher speeds, just do it because the sync between butler
1058 and audio thread may not be good enough.
1061 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1065 /* when slaved, don't try to get too close to the read pointer. this
1066 leaves space for the buffer reversal to have something useful to
1070 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1074 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1076 total_space = min (disk_io_chunk_frames, total_space);
1080 if (file_frame == 0) {
1082 /* at start: nothing to do but fill with silence */
1084 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1086 ChannelInfo* chan (*i);
1087 chan->playback_buf->get_write_vector (&vector);
1088 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1089 if (vector.len[1]) {
1090 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1092 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1097 if (file_frame < total_space) {
1099 /* too close to the start: read what we can,
1100 and then zero fill the rest
1103 zero_fill = total_space - file_frame;
1104 total_space = file_frame;
1114 if (file_frame == max_frames) {
1116 /* at end: nothing to do but fill with silence */
1118 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1120 ChannelInfo* chan (*i);
1121 chan->playback_buf->get_write_vector (&vector);
1122 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1123 if (vector.len[1]) {
1124 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1126 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1131 if (file_frame > max_frames - total_space) {
1133 /* to close to the end: read what we can, and zero fill the rest */
1135 zero_fill = total_space - (max_frames - file_frame);
1136 total_space = max_frames - file_frame;
1143 nframes_t file_frame_tmp = 0;
1145 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1147 ChannelInfo* chan (*i);
1150 nframes_t len1, len2;
1152 chan->playback_buf->get_write_vector (&vector);
1154 if (vector.len[0] > disk_io_chunk_frames) {
1156 /* we're not going to fill the first chunk, so certainly do not bother with the
1157 other part. it won't be connected with the part we do fill, as in:
1159 .... => writable space
1160 ++++ => readable space
1161 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1163 |......|+++++++++++++|...............................|
1168 So, just pretend that the buf1 part isn't there.
1178 file_frame_tmp = file_frame;
1180 buf1 = vector.buf[0];
1181 len1 = vector.len[0];
1182 buf2 = vector.buf[1];
1183 len2 = vector.len[1];
1185 to_read = min (ts, len1);
1186 to_read = min (to_read, disk_io_chunk_frames);
1190 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1195 chan->playback_buf->increment_write_ptr (to_read);
1199 to_read = min (ts, len2);
1203 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1204 so read some or all of vector.len[1] as well.
1207 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1212 chan->playback_buf->increment_write_ptr (to_read);
1221 file_frame = file_frame_tmp;
1228 /** Flush pending data to disk.
1230 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1231 * of data to disk. it will never write more than that. If it writes that
1232 * much and there is more than that waiting to be written, it will return 1,
1233 * otherwise 0 on success or -1 on failure.
1235 * If there is less than disk_io_chunk_frames to be written, no data will be
1236 * written at all unless @a force_flush is true.
1239 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1243 RingBufferNPT<Sample>::rw_vector vector;
1244 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1247 _write_data_count = 0;
1249 transvec.buf[0] = 0;
1250 transvec.buf[1] = 0;
1254 boost::shared_ptr<ChannelList> c = channels.reader();
1255 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1257 (*chan)->capture_buf->get_read_vector (&vector);
1259 total = vector.len[0] + vector.len[1];
1261 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1265 /* if there are 2+ chunks of disk i/o possible for
1266 this track, let the caller know so that it can arrange
1267 for us to be called again, ASAP.
1269 if we are forcing a flush, then if there is* any* extra
1270 work, let the caller know.
1272 if we are no longer recording and there is any extra work,
1273 let the caller know too.
1276 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1280 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1282 // check the transition buffer when recording destructive
1283 // important that we get this after the capture buf
1285 if (destructive()) {
1286 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1287 size_t transcount = transvec.len[0] + transvec.len[1];
1288 bool have_start = false;
1291 for (ti=0; ti < transcount; ++ti) {
1292 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1294 if (captrans.type == CaptureStart) {
1295 // by definition, the first data we got above represents the given capture pos
1297 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1298 (*chan)->curr_capture_cnt = 0;
1302 else if (captrans.type == CaptureEnd) {
1304 // capture end, the capture_val represents total frames in capture
1306 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1308 // shorten to make the write a perfect fit
1309 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1311 if (nto_write < to_write) {
1312 ret = 1; // should we?
1314 to_write = nto_write;
1316 (*chan)->write_source->mark_capture_end ();
1318 // increment past this transition, but go no further
1323 // actually ends just beyond this chunk, so force more work
1331 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1335 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1336 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1340 (*chan)->capture_buf->increment_read_ptr (to_write);
1341 (*chan)->curr_capture_cnt += to_write;
1343 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1345 /* we wrote all of vector.len[0] but it wasn't an entire
1346 disk_io_chunk_frames of data, so arrange for some part
1347 of vector.len[1] to be flushed to disk as well.
1350 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1352 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1353 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1357 _write_data_count += (*chan)->write_source->write_data_count();
1359 (*chan)->capture_buf->increment_read_ptr (to_write);
1360 (*chan)->curr_capture_cnt += to_write;
1369 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1371 uint32_t buffer_position;
1372 bool more_work = true;
1374 boost::shared_ptr<AudioRegion> region;
1375 nframes_t total_capture;
1377 SourceList::iterator src;
1378 ChannelList::iterator chan;
1379 vector<CaptureInfo*>::iterator ci;
1380 boost::shared_ptr<ChannelList> c = channels.reader();
1382 bool mark_write_completed = false;
1384 finish_capture (true, c);
1386 /* butler is already stopped, but there may be work to do
1387 to flush remaining data to disk.
1390 while (more_work && !err) {
1391 switch (do_flush (TransportContext, true)) {
1398 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1403 /* XXX is there anything we can do if err != 0 ? */
1404 Glib::Mutex::Lock lm (capture_info_lock);
1406 if (capture_info.empty()) {
1410 if (abort_capture) {
1412 if (destructive()) {
1416 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1418 if ((*chan)->write_source) {
1420 (*chan)->write_source->mark_for_remove ();
1421 (*chan)->write_source->drop_references ();
1422 (*chan)->write_source.reset ();
1425 /* new source set up in "out" below */
1431 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1432 total_capture += (*ci)->frames;
1435 /* figure out the name for this take */
1437 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1439 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1443 s->update_header (capture_info.front()->start, when, twhen);
1444 s->set_captured_for (_name.val());
1445 s->mark_immutable ();
1446 if (Config->get_auto_analyse_audio()) {
1447 Analyser::queue_source_for_analysis (s, true);
1452 /* destructive tracks have a single, never changing region */
1454 if (destructive()) {
1456 /* send a signal that any UI can pick up to do the right thing. there is
1457 a small problem here in that a UI may need the peak data to be ready
1458 for the data that was recorded and this isn't interlocked with that
1459 process. this problem is deferred to the UI.
1462 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1466 string whole_file_region_name;
1467 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1469 /* Register a new region with the Session that
1470 describes the entire source. Do this first
1471 so that any sub-regions will obviously be
1472 children of this one (later!)
1478 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1479 plist.add (Properties::length, total_capture);
1480 plist.add (Properties::name, whole_file_region_name);
1482 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1483 rx->set_automatic (true);
1484 rx->set_whole_file (true);
1486 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1487 region->special_set_position (capture_info.front()->start);
1491 catch (failed_constructor& err) {
1492 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1496 _last_capture_regions.push_back (region);
1498 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1500 XMLNode &before = _playlist->get_state();
1501 _playlist->freeze ();
1503 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1507 _session.region_name (region_name, whole_file_region_name, false);
1509 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1515 plist.add (Properties::start, buffer_position);
1516 plist.add (Properties::length, (*ci)->frames);
1517 plist.add (Properties::name, region_name);
1519 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1520 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1523 catch (failed_constructor& err) {
1524 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1525 continue; /* XXX is this OK? */
1528 region->DropReferences.connect_same_thread (*this, boost::bind (&Diskstream::remove_region_from_last_capture, this, boost::weak_ptr<Region>(region)));
1530 _last_capture_regions.push_back (region);
1532 i_am_the_modifier++;
1533 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1534 i_am_the_modifier--;
1536 buffer_position += (*ci)->frames;
1540 XMLNode &after = _playlist->get_state();
1541 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1544 mark_write_completed = true;
1547 reset_write_sources (mark_write_completed);
1551 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1555 capture_info.clear ();
1556 capture_start_frame = 0;
1560 AudioDiskstream::transport_looped (nframes_t transport_frame)
1562 if (was_recording) {
1563 // all we need to do is finish this capture, with modified capture length
1564 boost::shared_ptr<ChannelList> c = channels.reader();
1566 // adjust the capture length knowing that the data will be recorded to disk
1567 // only necessary after the first loop where we're recording
1568 if (capture_info.size() == 0) {
1569 capture_captured += _capture_offset;
1571 if (_alignment_style == ExistingMaterial) {
1572 capture_captured += _session.worst_output_latency();
1574 capture_captured += _roll_delay;
1578 finish_capture (true, c);
1580 // the next region will start recording via the normal mechanism
1581 // we'll set the start position to the current transport pos
1582 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1583 capture_start_frame = transport_frame;
1584 first_recordable_frame = transport_frame; // mild lie
1585 last_recordable_frame = max_frames;
1586 was_recording = true;
1588 if (recordable() && destructive()) {
1589 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1591 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1592 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1594 if (transvec.len[0] > 0) {
1595 transvec.buf[0]->type = CaptureStart;
1596 transvec.buf[0]->capture_val = capture_start_frame;
1597 (*chan)->capture_transition_buf->increment_write_ptr(1);
1601 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1611 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1613 was_recording = false;
1615 if (capture_captured == 0) {
1619 if (recordable() && destructive()) {
1620 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1622 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1623 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1625 if (transvec.len[0] > 0) {
1626 transvec.buf[0]->type = CaptureEnd;
1627 transvec.buf[0]->capture_val = capture_captured;
1628 (*chan)->capture_transition_buf->increment_write_ptr(1);
1632 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1638 CaptureInfo* ci = new CaptureInfo;
1640 ci->start = capture_start_frame;
1641 ci->frames = capture_captured;
1643 /* XXX theoretical race condition here. Need atomic exchange ?
1644 However, the circumstances when this is called right
1645 now (either on record-disable or transport_stopped)
1646 mean that no actual race exists. I think ...
1647 We now have a capture_info_lock, but it is only to be used
1648 to synchronize in the transport_stop and the capture info
1649 accessors, so that invalidation will not occur (both non-realtime).
1652 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1654 capture_info.push_back (ci);
1655 capture_captured = 0;
1657 /* now we've finished a capture, reset first_recordable_frame for next time */
1658 first_recordable_frame = max_frames;
1662 AudioDiskstream::set_record_enabled (bool yn)
1664 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1668 /* can't rec-enable in destructive mode if transport is before start */
1670 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1674 /* yes, i know that this not proof against race conditions, but its
1675 good enough. i think.
1678 if (record_enabled() != yn) {
1680 engage_record_enable ();
1682 disengage_record_enable ();
1688 AudioDiskstream::engage_record_enable ()
1690 bool rolling = _session.transport_speed() != 0.0f;
1691 boost::shared_ptr<ChannelList> c = channels.reader();
1693 g_atomic_int_set (&_record_enabled, 1);
1694 capturing_sources.clear ();
1696 if (Config->get_monitoring_model() == HardwareMonitoring) {
1698 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1699 if ((*chan)->source) {
1700 (*chan)->source->ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1702 capturing_sources.push_back ((*chan)->write_source);
1703 (*chan)->write_source->mark_streaming_write_started ();
1707 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1708 capturing_sources.push_back ((*chan)->write_source);
1709 (*chan)->write_source->mark_streaming_write_started ();
1713 RecordEnableChanged (); /* EMIT SIGNAL */
1717 AudioDiskstream::disengage_record_enable ()
1719 g_atomic_int_set (&_record_enabled, 0);
1720 boost::shared_ptr<ChannelList> c = channels.reader();
1721 if (Config->get_monitoring_model() == HardwareMonitoring) {
1722 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1723 if ((*chan)->source) {
1724 (*chan)->source->ensure_monitor_input (false);
1728 capturing_sources.clear ();
1729 RecordEnableChanged (); /* EMIT SIGNAL */
1733 AudioDiskstream::get_state ()
1735 XMLNode* node = new XMLNode ("AudioDiskstream");
1737 LocaleGuard lg (X_("POSIX"));
1738 boost::shared_ptr<ChannelList> c = channels.reader();
1740 node->add_property ("flags", enum_2_string (_flags));
1742 snprintf (buf, sizeof(buf), "%zd", c->size());
1743 node->add_property ("channels", buf);
1745 node->add_property ("playlist", _playlist->name());
1747 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1748 node->add_property ("speed", buf);
1750 node->add_property("name", _name);
1751 id().print (buf, sizeof (buf));
1752 node->add_property("id", buf);
1754 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1756 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1757 XMLNode* cs_grandchild;
1759 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1760 cs_grandchild = new XMLNode (X_("file"));
1761 cs_grandchild->add_property (X_("path"), (*i)->path());
1762 cs_child->add_child_nocopy (*cs_grandchild);
1765 /* store the location where capture will start */
1769 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1770 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1772 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1775 cs_child->add_property (X_("at"), buf);
1776 node->add_child_nocopy (*cs_child);
1780 node->add_child_copy (*_extra_xml);
1787 AudioDiskstream::set_state (const XMLNode& node, int /*version*/)
1789 const XMLProperty* prop;
1790 XMLNodeList nlist = node.children();
1791 XMLNodeIterator niter;
1792 uint32_t nchans = 1;
1793 XMLNode* capture_pending_node = 0;
1794 LocaleGuard lg (X_("POSIX"));
1796 in_set_state = true;
1798 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1799 if ((*niter)->name() == IO::state_node_name) {
1800 deprecated_io_node = new XMLNode (**niter);
1803 if ((*niter)->name() == X_("CapturingSources")) {
1804 capture_pending_node = *niter;
1808 /* prevent write sources from being created */
1810 in_set_state = true;
1812 if ((prop = node.property ("name")) != 0) {
1813 _name = prop->value();
1816 if (deprecated_io_node) {
1817 if ((prop = deprecated_io_node->property ("id")) != 0) {
1818 _id = prop->value ();
1821 if ((prop = node.property ("id")) != 0) {
1822 _id = prop->value ();
1826 if ((prop = node.property ("flags")) != 0) {
1827 _flags = Flag (string_2_enum (prop->value(), _flags));
1830 if ((prop = node.property ("channels")) != 0) {
1831 nchans = atoi (prop->value().c_str());
1834 // create necessary extra channels
1835 // we are always constructed with one and we always need one
1837 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1839 if (nchans > _n_channels.n_audio()) {
1841 add_channel (nchans - _n_channels.n_audio());
1842 IO::PortCountChanged(_n_channels);
1844 } else if (nchans < _n_channels.n_audio()) {
1846 remove_channel (_n_channels.n_audio() - nchans);
1849 if ((prop = node.property ("playlist")) == 0) {
1854 bool had_playlist = (_playlist != 0);
1856 if (find_and_use_playlist (prop->value())) {
1860 if (!had_playlist) {
1861 _playlist->set_orig_diskstream_id (_id);
1864 if (!destructive() && capture_pending_node) {
1865 /* destructive streams have one and only one source per channel,
1866 and so they never end up in pending capture in any useful
1869 use_pending_capture_data (*capture_pending_node);
1874 if ((prop = node.property ("speed")) != 0) {
1875 double sp = atof (prop->value().c_str());
1877 if (realtime_set_speed (sp, false)) {
1878 non_realtime_set_speed ();
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];
1911 if (chan->write_source) {
1912 chan->write_source->done_with_peakfile_writes ();
1913 chan->write_source->set_allow_remove_if_empty (true);
1914 chan->write_source.reset ();
1918 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1919 throw failed_constructor();
1923 catch (failed_constructor &err) {
1924 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1925 chan->write_source.reset ();
1929 /* do not remove destructive files even if they are empty */
1931 chan->write_source->set_allow_remove_if_empty (!destructive());
1933 /* until we write, this file is considered removable */
1935 chan->write_source->mark_for_remove ();
1941 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1943 ChannelList::iterator chan;
1944 boost::shared_ptr<ChannelList> c = channels.reader();
1947 if (!_session.writable() || !recordable()) {
1951 capturing_sources.clear ();
1953 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1954 if (!destructive()) {
1956 if ((*chan)->write_source && mark_write_complete) {
1957 (*chan)->write_source->mark_streaming_write_completed ();
1959 use_new_write_source (n);
1961 if (record_enabled()) {
1962 capturing_sources.push_back ((*chan)->write_source);
1966 if ((*chan)->write_source == 0) {
1967 use_new_write_source (n);
1972 if (destructive()) {
1974 /* we now have all our write sources set up, so create the
1975 playlist's single region.
1978 if (_playlist->empty()) {
1979 setup_destructive_playlist ();
1985 AudioDiskstream::rename_write_sources ()
1987 ChannelList::iterator chan;
1988 boost::shared_ptr<ChannelList> c = channels.reader();
1991 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1992 if ((*chan)->write_source != 0) {
1993 (*chan)->write_source->set_source_name (_name.val(), destructive());
1994 /* XXX what to do if one of them fails ? */
2002 AudioDiskstream::set_block_size (nframes_t /*nframes*/)
2004 if (_session.get_block_size() > speed_buffer_size) {
2005 speed_buffer_size = _session.get_block_size();
2006 boost::shared_ptr<ChannelList> c = channels.reader();
2008 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2009 if ((*chan)->speed_buffer)
2010 delete [] (*chan)->speed_buffer;
2011 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2014 allocate_temporary_buffers ();
2018 AudioDiskstream::allocate_temporary_buffers ()
2020 /* make sure the wrap buffer is at least large enough to deal
2021 with the speeds up to 1.2, to allow for micro-variation
2022 when slaving to MTC, Timecode etc.
2025 double sp = max (fabsf (_actual_speed), 1.2f);
2026 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2028 if (required_wrap_size > wrap_buffer_size) {
2030 boost::shared_ptr<ChannelList> c = channels.reader();
2032 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2033 if ((*chan)->playback_wrap_buffer)
2034 delete [] (*chan)->playback_wrap_buffer;
2035 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2036 if ((*chan)->capture_wrap_buffer)
2037 delete [] (*chan)->capture_wrap_buffer;
2038 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2041 wrap_buffer_size = required_wrap_size;
2046 AudioDiskstream::monitor_input (bool yn)
2048 boost::shared_ptr<ChannelList> c = channels.reader();
2050 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2052 if ((*chan)->source) {
2053 (*chan)->source->ensure_monitor_input (yn);
2059 AudioDiskstream::set_align_style_from_io ()
2061 bool have_physical = false;
2067 get_input_sources ();
2069 boost::shared_ptr<ChannelList> c = channels.reader();
2071 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2072 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2073 have_physical = true;
2078 if (have_physical) {
2079 set_align_style (ExistingMaterial);
2081 set_align_style (CaptureTime);
2086 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2088 while (how_many--) {
2089 c->push_back (new ChannelInfo(_session.butler()->audio_diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2090 interpolation.add_channel_to (_session.butler()->audio_diskstream_buffer_size(), speed_buffer_size);
2093 _n_channels.set(DataType::AUDIO, c->size());
2099 AudioDiskstream::add_channel (uint32_t how_many)
2101 RCUWriter<ChannelList> writer (channels);
2102 boost::shared_ptr<ChannelList> c = writer.get_copy();
2104 return add_channel_to (c, how_many);
2108 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2110 while (how_many-- && !c->empty()) {
2111 // FIXME: crash (thread safe with RCU?)
2112 // memory leak, when disabled.... :(
2115 interpolation.remove_channel_from ();
2118 _n_channels.set(DataType::AUDIO, c->size());
2124 AudioDiskstream::remove_channel (uint32_t how_many)
2126 RCUWriter<ChannelList> writer (channels);
2127 boost::shared_ptr<ChannelList> c = writer.get_copy();
2129 return remove_channel_from (c, how_many);
2133 AudioDiskstream::playback_buffer_load () const
2135 boost::shared_ptr<ChannelList> c = channels.reader();
2137 return (float) ((double) c->front()->playback_buf->read_space()/
2138 (double) c->front()->playback_buf->bufsize());
2142 AudioDiskstream::capture_buffer_load () const
2144 boost::shared_ptr<ChannelList> c = channels.reader();
2146 return (float) ((double) c->front()->capture_buf->write_space()/
2147 (double) c->front()->capture_buf->bufsize());
2151 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2153 const XMLProperty* prop;
2154 XMLNodeList nlist = node.children();
2155 XMLNodeIterator niter;
2156 boost::shared_ptr<AudioFileSource> fs;
2157 boost::shared_ptr<AudioFileSource> first_fs;
2158 SourceList pending_sources;
2161 if ((prop = node.property (X_("at"))) == 0) {
2165 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2169 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2170 if ((*niter)->name() == X_("file")) {
2172 if ((prop = (*niter)->property (X_("path"))) == 0) {
2176 // This protects sessions from errant CapturingSources in stored sessions
2178 if (stat (prop->value().c_str(), &sbuf)) {
2183 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2184 SourceFactory::createWritable (DataType::AUDIO, _session,
2185 prop->value(), false, _session.frame_rate()));
2188 catch (failed_constructor& err) {
2189 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2190 _name, prop->value())
2195 pending_sources.push_back (fs);
2197 if (first_fs == 0) {
2201 fs->set_captured_for (_name.val());
2205 if (pending_sources.size() == 0) {
2206 /* nothing can be done */
2210 if (pending_sources.size() != _n_channels.n_audio()) {
2211 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2216 boost::shared_ptr<AudioRegion> region;
2222 plist.add (Properties::start, 0);
2223 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2224 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2226 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2228 region->set_automatic (true);
2229 region->set_whole_file (true);
2230 region->special_set_position (0);
2233 catch (failed_constructor& err) {
2234 error << string_compose (
2235 _("%1: cannot create whole-file region from pending capture sources"),
2241 _playlist->add_region (region, position);
2247 AudioDiskstream::set_non_layered (bool yn)
2249 if (yn != non_layered()) {
2252 _flags = Flag (_flags | NonLayered);
2254 _flags = Flag (_flags & ~NonLayered);
2262 AudioDiskstream::set_destructive (bool yn)
2264 if (yn != destructive()) {
2267 bool bounce_ignored;
2268 /* requestor should already have checked this and
2269 bounced if necessary and desired
2271 if (!can_become_destructive (bounce_ignored)) {
2274 _flags = Flag (_flags | Destructive);
2275 use_destructive_playlist ();
2277 _flags = Flag (_flags & ~Destructive);
2278 reset_write_sources (true, true);
2286 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2289 requires_bounce = false;
2293 /* is there only one region ? */
2295 if (_playlist->n_regions() != 1) {
2296 requires_bounce = true;
2300 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2303 /* do the source(s) for the region cover the session start position ? */
2305 if (first->position() != _session.current_start_frame()) {
2306 if (first->start() > _session.current_start_frame()) {
2307 requires_bounce = true;
2312 /* is the source used by only 1 playlist ? */
2314 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2318 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2319 requires_bounce = true;
2323 requires_bounce = false;
2327 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2331 current_capture_buffer = 0;
2332 current_playback_buffer = 0;
2333 curr_capture_cnt = 0;
2335 speed_buffer = new Sample[speed_size];
2336 playback_wrap_buffer = new Sample[wrap_size];
2337 capture_wrap_buffer = new Sample[wrap_size];
2339 playback_buf = new RingBufferNPT<Sample> (bufsize);
2340 capture_buf = new RingBufferNPT<Sample> (bufsize);
2341 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2343 /* touch the ringbuffer buffers, which will cause
2344 them to be mapped into locked physical RAM if
2345 we're running with mlockall(). this doesn't do
2349 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2350 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2351 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2354 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2357 write_source.reset ();
2360 delete [] speed_buffer;
2363 delete [] playback_wrap_buffer;
2364 playback_wrap_buffer = 0;
2366 delete [] capture_wrap_buffer;
2367 capture_wrap_buffer = 0;
2369 delete playback_buf;
2375 delete capture_transition_buf;
2376 capture_transition_buf = 0;