fix up fwd/reverse stuff in semitone mode
[ardour2.git] / libs / ardour / audio_diskstream.cc
blob13279140856248dca1b8c197cffd95f8e5589d52
1 /*
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.
19 #include <fstream>
20 #include <cstdio>
21 #include <unistd.h>
22 #include <cmath>
23 #include <cerrno>
24 #include <cassert>
25 #include <string>
26 #include <climits>
27 #include <fcntl.h>
28 #include <cstdlib>
29 #include <ctime>
30 #include <sys/stat.h>
31 #include <sys/mman.h>
33 #include "pbd/error.h"
34 #include <glibmm/thread.h>
35 #include "pbd/xml++.h"
36 #include "pbd/memento_command.h"
37 #include "pbd/enumwriter.h"
38 #include "pbd/stateful_diff_command.h"
40 #include "ardour/analyser.h"
41 #include "ardour/ardour.h"
42 #include "ardour/audio_buffer.h"
43 #include "ardour/audio_diskstream.h"
44 #include "ardour/audio_port.h"
45 #include "ardour/audioengine.h"
46 #include "ardour/audiofilesource.h"
48 #include "ardour/audioplaylist.h"
49 #include "ardour/audioregion.h"
50 #include "ardour/butler.h"
51 #include "ardour/configuration.h"
52 #include "ardour/cycle_timer.h"
53 #include "ardour/debug.h"
54 #include "ardour/io.h"
55 #include "ardour/playlist_factory.h"
56 #include "ardour/region_factory.h"
57 #include "ardour/send.h"
58 #include "ardour/session.h"
59 #include "ardour/source_factory.h"
60 #include "ardour/utils.h"
61 #include "ardour/session_playlists.h"
62 #include "ardour/route.h"
64 #include "i18n.h"
65 #include <locale.h>
67 using namespace std;
68 using namespace ARDOUR;
69 using namespace PBD;
71 size_t AudioDiskstream::_working_buffers_size = 0;
72 Sample* AudioDiskstream::_mixdown_buffer = 0;
73 gain_t* AudioDiskstream::_gain_buffer = 0;
75 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
76 : Diskstream(sess, name, flag)
77 , channels (new ChannelList)
79 /* prevent any write sources from being created */
81 in_set_state = true;
82 use_new_playlist ();
83 in_set_state = false;
86 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
87 : Diskstream(sess, node)
88 , channels (new ChannelList)
90 in_set_state = true;
91 init ();
93 if (set_state (node, Stateful::loading_state_version)) {
94 in_set_state = false;
95 throw failed_constructor();
98 in_set_state = false;
100 if (destructive()) {
101 use_destructive_playlist ();
105 void
106 AudioDiskstream::init ()
108 /* there are no channels at this point, so these
109 two calls just get speed_buffer_size and wrap_buffer
110 size setup without duplicating their code.
113 set_block_size (_session.get_block_size());
114 allocate_temporary_buffers ();
117 AudioDiskstream::~AudioDiskstream ()
119 DEBUG_TRACE (DEBUG::Destruction, string_compose ("Audio Diskstream %1 destructor\n", _name));
122 RCUWriter<ChannelList> writer (channels);
123 boost::shared_ptr<ChannelList> c = writer.get_copy();
125 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
126 delete *chan;
129 c->clear();
132 channels.flush ();
135 void
136 AudioDiskstream::allocate_working_buffers()
138 assert(disk_io_frames() > 0);
140 _working_buffers_size = disk_io_frames();
141 _mixdown_buffer = new Sample[_working_buffers_size];
142 _gain_buffer = new gain_t[_working_buffers_size];
145 void
146 AudioDiskstream::free_working_buffers()
148 delete [] _mixdown_buffer;
149 delete [] _gain_buffer;
150 _working_buffers_size = 0;
151 _mixdown_buffer = 0;
152 _gain_buffer = 0;
155 void
156 AudioDiskstream::non_realtime_input_change ()
159 Glib::Mutex::Lock lm (state_lock);
161 if (input_change_pending.type == IOChange::NoChange) {
162 return;
165 if (input_change_pending.type == IOChange::ConfigurationChanged) {
166 RCUWriter<ChannelList> writer (channels);
167 boost::shared_ptr<ChannelList> c = writer.get_copy();
169 _n_channels.set(DataType::AUDIO, c->size());
171 if (_io->n_ports().n_audio() > _n_channels.n_audio()) {
172 add_channel_to (c, _io->n_ports().n_audio() - _n_channels.n_audio());
173 } else if (_io->n_ports().n_audio() < _n_channels.n_audio()) {
174 remove_channel_from (c, _n_channels.n_audio() - _io->n_ports().n_audio());
178 if (input_change_pending.type & IOChange::ConnectionsChanged) {
179 get_input_sources ();
180 set_capture_offset ();
181 set_align_style_from_io ();
184 input_change_pending = IOChange::NoChange;
186 /* implicit unlock */
189 /* reset capture files */
191 reset_write_sources (false);
193 /* now refill channel buffers */
195 if (speed() != 1.0f || speed() != -1.0f) {
196 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
197 } else {
198 seek (_session.transport_frame());
202 void
203 AudioDiskstream::non_realtime_locate (framepos_t location)
205 /* now refill channel buffers */
207 if (speed() != 1.0f || speed() != -1.0f) {
208 seek ((framepos_t) (location * (double) speed()));
209 } else {
210 seek (location);
214 void
215 AudioDiskstream::get_input_sources ()
217 boost::shared_ptr<ChannelList> c = channels.reader();
219 uint32_t n;
220 ChannelList::iterator chan;
221 uint32_t ni = _io->n_ports().n_audio();
222 vector<string> connections;
224 for (n = 0, chan = c->begin(); chan != c->end() && n < ni; ++chan, ++n) {
226 connections.clear ();
228 if (_io->nth (n)->get_connections (connections) == 0) {
229 if (!(*chan)->source.name.empty()) {
230 // _source->disable_metering ();
232 (*chan)->source.name = string();
233 } else {
234 (*chan)->source.name = connections[0];
240 AudioDiskstream::find_and_use_playlist (const string& name)
242 boost::shared_ptr<AudioPlaylist> playlist;
244 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_name (name))) == 0) {
245 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, name));
248 if (!playlist) {
249 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
250 return -1;
253 return use_playlist (playlist);
257 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
259 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
261 Diskstream::use_playlist(playlist);
263 return 0;
267 AudioDiskstream::use_new_playlist ()
269 string newname;
270 boost::shared_ptr<AudioPlaylist> playlist;
272 if (!in_set_state && destructive()) {
273 return 0;
276 if (_playlist) {
277 newname = Playlist::bump_name (_playlist->name(), _session);
278 } else {
279 newname = Playlist::bump_name (_name, _session);
282 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (DataType::AUDIO, _session, newname, hidden()))) != 0) {
284 playlist->set_orig_diskstream_id (id());
285 return use_playlist (playlist);
287 } else {
288 return -1;
293 AudioDiskstream::use_copy_playlist ()
295 assert(audio_playlist());
297 if (destructive()) {
298 return 0;
301 if (_playlist == 0) {
302 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
303 return -1;
306 string newname;
307 boost::shared_ptr<AudioPlaylist> playlist;
309 newname = Playlist::bump_name (_playlist->name(), _session);
311 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
312 playlist->set_orig_diskstream_id (id());
313 return use_playlist (playlist);
314 } else {
315 return -1;
319 void
320 AudioDiskstream::setup_destructive_playlist ()
322 SourceList srcs;
323 boost::shared_ptr<ChannelList> c = channels.reader();
325 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
326 srcs.push_back ((*chan)->write_source);
329 /* a single full-sized region */
331 assert (!srcs.empty ());
333 PropertyList plist;
334 plist.add (Properties::name, _name.val());
335 plist.add (Properties::start, 0);
336 plist.add (Properties::length, max_framepos - (max_framepos - srcs.front()->natural_position()));
338 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
339 _playlist->add_region (region, srcs.front()->natural_position());
342 void
343 AudioDiskstream::use_destructive_playlist ()
345 /* this is called from the XML-based constructor or ::set_destructive. when called,
346 we already have a playlist and a region, but we need to
347 set up our sources for write. we use the sources associated
348 with the (presumed single, full-extent) region.
351 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
353 if (!rp) {
354 reset_write_sources (false, true);
355 return;
358 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
360 if (region == 0) {
361 throw failed_constructor();
364 /* be sure to stretch the region out to the maximum length */
366 region->set_length (max_framepos - region->position(), this);
368 uint32_t n;
369 ChannelList::iterator chan;
370 boost::shared_ptr<ChannelList> c = channels.reader();
372 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
373 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
374 assert((*chan)->write_source);
375 (*chan)->write_source->set_allow_remove_if_empty (false);
377 /* this might be false if we switched modes, so force it */
379 (*chan)->write_source->set_destructive (true);
382 /* the source list will never be reset for a destructive track */
385 void
386 AudioDiskstream::prepare_record_status(framepos_t capture_start_frame)
388 if (recordable() && destructive()) {
389 boost::shared_ptr<ChannelList> c = channels.reader();
390 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
392 RingBufferNPT<CaptureTransition>::rw_vector transitions;
393 (*chan)->capture_transition_buf->get_write_vector (&transitions);
395 if (transitions.len[0] > 0) {
396 transitions.buf[0]->type = CaptureStart;
397 transitions.buf[0]->capture_val = capture_start_frame;
398 (*chan)->capture_transition_buf->increment_write_ptr(1);
399 } else {
400 // bad!
401 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
402 << endmsg;
409 AudioDiskstream::process (framepos_t transport_frame, pframes_t nframes, bool can_record, bool rec_monitors_input, bool& need_butler)
411 uint32_t n;
412 boost::shared_ptr<ChannelList> c = channels.reader();
413 ChannelList::iterator chan;
414 int ret = -1;
415 framecnt_t rec_offset = 0;
416 framecnt_t rec_nframes = 0;
417 bool collect_playback = false;
419 playback_distance = 0;
421 if (!_io || !_io->active()) {
422 return 0;
425 check_record_status (transport_frame, can_record);
427 if (nframes == 0) {
428 return 0;
431 Glib::Mutex::Lock sm (state_lock, Glib::TRY_LOCK);
433 if (!sm.locked()) {
434 return 1;
437 adjust_capture_position = 0;
439 for (chan = c->begin(); chan != c->end(); ++chan) {
440 (*chan)->current_capture_buffer = 0;
441 (*chan)->current_playback_buffer = 0;
444 // Safeguard against situations where process() goes haywire when autopunching
445 // and last_recordable_frame < first_recordable_frame
447 if (last_recordable_frame < first_recordable_frame) {
448 last_recordable_frame = max_framepos;
451 if (record_enabled()) {
453 OverlapType ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
454 calculate_record_range (ot, transport_frame, nframes, rec_nframes, rec_offset);
456 if (rec_nframes && !was_recording) {
457 capture_captured = 0;
458 was_recording = true;
462 if (can_record && !_last_capture_sources.empty()) {
463 _last_capture_sources.clear ();
466 if (rec_nframes) {
468 uint32_t limit = _io->n_ports ().n_audio();
470 /* one or more ports could already have been removed from _io, but our
471 channel setup hasn't yet been updated. prevent us from trying to
472 use channels that correspond to missing ports. note that the
473 process callback (from which this is called) is always atomic
474 with respect to port removal/addition.
477 for (n = 0, chan = c->begin(); chan != c->end() && n < limit; ++chan, ++n) {
479 ChannelInfo* chaninfo (*chan);
481 chaninfo->capture_buf->get_write_vector (&chaninfo->capture_vector);
483 if (rec_nframes <= (framecnt_t) chaninfo->capture_vector.len[0]) {
485 chaninfo->current_capture_buffer = chaninfo->capture_vector.buf[0];
487 /* note: grab the entire port buffer, but only copy what we were supposed to
488 for recording, and use rec_offset
491 AudioPort* const ap = _io->audio (n);
492 assert(ap);
493 assert(rec_nframes <= (framecnt_t) ap->get_audio_buffer(nframes).capacity());
494 memcpy (chaninfo->current_capture_buffer, ap->get_audio_buffer (nframes).data(rec_offset), sizeof (Sample) * rec_nframes);
497 } else {
499 framecnt_t total = chaninfo->capture_vector.len[0] + chaninfo->capture_vector.len[1];
501 if (rec_nframes > total) {
502 DiskOverrun ();
503 goto out;
506 AudioPort* const ap = _io->audio (n);
507 assert(ap);
509 Sample* buf = ap->get_audio_buffer(nframes).data();
510 framecnt_t first = chaninfo->capture_vector.len[0];
512 memcpy (chaninfo->capture_wrap_buffer, buf, sizeof (Sample) * first);
513 memcpy (chaninfo->capture_vector.buf[0], buf, sizeof (Sample) * first);
514 memcpy (chaninfo->capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
515 memcpy (chaninfo->capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
517 chaninfo->current_capture_buffer = chaninfo->capture_wrap_buffer;
521 } else {
523 if (was_recording) {
524 finish_capture (rec_monitors_input, c);
529 if (rec_nframes) {
531 /* data will be written to disk */
533 if (rec_nframes == nframes && rec_offset == 0) {
535 for (chan = c->begin(); chan != c->end(); ++chan) {
536 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
539 playback_distance = nframes;
541 } else {
544 /* we can't use the capture buffer as the playback buffer, because
545 we recorded only a part of the current process' cycle data
546 for capture.
549 collect_playback = true;
552 adjust_capture_position = rec_nframes;
554 } else if (can_record && record_enabled()) {
556 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
558 for (chan = c->begin(); chan != c->end(); ++chan) {
559 (*chan)->current_playback_buffer = (*chan)->current_capture_buffer;
562 playback_distance = nframes;
564 } else {
566 collect_playback = true;
569 if (collect_playback) {
571 /* we're doing playback */
573 framecnt_t necessary_samples;
575 /* no varispeed playback if we're recording, because the output .... TBD */
577 if (rec_nframes == 0 && _actual_speed != 1.0f) {
578 necessary_samples = (framecnt_t) floor ((nframes * fabs (_actual_speed))) + 1;
579 } else {
580 necessary_samples = nframes;
583 for (chan = c->begin(); chan != c->end(); ++chan) {
584 (*chan)->playback_buf->get_read_vector (&(*chan)->playback_vector);
587 n = 0;
589 for (chan = c->begin(); chan != c->end(); ++chan, ++n) {
591 ChannelInfo* chaninfo (*chan);
593 if (necessary_samples <= (framecnt_t) chaninfo->playback_vector.len[0]) {
595 chaninfo->current_playback_buffer = chaninfo->playback_vector.buf[0];
597 } else {
598 framecnt_t total = chaninfo->playback_vector.len[0] + chaninfo->playback_vector.len[1];
600 if (necessary_samples > total) {
601 cerr << _name << " Need " << necessary_samples << " total = " << total << endl;
602 cerr << "underrun for " << _name << endl;
603 DiskUnderrun ();
604 goto out;
606 } else {
608 memcpy ((char *) chaninfo->playback_wrap_buffer,
609 chaninfo->playback_vector.buf[0],
610 chaninfo->playback_vector.len[0] * sizeof (Sample));
611 memcpy (chaninfo->playback_wrap_buffer + chaninfo->playback_vector.len[0],
612 chaninfo->playback_vector.buf[1],
613 (necessary_samples - chaninfo->playback_vector.len[0])
614 * sizeof (Sample));
616 chaninfo->current_playback_buffer = chaninfo->playback_wrap_buffer;
621 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
622 process_varispeed_playback(nframes, c);
623 } else {
624 playback_distance = nframes;
627 _speed = _target_speed;
631 ret = 0;
633 if (commit (nframes)) {
634 need_butler = true;
637 out:
638 return ret;
641 void
642 AudioDiskstream::process_varispeed_playback (pframes_t nframes, boost::shared_ptr<ChannelList> c)
644 ChannelList::iterator chan;
646 interpolation.set_speed (_target_speed);
648 int channel = 0;
649 for (chan = c->begin(); chan != c->end(); ++chan, ++channel) {
650 ChannelInfo* chaninfo (*chan);
652 playback_distance = interpolation.interpolate (
653 channel, nframes, chaninfo->current_playback_buffer, chaninfo->speed_buffer);
655 chaninfo->current_playback_buffer = chaninfo->speed_buffer;
659 bool
660 AudioDiskstream::commit (framecnt_t /* nframes */)
662 bool need_butler = false;
664 if (!_io || !_io->active()) {
665 return false;
668 if (_actual_speed < 0.0) {
669 playback_sample -= playback_distance;
670 } else {
671 playback_sample += playback_distance;
674 boost::shared_ptr<ChannelList> c = channels.reader();
675 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
677 (*chan)->playback_buf->increment_read_ptr (playback_distance);
679 if (adjust_capture_position) {
680 (*chan)->capture_buf->increment_write_ptr (adjust_capture_position);
684 if (adjust_capture_position != 0) {
685 capture_captured += adjust_capture_position;
686 adjust_capture_position = 0;
689 if (c->empty()) {
690 return false;
693 if (_slaved) {
694 if (_io && _io->active()) {
695 need_butler = c->front()->playback_buf->write_space() >= c->front()->playback_buf->bufsize() / 2;
696 } else {
697 need_butler = false;
699 } else {
700 if (_io && _io->active()) {
701 need_butler = ((framecnt_t) c->front()->playback_buf->write_space() >= disk_io_chunk_frames)
702 || ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
703 } else {
704 need_butler = ((framecnt_t) c->front()->capture_buf->read_space() >= disk_io_chunk_frames);
708 return need_butler;
711 void
712 AudioDiskstream::set_pending_overwrite (bool yn)
714 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
716 _pending_overwrite = yn;
718 overwrite_frame = playback_sample;
720 boost::shared_ptr<ChannelList> c = channels.reader ();
721 if (!c->empty ()) {
722 overwrite_offset = c->front()->playback_buf->get_read_ptr();
727 AudioDiskstream::overwrite_existing_buffers ()
729 boost::shared_ptr<ChannelList> c = channels.reader();
730 if (c->empty ()) {
731 _pending_overwrite = false;
732 return 0;
735 Sample* mixdown_buffer;
736 float* gain_buffer;
737 int ret = -1;
738 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
740 overwrite_queued = false;
742 /* assume all are the same size */
743 framecnt_t size = c->front()->playback_buf->bufsize();
745 mixdown_buffer = new Sample[size];
746 gain_buffer = new float[size];
748 /* reduce size so that we can fill the buffer correctly (ringbuffers
749 can only handle size-1, otherwise they appear to be empty)
751 size--;
753 uint32_t n=0;
754 framepos_t start;
756 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
758 start = overwrite_frame;
759 framecnt_t cnt = size;
761 /* to fill the buffer without resetting the playback sample, we need to
762 do it one or two chunks (normally two).
764 |----------------------------------------------------------------------|
767 overwrite_offset
768 |<- second chunk->||<----------------- first chunk ------------------>|
772 framecnt_t to_read = size - overwrite_offset;
774 if (read ((*chan)->playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
775 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
776 _id, size, playback_sample) << endmsg;
777 goto out;
780 if (cnt > to_read) {
782 cnt -= to_read;
784 if (read ((*chan)->playback_buf->buffer(), mixdown_buffer, gain_buffer,
785 start, cnt, *chan, n, reversed)) {
786 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
787 _id, size, playback_sample) << endmsg;
788 goto out;
793 ret = 0;
795 out:
796 _pending_overwrite = false;
797 delete [] gain_buffer;
798 delete [] mixdown_buffer;
799 return ret;
803 AudioDiskstream::seek (framepos_t frame, bool complete_refill)
805 uint32_t n;
806 int ret = -1;
807 ChannelList::iterator chan;
808 boost::shared_ptr<ChannelList> c = channels.reader();
810 Glib::Mutex::Lock lm (state_lock);
812 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
813 (*chan)->playback_buf->reset ();
814 (*chan)->capture_buf->reset ();
817 /* can't rec-enable in destructive mode if transport is before start */
819 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
820 disengage_record_enable ();
823 playback_sample = frame;
824 file_frame = frame;
826 if (complete_refill) {
827 while ((ret = do_refill_with_alloc ()) > 0) ;
828 } else {
829 ret = do_refill_with_alloc ();
832 return ret;
836 AudioDiskstream::can_internal_playback_seek (framecnt_t distance)
838 ChannelList::iterator chan;
839 boost::shared_ptr<ChannelList> c = channels.reader();
841 for (chan = c->begin(); chan != c->end(); ++chan) {
842 if ((*chan)->playback_buf->read_space() < (size_t) distance) {
843 return false;
846 return true;
850 AudioDiskstream::internal_playback_seek (framecnt_t distance)
852 ChannelList::iterator chan;
853 boost::shared_ptr<ChannelList> c = channels.reader();
855 for (chan = c->begin(); chan != c->end(); ++chan) {
856 (*chan)->playback_buf->increment_read_ptr (distance);
859 if (first_recordable_frame < max_framepos) {
860 first_recordable_frame += distance;
862 playback_sample += distance;
864 return 0;
868 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer,
869 framepos_t& start, framecnt_t cnt,
870 ChannelInfo* /*channel_info*/, int channel, bool reversed)
872 framecnt_t this_read = 0;
873 bool reloop = false;
874 framepos_t loop_end = 0;
875 framepos_t loop_start = 0;
876 framecnt_t offset = 0;
877 Location *loc = 0;
879 /* XXX we don't currently play loops in reverse. not sure why */
881 if (!reversed) {
883 framecnt_t loop_length = 0;
885 /* Make the use of a Location atomic for this read operation.
887 Note: Locations don't get deleted, so all we care about
888 when I say "atomic" is that we are always pointing to
889 the same one and using a start/length values obtained
890 just once.
893 if ((loc = loop_location) != 0) {
894 loop_start = loc->start();
895 loop_end = loc->end();
896 loop_length = loop_end - loop_start;
899 /* if we are looping, ensure that the first frame we read is at the correct
900 position within the loop.
903 if (loc && start >= loop_end) {
904 //cerr << "start adjusted from " << start;
905 start = loop_start + ((start - loop_start) % loop_length);
906 //cerr << "to " << start << endl;
909 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
912 if (reversed) {
913 start -= cnt;
916 while (cnt) {
918 /* take any loop into account. we can't read past the end of the loop. */
920 if (loc && (loop_end - start < cnt)) {
921 this_read = loop_end - start;
922 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
923 reloop = true;
924 } else {
925 reloop = false;
926 this_read = cnt;
929 if (this_read == 0) {
930 break;
933 this_read = min(cnt,this_read);
935 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
936 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
937 start) << endmsg;
938 return -1;
941 _read_data_count = _playlist->read_data_count();
943 if (reversed) {
945 swap_by_ptr (buf, buf + this_read - 1);
947 } else {
949 /* if we read to the end of the loop, go back to the beginning */
951 if (reloop) {
952 start = loop_start;
953 } else {
954 start += this_read;
958 cnt -= this_read;
959 offset += this_read;
962 return 0;
966 AudioDiskstream::do_refill_with_alloc ()
968 Sample* mix_buf = new Sample[disk_io_chunk_frames];
969 float* gain_buf = new float[disk_io_chunk_frames];
971 int ret = _do_refill(mix_buf, gain_buf);
973 delete [] mix_buf;
974 delete [] gain_buf;
976 return ret;
980 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
982 int32_t ret = 0;
983 framecnt_t to_read;
984 RingBufferNPT<Sample>::rw_vector vector;
985 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
986 framecnt_t total_space;
987 framecnt_t zero_fill;
988 uint32_t chan_n;
989 ChannelList::iterator i;
990 boost::shared_ptr<ChannelList> c = channels.reader();
991 framecnt_t ts;
993 if (c->empty()) {
994 return 0;
997 assert(mixdown_buffer);
998 assert(gain_buffer);
1000 vector.buf[0] = 0;
1001 vector.len[0] = 0;
1002 vector.buf[1] = 0;
1003 vector.len[1] = 0;
1005 c->front()->playback_buf->get_write_vector (&vector);
1007 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1008 return 0;
1011 /* if there are 2+ chunks of disk i/o possible for
1012 this track, let the caller know so that it can arrange
1013 for us to be called again, ASAP.
1016 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1017 ret = 1;
1020 /* if we're running close to normal speed and there isn't enough
1021 space to do disk_io_chunk_frames of I/O, then don't bother.
1023 at higher speeds, just do it because the sync between butler
1024 and audio thread may not be good enough.
1027 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1028 return 0;
1031 /* when slaved, don't try to get too close to the read pointer. this
1032 leaves space for the buffer reversal to have something useful to
1033 work with.
1036 if (_slaved && total_space < (framecnt_t) (c->front()->playback_buf->bufsize() / 2)) {
1037 return 0;
1040 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1042 total_space = min (disk_io_chunk_frames, total_space);
1044 if (reversed) {
1046 if (file_frame == 0) {
1048 /* at start: nothing to do but fill with silence */
1050 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1052 ChannelInfo* chan (*i);
1053 chan->playback_buf->get_write_vector (&vector);
1054 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1055 if (vector.len[1]) {
1056 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1058 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1060 return 0;
1063 if (file_frame < total_space) {
1065 /* too close to the start: read what we can,
1066 and then zero fill the rest
1069 zero_fill = total_space - file_frame;
1070 total_space = file_frame;
1072 } else {
1074 zero_fill = 0;
1077 } else {
1079 if (file_frame == max_framepos) {
1081 /* at end: nothing to do but fill with silence */
1083 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1085 ChannelInfo* chan (*i);
1086 chan->playback_buf->get_write_vector (&vector);
1087 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1088 if (vector.len[1]) {
1089 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1091 chan->playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1093 return 0;
1096 if (file_frame > max_framepos - total_space) {
1098 /* to close to the end: read what we can, and zero fill the rest */
1100 zero_fill = total_space - (max_framepos - file_frame);
1101 total_space = max_framepos - file_frame;
1103 } else {
1104 zero_fill = 0;
1108 framepos_t file_frame_tmp = 0;
1110 for (chan_n = 0, i = c->begin(); i != c->end(); ++i, ++chan_n) {
1112 ChannelInfo* chan (*i);
1113 Sample* buf1;
1114 Sample* buf2;
1115 framecnt_t len1, len2;
1117 chan->playback_buf->get_write_vector (&vector);
1119 if ((framecnt_t) vector.len[0] > disk_io_chunk_frames) {
1121 /* we're not going to fill the first chunk, so certainly do not bother with the
1122 other part. it won't be connected with the part we do fill, as in:
1124 .... => writable space
1125 ++++ => readable space
1126 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1128 |......|+++++++++++++|...............................|
1129 buf1 buf0
1130 ^^^^^^^^^^^^^^^
1133 So, just pretend that the buf1 part isn't there.
1137 vector.buf[1] = 0;
1138 vector.len[1] = 0;
1142 ts = total_space;
1143 file_frame_tmp = file_frame;
1145 buf1 = vector.buf[0];
1146 len1 = vector.len[0];
1147 buf2 = vector.buf[1];
1148 len2 = vector.len[1];
1150 to_read = min (ts, len1);
1151 to_read = min (to_read, disk_io_chunk_frames);
1153 assert (to_read >= 0);
1155 if (to_read) {
1157 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1158 ret = -1;
1159 goto out;
1162 chan->playback_buf->increment_write_ptr (to_read);
1163 ts -= to_read;
1166 to_read = min (ts, len2);
1168 if (to_read) {
1170 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1171 so read some or all of vector.len[1] as well.
1174 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1175 ret = -1;
1176 goto out;
1179 chan->playback_buf->increment_write_ptr (to_read);
1182 if (zero_fill) {
1183 /* do something */
1188 file_frame = file_frame_tmp;
1189 assert (file_frame >= 0);
1191 out:
1193 return ret;
1196 /** Flush pending data to disk.
1198 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1199 * of data to disk. it will never write more than that. If it writes that
1200 * much and there is more than that waiting to be written, it will return 1,
1201 * otherwise 0 on success or -1 on failure.
1203 * If there is less than disk_io_chunk_frames to be written, no data will be
1204 * written at all unless @a force_flush is true.
1207 AudioDiskstream::do_flush (RunContext /*context*/, bool force_flush)
1209 uint32_t to_write;
1210 int32_t ret = 0;
1211 RingBufferNPT<Sample>::rw_vector vector;
1212 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1213 framecnt_t total;
1215 _write_data_count = 0;
1217 transvec.buf[0] = 0;
1218 transvec.buf[1] = 0;
1219 vector.buf[0] = 0;
1220 vector.buf[1] = 0;
1222 boost::shared_ptr<ChannelList> c = channels.reader();
1223 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1225 (*chan)->capture_buf->get_read_vector (&vector);
1227 total = vector.len[0] + vector.len[1];
1229 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1230 goto out;
1233 /* if there are 2+ chunks of disk i/o possible for
1234 this track, let the caller know so that it can arrange
1235 for us to be called again, ASAP.
1237 if we are forcing a flush, then if there is* any* extra
1238 work, let the caller know.
1240 if we are no longer recording and there is any extra work,
1241 let the caller know too.
1244 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1245 ret = 1;
1248 to_write = min (disk_io_chunk_frames, (framecnt_t) vector.len[0]);
1250 // check the transition buffer when recording destructive
1251 // important that we get this after the capture buf
1253 if (destructive()) {
1254 (*chan)->capture_transition_buf->get_read_vector(&transvec);
1255 size_t transcount = transvec.len[0] + transvec.len[1];
1256 bool have_start = false;
1257 size_t ti;
1259 for (ti=0; ti < transcount; ++ti) {
1260 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1262 if (captrans.type == CaptureStart) {
1263 // by definition, the first data we got above represents the given capture pos
1265 (*chan)->write_source->mark_capture_start (captrans.capture_val);
1266 (*chan)->curr_capture_cnt = 0;
1268 have_start = true;
1270 else if (captrans.type == CaptureEnd) {
1272 // capture end, the capture_val represents total frames in capture
1274 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
1276 // shorten to make the write a perfect fit
1277 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
1279 if (nto_write < to_write) {
1280 ret = 1; // should we?
1282 to_write = nto_write;
1284 (*chan)->write_source->mark_capture_end ();
1286 // increment past this transition, but go no further
1287 ++ti;
1288 break;
1290 else {
1291 // actually ends just beyond this chunk, so force more work
1292 ret = 1;
1293 break;
1298 if (ti > 0) {
1299 (*chan)->capture_transition_buf->increment_read_ptr(ti);
1303 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
1304 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1305 return -1;
1308 (*chan)->capture_buf->increment_read_ptr (to_write);
1309 (*chan)->curr_capture_cnt += to_write;
1311 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1313 /* we wrote all of vector.len[0] but it wasn't an entire
1314 disk_io_chunk_frames of data, so arrange for some part
1315 of vector.len[1] to be flushed to disk as well.
1318 to_write = min ((framecnt_t)(disk_io_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1320 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1321 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1322 return -1;
1325 _write_data_count += (*chan)->write_source->write_data_count();
1327 (*chan)->capture_buf->increment_read_ptr (to_write);
1328 (*chan)->curr_capture_cnt += to_write;
1332 out:
1333 return ret;
1336 void
1337 AudioDiskstream::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1339 uint32_t buffer_position;
1340 bool more_work = true;
1341 int err = 0;
1342 boost::shared_ptr<AudioRegion> region;
1343 framecnt_t total_capture;
1344 SourceList srcs;
1345 SourceList::iterator src;
1346 ChannelList::iterator chan;
1347 vector<CaptureInfo*>::iterator ci;
1348 boost::shared_ptr<ChannelList> c = channels.reader();
1349 uint32_t n = 0;
1350 bool mark_write_completed = false;
1352 finish_capture (true, c);
1354 /* butler is already stopped, but there may be work to do
1355 to flush remaining data to disk.
1358 while (more_work && !err) {
1359 switch (do_flush (TransportContext, true)) {
1360 case 0:
1361 more_work = false;
1362 break;
1363 case 1:
1364 break;
1365 case -1:
1366 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1367 err++;
1371 /* XXX is there anything we can do if err != 0 ? */
1372 Glib::Mutex::Lock lm (capture_info_lock);
1374 if (capture_info.empty()) {
1375 return;
1378 if (abort_capture) {
1380 if (destructive()) {
1381 goto outout;
1384 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1386 if ((*chan)->write_source) {
1388 (*chan)->write_source->mark_for_remove ();
1389 (*chan)->write_source->drop_references ();
1390 (*chan)->write_source.reset ();
1393 /* new source set up in "out" below */
1396 goto out;
1399 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1400 total_capture += (*ci)->frames;
1403 /* figure out the name for this take */
1405 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1407 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1409 if (s) {
1410 srcs.push_back (s);
1411 s->update_header (capture_info.front()->start, when, twhen);
1412 s->set_captured_for (_name.val());
1413 s->mark_immutable ();
1415 if (Config->get_auto_analyse_audio()) {
1416 Analyser::queue_source_for_analysis (s, true);
1421 /* destructive tracks have a single, never changing region */
1423 if (destructive()) {
1425 /* send a signal that any UI can pick up to do the right thing. there is
1426 a small problem here in that a UI may need the peak data to be ready
1427 for the data that was recorded and this isn't interlocked with that
1428 process. this problem is deferred to the UI.
1431 _playlist->LayeringChanged(); // XXX this may not get the UI to do the right thing
1433 } else {
1435 string whole_file_region_name;
1436 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1438 /* Register a new region with the Session that
1439 describes the entire source. Do this first
1440 so that any sub-regions will obviously be
1441 children of this one (later!)
1444 try {
1445 PropertyList plist;
1447 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1448 plist.add (Properties::length, total_capture);
1449 plist.add (Properties::name, whole_file_region_name);
1450 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1451 rx->set_automatic (true);
1452 rx->set_whole_file (true);
1454 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1455 region->special_set_position (capture_info.front()->start);
1459 catch (failed_constructor& err) {
1460 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1461 /* XXX what now? */
1464 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1466 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1468 _playlist->clear_changes ();
1469 _playlist->freeze ();
1471 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1473 string region_name;
1475 RegionFactory::region_name (region_name, whole_file_region_name, false);
1477 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1478 _name, (*ci)->start, (*ci)->frames, region_name));
1480 try {
1482 PropertyList plist;
1484 plist.add (Properties::start, buffer_position);
1485 plist.add (Properties::length, (*ci)->frames);
1486 plist.add (Properties::name, region_name);
1488 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1489 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1492 catch (failed_constructor& err) {
1493 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1494 continue; /* XXX is this OK? */
1497 i_am_the_modifier++;
1499 if (_playlist->explicit_relayering()) {
1500 /* We are in `explicit relayering' mode, so we must specify which layer this new region
1501 should end up on. Put it at the top.
1503 region->set_layer (_playlist->top_layer() + 1);
1504 region->set_pending_explicit_relayer (true);
1507 _playlist->add_region (region, (*ci)->start, 1, non_layered());
1508 i_am_the_modifier--;
1510 buffer_position += (*ci)->frames;
1513 _playlist->thaw ();
1514 _session.add_command (new StatefulDiffCommand (_playlist));
1517 mark_write_completed = true;
1519 out:
1520 reset_write_sources (mark_write_completed);
1522 outout:
1524 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1525 delete *ci;
1528 capture_info.clear ();
1529 capture_start_frame = 0;
1532 void
1533 AudioDiskstream::transport_looped (framepos_t transport_frame)
1535 if (was_recording) {
1536 // all we need to do is finish this capture, with modified capture length
1537 boost::shared_ptr<ChannelList> c = channels.reader();
1539 // adjust the capture length knowing that the data will be recorded to disk
1540 // only necessary after the first loop where we're recording
1541 if (capture_info.size() == 0) {
1542 capture_captured += _capture_offset;
1544 if (_alignment_style == ExistingMaterial) {
1545 capture_captured += _session.worst_output_latency();
1546 } else {
1547 capture_captured += _roll_delay;
1551 finish_capture (true, c);
1553 // the next region will start recording via the normal mechanism
1554 // we'll set the start position to the current transport pos
1555 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1556 capture_start_frame = transport_frame;
1557 first_recordable_frame = transport_frame; // mild lie
1558 last_recordable_frame = max_framepos;
1559 was_recording = true;
1561 if (recordable() && destructive()) {
1562 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1564 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1565 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1567 if (transvec.len[0] > 0) {
1568 transvec.buf[0]->type = CaptureStart;
1569 transvec.buf[0]->capture_val = capture_start_frame;
1570 (*chan)->capture_transition_buf->increment_write_ptr(1);
1572 else {
1573 // bad!
1574 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1575 << endmsg;
1583 void
1584 AudioDiskstream::finish_capture (bool /*rec_monitors_input*/, boost::shared_ptr<ChannelList> c)
1586 was_recording = false;
1587 first_recordable_frame = max_framepos;
1588 last_recordable_frame = max_framepos;
1590 if (capture_captured == 0) {
1591 return;
1594 if (recordable() && destructive()) {
1595 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1597 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1598 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1600 if (transvec.len[0] > 0) {
1601 transvec.buf[0]->type = CaptureEnd;
1602 transvec.buf[0]->capture_val = capture_captured;
1603 (*chan)->capture_transition_buf->increment_write_ptr(1);
1605 else {
1606 // bad!
1607 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1613 CaptureInfo* ci = new CaptureInfo;
1615 ci->start = capture_start_frame;
1616 ci->frames = capture_captured;
1618 /* XXX theoretical race condition here. Need atomic exchange ?
1619 However, the circumstances when this is called right
1620 now (either on record-disable or transport_stopped)
1621 mean that no actual race exists. I think ...
1622 We now have a capture_info_lock, but it is only to be used
1623 to synchronize in the transport_stop and the capture info
1624 accessors, so that invalidation will not occur (both non-realtime).
1627 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1629 capture_info.push_back (ci);
1630 capture_captured = 0;
1632 /* now we've finished a capture, reset first_recordable_frame for next time */
1633 first_recordable_frame = max_framepos;
1636 void
1637 AudioDiskstream::set_record_enabled (bool yn)
1639 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_audio() == 0) {
1640 return;
1643 /* can't rec-enable in destructive mode if transport is before start */
1645 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1646 return;
1649 /* yes, i know that this not proof against race conditions, but its
1650 good enough. i think.
1653 if (record_enabled() != yn) {
1654 if (yn) {
1655 engage_record_enable ();
1656 } else {
1657 disengage_record_enable ();
1662 void
1663 AudioDiskstream::engage_record_enable ()
1665 bool rolling = _session.transport_speed() != 0.0f;
1666 boost::shared_ptr<ChannelList> c = channels.reader();
1668 g_atomic_int_set (&_record_enabled, 1);
1669 capturing_sources.clear ();
1671 if (Config->get_monitoring_model() == HardwareMonitoring) {
1673 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1674 (*chan)->source.ensure_monitor_input (!(_session.config.get_auto_input() && rolling));
1675 capturing_sources.push_back ((*chan)->write_source);
1676 (*chan)->write_source->mark_streaming_write_started ();
1679 } else {
1680 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1681 capturing_sources.push_back ((*chan)->write_source);
1682 (*chan)->write_source->mark_streaming_write_started ();
1686 RecordEnableChanged (); /* EMIT SIGNAL */
1689 void
1690 AudioDiskstream::disengage_record_enable ()
1692 g_atomic_int_set (&_record_enabled, 0);
1693 boost::shared_ptr<ChannelList> c = channels.reader();
1694 if (Config->get_monitoring_model() == HardwareMonitoring) {
1695 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1696 (*chan)->source.ensure_monitor_input (false);
1699 capturing_sources.clear ();
1700 RecordEnableChanged (); /* EMIT SIGNAL */
1703 XMLNode&
1704 AudioDiskstream::get_state ()
1706 XMLNode& node (Diskstream::get_state());
1707 char buf[64] = "";
1708 LocaleGuard lg (X_("POSIX"));
1710 boost::shared_ptr<ChannelList> c = channels.reader();
1711 snprintf (buf, sizeof(buf), "%zd", c->size());
1712 node.add_property ("channels", buf);
1714 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1716 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1717 XMLNode* cs_grandchild;
1719 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1720 cs_grandchild = new XMLNode (X_("file"));
1721 cs_grandchild->add_property (X_("path"), (*i)->path());
1722 cs_child->add_child_nocopy (*cs_grandchild);
1725 /* store the location where capture will start */
1727 Location* pi;
1729 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1730 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1731 } else {
1732 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1735 cs_child->add_property (X_("at"), buf);
1736 node.add_child_nocopy (*cs_child);
1739 return node;
1743 AudioDiskstream::set_state (const XMLNode& node, int version)
1745 const XMLProperty* prop;
1746 XMLNodeList nlist = node.children();
1747 XMLNodeIterator niter;
1748 uint32_t nchans = 1;
1749 XMLNode* capture_pending_node = 0;
1750 LocaleGuard lg (X_("POSIX"));
1752 /* prevent write sources from being created */
1754 in_set_state = true;
1756 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1757 if ((*niter)->name() == IO::state_node_name) {
1758 deprecated_io_node = new XMLNode (**niter);
1761 if ((*niter)->name() == X_("CapturingSources")) {
1762 capture_pending_node = *niter;
1766 if (Diskstream::set_state (node, version)) {
1767 return -1;
1770 if ((prop = node.property ("channels")) != 0) {
1771 nchans = atoi (prop->value().c_str());
1774 // create necessary extra channels
1775 // we are always constructed with one and we always need one
1777 _n_channels.set(DataType::AUDIO, channels.reader()->size());
1779 if (nchans > _n_channels.n_audio()) {
1781 add_channel (nchans - _n_channels.n_audio());
1782 IO::PortCountChanged(_n_channels);
1784 } else if (nchans < _n_channels.n_audio()) {
1786 remove_channel (_n_channels.n_audio() - nchans);
1791 if (!destructive() && capture_pending_node) {
1792 /* destructive streams have one and only one source per channel,
1793 and so they never end up in pending capture in any useful
1794 sense.
1796 use_pending_capture_data (*capture_pending_node);
1799 in_set_state = false;
1801 /* make sure this is clear before we do anything else */
1803 capturing_sources.clear ();
1805 /* write sources are handled when we handle the input set
1806 up of the IO that owns this DS (::non_realtime_input_change())
1809 return 0;
1813 AudioDiskstream::use_new_write_source (uint32_t n)
1815 boost::shared_ptr<ChannelList> c = channels.reader();
1817 if (!recordable()) {
1818 return 1;
1821 if (n >= c->size()) {
1822 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1823 return -1;
1826 ChannelInfo* chan = (*c)[n];
1828 try {
1829 if ((chan->write_source = _session.create_audio_source_for_session (
1830 n_channels().n_audio(), name(), n, destructive())) == 0) {
1831 throw failed_constructor();
1835 catch (failed_constructor &err) {
1836 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1837 chan->write_source.reset ();
1838 return -1;
1841 /* do not remove destructive files even if they are empty */
1843 chan->write_source->set_allow_remove_if_empty (!destructive());
1845 return 0;
1848 list<boost::shared_ptr<Source> >
1849 AudioDiskstream::steal_write_sources()
1851 /* not possible to steal audio write sources */
1852 list<boost::shared_ptr<Source> > ret;
1853 return ret;
1856 void
1857 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1859 ChannelList::iterator chan;
1860 boost::shared_ptr<ChannelList> c = channels.reader();
1861 uint32_t n;
1863 if (!_session.writable() || !recordable()) {
1864 return;
1867 capturing_sources.clear ();
1869 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1871 if (!destructive()) {
1873 if ((*chan)->write_source) {
1875 if (mark_write_complete) {
1876 (*chan)->write_source->mark_streaming_write_completed ();
1877 (*chan)->write_source->done_with_peakfile_writes ();
1880 if ((*chan)->write_source->removable()) {
1881 (*chan)->write_source->mark_for_remove ();
1882 (*chan)->write_source->drop_references ();
1885 (*chan)->write_source.reset ();
1888 use_new_write_source (n);
1890 if (record_enabled()) {
1891 capturing_sources.push_back ((*chan)->write_source);
1894 } else {
1896 if ((*chan)->write_source == 0) {
1897 use_new_write_source (n);
1902 if (destructive() && !c->empty ()) {
1904 /* we now have all our write sources set up, so create the
1905 playlist's single region.
1908 if (_playlist->empty()) {
1909 setup_destructive_playlist ();
1914 void
1915 AudioDiskstream::set_block_size (pframes_t /*nframes*/)
1917 if (_session.get_block_size() > speed_buffer_size) {
1918 speed_buffer_size = _session.get_block_size();
1919 boost::shared_ptr<ChannelList> c = channels.reader();
1921 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1922 if ((*chan)->speed_buffer)
1923 delete [] (*chan)->speed_buffer;
1924 (*chan)->speed_buffer = new Sample[speed_buffer_size];
1927 allocate_temporary_buffers ();
1930 void
1931 AudioDiskstream::allocate_temporary_buffers ()
1933 /* make sure the wrap buffer is at least large enough to deal
1934 with the speeds up to 1.2, to allow for micro-variation
1935 when slaving to MTC, Timecode etc.
1938 double const sp = max (fabsf (_actual_speed), 1.2f);
1939 framecnt_t required_wrap_size = (framecnt_t) floor (_session.get_block_size() * sp) + 1;
1941 if (required_wrap_size > wrap_buffer_size) {
1943 boost::shared_ptr<ChannelList> c = channels.reader();
1945 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1946 if ((*chan)->playback_wrap_buffer)
1947 delete [] (*chan)->playback_wrap_buffer;
1948 (*chan)->playback_wrap_buffer = new Sample[required_wrap_size];
1949 if ((*chan)->capture_wrap_buffer)
1950 delete [] (*chan)->capture_wrap_buffer;
1951 (*chan)->capture_wrap_buffer = new Sample[required_wrap_size];
1954 wrap_buffer_size = required_wrap_size;
1958 void
1959 AudioDiskstream::monitor_input (bool yn)
1961 boost::shared_ptr<ChannelList> c = channels.reader();
1963 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1964 (*chan)->source.ensure_monitor_input (yn);
1968 void
1969 AudioDiskstream::set_align_style_from_io ()
1971 bool have_physical = false;
1973 if (_alignment_choice != Automatic) {
1974 return;
1977 if (_io == 0) {
1978 return;
1981 get_input_sources ();
1983 boost::shared_ptr<ChannelList> c = channels.reader();
1985 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1986 if ((*chan)->source.is_physical ()) {
1987 have_physical = true;
1988 break;
1992 if (have_physical) {
1993 set_align_style (ExistingMaterial);
1994 } else {
1995 set_align_style (CaptureTime);
2000 AudioDiskstream::add_channel_to (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2002 while (how_many--) {
2003 c->push_back (new ChannelInfo(
2004 _session.butler()->audio_diskstream_playback_buffer_size(),
2005 _session.butler()->audio_diskstream_capture_buffer_size(),
2006 speed_buffer_size, wrap_buffer_size));
2007 interpolation.add_channel_to (
2008 _session.butler()->audio_diskstream_playback_buffer_size(),
2009 speed_buffer_size);
2012 _n_channels.set(DataType::AUDIO, c->size());
2014 return 0;
2018 AudioDiskstream::add_channel (uint32_t how_many)
2020 RCUWriter<ChannelList> writer (channels);
2021 boost::shared_ptr<ChannelList> c = writer.get_copy();
2023 return add_channel_to (c, how_many);
2027 AudioDiskstream::remove_channel_from (boost::shared_ptr<ChannelList> c, uint32_t how_many)
2029 while (how_many-- && !c->empty()) {
2030 delete c->back();
2031 c->pop_back();
2032 interpolation.remove_channel_from ();
2035 _n_channels.set(DataType::AUDIO, c->size());
2037 return 0;
2041 AudioDiskstream::remove_channel (uint32_t how_many)
2043 RCUWriter<ChannelList> writer (channels);
2044 boost::shared_ptr<ChannelList> c = writer.get_copy();
2046 return remove_channel_from (c, how_many);
2049 float
2050 AudioDiskstream::playback_buffer_load () const
2052 boost::shared_ptr<ChannelList> c = channels.reader();
2054 if (c->empty ()) {
2055 return 0;
2058 return (float) ((double) c->front()->playback_buf->read_space()/
2059 (double) c->front()->playback_buf->bufsize());
2062 float
2063 AudioDiskstream::capture_buffer_load () const
2065 boost::shared_ptr<ChannelList> c = channels.reader();
2067 if (c->empty ()) {
2068 return 0;
2071 return (float) ((double) c->front()->capture_buf->write_space()/
2072 (double) c->front()->capture_buf->bufsize());
2076 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2078 const XMLProperty* prop;
2079 XMLNodeList nlist = node.children();
2080 XMLNodeIterator niter;
2081 boost::shared_ptr<AudioFileSource> fs;
2082 boost::shared_ptr<AudioFileSource> first_fs;
2083 SourceList pending_sources;
2084 framepos_t position;
2086 if ((prop = node.property (X_("at"))) == 0) {
2087 return -1;
2090 if (sscanf (prop->value().c_str(), "%" PRIu64, &position) != 1) {
2091 return -1;
2094 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2095 if ((*niter)->name() == X_("file")) {
2097 if ((prop = (*niter)->property (X_("path"))) == 0) {
2098 continue;
2101 // This protects sessions from errant CapturingSources in stored sessions
2102 struct stat sbuf;
2103 if (stat (prop->value().c_str(), &sbuf)) {
2104 continue;
2107 try {
2108 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2109 SourceFactory::createWritable (
2110 DataType::AUDIO, _session,
2111 prop->value(), string(), false, _session.frame_rate()));
2114 catch (failed_constructor& err) {
2115 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2116 _name, prop->value())
2117 << endmsg;
2118 return -1;
2121 pending_sources.push_back (fs);
2123 if (first_fs == 0) {
2124 first_fs = fs;
2127 fs->set_captured_for (_name.val());
2131 if (pending_sources.size() == 0) {
2132 /* nothing can be done */
2133 return 1;
2136 if (pending_sources.size() != _n_channels.n_audio()) {
2137 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2138 << endmsg;
2139 return -1;
2142 boost::shared_ptr<AudioRegion> region;
2144 try {
2146 PropertyList plist;
2148 plist.add (Properties::start, 0);
2149 plist.add (Properties::length, first_fs->length (first_fs->timeline_position()));
2150 plist.add (Properties::name, region_name_from_path (first_fs->name(), true));
2152 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, plist));
2154 region->set_automatic (true);
2155 region->set_whole_file (true);
2156 region->special_set_position (0);
2159 catch (failed_constructor& err) {
2160 error << string_compose (
2161 _("%1: cannot create whole-file region from pending capture sources"),
2162 _name) << endmsg;
2164 return -1;
2167 _playlist->add_region (region, position);
2169 return 0;
2173 AudioDiskstream::set_non_layered (bool yn)
2175 if (yn != non_layered()) {
2177 if (yn) {
2178 _flags = Flag (_flags | NonLayered);
2179 } else {
2180 _flags = Flag (_flags & ~NonLayered);
2184 return 0;
2188 AudioDiskstream::set_destructive (bool yn)
2190 if (yn != destructive()) {
2192 if (yn) {
2193 bool bounce_ignored;
2194 /* requestor should already have checked this and
2195 bounced if necessary and desired
2197 if (!can_become_destructive (bounce_ignored)) {
2198 return -1;
2200 _flags = Flag (_flags | Destructive);
2201 use_destructive_playlist ();
2202 } else {
2203 _flags = Flag (_flags & ~Destructive);
2204 reset_write_sources (true, true);
2208 return 0;
2211 bool
2212 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2214 if (!_playlist) {
2215 requires_bounce = false;
2216 return false;
2219 /* is there only one region ? */
2221 if (_playlist->n_regions() != 1) {
2222 requires_bounce = true;
2223 return false;
2226 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2227 if (!first) {
2228 requires_bounce = false;
2229 return true;
2232 /* do the source(s) for the region cover the session start position ? */
2234 if (first->position() != _session.current_start_frame()) {
2235 if (first->start() > _session.current_start_frame()) {
2236 requires_bounce = true;
2237 return false;
2241 /* is the source used by only 1 playlist ? */
2243 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2245 assert (afirst);
2247 if (_session.playlists->source_use_count (afirst->source()) > 1) {
2248 requires_bounce = true;
2249 return false;
2252 requires_bounce = false;
2253 return true;
2256 void
2257 AudioDiskstream::adjust_playback_buffering ()
2259 boost::shared_ptr<ChannelList> c = channels.reader();
2261 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2262 (*chan)->resize_playback (_session.butler()->audio_diskstream_playback_buffer_size());
2266 void
2267 AudioDiskstream::adjust_capture_buffering ()
2269 boost::shared_ptr<ChannelList> c = channels.reader();
2271 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
2272 (*chan)->resize_capture (_session.butler()->audio_diskstream_capture_buffer_size());
2276 bool
2277 AudioDiskstream::ChannelSource::is_physical () const
2279 if (name.empty()) {
2280 return false;
2283 return AudioEngine::instance()->port_is_physical (name);
2286 void
2287 AudioDiskstream::ChannelSource::ensure_monitor_input (bool yn) const
2289 if (name.empty()) {
2290 return;
2293 return AudioEngine::instance()->ensure_monitor_input (name, yn);
2296 AudioDiskstream::ChannelInfo::ChannelInfo (framecnt_t playback_bufsize, framecnt_t capture_bufsize, framecnt_t speed_size, framecnt_t wrap_size)
2298 peak_power = 0.0f;
2299 current_capture_buffer = 0;
2300 current_playback_buffer = 0;
2301 curr_capture_cnt = 0;
2303 speed_buffer = new Sample[speed_size];
2304 playback_wrap_buffer = new Sample[wrap_size];
2305 capture_wrap_buffer = new Sample[wrap_size];
2307 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2308 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2309 capture_transition_buf = new RingBufferNPT<CaptureTransition> (256);
2311 /* touch the ringbuffer buffers, which will cause
2312 them to be mapped into locked physical RAM if
2313 we're running with mlockall(). this doesn't do
2314 much if we're not.
2317 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2318 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2319 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2322 void
2323 AudioDiskstream::ChannelInfo::resize_playback (framecnt_t playback_bufsize)
2325 delete playback_buf;
2326 playback_buf = new RingBufferNPT<Sample> (playback_bufsize);
2327 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2330 void
2331 AudioDiskstream::ChannelInfo::resize_capture (framecnt_t capture_bufsize)
2333 delete capture_buf;
2335 capture_buf = new RingBufferNPT<Sample> (capture_bufsize);
2336 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2339 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2341 write_source.reset ();
2343 delete [] speed_buffer;
2344 speed_buffer = 0;
2346 delete [] playback_wrap_buffer;
2347 playback_wrap_buffer = 0;
2349 delete [] capture_wrap_buffer;
2350 capture_wrap_buffer = 0;
2352 delete playback_buf;
2353 playback_buf = 0;
2355 delete capture_buf;
2356 capture_buf = 0;
2358 delete capture_transition_buf;
2359 capture_transition_buf = 0;