2 Copyright (C) 2000-2006 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
33 #include <pbd/error.h>
34 #include <pbd/basename.h>
35 #include <glibmm/thread.h>
36 #include <pbd/xml++.h>
37 #include <pbd/memento_command.h>
39 #include <ardour/ardour.h>
40 #include <ardour/audioengine.h>
41 #include <ardour/audio_diskstream.h>
42 #include <ardour/utils.h>
43 #include <ardour/configuration.h>
44 #include <ardour/audiofilesource.h>
45 #include <ardour/destructive_filesource.h>
46 #include <ardour/send.h>
47 #include <ardour/audioplaylist.h>
48 #include <ardour/cycle_timer.h>
49 #include <ardour/audioregion.h>
50 #include <ardour/audio_port.h>
56 using namespace ARDOUR;
59 size_t AudioDiskstream::_working_buffers_size = 0;
60 Sample* AudioDiskstream::_mixdown_buffer = 0;
61 gain_t* AudioDiskstream::_gain_buffer = 0;
63 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
64 : Diskstream(sess, name, flag)
65 , deprecated_io_node(NULL)
67 /* prevent any write sources from being created */
76 DiskstreamCreated (this); /* EMIT SIGNAL */
79 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
80 : Diskstream(sess, node)
81 , deprecated_io_node(NULL)
86 if (set_state (node)) {
88 throw failed_constructor();
94 use_destructive_playlist ();
97 DiskstreamCreated (this); /* EMIT SIGNAL */
101 AudioDiskstream::init_channel (ChannelInfo &chan)
103 chan.playback_wrap_buffer = 0;
104 chan.capture_wrap_buffer = 0;
105 chan.speed_buffer = 0;
106 chan.peak_power = 0.0f;
107 chan.write_source = 0;
109 chan.current_capture_buffer = 0;
110 chan.current_playback_buffer = 0;
111 chan.curr_capture_cnt = 0;
113 chan.playback_buf = new RingBufferNPT<Sample> (_session.diskstream_buffer_size());
114 chan.capture_buf = new RingBufferNPT<Sample> (_session.diskstream_buffer_size());
115 chan.capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
118 /* touch the ringbuffer buffers, which will cause
119 them to be mapped into locked physical RAM if
120 we're running with mlockall(). this doesn't do
123 memset (chan.playback_buf->buffer(), 0, sizeof (Sample) * chan.playback_buf->bufsize());
124 memset (chan.capture_buf->buffer(), 0, sizeof (Sample) * chan.capture_buf->bufsize());
125 memset (chan.capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * chan.capture_transition_buf->bufsize());
130 AudioDiskstream::init (Diskstream::Flag f)
134 /* there are no channels at this point, so these
135 two calls just get speed_buffer_size and wrap_buffer
136 size setup without duplicating their code.
139 set_block_size (_session.get_block_size());
140 allocate_temporary_buffers ();
143 assert(_n_channels == 1);
147 AudioDiskstream::destroy_channel (ChannelInfo &chan)
149 if (chan.write_source) {
150 chan.write_source->release ();
151 chan.write_source = 0;
154 if (chan.speed_buffer) {
155 delete [] chan.speed_buffer;
158 if (chan.playback_wrap_buffer) {
159 delete [] chan.playback_wrap_buffer;
161 if (chan.capture_wrap_buffer) {
162 delete [] chan.capture_wrap_buffer;
165 delete chan.playback_buf;
166 delete chan.capture_buf;
167 delete chan.capture_transition_buf;
169 chan.playback_buf = 0;
170 chan.capture_buf = 0;
173 AudioDiskstream::~AudioDiskstream ()
175 Glib::Mutex::Lock lm (state_lock);
177 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan)
178 destroy_channel((*chan));
184 AudioDiskstream::allocate_working_buffers()
186 assert(disk_io_frames() > 0);
188 _working_buffers_size = disk_io_frames();
189 _mixdown_buffer = new Sample[_working_buffers_size];
190 _gain_buffer = new gain_t[_working_buffers_size];
194 AudioDiskstream::free_working_buffers()
196 delete _mixdown_buffer;
198 _working_buffers_size = 0;
204 AudioDiskstream::non_realtime_input_change ()
207 Glib::Mutex::Lock lm (state_lock);
209 if (input_change_pending == NoChange) {
213 if (input_change_pending & ConfigurationChanged) {
215 if (_io->n_inputs() > _n_channels) {
217 // we need to add new channel infos
219 int diff = _io->n_inputs() - channels.size();
221 for (int i = 0; i < diff; ++i) {
225 } else if (_io->n_inputs() < _n_channels) {
227 // we need to get rid of channels
229 int diff = channels.size() - _io->n_inputs();
231 for (int i = 0; i < diff; ++i) {
237 get_input_sources ();
238 set_capture_offset ();
240 if (first_input_change) {
241 set_align_style (_persistent_alignment_style);
242 first_input_change = false;
244 set_align_style_from_io ();
247 input_change_pending = NoChange;
250 /* reset capture files */
252 reset_write_sources (false);
254 /* now refill channel buffers */
256 if (speed() != 1.0f || speed() != -1.0f) {
257 seek ((jack_nframes_t) (_session.transport_frame() * (double) speed()));
260 seek (_session.transport_frame());
265 AudioDiskstream::get_input_sources ()
267 uint32_t ni = _io->n_inputs();
269 for (uint32_t n = 0; n < ni; ++n) {
271 const char **connections = _io->input(n)->get_connections ();
272 ChannelInfo& chan = channels[n];
274 if (connections == 0 || connections[0] == 0) {
277 // _source->disable_metering ();
283 chan.source = _session.engine().get_port_by_name (connections[0]);
293 AudioDiskstream::find_and_use_playlist (const string& name)
296 AudioPlaylist* playlist;
298 if ((pl = _session.playlist_by_name (name)) == 0) {
299 playlist = new AudioPlaylist(_session, name);
303 if ((playlist = dynamic_cast<AudioPlaylist*> (pl)) == 0) {
304 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
308 return use_playlist (playlist);
312 AudioDiskstream::use_playlist (Playlist* playlist)
314 assert(dynamic_cast<AudioPlaylist*>(playlist));
316 Diskstream::use_playlist(playlist);
322 AudioDiskstream::use_new_playlist ()
325 AudioPlaylist* playlist;
327 if (!in_set_state && destructive()) {
332 newname = Playlist::bump_name (_playlist->name(), _session);
334 newname = Playlist::bump_name (_name, _session);
337 if ((playlist = new AudioPlaylist (_session, newname, hidden())) != 0) {
338 playlist->set_orig_diskstream_id (id());
339 return use_playlist (playlist);
346 AudioDiskstream::use_copy_playlist ()
348 assert(audio_playlist());
354 if (_playlist == 0) {
355 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
360 AudioPlaylist* playlist;
362 newname = Playlist::bump_name (_playlist->name(), _session);
364 if ((playlist = new AudioPlaylist (*audio_playlist(), newname)) != 0) {
365 playlist->set_orig_diskstream_id (id());
366 return use_playlist (playlist);
373 AudioDiskstream::setup_destructive_playlist ()
375 AudioRegion::SourceList srcs;
377 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
378 srcs.push_back ((*chan).write_source);
381 /* a single full-sized region */
383 cerr << "setup DS using " << srcs.front()->natural_position () << endl;
385 AudioRegion* region = new AudioRegion (srcs, 0, max_frames, _name);
386 _playlist->add_region (*region, srcs.front()->natural_position());
390 AudioDiskstream::use_destructive_playlist ()
392 /* use the sources associated with the single full-extent region */
394 Playlist::RegionList* rl = _playlist->regions_at (0);
397 reset_write_sources (false, true);
401 AudioRegion* region = dynamic_cast<AudioRegion*> (rl->front());
404 throw failed_constructor();
410 ChannelList::iterator chan;
412 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
413 (*chan).write_source = dynamic_cast<AudioFileSource*>(®ion->source (n));
414 assert((*chan).write_source);
415 (*chan).write_source->set_allow_remove_if_empty (false);
418 /* the source list will never be reset for a destructive track */
422 AudioDiskstream::check_record_status (jack_nframes_t transport_frame, jack_nframes_t nframes, bool can_record)
424 int possibly_recording;
427 const int transport_rolling = 0x4;
428 const int track_rec_enabled = 0x2;
429 const int global_rec_enabled = 0x1;
431 /* merge together the 3 factors that affect record status, and compute
435 rolling = _session.transport_speed() != 0.0f;
436 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
437 change = possibly_recording ^ last_possibly_recording;
439 if (possibly_recording == last_possibly_recording) {
445 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
447 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
448 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
450 /* starting to record: compute first+last frames */
452 first_recordable_frame = transport_frame + _capture_offset;
453 last_recordable_frame = max_frames;
454 capture_start_frame = transport_frame;
456 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
458 /* was stopped, now rolling (and recording) */
460 if (_alignment_style == ExistingMaterial) {
461 first_recordable_frame += _session.worst_output_latency();
463 first_recordable_frame += _roll_delay;
468 /* was rolling, but record state changed */
470 if (_alignment_style == ExistingMaterial) {
473 if (!_session.get_punch_in()) {
475 /* manual punch in happens at the correct transport frame
476 because the user hit a button. but to get alignment correct
477 we have to back up the position of the new region to the
478 appropriate spot given the roll delay.
481 capture_start_frame -= _roll_delay;
483 /* XXX paul notes (august 2005): i don't know why
487 first_recordable_frame += _capture_offset;
491 /* autopunch toggles recording at the precise
492 transport frame, and then the DS waits
493 to start recording for a time that depends
494 on the output latency.
497 first_recordable_frame += _session.worst_output_latency();
502 if (_session.get_punch_in()) {
503 first_recordable_frame += _roll_delay;
505 capture_start_frame -= _roll_delay;
511 if (_flags & Recordable) {
512 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
514 RingBufferNPT<CaptureTransition>::rw_vector transvec;
515 (*chan).capture_transition_buf->get_write_vector(&transvec);
517 if (transvec.len[0] > 0) {
518 transvec.buf[0]->type = CaptureStart;
519 transvec.buf[0]->capture_val = capture_start_frame;
520 (*chan).capture_transition_buf->increment_write_ptr(1);
524 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
530 } else if (!record_enabled() || !can_record) {
534 last_recordable_frame = transport_frame + _capture_offset;
536 if (_alignment_style == ExistingMaterial) {
537 last_recordable_frame += _session.worst_output_latency();
539 last_recordable_frame += _roll_delay;
543 last_possibly_recording = possibly_recording;
547 AudioDiskstream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jack_nframes_t offset, bool can_record, bool rec_monitors_input)
550 ChannelList::iterator c;
552 jack_nframes_t rec_offset = 0;
553 jack_nframes_t rec_nframes = 0;
554 bool nominally_recording;
555 bool re = record_enabled ();
556 bool collect_playback = false;
558 /* if we've already processed the frames corresponding to this call,
559 just return. this allows multiple routes that are taking input
560 from this diskstream to call our ::process() method, but have
561 this stuff only happen once. more commonly, it allows both
562 the AudioTrack that is using this AudioDiskstream *and* the Session
563 to call process() without problems.
570 check_record_status (transport_frame, nframes, can_record);
572 nominally_recording = (can_record && re);
579 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
580 must always be called as a pair. The only exception is if this function
581 returns a non-zero value, in which case, ::commit should not be called.
584 // If we can't take the state lock return.
585 if (!state_lock.trylock()) {
589 adjust_capture_position = 0;
591 for (c = channels.begin(); c != channels.end(); ++c) {
592 (*c).current_capture_buffer = 0;
593 (*c).current_playback_buffer = 0;
596 if (nominally_recording || (_session.get_record_enabled() && _session.get_punch_in())) {
599 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
606 case OverlapInternal:
607 /* ---------- recrange
610 rec_nframes = nframes;
615 /* |--------| recrange
618 rec_nframes = transport_frame + nframes - first_recordable_frame;
620 rec_offset = first_recordable_frame - transport_frame;
625 /* |--------| recrange
628 rec_nframes = last_recordable_frame - transport_frame;
632 case OverlapExternal:
633 /* |--------| recrange
634 -------------- transrange
636 rec_nframes = last_recordable_frame - last_recordable_frame;
637 rec_offset = first_recordable_frame - transport_frame;
641 if (rec_nframes && !was_recording) {
642 capture_captured = 0;
643 was_recording = true;
648 if (can_record && !_last_capture_regions.empty()) {
649 _last_capture_regions.clear ();
652 if (nominally_recording || rec_nframes) {
654 for (n = 0, c = channels.begin(); c != channels.end(); ++c, ++n) {
656 ChannelInfo& chan (*c);
658 chan.capture_buf->get_write_vector (&chan.capture_vector);
660 if (rec_nframes <= chan.capture_vector.len[0]) {
662 chan.current_capture_buffer = chan.capture_vector.buf[0];
664 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
668 AudioPort* const ap = _io->audio_input(n);
670 assert(rec_nframes <= ap->get_audio_buffer().capacity());
672 memcpy (chan.current_capture_buffer, ap->get_audio_buffer().data(rec_nframes, offset + rec_offset), sizeof (Sample) * rec_nframes);
676 jack_nframes_t total = chan.capture_vector.len[0] + chan.capture_vector.len[1];
678 if (rec_nframes > total) {
683 AudioPort* const ap = _io->audio_input(n);
686 Sample* buf = ap->get_audio_buffer().data(nframes, offset);
687 jack_nframes_t first = chan.capture_vector.len[0];
689 memcpy (chan.capture_wrap_buffer, buf, sizeof (Sample) * first);
690 memcpy (chan.capture_vector.buf[0], buf, sizeof (Sample) * first);
691 memcpy (chan.capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
692 memcpy (chan.capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
694 chan.current_capture_buffer = chan.capture_wrap_buffer;
701 finish_capture (rec_monitors_input);
708 /* data will be written to disk */
710 if (rec_nframes == nframes && rec_offset == 0) {
712 for (c = channels.begin(); c != channels.end(); ++c) {
713 (*c).current_playback_buffer = (*c).current_capture_buffer;
716 playback_distance = nframes;
721 /* we can't use the capture buffer as the playback buffer, because
722 we recorded only a part of the current process' cycle data
726 collect_playback = true;
729 adjust_capture_position = rec_nframes;
731 } else if (nominally_recording) {
733 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
735 for (c = channels.begin(); c != channels.end(); ++c) {
736 (*c).current_playback_buffer = (*c).current_capture_buffer;
739 playback_distance = nframes;
743 collect_playback = true;
746 if (collect_playback) {
748 /* we're doing playback */
750 jack_nframes_t necessary_samples;
752 /* no varispeed playback if we're recording, because the output .... TBD */
754 if (rec_nframes == 0 && _actual_speed != 1.0f) {
755 necessary_samples = (jack_nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
757 necessary_samples = nframes;
760 for (c = channels.begin(); c != channels.end(); ++c) {
761 (*c).playback_buf->get_read_vector (&(*c).playback_vector);
766 for (c = channels.begin(); c != channels.end(); ++c, ++n) {
768 ChannelInfo& chan (*c);
770 if (necessary_samples <= chan.playback_vector.len[0]) {
772 chan.current_playback_buffer = chan.playback_vector.buf[0];
775 jack_nframes_t total = chan.playback_vector.len[0] + chan.playback_vector.len[1];
777 if (necessary_samples > total) {
783 memcpy ((char *) chan.playback_wrap_buffer, chan.playback_vector.buf[0],
784 chan.playback_vector.len[0] * sizeof (Sample));
785 memcpy (chan.playback_wrap_buffer + chan.playback_vector.len[0], chan.playback_vector.buf[1],
786 (necessary_samples - chan.playback_vector.len[0]) * sizeof (Sample));
788 chan.current_playback_buffer = chan.playback_wrap_buffer;
793 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
795 uint64_t phase = last_phase;
796 jack_nframes_t i = 0;
798 // Linearly interpolate into the alt buffer
799 // using 40.24 fixp maths (swh)
801 for (c = channels.begin(); c != channels.end(); ++c) {
804 ChannelInfo& chan (*c);
809 for (jack_nframes_t outsample = 0; outsample < nframes; ++outsample) {
811 fr = (phase & 0xFFFFFF) / 16777216.0f;
812 chan.speed_buffer[outsample] =
813 chan.current_playback_buffer[i] * (1.0f - fr) +
814 chan.current_playback_buffer[i+1] * fr;
818 chan.current_playback_buffer = chan.speed_buffer;
821 playback_distance = i + 1;
822 last_phase = (phase & 0xFFFFFF);
825 playback_distance = nframes;
837 /* we're exiting with failure, so ::commit will not
838 be called. unlock the state lock.
848 AudioDiskstream::commit (jack_nframes_t nframes)
850 bool need_butler = false;
852 if (_actual_speed < 0.0) {
853 playback_sample -= playback_distance;
855 playback_sample += playback_distance;
858 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
860 (*chan).playback_buf->increment_read_ptr (playback_distance);
862 if (adjust_capture_position) {
863 (*chan).capture_buf->increment_write_ptr (adjust_capture_position);
867 if (adjust_capture_position != 0) {
868 capture_captured += adjust_capture_position;
869 adjust_capture_position = 0;
873 need_butler = channels[0].playback_buf->write_space() >= channels[0].playback_buf->bufsize() / 2;
875 need_butler = channels[0].playback_buf->write_space() >= disk_io_chunk_frames
876 || channels[0].capture_buf->read_space() >= disk_io_chunk_frames;
887 AudioDiskstream::set_pending_overwrite (bool yn)
889 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
891 pending_overwrite = yn;
893 overwrite_frame = playback_sample;
894 overwrite_offset = channels.front().playback_buf->get_read_ptr();
898 AudioDiskstream::overwrite_existing_buffers ()
900 Sample* mixdown_buffer;
903 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
905 overwrite_queued = false;
907 /* assume all are the same size */
908 jack_nframes_t size = channels[0].playback_buf->bufsize();
910 mixdown_buffer = new Sample[size];
911 gain_buffer = new float[size];
913 /* reduce size so that we can fill the buffer correctly. */
917 jack_nframes_t start;
919 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
921 start = overwrite_frame;
922 jack_nframes_t cnt = size;
924 /* to fill the buffer without resetting the playback sample, we need to
925 do it one or two chunks (normally two).
927 |----------------------------------------------------------------------|
931 |<- second chunk->||<----------------- first chunk ------------------>|
935 jack_nframes_t to_read = size - overwrite_offset;
937 if (read ((*chan).playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
938 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
939 _id, size, playback_sample) << endmsg;
947 if (read ((*chan).playback_buf->buffer(), mixdown_buffer, gain_buffer,
948 start, cnt, *chan, n, reversed)) {
949 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
950 _id, size, playback_sample) << endmsg;
959 pending_overwrite = false;
960 delete [] gain_buffer;
961 delete [] mixdown_buffer;
966 AudioDiskstream::seek (jack_nframes_t frame, bool complete_refill)
968 Glib::Mutex::Lock lm (state_lock);
971 ChannelList::iterator chan;
973 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
974 (*chan).playback_buf->reset ();
975 (*chan).capture_buf->reset ();
978 /* can't rec-enable in destructive mode if transport is before start */
980 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
981 disengage_record_enable ();
984 playback_sample = frame;
987 if (complete_refill) {
988 while ((ret = do_refill_with_alloc ()) > 0) ;
990 ret = do_refill_with_alloc ();
997 AudioDiskstream::can_internal_playback_seek (jack_nframes_t distance)
999 ChannelList::iterator chan;
1001 for (chan = channels.begin(); chan != channels.end(); ++chan) {
1002 if ((*chan).playback_buf->read_space() < distance) {
1010 AudioDiskstream::internal_playback_seek (jack_nframes_t distance)
1012 ChannelList::iterator chan;
1014 for (chan = channels.begin(); chan != channels.end(); ++chan) {
1015 (*chan).playback_buf->increment_read_ptr (distance);
1018 first_recordable_frame += distance;
1019 playback_sample += distance;
1025 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, jack_nframes_t& start, jack_nframes_t cnt,
1026 ChannelInfo& channel_info, int channel, bool reversed)
1028 jack_nframes_t this_read = 0;
1029 bool reloop = false;
1030 jack_nframes_t loop_end = 0;
1031 jack_nframes_t loop_start = 0;
1032 jack_nframes_t loop_length = 0;
1033 jack_nframes_t offset = 0;
1037 /* Make the use of a Location atomic for this read operation.
1039 Note: Locations don't get deleted, so all we care about
1040 when I say "atomic" is that we are always pointing to
1041 the same one and using a start/length values obtained
1045 if ((loc = loop_location) != 0) {
1046 loop_start = loc->start();
1047 loop_end = loc->end();
1048 loop_length = loop_end - loop_start;
1051 /* if we are looping, ensure that the first frame we read is at the correct
1052 position within the loop.
1055 if (loc && start >= loop_end) {
1056 //cerr << "start adjusted from " << start;
1057 start = loop_start + ((start - loop_start) % loop_length);
1058 //cerr << "to " << start << endl;
1060 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1065 /* take any loop into account. we can't read past the end of the loop. */
1067 if (loc && (loop_end - start < cnt)) {
1068 this_read = loop_end - start;
1069 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1076 if (this_read == 0) {
1080 this_read = min(cnt,this_read);
1082 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1083 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1088 _read_data_count = _playlist->read_data_count();
1092 /* don't adjust start, since caller has already done that
1095 swap_by_ptr (buf, buf + this_read - 1);
1099 /* if we read to the end of the loop, go back to the beginning */
1109 offset += this_read;
1116 AudioDiskstream::do_refill_with_alloc()
1118 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1119 float* gain_buf = new float[disk_io_chunk_frames];
1121 int ret = _do_refill(mix_buf, gain_buf);
1130 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1133 jack_nframes_t to_read;
1134 RingBufferNPT<Sample>::rw_vector vector;
1135 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1136 jack_nframes_t total_space;
1137 jack_nframes_t zero_fill;
1139 ChannelList::iterator i;
1142 assert(mixdown_buffer);
1143 assert(gain_buffer);
1145 channels.front().playback_buf->get_write_vector (&vector);
1147 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1151 /* if there are 2+ chunks of disk i/o possible for
1152 this track, let the caller know so that it can arrange
1153 for us to be called again, ASAP.
1156 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1160 /* if we're running close to normal speed and there isn't enough
1161 space to do disk_io_chunk_frames of I/O, then don't bother.
1163 at higher speeds, just do it because the sync between butler
1164 and audio thread may not be good enough.
1167 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1171 /* when slaved, don't try to get too close to the read pointer. this
1172 leaves space for the buffer reversal to have something useful to
1176 if (_slaved && total_space < (channels.front().playback_buf->bufsize() / 2)) {
1180 total_space = min (disk_io_chunk_frames, total_space);
1184 if (file_frame == 0) {
1186 /* at start: nothing to do but fill with silence */
1188 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1190 ChannelInfo& chan (*i);
1191 chan.playback_buf->get_write_vector (&vector);
1192 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1193 if (vector.len[1]) {
1194 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1196 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1201 if (file_frame < total_space) {
1203 /* too close to the start: read what we can,
1204 and then zero fill the rest
1207 zero_fill = total_space - file_frame;
1208 total_space = file_frame;
1213 /* move read position backwards because we are going
1214 to reverse the data.
1217 file_frame -= total_space;
1223 if (file_frame == max_frames) {
1225 /* at end: nothing to do but fill with silence */
1227 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1229 ChannelInfo& chan (*i);
1230 chan.playback_buf->get_write_vector (&vector);
1231 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1232 if (vector.len[1]) {
1233 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1235 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1240 if (file_frame > max_frames - total_space) {
1242 /* to close to the end: read what we can, and zero fill the rest */
1244 zero_fill = total_space - (max_frames - file_frame);
1245 total_space = max_frames - file_frame;
1252 jack_nframes_t file_frame_tmp = 0;
1254 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1256 ChannelInfo& chan (*i);
1259 jack_nframes_t len1, len2;
1261 chan.playback_buf->get_write_vector (&vector);
1264 file_frame_tmp = file_frame;
1267 buf1 = vector.buf[1];
1268 len1 = vector.len[1];
1269 buf2 = vector.buf[0];
1270 len2 = vector.len[0];
1272 buf1 = vector.buf[0];
1273 len1 = vector.len[0];
1274 buf2 = vector.buf[1];
1275 len2 = vector.len[1];
1279 to_read = min (ts, len1);
1280 to_read = min (to_read, disk_io_chunk_frames);
1284 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1289 chan.playback_buf->increment_write_ptr (to_read);
1293 to_read = min (ts, len2);
1298 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1299 so read some or all of vector.len[1] as well.
1302 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1307 chan.playback_buf->increment_write_ptr (to_read);
1316 file_frame = file_frame_tmp;
1323 /** Flush pending data to disk.
1325 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1326 * of data to disk. it will never write more than that. If it writes that
1327 * much and there is more than that waiting to be written, it will return 1,
1328 * otherwise 0 on success or -1 on failure.
1330 * If there is less than disk_io_chunk_frames to be written, no data will be
1331 * written at all unless @a force_flush is true.
1334 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1338 RingBufferNPT<Sample>::rw_vector vector;
1339 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1340 jack_nframes_t total;
1342 _write_data_count = 0;
1344 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1346 (*chan).capture_buf->get_read_vector (&vector);
1348 total = vector.len[0] + vector.len[1];
1351 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1355 /* if there are 2+ chunks of disk i/o possible for
1356 this track, let the caller know so that it can arrange
1357 for us to be called again, ASAP.
1359 if we are forcing a flush, then if there is* any* extra
1360 work, let the caller know.
1362 if we are no longer recording and there is any extra work,
1363 let the caller know too.
1366 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1370 to_write = min (disk_io_chunk_frames, (jack_nframes_t) vector.len[0]);
1372 // check the transition buffer when recording destructive
1373 // important that we get this after the capture buf
1375 if (destructive()) {
1376 (*chan).capture_transition_buf->get_read_vector(&transvec);
1377 size_t transcount = transvec.len[0] + transvec.len[1];
1378 bool have_start = false;
1381 for (ti=0; ti < transcount; ++ti) {
1382 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1384 if (captrans.type == CaptureStart) {
1385 // by definition, the first data we got above represents the given capture pos
1387 (*chan).write_source->mark_capture_start (captrans.capture_val);
1388 (*chan).curr_capture_cnt = 0;
1392 else if (captrans.type == CaptureEnd) {
1394 // capture end, the capture_val represents total frames in capture
1396 if (captrans.capture_val <= (*chan).curr_capture_cnt + to_write) {
1398 // shorten to make the write a perfect fit
1399 uint32_t nto_write = (captrans.capture_val - (*chan).curr_capture_cnt);
1401 if (nto_write < to_write) {
1402 ret = 1; // should we?
1404 to_write = nto_write;
1406 (*chan).write_source->mark_capture_end ();
1408 // increment past this transition, but go no further
1413 // actually ends just beyond this chunk, so force more work
1421 (*chan).capture_transition_buf->increment_read_ptr(ti);
1425 if ((!(*chan).write_source) || (*chan).write_source->write (vector.buf[0], to_write) != to_write) {
1426 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1430 (*chan).capture_buf->increment_read_ptr (to_write);
1431 (*chan).curr_capture_cnt += to_write;
1433 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1435 /* we wrote all of vector.len[0] but it wasn't an entire
1436 disk_io_chunk_frames of data, so arrange for some part
1437 of vector.len[1] to be flushed to disk as well.
1440 to_write = min ((jack_nframes_t)(disk_io_chunk_frames - to_write), (jack_nframes_t) vector.len[1]);
1442 if ((*chan).write_source->write (vector.buf[1], to_write) != to_write) {
1443 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1447 _write_data_count += (*chan).write_source->write_data_count();
1449 (*chan).capture_buf->increment_read_ptr (to_write);
1450 (*chan).curr_capture_cnt += to_write;
1459 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1461 uint32_t buffer_position;
1462 bool more_work = true;
1464 AudioRegion* region = 0;
1465 jack_nframes_t total_capture;
1466 AudioRegion::SourceList srcs;
1467 AudioRegion::SourceList::iterator src;
1468 ChannelList::iterator chan;
1469 vector<CaptureInfo*>::iterator ci;
1471 bool mark_write_completed = false;
1473 finish_capture (true);
1475 /* butler is already stopped, but there may be work to do
1476 to flush remaining data to disk.
1479 while (more_work && !err) {
1480 switch (do_flush (Session::TransportContext, true)) {
1487 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1492 /* XXX is there anything we can do if err != 0 ? */
1493 Glib::Mutex::Lock lm (capture_info_lock);
1495 if (capture_info.empty()) {
1499 if (abort_capture) {
1501 ChannelList::iterator chan;
1503 list<Source*>* deletion_list = new list<Source*>;
1505 for ( chan = channels.begin(); chan != channels.end(); ++chan) {
1507 if ((*chan).write_source) {
1509 (*chan).write_source->mark_for_remove ();
1510 (*chan).write_source->release ();
1512 deletion_list->push_back ((*chan).write_source);
1514 (*chan).write_source = 0;
1517 /* new source set up in "out" below */
1520 if (!deletion_list->empty()) {
1521 DeleteSources (deletion_list);
1523 delete deletion_list;
1529 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1530 total_capture += (*ci)->frames;
1533 /* figure out the name for this take */
1535 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1537 AudioFileSource* s = (*chan).write_source;
1541 AudioFileSource* fsrc;
1545 if ((fsrc = dynamic_cast<AudioFileSource *>(s)) != 0) {
1546 cerr << "updating source after capture\n";
1547 fsrc->update_header (capture_info.front()->start, when, twhen);
1550 s->set_captured_for (_name);
1555 /* destructive tracks have a single, never changing region */
1557 if (destructive()) {
1559 /* send a signal that any UI can pick up to do the right thing. there is
1560 a small problem here in that a UI may need the peak data to be ready
1561 for the data that was recorded and this isn't interlocked with that
1562 process. this problem is deferred to the UI.
1565 _playlist->Modified();
1569 /* Register a new region with the Session that
1570 describes the entire source. Do this first
1571 so that any sub-regions will obviously be
1572 children of this one (later!)
1576 region = new AudioRegion (srcs, channels[0].write_source->last_capture_start_frame(), total_capture,
1577 region_name_from_path (channels[0].write_source->name()),
1578 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile));
1580 region->special_set_position (capture_info.front()->start);
1584 catch (failed_constructor& err) {
1585 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1589 _last_capture_regions.push_back (region);
1591 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1593 XMLNode &before = _playlist->get_state();
1594 _playlist->freeze ();
1596 for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1599 _session.region_name (region_name, channels[0].write_source->name(), false);
1601 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1604 region = new AudioRegion (srcs, buffer_position, (*ci)->frames, region_name);
1607 catch (failed_constructor& err) {
1608 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1609 continue; /* XXX is this OK? */
1612 _last_capture_regions.push_back (region);
1614 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1616 i_am_the_modifier++;
1617 _playlist->add_region (*region, (*ci)->start);
1618 i_am_the_modifier--;
1620 buffer_position += (*ci)->frames;
1624 XMLNode &after = _playlist->get_state();
1625 _session.add_command (new MementoCommand<Playlist>(*_playlist, before, after));
1628 mark_write_completed = true;
1630 reset_write_sources (mark_write_completed);
1633 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1637 capture_info.clear ();
1638 capture_start_frame = 0;
1642 AudioDiskstream::finish_capture (bool rec_monitors_input)
1644 was_recording = false;
1646 if (capture_captured == 0) {
1650 if (recordable() && destructive()) {
1651 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1653 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1654 (*chan).capture_transition_buf->get_write_vector(&transvec);
1657 if (transvec.len[0] > 0) {
1658 transvec.buf[0]->type = CaptureEnd;
1659 transvec.buf[0]->capture_val = capture_captured;
1660 (*chan).capture_transition_buf->increment_write_ptr(1);
1664 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1670 CaptureInfo* ci = new CaptureInfo;
1672 ci->start = capture_start_frame;
1673 ci->frames = capture_captured;
1675 /* XXX theoretical race condition here. Need atomic exchange ?
1676 However, the circumstances when this is called right
1677 now (either on record-disable or transport_stopped)
1678 mean that no actual race exists. I think ...
1679 We now have a capture_info_lock, but it is only to be used
1680 to synchronize in the transport_stop and the capture info
1681 accessors, so that invalidation will not occur (both non-realtime).
1684 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1686 capture_info.push_back (ci);
1687 capture_captured = 0;
1691 AudioDiskstream::set_record_enabled (bool yn)
1693 if (!recordable() || !_session.record_enabling_legal()) {
1697 /* can't rec-enable in destructive mode if transport is before start */
1699 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1703 if (yn && channels[0].source == 0) {
1705 /* pick up connections not initiated *from* the IO object
1706 we're associated with.
1709 get_input_sources ();
1712 /* yes, i know that this not proof against race conditions, but its
1713 good enough. i think.
1716 if (record_enabled() != yn) {
1718 engage_record_enable ();
1720 disengage_record_enable ();
1726 AudioDiskstream::engage_record_enable ()
1728 bool rolling = _session.transport_speed() != 0.0f;
1730 g_atomic_int_set (&_record_enabled, 1);
1731 capturing_sources.clear ();
1732 if (Config->get_use_hardware_monitoring()) {
1733 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1734 if ((*chan).source) {
1735 (*chan).source->request_monitor_input (!(_session.get_auto_input() && rolling));
1737 capturing_sources.push_back ((*chan).write_source);
1740 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1741 capturing_sources.push_back ((*chan).write_source);
1745 RecordEnableChanged (); /* EMIT SIGNAL */
1749 AudioDiskstream::disengage_record_enable ()
1751 g_atomic_int_set (&_record_enabled, 0);
1752 if (Config->get_use_hardware_monitoring()) {
1753 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1754 if ((*chan).source) {
1755 (*chan).source->request_monitor_input (false);
1759 capturing_sources.clear ();
1760 RecordEnableChanged (); /* EMIT SIGNAL */
1765 AudioDiskstream::get_state ()
1767 XMLNode* node = new XMLNode ("AudioDiskstream");
1769 LocaleGuard lg (X_("POSIX"));
1771 snprintf (buf, sizeof(buf), "0x%x", _flags);
1772 node->add_property ("flags", buf);
1774 snprintf (buf, sizeof(buf), "%zd", channels.size());
1775 node->add_property ("channels", buf);
1777 node->add_property ("playlist", _playlist->name());
1779 snprintf (buf, sizeof(buf), "%f", _visible_speed);
1780 node->add_property ("speed", buf);
1782 node->add_property("name", _name);
1784 node->add_property("id", buf);
1786 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1788 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1789 XMLNode* cs_grandchild;
1791 for (vector<AudioFileSource*>::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1792 cs_grandchild = new XMLNode (X_("file"));
1793 cs_grandchild->add_property (X_("path"), (*i)->path());
1794 cs_child->add_child_nocopy (*cs_grandchild);
1797 /* store the location where capture will start */
1801 if (_session.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1802 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1804 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1807 cs_child->add_property (X_("at"), buf);
1808 node->add_child_nocopy (*cs_child);
1812 node->add_child_copy (*_extra_xml);
1819 AudioDiskstream::set_state (const XMLNode& node)
1821 const XMLProperty* prop;
1822 XMLNodeList nlist = node.children();
1823 XMLNodeIterator niter;
1824 uint32_t nchans = 1;
1825 XMLNode* capture_pending_node = 0;
1826 LocaleGuard lg (X_("POSIX"));
1828 in_set_state = true;
1830 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1831 if ((*niter)->name() == IO::state_node_name) {
1832 deprecated_io_node = new XMLNode (**niter);
1835 if ((*niter)->name() == X_("CapturingSources")) {
1836 capture_pending_node = *niter;
1840 /* prevent write sources from being created */
1842 in_set_state = true;
1844 if ((prop = node.property ("name")) != 0) {
1845 _name = prop->value();
1848 if (deprecated_io_node) {
1849 if ((prop = deprecated_io_node->property ("id")) != 0) {
1850 _id = prop->value ();
1853 if ((prop = node.property ("id")) != 0) {
1854 _id = prop->value ();
1858 if ((prop = node.property ("flags")) != 0) {
1859 _flags = strtol (prop->value().c_str(), 0, 0);
1862 if ((prop = node.property ("channels")) != 0) {
1863 nchans = atoi (prop->value().c_str());
1866 // create necessary extra channels
1867 // we are always constructed with one and we always need one
1869 if (nchans > _n_channels) {
1871 // we need to add new channel infos
1872 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1874 int diff = nchans - channels.size();
1876 for (int i=0; i < diff; ++i) {
1880 } else if (nchans < _n_channels) {
1882 // we need to get rid of channels
1883 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1885 int diff = channels.size() - nchans;
1887 for (int i = 0; i < diff; ++i) {
1892 if ((prop = node.property ("playlist")) == 0) {
1897 bool had_playlist = (_playlist != 0);
1899 if (find_and_use_playlist (prop->value())) {
1903 if (!had_playlist) {
1904 _playlist->set_orig_diskstream_id (_id);
1907 if (!destructive() && capture_pending_node) {
1908 /* destructive streams have one and only one source per channel,
1909 and so they never end up in pending capture in any useful
1912 use_pending_capture_data (*capture_pending_node);
1917 if ((prop = node.property ("speed")) != 0) {
1918 double sp = atof (prop->value().c_str());
1920 if (realtime_set_speed (sp, false)) {
1921 non_realtime_set_speed ();
1925 _n_channels = channels.size();
1927 in_set_state = false;
1929 /* make sure this is clear before we do anything else */
1931 capturing_sources.clear ();
1933 /* write sources are handled when we handle the input set
1934 up of the IO that owns this DS (::non_realtime_input_change())
1937 in_set_state = false;
1943 AudioDiskstream::use_new_write_source (uint32_t n)
1945 if (!recordable()) {
1949 if (n >= channels.size()) {
1950 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1954 ChannelInfo &chan = channels[n];
1956 if (chan.write_source) {
1958 if (AudioFileSource::is_empty (chan.write_source->path())) {
1959 chan.write_source->mark_for_remove ();
1960 chan.write_source->release();
1961 delete chan.write_source;
1963 chan.write_source->release();
1964 chan.write_source = 0;
1969 if ((chan.write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1970 throw failed_constructor();
1974 catch (failed_constructor &err) {
1975 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1976 chan.write_source = 0;
1980 chan.write_source->use ();
1982 /* do not remove destructive files even if they are empty */
1984 chan.write_source->set_allow_remove_if_empty (!destructive());
1990 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
1992 ChannelList::iterator chan;
1995 if (!recordable()) {
1999 capturing_sources.clear ();
2001 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
2002 if (!destructive()) {
2004 if ((*chan).write_source && mark_write_complete) {
2005 (*chan).write_source->mark_streaming_write_completed ();
2007 use_new_write_source (n);
2009 if (record_enabled()) {
2010 capturing_sources.push_back ((*chan).write_source);
2014 if ((*chan).write_source == 0) {
2015 use_new_write_source (n);
2020 if (destructive()) {
2022 /* we now have all our write sources set up, so create the
2023 playlist's single region.
2026 if (_playlist->empty()) {
2027 setup_destructive_playlist ();
2033 AudioDiskstream::rename_write_sources ()
2035 ChannelList::iterator chan;
2038 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
2039 if ((*chan).write_source != 0) {
2040 (*chan).write_source->set_name (_name, destructive());
2041 /* XXX what to do if one of them fails ? */
2049 AudioDiskstream::set_block_size (jack_nframes_t nframes)
2051 if (_session.get_block_size() > speed_buffer_size) {
2052 speed_buffer_size = _session.get_block_size();
2054 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2055 if ((*chan).speed_buffer) delete [] (*chan).speed_buffer;
2056 (*chan).speed_buffer = new Sample[speed_buffer_size];
2059 allocate_temporary_buffers ();
2063 AudioDiskstream::allocate_temporary_buffers ()
2065 /* make sure the wrap buffer is at least large enough to deal
2066 with the speeds up to 1.2, to allow for micro-variation
2067 when slaving to MTC, SMPTE etc.
2070 double sp = max (fabsf (_actual_speed), 1.2f);
2071 jack_nframes_t required_wrap_size = (jack_nframes_t) floor (_session.get_block_size() * sp) + 1;
2073 if (required_wrap_size > wrap_buffer_size) {
2075 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2076 if ((*chan).playback_wrap_buffer) delete [] (*chan).playback_wrap_buffer;
2077 (*chan).playback_wrap_buffer = new Sample[required_wrap_size];
2078 if ((*chan).capture_wrap_buffer) delete [] (*chan).capture_wrap_buffer;
2079 (*chan).capture_wrap_buffer = new Sample[required_wrap_size];
2082 wrap_buffer_size = required_wrap_size;
2087 AudioDiskstream::monitor_input (bool yn)
2089 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2091 if ((*chan).source) {
2092 (*chan).source->request_monitor_input (yn);
2098 AudioDiskstream::set_align_style_from_io ()
2100 bool have_physical = false;
2106 get_input_sources ();
2108 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2109 if ((*chan).source && (*chan).source->flags() & JackPortIsPhysical) {
2110 have_physical = true;
2115 if (have_physical) {
2116 set_align_style (ExistingMaterial);
2118 set_align_style (CaptureTime);
2123 AudioDiskstream::add_channel ()
2125 /* XXX need to take lock??? */
2129 init_channel (chan);
2131 chan.speed_buffer = new Sample[speed_buffer_size];
2132 chan.playback_wrap_buffer = new Sample[wrap_buffer_size];
2133 chan.capture_wrap_buffer = new Sample[wrap_buffer_size];
2135 channels.push_back (chan);
2137 _n_channels = channels.size();
2143 AudioDiskstream::remove_channel ()
2145 if (channels.size() > 1) {
2146 /* XXX need to take lock??? */
2147 ChannelInfo & chan = channels.back();
2148 destroy_channel (chan);
2149 channels.pop_back();
2151 _n_channels = channels.size();
2159 AudioDiskstream::playback_buffer_load () const
2161 return (float) ((double) channels.front().playback_buf->read_space()/
2162 (double) channels.front().playback_buf->bufsize());
2166 AudioDiskstream::capture_buffer_load () const
2168 return (float) ((double) channels.front().capture_buf->write_space()/
2169 (double) channels.front().capture_buf->bufsize());
2173 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2175 const XMLProperty* prop;
2176 XMLNodeList nlist = node.children();
2177 XMLNodeIterator niter;
2178 AudioFileSource* fs;
2179 AudioFileSource* first_fs = 0;
2180 AudioRegion::SourceList pending_sources;
2181 jack_nframes_t position;
2183 if ((prop = node.property (X_("at"))) == 0) {
2187 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2191 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2192 if ((*niter)->name() == X_("file")) {
2194 if ((prop = (*niter)->property (X_("path"))) == 0) {
2199 fs = new SndFileSource (prop->value(),
2200 Config->get_native_file_data_format(),
2201 Config->get_native_file_header_format(),
2202 _session.frame_rate());
2205 catch (failed_constructor& err) {
2206 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2207 _name, prop->value())
2212 pending_sources.push_back (fs);
2214 if (first_fs == 0) {
2218 fs->set_captured_for (_name);
2222 if (pending_sources.size() == 0) {
2223 /* nothing can be done */
2227 if (pending_sources.size() != _n_channels) {
2228 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2233 AudioRegion* region;
2236 region = new AudioRegion (pending_sources, 0, first_fs->length(),
2237 region_name_from_path (first_fs->name()),
2238 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile));
2240 region->special_set_position (0);
2243 catch (failed_constructor& err) {
2244 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2252 region = new AudioRegion (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name()));
2255 catch (failed_constructor& err) {
2256 error << string_compose (_("%1: cannot create region from pending capture sources"),
2263 _playlist->add_region (*region, position);