2 Copyright (C) 2000-2003 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.
34 #include <pbd/error.h>
35 #include <pbd/basename.h>
36 #include <pbd/lockmonitor.h>
37 #include <pbd/xml++.h>
39 #include <ardour/ardour.h>
40 #include <ardour/audioengine.h>
41 #include <ardour/diskstream.h>
42 #include <ardour/utils.h>
43 #include <ardour/configuration.h>
44 #include <ardour/filesource.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>
55 using namespace ARDOUR;
57 jack_nframes_t DiskStream::disk_io_chunk_frames;
59 sigc::signal<void,DiskStream*> DiskStream::DiskStreamCreated;
60 sigc::signal<void,DiskStream*> DiskStream::CannotRecordNoInput;
61 sigc::signal<void,list<Source*>*> DiskStream::DeleteSources;
62 sigc::signal<void> DiskStream::DiskOverrun;
63 sigc::signal<void> DiskStream::DiskUnderrun;
65 DiskStream::DiskStream (Session &sess, const string &name, Flag flag)
69 /* prevent any write sources from being created */
78 DiskStreamCreated (this); /* EMIT SIGNAL */
81 DiskStream::DiskStream (Session& sess, const XMLNode& node)
88 if (set_state (node)) {
90 throw failed_constructor();
96 use_destructive_playlist ();
99 DiskStreamCreated (this); /* EMIT SIGNAL */
103 DiskStream::init_channel (ChannelInfo &chan)
105 chan.playback_wrap_buffer = 0;
106 chan.capture_wrap_buffer = 0;
107 chan.speed_buffer = 0;
108 chan.peak_power = 0.0f;
109 chan.write_source = 0;
111 chan.current_capture_buffer = 0;
112 chan.current_playback_buffer = 0;
113 chan.curr_capture_cnt = 0;
115 chan.playback_buf = new RingBufferNPT<Sample> (_session.diskstream_buffer_size());
116 chan.capture_buf = new RingBufferNPT<Sample> (_session.diskstream_buffer_size());
117 chan.capture_transition_buf = new RingBufferNPT<CaptureTransition> (128);
120 /* touch the ringbuffer buffers, which will cause
121 them to be mapped into locked physical RAM if
122 we're running with mlockall(). this doesn't do
125 memset (chan.playback_buf->buffer(), 0, sizeof (Sample) * chan.playback_buf->bufsize());
126 memset (chan.capture_buf->buffer(), 0, sizeof (Sample) * chan.capture_buf->bufsize());
127 memset (chan.capture_transition_buf->buffer(), 0, sizeof (CaptureTransition) * chan.capture_transition_buf->bufsize());
132 DiskStream::init (Flag f)
138 _alignment_style = ExistingMaterial;
139 _persistent_alignment_style = ExistingMaterial;
140 first_input_change = true;
142 i_am_the_modifier = 0;
143 atomic_set (&_record_enabled, 0);
144 was_recording = false;
145 capture_start_frame = 0;
146 capture_captured = 0;
147 _visible_speed = 1.0f;
148 _actual_speed = 1.0f;
149 _buffer_reallocation_required = false;
150 _seek_required = false;
151 first_recordable_frame = max_frames;
152 last_recordable_frame = max_frames;
157 adjust_capture_position = 0;
158 last_possibly_recording = 0;
160 wrap_buffer_size = 0;
161 speed_buffer_size = 0;
163 phi = (uint64_t) (0x1000000);
166 playback_distance = 0;
167 _read_data_count = 0;
168 _write_data_count = 0;
169 deprecated_io_node = 0;
171 /* there are no channels at this point, so these
172 two calls just get speed_buffer_size and wrap_buffer
173 size setup without duplicating their code.
176 set_block_size (_session.get_block_size());
177 allocate_temporary_buffers ();
179 pending_overwrite = false;
181 overwrite_queued = false;
182 input_change_pending = NoChange;
189 DiskStream::destroy_channel (ChannelInfo &chan)
191 if (chan.write_source) {
192 chan.write_source->release ();
193 chan.write_source = 0;
196 if (chan.speed_buffer) {
197 delete [] chan.speed_buffer;
200 if (chan.playback_wrap_buffer) {
201 delete [] chan.playback_wrap_buffer;
203 if (chan.capture_wrap_buffer) {
204 delete [] chan.capture_wrap_buffer;
207 delete chan.playback_buf;
208 delete chan.capture_buf;
209 delete chan.capture_transition_buf;
211 chan.playback_buf = 0;
212 chan.capture_buf = 0;
215 DiskStream::~DiskStream ()
217 LockMonitor lm (state_lock, __LINE__, __FILE__);
223 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
224 destroy_channel((*chan));
231 DiskStream::handle_input_change (IOChange change, void *src)
233 LockMonitor lm (state_lock, __LINE__, __FILE__);
235 if (!(input_change_pending & change)) {
236 input_change_pending = IOChange (input_change_pending|change);
237 _session.request_input_change_handling ();
242 DiskStream::non_realtime_input_change ()
245 LockMonitor lm (state_lock, __LINE__, __FILE__);
247 if (input_change_pending == NoChange) {
251 if (input_change_pending & ConfigurationChanged) {
253 if (_io->n_inputs() > _n_channels) {
255 // we need to add new channel infos
257 int diff = _io->n_inputs() - channels.size();
259 for (int i = 0; i < diff; ++i) {
263 } else if (_io->n_inputs() < _n_channels) {
265 // we need to get rid of channels
267 int diff = channels.size() - _io->n_inputs();
269 for (int i = 0; i < diff; ++i) {
275 get_input_sources ();
276 set_capture_offset ();
278 if (first_input_change) {
279 set_align_style (_persistent_alignment_style);
280 first_input_change = false;
282 set_align_style_from_io ();
285 input_change_pending = NoChange;
288 /* reset capture files */
290 reset_write_sources (false);
292 /* now refill channel buffers */
294 if (speed() != 1.0f || speed() != -1.0f) {
295 seek ((jack_nframes_t) (_session.transport_frame() * (double) speed()));
298 seek (_session.transport_frame());
303 DiskStream::get_input_sources ()
305 uint32_t ni = _io->n_inputs();
307 for (uint32_t n = 0; n < ni; ++n) {
309 const char **connections = _io->input(n)->get_connections ();
310 ChannelInfo& chan = channels[n];
312 if (connections == 0 || connections[0] == 0) {
315 // _source->disable_metering ();
321 chan.source = _session.engine().get_port_by_name (connections[0]);
331 DiskStream::find_and_use_playlist (const string& name)
334 AudioPlaylist* playlist;
336 if ((pl = _session.get_playlist (name)) == 0) {
337 error << string_compose(_("DiskStream: Session doesn't know about a Playlist called \"%1\""), name) << endmsg;
341 if ((playlist = dynamic_cast<AudioPlaylist*> (pl)) == 0) {
342 error << string_compose(_("DiskStream: Playlist \"%1\" isn't an audio playlist"), name) << endmsg;
346 return use_playlist (playlist);
350 DiskStream::use_playlist (AudioPlaylist* playlist)
353 LockMonitor lm (state_lock, __LINE__, __FILE__);
355 if (playlist == _playlist) {
359 plstate_connection.disconnect();
360 plmod_connection.disconnect ();
361 plgone_connection.disconnect ();
367 _playlist = playlist;
370 if (!in_set_state && recordable()) {
371 reset_write_sources (false);
374 plstate_connection = _playlist->StateChanged.connect (mem_fun (*this, &DiskStream::playlist_changed));
375 plmod_connection = _playlist->Modified.connect (mem_fun (*this, &DiskStream::playlist_modified));
376 plgone_connection = _playlist->GoingAway.connect (mem_fun (*this, &DiskStream::playlist_deleted));
379 if (!overwrite_queued) {
380 _session.request_overwrite_buffer (this);
381 overwrite_queued = true;
384 PlaylistChanged (); /* EMIT SIGNAL */
385 _session.set_dirty ();
391 DiskStream::playlist_deleted (Playlist* pl)
393 /* this catches an ordering issue with session destruction. playlists
394 are destroyed before diskstreams. we have to invalidate any handles
395 we have to the playlist.
402 DiskStream::use_new_playlist ()
405 AudioPlaylist* playlist;
407 if (!in_set_state && destructive()) {
412 newname = Playlist::bump_name (_playlist->name(), _session);
414 newname = Playlist::bump_name (_name, _session);
417 if ((playlist = new AudioPlaylist (_session, newname, hidden())) != 0) {
418 playlist->set_orig_diskstream_id (id());
419 return use_playlist (playlist);
426 DiskStream::use_copy_playlist ()
432 if (_playlist == 0) {
433 error << string_compose(_("DiskStream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
438 AudioPlaylist* playlist;
440 newname = Playlist::bump_name (_playlist->name(), _session);
442 if ((playlist = new AudioPlaylist (*_playlist, newname)) != 0) {
443 playlist->set_orig_diskstream_id (id());
444 return use_playlist (playlist);
451 DiskStream::setup_destructive_playlist ()
453 AudioRegion::SourceList srcs;
455 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
456 srcs.push_back ((*chan).write_source);
459 /* a single full-sized region */
461 AudioRegion* region = new AudioRegion (srcs, 0, max_frames, _name);
462 _playlist->add_region (*region, 0);
466 DiskStream::use_destructive_playlist ()
468 /* use the sources associated with the single full-extent region */
470 Playlist::RegionList* rl = _playlist->regions_at (0);
473 throw failed_constructor();
476 AudioRegion* region = dynamic_cast<AudioRegion*> (rl->front());
479 throw failed_constructor();
485 ChannelList::iterator chan;
487 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
488 (*chan).write_source = dynamic_cast<FileSource*>(®ion->source (n));
489 (*chan).write_source->set_allow_remove_if_empty (false);
492 /* the source list will never be reset for a destructive track */
496 DiskStream::set_io (IO& io)
499 set_align_style_from_io ();
503 DiskStream::set_name (string str, void *src)
506 _playlist->set_name (str);
509 if (!in_set_state && recordable()) {
510 /* rename existing capture files so that they have the correct name */
511 return rename_write_sources ();
521 DiskStream::set_speed (double sp)
523 _session.request_diskstream_speed (*this, sp);
525 /* to force a rebuffering at the right place */
530 DiskStream::realtime_set_speed (double sp, bool global)
532 bool changed = false;
533 double new_speed = sp * _session.transport_speed();
535 if (_visible_speed != sp) {
540 if (new_speed != _actual_speed) {
542 jack_nframes_t required_wrap_size = (jack_nframes_t) floor (_session.get_block_size() *
543 fabs (new_speed)) + 1;
545 if (required_wrap_size > wrap_buffer_size) {
546 _buffer_reallocation_required = true;
549 _actual_speed = new_speed;
550 phi = (uint64_t) (0x1000000 * fabs(_actual_speed));
555 _seek_required = true;
557 speed_changed (); /* EMIT SIGNAL */
560 return _buffer_reallocation_required || _seek_required;
564 DiskStream::non_realtime_set_speed ()
566 if (_buffer_reallocation_required)
568 LockMonitor lm (state_lock, __LINE__, __FILE__);
569 allocate_temporary_buffers ();
571 _buffer_reallocation_required = false;
574 if (_seek_required) {
575 if (speed() != 1.0f || speed() != -1.0f) {
576 seek ((jack_nframes_t) (_session.transport_frame() * (double) speed()), true);
579 seek (_session.transport_frame(), true);
582 _seek_required = false;
587 DiskStream::prepare ()
590 playback_distance = 0;
594 DiskStream::check_record_status (jack_nframes_t transport_frame, jack_nframes_t nframes, bool can_record)
596 int possibly_recording;
599 const int transport_rolling = 0x4;
600 const int track_rec_enabled = 0x2;
601 const int global_rec_enabled = 0x1;
603 /* merge together the 3 factors that affect record status, and compute
607 rolling = _session.transport_speed() != 0.0f;
608 possibly_recording = (rolling << 2) | (record_enabled() << 1) | can_record;
609 change = possibly_recording ^ last_possibly_recording;
611 if (possibly_recording == last_possibly_recording) {
617 /* if per-track or global rec-enable turned on while the other was already on, we've started recording */
619 if ((change & track_rec_enabled) && record_enabled() && (!(change & global_rec_enabled) && can_record) ||
620 ((change & global_rec_enabled) && can_record && (!(change & track_rec_enabled) && record_enabled()))) {
622 /* starting to record: compute first+last frames */
624 first_recordable_frame = transport_frame + _capture_offset;
625 last_recordable_frame = max_frames;
626 capture_start_frame = transport_frame;
628 if (!(last_possibly_recording & transport_rolling) && (possibly_recording & transport_rolling)) {
630 /* was stopped, now rolling (and recording) */
632 if (_alignment_style == ExistingMaterial) {
633 first_recordable_frame += _session.worst_output_latency();
635 first_recordable_frame += _roll_delay;
640 /* was rolling, but record state changed */
642 if (_alignment_style == ExistingMaterial) {
645 if (!_session.get_punch_in()) {
647 /* manual punch in happens at the correct transport frame
648 because the user hit a button. but to get alignment correct
649 we have to back up the position of the new region to the
650 appropriate spot given the roll delay.
653 capture_start_frame -= _roll_delay;
655 /* XXX paul notes (august 2005): i don't know why
659 first_recordable_frame += _capture_offset;
663 /* autopunch toggles recording at the precise
664 transport frame, and then the DS waits
665 to start recording for a time that depends
666 on the output latency.
669 first_recordable_frame += _session.worst_output_latency();
674 if (_session.get_punch_in()) {
675 first_recordable_frame += _roll_delay;
677 capture_start_frame -= _roll_delay;
683 if (_flags & Recordable) {
684 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
686 RingBufferNPT<CaptureTransition>::rw_vector transvec;
687 (*chan).capture_transition_buf->get_write_vector(&transvec);
689 if (transvec.len[0] > 0) {
690 transvec.buf[0]->type = CaptureStart;
691 transvec.buf[0]->capture_val = capture_start_frame;
692 (*chan).capture_transition_buf->increment_write_ptr(1);
696 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
702 } else if (!record_enabled() || !can_record) {
706 last_recordable_frame = transport_frame + _capture_offset;
708 if (_alignment_style == ExistingMaterial) {
709 last_recordable_frame += _session.worst_output_latency();
711 last_recordable_frame += _roll_delay;
715 last_possibly_recording = possibly_recording;
719 DiskStream::process (jack_nframes_t transport_frame, jack_nframes_t nframes, jack_nframes_t offset, bool can_record, bool rec_monitors_input)
722 ChannelList::iterator c;
724 jack_nframes_t rec_offset = 0;
725 jack_nframes_t rec_nframes = 0;
726 bool nominally_recording;
727 bool re = record_enabled ();
728 bool collect_playback = false;
730 /* if we've already processed the frames corresponding to this call,
731 just return. this allows multiple routes that are taking input
732 from this diskstream to call our ::process() method, but have
733 this stuff only happen once. more commonly, it allows both
734 the AudioTrack that is using this DiskStream *and* the Session
735 to call process() without problems.
742 check_record_status (transport_frame, nframes, can_record);
744 nominally_recording = (can_record && re);
751 /* This lock is held until the end of DiskStream::commit, so these two functions
752 must always be called as a pair. The only exception is if this function
753 returns a non-zero value, in which case, ::commit should not be called.
756 if (pthread_mutex_trylock (state_lock.mutex())) {
760 adjust_capture_position = 0;
762 for (c = channels.begin(); c != channels.end(); ++c) {
763 (*c).current_capture_buffer = 0;
764 (*c).current_playback_buffer = 0;
767 if (nominally_recording || (_session.get_record_enabled() && _session.get_punch_in())) {
770 ot = coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
777 case OverlapInternal:
778 /* ---------- recrange
781 rec_nframes = nframes;
786 /* |--------| recrange
789 rec_nframes = transport_frame + nframes - first_recordable_frame;
791 rec_offset = first_recordable_frame - transport_frame;
796 /* |--------| recrange
799 rec_nframes = last_recordable_frame - transport_frame;
803 case OverlapExternal:
804 /* |--------| recrange
805 -------------- transrange
807 rec_nframes = last_recordable_frame - last_recordable_frame;
808 rec_offset = first_recordable_frame - transport_frame;
812 if (rec_nframes && !was_recording) {
813 capture_captured = 0;
814 was_recording = true;
819 if (can_record && !_last_capture_regions.empty()) {
820 _last_capture_regions.clear ();
823 if (nominally_recording || rec_nframes) {
825 for (n = 0, c = channels.begin(); c != channels.end(); ++c, ++n) {
827 ChannelInfo& chan (*c);
829 chan.capture_buf->get_write_vector (&chan.capture_vector);
831 if (rec_nframes <= chan.capture_vector.len[0]) {
833 chan.current_capture_buffer = chan.capture_vector.buf[0];
835 /* note: grab the entire port buffer, but only copy what we were supposed to for recording, and use
839 memcpy (chan.current_capture_buffer, _io->input(n)->get_buffer (rec_nframes) + offset + rec_offset, sizeof (Sample) * rec_nframes);
843 jack_nframes_t total = chan.capture_vector.len[0] + chan.capture_vector.len[1];
845 if (rec_nframes > total) {
850 Sample* buf = _io->input (n)->get_buffer (nframes) + offset;
851 jack_nframes_t first = chan.capture_vector.len[0];
853 memcpy (chan.capture_wrap_buffer, buf, sizeof (Sample) * first);
854 memcpy (chan.capture_vector.buf[0], buf, sizeof (Sample) * first);
855 memcpy (chan.capture_wrap_buffer+first, buf + first, sizeof (Sample) * (rec_nframes - first));
856 memcpy (chan.capture_vector.buf[1], buf + first, sizeof (Sample) * (rec_nframes - first));
858 chan.current_capture_buffer = chan.capture_wrap_buffer;
865 finish_capture (rec_monitors_input);
872 /* data will be written to disk */
874 if (rec_nframes == nframes && rec_offset == 0) {
876 for (c = channels.begin(); c != channels.end(); ++c) {
877 (*c).current_playback_buffer = (*c).current_capture_buffer;
880 playback_distance = nframes;
885 /* we can't use the capture buffer as the playback buffer, because
886 we recorded only a part of the current process' cycle data
890 collect_playback = true;
893 adjust_capture_position = rec_nframes;
895 } else if (nominally_recording) {
897 /* can't do actual capture yet - waiting for latency effects to finish before we start*/
899 for (c = channels.begin(); c != channels.end(); ++c) {
900 (*c).current_playback_buffer = (*c).current_capture_buffer;
903 playback_distance = nframes;
907 collect_playback = true;
910 if (collect_playback) {
912 /* we're doing playback */
914 jack_nframes_t necessary_samples;
916 /* no varispeed playback if we're recording, because the output .... TBD */
918 if (rec_nframes == 0 && _actual_speed != 1.0f) {
919 necessary_samples = (jack_nframes_t) floor ((nframes * fabs (_actual_speed))) + 1;
921 necessary_samples = nframes;
924 for (c = channels.begin(); c != channels.end(); ++c) {
925 (*c).playback_buf->get_read_vector (&(*c).playback_vector);
930 for (c = channels.begin(); c != channels.end(); ++c, ++n) {
932 ChannelInfo& chan (*c);
934 if (necessary_samples <= chan.playback_vector.len[0]) {
936 chan.current_playback_buffer = chan.playback_vector.buf[0];
939 jack_nframes_t total = chan.playback_vector.len[0] + chan.playback_vector.len[1];
941 if (necessary_samples > total) {
947 memcpy ((char *) chan.playback_wrap_buffer, chan.playback_vector.buf[0],
948 chan.playback_vector.len[0] * sizeof (Sample));
949 memcpy (chan.playback_wrap_buffer + chan.playback_vector.len[0], chan.playback_vector.buf[1],
950 (necessary_samples - chan.playback_vector.len[0]) * sizeof (Sample));
952 chan.current_playback_buffer = chan.playback_wrap_buffer;
957 if (rec_nframes == 0 && _actual_speed != 1.0f && _actual_speed != -1.0f) {
959 uint64_t phase = last_phase;
960 jack_nframes_t i = 0;
962 // Linearly interpolate into the alt buffer
963 // using 40.24 fixp maths (swh)
965 for (c = channels.begin(); c != channels.end(); ++c) {
968 ChannelInfo& chan (*c);
973 for (jack_nframes_t outsample = 0; outsample < nframes; ++outsample) {
975 fr = (phase & 0xFFFFFF) / 16777216.0f;
976 chan.speed_buffer[outsample] =
977 chan.current_playback_buffer[i] * (1.0f - fr) +
978 chan.current_playback_buffer[i+1] * fr;
982 chan.current_playback_buffer = chan.speed_buffer;
985 playback_distance = i + 1;
986 last_phase = (phase & 0xFFFFFF);
989 playback_distance = nframes;
1001 /* we're exiting with failure, so ::commit will not
1002 be called. unlock the state lock.
1005 pthread_mutex_unlock (state_lock.mutex());
1012 DiskStream::recover ()
1014 pthread_mutex_unlock (state_lock.mutex());
1019 DiskStream::commit (jack_nframes_t nframes)
1021 bool need_butler = false;
1023 if (_actual_speed < 0.0) {
1024 playback_sample -= playback_distance;
1026 playback_sample += playback_distance;
1029 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1031 (*chan).playback_buf->increment_read_ptr (playback_distance);
1033 if (adjust_capture_position) {
1034 (*chan).capture_buf->increment_write_ptr (adjust_capture_position);
1038 if (adjust_capture_position != 0) {
1039 capture_captured += adjust_capture_position;
1040 adjust_capture_position = 0;
1044 need_butler = channels[0].playback_buf->write_space() >= channels[0].playback_buf->bufsize() / 2;
1046 need_butler = channels[0].playback_buf->write_space() >= disk_io_chunk_frames
1047 || channels[0].capture_buf->read_space() >= disk_io_chunk_frames;
1050 pthread_mutex_unlock (state_lock.mutex());
1058 DiskStream::set_pending_overwrite (bool yn)
1060 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
1062 pending_overwrite = yn;
1064 overwrite_frame = playback_sample;
1065 overwrite_offset = channels.front().playback_buf->get_read_ptr();
1069 DiskStream::overwrite_existing_buffers ()
1071 Sample* mixdown_buffer;
1075 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1077 overwrite_queued = false;
1079 /* assume all are the same size */
1080 jack_nframes_t size = channels[0].playback_buf->bufsize();
1082 mixdown_buffer = new Sample[size];
1083 gain_buffer = new float[size];
1084 workbuf = new char[size*4];
1086 /* reduce size so that we can fill the buffer correctly. */
1090 jack_nframes_t start;
1092 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1094 start = overwrite_frame;
1095 jack_nframes_t cnt = size;
1097 /* to fill the buffer without resetting the playback sample, we need to
1098 do it one or two chunks (normally two).
1100 |----------------------------------------------------------------------|
1104 |<- second chunk->||<----------------- first chunk ------------------>|
1108 jack_nframes_t to_read = size - overwrite_offset;
1110 if (read ((*chan).playback_buf->buffer() + overwrite_offset, mixdown_buffer, gain_buffer, workbuf,
1111 start, to_read, *chan, n, reversed)) {
1112 error << string_compose(_("DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"),
1113 _id, size, playback_sample) << endmsg;
1117 if (cnt > to_read) {
1121 if (read ((*chan).playback_buf->buffer(), mixdown_buffer, gain_buffer, workbuf,
1122 start, cnt, *chan, n, reversed)) {
1123 error << string_compose(_("DiskStream %1: when refilling, cannot read %2 from playlist at frame %3"),
1124 _id, size, playback_sample) << endmsg;
1133 pending_overwrite = false;
1134 delete [] gain_buffer;
1135 delete [] mixdown_buffer;
1141 DiskStream::seek (jack_nframes_t frame, bool complete_refill)
1143 LockMonitor lm (state_lock, __LINE__, __FILE__);
1146 ChannelList::iterator chan;
1148 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1149 (*chan).playback_buf->reset ();
1150 (*chan).capture_buf->reset ();
1151 if ((*chan).write_source) {
1152 (*chan).write_source->seek (frame);
1156 playback_sample = frame;
1159 if (complete_refill) {
1160 while ((ret = do_refill (0, 0, 0)) > 0);
1162 ret = do_refill (0, 0, 0);
1169 DiskStream::can_internal_playback_seek (jack_nframes_t distance)
1171 ChannelList::iterator chan;
1173 for (chan = channels.begin(); chan != channels.end(); ++chan) {
1174 if ((*chan).playback_buf->read_space() < distance) {
1182 DiskStream::internal_playback_seek (jack_nframes_t distance)
1184 ChannelList::iterator chan;
1186 for (chan = channels.begin(); chan != channels.end(); ++chan) {
1187 (*chan).playback_buf->increment_read_ptr (distance);
1190 first_recordable_frame += distance;
1191 playback_sample += distance;
1197 DiskStream::read (Sample* buf, Sample* mixdown_buffer, float* gain_buffer, char * workbuf, jack_nframes_t& start, jack_nframes_t cnt,
1198 ChannelInfo& channel_info, int channel, bool reversed)
1200 jack_nframes_t this_read = 0;
1201 bool reloop = false;
1202 jack_nframes_t loop_end = 0;
1203 jack_nframes_t loop_start = 0;
1204 jack_nframes_t loop_length = 0;
1205 jack_nframes_t offset = 0;
1209 /* Make the use of a Location atomic for this read operation.
1211 Note: Locations don't get deleted, so all we care about
1212 when I say "atomic" is that we are always pointing to
1213 the same one and using a start/length values obtained
1217 if ((loc = loop_location) != 0) {
1218 loop_start = loc->start();
1219 loop_end = loc->end();
1220 loop_length = loop_end - loop_start;
1223 /* if we are looping, ensure that the first frame we read is at the correct
1224 position within the loop.
1227 if (loc && start >= loop_end) {
1228 //cerr << "start adjusted from " << start;
1229 start = loop_start + ((start - loop_start) % loop_length);
1230 //cerr << "to " << start << endl;
1232 //cerr << "start is " << start << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
1237 /* take any loop into account. we can't read past the end of the loop. */
1239 if (loc && (loop_end - start < cnt)) {
1240 this_read = loop_end - start;
1241 //cerr << "reloop true: thisread: " << this_read << " cnt: " << cnt << endl;
1248 if (this_read == 0) {
1252 this_read = min(cnt,this_read);
1254 if (_playlist->read (buf+offset, mixdown_buffer, gain_buffer, workbuf, start, this_read, channel) != this_read) {
1255 error << string_compose(_("DiskStream %1: cannot read %2 from playlist at frame %3"), _id, this_read,
1260 _read_data_count = _playlist->read_data_count();
1264 /* don't adjust start, since caller has already done that
1267 swap_by_ptr (buf, buf + this_read - 1);
1271 /* if we read to the end of the loop, go back to the beginning */
1281 offset += this_read;
1288 DiskStream::do_refill (Sample* mixdown_buffer, float* gain_buffer, char * workbuf)
1291 jack_nframes_t to_read;
1292 RingBufferNPT<Sample>::rw_vector vector;
1296 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
1297 jack_nframes_t total_space;
1298 jack_nframes_t zero_fill;
1300 ChannelList::iterator i;
1303 channels.front().playback_buf->get_write_vector (&vector);
1305 if ((total_space = vector.len[0] + vector.len[1]) == 0) {
1309 /* if there are 2+ chunks of disk i/o possible for
1310 this track, let the caller know so that it can arrange
1311 for us to be called again, ASAP.
1314 if (total_space >= (_slaved?3:2) * disk_io_chunk_frames) {
1318 /* if we're running close to normal speed and there isn't enough
1319 space to do disk_io_chunk_frames of I/O, then don't bother.
1321 at higher speeds, just do it because the sync between butler
1322 and audio thread may not be good enough.
1325 if ((total_space < disk_io_chunk_frames) && fabs (_actual_speed) < 2.0f) {
1329 /* when slaved, don't try to get too close to the read pointer. this
1330 leaves space for the buffer reversal to have something useful to
1334 if (_slaved && total_space < (channels.front().playback_buf->bufsize() / 2)) {
1338 total_space = min (disk_io_chunk_frames, total_space);
1342 if (file_frame == 0) {
1344 /* at start: nothing to do but fill with silence */
1346 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1348 ChannelInfo& chan (*i);
1349 chan.playback_buf->get_write_vector (&vector);
1350 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1351 if (vector.len[1]) {
1352 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1354 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1359 if (file_frame < total_space) {
1361 /* too close to the start: read what we can,
1362 and then zero fill the rest
1365 zero_fill = total_space - file_frame;
1366 total_space = file_frame;
1371 /* move read position backwards because we are going
1372 to reverse the data.
1375 file_frame -= total_space;
1381 if (file_frame == max_frames) {
1383 /* at end: nothing to do but fill with silence */
1385 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1387 ChannelInfo& chan (*i);
1388 chan.playback_buf->get_write_vector (&vector);
1389 memset (vector.buf[0], 0, sizeof(Sample) * vector.len[0]);
1390 if (vector.len[1]) {
1391 memset (vector.buf[1], 0, sizeof(Sample) * vector.len[1]);
1393 chan.playback_buf->increment_write_ptr (vector.len[0] + vector.len[1]);
1398 if (file_frame > max_frames - total_space) {
1400 /* to close to the end: read what we can, and zero fill the rest */
1402 zero_fill = total_space - (max_frames - file_frame);
1403 total_space = max_frames - file_frame;
1410 /* Please note: the code to allocate buffers isn't run
1411 during normal butler thread operation. Its there
1412 for other times when we need to call do_refill()
1413 from somewhere other than the butler thread.
1416 if (mixdown_buffer == 0) {
1417 mixdown_buffer = new Sample[disk_io_chunk_frames];
1418 free_mixdown = true;
1420 free_mixdown = false;
1423 if (gain_buffer == 0) {
1424 gain_buffer = new float[disk_io_chunk_frames];
1431 workbuf = new char[disk_io_chunk_frames * 4];
1432 free_workbuf = true;
1434 free_workbuf = false;
1437 jack_nframes_t file_frame_tmp = 0;
1439 for (chan_n = 0, i = channels.begin(); i != channels.end(); ++i, ++chan_n) {
1441 ChannelInfo& chan (*i);
1444 jack_nframes_t len1, len2;
1446 chan.playback_buf->get_write_vector (&vector);
1449 file_frame_tmp = file_frame;
1452 buf1 = vector.buf[1];
1453 len1 = vector.len[1];
1454 buf2 = vector.buf[0];
1455 len2 = vector.len[0];
1457 buf1 = vector.buf[0];
1458 len1 = vector.len[0];
1459 buf2 = vector.buf[1];
1460 len2 = vector.len[1];
1464 to_read = min (ts, len1);
1465 to_read = min (to_read, disk_io_chunk_frames);
1469 if (read (buf1, mixdown_buffer, gain_buffer, workbuf, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1474 chan.playback_buf->increment_write_ptr (to_read);
1478 to_read = min (ts, len2);
1483 /* we read all of vector.len[0], but it wasn't an entire disk_io_chunk_frames of data,
1484 so read some or all of vector.len[1] as well.
1487 if (read (buf2, mixdown_buffer, gain_buffer, workbuf, file_frame_tmp, to_read, chan, chan_n, reversed)) {
1492 chan.playback_buf->increment_write_ptr (to_read);
1501 file_frame = file_frame_tmp;
1505 delete [] mixdown_buffer;
1508 delete [] gain_buffer;
1518 DiskStream::do_flush (char * workbuf, bool force_flush)
1522 RingBufferNPT<Sample>::rw_vector vector;
1523 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1524 jack_nframes_t total;
1526 /* important note: this function will write *AT MOST*
1527 disk_io_chunk_frames of data to disk. it will never
1528 write more than that. if its writes that much and there
1529 is more than that waiting to be written, it will return 1,
1530 otherwise 0 on success or -1 on failure.
1532 if there is less than disk_io_chunk_frames to be written,
1533 no data will be written at all unless `force_flush' is true.
1536 _write_data_count = 0;
1538 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1540 (*chan).capture_buf->get_read_vector (&vector);
1542 total = vector.len[0] + vector.len[1];
1545 if (total == 0 || (total < disk_io_chunk_frames && !force_flush && was_recording)) {
1550 /* if there are 2+ chunks of disk i/o possible for
1551 this track, let the caller know so that it can arrange
1552 for us to be called again, ASAP.
1554 if we are forcing a flush, then if there is* any* extra
1555 work, let the caller know.
1557 if we are no longer recording and there is any extra work,
1558 let the caller know too.
1561 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
1565 to_write = min (disk_io_chunk_frames, (jack_nframes_t) vector.len[0]);
1568 // check the transition buffer when recording destructive
1569 // important that we get this after the capture buf
1571 if (destructive()) {
1572 (*chan).capture_transition_buf->get_read_vector(&transvec);
1573 size_t transcount = transvec.len[0] + transvec.len[1];
1574 bool have_start = false;
1577 for (ti=0; ti < transcount; ++ti) {
1578 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
1580 if (captrans.type == CaptureStart) {
1581 // by definition, the first data we got above represents the given capture pos
1583 (*chan).write_source->mark_capture_start (captrans.capture_val);
1584 (*chan).curr_capture_cnt = 0;
1588 else if (captrans.type == CaptureEnd) {
1590 // capture end, the capture_val represents total frames in capture
1592 if (captrans.capture_val <= (*chan).curr_capture_cnt + to_write) {
1594 // shorten to make the write a perfect fit
1595 uint32_t nto_write = (captrans.capture_val - (*chan).curr_capture_cnt);
1597 if (nto_write < to_write) {
1598 ret = 1; // should we?
1600 to_write = nto_write;
1602 (*chan).write_source->mark_capture_end ();
1604 // increment past this transition, but go no further
1609 // actually ends just beyond this chunk, so force more work
1617 (*chan).capture_transition_buf->increment_read_ptr(ti);
1621 if ((!(*chan).write_source) || (*chan).write_source->write (vector.buf[0], to_write, workbuf) != to_write) {
1622 error << string_compose(_("DiskStream %1: cannot write to disk"), _id) << endmsg;
1626 (*chan).capture_buf->increment_read_ptr (to_write);
1627 (*chan).curr_capture_cnt += to_write;
1629 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < disk_io_chunk_frames) && !destructive()) {
1631 /* we wrote all of vector.len[0] but it wasn't an entire
1632 disk_io_chunk_frames of data, so arrange for some part
1633 of vector.len[1] to be flushed to disk as well.
1636 to_write = min ((jack_nframes_t)(disk_io_chunk_frames - to_write), (jack_nframes_t) vector.len[1]);
1638 if ((*chan).write_source->write (vector.buf[1], to_write, workbuf) != to_write) {
1639 error << string_compose(_("DiskStream %1: cannot write to disk"), _id) << endmsg;
1643 _write_data_count += (*chan).write_source->write_data_count();
1645 (*chan).capture_buf->increment_read_ptr (to_write);
1646 (*chan).curr_capture_cnt += to_write;
1655 DiskStream::playlist_changed (Change ignored)
1657 playlist_modified ();
1661 DiskStream::playlist_modified ()
1663 if (!i_am_the_modifier && !overwrite_queued) {
1664 _session.request_overwrite_buffer (this);
1665 overwrite_queued = true;
1670 DiskStream::transport_stopped (struct tm& when, time_t twhen, bool abort_capture)
1672 uint32_t buffer_position;
1673 bool more_work = true;
1675 AudioRegion* region = 0;
1676 jack_nframes_t total_capture;
1677 AudioRegion::SourceList srcs;
1678 AudioRegion::SourceList::iterator src;
1679 ChannelList::iterator chan;
1680 vector<CaptureInfo*>::iterator ci;
1682 list<Source*>* deletion_list;
1683 bool mark_write_completed = false;
1685 finish_capture (true);
1687 /* butler is already stopped, but there may be work to do
1688 to flush remaining data to disk.
1691 while (more_work && !err) {
1692 switch (do_flush ( _session.conversion_buffer(Session::TransportContext), true)) {
1699 error << string_compose(_("DiskStream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1704 /* XXX is there anything we can do if err != 0 ? */
1705 LockMonitor lm (capture_info_lock, __LINE__, __FILE__);
1707 if (capture_info.empty()) {
1711 if (abort_capture) {
1713 ChannelList::iterator chan;
1715 deletion_list = new list<Source*>;
1717 for ( chan = channels.begin(); chan != channels.end(); ++chan) {
1719 if ((*chan).write_source) {
1721 (*chan).write_source->mark_for_remove ();
1722 (*chan).write_source->release ();
1724 deletion_list->push_back ((*chan).write_source);
1726 (*chan).write_source = 0;
1729 /* new source set up in "out" below */
1732 if (!deletion_list->empty()) {
1733 DeleteSources (deletion_list);
1735 delete deletion_list;
1741 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1742 total_capture += (*ci)->frames;
1745 /* figure out the name for this take */
1747 for (n = 0, chan = channels.begin(); chan != channels.end(); ++chan, ++n) {
1749 Source* s = (*chan).write_source;
1757 if ((fsrc = dynamic_cast<FileSource *>(s)) != 0) {
1758 fsrc->update_header (capture_info.front()->start, when, twhen);
1761 s->set_captured_for (_name);
1766 /* destructive tracks have a single, never changing region */
1768 if (destructive()) {
1770 /* send a signal that any UI can pick up to do the right thing. there is
1771 a small problem here in that a UI may need the peak data to be ready
1772 for the data that was recorded and this isn't interlocked with that
1773 process. this problem is deferred to the UI.
1776 _playlist->Modified();
1780 /* Register a new region with the Session that
1781 describes the entire source. Do this first
1782 so that any sub-regions will obviously be
1783 children of this one (later!)
1787 region = new AudioRegion (srcs, channels[0].write_source->last_capture_start_frame(), total_capture,
1788 region_name_from_path (channels[0].write_source->name()),
1789 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile));
1791 region->special_set_position (capture_info.front()->start);
1795 catch (failed_constructor& err) {
1796 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1800 _last_capture_regions.push_back (region);
1802 // cerr << _name << ": there are " << capture_info.size() << " capture_info records\n";
1804 _session.add_undo (_playlist->get_memento());
1805 _playlist->freeze ();
1807 for (buffer_position = channels[0].write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1810 _session.region_name (region_name, _name, false);
1812 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1815 region = new AudioRegion (srcs, buffer_position, (*ci)->frames, region_name);
1818 catch (failed_constructor& err) {
1819 error << _("DiskStream: could not create region for captured audio!") << endmsg;
1820 continue; /* XXX is this OK? */
1823 _last_capture_regions.push_back (region);
1825 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1827 i_am_the_modifier++;
1828 _playlist->add_region (*region, (*ci)->start);
1829 i_am_the_modifier--;
1831 buffer_position += (*ci)->frames;
1835 _session.add_redo_no_execute (_playlist->get_memento());
1838 mark_write_completed = true;
1840 reset_write_sources (mark_write_completed);
1843 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1847 capture_info.clear ();
1848 capture_start_frame = 0;
1852 DiskStream::finish_capture (bool rec_monitors_input)
1854 was_recording = false;
1856 if (capture_captured == 0) {
1860 if (recordable() && destructive()) {
1861 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1863 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1864 (*chan).capture_transition_buf->get_write_vector(&transvec);
1867 if (transvec.len[0] > 0) {
1868 transvec.buf[0]->type = CaptureEnd;
1869 transvec.buf[0]->capture_val = capture_captured;
1870 (*chan).capture_transition_buf->increment_write_ptr(1);
1874 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
1880 CaptureInfo* ci = new CaptureInfo;
1882 ci->start = capture_start_frame;
1883 ci->frames = capture_captured;
1885 /* XXX theoretical race condition here. Need atomic exchange ?
1886 However, the circumstances when this is called right
1887 now (either on record-disable or transport_stopped)
1888 mean that no actual race exists. I think ...
1889 We now have a capture_info_lock, but it is only to be used
1890 to synchronize in the transport_stop and the capture info
1891 accessors, so that invalidation will not occur (both non-realtime).
1894 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1896 capture_info.push_back (ci);
1897 capture_captured = 0;
1901 DiskStream::set_record_enabled (bool yn, void* src)
1903 bool rolling = _session.transport_speed() != 0.0f;
1905 if (!recordable() || !_session.record_enabling_legal()) {
1909 /* if we're turning on rec-enable, there needs to be an
1913 if (yn && channels[0].source == 0) {
1915 /* pick up connections not initiated *from* the IO object
1916 we're associated with.
1919 get_input_sources ();
1921 if (channels[0].source == 0) {
1924 CannotRecordNoInput (this); /* emit signal */
1930 /* yes, i know that this not proof against race conditions, but its
1931 good enough. i think.
1934 if (record_enabled() != yn) {
1936 atomic_set (&_record_enabled, 1);
1937 capturing_sources.clear ();
1938 if (Config->get_use_hardware_monitoring()) {
1939 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1940 if ((*chan).source) {
1941 (*chan).source->request_monitor_input (!(_session.get_auto_input() && rolling));
1943 capturing_sources.push_back ((*chan).write_source);
1946 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1947 capturing_sources.push_back ((*chan).write_source);
1952 atomic_set (&_record_enabled, 0);
1953 if (Config->get_use_hardware_monitoring()) {
1954 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
1955 if ((*chan).source) {
1956 (*chan).source->request_monitor_input (false);
1960 capturing_sources.clear ();
1963 record_enable_changed (src); /* EMIT SIGNAL */
1968 DiskStream::get_state ()
1970 XMLNode* node = new XMLNode ("DiskStream");
1972 LocaleGuard lg (X_("POSIX"));
1974 snprintf (buf, sizeof(buf), "0x%x", _flags);
1975 node->add_property ("flags", buf);
1977 snprintf (buf, sizeof(buf), "%zd", channels.size());
1978 node->add_property ("channels", buf);
1980 node->add_property ("playlist", _playlist->name());
1982 snprintf (buf, sizeof(buf), "%f", _visible_speed);
1983 node->add_property ("speed", buf);
1985 node->add_property("name", _name);
1986 snprintf (buf, sizeof(buf), "%" PRIu64, id());
1987 node->add_property("id", buf);
1989 if (!capturing_sources.empty() && _session.get_record_enabled()) {
1991 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1992 XMLNode* cs_grandchild;
1994 for (vector<FileSource*>::iterator i = capturing_sources.begin(); i != capturing_sources.end(); ++i) {
1995 cs_grandchild = new XMLNode (X_("file"));
1996 cs_grandchild->add_property (X_("path"), (*i)->path());
1997 cs_child->add_child_nocopy (*cs_grandchild);
2000 /* store the location where capture will start */
2004 if (_session.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
2005 snprintf (buf, sizeof (buf), "%" PRIu32, pi->start());
2007 snprintf (buf, sizeof (buf), "%" PRIu32, _session.transport_frame());
2010 cs_child->add_property (X_("at"), buf);
2011 node->add_child_nocopy (*cs_child);
2015 node->add_child_copy (*_extra_xml);
2022 DiskStream::set_state (const XMLNode& node)
2024 const XMLProperty* prop;
2025 XMLNodeList nlist = node.children();
2026 XMLNodeIterator niter;
2027 uint32_t nchans = 1;
2028 XMLNode* capture_pending_node = 0;
2029 LocaleGuard lg (X_("POSIX"));
2031 in_set_state = true;
2033 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2034 if ((*niter)->name() == IO::state_node_name) {
2035 deprecated_io_node = new XMLNode (**niter);
2038 if ((*niter)->name() == X_("CapturingSources")) {
2039 capture_pending_node = *niter;
2043 /* prevent write sources from being created */
2045 in_set_state = true;
2047 if ((prop = node.property ("name")) != 0) {
2048 _name = prop->value();
2051 if (deprecated_io_node) {
2052 if ((prop = deprecated_io_node->property ("id")) != 0) {
2053 sscanf (prop->value().c_str(), "%" PRIu64, &_id);
2056 if ((prop = node.property ("id")) != 0) {
2057 sscanf (prop->value().c_str(), "%" PRIu64, &_id);
2061 if ((prop = node.property ("flags")) != 0) {
2062 _flags = strtol (prop->value().c_str(), 0, 0);
2065 if ((prop = node.property ("channels")) != 0) {
2066 nchans = atoi (prop->value().c_str());
2069 // create necessary extra channels
2070 // we are always constructed with one
2071 // and we always need one
2073 if (nchans > _n_channels) {
2075 // we need to add new channel infos
2076 //LockMonitor lm (state_lock, __LINE__, __FILE__);
2078 int diff = nchans - channels.size();
2080 for (int i=0; i < diff; ++i) {
2084 } else if (nchans < _n_channels) {
2086 // we need to get rid of channels
2087 //LockMonitor lm (state_lock, __LINE__, __FILE__);
2089 int diff = channels.size() - nchans;
2091 for (int i = 0; i < diff; ++i) {
2096 if ((prop = node.property ("playlist")) == 0) {
2101 bool had_playlist = (_playlist != 0);
2103 if (find_and_use_playlist (prop->value())) {
2107 if (!had_playlist) {
2108 _playlist->set_orig_diskstream_id (_id);
2111 if (!destructive() && capture_pending_node) {
2112 /* destructive streams have one and only one source per channel,
2113 and so they never end up in pending capture in any useful
2116 use_pending_capture_data (*capture_pending_node);
2121 if ((prop = node.property ("speed")) != 0) {
2122 double sp = atof (prop->value().c_str());
2124 if (realtime_set_speed (sp, false)) {
2125 non_realtime_set_speed ();
2129 _n_channels = channels.size();
2131 in_set_state = false;
2133 /* make sure this is clear before we do anything else */
2135 capturing_sources.clear ();
2137 /* write sources are handled when we handle the input set
2138 up of the IO that owns this DS (::non_realtime_input_change())
2141 in_set_state = false;
2147 DiskStream::use_new_write_source (uint32_t n)
2149 if (!recordable()) {
2153 if (n >= channels.size()) {
2154 error << string_compose (_("DiskStream: channel %1 out of range"), n) << endmsg;
2158 ChannelInfo &chan = channels[n];
2160 if (chan.write_source) {
2162 if (FileSource::is_empty (chan.write_source->path())) {
2163 chan.write_source->mark_for_remove ();
2164 chan.write_source->release();
2165 delete chan.write_source;
2167 chan.write_source->release();
2168 chan.write_source = 0;
2173 if ((chan.write_source = _session.create_file_source (*this, n, destructive())) == 0) {
2174 throw failed_constructor();
2178 catch (failed_constructor &err) {
2179 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
2180 chan.write_source = 0;
2184 chan.write_source->use ();
2186 /* do not remove destructive files even if they are empty */
2188 chan.write_source->set_allow_remove_if_empty (!destructive());
2194 DiskStream::reset_write_sources (bool mark_write_complete, bool force)
2196 ChannelList::iterator chan;
2199 if (!recordable()) {
2203 capturing_sources.clear ();
2205 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
2206 if (!destructive()) {
2208 if ((*chan).write_source && mark_write_complete) {
2209 (*chan).write_source->mark_streaming_write_completed ();
2211 use_new_write_source (n);
2213 if (record_enabled()) {
2214 capturing_sources.push_back ((*chan).write_source);
2218 if ((*chan).write_source == 0) {
2219 use_new_write_source (n);
2224 if (destructive()) {
2226 /* we now have all our write sources set up, so create the
2227 playlist's single region.
2230 if (_playlist->empty()) {
2231 setup_destructive_playlist ();
2237 DiskStream::rename_write_sources ()
2239 ChannelList::iterator chan;
2242 for (chan = channels.begin(), n = 0; chan != channels.end(); ++chan, ++n) {
2243 if ((*chan).write_source != 0) {
2244 (*chan).write_source->set_name (_name, destructive());
2245 /* XXX what to do if one of them fails ? */
2253 DiskStream::set_block_size (jack_nframes_t nframes)
2255 if (_session.get_block_size() > speed_buffer_size) {
2256 speed_buffer_size = _session.get_block_size();
2258 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2259 if ((*chan).speed_buffer) delete [] (*chan).speed_buffer;
2260 (*chan).speed_buffer = new Sample[speed_buffer_size];
2263 allocate_temporary_buffers ();
2267 DiskStream::allocate_temporary_buffers ()
2269 /* make sure the wrap buffer is at least large enough to deal
2270 with the speeds up to 1.2, to allow for micro-variation
2271 when slaving to MTC, SMPTE etc.
2274 double sp = max (fabsf (_actual_speed), 1.2f);
2275 jack_nframes_t required_wrap_size = (jack_nframes_t) floor (_session.get_block_size() * sp) + 1;
2277 if (required_wrap_size > wrap_buffer_size) {
2279 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2280 if ((*chan).playback_wrap_buffer) delete [] (*chan).playback_wrap_buffer;
2281 (*chan).playback_wrap_buffer = new Sample[required_wrap_size];
2282 if ((*chan).capture_wrap_buffer) delete [] (*chan).capture_wrap_buffer;
2283 (*chan).capture_wrap_buffer = new Sample[required_wrap_size];
2286 wrap_buffer_size = required_wrap_size;
2291 DiskStream::monitor_input (bool yn)
2293 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2295 if ((*chan).source) {
2296 (*chan).source->request_monitor_input (yn);
2302 DiskStream::set_capture_offset ()
2305 /* can't capture, so forget it */
2309 _capture_offset = _io->input_latency();
2313 DiskStream::set_persistent_align_style (AlignStyle a)
2315 _persistent_alignment_style = a;
2319 DiskStream::set_align_style_from_io ()
2321 bool have_physical = false;
2327 get_input_sources ();
2329 for (ChannelList::iterator chan = channels.begin(); chan != channels.end(); ++chan) {
2330 if ((*chan).source && (*chan).source->flags() & JackPortIsPhysical) {
2331 have_physical = true;
2336 if (have_physical) {
2337 set_align_style (ExistingMaterial);
2339 set_align_style (CaptureTime);
2344 DiskStream::set_align_style (AlignStyle a)
2346 if (record_enabled() && _session.actively_recording()) {
2351 if (a != _alignment_style) {
2352 _alignment_style = a;
2353 AlignmentStyleChanged ();
2358 DiskStream::add_channel ()
2360 /* XXX need to take lock??? */
2364 init_channel (chan);
2366 chan.speed_buffer = new Sample[speed_buffer_size];
2367 chan.playback_wrap_buffer = new Sample[wrap_buffer_size];
2368 chan.capture_wrap_buffer = new Sample[wrap_buffer_size];
2370 channels.push_back (chan);
2372 _n_channels = channels.size();
2378 DiskStream::remove_channel ()
2380 if (channels.size() > 1) {
2381 /* XXX need to take lock??? */
2382 ChannelInfo & chan = channels.back();
2383 destroy_channel (chan);
2384 channels.pop_back();
2386 _n_channels = channels.size();
2394 DiskStream::playback_buffer_load () const
2396 return (float) ((double) channels.front().playback_buf->read_space()/
2397 (double) channels.front().playback_buf->bufsize());
2401 DiskStream::capture_buffer_load () const
2403 return (float) ((double) channels.front().capture_buf->write_space()/
2404 (double) channels.front().capture_buf->bufsize());
2408 DiskStream::set_loop (Location *location)
2411 if (location->start() >= location->end()) {
2412 error << string_compose(_("Location \"%1\" not valid for track loop (start >= end)"), location->name()) << endl;
2417 loop_location = location;
2419 LoopSet (location); /* EMIT SIGNAL */
2424 DiskStream::get_capture_start_frame (uint32_t n)
2426 LockMonitor lm (capture_info_lock, __LINE__, __FILE__);
2428 if (capture_info.size() > n) {
2429 return capture_info[n]->start;
2432 return capture_start_frame;
2437 DiskStream::get_captured_frames (uint32_t n)
2439 LockMonitor lm (capture_info_lock, __LINE__, __FILE__);
2441 if (capture_info.size() > n) {
2442 return capture_info[n]->frames;
2445 return capture_captured;
2450 DiskStream::punch_in ()
2455 DiskStream::punch_out ()
2460 DiskStream::use_pending_capture_data (XMLNode& node)
2462 const XMLProperty* prop;
2463 XMLNodeList nlist = node.children();
2464 XMLNodeIterator niter;
2466 FileSource* first_fs = 0;
2467 AudioRegion::SourceList pending_sources;
2468 jack_nframes_t position;
2470 if ((prop = node.property (X_("at"))) == 0) {
2474 if (sscanf (prop->value().c_str(), "%" PRIu32, &position) != 1) {
2478 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2479 if ((*niter)->name() == X_("file")) {
2481 if ((prop = (*niter)->property (X_("path"))) == 0) {
2486 fs = new FileSource (prop->value(), _session.frame_rate(), true, Config->get_native_file_data_format());
2489 catch (failed_constructor& err) {
2490 error << string_compose (_("%1: cannot restore pending capture source file %2"),
2491 _name, prop->value())
2496 pending_sources.push_back (fs);
2498 if (first_fs == 0) {
2502 fs->set_captured_for (_name);
2506 if (pending_sources.size() == 0) {
2507 /* nothing can be done */
2511 if (pending_sources.size() != _n_channels) {
2512 error << string_compose (_("%1: incorrect number of pending sources listed - ignoring them all"), _name)
2517 AudioRegion* region;
2520 region = new AudioRegion (pending_sources, 0, first_fs->length(),
2521 region_name_from_path (first_fs->name()),
2522 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile));
2524 region->special_set_position (0);
2527 catch (failed_constructor& err) {
2528 error << string_compose (_("%1: cannot create whole-file region from pending capture sources"),
2536 region = new AudioRegion (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name()));
2539 catch (failed_constructor& err) {
2540 error << string_compose (_("%1: cannot create region from pending capture sources"),
2547 _playlist->add_region (*region, position);
2553 DiskStream::set_roll_delay (jack_nframes_t nframes)
2555 _roll_delay = nframes;
2559 DiskStream::set_destructive (bool yn)
2561 if (yn != destructive()) {
2562 reset_write_sources (true, true);
2564 _flags |= Destructive;
2566 _flags &= ~Destructive;