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>
40 #include <ardour/ardour.h>
41 #include <ardour/audioengine.h>
42 #include <ardour/audio_diskstream.h>
43 #include <ardour/utils.h>
44 #include <ardour/configuration.h>
45 #include <ardour/audiofilesource.h>
46 #include <ardour/destructive_filesource.h>
47 #include <ardour/send.h>
48 #include <ardour/region_factory.h>
49 #include <ardour/audioplaylist.h>
50 #include <ardour/playlist_factory.h>
51 #include <ardour/cycle_timer.h>
52 #include <ardour/audioregion.h>
53 #include <ardour/audio_port.h>
54 #include <ardour/source_factory.h>
60 using namespace ARDOUR;
63 size_t AudioDiskstream::_working_buffers_size = 0;
64 Sample* AudioDiskstream::_mixdown_buffer = 0;
65 gain_t* AudioDiskstream::_gain_buffer = 0;
67 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
68 : Diskstream(sess, name, flag)
69 , deprecated_io_node(NULL)
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)
88 if (set_state (node)) {
90 throw failed_constructor();
96 use_destructive_playlist ();
101 AudioDiskstream::init (Diskstream::Flag f)
105 /* there are no channels at this point, so these
106 two calls just get speed_buffer_size and wrap_buffer
107 size setup without duplicating their code.
110 set_block_size (_session.get_block_size());
111 allocate_temporary_buffers ();
114 assert(_n_channels == ChanCount(DataType::AUDIO, 1));
117 AudioDiskstream::~AudioDiskstream ()
122 /* don't be holding this lock as we exit the destructor, glib will wince
123 visibly since the mutex gets destroyed before we release it.
126 Glib::Mutex::Lock lm (state_lock);
127 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
135 AudioDiskstream::allocate_working_buffers()
137 assert(disk_io_frames() > 0);
139 _working_buffers_size = disk_io_frames();
140 _mixdown_buffer = new Sample[_working_buffers_size];
141 _gain_buffer = new gain_t[_working_buffers_size];
145 AudioDiskstream::free_working_buffers()
147 delete [] _mixdown_buffer;
148 delete [] _gain_buffer;
149 _working_buffers_size = 0;
155 AudioDiskstream::non_realtime_input_change ()
158 Glib::Mutex::Lock lm (state_lock);
160 if (input_change_pending == NoChange) {
164 if (input_change_pending & ConfigurationChanged) {
166 if (_io->n_inputs().get(DataType::AUDIO) > _n_channels.get(DataType::AUDIO)) {
168 // we need to add new channel infos
170 int diff = _io->n_inputs().get(DataType::AUDIO) - channels.size();
172 for (int i = 0; i < diff; ++i) {
176 } else if (_io->n_inputs().get(DataType::AUDIO) < _n_channels.get(DataType::AUDIO)) {
178 // we need to get rid of channels
180 int diff = channels.size() - _io->n_inputs().get(DataType::AUDIO);
182 for (int i = 0; i < diff; ++i) {
188 get_input_sources ();
189 set_capture_offset ();
191 if (first_input_change) {
192 set_align_style (_persistent_alignment_style);
193 first_input_change = false;
195 set_align_style_from_io ();
198 input_change_pending = NoChange;
201 /* reset capture files */
203 reset_write_sources (false);
205 /* now refill channel buffers */
207 if (speed() != 1.0f || speed() != -1.0f) {
208 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
210 seek (_session.transport_frame());
215 AudioDiskstream::get_input_sources ()
217 uint32_t ni = _io->n_inputs().get(DataType::AUDIO);
219 for (uint32_t n = 0; n < ni; ++n) {
221 const char **connections = _io->input(n)->get_connections ();
222 ChannelInfo& chan = channels[n];
224 if (connections == 0 || connections[0] == 0) {
227 // _source->disable_metering ();
233 chan.source = dynamic_cast<AudioPort*>(
234 _session.engine().get_port_by_name (connections[0]) );
244 AudioDiskstream::find_and_use_playlist (const string& name)
246 boost::shared_ptr<AudioPlaylist> playlist;
248 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
249 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, name));
253 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
257 return use_playlist (playlist);
261 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
263 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
265 Diskstream::use_playlist(playlist);
271 AudioDiskstream::use_new_playlist ()
274 boost::shared_ptr<AudioPlaylist> playlist;
276 if (!in_set_state && destructive()) {
281 newname = Playlist::bump_name (_playlist->name(), _session);
283 newname = Playlist::bump_name (_name, _session);
286 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, newname, hidden()))) != 0) {
288 playlist->set_orig_diskstream_id (id());
289 return use_playlist (playlist);
297 AudioDiskstream::use_copy_playlist ()
299 assert(audio_playlist());
305 if (_playlist == 0) {
306 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
311 boost::shared_ptr<AudioPlaylist> playlist;
313 newname = Playlist::bump_name (_playlist->name(), _session);
315 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
316 playlist->set_orig_diskstream_id (id());
317 return use_playlist (playlist);
324 AudioDiskstream::setup_destructive_playlist ()
328 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
329 srcs.push_back ((*chan).write_source);
332 /* a single full-sized region */
334 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
335 _playlist->add_region (region, srcs.front()->natural_position());
339 AudioDiskstream::use_destructive_playlist ()
341 /* this is called from the XML-based constructor or ::set_destructive. when called,
342 we already have a playlist and a region, but we need to
343 set up our sources for write. we use the sources associated
344 with the (presumed single, full-extent) region.
347 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
350 reset_write_sources (false, true);
354 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
357 throw failed_constructor();
360 /* be sure to stretch the region out to the maximum length */
362 region->set_length (max_frames - region->position(), this);
365 ChannelList::iterator chan;
367 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
368 (*chan).write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
369 assert((*chan).write_source);
370 (*chan).write_source->set_allow_remove_if_empty (false);
372 /* this might be false if we switched modes, so force it */
374 (*chan).write_source->set_destructive (true);
377 /* the source list will never be reset for a destructive track */
381 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
383 int possibly_recording;
386 const int transport_rolling = 0x4;
387 const int track_rec_enabled = 0x2;
388 const int global_rec_enabled = 0x1;
390 /* merge together the 3 factors that affect record status, and compute
394 rolling = _session.transport_speed() != 0.0f;
395 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
396 change = possibly_recording ^ last_possibly_recording;
398 if (possibly_recording == last_possibly_recording) {
404 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
406 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
407 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
409 /* starting to record: compute first+last frames */
411 first_recordable_frame = transport_frame + _capture_offset;
412 last_recordable_frame = max_frames;
413 capture_start_frame = transport_frame;
415 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
417 /* was stopped, now rolling (and recording) */
419 if (_alignment_style == ExistingMaterial) {
420 first_recordable_frame += _session.worst_output_latency();
422 first_recordable_frame += _roll_delay;
427 /* was rolling, but record state changed */
429 if (_alignment_style == ExistingMaterial) {
431 if (!Config->get_punch_in()) {
433 /* manual punch in happens at the correct transport frame
434 because the user hit a button. but to get alignment correct
435 we have to back up the position of the new region to the
436 appropriate spot given the roll delay.
439 capture_start_frame -= _roll_delay;
441 /* XXX paul notes (august 2005): i don't know why
445 first_recordable_frame += _capture_offset;
449 /* autopunch toggles recording at the precise
450 transport frame, and then the DS waits
451 to start recording for a time that depends
452 on the output latency.
455 first_recordable_frame += _session.worst_output_latency();
460 if (Config->get_punch_in()) {
461 first_recordable_frame += _roll_delay;
463 capture_start_frame -= _roll_delay;
469 if (_flags & Recordable) {
470 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
472 RingBufferNPT<CaptureTransition>::rw_vector transvec;
473 (*chan).capture_transition_buf->get_write_vector(&transvec);
475 if (transvec.len[0] > 0) {
476 transvec.buf[0]->type = CaptureStart;
477 transvec.buf[0]->capture_val = capture_start_frame;
478 (*chan).capture_transition_buf->increment_write_ptr(1);
482 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
488 } else if (!record_enabled() || !can_record) {
492 last_recordable_frame = transport_frame + _capture_offset;
494 if (_alignment_style == ExistingMaterial) {
495 last_recordable_frame += _session.worst_output_latency();
497 last_recordable_frame += _roll_delay;
501 last_possibly_recording = possibly_recording;
505 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
508 ChannelList::iterator c;
510 nframes_t rec_offset = 0;
511 nframes_t rec_nframes = 0;
512 bool nominally_recording;
513 bool re = record_enabled ();
514 bool collect_playback = false;
516 /* if we've already processed the frames corresponding to this call,
517 just return. this allows multiple routes that are taking input
518 from this diskstream to call our ::process() method, but have
519 this stuff only happen once. more commonly, it allows both
520 the AudioTrack that is using this AudioDiskstream *and* the Session
521 to call process() without problems.
528 check_record_status (transport_frame, nframes, can_record);
530 nominally_recording = (can_record && re);
537 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
538 must always be called as a pair. The only exception is if this function
539 returns a non-zero value, in which case, ::commit should not be called.
542 // If we can't take the state lock return.
543 if (!state_lock.trylock()) {
547 adjust_capture_position = 0;
549 for (c = channels.begin(); c != channels.end(); ++c) {
550 (*c).current_capture_buffer = 0;
551 (*c).current_playback_buffer = 0;
554 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
557 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
564 case OverlapInternal:
565 /* ---------- recrange
568 rec_nframes = nframes;
573 /* |--------| recrange
576 rec_nframes = transport_frame + nframes - first_recordable_frame;
578 rec_offset = first_recordable_frame - transport_frame;
583 /* |--------| recrange
586 rec_nframes = last_recordable_frame - transport_frame;
590 case OverlapExternal:
591 /* |--------| recrange
592 -------------- transrange
594 rec_nframes = last_recordable_frame - last_recordable_frame;
595 rec_offset = first_recordable_frame - transport_frame;
599 if (rec_nframes && !was_recording) {
600 capture_captured = 0;
601 was_recording = true;
606 if (can_record && !_last_capture_regions.empty()) {
607 _last_capture_regions.clear ();
610 if (nominally_recording || rec_nframes) {
612 for (n = 0, c = channels.begin(); c != channels.end(); ++c, ++n) {
614 ChannelInfo& chan (*c);
616 chan.capture_buf->get_write_vector (&chan.capture_vector);
618 if (rec_nframes <= chan.capture_vector.len[0]) {
620 chan.current_capture_buffer = chan.capture_vector.buf[0];
622 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
626 AudioPort* const ap = _io->audio_input(n);
628 assert(rec_nframes <= ap->get_audio_buffer().capacity());
630 memcpy (chan.current_capture_buffer, ap->get_audio_buffer().data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
634 nframes_t total = chan.capture_vector.len[0] + chan.capture_vector.len[1];
636 if (rec_nframes > total) {
641 AudioPort* const ap = _io->audio_input(n);
644 Sample* buf = ap->get_audio_buffer().data(nframes, offset);
645 nframes_t first = chan.capture_vector.len[0];
647 memcpy (chan.capture_wrap_buffer, buf, sizeof (Sample) * first);
648 memcpy (chan.capture_vector.buf[0], buf, sizeof (Sample) * first);
649 memcpy (chan.capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
650 memcpy (chan.capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
652 chan.current_capture_buffer = chan.capture_wrap_buffer;
659 finish_capture (rec_monitors_input);
666 /* data will be written to disk */
668 if (rec_nframes == nframes && rec_offset == 0) {
670 for (c = channels.begin(); c != channels.end(); ++c) {
671 (*c).current_playback_buffer = (*c).current_capture_buffer;
674 playback_distance = nframes;
679 /* we can't use the capture buffer as the playback buffer, because
680 we recorded only a part of the current process' cycle data
684 collect_playback = true;
687 adjust_capture_position = rec_nframes;
689 } else if (nominally_recording) {
691 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
693 for (c = channels.begin(); c != channels.end(); ++c) {
694 (*c).current_playback_buffer = (*c).current_capture_buffer;
697 playback_distance = nframes;
701 collect_playback = true;
704 if (collect_playback) {
706 /* we're doing playback */
708 nframes_t necessary_samples;
710 /* no varispeed playback if we're recording, because the output .... TBD */
712 if (rec_nframes == 0 && _actual_speed != 1.0f) {
713 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
715 necessary_samples = nframes;
718 for (c = channels.begin(); c != channels.end(); ++c) {
719 (*c).playback_buf->get_read_vector (&(*c).playback_vector);
724 for (c = channels.begin(); c != channels.end(); ++c, ++n) {
726 ChannelInfo& chan (*c);
728 if (necessary_samples <= chan.playback_vector.len[0]) {
730 chan.current_playback_buffer = chan.playback_vector.buf[0];
733 nframes_t total = chan.playback_vector.len[0] + chan.playback_vector.len[1];
735 if (necessary_samples > total) {
741 memcpy ((char *) chan.playback_wrap_buffer, chan.playback_vector.buf[0],
742 chan.playback_vector.len[0] * sizeof (Sample));
743 memcpy (chan.playback_wrap_buffer + chan.playback_vector.len[0], chan.playback_vector.buf[1],
744 (necessary_samples - chan.playback_vector.len[0]) * sizeof (Sample));
746 chan.current_playback_buffer = chan.playback_wrap_buffer;
751 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
753 uint64_t phase = last_phase;
756 // Linearly interpolate into the alt buffer
757 // using 40.24 fixp maths (swh)
759 for (c = channels.begin(); c != channels.end(); ++c) {
762 ChannelInfo& chan (*c);
767 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
769 fr = (phase & 0xFFFFFF) / 16777216.0f;
770 chan.speed_buffer[outsample] =
771 chan.current_playback_buffer[i] * (1.0f - fr) +
772 chan.current_playback_buffer[i+1] * fr;
776 chan.current_playback_buffer = chan.speed_buffer;
779 playback_distance = i + 1;
780 last_phase = (phase & 0xFFFFFF);
783 playback_distance = nframes;
795 /* we're exiting with failure, so ::commit will not
796 be called. unlock the state lock.
806 AudioDiskstream::commit (nframes_t nframes)
808 bool need_butler = false;
810 if (_actual_speed < 0.0) {
811 playback_sample -= playback_distance;
813 playback_sample += playback_distance;
816 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
818 (*chan).playback_buf->increment_read_ptr (playback_distance);
820 if (adjust_capture_position) {
821 (*chan).capture_buf->increment_write_ptr (adjust_capture_position);
825 if (adjust_capture_position != 0) {
826 capture_captured += adjust_capture_position;
827 adjust_capture_position = 0;
831 need_butler = channels[0].playback_buf->write_space() >= channels[0].playback_buf->bufsize() / 2;
833 need_butler = channels[0].playback_buf->write_space() >= disk_io_chunk_frames
834 || channels[0].capture_buf->read_space() >= disk_io_chunk_frames;
845 AudioDiskstream::set_pending_overwrite (bool yn)
847 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
849 pending_overwrite = yn;
851 overwrite_frame = playback_sample;
852 overwrite_offset = channels.front().playback_buf->get_read_ptr();
856 AudioDiskstream::overwrite_existing_buffers ()
858 Sample* mixdown_buffer;
861 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
863 overwrite_queued = false;
865 /* assume all are the same size */
866 nframes_t size = channels[0].playback_buf->bufsize();
868 mixdown_buffer = new Sample[size];
869 gain_buffer = new float[size];
871 /* reduce size so that we can fill the buffer correctly. */
877 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
879 start = overwrite_frame;
880 nframes_t cnt = size;
882 /* to fill the buffer without resetting the playback sample, we need to
883 do it one or two chunks (normally two).
885 |----------------------------------------------------------------------|
889 |<- second chunk->||<----------------- first chunk ------------------>|
893 nframes_t to_read = size - overwrite_offset;
895 if (read ((*chan).playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
896 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
897 _id, size, playback_sample) << endmsg;
905 if (read ((*chan).playback_buf->buffer(), mixdown_buffer, gain_buffer,
906 start, cnt, *chan, n, reversed)) {
907 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
908 _id, size, playback_sample) << endmsg;
917 pending_overwrite = false;
918 delete [] gain_buffer;
919 delete [] mixdown_buffer;
924 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
926 Glib::Mutex::Lock lm (state_lock);
929 ChannelList::iterator chan;
931 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
932 (*chan).playback_buf->reset ();
933 (*chan).capture_buf->reset ();
936 /* can't rec-enable in destructive mode if transport is before start */
938 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
939 disengage_record_enable ();
942 playback_sample = frame;
945 if (complete_refill) {
946 while ((ret = do_refill_with_alloc ()) > 0) ;
948 ret = do_refill_with_alloc ();
955 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
957 ChannelList::iterator chan;
959 for (chan = channels.begin(); chan != channels.end(); ++chan) {
960 if ((*chan).playback_buf->read_space() < distance) {
968 AudioDiskstream::internal_playback_seek (nframes_t distance)
970 ChannelList::iterator chan;
972 for (chan = channels.begin(); chan != channels.end(); ++chan) {
973 (*chan).playback_buf->increment_read_ptr (distance);
976 first_recordable_frame += distance;
977 playback_sample += distance;
983 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
984 ChannelInfo& channel_info, int channel, bool reversed)
986 nframes_t this_read = 0;
988 nframes_t loop_end = 0;
989 nframes_t loop_start = 0;
990 nframes_t loop_length = 0;
991 nframes_t offset = 0;
995 /* Make the use of a Location atomic for this read operation.
997 Note: Locations don't get deleted, so all we care about
998 when I say "atomic" is that we are always pointing to
999 the same one and using a start/length values obtained
1003 if ((loc = loop_location) != 0) {
1004 loop_start = loc->start();
1005 loop_end = loc->end();
1006 loop_length = loop_end - loop_start;
1009 /* if we are looping, ensure that the first frame we read is at the correct
1010 position within the loop.
1013 if (loc && start >= loop_end) {
1014 //cerr << "start adjusted from " << start;
1015 start = loop_start + ((start - loop_start) % loop_length);
1016 //cerr << "to " << start << endl;
1018 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1023 /* take any loop into account. we can't read past the end of the loop. */
1025 if (loc && (loop_end - start < cnt)) {
1026 this_read = loop_end - start;
1027 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1034 if (this_read == 0) {
1038 this_read = min(cnt,this_read);
1040 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1041 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1046 _read_data_count = _playlist->read_data_count();
1050 /* don't adjust start, since caller has already done that
1053 swap_by_ptr (buf, buf + this_read - 1);
1057 /* if we read to the end of the loop, go back to the beginning */
1067 offset += this_read;
1074 AudioDiskstream::do_refill_with_alloc()
1076 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1077 float* gain_buf = new float[disk_io_chunk_frames];
1079 int ret = _do_refill(mix_buf, gain_buf);
1088 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1092 RingBufferNPT<Sample>::rw_vector vector;
1093 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1094 nframes_t total_space;
1095 nframes_t zero_fill;
1097 ChannelList::iterator i;
1100 assert(mixdown_buffer);
1101 assert(gain_buffer);
1103 channels.front().playback_buf->get_write_vector (&vector);
1105 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1109 /* if there are 2+ chunks of disk i/o possible for
1110 this track, let the caller know so that it can arrange
1111 for us to be called again, ASAP.
1114 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1118 /* if we're running close to normal speed and there isn't enough
1119 space to do disk_io_chunk_frames of I/O, then don't bother.
1121 at higher speeds, just do it because the sync between butler
1122 and audio thread may not be good enough.
1125 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1129 /* when slaved, don't try to get too close to the read pointer. this
1130 leaves space for the buffer reversal to have something useful to
1134 if (_slaved && total_space < (channels.front().playback_buf->bufsize() / 2)) {
1138 total_space = min (disk_io_chunk_frames, total_space);
1142 if (file_frame == 0) {
1144 /* at start: nothing to do but fill with silence */
1146 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1148 ChannelInfo& chan (*i);
1149 chan.playback_buf->get_write_vector (&vector);
1150 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1151 if (vector.len[1]) {
1152 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1154 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1159 if (file_frame < total_space) {
1161 /* too close to the start: read what we can,
1162 and then zero fill the rest
1165 zero_fill = total_space - file_frame;
1166 total_space = file_frame;
1171 /* move read position backwards because we are going
1172 to reverse the data.
1175 file_frame -= total_space;
1181 if (file_frame == max_frames) {
1183 /* at end: nothing to do but fill with silence */
1185 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1187 ChannelInfo& chan (*i);
1188 chan.playback_buf->get_write_vector (&vector);
1189 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1190 if (vector.len[1]) {
1191 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1193 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1198 if (file_frame > max_frames - total_space) {
1200 /* to close to the end: read what we can, and zero fill the rest */
1202 zero_fill = total_space - (max_frames - file_frame);
1203 total_space = max_frames - file_frame;
1210 nframes_t file_frame_tmp = 0;
1212 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1214 ChannelInfo& chan (*i);
1217 nframes_t len1, len2;
1219 chan.playback_buf->get_write_vector (&vector);
1222 file_frame_tmp = file_frame;
1225 buf1 = vector.buf[1];
1226 len1 = vector.len[1];
1227 buf2 = vector.buf[0];
1228 len2 = vector.len[0];
1230 buf1 = vector.buf[0];
1231 len1 = vector.len[0];
1232 buf2 = vector.buf[1];
1233 len2 = vector.len[1];
1237 to_read = min (ts, len1);
1238 to_read = min (to_read, disk_io_chunk_frames);
1242 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1247 chan.playback_buf->increment_write_ptr (to_read);
1251 to_read = min (ts, len2);
1256 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1257 so read some or all of vector.len[1] as well.
1260 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1265 chan.playback_buf->increment_write_ptr (to_read);
1274 file_frame = file_frame_tmp;
1281 /** Flush pending data to disk.
1283 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1284 * of data to disk. it will never write more than that. If it writes that
1285 * much and there is more than that waiting to be written, it will return 1,
1286 * otherwise 0 on success or -1 on failure.
1288 * If there is less than disk_io_chunk_frames to be written, no data will be
1289 * written at all unless @a force_flush is true.
1292 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1296 RingBufferNPT<Sample>::rw_vector vector;
1297 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1300 _write_data_count = 0;
1302 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1304 (*chan).capture_buf->get_read_vector (&vector);
1306 total = vector.len[0] + vector.len[1];
1309 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1313 /* if there are 2+ chunks of disk i/o possible for
1314 this track, let the caller know so that it can arrange
1315 for us to be called again, ASAP.
1317 if we are forcing a flush, then if there is* any* extra
1318 work, let the caller know.
1320 if we are no longer recording and there is any extra work,
1321 let the caller know too.
1324 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1328 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1330 // check the transition buffer when recording destructive
1331 // important that we get this after the capture buf
1333 if (destructive()) {
1334 (*chan).capture_transition_buf->get_read_vector(&transvec);
1335 size_t transcount = transvec.len[0] + transvec.len[1];
1336 bool have_start = false;
1339 for (ti=0; ti < transcount; ++ti) {
1340 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1342 if (captrans.type == CaptureStart) {
1343 // by definition, the first data we got above represents the given capture pos
1345 (*chan).write_source->mark_capture_start (captrans.capture_val);
1346 (*chan).curr_capture_cnt = 0;
1350 else if (captrans.type == CaptureEnd) {
1352 // capture end, the capture_val represents total frames in capture
1354 if (captrans.capture_val <= (*chan).curr_capture_cnt + to_write) {
1356 // shorten to make the write a perfect fit
1357 uint32_t nto_write = (captrans.capture_val - (*chan).curr_capture_cnt);
1359 if (nto_write < to_write) {
1360 ret = 1; // should we?
1362 to_write = nto_write;
1364 (*chan).write_source->mark_capture_end ();
1366 // increment past this transition, but go no further
1371 // actually ends just beyond this chunk, so force more work
1379 (*chan).capture_transition_buf->increment_read_ptr(ti);
1383 if ((!(*chan).write_source) || (*chan).write_source->write (vector.buf[0], to_write) != to_write) {
1384 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1388 (*chan).capture_buf->increment_read_ptr (to_write);
1389 (*chan).curr_capture_cnt += to_write;
1391 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1393 /* we wrote all of vector.len[0] but it wasn't an entire
1394 disk_io_chunk_frames of data, so arrange for some part
1395 of vector.len[1] to be flushed to disk as well.
1398 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1400 if ((*chan).write_source->write (vector.buf[1], to_write) != to_write) {
1401 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1405 _write_data_count += (*chan).write_source->write_data_count();
1407 (*chan).capture_buf->increment_read_ptr (to_write);
1408 (*chan).curr_capture_cnt += to_write;
1417 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1419 uint32_t buffer_position;
1420 bool more_work = true;
1422 boost::shared_ptr<AudioRegion> region;
1423 nframes_t total_capture;
1425 SourceList::iterator src;
1426 ChannelList::iterator chan;
1427 vector<CaptureInfo*>::iterator ci;
1429 bool mark_write_completed = false;
1431 finish_capture (true);
1433 /* butler is already stopped, but there may be work to do
1434 to flush remaining data to disk.
1437 while (more_work && !err) {
1438 switch (do_flush (Session::TransportContext, true)) {
1445 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1450 /* XXX is there anything we can do if err != 0 ? */
1451 Glib::Mutex::Lock lm (capture_info_lock);
1453 if (capture_info.empty()) {
1457 if (abort_capture) {
1459 if (destructive()) {
1463 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1465 if ((*chan).write_source) {
1467 (*chan).write_source->mark_for_remove ();
1468 (*chan).write_source->drop_references ();
1469 (*chan).write_source.reset ();
1472 /* new source set up in "out" below */
1478 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1479 total_capture += (*ci)->frames;
1482 /* figure out the name for this take */
1484 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1486 boost::shared_ptr<AudioFileSource> s = (*chan).write_source;
1490 s->update_header (capture_info.front()->start, when, twhen);
1491 s->set_captured_for (_name);
1496 /* destructive tracks have a single, never changing region */
1498 if (destructive()) {
1500 /* send a signal that any UI can pick up to do the right thing. there is
1501 a small problem here in that a UI may need the peak data to be ready
1502 for the data that was recorded and this isn't interlocked with that
1503 process. this problem is deferred to the UI.
1506 _playlist->Modified();
1510 string whole_file_region_name;
1511 whole_file_region_name = region_name_from_path (channels[0].write_source->name(), true);
1513 /* Register a new region with the Session that
1514 describes the entire source. Do this first
1515 so that any sub-regions will obviously be
1516 children of this one (later!)
1520 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, channels[0].write_source->last_capture_start_frame(), total_capture,
1521 whole_file_region_name,
1522 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1524 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1525 region->special_set_position (capture_info.front()->start);
1529 catch (failed_constructor& err) {
1530 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1534 _last_capture_regions.push_back (region);
1536 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1538 XMLNode &before = _playlist->get_state();
1539 _playlist->freeze ();
1541 for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1545 _session.region_name (region_name, whole_file_region_name, false);
1547 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1550 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1551 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1554 catch (failed_constructor& err) {
1555 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1556 continue; /* XXX is this OK? */
1559 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1561 _last_capture_regions.push_back (region);
1563 i_am_the_modifier++;
1564 _playlist->add_region (region, (*ci)->start);
1565 i_am_the_modifier--;
1567 buffer_position += (*ci)->frames;
1571 XMLNode &after = _playlist->get_state();
1572 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1575 mark_write_completed = true;
1578 reset_write_sources (mark_write_completed);
1582 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1586 capture_info.clear ();
1587 capture_start_frame = 0;
1591 AudioDiskstream::finish_capture (bool rec_monitors_input)
1593 was_recording = false;
1595 if (capture_captured == 0) {
1599 if (recordable() && destructive()) {
1600 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1602 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1603 (*chan).capture_transition_buf->get_write_vector(&transvec);
1606 if (transvec.len[0] > 0) {
1607 transvec.buf[0]->type = CaptureEnd;
1608 transvec.buf[0]->capture_val = capture_captured;
1609 (*chan).capture_transition_buf->increment_write_ptr(1);
1613 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1619 CaptureInfo* ci = new CaptureInfo;
1621 ci->start = capture_start_frame;
1622 ci->frames = capture_captured;
1624 /* XXX theoretical race condition here. Need atomic exchange ?
1625 However, the circumstances when this is called right
1626 now (either on record-disable or transport_stopped)
1627 mean that no actual race exists. I think ...
1628 We now have a capture_info_lock, but it is only to be used
1629 to synchronize in the transport_stop and the capture info
1630 accessors, so that invalidation will not occur (both non-realtime).
1633 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1635 capture_info.push_back (ci);
1636 capture_captured = 0;
1640 AudioDiskstream::set_record_enabled (bool yn)
1642 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs().get(DataType::AUDIO) == 0) {
1646 /* can't rec-enable in destructive mode if transport is before start */
1648 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1652 if (yn && channels[0].source == 0) {
1654 /* pick up connections not initiated *from* the IO object
1655 we're associated with.
1658 get_input_sources ();
1661 /* yes, i know that this not proof against race conditions, but its
1662 good enough. i think.
1665 if (record_enabled() != yn) {
1667 engage_record_enable ();
1669 disengage_record_enable ();
1675 AudioDiskstream::engage_record_enable ()
1677 bool rolling = _session.transport_speed() != 0.0f;
1679 g_atomic_int_set (&_record_enabled, 1);
1680 capturing_sources.clear ();
1681 if (Config->get_monitoring_model() == HardwareMonitoring) {
1682 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1683 if ((*chan).source) {
1684 (*chan).source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1686 capturing_sources.push_back ((*chan).write_source);
1689 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1690 capturing_sources.push_back ((*chan).write_source);
1694 RecordEnableChanged (); /* EMIT SIGNAL */
1698 AudioDiskstream::disengage_record_enable ()
1700 g_atomic_int_set (&_record_enabled, 0);
1701 if (Config->get_monitoring_model() == HardwareMonitoring) {
1702 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1703 if ((*chan).source) {
1704 (*chan).source->ensure_monitor_input (false);
1708 capturing_sources.clear ();
1709 RecordEnableChanged (); /* EMIT SIGNAL */
1714 AudioDiskstream::get_state ()
1716 XMLNode* node = new XMLNode ("AudioDiskstream");
1718 LocaleGuard lg (X_("POSIX"));
1720 node->add_property ("flags", enum_2_string (_flags));
1722 snprintf (buf, sizeof(buf), "%zd", channels.size());
1723 node->add_property ("channels", buf);
1725 node->add_property ("playlist", _playlist->name());
1727 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1728 node->add_property ("speed", buf);
1730 node->add_property("name", _name);
1731 id().print (buf, sizeof (buf));
1732 node->add_property("id", buf);
1734 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1736 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1737 XMLNode* cs_grandchild;
1739 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1740 cs_grandchild = new XMLNode (X_("file"));
1741 cs_grandchild->add_property (X_("path"), (*i)->path());
1742 cs_child->add_child_nocopy (*cs_grandchild);
1745 /* store the location where capture will start */
1749 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1750 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1752 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1755 cs_child->add_property (X_("at"), buf);
1756 node->add_child_nocopy (*cs_child);
1760 node->add_child_copy (*_extra_xml);
1767 AudioDiskstream::set_state (const XMLNode& node)
1769 const XMLProperty* prop;
1770 XMLNodeList nlist = node.children();
1771 XMLNodeIterator niter;
1772 uint32_t nchans = 1;
1773 XMLNode* capture_pending_node = 0;
1774 LocaleGuard lg (X_("POSIX"));
1776 in_set_state = true;
1778 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1779 if ((*niter)->name() == IO::state_node_name) {
1780 deprecated_io_node = new XMLNode (**niter);
1783 if ((*niter)->name() == X_("CapturingSources")) {
1784 capture_pending_node = *niter;
1788 /* prevent write sources from being created */
1790 in_set_state = true;
1792 if ((prop = node.property ("name")) != 0) {
1793 _name = prop->value();
1796 if (deprecated_io_node) {
1797 if ((prop = deprecated_io_node->property ("id")) != 0) {
1798 _id = prop->value ();
1801 if ((prop = node.property ("id")) != 0) {
1802 _id = prop->value ();
1806 if ((prop = node.property ("flags")) != 0) {
1807 _flags = Flag (string_2_enum (prop->value(), _flags));
1810 if ((prop = node.property ("channels")) != 0) {
1811 nchans = atoi (prop->value().c_str());
1814 // create necessary extra channels
1815 // we are always constructed with one and we always need one
1817 if (nchans > _n_channels.get(DataType::AUDIO)) {
1819 // we need to add new channel infos
1820 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1822 int diff = nchans - channels.size();
1824 for (int i=0; i < diff; ++i) {
1828 } else if (nchans < _n_channels.get(DataType::AUDIO)) {
1830 // we need to get rid of channels
1831 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1833 int diff = channels.size() - nchans;
1835 for (int i = 0; i < diff; ++i) {
1840 if ((prop = node.property ("playlist")) == 0) {
1845 bool had_playlist = (_playlist != 0);
1847 if (find_and_use_playlist (prop->value())) {
1851 if (!had_playlist) {
1852 _playlist->set_orig_diskstream_id (_id);
1855 if (!destructive() && capture_pending_node) {
1856 /* destructive streams have one and only one source per channel,
1857 and so they never end up in pending capture in any useful
1860 use_pending_capture_data (*capture_pending_node);
1865 if ((prop = node.property ("speed")) != 0) {
1866 double sp = atof (prop->value().c_str());
1868 if (realtime_set_speed (sp, false)) {
1869 non_realtime_set_speed ();
1873 _n_channels.set(DataType::AUDIO, channels.size());
1875 in_set_state = false;
1877 /* make sure this is clear before we do anything else */
1879 capturing_sources.clear ();
1881 /* write sources are handled when we handle the input set
1882 up of the IO that owns this DS (::non_realtime_input_change())
1885 in_set_state = false;
1891 AudioDiskstream::use_new_write_source (uint32_t n)
1893 if (!recordable()) {
1897 if (n >= channels.size()) {
1898 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1902 ChannelInfo &chan = channels[n];
1904 if (chan.write_source) {
1905 chan.write_source->set_allow_remove_if_empty (true);
1906 chan.write_source.reset ();
1910 if ((chan.write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1911 throw failed_constructor();
1915 catch (failed_constructor &err) {
1916 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1917 chan.write_source.reset ();
1921 /* do not remove destructive files even if they are empty */
1923 chan.write_source->set_allow_remove_if_empty (!destructive());
1929 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
1931 ChannelList::iterator chan;
1934 if (!recordable()) {
1938 capturing_sources.clear ();
1940 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
1941 if (!destructive()) {
1943 if ((*chan).write_source && mark_write_complete) {
1944 (*chan).write_source->mark_streaming_write_completed ();
1946 use_new_write_source (n);
1948 if (record_enabled()) {
1949 capturing_sources.push_back ((*chan).write_source);
1953 if ((*chan).write_source == 0) {
1954 use_new_write_source (n);
1959 if (destructive()) {
1961 /* we now have all our write sources set up, so create the
1962 playlist's single region.
1965 if (_playlist->empty()) {
1966 setup_destructive_playlist ();
1972 AudioDiskstream::rename_write_sources ()
1974 ChannelList::iterator chan;
1977 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
1978 if ((*chan).write_source != 0) {
1979 (*chan).write_source->set_name (_name, destructive());
1980 /* XXX what to do if one of them fails ? */
1988 AudioDiskstream::set_block_size (nframes_t nframes)
1990 if (_session.get_block_size() > speed_buffer_size) {
1991 speed_buffer_size = _session.get_block_size();
1993 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1994 if ((*chan).speed_buffer) delete [] (*chan).speed_buffer;
1995 (*chan).speed_buffer = new Sample[speed_buffer_size];
1998 allocate_temporary_buffers ();
2002 AudioDiskstream::allocate_temporary_buffers ()
2004 /* make sure the wrap buffer is at least large enough to deal
2005 with the speeds up to 1.2, to allow for micro-variation
2006 when slaving to MTC, SMPTE etc.
2009 double sp = max (fabsf (_actual_speed), 1.2f);
2010 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2012 if (required_wrap_size > wrap_buffer_size) {
2014 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2015 if ((*chan).playback_wrap_buffer) delete [] (*chan).playback_wrap_buffer;
2016 (*chan).playback_wrap_buffer = new Sample[required_wrap_size];
2017 if ((*chan).capture_wrap_buffer) delete [] (*chan).capture_wrap_buffer;
2018 (*chan).capture_wrap_buffer = new Sample[required_wrap_size];
2021 wrap_buffer_size = required_wrap_size;
2026 AudioDiskstream::monitor_input (bool yn)
2028 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2030 if ((*chan).source) {
2031 (*chan).source->ensure_monitor_input (yn);
2037 AudioDiskstream::set_align_style_from_io ()
2039 bool have_physical = false;
2045 get_input_sources ();
2047 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2048 if ((*chan).source && (*chan).source->flags() & JackPortIsPhysical) {
2049 have_physical = true;
2054 if (have_physical) {
2055 set_align_style (ExistingMaterial);
2057 set_align_style (CaptureTime);
2062 AudioDiskstream::add_channel ()
2064 /* XXX need to take lock??? */
2066 /* this copies the ChannelInfo, which currently has no buffers. kind
2067 of pointless really, but we want the channels list to contain
2068 actual objects, not pointers to objects. mostly for convenience,
2069 which isn't much in evidence.
2072 channels.push_back (ChannelInfo());
2074 /* now allocate the buffers */
2076 channels.back().init (_session.diskstream_buffer_size(),
2080 _n_channels.set(DataType::AUDIO, channels.size());
2086 AudioDiskstream::remove_channel ()
2088 if (channels.size() > 1) {
2089 /* XXX need to take lock??? */
2090 channels.back().release ();
2091 channels.pop_back();
2092 _n_channels.set(DataType::AUDIO, channels.size());
2100 AudioDiskstream::playback_buffer_load () const
2102 return (float) ((double) channels.front().playback_buf->read_space()/
2103 (double) channels.front().playback_buf->bufsize());
2107 AudioDiskstream::capture_buffer_load () const
2109 return (float) ((double) channels.front().capture_buf->write_space()/
2110 (double) channels.front().capture_buf->bufsize());
2114 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2116 const XMLProperty* prop;
2117 XMLNodeList nlist = node.children();
2118 XMLNodeIterator niter;
2119 boost::shared_ptr<AudioFileSource> fs;
2120 boost::shared_ptr<AudioFileSource> first_fs;
2121 SourceList pending_sources;
2124 if ((prop = node.property (X_("at"))) == 0) {
2128 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2132 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2133 if ((*niter)->name() == X_("file")) {
2135 if ((prop = (*niter)->property (X_("path"))) == 0) {
2140 fs = boost::dynamic_pointer_cast<AudioFileSource> (
2141 SourceFactory::createWritable (DataType::AUDIO, _session, prop->value(), false, _session.frame_rate()));
2144 catch (failed_constructor& err) {
2145 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2146 _name, prop->value())
2151 pending_sources.push_back (fs);
2153 if (first_fs == 0) {
2157 fs->set_captured_for (_name);
2161 if (pending_sources.size() == 0) {
2162 /* nothing can be done */
2166 if (pending_sources.size() != _n_channels.get(DataType::AUDIO)) {
2167 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2172 boost::shared_ptr<AudioRegion> region;
2175 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2176 region_name_from_path (first_fs->name(), true),
2177 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2178 region->special_set_position (0);
2181 catch (failed_constructor& err) {
2182 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2190 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2193 catch (failed_constructor& err) {
2194 error << string_compose (_("%1: cannot create region from pending capture sources"),
2201 _playlist->add_region (region, position);
2207 AudioDiskstream::set_destructive (bool yn)
2209 bool bounce_ignored;
2211 if (yn != destructive()) {
2214 /* requestor should already have checked this and
2215 bounced if necessary and desired
2217 if (!can_become_destructive (bounce_ignored)) {
2220 _flags = Flag (_flags | Destructive);
2221 use_destructive_playlist ();
2223 _flags = Flag (_flags & ~Destructive);
2224 reset_write_sources (true, true);
2232 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2235 requires_bounce = false;
2239 /* is there only one region ? */
2241 if (_playlist->n_regions() != 1) {
2242 requires_bounce = true;
2246 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2249 /* do the source(s) for the region cover the session start position ? */
2251 if (first->position() != _session.current_start_frame()) {
2252 if (first->start() > _session.current_start_frame()) {
2253 requires_bounce = true;
2258 /* is the source used by only 1 playlist ? */
2260 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2264 if (afirst->source()->used() > 1) {
2265 requires_bounce = true;
2269 requires_bounce = false;
2273 AudioDiskstream::ChannelInfo::ChannelInfo ()
2275 playback_wrap_buffer = 0;
2276 capture_wrap_buffer = 0;
2280 current_capture_buffer = 0;
2281 current_playback_buffer = 0;
2282 curr_capture_cnt = 0;
2285 capture_transition_buf = 0;
2289 AudioDiskstream::ChannelInfo::init (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2291 speed_buffer = new Sample[speed_size];
2292 playback_wrap_buffer = new Sample[wrap_size];
2293 capture_wrap_buffer = new Sample[wrap_size];
2295 playback_buf = new RingBufferNPT<Sample> (bufsize);
2296 capture_buf = new RingBufferNPT<Sample> (bufsize);
2297 capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
2299 /* touch the ringbuffer buffers, which will cause
2300 them to be mapped into locked physical RAM if
2301 we're running with mlockall(). this doesn't do
2305 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2306 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2307 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2310 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2315 AudioDiskstream::ChannelInfo::release ()
2318 write_source.reset ();
2322 delete [] speed_buffer;
2326 if (playback_wrap_buffer) {
2327 delete [] playback_wrap_buffer;
2328 playback_wrap_buffer = 0;
2331 if (capture_wrap_buffer) {
2332 delete [] capture_wrap_buffer;
2333 capture_wrap_buffer = 0;
2337 delete playback_buf;
2346 if (capture_transition_buf) {
2347 delete capture_transition_buf;
2348 capture_transition_buf = 0;