2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include "pbd/error.h"
34 #include <glibmm/thread.h>
35 #include "pbd/xml++.h"
36 #include "pbd/memento_command.h"
37 #include "pbd/enumwriter.h"
38 #include "pbd/stacktrace.h"
40 #include "ardour/ardour.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/analyser.h"
43 #include "ardour/audio_diskstream.h"
44 #include "ardour/utils.h"
45 #include "ardour/configuration.h"
46 #include "ardour/audiofilesource.h"
47 #include "ardour/send.h"
48 #include "ardour/region_factory.h"
49 #include "ardour/audioplaylist.h"
50 #include "ardour/playlist_factory.h"
51 #include "ardour/cycle_timer.h"
52 #include "ardour/audioregion.h"
53 #include "ardour/audio_port.h"
54 #include "ardour/source_factory.h"
55 #include "ardour/audio_buffer.h"
56 #include "ardour/session.h"
57 #include "ardour/io.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 , deprecated_io_node(NULL)
73 , channels (new ChannelList)
75 /* prevent any write sources from being created */
85 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
86 : Diskstream(sess, node)
87 , deprecated_io_node(NULL)
88 , channels (new ChannelList)
93 if (set_state (node)) {
95 throw failed_constructor();
101 use_destructive_playlist ();
106 AudioDiskstream::init (Diskstream::Flag f)
110 /* there are no channels at this point, so these
111 two calls just get speed_buffer_size and wrap_buffer
112 size setup without duplicating their code.
115 set_block_size (_session.get_block_size());
116 allocate_temporary_buffers ();
119 assert(_n_channels == ChanCount(DataType::AUDIO, 1));
122 AudioDiskstream::~AudioDiskstream ()
127 RCUWriter<ChannelList> writer (channels);
128 boost::shared_ptr<ChannelList> c = writer.get_copy();
130 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
141 AudioDiskstream::allocate_working_buffers()
143 assert(disk_io_frames() > 0);
145 _working_buffers_size = disk_io_frames();
146 _mixdown_buffer = new Sample[_working_buffers_size];
147 _gain_buffer = new gain_t[_working_buffers_size];
151 AudioDiskstream::free_working_buffers()
153 delete [] _mixdown_buffer;
154 delete [] _gain_buffer;
155 _working_buffers_size = 0;
161 AudioDiskstream::non_realtime_input_change ()
163 cerr << "AD::NRIC ... " << name() << endl;
166 Glib::Mutex::Lock lm (state_lock);
168 if (input_change_pending == NoChange) {
173 RCUWriter<ChannelList> writer (channels);
174 boost::shared_ptr<ChannelList> c = writer.get_copy();
176 _n_channels.set(DataType::AUDIO, c->size());
178 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
179 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
180 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
181 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
185 get_input_sources ();
186 set_capture_offset ();
188 if (first_input_change) {
189 set_align_style (_persistent_alignment_style);
190 first_input_change = false;
192 set_align_style_from_io ();
195 input_change_pending = NoChange;
197 /* implicit unlock */
200 /* reset capture files */
202 reset_write_sources (false);
204 /* now refill channel buffers */
206 if (speed() != 1.0f || speed() != -1.0f) {
207 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
209 seek (_session.transport_frame());
214 AudioDiskstream::non_realtime_locate (nframes_t location)
216 /* now refill channel buffers */
218 if (speed() != 1.0f || speed() != -1.0f) {
219 seek ((nframes_t) (location * (double) speed()));
226 AudioDiskstream::get_input_sources ()
228 boost::shared_ptr<ChannelList> c = channels.reader();
231 ChannelList::iterator chan;
232 uint32_t ni = _io->n_ports().n_audio();
233 vector<string> connections;
235 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
237 connections.clear ();
239 if (_io->nth (n)->get_connections (connections) == 0) {
241 if ((*chan)->source) {
242 // _source->disable_metering ();
248 (*chan)->source = dynamic_cast<AudioPort*>(_session.engine().get_port_by_name (connections[0]) );
254 AudioDiskstream::find_and_use_playlist (const string& name)
256 boost::shared_ptr<AudioPlaylist> playlist;
258 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
259 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
263 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
267 return use_playlist (playlist);
271 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
273 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
275 Diskstream::use_playlist(playlist);
281 AudioDiskstream::use_new_playlist ()
284 boost::shared_ptr<AudioPlaylist> playlist;
286 if (!in_set_state && destructive()) {
291 newname = Playlist::bump_name (_playlist->name(), _session);
293 newname = Playlist::bump_name (_name, _session);
296 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
298 playlist->set_orig_diskstream_id (id());
299 return use_playlist (playlist);
307 AudioDiskstream::use_copy_playlist ()
309 assert(audio_playlist());
315 if (_playlist == 0) {
316 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
321 boost::shared_ptr<AudioPlaylist> playlist;
323 newname = Playlist::bump_name (_playlist->name(), _session);
325 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
326 playlist->set_orig_diskstream_id (id());
327 return use_playlist (playlist);
334 AudioDiskstream::setup_destructive_playlist ()
337 boost::shared_ptr<ChannelList> c = channels.reader();
339 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
340 srcs.push_back ((*chan)->write_source);
343 /* a single full-sized region */
345 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
346 _playlist->add_region (region, srcs.front()->natural_position());
350 AudioDiskstream::use_destructive_playlist ()
352 /* this is called from the XML-based constructor or ::set_destructive. when called,
353 we already have a playlist and a region, but we need to
354 set up our sources for write. we use the sources associated
355 with the (presumed single, full-extent) region.
358 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
361 reset_write_sources (false, true);
365 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
368 throw failed_constructor();
371 /* be sure to stretch the region out to the maximum length */
373 region->set_length (max_frames - region->position(), this);
376 ChannelList::iterator chan;
377 boost::shared_ptr<ChannelList> c = channels.reader();
379 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
380 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
381 assert((*chan)->write_source);
382 (*chan)->write_source->set_allow_remove_if_empty (false);
384 /* this might be false if we switched modes, so force it */
386 (*chan)->write_source->set_destructive (true);
389 /* the source list will never be reset for a destructive track */
393 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
395 int possibly_recording;
398 const int transport_rolling = 0x4;
399 const int track_rec_enabled = 0x2;
400 const int global_rec_enabled = 0x1;
402 /* merge together the 3 factors that affect record status, and compute
406 rolling = _session.transport_speed() != 0.0f;
407 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
408 change = possibly_recording ^ last_possibly_recording;
410 if (possibly_recording == last_possibly_recording) {
416 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
418 if (((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record)) ||
419 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
421 /* starting to record: compute first+last frames */
423 first_recordable_frame = transport_frame + _capture_offset;
424 last_recordable_frame = max_frames;
425 capture_start_frame = transport_frame;
427 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
429 /* was stopped, now rolling (and recording) */
431 if (_alignment_style == ExistingMaterial) {
432 first_recordable_frame += _session.worst_output_latency();
434 first_recordable_frame += _roll_delay;
439 /* was rolling, but record state changed */
441 if (_alignment_style == ExistingMaterial) {
443 if (!_session.config.get_punch_in()) {
445 /* manual punch in happens at the correct transport frame
446 because the user hit a button. but to get alignment correct
447 we have to back up the position of the new region to the
448 appropriate spot given the roll delay.
451 capture_start_frame -= _roll_delay;
453 /* XXX paul notes (august 2005): i don't know why
457 first_recordable_frame += _capture_offset;
461 /* autopunch toggles recording at the precise
462 transport frame, and then the DS waits
463 to start recording for a time that depends
464 on the output latency.
467 first_recordable_frame += _session.worst_output_latency();
472 if (_session.config.get_punch_in()) {
473 first_recordable_frame += _roll_delay;
475 capture_start_frame -= _roll_delay;
481 if (recordable() && destructive()) {
482 boost::shared_ptr<ChannelList> c = channels.reader();
483 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
485 RingBufferNPT<CaptureTransition>::rw_vector transvec;
486 (*chan)->capture_transition_buf->get_write_vector(&transvec);
488 if (transvec.len[0] > 0) {
489 transvec.buf[0]->type = CaptureStart;
490 transvec.buf[0]->capture_val = capture_start_frame;
491 (*chan)->capture_transition_buf->increment_write_ptr(1);
495 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
501 } else if (!record_enabled() || !can_record) {
505 last_recordable_frame = transport_frame + _capture_offset;
507 if (_alignment_style == ExistingMaterial) {
508 last_recordable_frame += _session.worst_output_latency();
510 last_recordable_frame += _roll_delay;
514 last_possibly_recording = possibly_recording;
518 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can_record, bool rec_monitors_input)
521 boost::shared_ptr<ChannelList> c = channels.reader();
522 ChannelList::iterator chan;
524 nframes_t rec_offset = 0;
525 nframes_t rec_nframes = 0;
526 bool nominally_recording;
527 bool re = record_enabled ();
528 bool collect_playback = false;
530 /* if we've already processed the frames corresponding to this call,
531 just return. this allows multiple routes that are taking input
532 from this diskstream to call our ::process() method, but have
533 this stuff only happen once. more commonly, it allows both
534 the AudioTrack that is using this AudioDiskstream *and* the Session
535 to call process() without problems.
542 commit_should_unlock = false;
544 if (!_io || !_io->active()) {
549 check_record_status (transport_frame, nframes, can_record);
551 nominally_recording = (can_record && re);
558 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
559 must always be called as a pair. The only exception is if this function
560 returns a non-zero value, in which case, ::commit should not be called.
563 // If we can't take the state lock return.
564 if (!state_lock.trylock()) {
567 commit_should_unlock = true;
568 adjust_capture_position = 0;
570 for (chan = c->begin(); chan != c->end(); ++chan) {
571 (*chan)->current_capture_buffer = 0;
572 (*chan)->current_playback_buffer = 0;
575 if (nominally_recording || (_session.get_record_enabled() && _session.config.get_punch_in())) {
578 // Safeguard against situations where process() goes haywire when autopunching and last_recordable_frame < first_recordable_frame
579 if (last_recordable_frame < first_recordable_frame) {
580 last_recordable_frame = max_frames;
583 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
590 case OverlapInternal:
591 /* ---------- recrange
594 rec_nframes = nframes;
599 /* |--------| recrange
602 rec_nframes = transport_frame + nframes - first_recordable_frame;
604 rec_offset = first_recordable_frame - transport_frame;
609 /* |--------| recrange
612 rec_nframes = last_recordable_frame - transport_frame;
616 case OverlapExternal:
617 /* |--------| recrange
618 -------------- transrange
620 rec_nframes = last_recordable_frame - first_recordable_frame;
621 rec_offset = first_recordable_frame - transport_frame;
625 if (rec_nframes && !was_recording) {
626 capture_captured = 0;
627 was_recording = true;
632 if (can_record && !_last_capture_regions.empty()) {
633 _last_capture_regions.clear ();
636 if (nominally_recording || rec_nframes) {
638 uint32_t limit = _io->n_ports ().n_audio();
640 /* one or more ports could already have been removed from _io, but our
641 channel setup hasn't yet been updated. prevent us from trying to
642 use channels that correspond to missing ports. note that the
643 process callback (from which this is called) is always atomic
644 with respect to port removal/addition.
647 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
649 ChannelInfo* chaninfo (*chan);
651 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
653 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
655 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
657 /* note: grab the entire port buffer, but only copy what we were supposed to
658 for recording, and use rec_offset
661 AudioPort* const ap = _io->audio (n);
663 assert(rec_nframes <= ap->get_audio_buffer(nframes).capacity());
664 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (rec_nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
669 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
671 if (rec_nframes > total) {
676 AudioPort* const ap = _io->audio (n);
679 Sample* buf = ap->get_audio_buffer(nframes).data();
680 nframes_t first = chaninfo->capture_vector.len[0];
682 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
683 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
684 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
685 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
687 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
694 finish_capture (rec_monitors_input, c);
701 /* data will be written to disk */
703 if (rec_nframes == nframes && rec_offset == 0) {
705 for (chan = c->begin(); chan != c->end(); ++chan) {
706 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
709 playback_distance = nframes;
714 /* we can't use the capture buffer as the playback buffer, because
715 we recorded only a part of the current process' cycle data
719 collect_playback = true;
722 adjust_capture_position = rec_nframes;
724 } else if (nominally_recording) {
726 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
728 for (chan = c->begin(); chan != c->end(); ++chan) {
729 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
732 playback_distance = nframes;
736 collect_playback = true;
739 if (collect_playback) {
741 /* we're doing playback */
743 nframes_t necessary_samples;
745 /* no varispeed playback if we're recording, because the output .... TBD */
747 if (rec_nframes == 0 && _actual_speed != 1.0f) {
748 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
750 necessary_samples = nframes;
753 for (chan = c->begin(); chan != c->end(); ++chan) {
754 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
759 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
761 ChannelInfo* chaninfo (*chan);
763 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
765 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
768 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
770 if (necessary_samples > total) {
771 cerr << "underrun for " << _name << endl;
777 memcpy ((char *) chaninfo->playback_wrap_buffer,
778 chaninfo->playback_vector.buf[0],
779 chaninfo->playback_vector.len[0] * sizeof (Sample));
780 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
781 chaninfo->playback_vector.buf[1],
782 (necessary_samples - chaninfo->playback_vector.len[0])
785 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
790 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
791 process_varispeed_playback(nframes, c);
793 playback_distance = nframes;
807 /* we're exiting with failure, so ::commit will not
808 be called. unlock the state lock.
811 commit_should_unlock = false;
819 AudioDiskstream::process_varispeed_playback(nframes_t nframes, boost::shared_ptr<ChannelList> c)
821 ChannelList::iterator chan;
823 // the idea behind phase is that when the speed is not 1.0, we have to
824 // interpolate between samples and then we have to store where we thought we were.
825 // rather than being at sample N or N+1, we were at N+0.8792922
826 // so the "phase" element, if you want to think about this way,
827 // varies from 0 to 1, representing the "offset" between samples
828 uint64_t phase = last_phase;
833 // index in the input buffers
836 // Linearly interpolate into the speed buffer
837 // using 40.24 fixed point math
839 // Fixed point is just an integer with an implied scaling factor.
840 // In 40.24 the scaling factor is 2^24 = 16777216,
841 // so a value of 10*2^24 (in integer space) is equivalent to 10.0.
843 // The advantage is that addition and modulus [like x = (x + y) % 2^40]
844 // have no rounding errors and no drift, and just require a single integer add.
847 const int64_t fractional_part_mask = 0xFFFFFF;
848 const Sample binary_scaling_factor = 16777216.0f;
850 // phi = fixed point speed
851 if (phi != target_phi) {
852 phi_delta = ((int64_t)(target_phi - phi)) / nframes;
857 for (chan = c->begin(); chan != c->end(); ++chan) {
859 Sample fractional_phase_part;
860 ChannelInfo* chaninfo (*chan);
865 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
867 fractional_phase_part = (phase & fractional_part_mask) / binary_scaling_factor;
868 chaninfo->speed_buffer[outsample] =
869 chaninfo->current_playback_buffer[i] * (1.0f - fractional_phase_part) +
870 chaninfo->current_playback_buffer[i+1] * fractional_phase_part;
871 phase += phi + phi_delta;
874 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
877 playback_distance = i; // + 1;
878 last_phase = (phase & fractional_part_mask);
882 AudioDiskstream::commit (nframes_t nframes)
884 bool need_butler = false;
886 if (!_io || !_io->active()) {
890 if (_actual_speed < 0.0) {
891 playback_sample -= playback_distance;
893 playback_sample += playback_distance;
896 boost::shared_ptr<ChannelList> c = channels.reader();
897 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
899 (*chan)->playback_buf->increment_read_ptr (playback_distance);
901 if (adjust_capture_position) {
902 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
906 if (adjust_capture_position != 0) {
907 capture_captured += adjust_capture_position;
908 adjust_capture_position = 0;
912 if (_io && _io->active()) {
913 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
918 if (_io && _io->active()) {
919 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
920 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
922 need_butler = c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
926 if (commit_should_unlock) {
936 AudioDiskstream::set_pending_overwrite (bool yn)
938 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
940 pending_overwrite = yn;
942 overwrite_frame = playback_sample;
943 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
947 AudioDiskstream::overwrite_existing_buffers ()
949 boost::shared_ptr<ChannelList> c = channels.reader();
950 Sample* mixdown_buffer;
953 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
955 overwrite_queued = false;
957 /* assume all are the same size */
958 nframes_t size = c->front()->playback_buf->bufsize();
960 mixdown_buffer = new Sample[size];
961 gain_buffer = new float[size];
963 /* reduce size so that we can fill the buffer correctly. */
969 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
971 start = overwrite_frame;
972 nframes_t cnt = size;
974 /* to fill the buffer without resetting the playback sample, we need to
975 do it one or two chunks (normally two).
977 |----------------------------------------------------------------------|
981 |<- second chunk->||<----------------- first chunk ------------------>|
985 nframes_t to_read = size - overwrite_offset;
987 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
988 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
989 _id, size, playback_sample) << endmsg;
997 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
998 start, cnt, *chan, n, reversed)) {
999 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
1000 _id, size, playback_sample) << endmsg;
1009 pending_overwrite = false;
1010 delete [] gain_buffer;
1011 delete [] mixdown_buffer;
1016 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
1020 ChannelList::iterator chan;
1021 boost::shared_ptr<ChannelList> c = channels.reader();
1023 Glib::Mutex::Lock lm (state_lock);
1025 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1026 (*chan)->playback_buf->reset ();
1027 (*chan)->capture_buf->reset ();
1030 /* can't rec-enable in destructive mode if transport is before start */
1032 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
1033 disengage_record_enable ();
1036 playback_sample = frame;
1039 if (complete_refill) {
1040 while ((ret = do_refill_with_alloc ()) > 0) ;
1042 ret = do_refill_with_alloc ();
1049 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
1051 ChannelList::iterator chan;
1052 boost::shared_ptr<ChannelList> c = channels.reader();
1054 for (chan = c->begin(); chan != c->end(); ++chan) {
1055 if ((*chan)->playback_buf->read_space() < distance) {
1063 AudioDiskstream::internal_playback_seek (nframes_t distance)
1065 ChannelList::iterator chan;
1066 boost::shared_ptr<ChannelList> c = channels.reader();
1068 for (chan = c->begin(); chan != c->end(); ++chan) {
1069 (*chan)->playback_buf->increment_read_ptr (distance);
1072 first_recordable_frame += distance;
1073 playback_sample += distance;
1079 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1080 ChannelInfo* channel_info, int channel, bool reversed)
1082 nframes_t this_read = 0;
1083 bool reloop = false;
1084 nframes_t loop_end = 0;
1085 nframes_t loop_start = 0;
1086 nframes_t loop_length = 0;
1087 nframes_t offset = 0;
1090 /* XXX we don't currently play loops in reverse. not sure why */
1094 /* Make the use of a Location atomic for this read operation.
1096 Note: Locations don't get deleted, so all we care about
1097 when I say "atomic" is that we are always pointing to
1098 the same one and using a start/length values obtained
1102 if ((loc = loop_location) != 0) {
1103 loop_start = loc->start();
1104 loop_end = loc->end();
1105 loop_length = loop_end - loop_start;
1108 /* if we are looping, ensure that the first frame we read is at the correct
1109 position within the loop.
1112 if (loc && start >= loop_end) {
1113 //cerr << "start adjusted from " << start;
1114 start = loop_start + ((start - loop_start) % loop_length);
1115 //cerr << "to " << start << endl;
1118 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1127 /* take any loop into account. we can't read past the end of the loop. */
1129 if (loc && (loop_end - start < cnt)) {
1130 this_read = loop_end - start;
1131 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1138 if (this_read == 0) {
1142 this_read = min(cnt,this_read);
1144 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1145 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1150 _read_data_count = _playlist->read_data_count();
1154 swap_by_ptr (buf, buf + this_read - 1);
1158 /* if we read to the end of the loop, go back to the beginning */
1168 offset += this_read;
1175 AudioDiskstream::do_refill_with_alloc ()
1177 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1178 float* gain_buf = new float[disk_io_chunk_frames];
1180 int ret = _do_refill(mix_buf, gain_buf);
1189 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1193 RingBufferNPT<Sample>::rw_vector vector;
1194 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1195 nframes_t total_space;
1196 nframes_t zero_fill;
1198 ChannelList::iterator i;
1199 boost::shared_ptr<ChannelList> c = channels.reader();
1206 assert(mixdown_buffer);
1207 assert(gain_buffer);
1214 c->front()->playback_buf->get_write_vector (&vector);
1216 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1220 /* if there are 2+ chunks of disk i/o possible for
1221 this track, let the caller know so that it can arrange
1222 for us to be called again, ASAP.
1225 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1229 /* if we're running close to normal speed and there isn't enough
1230 space to do disk_io_chunk_frames of I/O, then don't bother.
1232 at higher speeds, just do it because the sync between butler
1233 and audio thread may not be good enough.
1236 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1240 /* when slaved, don't try to get too close to the read pointer. this
1241 leaves space for the buffer reversal to have something useful to
1245 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1249 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1251 total_space = min (disk_io_chunk_frames, total_space);
1255 if (file_frame == 0) {
1257 /* at start: nothing to do but fill with silence */
1259 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1261 ChannelInfo* chan (*i);
1262 chan->playback_buf->get_write_vector (&vector);
1263 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1264 if (vector.len[1]) {
1265 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1267 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1272 if (file_frame < total_space) {
1274 /* too close to the start: read what we can,
1275 and then zero fill the rest
1278 zero_fill = total_space - file_frame;
1279 total_space = file_frame;
1289 if (file_frame == max_frames) {
1291 /* at end: nothing to do but fill with silence */
1293 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1295 ChannelInfo* chan (*i);
1296 chan->playback_buf->get_write_vector (&vector);
1297 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1298 if (vector.len[1]) {
1299 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1301 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1306 if (file_frame > max_frames - total_space) {
1308 /* to close to the end: read what we can, and zero fill the rest */
1310 zero_fill = total_space - (max_frames - file_frame);
1311 total_space = max_frames - file_frame;
1318 nframes_t file_frame_tmp = 0;
1320 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1322 ChannelInfo* chan (*i);
1325 nframes_t len1, len2;
1327 chan->playback_buf->get_write_vector (&vector);
1329 if (vector.len[0] > disk_io_chunk_frames) {
1331 /* we're not going to fill the first chunk, so certainly do not bother with the
1332 other part. it won't be connected with the part we do fill, as in:
1334 .... => writable space
1335 ++++ => readable space
1336 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1338 |......|+++++++++++++|...............................|
1343 So, just pretend that the buf1 part isn't there.
1353 file_frame_tmp = file_frame;
1355 buf1 = vector.buf[0];
1356 len1 = vector.len[0];
1357 buf2 = vector.buf[1];
1358 len2 = vector.len[1];
1360 to_read = min (ts, len1);
1361 to_read = min (to_read, disk_io_chunk_frames);
1365 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1370 chan->playback_buf->increment_write_ptr (to_read);
1374 to_read = min (ts, len2);
1378 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1379 so read some or all of vector.len[1] as well.
1382 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1387 chan->playback_buf->increment_write_ptr (to_read);
1396 file_frame = file_frame_tmp;
1403 /** Flush pending data to disk.
1405 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1406 * of data to disk. it will never write more than that. If it writes that
1407 * much and there is more than that waiting to be written, it will return 1,
1408 * otherwise 0 on success or -1 on failure.
1410 * If there is less than disk_io_chunk_frames to be written, no data will be
1411 * written at all unless @a force_flush is true.
1414 AudioDiskstream::do_flush (RunContext context, bool force_flush)
1418 RingBufferNPT<Sample>::rw_vector vector;
1419 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1422 _write_data_count = 0;
1424 transvec.buf[0] = 0;
1425 transvec.buf[1] = 0;
1429 boost::shared_ptr<ChannelList> c = channels.reader();
1430 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1432 (*chan)->capture_buf->get_read_vector (&vector);
1434 total = vector.len[0] + vector.len[1];
1436 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1440 /* if there are 2+ chunks of disk i/o possible for
1441 this track, let the caller know so that it can arrange
1442 for us to be called again, ASAP.
1444 if we are forcing a flush, then if there is* any* extra
1445 work, let the caller know.
1447 if we are no longer recording and there is any extra work,
1448 let the caller know too.
1451 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1455 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1457 // check the transition buffer when recording destructive
1458 // important that we get this after the capture buf
1460 if (destructive()) {
1461 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1462 size_t transcount = transvec.len[0] + transvec.len[1];
1463 bool have_start = false;
1466 for (ti=0; ti < transcount; ++ti) {
1467 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1469 if (captrans.type == CaptureStart) {
1470 // by definition, the first data we got above represents the given capture pos
1472 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1473 (*chan)->curr_capture_cnt = 0;
1477 else if (captrans.type == CaptureEnd) {
1479 // capture end, the capture_val represents total frames in capture
1481 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1483 // shorten to make the write a perfect fit
1484 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1486 if (nto_write < to_write) {
1487 ret = 1; // should we?
1489 to_write = nto_write;
1491 (*chan)->write_source->mark_capture_end ();
1493 // increment past this transition, but go no further
1498 // actually ends just beyond this chunk, so force more work
1506 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1510 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1511 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1515 (*chan)->capture_buf->increment_read_ptr (to_write);
1516 (*chan)->curr_capture_cnt += to_write;
1518 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1520 /* we wrote all of vector.len[0] but it wasn't an entire
1521 disk_io_chunk_frames of data, so arrange for some part
1522 of vector.len[1] to be flushed to disk as well.
1525 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1527 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1528 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1532 _write_data_count += (*chan)->write_source->write_data_count();
1534 (*chan)->capture_buf->increment_read_ptr (to_write);
1535 (*chan)->curr_capture_cnt += to_write;
1544 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1546 uint32_t buffer_position;
1547 bool more_work = true;
1549 boost::shared_ptr<AudioRegion> region;
1550 nframes_t total_capture;
1552 SourceList::iterator src;
1553 ChannelList::iterator chan;
1554 vector<CaptureInfo*>::iterator ci;
1555 boost::shared_ptr<ChannelList> c = channels.reader();
1557 bool mark_write_completed = false;
1559 finish_capture (true, c);
1561 /* butler is already stopped, but there may be work to do
1562 to flush remaining data to disk.
1565 while (more_work && !err) {
1566 switch (do_flush (TransportContext, true)) {
1573 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1578 /* XXX is there anything we can do if err != 0 ? */
1579 Glib::Mutex::Lock lm (capture_info_lock);
1581 if (capture_info.empty()) {
1585 if (abort_capture) {
1587 if (destructive()) {
1591 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1593 if ((*chan)->write_source) {
1595 (*chan)->write_source->mark_for_remove ();
1596 (*chan)->write_source->drop_references ();
1597 (*chan)->write_source.reset ();
1600 /* new source set up in "out" below */
1606 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1607 total_capture += (*ci)->frames;
1610 /* figure out the name for this take */
1612 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1614 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1618 s->update_header (capture_info.front()->start, when, twhen);
1619 s->set_captured_for (_name);
1620 s->mark_immutable ();
1621 if (Config->get_auto_analyse_audio()) {
1622 Analyser::queue_source_for_analysis (s, true);
1627 /* destructive tracks have a single, never changing region */
1629 if (destructive()) {
1631 /* send a signal that any UI can pick up to do the right thing. there is
1632 a small problem here in that a UI may need the peak data to be ready
1633 for the data that was recorded and this isn't interlocked with that
1634 process. this problem is deferred to the UI.
1637 _playlist->Modified();
1641 string whole_file_region_name;
1642 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1644 /* Register a new region with the Session that
1645 describes the entire source. Do this first
1646 so that any sub-regions will obviously be
1647 children of this one (later!)
1651 boost::shared_ptr<Region> rx (RegionFactory::create (srcs,
1652 c->front()->write_source->last_capture_start_frame(), total_capture,
1653 whole_file_region_name, 0,
1654 Region::Flag (Region::DefaultFlags|Region::Automatic|Region::WholeFile)));
1656 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1657 region->special_set_position (capture_info.front()->start);
1661 catch (failed_constructor& err) {
1662 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1666 _last_capture_regions.push_back (region);
1668 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1670 XMLNode &before = _playlist->get_state();
1671 _playlist->freeze ();
1673 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1677 _session.region_name (region_name, whole_file_region_name, false);
1679 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1682 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1683 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1686 catch (failed_constructor& err) {
1687 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1688 continue; /* XXX is this OK? */
1691 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1693 _last_capture_regions.push_back (region);
1695 i_am_the_modifier++;
1696 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1697 i_am_the_modifier--;
1699 buffer_position += (*ci)->frames;
1703 XMLNode &after = _playlist->get_state();
1704 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1707 mark_write_completed = true;
1710 reset_write_sources (mark_write_completed);
1714 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1718 capture_info.clear ();
1719 capture_start_frame = 0;
1723 AudioDiskstream::transport_looped (nframes_t transport_frame)
1725 if (was_recording) {
1726 // all we need to do is finish this capture, with modified capture length
1727 boost::shared_ptr<ChannelList> c = channels.reader();
1729 // adjust the capture length knowing that the data will be recorded to disk
1730 // only necessary after the first loop where we're recording
1731 if (capture_info.size() == 0) {
1732 capture_captured += _capture_offset;
1734 if (_alignment_style == ExistingMaterial) {
1735 capture_captured += _session.worst_output_latency();
1737 capture_captured += _roll_delay;
1741 finish_capture (true, c);
1743 // the next region will start recording via the normal mechanism
1744 // we'll set the start position to the current transport pos
1745 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1746 capture_start_frame = transport_frame;
1747 first_recordable_frame = transport_frame; // mild lie
1748 last_recordable_frame = max_frames;
1749 was_recording = true;
1751 if (recordable() && destructive()) {
1752 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1754 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1755 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1757 if (transvec.len[0] > 0) {
1758 transvec.buf[0]->type = CaptureStart;
1759 transvec.buf[0]->capture_val = capture_start_frame;
1760 (*chan)->capture_transition_buf->increment_write_ptr(1);
1764 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1774 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1776 was_recording = false;
1778 if (capture_captured == 0) {
1782 if (recordable() && destructive()) {
1783 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1785 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1786 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1788 if (transvec.len[0] > 0) {
1789 transvec.buf[0]->type = CaptureEnd;
1790 transvec.buf[0]->capture_val = capture_captured;
1791 (*chan)->capture_transition_buf->increment_write_ptr(1);
1795 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1801 CaptureInfo* ci = new CaptureInfo;
1803 ci->start = capture_start_frame;
1804 ci->frames = capture_captured;
1806 /* XXX theoretical race condition here. Need atomic exchange ?
1807 However, the circumstances when this is called right
1808 now (either on record-disable or transport_stopped)
1809 mean that no actual race exists. I think ...
1810 We now have a capture_info_lock, but it is only to be used
1811 to synchronize in the transport_stop and the capture info
1812 accessors, so that invalidation will not occur (both non-realtime).
1815 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1817 capture_info.push_back (ci);
1818 capture_captured = 0;
1820 /* now we've finished a capture, reset first_recordable_frame for next time */
1821 first_recordable_frame = max_frames;
1825 AudioDiskstream::set_record_enabled (bool yn)
1827 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1831 /* can't rec-enable in destructive mode if transport is before start */
1833 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1837 if (yn && channels.reader()->front()->source == 0) {
1839 /* pick up connections not initiated *from* the IO object
1840 we're associated with.
1843 get_input_sources ();
1846 /* yes, i know that this not proof against race conditions, but its
1847 good enough. i think.
1850 if (record_enabled() != yn) {
1852 engage_record_enable ();
1854 disengage_record_enable ();
1860 AudioDiskstream::engage_record_enable ()
1862 bool rolling = _session.transport_speed() != 0.0f;
1863 boost::shared_ptr<ChannelList> c = channels.reader();
1865 g_atomic_int_set (&_record_enabled, 1);
1866 capturing_sources.clear ();
1868 if (Config->get_monitoring_model() == HardwareMonitoring) {
1870 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1871 if ((*chan)->source) {
1872 (*chan)->source->ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1874 capturing_sources.push_back ((*chan)->write_source);
1875 (*chan)->write_source->mark_streaming_write_started ();
1879 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1880 capturing_sources.push_back ((*chan)->write_source);
1881 (*chan)->write_source->mark_streaming_write_started ();
1885 RecordEnableChanged (); /* EMIT SIGNAL */
1889 AudioDiskstream::disengage_record_enable ()
1891 g_atomic_int_set (&_record_enabled, 0);
1892 boost::shared_ptr<ChannelList> c = channels.reader();
1893 if (Config->get_monitoring_model() == HardwareMonitoring) {
1894 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1895 if ((*chan)->source) {
1896 (*chan)->source->ensure_monitor_input (false);
1900 capturing_sources.clear ();
1901 RecordEnableChanged (); /* EMIT SIGNAL */
1905 AudioDiskstream::get_state ()
1907 XMLNode* node = new XMLNode ("AudioDiskstream");
1909 LocaleGuard lg (X_("POSIX"));
1910 boost::shared_ptr<ChannelList> c = channels.reader();
1912 node->add_property ("flags", enum_2_string (_flags));
1914 snprintf (buf, sizeof(buf), "%zd", c->size());
1915 node->add_property ("channels", buf);
1917 node->add_property ("playlist", _playlist->name());
1919 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1920 node->add_property ("speed", buf);
1922 node->add_property("name", _name);
1923 id().print (buf, sizeof (buf));
1924 node->add_property("id", buf);
1926 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1928 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1929 XMLNode* cs_grandchild;
1931 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1932 cs_grandchild = new XMLNode (X_("file"));
1933 cs_grandchild->add_property (X_("path"), (*i)->path());
1934 cs_child->add_child_nocopy (*cs_grandchild);
1937 /* store the location where capture will start */
1941 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1942 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1944 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1947 cs_child->add_property (X_("at"), buf);
1948 node->add_child_nocopy (*cs_child);
1952 node->add_child_copy (*_extra_xml);
1959 AudioDiskstream::set_state (const XMLNode& node)
1961 const XMLProperty* prop;
1962 XMLNodeList nlist = node.children();
1963 XMLNodeIterator niter;
1964 uint32_t nchans = 1;
1965 XMLNode* capture_pending_node = 0;
1966 LocaleGuard lg (X_("POSIX"));
1968 in_set_state = true;
1970 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1971 if ((*niter)->name() == IO::state_node_name) {
1972 deprecated_io_node = new XMLNode (**niter);
1975 if ((*niter)->name() == X_("CapturingSources")) {
1976 capture_pending_node = *niter;
1980 /* prevent write sources from being created */
1982 in_set_state = true;
1984 if ((prop = node.property ("name")) != 0) {
1985 _name = prop->value();
1988 if (deprecated_io_node) {
1989 if ((prop = deprecated_io_node->property ("id")) != 0) {
1990 _id = prop->value ();
1993 if ((prop = node.property ("id")) != 0) {
1994 _id = prop->value ();
1998 if ((prop = node.property ("flags")) != 0) {
1999 _flags = Flag (string_2_enum (prop->value(), _flags));
2002 if ((prop = node.property ("channels")) != 0) {
2003 nchans = atoi (prop->value().c_str());
2006 // create necessary extra channels
2007 // we are always constructed with one and we always need one
2009 _n_channels.set(DataType::AUDIO, channels.reader()->size());
2011 if (nchans > _n_channels.n_audio()) {
2013 add_channel (nchans - _n_channels.n_audio());
2014 IO::PortCountChanged(_n_channels);
2016 } else if (nchans < _n_channels.n_audio()) {
2018 remove_channel (_n_channels.n_audio() - nchans);
2021 if ((prop = node.property ("playlist")) == 0) {
2026 bool had_playlist = (_playlist != 0);
2028 if (find_and_use_playlist (prop->value())) {
2032 if (!had_playlist) {
2033 _playlist->set_orig_diskstream_id (_id);
2036 if (!destructive() && capture_pending_node) {
2037 /* destructive streams have one and only one source per channel,
2038 and so they never end up in pending capture in any useful
2041 use_pending_capture_data (*capture_pending_node);
2046 if ((prop = node.property ("speed")) != 0) {
2047 double sp = atof (prop->value().c_str());
2049 if (realtime_set_speed (sp, false)) {
2050 non_realtime_set_speed ();
2054 in_set_state = false;
2056 /* make sure this is clear before we do anything else */
2058 capturing_sources.clear ();
2060 /* write sources are handled when we handle the input set
2061 up of the IO that owns this DS (::non_realtime_input_change())
2068 AudioDiskstream::use_new_write_source (uint32_t n)
2070 boost::shared_ptr<ChannelList> c = channels.reader();
2072 if (!recordable()) {
2076 if (n >= c->size()) {
2077 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
2081 ChannelInfo* chan = (*c)[n];
2083 if (chan->write_source) {
2084 chan->write_source->done_with_peakfile_writes ();
2085 chan->write_source->set_allow_remove_if_empty (true);
2086 chan->write_source.reset ();
2090 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
2091 throw failed_constructor();
2095 catch (failed_constructor &err) {
2096 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2097 chan->write_source.reset ();
2101 /* do not remove destructive files even if they are empty */
2103 chan->write_source->set_allow_remove_if_empty (!destructive());
2109 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
2111 ChannelList::iterator chan;
2112 boost::shared_ptr<ChannelList> c = channels.reader();
2115 cerr << _name << " RWS!!!\n";
2117 if (!recordable()) {
2121 capturing_sources.clear ();
2123 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2124 if (!destructive()) {
2126 if ((*chan)->write_source && mark_write_complete) {
2127 (*chan)->write_source->mark_streaming_write_completed ();
2129 use_new_write_source (n);
2131 if (record_enabled()) {
2132 capturing_sources.push_back ((*chan)->write_source);
2136 if ((*chan)->write_source == 0) {
2137 use_new_write_source (n);
2142 if (destructive()) {
2144 /* we now have all our write sources set up, so create the
2145 playlist's single region.
2148 if (_playlist->empty()) {
2149 setup_destructive_playlist ();
2155 AudioDiskstream::rename_write_sources ()
2157 ChannelList::iterator chan;
2158 boost::shared_ptr<ChannelList> c = channels.reader();
2161 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2162 if ((*chan)->write_source != 0) {
2163 (*chan)->write_source->set_source_name (_name, destructive());
2164 /* XXX what to do if one of them fails ? */
2172 AudioDiskstream::set_block_size (nframes_t nframes)
2174 if (_session.get_block_size() > speed_buffer_size) {
2175 speed_buffer_size = _session.get_block_size();
2176 boost::shared_ptr<ChannelList> c = channels.reader();
2178 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2179 if ((*chan)->speed_buffer)
2180 delete [] (*chan)->speed_buffer;
2181 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2184 allocate_temporary_buffers ();
2188 AudioDiskstream::allocate_temporary_buffers ()
2190 /* make sure the wrap buffer is at least large enough to deal
2191 with the speeds up to 1.2, to allow for micro-variation
2192 when slaving to MTC, SMPTE etc.
2195 double sp = max (fabsf (_actual_speed), 1.2f);
2196 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2198 if (required_wrap_size > wrap_buffer_size) {
2200 boost::shared_ptr<ChannelList> c = channels.reader();
2202 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2203 if ((*chan)->playback_wrap_buffer)
2204 delete [] (*chan)->playback_wrap_buffer;
2205 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2206 if ((*chan)->capture_wrap_buffer)
2207 delete [] (*chan)->capture_wrap_buffer;
2208 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2211 wrap_buffer_size = required_wrap_size;
2216 AudioDiskstream::monitor_input (bool yn)
2218 boost::shared_ptr<ChannelList> c = channels.reader();
2220 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2222 if ((*chan)->source) {
2223 (*chan)->source->ensure_monitor_input (yn);
2229 AudioDiskstream::set_align_style_from_io ()
2231 bool have_physical = false;
2237 get_input_sources ();
2239 boost::shared_ptr<ChannelList> c = channels.reader();
2241 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2242 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2243 have_physical = true;
2248 if (have_physical) {
2249 set_align_style (ExistingMaterial);
2251 set_align_style (CaptureTime);
2256 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2258 while (how_many--) {
2259 c->push_back (new ChannelInfo(_session.audio_diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2262 _n_channels.set(DataType::AUDIO, c->size());
2268 AudioDiskstream::add_channel (uint32_t how_many)
2270 RCUWriter<ChannelList> writer (channels);
2271 boost::shared_ptr<ChannelList> c = writer.get_copy();
2273 return add_channel_to (c, how_many);
2277 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2279 while (how_many-- && !c->empty()) {
2280 //delete c->back(); // FIXME: crash (thread safe with RCU?)
2284 _n_channels.set(DataType::AUDIO, c->size());
2290 AudioDiskstream::remove_channel (uint32_t how_many)
2292 RCUWriter<ChannelList> writer (channels);
2293 boost::shared_ptr<ChannelList> c = writer.get_copy();
2295 return remove_channel_from (c, how_many);
2299 AudioDiskstream::playback_buffer_load () const
2301 boost::shared_ptr<ChannelList> c = channels.reader();
2303 return (float) ((double) c->front()->playback_buf->read_space()/
2304 (double) c->front()->playback_buf->bufsize());
2308 AudioDiskstream::capture_buffer_load () const
2310 boost::shared_ptr<ChannelList> c = channels.reader();
2312 return (float) ((double) c->front()->capture_buf->write_space()/
2313 (double) c->front()->capture_buf->bufsize());
2317 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2319 const XMLProperty* prop;
2320 XMLNodeList nlist = node.children();
2321 XMLNodeIterator niter;
2322 boost::shared_ptr<AudioFileSource> fs;
2323 boost::shared_ptr<AudioFileSource> first_fs;
2324 SourceList pending_sources;
2327 if ((prop = node.property (X_("at"))) == 0) {
2331 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2335 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2336 if ((*niter)->name() == X_("file")) {
2338 if ((prop = (*niter)->property (X_("path"))) == 0) {
2342 // This protects sessions from errant CapturingSources in stored sessions
2344 if (stat (prop->value().c_str(), &sbuf)) {
2349 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2350 SourceFactory::createWritable (DataType::AUDIO, _session,
2351 prop->value(), true,
2352 false, _session.frame_rate()));
2355 catch (failed_constructor& err) {
2356 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2357 _name, prop->value())
2362 pending_sources.push_back (fs);
2364 if (first_fs == 0) {
2368 fs->set_captured_for (_name);
2372 if (pending_sources.size() == 0) {
2373 /* nothing can be done */
2377 if (pending_sources.size() != _n_channels.n_audio()) {
2378 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2383 boost::shared_ptr<AudioRegion> region;
2386 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (
2387 pending_sources, 0, first_fs->length(first_fs->timeline_position()),
2388 region_name_from_path (first_fs->name(), true), 0,
2389 Region::Flag (Region::DefaultFlags|Region::Automatic|Region::WholeFile)));
2390 region->special_set_position (0);
2393 catch (failed_constructor& err) {
2394 error << string_compose (
2395 _("%1: cannot create whole-file region from pending capture sources"),
2402 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (
2403 pending_sources, 0, first_fs->length(first_fs->timeline_position()),
2404 region_name_from_path (first_fs->name(), true)));
2407 catch (failed_constructor& err) {
2408 error << string_compose (_("%1: cannot create region from pending capture sources"),
2415 _playlist->add_region (region, position);
2421 AudioDiskstream::set_non_layered (bool yn)
2423 if (yn != non_layered()) {
2426 _flags = Flag (_flags | NonLayered);
2428 _flags = Flag (_flags & ~NonLayered);
2436 AudioDiskstream::set_destructive (bool yn)
2438 bool bounce_ignored;
2440 if (yn != destructive()) {
2443 /* requestor should already have checked this and
2444 bounced if necessary and desired
2446 if (!can_become_destructive (bounce_ignored)) {
2449 _flags = Flag (_flags | Destructive);
2450 use_destructive_playlist ();
2452 _flags = Flag (_flags & ~Destructive);
2453 reset_write_sources (true, true);
2461 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2464 requires_bounce = false;
2468 /* is there only one region ? */
2470 if (_playlist->n_regions() != 1) {
2471 requires_bounce = true;
2475 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2478 /* do the source(s) for the region cover the session start position ? */
2480 if (first->position() != _session.current_start_frame()) {
2481 if (first->start() > _session.current_start_frame()) {
2482 requires_bounce = true;
2487 /* is the source used by only 1 playlist ? */
2489 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2493 if (afirst->source()->used() > 1) {
2494 requires_bounce = true;
2498 requires_bounce = false;
2502 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2506 current_capture_buffer = 0;
2507 current_playback_buffer = 0;
2508 curr_capture_cnt = 0;
2510 speed_buffer = new Sample[speed_size];
2511 playback_wrap_buffer = new Sample[wrap_size];
2512 capture_wrap_buffer = new Sample[wrap_size];
2514 playback_buf = new RingBufferNPT<Sample> (bufsize);
2515 capture_buf = new RingBufferNPT<Sample> (bufsize);
2516 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2518 /* touch the ringbuffer buffers, which will cause
2519 them to be mapped into locked physical RAM if
2520 we're running with mlockall(). this doesn't do
2524 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2525 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2526 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2529 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2532 write_source.reset ();
2535 delete [] speed_buffer;
2538 delete [] playback_wrap_buffer;
2539 playback_wrap_buffer = 0;
2541 delete [] capture_wrap_buffer;
2542 capture_wrap_buffer = 0;
2544 delete playback_buf;
2550 delete capture_transition_buf;
2551 capture_transition_buf = 0;