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>
38 #include <pbd/enumwriter.h>
39 #include <pbd/stacktrace.h>
41 #include <ardour/ardour.h>
42 #include <ardour/audioengine.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/source_factory.h>
59 using namespace ARDOUR;
62 size_t AudioDiskstream::_working_buffers_size = 0;
63 Sample* AudioDiskstream::_mixdown_buffer = 0;
64 gain_t* AudioDiskstream::_gain_buffer = 0;
66 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
67 : Diskstream(sess, name, flag)
68 , deprecated_io_node(NULL)
69 , channels (new ChannelList)
71 /* prevent any write sources from being created */
81 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
82 : Diskstream(sess, node)
83 , deprecated_io_node(NULL)
84 , channels (new ChannelList)
89 if (set_state (node)) {
91 throw failed_constructor();
97 use_destructive_playlist ();
102 AudioDiskstream::init (Diskstream::Flag f)
106 /* there are no channels at this point, so these
107 two calls just get speed_buffer_size and wrap_buffer
108 size setup without duplicating their code.
111 set_block_size (_session.get_block_size());
112 allocate_temporary_buffers ();
115 assert(_n_channels == 1);
118 AudioDiskstream::~AudioDiskstream ()
123 RCUWriter<ChannelList> writer (channels);
124 boost::shared_ptr<ChannelList> c = writer.get_copy();
126 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
137 AudioDiskstream::allocate_working_buffers()
139 assert(disk_io_frames() > 0);
141 _working_buffers_size = disk_io_frames();
142 _mixdown_buffer = new Sample[_working_buffers_size];
143 _gain_buffer = new gain_t[_working_buffers_size];
147 AudioDiskstream::free_working_buffers()
149 delete [] _mixdown_buffer;
150 delete [] _gain_buffer;
151 _working_buffers_size = 0;
157 AudioDiskstream::non_realtime_input_change ()
160 Glib::Mutex::Lock lm (state_lock);
162 if (input_change_pending == NoChange) {
167 RCUWriter<ChannelList> writer (channels);
168 boost::shared_ptr<ChannelList> c = writer.get_copy();
170 _n_channels = c->size();
172 if (_io->n_inputs() > _n_channels) {
173 add_channel_to (c, _io->n_inputs() - _n_channels);
174 } else if (_io->n_inputs() < _n_channels) {
175 remove_channel_from (c, _n_channels - _io->n_inputs());
179 get_input_sources ();
180 set_capture_offset ();
182 if (first_input_change) {
183 set_align_style (_persistent_alignment_style);
184 first_input_change = false;
186 set_align_style_from_io ();
189 input_change_pending = NoChange;
191 /* implicit unlock */
194 /* reset capture files */
196 reset_write_sources (false);
198 /* now refill channel buffers */
200 if (speed() != 1.0f || speed() != -1.0f) {
201 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
203 seek (_session.transport_frame());
208 AudioDiskstream::get_input_sources ()
210 boost::shared_ptr<ChannelList> c = channels.reader();
213 ChannelList::iterator chan;
214 uint32_t ni = _io->n_inputs();
216 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
218 const char **connections = _io->input(n)->get_connections ();
220 if (connections == 0 || connections[0] == 0) {
222 if ((*chan)->source) {
223 // _source->disable_metering ();
229 (*chan)->source = _session.engine().get_port_by_name (connections[0]);
239 AudioDiskstream::find_and_use_playlist (const string& name)
241 boost::shared_ptr<AudioPlaylist> playlist;
243 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
244 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, name));
248 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
252 return use_playlist (playlist);
256 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
258 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
260 Diskstream::use_playlist(playlist);
266 AudioDiskstream::use_new_playlist ()
269 boost::shared_ptr<AudioPlaylist> playlist;
271 if (!in_set_state && destructive()) {
276 newname = Playlist::bump_name (_playlist->name(), _session);
278 newname = Playlist::bump_name (_name, _session);
281 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, newname, hidden()))) != 0) {
283 playlist->set_orig_diskstream_id (id());
284 return use_playlist (playlist);
292 AudioDiskstream::use_copy_playlist ()
294 assert(audio_playlist());
300 if (_playlist == 0) {
301 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
306 boost::shared_ptr<AudioPlaylist> playlist;
308 newname = Playlist::bump_name (_playlist->name(), _session);
310 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
311 playlist->set_orig_diskstream_id (id());
312 return use_playlist (playlist);
319 AudioDiskstream::setup_destructive_playlist ()
322 boost::shared_ptr<ChannelList> c = channels.reader();
324 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
325 srcs.push_back ((*chan)->write_source);
328 /* a single full-sized region */
330 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
331 _playlist->add_region (region, srcs.front()->natural_position());
335 AudioDiskstream::use_destructive_playlist ()
337 /* this is called from the XML-based constructor or ::set_destructive. when called,
338 we already have a playlist and a region, but we need to
339 set up our sources for write. we use the sources associated
340 with the (presumed single, full-extent) region.
343 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
346 reset_write_sources (false, true);
350 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
353 throw failed_constructor();
356 /* be sure to stretch the region out to the maximum length */
358 region->set_length (max_frames - region->position(), this);
361 ChannelList::iterator chan;
362 boost::shared_ptr<ChannelList> c = channels.reader();
364 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
365 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
366 assert((*chan)->write_source);
367 (*chan)->write_source->set_allow_remove_if_empty (false);
369 /* this might be false if we switched modes, so force it */
371 (*chan)->write_source->set_destructive (true);
374 /* the source list will never be reset for a destructive track */
378 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
380 int possibly_recording;
383 const int transport_rolling = 0x4;
384 const int track_rec_enabled = 0x2;
385 const int global_rec_enabled = 0x1;
387 /* merge together the 3 factors that affect record status, and compute
391 rolling = _session.transport_speed() != 0.0f;
392 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
393 change = possibly_recording ^ last_possibly_recording;
395 if (possibly_recording == last_possibly_recording) {
401 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
403 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
404 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
406 /* starting to record: compute first+last frames */
408 first_recordable_frame = transport_frame + _capture_offset;
409 last_recordable_frame = max_frames;
410 capture_start_frame = transport_frame;
412 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
414 /* was stopped, now rolling (and recording) */
416 if (_alignment_style == ExistingMaterial) {
417 first_recordable_frame += _session.worst_output_latency();
419 first_recordable_frame += _roll_delay;
424 /* was rolling, but record state changed */
426 if (_alignment_style == ExistingMaterial) {
428 if (!Config->get_punch_in()) {
430 /* manual punch in happens at the correct transport frame
431 because the user hit a button. but to get alignment correct
432 we have to back up the position of the new region to the
433 appropriate spot given the roll delay.
436 capture_start_frame -= _roll_delay;
438 /* XXX paul notes (august 2005): i don't know why
442 first_recordable_frame += _capture_offset;
446 /* autopunch toggles recording at the precise
447 transport frame, and then the DS waits
448 to start recording for a time that depends
449 on the output latency.
452 first_recordable_frame += _session.worst_output_latency();
457 if (Config->get_punch_in()) {
458 first_recordable_frame += _roll_delay;
460 capture_start_frame -= _roll_delay;
466 if (_flags & Recordable) {
467 boost::shared_ptr<ChannelList> c = channels.reader();
468 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
470 RingBufferNPT<CaptureTransition>::rw_vector transvec;
471 (*chan)->capture_transition_buf->get_write_vector(&transvec);
473 if (transvec.len[0] > 0) {
474 transvec.buf[0]->type = CaptureStart;
475 transvec.buf[0]->capture_val = capture_start_frame;
476 (*chan)->capture_transition_buf->increment_write_ptr(1);
480 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
486 } else if (!record_enabled() || !can_record) {
490 last_recordable_frame = transport_frame + _capture_offset;
492 if (_alignment_style == ExistingMaterial) {
493 last_recordable_frame += _session.worst_output_latency();
495 last_recordable_frame += _roll_delay;
499 last_possibly_recording = possibly_recording;
503 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
506 boost::shared_ptr<ChannelList> c = channels.reader();
507 ChannelList::iterator chan;
509 nframes_t rec_offset = 0;
510 nframes_t rec_nframes = 0;
511 bool nominally_recording;
512 bool re = record_enabled ();
513 bool collect_playback = false;
515 /* if we've already processed the frames corresponding to this call,
516 just return. this allows multiple routes that are taking input
517 from this diskstream to call our ::process() method, but have
518 this stuff only happen once. more commonly, it allows both
519 the AudioTrack that is using this AudioDiskstream *and* the Session
520 to call process() without problems.
527 commit_should_unlock = false;
529 check_record_status (transport_frame, nframes, can_record);
531 nominally_recording = (can_record && re);
538 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
539 must always be called as a pair. The only exception is if this function
540 returns a non-zero value, in which case, ::commit should not be called.
543 // If we can't take the state lock return.
544 if (!state_lock.trylock()) {
547 commit_should_unlock = true;
548 adjust_capture_position = 0;
550 for (chan = c->begin(); chan != c->end(); ++chan) {
551 (*chan)->current_capture_buffer = 0;
552 (*chan)->current_playback_buffer = 0;
555 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
558 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
565 case OverlapInternal:
566 /* ---------- recrange
569 rec_nframes = nframes;
574 /* |--------| recrange
577 rec_nframes = transport_frame + nframes - first_recordable_frame;
579 rec_offset = first_recordable_frame - transport_frame;
584 /* |--------| recrange
587 rec_nframes = last_recordable_frame - transport_frame;
591 case OverlapExternal:
592 /* |--------| recrange
593 -------------- transrange
595 rec_nframes = last_recordable_frame - last_recordable_frame;
596 rec_offset = first_recordable_frame - transport_frame;
600 if (rec_nframes && !was_recording) {
601 capture_captured = 0;
602 was_recording = true;
607 if (can_record && !_last_capture_regions.empty()) {
608 _last_capture_regions.clear ();
611 if (nominally_recording || rec_nframes) {
613 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
615 ChannelInfo* chaninfo (*chan);
617 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
619 if (rec_nframes <= chaninfo->capture_vector.len[0]) {
621 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
623 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
627 memcpy (chaninfo->current_capture_buffer, _io->input(n)->get_buffer (rec_nframes) + offset + rec_offset, sizeof (Sample) * rec_nframes);
631 nframes_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
633 if (rec_nframes > total) {
638 Sample* buf = _io->input (n)->get_buffer (nframes) + offset;
639 nframes_t first = chaninfo->capture_vector.len[0];
641 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
642 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
643 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
644 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
646 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
653 finish_capture (rec_monitors_input, c);
660 /* data will be written to disk */
662 if (rec_nframes == nframes && rec_offset == 0) {
664 for (chan = c->begin(); chan != c->end(); ++chan) {
665 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
668 playback_distance = nframes;
673 /* we can't use the capture buffer as the playback buffer, because
674 we recorded only a part of the current process' cycle data
678 collect_playback = true;
681 adjust_capture_position = rec_nframes;
683 } else if (nominally_recording) {
685 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
687 for (chan = c->begin(); chan != c->end(); ++chan) {
688 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
691 playback_distance = nframes;
695 collect_playback = true;
698 if (collect_playback) {
700 /* we're doing playback */
702 nframes_t necessary_samples;
704 /* no varispeed playback if we're recording, because the output .... TBD */
706 if (rec_nframes == 0 && _actual_speed != 1.0f) {
707 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
709 necessary_samples = nframes;
712 for (chan = c->begin(); chan != c->end(); ++chan) {
713 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
718 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
720 ChannelInfo* chaninfo (*chan);
722 if (necessary_samples <= chaninfo->playback_vector.len[0]) {
724 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
727 nframes_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
729 if (necessary_samples > total) {
735 memcpy ((char *) chaninfo->playback_wrap_buffer, chaninfo->playback_vector.buf[0],
736 chaninfo->playback_vector.len[0] * sizeof (Sample));
737 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0], chaninfo->playback_vector.buf[1],
738 (necessary_samples - chaninfo->playback_vector.len[0]) * sizeof (Sample));
740 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
745 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
747 uint64_t phase = last_phase;
750 // Linearly interpolate into the alt buffer
751 // using 40.24 fixp maths (swh)
753 for (chan = c->begin(); chan != c->end(); ++chan) {
756 ChannelInfo* chaninfo (*chan);
761 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
763 fr = (phase & 0xFFFFFF) / 16777216.0f;
764 chaninfo->speed_buffer[outsample] =
765 chaninfo->current_playback_buffer[i] * (1.0f - fr) +
766 chaninfo->current_playback_buffer[i+1] * fr;
770 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
773 playback_distance = i + 1;
774 last_phase = (phase & 0xFFFFFF);
777 playback_distance = nframes;
789 /* we're exiting with failure, so ::commit will not
790 be called. unlock the state lock.
793 commit_should_unlock = false;
801 AudioDiskstream::commit (nframes_t nframes)
803 bool need_butler = false;
805 if (_actual_speed < 0.0) {
806 playback_sample -= playback_distance;
808 playback_sample += playback_distance;
811 boost::shared_ptr<ChannelList> c = channels.reader();
812 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
814 (*chan)->playback_buf->increment_read_ptr (playback_distance);
816 if (adjust_capture_position) {
817 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
821 if (adjust_capture_position != 0) {
822 capture_captured += adjust_capture_position;
823 adjust_capture_position = 0;
827 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
829 need_butler = c->front()->playback_buf->write_space() >= disk_io_chunk_frames
830 || c->front()->capture_buf->read_space() >= disk_io_chunk_frames;
833 if (commit_should_unlock) {
843 AudioDiskstream::set_pending_overwrite (bool yn)
845 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
847 pending_overwrite = yn;
849 overwrite_frame = playback_sample;
850 overwrite_offset = channels.reader()->front()->playback_buf->get_read_ptr();
854 AudioDiskstream::overwrite_existing_buffers ()
856 boost::shared_ptr<ChannelList> c = channels.reader();
857 Sample* mixdown_buffer;
860 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
862 overwrite_queued = false;
864 /* assume all are the same size */
865 nframes_t size = c->front()->playback_buf->bufsize();
867 mixdown_buffer = new Sample[size];
868 gain_buffer = new float[size];
870 /* reduce size so that we can fill the buffer correctly. */
876 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
878 start = overwrite_frame;
879 nframes_t cnt = size;
881 /* to fill the buffer without resetting the playback sample, we need to
882 do it one or two chunks (normally two).
884 |----------------------------------------------------------------------|
888 |<- second chunk->||<----------------- first chunk ------------------>|
892 nframes_t to_read = size - overwrite_offset;
894 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
895 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
896 _id, size, playback_sample) << endmsg;
904 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
905 start, cnt, *chan, n, reversed)) {
906 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
907 _id, size, playback_sample) << endmsg;
916 pending_overwrite = false;
917 delete [] gain_buffer;
918 delete [] mixdown_buffer;
923 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
927 ChannelList::iterator chan;
928 boost::shared_ptr<ChannelList> c = channels.reader();
930 Glib::Mutex::Lock lm (state_lock);
932 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
933 (*chan)->playback_buf->reset ();
934 (*chan)->capture_buf->reset ();
937 /* can't rec-enable in destructive mode if transport is before start */
939 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
940 disengage_record_enable ();
943 playback_sample = frame;
946 if (complete_refill) {
947 while ((ret = do_refill_with_alloc ()) > 0) ;
949 ret = do_refill_with_alloc ();
956 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
958 ChannelList::iterator chan;
959 boost::shared_ptr<ChannelList> c = channels.reader();
961 for (chan = c->begin(); chan != c->end(); ++chan) {
962 if ((*chan)->playback_buf->read_space() < distance) {
970 AudioDiskstream::internal_playback_seek (nframes_t distance)
972 ChannelList::iterator chan;
973 boost::shared_ptr<ChannelList> c = channels.reader();
975 for (chan = c->begin(); chan != c->end(); ++chan) {
976 (*chan)->playback_buf->increment_read_ptr (distance);
979 first_recordable_frame += distance;
980 playback_sample += distance;
986 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
987 ChannelInfo* channel_info, int channel, bool reversed)
989 nframes_t this_read = 0;
991 nframes_t loop_end = 0;
992 nframes_t loop_start = 0;
993 nframes_t loop_length = 0;
994 nframes_t offset = 0;
997 /* XXX we don't currently play loops in reverse. not sure why */
1001 /* Make the use of a Location atomic for this read operation.
1003 Note: Locations don't get deleted, so all we care about
1004 when I say "atomic" is that we are always pointing to
1005 the same one and using a start/length values obtained
1009 if ((loc = loop_location) != 0) {
1010 loop_start = loc->start();
1011 loop_end = loc->end();
1012 loop_length = loop_end - loop_start;
1015 /* if we are looping, ensure that the first frame we read is at the correct
1016 position within the loop.
1019 if (loc && start >= loop_end) {
1020 //cerr << "start adjusted from " << start;
1021 start = loop_start + ((start - loop_start) % loop_length);
1022 //cerr << "to " << start << endl;
1025 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1034 /* take any loop into account. we can't read past the end of the loop. */
1036 if (loc && (loop_end - start < cnt)) {
1037 this_read = loop_end - start;
1038 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1045 if (this_read == 0) {
1049 this_read = min(cnt,this_read);
1051 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1052 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1057 _read_data_count = _playlist->read_data_count();
1061 swap_by_ptr (buf, buf + this_read - 1);
1065 /* if we read to the end of the loop, go back to the beginning */
1075 offset += this_read;
1082 AudioDiskstream::do_refill_with_alloc ()
1084 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1085 float* gain_buf = new float[disk_io_chunk_frames];
1087 int ret = _do_refill(mix_buf, gain_buf);
1096 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1100 RingBufferNPT<Sample>::rw_vector vector;
1101 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1102 nframes_t total_space;
1103 nframes_t zero_fill;
1105 ChannelList::iterator i;
1106 boost::shared_ptr<ChannelList> c = channels.reader();
1113 assert(mixdown_buffer);
1114 assert(gain_buffer);
1121 c->front()->playback_buf->get_write_vector (&vector);
1123 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1127 /* if there are 2+ chunks of disk i/o possible for
1128 this track, let the caller know so that it can arrange
1129 for us to be called again, ASAP.
1132 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1136 /* if we're running close to normal speed and there isn't enough
1137 space to do disk_io_chunk_frames of I/O, then don't bother.
1139 at higher speeds, just do it because the sync between butler
1140 and audio thread may not be good enough.
1143 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1147 /* when slaved, don't try to get too close to the read pointer. this
1148 leaves space for the buffer reversal to have something useful to
1152 if (_slaved && total_space < (c->front()->playback_buf->bufsize() / 2)) {
1156 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1158 total_space = min (disk_io_chunk_frames, total_space);
1162 if (file_frame == 0) {
1164 /* at start: nothing to do but fill with silence */
1166 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1168 ChannelInfo* chan (*i);
1169 chan->playback_buf->get_write_vector (&vector);
1170 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1171 if (vector.len[1]) {
1172 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1174 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1179 if (file_frame < total_space) {
1181 /* too close to the start: read what we can,
1182 and then zero fill the rest
1185 zero_fill = total_space - file_frame;
1186 total_space = file_frame;
1196 if (file_frame == max_frames) {
1198 /* at end: nothing to do but fill with silence */
1200 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1202 ChannelInfo* chan (*i);
1203 chan->playback_buf->get_write_vector (&vector);
1204 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1205 if (vector.len[1]) {
1206 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1208 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1213 if (file_frame > max_frames - total_space) {
1215 /* to close to the end: read what we can, and zero fill the rest */
1217 zero_fill = total_space - (max_frames - file_frame);
1218 total_space = max_frames - file_frame;
1225 nframes_t file_frame_tmp = 0;
1227 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1229 ChannelInfo* chan (*i);
1232 nframes_t len1, len2;
1234 chan->playback_buf->get_write_vector (&vector);
1236 if (vector.len[0] > disk_io_chunk_frames) {
1238 /* we're not going to fill the first chunk, so certainly do not bother with the
1239 other part. it won't be connected with the part we do fill, as in:
1241 .... => writable space
1242 ++++ => readable space
1243 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1245 |......|+++++++++++++|...............................|
1250 So, just pretend that the buf1 part isn't there.
1260 file_frame_tmp = file_frame;
1262 buf1 = vector.buf[0];
1263 len1 = vector.len[0];
1264 buf2 = vector.buf[1];
1265 len2 = vector.len[1];
1267 to_read = min (ts, len1);
1268 to_read = min (to_read, disk_io_chunk_frames);
1272 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1277 chan->playback_buf->increment_write_ptr (to_read);
1281 to_read = min (ts, len2);
1285 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1286 so read some or all of vector.len[1] as well.
1289 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1294 chan->playback_buf->increment_write_ptr (to_read);
1303 file_frame = file_frame_tmp;
1310 /** Flush pending data to disk.
1312 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1313 * of data to disk. it will never write more than that. If it writes that
1314 * much and there is more than that waiting to be written, it will return 1,
1315 * otherwise 0 on success or -1 on failure.
1317 * If there is less than disk_io_chunk_frames to be written, no data will be
1318 * written at all unless @a force_flush is true.
1321 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1325 RingBufferNPT<Sample>::rw_vector vector;
1326 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1329 _write_data_count = 0;
1331 transvec.buf[0] = 0;
1332 transvec.buf[1] = 0;
1336 boost::shared_ptr<ChannelList> c = channels.reader();
1337 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1339 (*chan)->capture_buf->get_read_vector (&vector);
1341 total = vector.len[0] + vector.len[1];
1343 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1347 /* if there are 2+ chunks of disk i/o possible for
1348 this track, let the caller know so that it can arrange
1349 for us to be called again, ASAP.
1351 if we are forcing a flush, then if there is* any* extra
1352 work, let the caller know.
1354 if we are no longer recording and there is any extra work,
1355 let the caller know too.
1358 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1362 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1364 // check the transition buffer when recording destructive
1365 // important that we get this after the capture buf
1367 if (destructive()) {
1368 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1369 size_t transcount = transvec.len[0] + transvec.len[1];
1370 bool have_start = false;
1373 for (ti=0; ti < transcount; ++ti) {
1374 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1376 if (captrans.type == CaptureStart) {
1377 // by definition, the first data we got above represents the given capture pos
1379 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1380 (*chan)->curr_capture_cnt = 0;
1384 else if (captrans.type == CaptureEnd) {
1386 // capture end, the capture_val represents total frames in capture
1388 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1390 // shorten to make the write a perfect fit
1391 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1393 if (nto_write < to_write) {
1394 ret = 1; // should we?
1396 to_write = nto_write;
1398 (*chan)->write_source->mark_capture_end ();
1400 // increment past this transition, but go no further
1405 // actually ends just beyond this chunk, so force more work
1413 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1417 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1418 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1422 (*chan)->capture_buf->increment_read_ptr (to_write);
1423 (*chan)->curr_capture_cnt += to_write;
1425 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1427 /* we wrote all of vector.len[0] but it wasn't an entire
1428 disk_io_chunk_frames of data, so arrange for some part
1429 of vector.len[1] to be flushed to disk as well.
1432 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1434 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1435 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1439 _write_data_count += (*chan)->write_source->write_data_count();
1441 (*chan)->capture_buf->increment_read_ptr (to_write);
1442 (*chan)->curr_capture_cnt += to_write;
1451 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1453 uint32_t buffer_position;
1454 bool more_work = true;
1456 boost::shared_ptr<AudioRegion> region;
1457 nframes_t total_capture;
1459 SourceList::iterator src;
1460 ChannelList::iterator chan;
1461 vector<CaptureInfo*>::iterator ci;
1462 boost::shared_ptr<ChannelList> c = channels.reader();
1464 bool mark_write_completed = false;
1466 finish_capture (true, c);
1468 /* butler is already stopped, but there may be work to do
1469 to flush remaining data to disk.
1472 while (more_work && !err) {
1473 switch (do_flush (Session::TransportContext, true)) {
1480 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1485 /* XXX is there anything we can do if err != 0 ? */
1486 Glib::Mutex::Lock lm (capture_info_lock);
1488 if (capture_info.empty()) {
1492 if (abort_capture) {
1494 if (destructive()) {
1498 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1500 if ((*chan)->write_source) {
1502 (*chan)->write_source->mark_for_remove ();
1503 (*chan)->write_source->drop_references ();
1504 (*chan)->write_source.reset ();
1507 /* new source set up in "out" below */
1513 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1514 total_capture += (*ci)->frames;
1517 /* figure out the name for this take */
1519 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1521 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1525 s->update_header (capture_info.front()->start, when, twhen);
1526 s->set_captured_for (_name);
1527 s->mark_immutable ();
1531 /* destructive tracks have a single, never changing region */
1533 if (destructive()) {
1535 /* send a signal that any UI can pick up to do the right thing. there is
1536 a small problem here in that a UI may need the peak data to be ready
1537 for the data that was recorded and this isn't interlocked with that
1538 process. this problem is deferred to the UI.
1541 _playlist->Modified();
1545 string whole_file_region_name;
1546 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1548 /* Register a new region with the Session that
1549 describes the entire source. Do this first
1550 so that any sub-regions will obviously be
1551 children of this one (later!)
1555 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, c->front()->write_source->last_capture_start_frame(), total_capture,
1556 whole_file_region_name,
1557 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1559 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1560 region->special_set_position (capture_info.front()->start);
1564 catch (failed_constructor& err) {
1565 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1569 _last_capture_regions.push_back (region);
1571 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1573 XMLNode &before = _playlist->get_state();
1574 _playlist->freeze ();
1576 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1580 _session.region_name (region_name, whole_file_region_name, false);
1582 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1585 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1586 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1589 catch (failed_constructor& err) {
1590 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1591 continue; /* XXX is this OK? */
1594 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1596 _last_capture_regions.push_back (region);
1598 i_am_the_modifier++;
1599 _playlist->add_region (region, (*ci)->start);
1600 i_am_the_modifier--;
1602 buffer_position += (*ci)->frames;
1606 XMLNode &after = _playlist->get_state();
1607 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1610 mark_write_completed = true;
1613 reset_write_sources (mark_write_completed);
1617 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1621 capture_info.clear ();
1622 capture_start_frame = 0;
1626 AudioDiskstream::finish_capture (bool rec_monitors_input, boost::shared_ptr<ChannelList> c)
1628 was_recording = false;
1630 if (capture_captured == 0) {
1634 if (recordable() && destructive()) {
1635 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1637 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1638 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1641 if (transvec.len[0] > 0) {
1642 transvec.buf[0]->type = CaptureEnd;
1643 transvec.buf[0]->capture_val = capture_captured;
1644 (*chan)->capture_transition_buf->increment_write_ptr(1);
1648 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1654 CaptureInfo* ci = new CaptureInfo;
1656 ci->start = capture_start_frame;
1657 ci->frames = capture_captured;
1659 /* XXX theoretical race condition here. Need atomic exchange ?
1660 However, the circumstances when this is called right
1661 now (either on record-disable or transport_stopped)
1662 mean that no actual race exists. I think ...
1663 We now have a capture_info_lock, but it is only to be used
1664 to synchronize in the transport_stop and the capture info
1665 accessors, so that invalidation will not occur (both non-realtime).
1668 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1670 capture_info.push_back (ci);
1671 capture_captured = 0;
1675 AudioDiskstream::set_record_enabled (bool yn)
1677 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs() == 0) {
1681 /* can't rec-enable in destructive mode if transport is before start */
1683 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1687 if (yn && channels.reader()->front()->source == 0) {
1689 /* pick up connections not initiated *from* the IO object
1690 we're associated with.
1693 get_input_sources ();
1696 /* yes, i know that this not proof against race conditions, but its
1697 good enough. i think.
1700 if (record_enabled() != yn) {
1702 engage_record_enable ();
1704 disengage_record_enable ();
1710 AudioDiskstream::engage_record_enable ()
1712 bool rolling = _session.transport_speed() != 0.0f;
1713 boost::shared_ptr<ChannelList> c = channels.reader();
1715 g_atomic_int_set (&_record_enabled, 1);
1716 capturing_sources.clear ();
1718 if (Config->get_monitoring_model() == HardwareMonitoring) {
1720 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1721 if ((*chan)->source) {
1722 (*chan)->source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1724 capturing_sources.push_back ((*chan)->write_source);
1728 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1729 capturing_sources.push_back ((*chan)->write_source);
1733 RecordEnableChanged (); /* EMIT SIGNAL */
1737 AudioDiskstream::disengage_record_enable ()
1739 g_atomic_int_set (&_record_enabled, 0);
1740 boost::shared_ptr<ChannelList> c = channels.reader();
1741 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1742 if (Config->get_monitoring_model() == HardwareMonitoring) {
1743 if ((*chan)->source) {
1744 (*chan)->source->ensure_monitor_input (false);
1748 capturing_sources.clear ();
1749 RecordEnableChanged (); /* EMIT SIGNAL */
1753 AudioDiskstream::get_state ()
1755 XMLNode* node = new XMLNode ("AudioDiskstream");
1757 LocaleGuard lg (X_("POSIX"));
1758 boost::shared_ptr<ChannelList> c = channels.reader();
1760 node->add_property ("flags", enum_2_string (_flags));
1762 snprintf (buf, sizeof(buf), "%zd", c->size());
1763 node->add_property ("channels", buf);
1765 node->add_property ("playlist", _playlist->name());
1767 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1768 node->add_property ("speed", buf);
1770 node->add_property("name", _name);
1771 id().print (buf, sizeof (buf));
1772 node->add_property("id", buf);
1774 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1776 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1777 XMLNode* cs_grandchild;
1779 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1780 cs_grandchild = new XMLNode (X_("file"));
1781 cs_grandchild->add_property (X_("path"), (*i)->path());
1782 cs_child->add_child_nocopy (*cs_grandchild);
1785 /* store the location where capture will start */
1789 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1790 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1792 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1795 cs_child->add_property (X_("at"), buf);
1796 node->add_child_nocopy (*cs_child);
1800 node->add_child_copy (*_extra_xml);
1807 AudioDiskstream::set_state (const XMLNode& node)
1809 const XMLProperty* prop;
1810 XMLNodeList nlist = node.children();
1811 XMLNodeIterator niter;
1812 uint32_t nchans = 1;
1813 XMLNode* capture_pending_node = 0;
1814 LocaleGuard lg (X_("POSIX"));
1816 in_set_state = true;
1818 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1819 if ((*niter)->name() == IO::state_node_name) {
1820 deprecated_io_node = new XMLNode (**niter);
1823 if ((*niter)->name() == X_("CapturingSources")) {
1824 capture_pending_node = *niter;
1828 /* prevent write sources from being created */
1830 in_set_state = true;
1832 if ((prop = node.property ("name")) != 0) {
1833 _name = prop->value();
1836 if (deprecated_io_node) {
1837 if ((prop = deprecated_io_node->property ("id")) != 0) {
1838 _id = prop->value ();
1841 if ((prop = node.property ("id")) != 0) {
1842 _id = prop->value ();
1846 if ((prop = node.property ("flags")) != 0) {
1847 _flags = Flag (string_2_enum (prop->value(), _flags));
1850 if ((prop = node.property ("channels")) != 0) {
1851 nchans = atoi (prop->value().c_str());
1854 // create necessary extra channels
1855 // we are always constructed with one and we always need one
1857 _n_channels = channels.reader()->size();
1859 if (nchans > _n_channels) {
1861 add_channel (nchans - _n_channels);
1863 } else if (nchans < _n_channels) {
1865 remove_channel (_n_channels - nchans);
1868 if ((prop = node.property ("playlist")) == 0) {
1873 bool had_playlist = (_playlist != 0);
1875 if (find_and_use_playlist (prop->value())) {
1879 if (!had_playlist) {
1880 _playlist->set_orig_diskstream_id (_id);
1883 if (!destructive() && capture_pending_node) {
1884 /* destructive streams have one and only one source per channel,
1885 and so they never end up in pending capture in any useful
1888 use_pending_capture_data (*capture_pending_node);
1893 if ((prop = node.property ("speed")) != 0) {
1894 double sp = atof (prop->value().c_str());
1896 if (realtime_set_speed (sp, false)) {
1897 non_realtime_set_speed ();
1901 in_set_state = false;
1903 /* make sure this is clear before we do anything else */
1905 capturing_sources.clear ();
1907 /* write sources are handled when we handle the input set
1908 up of the IO that owns this DS (::non_realtime_input_change())
1911 in_set_state = false;
1917 AudioDiskstream::use_new_write_source (uint32_t n)
1919 boost::shared_ptr<ChannelList> c = channels.reader();
1921 if (!recordable()) {
1925 if (n >= c->size()) {
1926 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1930 ChannelInfo* chan = (*c)[n];
1932 if (chan->write_source) {
1933 chan->write_source->done_with_peakfile_writes ();
1934 chan->write_source->set_allow_remove_if_empty (true);
1935 chan->write_source.reset ();
1939 if ((chan->write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1940 throw failed_constructor();
1944 catch (failed_constructor &err) {
1945 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1946 chan->write_source.reset ();
1950 /* do not remove destructive files even if they are empty */
1952 chan->write_source->set_allow_remove_if_empty (!destructive());
1958 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
1960 ChannelList::iterator chan;
1961 boost::shared_ptr<ChannelList> c = channels.reader();
1964 if (!recordable()) {
1968 capturing_sources.clear ();
1970 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1971 if (!destructive()) {
1973 if ((*chan)->write_source && mark_write_complete) {
1974 (*chan)->write_source->mark_streaming_write_completed ();
1976 use_new_write_source (n);
1978 if (record_enabled()) {
1979 capturing_sources.push_back ((*chan)->write_source);
1983 if ((*chan)->write_source == 0) {
1984 use_new_write_source (n);
1989 if (destructive()) {
1991 /* we now have all our write sources set up, so create the
1992 playlist's single region.
1995 if (_playlist->empty()) {
1996 setup_destructive_playlist ();
2002 AudioDiskstream::rename_write_sources ()
2004 ChannelList::iterator chan;
2005 boost::shared_ptr<ChannelList> c = channels.reader();
2008 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
2009 if ((*chan)->write_source != 0) {
2010 (*chan)->write_source->set_name (_name, destructive());
2011 /* XXX what to do if one of them fails ? */
2019 AudioDiskstream::set_block_size (nframes_t nframes)
2021 if (_session.get_block_size() > speed_buffer_size) {
2022 speed_buffer_size = _session.get_block_size();
2023 boost::shared_ptr<ChannelList> c = channels.reader();
2025 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2026 if ((*chan)->speed_buffer) delete [] (*chan)->speed_buffer;
2027 (*chan)->speed_buffer = new Sample[speed_buffer_size];
2030 allocate_temporary_buffers ();
2034 AudioDiskstream::allocate_temporary_buffers ()
2036 /* make sure the wrap buffer is at least large enough to deal
2037 with the speeds up to 1.2, to allow for micro-variation
2038 when slaving to MTC, SMPTE etc.
2041 double sp = max (fabsf (_actual_speed), 1.2f);
2042 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2044 if (required_wrap_size > wrap_buffer_size) {
2046 boost::shared_ptr<ChannelList> c = channels.reader();
2048 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2049 if ((*chan)->playback_wrap_buffer) delete [] (*chan)->playback_wrap_buffer;
2050 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
2051 if ((*chan)->capture_wrap_buffer) delete [] (*chan)->capture_wrap_buffer;
2052 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
2055 wrap_buffer_size = required_wrap_size;
2060 AudioDiskstream::monitor_input (bool yn)
2062 boost::shared_ptr<ChannelList> c = channels.reader();
2064 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2066 if ((*chan)->source) {
2067 (*chan)->source->ensure_monitor_input (yn);
2073 AudioDiskstream::set_align_style_from_io ()
2075 bool have_physical = false;
2081 get_input_sources ();
2083 boost::shared_ptr<ChannelList> c = channels.reader();
2085 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2086 if ((*chan)->source && (*chan)->source->flags() & JackPortIsPhysical) {
2087 have_physical = true;
2092 if (have_physical) {
2093 set_align_style (ExistingMaterial);
2095 set_align_style (CaptureTime);
2100 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2102 while (how_many--) {
2103 c->push_back (new ChannelInfo(_session.diskstream_buffer_size(), speed_buffer_size, wrap_buffer_size));
2106 _n_channels = c->size();
2112 AudioDiskstream::add_channel (uint32_t how_many)
2114 RCUWriter<ChannelList> writer (channels);
2115 boost::shared_ptr<ChannelList> c = writer.get_copy();
2117 return add_channel_to (c, how_many);
2121 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2123 while (--how_many && !c->empty()) {
2128 _n_channels = c->size();
2134 AudioDiskstream::remove_channel (uint32_t how_many)
2136 RCUWriter<ChannelList> writer (channels);
2137 boost::shared_ptr<ChannelList> c = writer.get_copy();
2139 return remove_channel_from (c, how_many);
2143 AudioDiskstream::playback_buffer_load () const
2145 boost::shared_ptr<ChannelList> c = channels.reader();
2147 return (float) ((double) c->front()->playback_buf->read_space()/
2148 (double) c->front()->playback_buf->bufsize());
2152 AudioDiskstream::capture_buffer_load () const
2154 boost::shared_ptr<ChannelList> c = channels.reader();
2156 return (float) ((double) c->front()->capture_buf->write_space()/
2157 (double) c->front()->capture_buf->bufsize());
2161 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2163 const XMLProperty* prop;
2164 XMLNodeList nlist = node.children();
2165 XMLNodeIterator niter;
2166 boost::shared_ptr<AudioFileSource> fs;
2167 boost::shared_ptr<AudioFileSource> first_fs;
2168 SourceList pending_sources;
2171 if ((prop = node.property (X_("at"))) == 0) {
2175 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2179 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2180 if ((*niter)->name() == X_("file")) {
2182 if ((prop = (*niter)->property (X_("path"))) == 0) {
2187 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (_session, prop->value(), false, _session.frame_rate()));
2190 catch (failed_constructor& err) {
2191 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2192 _name, prop->value())
2197 pending_sources.push_back (fs);
2199 if (first_fs == 0) {
2203 fs->set_captured_for (_name);
2207 if (pending_sources.size() == 0) {
2208 /* nothing can be done */
2212 if (pending_sources.size() != _n_channels) {
2213 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2218 boost::shared_ptr<AudioRegion> region;
2221 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2222 region_name_from_path (first_fs->name(), true),
2223 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2224 region->special_set_position (0);
2227 catch (failed_constructor& err) {
2228 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2236 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2239 catch (failed_constructor& err) {
2240 error << string_compose (_("%1: cannot create region from pending capture sources"),
2247 _playlist->add_region (region, position);
2253 AudioDiskstream::set_destructive (bool yn)
2255 bool bounce_ignored;
2257 if (yn != destructive()) {
2260 /* requestor should already have checked this and
2261 bounced if necessary and desired
2263 if (!can_become_destructive (bounce_ignored)) {
2266 _flags = Flag (_flags | Destructive);
2267 use_destructive_playlist ();
2269 _flags = Flag (_flags & ~Destructive);
2270 reset_write_sources (true, true);
2278 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2281 requires_bounce = false;
2285 /* is there only one region ? */
2287 if (_playlist->n_regions() != 1) {
2288 requires_bounce = true;
2292 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2295 /* do the source(s) for the region cover the session start position ? */
2297 if (first->position() != _session.current_start_frame()) {
2298 if (first->start() > _session.current_start_frame()) {
2299 requires_bounce = true;
2304 /* is the source used by only 1 playlist ? */
2306 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2310 if (afirst->source()->used() > 1) {
2311 requires_bounce = true;
2315 requires_bounce = false;
2319 AudioDiskstream::ChannelInfo::ChannelInfo (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2323 current_capture_buffer = 0;
2324 current_playback_buffer = 0;
2325 curr_capture_cnt = 0;
2327 speed_buffer = new Sample[speed_size];
2328 playback_wrap_buffer = new Sample[wrap_size];
2329 capture_wrap_buffer = new Sample[wrap_size];
2331 playback_buf = new RingBufferNPT<Sample> (bufsize);
2332 capture_buf = new RingBufferNPT<Sample> (bufsize);
2333 capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
2335 /* touch the ringbuffer buffers, which will cause
2336 them to be mapped into locked physical RAM if
2337 we're running with mlockall(). this doesn't do
2341 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2342 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2343 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2346 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2349 write_source.reset ();
2353 delete [] speed_buffer;
2357 if (playback_wrap_buffer) {
2358 delete [] playback_wrap_buffer;
2359 playback_wrap_buffer = 0;
2362 if (capture_wrap_buffer) {
2363 delete [] capture_wrap_buffer;
2364 capture_wrap_buffer = 0;
2368 delete playback_buf;
2377 if (capture_transition_buf) {
2378 delete capture_transition_buf;
2379 capture_transition_buf = 0;