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/send.h>
47 #include <ardour/region_factory.h>
48 #include <ardour/audioplaylist.h>
49 #include <ardour/playlist_factory.h>
50 #include <ardour/cycle_timer.h>
51 #include <ardour/audioregion.h>
52 #include <ardour/source_factory.h>
58 using namespace ARDOUR;
61 size_t AudioDiskstream::_working_buffers_size = 0;
62 Sample* AudioDiskstream::_mixdown_buffer = 0;
63 gain_t* AudioDiskstream::_gain_buffer = 0;
65 AudioDiskstream::AudioDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
66 : Diskstream(sess, name, flag)
67 , deprecated_io_node(NULL)
69 /* prevent any write sources from being created */
79 AudioDiskstream::AudioDiskstream (Session& sess, const XMLNode& node)
80 : Diskstream(sess, node)
81 , deprecated_io_node(NULL)
86 if (set_state (node)) {
88 throw failed_constructor();
94 use_destructive_playlist ();
99 AudioDiskstream::init (Diskstream::Flag f)
103 /* there are no channels at this point, so these
104 two calls just get speed_buffer_size and wrap_buffer
105 size setup without duplicating their code.
108 set_block_size (_session.get_block_size());
109 allocate_temporary_buffers ();
112 assert(_n_channels == 1);
115 AudioDiskstream::~AudioDiskstream ()
120 /* don't be holding this lock as we exit the destructor, glib will wince
121 visibly since the mutex gets destroyed before we release it.
124 Glib::Mutex::Lock lm (state_lock);
125 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
133 AudioDiskstream::allocate_working_buffers()
135 assert(disk_io_frames() > 0);
137 _working_buffers_size = disk_io_frames();
138 _mixdown_buffer = new Sample[_working_buffers_size];
139 _gain_buffer = new gain_t[_working_buffers_size];
143 AudioDiskstream::free_working_buffers()
145 delete [] _mixdown_buffer;
146 delete [] _gain_buffer;
147 _working_buffers_size = 0;
153 AudioDiskstream::non_realtime_input_change ()
156 Glib::Mutex::Lock lm (state_lock);
158 if (input_change_pending == NoChange) {
162 if (input_change_pending & ConfigurationChanged) {
164 if (_io->n_inputs() > _n_channels) {
166 // we need to add new channel infos
168 int diff = _io->n_inputs() - channels.size();
170 for (int i = 0; i < diff; ++i) {
174 } else if (_io->n_inputs() < _n_channels) {
176 // we need to get rid of channels
178 int diff = channels.size() - _io->n_inputs();
180 for (int i = 0; i < diff; ++i) {
186 get_input_sources ();
187 set_capture_offset ();
189 if (first_input_change) {
190 set_align_style (_persistent_alignment_style);
191 first_input_change = false;
193 set_align_style_from_io ();
196 input_change_pending = NoChange;
199 /* reset capture files */
201 reset_write_sources (false);
203 /* now refill channel buffers */
205 if (speed() != 1.0f || speed() != -1.0f) {
206 seek ((nframes_t) (_session.transport_frame() * (double) speed()));
208 seek (_session.transport_frame());
213 AudioDiskstream::get_input_sources ()
215 uint32_t ni = _io->n_inputs();
217 for (uint32_t n = 0; n < ni; ++n) {
219 const char **connections = _io->input(n)->get_connections ();
220 ChannelInfo& chan = channels[n];
222 if (connections == 0 || connections[0] == 0) {
225 // _source->disable_metering ();
231 chan.source = _session.engine().get_port_by_name (connections[0]);
241 AudioDiskstream::find_and_use_playlist (const string& name)
243 boost::shared_ptr<AudioPlaylist> playlist;
245 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlist_by_name (name))) == 0) {
246 playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, name));
250 error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
254 return use_playlist (playlist);
258 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
260 assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
262 Diskstream::use_playlist(playlist);
268 AudioDiskstream::use_new_playlist ()
271 boost::shared_ptr<AudioPlaylist> playlist;
273 if (!in_set_state && destructive()) {
278 newname = Playlist::bump_name (_playlist->name(), _session);
280 newname = Playlist::bump_name (_name, _session);
283 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist> (PlaylistFactory::create (_session, newname, hidden()))) != 0) {
285 playlist->set_orig_diskstream_id (id());
286 return use_playlist (playlist);
294 AudioDiskstream::use_copy_playlist ()
296 assert(audio_playlist());
302 if (_playlist == 0) {
303 error << string_compose(_("AudioDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
308 boost::shared_ptr<AudioPlaylist> playlist;
310 newname = Playlist::bump_name (_playlist->name(), _session);
312 if ((playlist = boost::dynamic_pointer_cast<AudioPlaylist>(PlaylistFactory::create (audio_playlist(), newname))) != 0) {
313 playlist->set_orig_diskstream_id (id());
314 return use_playlist (playlist);
321 AudioDiskstream::setup_destructive_playlist ()
325 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
326 srcs.push_back ((*chan).write_source);
329 /* a single full-sized region */
331 boost::shared_ptr<Region> region (RegionFactory::create (srcs, 0, max_frames - srcs.front()->natural_position(), _name));
332 _playlist->add_region (region, srcs.front()->natural_position());
336 AudioDiskstream::use_destructive_playlist ()
338 /* this is called from the XML-based constructor or ::set_destructive. when called,
339 we already have a playlist and a region, but we need to
340 set up our sources for write. we use the sources associated
341 with the (presumed single, full-extent) region.
344 boost::shared_ptr<Region> rp = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
347 reset_write_sources (false, true);
351 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
354 throw failed_constructor();
357 /* be sure to stretch the region out to the maximum length */
359 region->set_length (max_frames - region->position(), this);
362 ChannelList::iterator chan;
364 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
365 (*chan).write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
366 assert((*chan).write_source);
367 (*chan).write_source->set_allow_remove_if_empty (false);
369 /* this might be false if we switched modes, so force it */
371 (*chan).write_source->set_destructive (true);
374 /* the source list will never be reset for a destructive track */
378 AudioDiskstream::check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record)
380 int possibly_recording;
383 const int transport_rolling = 0x4;
384 const int track_rec_enabled = 0x2;
385 const int global_rec_enabled = 0x1;
387 /* merge together the 3 factors that affect record status, and compute
391 rolling = _session.transport_speed() != 0.0f;
392 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
393 change = possibly_recording ^ last_possibly_recording;
395 if (possibly_recording == last_possibly_recording) {
401 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
403 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
404 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
406 /* starting to record: compute first+last frames */
408 first_recordable_frame = transport_frame + _capture_offset;
409 last_recordable_frame = max_frames;
410 capture_start_frame = transport_frame;
412 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
414 /* was stopped, now rolling (and recording) */
416 if (_alignment_style == ExistingMaterial) {
417 first_recordable_frame += _session.worst_output_latency();
419 first_recordable_frame += _roll_delay;
424 /* was rolling, but record state changed */
426 if (_alignment_style == ExistingMaterial) {
428 if (!Config->get_punch_in()) {
430 /* manual punch in happens at the correct transport frame
431 because the user hit a button. but to get alignment correct
432 we have to back up the position of the new region to the
433 appropriate spot given the roll delay.
436 capture_start_frame -= _roll_delay;
438 /* XXX paul notes (august 2005): i don't know why
442 first_recordable_frame += _capture_offset;
446 /* autopunch toggles recording at the precise
447 transport frame, and then the DS waits
448 to start recording for a time that depends
449 on the output latency.
452 first_recordable_frame += _session.worst_output_latency();
457 if (Config->get_punch_in()) {
458 first_recordable_frame += _roll_delay;
460 capture_start_frame -= _roll_delay;
466 if (_flags & Recordable) {
467 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
469 RingBufferNPT<CaptureTransition>::rw_vector transvec;
470 (*chan).capture_transition_buf->get_write_vector(&transvec);
472 if (transvec.len[0] > 0) {
473 transvec.buf[0]->type = CaptureStart;
474 transvec.buf[0]->capture_val = capture_start_frame;
475 (*chan).capture_transition_buf->increment_write_ptr(1);
479 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
485 } else if (!record_enabled() || !can_record) {
489 last_recordable_frame = transport_frame + _capture_offset;
491 if (_alignment_style == ExistingMaterial) {
492 last_recordable_frame += _session.worst_output_latency();
494 last_recordable_frame += _roll_delay;
498 last_possibly_recording = possibly_recording;
502 AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input)
505 ChannelList::iterator c;
507 nframes_t rec_offset = 0;
508 nframes_t rec_nframes = 0;
509 bool nominally_recording;
510 bool re = record_enabled ();
511 bool collect_playback = false;
513 /* if we've already processed the frames corresponding to this call,
514 just return. this allows multiple routes that are taking input
515 from this diskstream to call our ::process() method, but have
516 this stuff only happen once. more commonly, it allows both
517 the AudioTrack that is using this AudioDiskstream *and* the Session
518 to call process() without problems.
525 check_record_status (transport_frame, nframes, can_record);
527 nominally_recording = (can_record && re);
534 /* This lock is held until the end of AudioDiskstream::commit, so these two functions
535 must always be called as a pair. The only exception is if this function
536 returns a non-zero value, in which case, ::commit should not be called.
539 // If we can't take the state lock return.
540 if (!state_lock.trylock()) {
544 adjust_capture_position = 0;
546 for (c = channels.begin(); c != channels.end(); ++c) {
547 (*c).current_capture_buffer = 0;
548 (*c).current_playback_buffer = 0;
551 if (nominally_recording || (_session.get_record_enabled() && Config->get_punch_in())) {
554 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
561 case OverlapInternal:
562 /* ---------- recrange
565 rec_nframes = nframes;
570 /* |--------| recrange
573 rec_nframes = transport_frame + nframes - first_recordable_frame;
575 rec_offset = first_recordable_frame - transport_frame;
580 /* |--------| recrange
583 rec_nframes = last_recordable_frame - transport_frame;
587 case OverlapExternal:
588 /* |--------| recrange
589 -------------- transrange
591 rec_nframes = last_recordable_frame - last_recordable_frame;
592 rec_offset = first_recordable_frame - transport_frame;
596 if (rec_nframes && !was_recording) {
597 capture_captured = 0;
598 was_recording = true;
603 if (can_record && !_last_capture_regions.empty()) {
604 _last_capture_regions.clear ();
607 if (nominally_recording || rec_nframes) {
609 for (n = 0, c = channels.begin(); c != channels.end(); ++c, ++n) {
611 ChannelInfo& chan (*c);
613 chan.capture_buf->get_write_vector (&chan.capture_vector);
615 if (rec_nframes <= chan.capture_vector.len[0]) {
617 chan.current_capture_buffer = chan.capture_vector.buf[0];
619 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
623 memcpy (chan.current_capture_buffer, _io->input(n)->get_buffer (rec_nframes) + offset + rec_offset, sizeof (Sample) * rec_nframes);
627 nframes_t total = chan.capture_vector.len[0] + chan.capture_vector.len[1];
629 if (rec_nframes > total) {
634 Sample* buf = _io->input (n)->get_buffer (nframes) + offset;
635 nframes_t first = chan.capture_vector.len[0];
637 memcpy (chan.capture_wrap_buffer, buf, sizeof (Sample) * first);
638 memcpy (chan.capture_vector.buf[0], buf, sizeof (Sample) * first);
639 memcpy (chan.capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
640 memcpy (chan.capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
642 chan.current_capture_buffer = chan.capture_wrap_buffer;
649 finish_capture (rec_monitors_input);
656 /* data will be written to disk */
658 if (rec_nframes == nframes && rec_offset == 0) {
660 for (c = channels.begin(); c != channels.end(); ++c) {
661 (*c).current_playback_buffer = (*c).current_capture_buffer;
664 playback_distance = nframes;
669 /* we can't use the capture buffer as the playback buffer, because
670 we recorded only a part of the current process' cycle data
674 collect_playback = true;
677 adjust_capture_position = rec_nframes;
679 } else if (nominally_recording) {
681 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
683 for (c = channels.begin(); c != channels.end(); ++c) {
684 (*c).current_playback_buffer = (*c).current_capture_buffer;
687 playback_distance = nframes;
691 collect_playback = true;
694 if (collect_playback) {
696 /* we're doing playback */
698 nframes_t necessary_samples;
700 /* no varispeed playback if we're recording, because the output .... TBD */
702 if (rec_nframes == 0 && _actual_speed != 1.0f) {
703 necessary_samples = (nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
705 necessary_samples = nframes;
708 for (c = channels.begin(); c != channels.end(); ++c) {
709 (*c).playback_buf->get_read_vector (&(*c).playback_vector);
714 for (c = channels.begin(); c != channels.end(); ++c, ++n) {
716 ChannelInfo& chan (*c);
718 if (necessary_samples <= chan.playback_vector.len[0]) {
720 chan.current_playback_buffer = chan.playback_vector.buf[0];
723 nframes_t total = chan.playback_vector.len[0] + chan.playback_vector.len[1];
725 if (necessary_samples > total) {
731 memcpy ((char *) chan.playback_wrap_buffer, chan.playback_vector.buf[0],
732 chan.playback_vector.len[0] * sizeof (Sample));
733 memcpy (chan.playback_wrap_buffer + chan.playback_vector.len[0], chan.playback_vector.buf[1],
734 (necessary_samples - chan.playback_vector.len[0]) * sizeof (Sample));
736 chan.current_playback_buffer = chan.playback_wrap_buffer;
741 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
743 uint64_t phase = last_phase;
746 // Linearly interpolate into the alt buffer
747 // using 40.24 fixp maths (swh)
749 for (c = channels.begin(); c != channels.end(); ++c) {
752 ChannelInfo& chan (*c);
757 for (nframes_t outsample = 0; outsample < nframes; ++outsample) {
759 fr = (phase & 0xFFFFFF) / 16777216.0f;
760 chan.speed_buffer[outsample] =
761 chan.current_playback_buffer[i] * (1.0f - fr) +
762 chan.current_playback_buffer[i+1] * fr;
766 chan.current_playback_buffer = chan.speed_buffer;
769 playback_distance = i + 1;
770 last_phase = (phase & 0xFFFFFF);
773 playback_distance = nframes;
785 /* we're exiting with failure, so ::commit will not
786 be called. unlock the state lock.
796 AudioDiskstream::commit (nframes_t nframes)
798 bool need_butler = false;
800 if (_actual_speed < 0.0) {
801 playback_sample -= playback_distance;
803 playback_sample += playback_distance;
806 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
808 (*chan).playback_buf->increment_read_ptr (playback_distance);
810 if (adjust_capture_position) {
811 (*chan).capture_buf->increment_write_ptr (adjust_capture_position);
815 if (adjust_capture_position != 0) {
816 capture_captured += adjust_capture_position;
817 adjust_capture_position = 0;
821 need_butler = channels[0].playback_buf->write_space() >= channels[0].playback_buf->bufsize() / 2;
823 need_butler = channels[0].playback_buf->write_space() >= disk_io_chunk_frames
824 || channels[0].capture_buf->read_space() >= disk_io_chunk_frames;
835 AudioDiskstream::set_pending_overwrite (bool yn)
837 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
839 pending_overwrite = yn;
841 overwrite_frame = playback_sample;
842 overwrite_offset = channels.front().playback_buf->get_read_ptr();
846 AudioDiskstream::overwrite_existing_buffers ()
848 Sample* mixdown_buffer;
851 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
853 overwrite_queued = false;
855 /* assume all are the same size */
856 nframes_t size = channels[0].playback_buf->bufsize();
858 mixdown_buffer = new Sample[size];
859 gain_buffer = new float[size];
861 /* reduce size so that we can fill the buffer correctly. */
867 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
869 start = overwrite_frame;
870 nframes_t cnt = size;
872 /* to fill the buffer without resetting the playback sample, we need to
873 do it one or two chunks (normally two).
875 |----------------------------------------------------------------------|
879 |<- second chunk->||<----------------- first chunk ------------------>|
883 nframes_t to_read = size - overwrite_offset;
885 if (read ((*chan).playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, start, to_read, *chan, n, reversed)) {
886 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
887 _id, size, playback_sample) << endmsg;
895 if (read ((*chan).playback_buf->buffer(), mixdown_buffer, gain_buffer,
896 start, cnt, *chan, n, reversed)) {
897 error << string_compose(_("AudioDiskstream %1: when refilling, cannot read %2 from playlist at frame %3"),
898 _id, size, playback_sample) << endmsg;
907 pending_overwrite = false;
908 delete [] gain_buffer;
909 delete [] mixdown_buffer;
914 AudioDiskstream::seek (nframes_t frame, bool complete_refill)
916 Glib::Mutex::Lock lm (state_lock);
919 ChannelList::iterator chan;
921 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
922 (*chan).playback_buf->reset ();
923 (*chan).capture_buf->reset ();
926 /* can't rec-enable in destructive mode if transport is before start */
928 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
929 disengage_record_enable ();
932 playback_sample = frame;
935 if (complete_refill) {
936 while ((ret = do_refill_with_alloc ()) > 0) ;
938 ret = do_refill_with_alloc ();
945 AudioDiskstream::can_internal_playback_seek (nframes_t distance)
947 ChannelList::iterator chan;
949 for (chan = channels.begin(); chan != channels.end(); ++chan) {
950 if ((*chan).playback_buf->read_space() < distance) {
958 AudioDiskstream::internal_playback_seek (nframes_t distance)
960 ChannelList::iterator chan;
962 for (chan = channels.begin(); chan != channels.end(); ++chan) {
963 (*chan).playback_buf->increment_read_ptr (distance);
966 first_recordable_frame += distance;
967 playback_sample += distance;
973 AudioDiskstream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, nframes_t& start, nframes_t cnt,
974 ChannelInfo& channel_info, int channel, bool reversed)
976 nframes_t this_read = 0;
978 nframes_t loop_end = 0;
979 nframes_t loop_start = 0;
980 nframes_t loop_length = 0;
981 nframes_t offset = 0;
984 /* XXX we don't currently play loops in reverse. not sure why */
988 /* Make the use of a Location atomic for this read operation.
990 Note: Locations don't get deleted, so all we care about
991 when I say "atomic" is that we are always pointing to
992 the same one and using a start/length values obtained
996 if ((loc = loop_location) != 0) {
997 loop_start = loc->start();
998 loop_end = loc->end();
999 loop_length = loop_end - loop_start;
1002 /* if we are looping, ensure that the first frame we read is at the correct
1003 position within the loop.
1006 if (loc && start >= loop_end) {
1007 //cerr << "start adjusted from " << start;
1008 start = loop_start + ((start - loop_start) % loop_length);
1009 //cerr << "to " << start << endl;
1012 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1021 /* take any loop into account. we can't read past the end of the loop. */
1023 if (loc && (loop_end - start < cnt)) {
1024 this_read = loop_end - start;
1025 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1032 if (this_read == 0) {
1036 this_read = min(cnt,this_read);
1038 if (audio_playlist()->read (buf+offset, mixdown_buffer, gain_buffer, start, this_read, channel) != this_read) {
1039 error << string_compose(_("AudioDiskstream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1044 _read_data_count = _playlist->read_data_count();
1048 swap_by_ptr (buf, buf + this_read - 1);
1052 /* if we read to the end of the loop, go back to the beginning */
1062 offset += this_read;
1069 AudioDiskstream::do_refill_with_alloc()
1071 Sample* mix_buf = new Sample[disk_io_chunk_frames];
1072 float* gain_buf = new float[disk_io_chunk_frames];
1074 int ret = _do_refill(mix_buf, gain_buf);
1083 AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
1087 RingBufferNPT<Sample>::rw_vector vector;
1088 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1089 nframes_t total_space;
1090 nframes_t zero_fill;
1092 ChannelList::iterator i;
1095 assert(mixdown_buffer);
1096 assert(gain_buffer);
1103 channels.front().playback_buf->get_write_vector (&vector);
1106 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1110 /* if there are 2+ chunks of disk i/o possible for
1111 this track, let the caller know so that it can arrange
1112 for us to be called again, ASAP.
1115 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1119 /* if we're running close to normal speed and there isn't enough
1120 space to do disk_io_chunk_frames of I/O, then don't bother.
1122 at higher speeds, just do it because the sync between butler
1123 and audio thread may not be good enough.
1126 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1130 /* when slaved, don't try to get too close to the read pointer. this
1131 leaves space for the buffer reversal to have something useful to
1135 if (_slaved && total_space < (channels.front().playback_buf->bufsize() / 2)) {
1139 /* never do more than disk_io_chunk_frames worth of disk input per call (limit doesn't apply for memset) */
1141 total_space = min (disk_io_chunk_frames, total_space);
1145 if (file_frame == 0) {
1147 /* at start: nothing to do but fill with silence */
1149 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1151 ChannelInfo& chan (*i);
1152 chan.playback_buf->get_write_vector (&vector);
1153 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1154 if (vector.len[1]) {
1155 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1157 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1162 if (file_frame < total_space) {
1164 /* too close to the start: read what we can,
1165 and then zero fill the rest
1168 zero_fill = total_space - file_frame;
1169 total_space = file_frame;
1179 if (file_frame == max_frames) {
1181 /* at end: nothing to do but fill with silence */
1183 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1185 ChannelInfo& chan (*i);
1186 chan.playback_buf->get_write_vector (&vector);
1187 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1188 if (vector.len[1]) {
1189 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1191 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1196 if (file_frame > max_frames - total_space) {
1198 /* to close to the end: read what we can, and zero fill the rest */
1200 zero_fill = total_space - (max_frames - file_frame);
1201 total_space = max_frames - file_frame;
1208 nframes_t file_frame_tmp = 0;
1210 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1212 ChannelInfo& chan (*i);
1215 nframes_t len1, len2;
1217 chan.playback_buf->get_write_vector (&vector);
1219 if (vector.len[0] > disk_io_chunk_frames) {
1221 /* we're not going to fill the first chunk, so certainly do not bother with the
1222 other part. it won't be connected with the part we do fill, as in:
1224 .... => writable space
1225 ++++ => readable space
1226 ^^^^ => 1 x disk_io_chunk_frames that would be filled
1228 |......|+++++++++++++|...............................|
1233 So, just pretend that the buf1 part isn't there.
1243 file_frame_tmp = file_frame;
1245 buf1 = vector.buf[0];
1246 len1 = vector.len[0];
1247 buf2 = vector.buf[1];
1248 len2 = vector.len[1];
1250 to_read = min (ts, len1);
1251 to_read = min (to_read, disk_io_chunk_frames);
1255 if (read (buf1, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1260 chan.playback_buf->increment_write_ptr (to_read);
1264 to_read = min (ts, len2);
1268 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1269 so read some or all of vector.len[1] as well.
1272 if (read (buf2, mixdown_buffer, gain_buffer, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1277 chan.playback_buf->increment_write_ptr (to_read);
1286 file_frame = file_frame_tmp;
1293 /** Flush pending data to disk.
1295 * Important note: this function will write *AT MOST* disk_io_chunk_frames
1296 * of data to disk. it will never write more than that. If it writes that
1297 * much and there is more than that waiting to be written, it will return 1,
1298 * otherwise 0 on success or -1 on failure.
1300 * If there is less than disk_io_chunk_frames to be written, no data will be
1301 * written at all unless @a force_flush is true.
1304 AudioDiskstream::do_flush (Session::RunContext context, bool force_flush)
1308 RingBufferNPT<Sample>::rw_vector vector;
1309 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1312 _write_data_count = 0;
1314 transvec.buf[0] = 0;
1315 transvec.buf[1] = 0;
1319 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1321 (*chan).capture_buf->get_read_vector (&vector);
1323 total = vector.len[0] + vector.len[1];
1325 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1329 /* if there are 2+ chunks of disk i/o possible for
1330 this track, let the caller know so that it can arrange
1331 for us to be called again, ASAP.
1333 if we are forcing a flush, then if there is* any* extra
1334 work, let the caller know.
1336 if we are no longer recording and there is any extra work,
1337 let the caller know too.
1340 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1344 to_write = min (disk_io_chunk_frames, (nframes_t) vector.len[0]);
1346 // check the transition buffer when recording destructive
1347 // important that we get this after the capture buf
1349 if (destructive()) {
1350 (*chan).capture_transition_buf->get_read_vector(&transvec);
1351 size_t transcount = transvec.len[0] + transvec.len[1];
1352 bool have_start = false;
1355 for (ti=0; ti < transcount; ++ti) {
1356 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1358 if (captrans.type == CaptureStart) {
1359 // by definition, the first data we got above represents the given capture pos
1361 (*chan).write_source->mark_capture_start (captrans.capture_val);
1362 (*chan).curr_capture_cnt = 0;
1366 else if (captrans.type == CaptureEnd) {
1368 // capture end, the capture_val represents total frames in capture
1370 if (captrans.capture_val <= (*chan).curr_capture_cnt + to_write) {
1372 // shorten to make the write a perfect fit
1373 uint32_t nto_write = (captrans.capture_val - (*chan).curr_capture_cnt);
1375 if (nto_write < to_write) {
1376 ret = 1; // should we?
1378 to_write = nto_write;
1380 (*chan).write_source->mark_capture_end ();
1382 // increment past this transition, but go no further
1387 // actually ends just beyond this chunk, so force more work
1395 (*chan).capture_transition_buf->increment_read_ptr(ti);
1399 if ((!(*chan).write_source) || (*chan).write_source->write (vector.buf[0], to_write) != to_write) {
1400 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1404 (*chan).capture_buf->increment_read_ptr (to_write);
1405 (*chan).curr_capture_cnt += to_write;
1407 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1409 /* we wrote all of vector.len[0] but it wasn't an entire
1410 disk_io_chunk_frames of data, so arrange for some part
1411 of vector.len[1] to be flushed to disk as well.
1414 to_write = min ((nframes_t)(disk_io_chunk_frames - to_write), (nframes_t) vector.len[1]);
1416 if ((*chan).write_source->write (vector.buf[1], to_write) != to_write) {
1417 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), _id) << endmsg;
1421 _write_data_count += (*chan).write_source->write_data_count();
1423 (*chan).capture_buf->increment_read_ptr (to_write);
1424 (*chan).curr_capture_cnt += to_write;
1433 AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1435 uint32_t buffer_position;
1436 bool more_work = true;
1438 boost::shared_ptr<AudioRegion> region;
1439 nframes_t total_capture;
1441 SourceList::iterator src;
1442 ChannelList::iterator chan;
1443 vector<CaptureInfo*>::iterator ci;
1445 bool mark_write_completed = false;
1447 finish_capture (true);
1449 /* butler is already stopped, but there may be work to do
1450 to flush remaining data to disk.
1453 while (more_work && !err) {
1454 switch (do_flush (Session::TransportContext, true)) {
1461 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1466 /* XXX is there anything we can do if err != 0 ? */
1467 Glib::Mutex::Lock lm (capture_info_lock);
1469 if (capture_info.empty()) {
1473 if (abort_capture) {
1475 if (destructive()) {
1479 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1481 if ((*chan).write_source) {
1483 (*chan).write_source->mark_for_remove ();
1484 (*chan).write_source->drop_references ();
1485 (*chan).write_source.reset ();
1488 /* new source set up in "out" below */
1494 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1495 total_capture += (*ci)->frames;
1498 /* figure out the name for this take */
1500 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1502 boost::shared_ptr<AudioFileSource> s = (*chan).write_source;
1506 s->update_header (capture_info.front()->start, when, twhen);
1507 s->set_captured_for (_name);
1508 s->mark_immutable ();
1512 /* destructive tracks have a single, never changing region */
1514 if (destructive()) {
1516 /* send a signal that any UI can pick up to do the right thing. there is
1517 a small problem here in that a UI may need the peak data to be ready
1518 for the data that was recorded and this isn't interlocked with that
1519 process. this problem is deferred to the UI.
1522 _playlist->Modified();
1526 string whole_file_region_name;
1527 whole_file_region_name = region_name_from_path (channels[0].write_source->name(), true);
1529 /* Register a new region with the Session that
1530 describes the entire source. Do this first
1531 so that any sub-regions will obviously be
1532 children of this one (later!)
1536 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, channels[0].write_source->last_capture_start_frame(), total_capture,
1537 whole_file_region_name,
1538 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
1540 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1541 region->special_set_position (capture_info.front()->start);
1545 catch (failed_constructor& err) {
1546 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1550 _last_capture_regions.push_back (region);
1552 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1554 XMLNode &before = _playlist->get_state();
1555 _playlist->freeze ();
1557 for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1561 _session.region_name (region_name, whole_file_region_name, false);
1563 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add region " << region_name << endl;
1566 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, buffer_position, (*ci)->frames, region_name));
1567 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1570 catch (failed_constructor& err) {
1571 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1572 continue; /* XXX is this OK? */
1575 region->GoingAway.connect (bind (mem_fun (*this, &Diskstream::remove_region_from_last_capture), boost::weak_ptr<Region>(region)));
1577 _last_capture_regions.push_back (region);
1579 i_am_the_modifier++;
1580 _playlist->add_region (region, (*ci)->start);
1581 i_am_the_modifier--;
1583 buffer_position += (*ci)->frames;
1587 XMLNode &after = _playlist->get_state();
1588 _session.add_command (new MementoCommand<Playlist>(*_playlist, &before, &after));
1591 mark_write_completed = true;
1594 reset_write_sources (mark_write_completed);
1598 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1602 capture_info.clear ();
1603 capture_start_frame = 0;
1607 AudioDiskstream::finish_capture (bool rec_monitors_input)
1609 was_recording = false;
1611 if (capture_captured == 0) {
1615 if (recordable() && destructive()) {
1616 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1618 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1619 (*chan).capture_transition_buf->get_write_vector(&transvec);
1622 if (transvec.len[0] > 0) {
1623 transvec.buf[0]->type = CaptureEnd;
1624 transvec.buf[0]->capture_val = capture_captured;
1625 (*chan).capture_transition_buf->increment_write_ptr(1);
1629 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1635 CaptureInfo* ci = new CaptureInfo;
1637 ci->start = capture_start_frame;
1638 ci->frames = capture_captured;
1640 /* XXX theoretical race condition here. Need atomic exchange ?
1641 However, the circumstances when this is called right
1642 now (either on record-disable or transport_stopped)
1643 mean that no actual race exists. I think ...
1644 We now have a capture_info_lock, but it is only to be used
1645 to synchronize in the transport_stop and the capture info
1646 accessors, so that invalidation will not occur (both non-realtime).
1649 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1651 capture_info.push_back (ci);
1652 capture_captured = 0;
1656 AudioDiskstream::set_record_enabled (bool yn)
1658 if (!recordable() || !_session.record_enabling_legal() || _io->n_inputs() == 0) {
1662 /* can't rec-enable in destructive mode if transport is before start */
1664 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
1668 if (yn && channels[0].source == 0) {
1670 /* pick up connections not initiated *from* the IO object
1671 we're associated with.
1674 get_input_sources ();
1677 /* yes, i know that this not proof against race conditions, but its
1678 good enough. i think.
1681 if (record_enabled() != yn) {
1683 engage_record_enable ();
1685 disengage_record_enable ();
1691 AudioDiskstream::engage_record_enable ()
1693 bool rolling = _session.transport_speed() != 0.0f;
1695 g_atomic_int_set (&_record_enabled, 1);
1696 capturing_sources.clear ();
1698 if (Config->get_monitoring_model() == HardwareMonitoring) {
1700 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1701 if ((*chan).source) {
1702 (*chan).source->ensure_monitor_input (!(Config->get_auto_input() && rolling));
1704 capturing_sources.push_back ((*chan).write_source);
1708 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1709 capturing_sources.push_back ((*chan).write_source);
1713 RecordEnableChanged (); /* EMIT SIGNAL */
1717 AudioDiskstream::disengage_record_enable ()
1719 g_atomic_int_set (&_record_enabled, 0);
1720 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1721 if (Config->get_monitoring_model() == HardwareMonitoring) {
1722 if ((*chan).source) {
1723 (*chan).source->ensure_monitor_input (false);
1727 capturing_sources.clear ();
1728 RecordEnableChanged (); /* EMIT SIGNAL */
1732 AudioDiskstream::get_state ()
1734 XMLNode* node = new XMLNode ("AudioDiskstream");
1736 LocaleGuard lg (X_("POSIX"));
1738 node->add_property ("flags", enum_2_string (_flags));
1740 snprintf (buf, sizeof(buf), "%zd", channels.size());
1741 node->add_property ("channels", buf);
1743 node->add_property ("playlist", _playlist->name());
1745 snprintf (buf, sizeof(buf), "%.12g", _visible_speed);
1746 node->add_property ("speed", buf);
1748 node->add_property("name", _name);
1749 id().print (buf, sizeof (buf));
1750 node->add_property("id", buf);
1752 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1754 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1755 XMLNode* cs_grandchild;
1757 for (vector<boost::shared_ptr<AudioFileSource> >::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1758 cs_grandchild = new XMLNode (X_("file"));
1759 cs_grandchild->add_property (X_("path"), (*i)->path());
1760 cs_child->add_child_nocopy (*cs_grandchild);
1763 /* store the location where capture will start */
1767 if (Config->get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1768 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
1770 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
1773 cs_child->add_property (X_("at"), buf);
1774 node->add_child_nocopy (*cs_child);
1778 node->add_child_copy (*_extra_xml);
1785 AudioDiskstream::set_state (const XMLNode& node)
1787 const XMLProperty* prop;
1788 XMLNodeList nlist = node.children();
1789 XMLNodeIterator niter;
1790 uint32_t nchans = 1;
1791 XMLNode* capture_pending_node = 0;
1792 LocaleGuard lg (X_("POSIX"));
1794 in_set_state = true;
1796 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1797 if ((*niter)->name() == IO::state_node_name) {
1798 deprecated_io_node = new XMLNode (**niter);
1801 if ((*niter)->name() == X_("CapturingSources")) {
1802 capture_pending_node = *niter;
1806 /* prevent write sources from being created */
1808 in_set_state = true;
1810 if ((prop = node.property ("name")) != 0) {
1811 _name = prop->value();
1814 if (deprecated_io_node) {
1815 if ((prop = deprecated_io_node->property ("id")) != 0) {
1816 _id = prop->value ();
1819 if ((prop = node.property ("id")) != 0) {
1820 _id = prop->value ();
1824 if ((prop = node.property ("flags")) != 0) {
1825 _flags = Flag (string_2_enum (prop->value(), _flags));
1828 if ((prop = node.property ("channels")) != 0) {
1829 nchans = atoi (prop->value().c_str());
1832 // create necessary extra channels
1833 // we are always constructed with one and we always need one
1835 if (nchans > _n_channels) {
1837 // we need to add new channel infos
1838 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1840 int diff = nchans - channels.size();
1842 for (int i=0; i < diff; ++i) {
1846 } else if (nchans < _n_channels) {
1848 // we need to get rid of channels
1849 //LockMonitor lm (state_lock, __LINE__, __FILE__);
1851 int diff = channels.size() - nchans;
1853 for (int i = 0; i < diff; ++i) {
1858 if ((prop = node.property ("playlist")) == 0) {
1863 bool had_playlist = (_playlist != 0);
1865 if (find_and_use_playlist (prop->value())) {
1869 if (!had_playlist) {
1870 _playlist->set_orig_diskstream_id (_id);
1873 if (!destructive() && capture_pending_node) {
1874 /* destructive streams have one and only one source per channel,
1875 and so they never end up in pending capture in any useful
1878 use_pending_capture_data (*capture_pending_node);
1883 if ((prop = node.property ("speed")) != 0) {
1884 double sp = atof (prop->value().c_str());
1886 if (realtime_set_speed (sp, false)) {
1887 non_realtime_set_speed ();
1891 _n_channels = channels.size();
1893 in_set_state = false;
1895 /* make sure this is clear before we do anything else */
1897 capturing_sources.clear ();
1899 /* write sources are handled when we handle the input set
1900 up of the IO that owns this DS (::non_realtime_input_change())
1903 in_set_state = false;
1909 AudioDiskstream::use_new_write_source (uint32_t n)
1911 if (!recordable()) {
1915 if (n >= channels.size()) {
1916 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1920 ChannelInfo &chan = channels[n];
1922 if (chan.write_source) {
1923 chan.write_source->done_with_peakfile_writes ();
1924 chan.write_source->set_allow_remove_if_empty (true);
1925 chan.write_source.reset ();
1929 if ((chan.write_source = _session.create_audio_source_for_session (*this, n, destructive())) == 0) {
1930 throw failed_constructor();
1934 catch (failed_constructor &err) {
1935 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1936 chan.write_source.reset ();
1940 /* do not remove destructive files even if they are empty */
1942 chan.write_source->set_allow_remove_if_empty (!destructive());
1948 AudioDiskstream::reset_write_sources (bool mark_write_complete, bool force)
1950 ChannelList::iterator chan;
1953 if (!recordable()) {
1957 capturing_sources.clear ();
1959 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
1960 if (!destructive()) {
1962 if ((*chan).write_source && mark_write_complete) {
1963 (*chan).write_source->mark_streaming_write_completed ();
1965 use_new_write_source (n);
1967 if (record_enabled()) {
1968 capturing_sources.push_back ((*chan).write_source);
1972 if ((*chan).write_source == 0) {
1973 use_new_write_source (n);
1978 if (destructive()) {
1980 /* we now have all our write sources set up, so create the
1981 playlist's single region.
1984 if (_playlist->empty()) {
1985 setup_destructive_playlist ();
1991 AudioDiskstream::rename_write_sources ()
1993 ChannelList::iterator chan;
1996 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
1997 if ((*chan).write_source != 0) {
1998 (*chan).write_source->set_name (_name, destructive());
1999 /* XXX what to do if one of them fails ? */
2007 AudioDiskstream::set_block_size (nframes_t nframes)
2009 if (_session.get_block_size() > speed_buffer_size) {
2010 speed_buffer_size = _session.get_block_size();
2012 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2013 if ((*chan).speed_buffer) delete [] (*chan).speed_buffer;
2014 (*chan).speed_buffer = new Sample[speed_buffer_size];
2017 allocate_temporary_buffers ();
2021 AudioDiskstream::allocate_temporary_buffers ()
2023 /* make sure the wrap buffer is at least large enough to deal
2024 with the speeds up to 1.2, to allow for micro-variation
2025 when slaving to MTC, SMPTE etc.
2028 double sp = max (fabsf (_actual_speed), 1.2f);
2029 nframes_t required_wrap_size = (nframes_t) floor (_session.get_block_size() * sp) + 1;
2031 if (required_wrap_size > wrap_buffer_size) {
2033 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2034 if ((*chan).playback_wrap_buffer) delete [] (*chan).playback_wrap_buffer;
2035 (*chan).playback_wrap_buffer = new Sample[required_wrap_size];
2036 if ((*chan).capture_wrap_buffer) delete [] (*chan).capture_wrap_buffer;
2037 (*chan).capture_wrap_buffer = new Sample[required_wrap_size];
2040 wrap_buffer_size = required_wrap_size;
2045 AudioDiskstream::monitor_input (bool yn)
2047 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2049 if ((*chan).source) {
2050 (*chan).source->ensure_monitor_input (yn);
2056 AudioDiskstream::set_align_style_from_io ()
2058 bool have_physical = false;
2064 get_input_sources ();
2066 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2067 if ((*chan).source && (*chan).source->flags() & JackPortIsPhysical) {
2068 have_physical = true;
2073 if (have_physical) {
2074 set_align_style (ExistingMaterial);
2076 set_align_style (CaptureTime);
2081 AudioDiskstream::add_channel ()
2083 /* XXX need to take lock??? */
2085 /* this copies the ChannelInfo, which currently has no buffers. kind
2086 of pointless really, but we want the channels list to contain
2087 actual objects, not pointers to objects. mostly for convenience,
2088 which isn't much in evidence.
2091 channels.push_back (ChannelInfo());
2093 /* now allocate the buffers */
2095 channels.back().init (_session.diskstream_buffer_size(),
2099 _n_channels = channels.size();
2105 AudioDiskstream::remove_channel ()
2107 if (channels.size() > 1) {
2108 /* XXX need to take lock??? */
2109 channels.back().release ();
2110 channels.pop_back();
2111 _n_channels = channels.size();
2119 AudioDiskstream::playback_buffer_load () const
2121 return (float) ((double) channels.front().playback_buf->read_space()/
2122 (double) channels.front().playback_buf->bufsize());
2126 AudioDiskstream::capture_buffer_load () const
2128 return (float) ((double) channels.front().capture_buf->write_space()/
2129 (double) channels.front().capture_buf->bufsize());
2133 AudioDiskstream::use_pending_capture_data (XMLNode& node)
2135 const XMLProperty* prop;
2136 XMLNodeList nlist = node.children();
2137 XMLNodeIterator niter;
2138 boost::shared_ptr<AudioFileSource> fs;
2139 boost::shared_ptr<AudioFileSource> first_fs;
2140 SourceList pending_sources;
2143 if ((prop = node.property (X_("at"))) == 0) {
2147 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2151 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2152 if ((*niter)->name() == X_("file")) {
2154 if ((prop = (*niter)->property (X_("path"))) == 0) {
2159 fs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createWritable (_session, prop->value(), false, _session.frame_rate()));
2162 catch (failed_constructor& err) {
2163 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2164 _name, prop->value())
2169 pending_sources.push_back (fs);
2171 if (first_fs == 0) {
2175 fs->set_captured_for (_name);
2179 if (pending_sources.size() == 0) {
2180 /* nothing can be done */
2184 if (pending_sources.size() != _n_channels) {
2185 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2190 boost::shared_ptr<AudioRegion> region;
2193 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(),
2194 region_name_from_path (first_fs->name(), true),
2195 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile)));
2196 region->special_set_position (0);
2199 catch (failed_constructor& err) {
2200 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2208 region = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true)));
2211 catch (failed_constructor& err) {
2212 error << string_compose (_("%1: cannot create region from pending capture sources"),
2219 _playlist->add_region (region, position);
2225 AudioDiskstream::set_destructive (bool yn)
2227 bool bounce_ignored;
2229 if (yn != destructive()) {
2232 /* requestor should already have checked this and
2233 bounced if necessary and desired
2235 if (!can_become_destructive (bounce_ignored)) {
2238 _flags = Flag (_flags | Destructive);
2239 use_destructive_playlist ();
2241 _flags = Flag (_flags & ~Destructive);
2242 reset_write_sources (true, true);
2250 AudioDiskstream::can_become_destructive (bool& requires_bounce) const
2253 requires_bounce = false;
2257 /* is there only one region ? */
2259 if (_playlist->n_regions() != 1) {
2260 requires_bounce = true;
2264 boost::shared_ptr<Region> first = _playlist->find_next_region (_session.current_start_frame(), Start, 1);
2267 /* do the source(s) for the region cover the session start position ? */
2269 if (first->position() != _session.current_start_frame()) {
2270 if (first->start() > _session.current_start_frame()) {
2271 requires_bounce = true;
2276 /* is the source used by only 1 playlist ? */
2278 boost::shared_ptr<AudioRegion> afirst = boost::dynamic_pointer_cast<AudioRegion> (first);
2282 if (afirst->source()->used() > 1) {
2283 requires_bounce = true;
2287 requires_bounce = false;
2291 AudioDiskstream::ChannelInfo::ChannelInfo ()
2293 playback_wrap_buffer = 0;
2294 capture_wrap_buffer = 0;
2298 current_capture_buffer = 0;
2299 current_playback_buffer = 0;
2300 curr_capture_cnt = 0;
2303 capture_transition_buf = 0;
2307 AudioDiskstream::ChannelInfo::init (nframes_t bufsize, nframes_t speed_size, nframes_t wrap_size)
2309 speed_buffer = new Sample[speed_size];
2310 playback_wrap_buffer = new Sample[wrap_size];
2311 capture_wrap_buffer = new Sample[wrap_size];
2313 playback_buf = new RingBufferNPT<Sample> (bufsize);
2314 capture_buf = new RingBufferNPT<Sample> (bufsize);
2315 capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
2317 /* touch the ringbuffer buffers, which will cause
2318 them to be mapped into locked physical RAM if
2319 we're running with mlockall(). this doesn't do
2323 memset (playback_buf->buffer(), 0, sizeof (Sample) * playback_buf->bufsize());
2324 memset (capture_buf->buffer(), 0, sizeof (Sample) * capture_buf->bufsize());
2325 memset (capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * capture_transition_buf->bufsize());
2328 AudioDiskstream::ChannelInfo::~ChannelInfo ()
2333 AudioDiskstream::ChannelInfo::release ()
2336 write_source.reset ();
2340 delete [] speed_buffer;
2344 if (playback_wrap_buffer) {
2345 delete [] playback_wrap_buffer;
2346 playback_wrap_buffer = 0;
2349 if (capture_wrap_buffer) {
2350 delete [] capture_wrap_buffer;
2351 capture_wrap_buffer = 0;
2355 delete playback_buf;
2364 if (capture_transition_buf) {
2365 delete capture_transition_buf;
2366 capture_transition_buf = 0;