2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include <pbd/error.h>
34 #include <pbd/basename.h>
35 #include <glibmm/thread.h>
36 #include <pbd/xml++.h>
37 #include <pbd/memento_command.h>
39 #include <ardour/ardour.h>
40 #include <ardour/audioengine.h>
41 #include <ardour/audio_diskstream.h>
42 #include <ardour/utils.h>
43 #include <ardour/configuration.h>
44 #include <ardour/audiofilesource.h>
45 #include <ardour/destructive_filesource.h>
46 #include <ardour/send.h>
47 #include <ardour/region_factory.h>
48 #include <ardour/audioplaylist.h>
49 #include <ardour/cycle_timer.h>
50 #include <ardour/audioregion.h>
51 #include <ardour/audio_port.h>
52 #include <ardour/source_factory.h>
58 using namespace ARDOUR;
61 size_t AudioDiskstream::_working_buffers_size = 0;
62 Sample* AudioDiskstream::_mixdown_buffer = 0;
63 gain_t* AudioDiskstream::_gain_buffer = 0;
65 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
66 : Diskstream(sess, name, flag)
67 , deprecated_io_node(NULL)
69 /* prevent any write sources from being created */
79 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
80 : Diskstream(sess, node)
81 , deprecated_io_node(NULL)
86 if (set_state (node)) {
88 throw failed_constructor();
94 use_destructive_playlist ();
99 AudioDiskstream::init_channel (ChannelInfo &chan)
101 chan.playback_wrap_buffer = 0;
102 chan.capture_wrap_buffer = 0;
103 chan.speed_buffer = 0;
104 chan.peak_power = 0.0f;
106 chan.current_capture_buffer = 0;
107 chan.current_playback_buffer = 0;
108 chan.curr_capture_cnt = 0;
110 chan.playback_buf = new RingBufferNPT<Sample> (_session.diskstream_buffer_size());
111 chan.capture_buf = new RingBufferNPT<Sample> (_session.diskstream_buffer_size());
112 chan.capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
115 /* touch the ringbuffer buffers, which will cause
116 them to be mapped into locked physical RAM if
117 we're running with mlockall(). this doesn't do
120 memset (chan.playback_buf->buffer(), 0, sizeof (Sample) * chan.playback_buf->bufsize());
121 memset (chan.capture_buf->buffer(), 0, sizeof (Sample) * chan.capture_buf->bufsize());
122 memset (chan.capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * chan.capture_transition_buf->bufsize());
127 AudioDiskstream::init (Diskstream::Flag f)
131 /* there are no channels at this point, so these
132 two calls just get speed_buffer_size and wrap_buffer
133 size setup without duplicating their code.
136 set_block_size (_session.get_block_size());
137 allocate_temporary_buffers ();
140 assert(_n_channels == ChanCount(DataType::AUDIO, 1));
144 AudioDiskstream::destroy_channel (ChannelInfo &chan)
146 if (chan.write_source) {
147 chan.write_source.reset ();
150 if (chan.speed_buffer) {
151 delete [] chan.speed_buffer;
154 if (chan.playback_wrap_buffer) {
155 delete [] chan.playback_wrap_buffer;
157 if (chan.capture_wrap_buffer) {
158 delete [] chan.capture_wrap_buffer;
161 delete chan.playback_buf;
162 delete chan.capture_buf;
163 delete chan.capture_transition_buf;
165 chan.playback_buf = 0;
166 chan.capture_buf = 0;
169 AudioDiskstream::~AudioDiskstream ()
171 Glib::Mutex::Lock lm (state_lock);
173 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan)
174 destroy_channel((*chan));
180 AudioDiskstream::allocate_working_buffers()
182 assert(disk_io_frames() > 0);
184 _working_buffers_size = disk_io_frames();
185 _mixdown_buffer = new Sample[_working_buffers_size];
186 _gain_buffer = new gain_t[_working_buffers_size];
190 AudioDiskstream::free_working_buffers()
192 delete [] _mixdown_buffer;
193 delete [] _gain_buffer;
194 _working_buffers_size = 0;
200 AudioDiskstream::non_realtime_input_change ()
203 Glib::Mutex::Lock lm (state_lock);
205 if (input_change_pending == NoChange) {
209 if (input_change_pending & ConfigurationChanged) {
211 if (_io->n_inputs().get(DataType::AUDIO) > _n_channels.get(DataType::AUDIO)) {
213 // we need to add new channel infos
215 int diff = _io->n_inputs().get(DataType::AUDIO) - channels.size();
217 for (int i = 0; i < diff; ++i) {
221 } else if (_io->n_inputs().get(DataType::AUDIO) < _n_channels.get(DataType::AUDIO)) {
223 // we need to get rid of channels
225 int diff = channels.size() - _io->n_inputs().get(DataType::AUDIO);
227 for (int i = 0; i < diff; ++i) {
233 get_input_sources ();
234 set_capture_offset ();
236 if (first_input_change) {
237 set_align_style (_persistent_alignment_style);
238 first_input_change = false;
240 set_align_style_from_io ();
243 input_change_pending = NoChange;
246 /* reset capture files */
248 reset_write_sources (false);
250 /* now refill channel buffers */
252 if (speed() != 1.0f || speed() != -1.0f) {
253 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
255 seek (_session.transport_frame());
260 AudioDiskstream::get_input_sources ()
262 uint32_t ni = _io->n_inputs().get(DataType::AUDIO);
264 for (uint32_t n = 0; n < ni; ++n) {
266 const char **connections = _io->input(n)->get_connections ();
267 ChannelInfo& chan = channels[n];
269 if (connections == 0 || connections[0] == 0) {
272 // _source->disable_metering ();
278 chan.source = dynamic_cast<AudioPort*>(
279 _session.engine().get_port_by_name (connections[0]) );
289 AudioDiskstream::find_and_use_playlist (const string& name)
292 AudioPlaylist* playlist;
294 if ((pl = _session.playlist_by_name (name)) == 0) {
295 playlist = new AudioPlaylist(_session, name);
299 if ((playlist = dynamic_cast<AudioPlaylist*> (pl)) == 0) {
300 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
304 return use_playlist (playlist);
308 AudioDiskstream::use_playlist (Playlist* playlist)
310 assert(dynamic_cast<AudioPlaylist*>(playlist));
312 Diskstream::use_playlist(playlist);
318 AudioDiskstream::use_new_playlist ()
321 AudioPlaylist* playlist;
323 if (!in_set_state && destructive()) {
328 newname = Playlist::bump_name (_playlist->name(), _session);
330 newname = Playlist::bump_name (_name, _session);
333 if ((playlist = new AudioPlaylist (_session, newname, hidden())) != 0) {
334 playlist->set_orig_diskstream_id (id());
335 return use_playlist (playlist);
342 AudioDiskstream::use_copy_playlist ()
344 assert(audio_playlist());
350 if (_playlist == 0) {
351 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
356 AudioPlaylist* playlist;
358 newname = Playlist::bump_name (_playlist->name(), _session);
360 if ((playlist = new AudioPlaylist (*audio_playlist(), newname)) != 0) {
361 playlist->set_orig_diskstream_id (id());
362 return use_playlist (playlist);
369 AudioDiskstream::setup_destructive_playlist ()
373 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
374 srcs.push_back ((*chan).write_source);
377 /* a single full-sized region */
379 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
380 _playlist->add_region (region, srcs.front()->natural_position());
384 AudioDiskstream::use_destructive_playlist ()
386 /* this is called from the XML-based constructor or ::set_destructive. when called,
387 we already have a playlist and a region, but we need to
388 set up our sources for write. we use the sources associated
389 with the (presumed single, full-extent) region.
392 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
395 reset_write_sources (false, true);
399 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
402 throw failed_constructor();
405 /* be sure to stretch the region out to the maximum length */
407 region->set_length (max_frames - region->position(), this);
410 ChannelList::iterator chan;
412 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
413 (*chan).write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
414 assert((*chan).write_source);
415 (*chan).write_source->set_allow_remove_if_empty (false);
417 /* this might be false if we switched modes, so force it */
419 (*chan).write_source->set_destructive (true);
422 /* the source list will never be reset for a destructive track */
426 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
428 int possibly_recording;
431 const int transport_rolling = 0x4;
432 const int track_rec_enabled = 0x2;
433 const int global_rec_enabled = 0x1;
435 /* merge together the 3 factors that affect record status, and compute
439 rolling = _session.transport_speed() != 0.0f;
440 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
441 change = possibly_recording ^ last_possibly_recording;
443 if (possibly_recording == last_possibly_recording) {
449 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
451 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
452 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
454 /* starting to record: compute first+last frames */
456 first_recordable_frame = transport_frame + _capture_offset;
457 last_recordable_frame = max_frames;
458 capture_start_frame = transport_frame;
460 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
462 /* was stopped, now rolling (and recording) */
464 if (_alignment_style == ExistingMaterial) {
465 first_recordable_frame += _session.worst_output_latency();
467 first_recordable_frame += _roll_delay;
472 /* was rolling, but record state changed */
474 if (_alignment_style == ExistingMaterial) {
476 if (!Config->get_punch_in()) {
478 /* manual punch in happens at the correct transport frame
479 because the user hit a button. but to get alignment correct
480 we have to back up the position of the new region to the
481 appropriate spot given the roll delay.
484 capture_start_frame -= _roll_delay;
486 /* XXX paul notes (august 2005): i don't know why
490 first_recordable_frame += _capture_offset;
494 /* autopunch toggles recording at the precise
495 transport frame, and then the DS waits
496 to start recording for a time that depends
497 on the output latency.
500 first_recordable_frame += _session.worst_output_latency();
505 if (Config->get_punch_in()) {
506 first_recordable_frame += _roll_delay;
508 capture_start_frame -= _roll_delay;
514 if (_flags & Recordable) {
515 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
517 RingBufferNPT<CaptureTransition>::rw_vector transvec;
518 (*chan).capture_transition_buf->get_write_vector(&transvec);
520 if (transvec.len[0] > 0) {
521 transvec.buf[0]->type = CaptureStart;
522 transvec.buf[0]->capture_val = capture_start_frame;
523 (*chan).capture_transition_buf->increment_write_ptr(1);
527 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
533 } else if (!record_enabled() || !can_record) {
537 last_recordable_frame = transport_frame + _capture_offset;
539 if (_alignment_style == ExistingMaterial) {
540 last_recordable_frame += _session.worst_output_latency();
542 last_recordable_frame += _roll_delay;
546 last_possibly_recording = possibly_recording;
550 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
553 ChannelList::iterator c;
555 nframes_t rec_offset = 0;
556 nframes_t rec_nframes = 0;
557 bool nominally_recording;
558 bool re = record_enabled ();
559 bool collect_playback = false;
561 /* if we've already processed the frames corresponding to this call,
562 just return. this allows multiple routes that are taking input
563 from this diskstream to call our ::process() method, but have
564 this stuff only happen once. more commonly, it allows both
565 the AudioTrack that is using this AudioDiskstream *and* the Session
566 to call process() without problems.
573 check_record_status (transport_frame, nframes, can_record);
575 nominally_recording = (can_record && re);
582 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
583 must always be called as a pair. The only exception is if this function
584 returns a non-zero value, in which case, ::commit should not be called.
587 // If we can't take the state lock return.
588 if (!state_lock.trylock()) {
592 adjust_capture_position = 0;
594 for (c = channels.begin(); c != channels.end(); ++c) {
595 (*c).current_capture_buffer = 0;
596 (*c).current_playback_buffer = 0;
599 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
602 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
609 case OverlapInternal:
610 /* ---------- recrange
613 rec_nframes = nframes;
618 /* |--------| recrange
621 rec_nframes = transport_frame + nframes - first_recordable_frame;
623 rec_offset = first_recordable_frame - transport_frame;
628 /* |--------| recrange
631 rec_nframes = last_recordable_frame - transport_frame;
635 case OverlapExternal:
636 /* |--------| recrange
637 -------------- transrange
639 rec_nframes = last_recordable_frame - last_recordable_frame;
640 rec_offset = first_recordable_frame - transport_frame;
644 if (rec_nframes && !was_recording) {
645 capture_captured = 0;
646 was_recording = true;
651 if (can_record && !_last_capture_regions.empty()) {
652 _last_capture_regions.clear ();
655 if (nominally_recording || rec_nframes) {
657 for (n = 0, c = channels.begin(); c != channels.end(); ++c, ++n) {
659 ChannelInfo& chan (*c);
661 chan.capture_buf->get_write_vector (&chan.capture_vector);
663 if (rec_nframes <= chan.capture_vector.len[0]) {
665 chan.current_capture_buffer = chan.capture_vector.buf[0];
667 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
671 AudioPort* const ap = _io->audio_input(n);
673 assert(rec_nframes <= ap->get_audio_buffer().capacity());
675 memcpy (chan.current_capture_buffer, ap->get_audio_buffer().data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
679 nframes_t total = chan.capture_vector.len[0] + chan.capture_vector.len[1];
681 if (rec_nframes > total) {
686 AudioPort* const ap = _io->audio_input(n);
689 Sample* buf = ap->get_audio_buffer().data(nframes, offset);
690 nframes_t first = chan.capture_vector.len[0];
692 memcpy (chan.capture_wrap_buffer, buf, sizeof (Sample) * first);
693 memcpy (chan.capture_vector.buf[0], buf, sizeof (Sample) * first);
694 memcpy (chan.capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
695 memcpy (chan.capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
697 chan.current_capture_buffer = chan.capture_wrap_buffer;
704 finish_capture (rec_monitors_input);
711 /* data will be written to disk */
713 if (rec_nframes == nframes && rec_offset == 0) {
715 for (c = channels.begin(); c != channels.end(); ++c) {
716 (*c).current_playback_buffer = (*c).current_capture_buffer;
719 playback_distance = nframes;
724 /* we can't use the capture buffer as the playback buffer, because
725 we recorded only a part of the current process' cycle data
729 collect_playback = true;
732 adjust_capture_position = rec_nframes;
734 } else if (nominally_recording) {
736 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
738 for (c = channels.begin(); c != channels.end(); ++c) {
739 (*c).current_playback_buffer = (*c).current_capture_buffer;
742 playback_distance = nframes;
746 collect_playback = true;
749 if (collect_playback) {
751 /* we're doing playback */
753 nframes_t necessary_samples;
755 /* no varispeed playback if we're recording, because the output .... TBD */
757 if (rec_nframes == 0 && _actual_speed != 1.0f) {
758 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
760 necessary_samples = nframes;
763 for (c = channels.begin(); c != channels.end(); ++c) {
764 (*c).playback_buf->get_read_vector (&(*c).playback_vector);
769 for (c = channels.begin(); c != channels.end(); ++c, ++n) {
771 ChannelInfo& chan (*c);
773 if (necessary_samples <= chan.playback_vector.len[0]) {
775 chan.current_playback_buffer = chan.playback_vector.buf[0];
778 nframes_t total = chan.playback_vector.len[0] + chan.playback_vector.len[1];
780 if (necessary_samples > total) {
786 memcpy ((char *) chan.playback_wrap_buffer, chan.playback_vector.buf[0],
787 chan.playback_vector.len[0] * sizeof (Sample));
788 memcpy (chan.playback_wrap_buffer + chan.playback_vector.len[0], chan.playback_vector.buf[1],
789 (necessary_samples - chan.playback_vector.len[0]) * sizeof (Sample));
791 chan.current_playback_buffer = chan.playback_wrap_buffer;
796 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
798 uint64_t phase = last_phase;
801 // Linearly interpolate into the alt buffer
802 // using 40.24 fixp maths (swh)
804 for (c = channels.begin(); c != channels.end(); ++c) {
807 ChannelInfo& chan (*c);
812 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
814 fr = (phase & 0xFFFFFF) / 16777216.0f;
815 chan.speed_buffer[outsample] =
816 chan.current_playback_buffer[i] * (1.0f - fr) +
817 chan.current_playback_buffer[i+1] * fr;
821 chan.current_playback_buffer = chan.speed_buffer;
824 playback_distance = i + 1;
825 last_phase = (phase & 0xFFFFFF);
828 playback_distance = nframes;
840 /* we're exiting with failure, so ::commit will not
841 be called. unlock the state lock.
851 AudioDiskstream::commit (nframes_t nframes)
853 bool need_butler = false;
855 if (_actual_speed < 0.0) {
856 playback_sample -= playback_distance;
858 playback_sample += playback_distance;
861 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
863 (*chan).playback_buf->increment_read_ptr (playback_distance);
865 if (adjust_capture_position) {
866 (*chan).capture_buf->increment_write_ptr (adjust_capture_position);
870 if (adjust_capture_position != 0) {
871 capture_captured += adjust_capture_position;
872 adjust_capture_position = 0;
876 need_butler = channels[0].playback_buf->write_space() >= channels[0].playback_buf->bufsize() / 2;
878 need_butler = channels[0].playback_buf->write_space() >= disk_io_chunk_frames
879 || channels[0].capture_buf->read_space() >= disk_io_chunk_frames;
890 AudioDiskstream::set_pending_overwrite (bool yn)
892 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
894 pending_overwrite = yn;
896 overwrite_frame = playback_sample;
897 overwrite_offset = channels.front().playback_buf->get_read_ptr();
901 AudioDiskstream::overwrite_existing_buffers ()
903 Sample* mixdown_buffer;
906 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
908 overwrite_queued = false;
910 /* assume all are the same size */
911 nframes_t size = channels[0].playback_buf->bufsize();
913 mixdown_buffer = new Sample[size];
914 gain_buffer = new float[size];
916 /* reduce size so that we can fill the buffer correctly. */
922 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
924 start = overwrite_frame;
925 nframes_t cnt = size;
927 /* to fill the buffer without resetting the playback sample, we need to
928 do it one or two chunks (normally two).
930 |----------------------------------------------------------------------|
934 |<- second chunk->||<----------------- first chunk ------------------>|
938 nframes_t to_read = size - overwrite_offset;
940 if (read ((*chan).playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
941 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
942 _id, size, playback_sample) << endmsg;
950 if (read ((*chan).playback_buf->buffer(), mixdown_buffer, gain_buffer,
951 start, cnt, *chan, n, reversed)) {
952 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
953 _id, size, playback_sample) << endmsg;
962 pending_overwrite = false;
963 delete [] gain_buffer;
964 delete [] mixdown_buffer;
969 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
971 Glib::Mutex::Lock lm (state_lock);
974 ChannelList::iterator chan;
976 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
977 (*chan).playback_buf->reset ();
978 (*chan).capture_buf->reset ();
981 /* can't rec-enable in destructive mode if transport is before start */
983 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
984 disengage_record_enable ();
987 playback_sample = frame;
990 if (complete_refill) {
991 while ((ret = do_refill_with_alloc ()) > 0) ;
993 ret = do_refill_with_alloc ();
1000 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
1002 ChannelList::iterator chan;
1004 for (chan = channels.begin(); chan != channels.end(); ++chan) {
1005 if ((*chan).playback_buf->read_space() < distance) {
1013 AudioDiskstream::internal_playback_seek (nframes_t distance)
1015 ChannelList::iterator chan;
1017 for (chan = channels.begin(); chan != channels.end(); ++chan) {
1018 (*chan).playback_buf->increment_read_ptr (distance);
1021 first_recordable_frame += distance;
1022 playback_sample += distance;
1028 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
1029 ChannelInfo& channel_info, int channel, bool reversed)
1031 nframes_t this_read = 0;
1032 bool reloop = false;
1033 nframes_t loop_end = 0;
1034 nframes_t loop_start = 0;
1035 nframes_t loop_length = 0;
1036 nframes_t offset = 0;
1040 /* Make the use of a Location atomic for this read operation.
1042 Note: Locations don't get deleted, so all we care about
1043 when I say "atomic" is that we are always pointing to
1044 the same one and using a start/length values obtained
1048 if ((loc = loop_location) != 0) {
1049 loop_start = loc->start();
1050 loop_end = loc->end();
1051 loop_length = loop_end - loop_start;
1054 /* if we are looping, ensure that the first frame we read is at the correct
1055 position within the loop.
1058 if (loc && start >= loop_end) {
1059 //cerr << "start adjusted from " << start;
1060 start = loop_start + ((start - loop_start) % loop_length);
1061 //cerr << "to " << start << endl;
1063 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1068 /* take any loop into account. we can't read past the end of the loop. */
1070 if (loc && (loop_end - start < cnt)) {
1071 this_read = loop_end - start;
1072 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1079 if (this_read == 0) {
1083 this_read = min(cnt,this_read);
1085 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1086 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1091 _read_data_count = _playlist->read_data_count();
1095 /* don't adjust start, since caller has already done that
1098 swap_by_ptr (buf, buf + this_read - 1);
1102 /* if we read to the end of the loop, go back to the beginning */
1112 offset += this_read;
1119 AudioDiskstream::do_refill_with_alloc()
1121 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1122 float* gain_buf = new float[disk_io_chunk_frames];
1124 int ret = _do_refill(mix_buf, gain_buf);
1133 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1137 RingBufferNPT<Sample>::rw_vector vector;
1138 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1139 nframes_t total_space;
1140 nframes_t zero_fill;
1142 ChannelList::iterator i;
1145 assert(mixdown_buffer);
1146 assert(gain_buffer);
1148 channels.front().playback_buf->get_write_vector (&vector);
1150 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1154 /* if there are 2+ chunks of disk i/o possible for
1155 this track, let the caller know so that it can arrange
1156 for us to be called again, ASAP.
1159 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1163 /* if we're running close to normal speed and there isn't enough
1164 space to do disk_io_chunk_frames of I/O, then don't bother.
1166 at higher speeds, just do it because the sync between butler
1167 and audio thread may not be good enough.
1170 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1174 /* when slaved, don't try to get too close to the read pointer. this
1175 leaves space for the buffer reversal to have something useful to
1179 if (_slaved && total_space < (channels.front().playback_buf->bufsize() / 2)) {
1183 total_space = min (disk_io_chunk_frames, total_space);
1187 if (file_frame == 0) {
1189 /* at start: nothing to do but fill with silence */
1191 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1193 ChannelInfo& chan (*i);
1194 chan.playback_buf->get_write_vector (&vector);
1195 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1196 if (vector.len[1]) {
1197 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1199 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1204 if (file_frame < total_space) {
1206 /* too close to the start: read what we can,
1207 and then zero fill the rest
1210 zero_fill = total_space - file_frame;
1211 total_space = file_frame;
1216 /* move read position backwards because we are going
1217 to reverse the data.
1220 file_frame -= total_space;
1226 if (file_frame == max_frames) {
1228 /* at end: nothing to do but fill with silence */
1230 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1232 ChannelInfo& chan (*i);
1233 chan.playback_buf->get_write_vector (&vector);
1234 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1235 if (vector.len[1]) {
1236 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1238 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1243 if (file_frame > max_frames - total_space) {
1245 /* to close to the end: read what we can, and zero fill the rest */
1247 zero_fill = total_space - (max_frames - file_frame);
1248 total_space = max_frames - file_frame;
1255 nframes_t file_frame_tmp = 0;
1257 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1259 ChannelInfo& chan (*i);
1262 nframes_t len1, len2;
1264 chan.playback_buf->get_write_vector (&vector);
1267 file_frame_tmp = file_frame;
1270 buf1 = vector.buf[1];
1271 len1 = vector.len[1];
1272 buf2 = vector.buf[0];
1273 len2 = vector.len[0];
1275 buf1 = vector.buf[0];
1276 len1 = vector.len[0];
1277 buf2 = vector.buf[1];
1278 len2 = vector.len[1];
1282 to_read = min (ts, len1);
1283 to_read = min (to_read, disk_io_chunk_frames);
1287 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1292 chan.playback_buf->increment_write_ptr (to_read);
1296 to_read = min (ts, len2);
1301 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1302 so read some or all of vector.len[1] as well.
1305 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1310 chan.playback_buf->increment_write_ptr (to_read);
1319 file_frame = file_frame_tmp;
1326 /** Flush pending data to disk.
1328 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1329 * of data to disk. it will never write more than that. If it writes that
1330 * much and there is more than that waiting to be written, it will return 1,
1331 * otherwise 0 on success or -1 on failure.
1333 * If there is less than disk_io_chunk_frames to be written, no data will be
1334 * written at all unless @a force_flush is true.
1337 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1341 RingBufferNPT<Sample>::rw_vector vector;
1342 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1345 _write_data_count = 0;
1347 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1349 (*chan).capture_buf->get_read_vector (&vector);
1351 total = vector.len[0] + vector.len[1];
1354 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1358 /* if there are 2+ chunks of disk i/o possible for
1359 this track, let the caller know so that it can arrange
1360 for us to be called again, ASAP.
1362 if we are forcing a flush, then if there is* any* extra
1363 work, let the caller know.
1365 if we are no longer recording and there is any extra work,
1366 let the caller know too.
1369 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1373 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1375 // check the transition buffer when recording destructive
1376 // important that we get this after the capture buf
1378 if (destructive()) {
1379 (*chan).capture_transition_buf->get_read_vector(&transvec);
1380 size_t transcount = transvec.len[0] + transvec.len[1];
1381 bool have_start = false;
1384 for (ti=0; ti < transcount; ++ti) {
1385 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1387 if (captrans.type == CaptureStart) {
1388 // by definition, the first data we got above represents the given capture pos
1390 (*chan).write_source->mark_capture_start (captrans.capture_val);
1391 (*chan).curr_capture_cnt = 0;
1395 else if (captrans.type == CaptureEnd) {
1397 // capture end, the capture_val represents total frames in capture
1399 if (captrans.capture_val <= (*chan).curr_capture_cnt + to_write) {
1401 // shorten to make the write a perfect fit
1402 uint32_t nto_write = (captrans.capture_val - (*chan).curr_capture_cnt);
1404 if (nto_write < to_write) {
1405 ret = 1; // should we?
1407 to_write = nto_write;
1409 (*chan).write_source->mark_capture_end ();
1411 // increment past this transition, but go no further
1416 // actually ends just beyond this chunk, so force more work
1424 (*chan).capture_transition_buf->increment_read_ptr(ti);
1428 if ((!(*chan).write_source) || (*chan).write_source->write (vector.buf[0], to_write) != to_write) {
1429 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1433 (*chan).capture_buf->increment_read_ptr (to_write);
1434 (*chan).curr_capture_cnt += to_write;
1436 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1438 /* we wrote all of vector.len[0] but it wasn't an entire
1439 disk_io_chunk_frames of data, so arrange for some part
1440 of vector.len[1] to be flushed to disk as well.
1443 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1445 if ((*chan).write_source->write (vector.buf[1], to_write) != to_write) {
1446 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1450 _write_data_count += (*chan).write_source->write_data_count();
1452 (*chan).capture_buf->increment_read_ptr (to_write);
1453 (*chan).curr_capture_cnt += to_write;
1462 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1464 uint32_t buffer_position;
1465 bool more_work = true;
1467 boost::shared_ptr<AudioRegion> region;
1468 nframes_t total_capture;
1470 SourceList::iterator src;
1471 ChannelList::iterator chan;
1472 vector<CaptureInfo*>::iterator ci;
1474 bool mark_write_completed = false;
1476 finish_capture (true);
1478 /* butler is already stopped, but there may be work to do
1479 to flush remaining data to disk.
1482 while (more_work && !err) {
1483 switch (do_flush (Session::TransportContext, true)) {
1490 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1495 /* XXX is there anything we can do if err != 0 ? */
1496 Glib::Mutex::Lock lm (capture_info_lock);
1498 if (capture_info.empty()) {
1502 if (abort_capture) {
1504 if (destructive()) {
1508 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1510 if ((*chan).write_source) {
1512 (*chan).write_source->mark_for_remove ();
1513 (*chan).write_source->drop_references ();
1514 (*chan).write_source.reset ();
1517 /* new source set up in "out" below */
1523 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1524 total_capture += (*ci)->frames;
1527 /* figure out the name for this take */
1529 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1531 boost::shared_ptr<AudioFileSource> s = (*chan).write_source;
1535 s->update_header (capture_info.front()->start, when, twhen);
1536 s->set_captured_for (_name);
1541 /* destructive tracks have a single, never changing region */
1543 if (destructive()) {
1545 /* send a signal that any UI can pick up to do the right thing. there is
1546 a small problem here in that a UI may need the peak data to be ready
1547 for the data that was recorded and this isn't interlocked with that
1548 process. this problem is deferred to the UI.
1551 _playlist->Modified();
1555 string whole_file_region_name;
1556 whole_file_region_name = region_name_from_path (channels[0].write_source->name());
1558 /* Register a new region with the Session that
1559 describes the entire source. Do this first
1560 so that any sub-regions will obviously be
1561 children of this one (later!)
1565 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, channels[0].write_source->last_capture_start_frame(), total_capture,
1566 whole_file_region_name,
1567 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1569 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1570 region->special_set_position (capture_info.front()->start);
1574 catch (failed_constructor& err) {
1575 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1579 _last_capture_regions.push_back (region);
1581 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1583 XMLNode &before = _playlist->get_state();
1584 _playlist->freeze ();
1586 for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1590 _session.region_name (region_name, whole_file_region_name, false);
1592 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1595 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1596 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1599 catch (failed_constructor& err) {
1600 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1601 continue; /* XXX is this OK? */
1604 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1606 _last_capture_regions.push_back (region);
1608 i_am_the_modifier++;
1609 _playlist->add_region (region, (*ci)->start);
1610 i_am_the_modifier--;
1612 buffer_position += (*ci)->frames;
1616 XMLNode &after = _playlist->get_state();
1617 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1620 mark_write_completed = true;
1623 reset_write_sources (mark_write_completed);
1627 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1631 capture_info.clear ();
1632 capture_start_frame = 0;
1636 AudioDiskstream::finish_capture (bool rec_monitors_input)
1638 was_recording = false;
1640 if (capture_captured == 0) {
1644 if (recordable() && destructive()) {
1645 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1647 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1648 (*chan).capture_transition_buf->get_write_vector(&transvec);
1651 if (transvec.len[0] > 0) {
1652 transvec.buf[0]->type = CaptureEnd;
1653 transvec.buf[0]->capture_val = capture_captured;
1654 (*chan).capture_transition_buf->increment_write_ptr(1);
1658 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1664 CaptureInfo* ci = new CaptureInfo;
1666 ci->start = capture_start_frame;
1667 ci->frames = capture_captured;
1669 /* XXX theoretical race condition here. Need atomic exchange ?
1670 However, the circumstances when this is called right
1671 now (either on record-disable or transport_stopped)
1672 mean that no actual race exists. I think ...
1673 We now have a capture_info_lock, but it is only to be used
1674 to synchronize in the transport_stop and the capture info
1675 accessors, so that invalidation will not occur (both non-realtime).
1678 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1680 capture_info.push_back (ci);
1681 capture_captured = 0;
1685 AudioDiskstream::set_record_enabled (bool yn)
1687 if (!recordable() || !_session.record_enabling_legal()) {
1691 /* can't rec-enable in destructive mode if transport is before start */
1693 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1697 if (yn && channels[0].source == 0) {
1699 /* pick up connections not initiated *from* the IO object
1700 we're associated with.
1703 get_input_sources ();
1706 /* yes, i know that this not proof against race conditions, but its
1707 good enough. i think.
1710 if (record_enabled() != yn) {
1712 engage_record_enable ();
1714 disengage_record_enable ();
1720 AudioDiskstream::engage_record_enable ()
1722 bool rolling = _session.transport_speed() != 0.0f;
1724 g_atomic_int_set (&_record_enabled, 1);
1725 capturing_sources.clear ();
1726 if (Config->get_monitoring_model() == HardwareMonitoring) {
1727 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1728 if ((*chan).source) {
1729 (*chan).source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1731 capturing_sources.push_back ((*chan).write_source);
1734 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1735 capturing_sources.push_back ((*chan).write_source);
1739 RecordEnableChanged (); /* EMIT SIGNAL */
1743 AudioDiskstream::disengage_record_enable ()
1745 g_atomic_int_set (&_record_enabled, 0);
1746 if (Config->get_monitoring_model() == HardwareMonitoring) {
1747 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1748 if ((*chan).source) {
1749 (*chan).source->ensure_monitor_input (false);
1753 capturing_sources.clear ();
1754 RecordEnableChanged (); /* EMIT SIGNAL */
1759 AudioDiskstream::get_state ()
1761 XMLNode* node = new XMLNode ("AudioDiskstream");
1763 LocaleGuard lg (X_("POSIX"));
1765 snprintf (buf, sizeof(buf), "0x%x", _flags);
1766 node->add_property ("flags", buf);
1768 snprintf (buf, sizeof(buf), "%zd", channels.size());
1769 node->add_property ("channels", buf);
1771 node->add_property ("playlist", _playlist->name());
1773 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1774 node->add_property ("speed", buf);
1776 node->add_property("name", _name);
1777 id().print (buf, sizeof (buf));
1778 node->add_property("id", buf);
1780 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1782 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1783 XMLNode* cs_grandchild;
1785 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1786 cs_grandchild = new XMLNode (X_("file"));
1787 cs_grandchild->add_property (X_("path"), (*i)->path());
1788 cs_child->add_child_nocopy (*cs_grandchild);
1791 /* store the location where capture will start */
1795 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1796 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1798 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1801 cs_child->add_property (X_("at"), buf);
1802 node->add_child_nocopy (*cs_child);
1806 node->add_child_copy (*_extra_xml);
1813 AudioDiskstream::set_state (const XMLNode& node)
1815 const XMLProperty* prop;
1816 XMLNodeList nlist = node.children();
1817 XMLNodeIterator niter;
1818 uint32_t nchans = 1;
1819 XMLNode* capture_pending_node = 0;
1820 LocaleGuard lg (X_("POSIX"));
1822 in_set_state = true;
1824 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1825 if ((*niter)->name() == IO::state_node_name) {
1826 deprecated_io_node = new XMLNode (**niter);
1829 if ((*niter)->name() == X_("CapturingSources")) {
1830 capture_pending_node = *niter;
1834 /* prevent write sources from being created */
1836 in_set_state = true;
1838 if ((prop = node.property ("name")) != 0) {
1839 _name = prop->value();
1842 if (deprecated_io_node) {
1843 if ((prop = deprecated_io_node->property ("id")) != 0) {
1844 _id = prop->value ();
1847 if ((prop = node.property ("id")) != 0) {
1848 _id = prop->value ();
1852 if ((prop = node.property ("flags")) != 0) {
1853 _flags = strtol (prop->value().c_str(), 0, 0);
1856 if ((prop = node.property ("channels")) != 0) {
1857 nchans = atoi (prop->value().c_str());
1860 // create necessary extra channels
1861 // we are always constructed with one and we always need one
1863 if (nchans > _n_channels.get(DataType::AUDIO)) {
1865 // we need to add new channel infos
1866 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1868 int diff = nchans - channels.size();
1870 for (int i=0; i < diff; ++i) {
1874 } else if (nchans < _n_channels.get(DataType::AUDIO)) {
1876 // we need to get rid of channels
1877 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1879 int diff = channels.size() - nchans;
1881 for (int i = 0; i < diff; ++i) {
1886 if ((prop = node.property ("playlist")) == 0) {
1891 bool had_playlist = (_playlist != 0);
1893 if (find_and_use_playlist (prop->value())) {
1897 if (!had_playlist) {
1898 _playlist->set_orig_diskstream_id (_id);
1901 if (!destructive() && capture_pending_node) {
1902 /* destructive streams have one and only one source per channel,
1903 and so they never end up in pending capture in any useful
1906 use_pending_capture_data (*capture_pending_node);
1911 if ((prop = node.property ("speed")) != 0) {
1912 double sp = atof (prop->value().c_str());
1914 if (realtime_set_speed (sp, false)) {
1915 non_realtime_set_speed ();
1919 _n_channels.set(DataType::AUDIO, channels.size());
1921 in_set_state = false;
1923 /* make sure this is clear before we do anything else */
1925 capturing_sources.clear ();
1927 /* write sources are handled when we handle the input set
1928 up of the IO that owns this DS (::non_realtime_input_change())
1931 in_set_state = false;
1937 AudioDiskstream::use_new_write_source (uint32_t n)
1939 if (!recordable()) {
1943 if (n >= channels.size()) {
1944 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1948 ChannelInfo &chan = channels[n];
1950 if (chan.write_source) {
1951 chan.write_source->set_allow_remove_if_empty (true);
1952 chan.write_source.reset ();
1956 if ((chan.write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1957 throw failed_constructor();
1961 catch (failed_constructor &err) {
1962 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1963 chan.write_source.reset ();
1967 /* do not remove destructive files even if they are empty */
1969 chan.write_source->set_allow_remove_if_empty (!destructive());
1975 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
1977 ChannelList::iterator chan;
1980 if (!recordable()) {
1984 capturing_sources.clear ();
1986 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
1987 if (!destructive()) {
1989 if ((*chan).write_source && mark_write_complete) {
1990 (*chan).write_source->mark_streaming_write_completed ();
1992 use_new_write_source (n);
1994 if (record_enabled()) {
1995 capturing_sources.push_back ((*chan).write_source);
1999 if ((*chan).write_source == 0) {
2000 use_new_write_source (n);
2005 if (destructive()) {
2007 /* we now have all our write sources set up, so create the
2008 playlist's single region.
2011 if (_playlist->empty()) {
2012 setup_destructive_playlist ();
2018 AudioDiskstream::rename_write_sources ()
2020 ChannelList::iterator chan;
2023 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
2024 if ((*chan).write_source != 0) {
2025 (*chan).write_source->set_name (_name, destructive());
2026 /* XXX what to do if one of them fails ? */
2034 AudioDiskstream::set_block_size (nframes_t nframes)
2036 if (_session.get_block_size() > speed_buffer_size) {
2037 speed_buffer_size = _session.get_block_size();
2039 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2040 if ((*chan).speed_buffer) delete [] (*chan).speed_buffer;
2041 (*chan).speed_buffer = new Sample[speed_buffer_size];
2044 allocate_temporary_buffers ();
2048 AudioDiskstream::allocate_temporary_buffers ()
2050 /* make sure the wrap buffer is at least large enough to deal
2051 with the speeds up to 1.2, to allow for micro-variation
2052 when slaving to MTC, SMPTE etc.
2055 double sp = max (fabsf (_actual_speed), 1.2f);
2056 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2058 if (required_wrap_size > wrap_buffer_size) {
2060 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2061 if ((*chan).playback_wrap_buffer) delete [] (*chan).playback_wrap_buffer;
2062 (*chan).playback_wrap_buffer = new Sample[required_wrap_size];
2063 if ((*chan).capture_wrap_buffer) delete [] (*chan).capture_wrap_buffer;
2064 (*chan).capture_wrap_buffer = new Sample[required_wrap_size];
2067 wrap_buffer_size = required_wrap_size;
2072 AudioDiskstream::monitor_input (bool yn)
2074 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2076 if ((*chan).source) {
2077 (*chan).source->ensure_monitor_input (yn);
2083 AudioDiskstream::set_align_style_from_io ()
2085 bool have_physical = false;
2091 get_input_sources ();
2093 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2094 if ((*chan).source && (*chan).source->flags() & JackPortIsPhysical) {
2095 have_physical = true;
2100 if (have_physical) {
2101 set_align_style (ExistingMaterial);
2103 set_align_style (CaptureTime);
2108 AudioDiskstream::add_channel ()
2110 /* XXX need to take lock??? */
2114 init_channel (chan);
2116 chan.speed_buffer = new Sample[speed_buffer_size];
2117 chan.playback_wrap_buffer = new Sample[wrap_buffer_size];
2118 chan.capture_wrap_buffer = new Sample[wrap_buffer_size];
2120 channels.push_back (chan);
2122 _n_channels.set(DataType::AUDIO, channels.size());
2128 AudioDiskstream::remove_channel ()
2130 if (channels.size() > 1) {
2131 /* XXX need to take lock??? */
2132 ChannelInfo & chan = channels.back();
2133 destroy_channel (chan);
2134 channels.pop_back();
2136 _n_channels.set(DataType::AUDIO, channels.size());
2144 AudioDiskstream::playback_buffer_load () const
2146 return (float) ((double) channels.front().playback_buf->read_space()/
2147 (double) channels.front().playback_buf->bufsize());
2151 AudioDiskstream::capture_buffer_load () const
2153 return (float) ((double) channels.front().capture_buf->write_space()/
2154 (double) channels.front().capture_buf->bufsize());
2158 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2160 const XMLProperty* prop;
2161 XMLNodeList nlist = node.children();
2162 XMLNodeIterator niter;
2163 boost::shared_ptr<AudioFileSource> fs;
2164 boost::shared_ptr<AudioFileSource> first_fs;
2165 SourceList pending_sources;
2168 if ((prop = node.property (X_("at"))) == 0) {
2172 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2176 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2177 if ((*niter)->name() == X_("file")) {
2179 if ((prop = (*niter)->property (X_("path"))) == 0) {
2184 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2185 SourceFactory::createWritable (DataType::AUDIO, _session, 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);
2205 if (pending_sources.size() == 0) {
2206 /* nothing can be done */
2210 if (pending_sources.size() != _n_channels.get(DataType::AUDIO)) {
2211 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2216 boost::shared_ptr<AudioRegion> region;
2219 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2220 region_name_from_path (first_fs->name()),
2221 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2222 region->special_set_position (0);
2225 catch (failed_constructor& err) {
2226 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2234 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name())));
2237 catch (failed_constructor& err) {
2238 error << string_compose (_("%1: cannot create region from pending capture sources"),
2245 _playlist->add_region (region, position);
2251 AudioDiskstream::set_destructive (bool yn)
2253 bool bounce_ignored;
2255 if (yn != destructive()) {
2258 /* requestor should already have checked this and
2259 bounced if necessary and desired
2261 if (!can_become_destructive (bounce_ignored)) {
2264 _flags |= Destructive;
2265 use_destructive_playlist ();
2267 _flags &= ~Destructive;
2268 reset_write_sources (true, true);
2276 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2279 requires_bounce = false;
2283 /* is there only one region ? */
2285 if (_playlist->n_regions() != 1) {
2286 requires_bounce = true;
2290 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2293 /* do the source(s) for the region cover the session start position ? */
2295 if (first->position() != _session.current_start_frame()) {
2296 if (first->start() > _session.current_start_frame()) {
2297 requires_bounce = true;
2302 /* is the source used by only 1 playlist ? */
2304 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2308 if (afirst->source()->used() > 1) {
2309 requires_bounce = true;
2313 requires_bounce = false;