2 Copyright (C) 2009-2016 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.
22 #include "ardour/analyser.h"
23 #include "ardour/audioengine.h"
24 #include "ardour/audiofilesource.h"
25 #include "ardour/audio_buffer.h"
26 #include "ardour/audioplaylist.h"
27 #include "ardour/audioregion.h"
28 #include "ardour/butler.h"
29 #include "ardour/debug.h"
30 #include "ardour/disk_writer.h"
31 #include "ardour/midi_playlist.h"
32 #include "ardour/midi_source.h"
33 #include "ardour/midi_track.h"
34 #include "ardour/port.h"
35 #include "ardour/region_factory.h"
36 #include "ardour/session.h"
37 #include "ardour/smf_source.h"
39 using namespace ARDOUR;
43 ARDOUR::framecnt_t DiskWriter::_chunk_frames = DiskWriter::default_chunk_frames ();
44 PBD::Signal0<void> DiskWriter::Overrun;
46 DiskWriter::DiskWriter (Session& s, string const & str, DiskIOProcessor::Flag f)
47 : DiskIOProcessor (s, str, f)
48 , capture_start_frame (0)
49 , capture_captured (0)
50 , was_recording (false)
51 , adjust_capture_position (0)
53 , first_recordable_frame (max_framepos)
54 , last_recordable_frame (max_framepos)
55 , last_possibly_recording (0)
56 , _alignment_style (ExistingMaterial)
57 , _alignment_choice (Automatic)
58 , _num_captured_loops (0)
59 , _accumulated_capture_offset (0)
60 , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
62 DiskIOProcessor::init ();
66 DiskWriter::default_chunk_frames ()
72 DiskWriter::set_write_source_name (string const & str)
74 _write_source_name = str;
79 DiskWriter::check_record_status (framepos_t transport_frame, bool can_record)
81 int possibly_recording;
84 const int transport_rolling = 0x4;
85 const int track_rec_enabled = 0x2;
86 const int global_rec_enabled = 0x1;
87 const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled);
89 /* merge together the 3 factors that affect record status, and compute
93 rolling = _session.transport_speed() != 0.0f;
94 possibly_recording = (rolling << 2) | ((int)record_enabled() << 1) | (int)can_record;
95 change = possibly_recording ^ last_possibly_recording;
97 if (possibly_recording == last_possibly_recording) {
101 const framecnt_t existing_material_offset = _session.worst_playback_latency();
103 if (possibly_recording == fully_rec_enabled) {
105 if (last_possibly_recording == fully_rec_enabled) {
109 capture_start_frame = _session.transport_frame();
110 first_recordable_frame = capture_start_frame + _capture_offset;
111 last_recordable_frame = max_framepos;
113 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: @ %7 (%9) FRF = %2 CSF = %4 CO = %5, EMO = %6 RD = %8 WOL %10 WTL %11\n",
114 name(), first_recordable_frame, last_recordable_frame, capture_start_frame,
116 existing_material_offset,
118 _session.transport_frame(),
119 _session.worst_output_latency(),
120 _session.worst_track_latency()));
123 if (_alignment_style == ExistingMaterial) {
124 first_recordable_frame += existing_material_offset;
125 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("\tshift FRF by EMO %1\n",
126 first_recordable_frame));
129 prepare_record_status (capture_start_frame);
133 if (last_possibly_recording == fully_rec_enabled) {
135 /* we were recording last time */
137 if (change & transport_rolling) {
139 /* transport-change (stopped rolling): last_recordable_frame was set in ::prepare_to_stop(). We
140 * had to set it there because we likely rolled past the stopping point to declick out,
141 * and then backed up.
147 last_recordable_frame = _session.transport_frame() + _capture_offset;
149 if (_alignment_style == ExistingMaterial) {
150 last_recordable_frame += existing_material_offset;
156 last_possibly_recording = possibly_recording;
160 DiskWriter::calculate_record_range (Evoral::OverlapType ot, framepos_t transport_frame, framecnt_t nframes,
161 framecnt_t & rec_nframes, framecnt_t & rec_offset)
164 case Evoral::OverlapNone:
168 case Evoral::OverlapInternal:
169 /* ---------- recrange
172 rec_nframes = nframes;
176 case Evoral::OverlapStart:
177 /* |--------| recrange
180 rec_nframes = transport_frame + nframes - first_recordable_frame;
182 rec_offset = first_recordable_frame - transport_frame;
186 case Evoral::OverlapEnd:
187 /* |--------| recrange
188 * |-------- transrange
190 rec_nframes = last_recordable_frame - transport_frame;
194 case Evoral::OverlapExternal:
195 /* |--------| recrange
196 * -------------- transrange
198 rec_nframes = last_recordable_frame - first_recordable_frame;
199 rec_offset = first_recordable_frame - transport_frame;
203 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 rec? %2 @ %3 (for %4) FRF %5 LRF %6 : rf %7 @ %8\n",
204 _name, enum_2_string (ot), transport_frame, nframes,
205 first_recordable_frame, last_recordable_frame, rec_nframes, rec_offset));
209 DiskWriter::prepare_to_stop (framepos_t transport_frame, framepos_t audible_frame)
211 switch (_alignment_style) {
212 case ExistingMaterial:
213 last_recordable_frame = transport_frame + _capture_offset;
214 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose("%1: prepare to stop sets last recordable frame to %2 + %3 = %4\n", _name, transport_frame, _capture_offset, last_recordable_frame));
218 last_recordable_frame = audible_frame; // note that capture_offset is zero
219 /* we may already have captured audio before the last_recordable_frame (audible frame),
222 if (last_recordable_frame > capture_start_frame) {
223 capture_captured = min (capture_captured, last_recordable_frame - capture_start_frame);
225 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose("%1: prepare to stop sets last recordable frame to audible frame @ %2\n", _name, audible_frame));
232 DiskWriter::engage_record_enable ()
234 g_atomic_int_set (&_record_enabled, 1);
238 DiskWriter::disengage_record_enable ()
240 g_atomic_int_set (&_record_enabled, 0);
244 DiskWriter::engage_record_safe ()
246 g_atomic_int_set (&_record_safe, 1);
250 DiskWriter::disengage_record_safe ()
252 g_atomic_int_set (&_record_safe, 0);
255 /** Get the start position (in session frames) of the nth capture in the current pass */
257 DiskWriter::get_capture_start_frame (uint32_t n) const
259 Glib::Threads::Mutex::Lock lm (capture_info_lock);
261 if (capture_info.size() > n) {
262 /* this is a completed capture */
263 return capture_info[n]->start;
265 /* this is the currently in-progress capture */
266 return capture_start_frame;
271 DiskWriter::get_captured_frames (uint32_t n) const
273 Glib::Threads::Mutex::Lock lm (capture_info_lock);
275 if (capture_info.size() > n) {
276 /* this is a completed capture */
277 return capture_info[n]->frames;
279 /* this is the currently in-progress capture */
280 return capture_captured;
285 DiskWriter::set_input_latency (framecnt_t l)
291 DiskWriter::set_capture_offset ()
293 switch (_alignment_style) {
294 case ExistingMaterial:
295 _capture_offset = _input_latency;
304 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: using IO latency, capture offset set to %2 with style = %3\n", name(), _capture_offset, enum_2_string (_alignment_style)));
309 DiskWriter::set_align_style (AlignStyle a, bool force)
311 if (record_enabled() && _session.actively_recording()) {
315 if ((a != _alignment_style) || force) {
316 _alignment_style = a;
317 set_capture_offset ();
318 AlignmentStyleChanged ();
323 DiskWriter::set_align_style_from_io ()
325 bool have_physical = false;
327 if (_alignment_choice != Automatic) {
335 boost::shared_ptr<IO> input = _route->input ();
339 vector<string> connections;
340 boost::shared_ptr<ChannelList> c = channels.reader();
342 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan, ++n) {
344 if ((input->nth (n).get()) && (input->nth (n)->get_connections (connections) == 0)) {
345 if (AudioEngine::instance()->port_is_physical (connections[0])) {
346 have_physical = true;
351 connections.clear ();
356 // compensate for latency when bouncing from master or mixbus.
357 // we need to use "ExistingMaterial" to pick up the master bus' latency
358 // see also Route::direct_feeds_according_to_reality
361 if (_session.master_out() && ios.fed_by (_session.master_out()->output())) {
362 have_physical = true;
364 for (uint32_t n = 0; n < NUM_MIXBUSES && !have_physical; ++n) {
365 if (_session.get_mixbus (n) && ios.fed_by (_session.get_mixbus(n)->output())) {
366 have_physical = true;
372 set_align_style (ExistingMaterial);
374 set_align_style (CaptureTime);
379 DiskWriter::set_align_choice (AlignChoice a, bool force)
381 if (record_enabled() && _session.actively_recording()) {
385 if ((a != _alignment_choice) || force) {
386 _alignment_choice = a;
388 switch (_alignment_choice) {
390 set_align_style_from_io ();
392 case UseExistingMaterial:
393 set_align_style (ExistingMaterial);
396 set_align_style (CaptureTime);
403 DiskWriter::state (bool full)
405 XMLNode& node (DiskIOProcessor::state (full));
406 node.add_property (X_("capture-alignment"), enum_2_string (_alignment_choice));
407 node.add_property (X_("record-safe"), (_record_safe ? X_("yes" : "no")));
412 DiskWriter::set_state (const XMLNode& node, int version)
414 XMLProperty const * prop;
416 if (DiskIOProcessor::set_state (node, version)) {
420 if ((prop = node.property (X_("capture-alignment"))) != 0) {
421 set_align_choice (AlignChoice (string_2_enum (prop->value(), _alignment_choice)), true);
423 set_align_choice (Automatic, true);
427 if ((prop = node.property ("record-safe")) != 0) {
428 _record_safe = PBD::string_is_affirmative (prop->value()) ? 1 : 0;
435 DiskWriter::non_realtime_locate (framepos_t position)
437 if (_midi_write_source) {
438 _midi_write_source->set_timeline_position (position);
441 DiskIOProcessor::non_realtime_locate (position);
446 DiskWriter::prepare_record_status(framepos_t capture_start_frame)
448 if (recordable() && destructive()) {
449 boost::shared_ptr<ChannelList> c = channels.reader();
450 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
452 RingBufferNPT<CaptureTransition>::rw_vector transitions;
453 (*chan)->capture_transition_buf->get_write_vector (&transitions);
455 if (transitions.len[0] > 0) {
456 transitions.buf[0]->type = CaptureStart;
457 transitions.buf[0]->capture_val = capture_start_frame;
458 (*chan)->capture_transition_buf->increment_write_ptr(1);
461 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
469 /** Do some record stuff [not described in this comment!]
472 * - Setup playback_distance with the nframes, or nframes adjusted
473 * for current varispeed, if appropriate.
474 * - Setup current_playback_buffer in each ChannelInfo to point to data
475 * that someone can read playback_distance worth of data from.
478 DiskWriter::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
479 double speed, pframes_t nframes, bool result_required)
481 /* (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
485 boost::shared_ptr<ChannelList> c = channels.reader();
486 ChannelList::iterator chan;
487 framecnt_t rec_offset = 0;
488 framecnt_t rec_nframes = 0;
489 bool nominally_recording;
490 bool re = record_enabled ();
491 bool can_record = _session.actively_recording ();
493 check_record_status (start_frame, can_record);
499 nominally_recording = (can_record && re);
501 // Safeguard against situations where process() goes haywire when autopunching
502 // and last_recordable_frame < first_recordable_frame
504 if (last_recordable_frame < first_recordable_frame) {
505 last_recordable_frame = max_framepos;
508 const Location* const loop_loc = loop_location;
509 framepos_t loop_start = 0;
510 framepos_t loop_end = 0;
511 framepos_t loop_length = 0;
514 get_location_times (loop_loc, &loop_start, &loop_end, &loop_length);
517 adjust_capture_position = 0;
519 if (nominally_recording || (re && was_recording && _session.get_record_enabled() && (_session.config.get_punch_in() || _session.preroll_record_punch_enabled()))) {
521 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, start_frame, end_frame);
522 // XXX should this be transport_frame + nframes - 1 ? coverage() expects its parameter ranges to include their end points
523 // XXX also, first_recordable_frame & last_recordable_frame may both be == max_framepos: coverage() will return OverlapNone in that case. Is thak OK?
524 calculate_record_range (ot, start_frame, nframes, rec_nframes, rec_offset);
526 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: this time record %2 of %3 frames, offset %4\n", _name, rec_nframes, nframes, rec_offset));
528 if (rec_nframes && !was_recording) {
529 capture_captured = 0;
532 /* Loop recording, so pretend the capture started at the loop
533 start rgardless of what time it is now, so the source starts
534 at the loop start and can handle time wrapping around.
535 Otherwise, start the source right now as usual.
537 capture_captured = start_frame - loop_start;
538 capture_start_frame = loop_start;
541 _midi_write_source->mark_write_starting_now (capture_start_frame, capture_captured, loop_length);
543 g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
544 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
546 was_recording = true;
550 /* For audio: not writing frames to the capture ringbuffer offsets
551 * the recording. For midi: we need to keep track of the record range
552 * and subtract the accumulated difference from the event time.
555 _accumulated_capture_offset += rec_offset;
557 _accumulated_capture_offset += nframes;
562 if (can_record && !_last_capture_sources.empty()) {
563 _last_capture_sources.clear ();
570 const size_t n_buffers = bufs.count().n_audio();
572 for (n = 0; chan != c->end(); ++chan, ++n) {
574 ChannelInfo* chaninfo (*chan);
575 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
577 chaninfo->buf->get_write_vector (&chaninfo->rw_vector);
579 if (rec_nframes <= (framecnt_t) chaninfo->rw_vector.len[0]) {
581 Sample *incoming = buf.data (rec_offset);
582 memcpy (chaninfo->rw_vector.buf[0], incoming, sizeof (Sample) * rec_nframes);
586 framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
588 if (rec_nframes > total) {
589 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 overrun in %2, rec_nframes = %3 total space = %4\n",
590 DEBUG_THREAD_SELF, name(), rec_nframes, total));
595 Sample *incoming = buf.data (rec_offset);
596 framecnt_t first = chaninfo->rw_vector.len[0];
598 memcpy (chaninfo->rw_vector.buf[0], incoming, sizeof (Sample) * first);
599 memcpy (chaninfo->rw_vector.buf[1], incoming + first, sizeof (Sample) * (rec_nframes - first));
602 chaninfo->buf->increment_write_ptr (rec_nframes);
608 // Pump entire port buffer into the ring buffer (TODO: split cycles?)
609 MidiBuffer& buf = bufs.get_midi (0);
610 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
611 MidiChannelFilter* filter = mt ? &mt->capture_filter() : 0;
613 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
614 Evoral::Event<MidiBuffer::TimeType> ev(*i, false);
615 if (ev.time() + rec_offset > rec_nframes) {
619 if (DEBUG_ENABLED(DEBUG::MidiIO)) {
620 const uint8_t* __data = ev.buffer();
622 DEBUG_STR_APPEND(a, string_compose ("mididiskstream %1 capture event @ %2 + %3 sz %4 ", this, ev.time(), start_frame, ev.size()));
623 for (size_t i=0; i < ev.size(); ++i) {
624 DEBUG_STR_APPEND(a,hex);
625 DEBUG_STR_APPEND(a,"0x");
626 DEBUG_STR_APPEND(a,(int)__data[i]);
627 DEBUG_STR_APPEND(a,' ');
629 DEBUG_STR_APPEND(a,'\n');
630 DEBUG_TRACE (DEBUG::MidiIO, DEBUG_STR(a).str());
633 /* Write events to the capture buffer in frames from session start,
634 but ignoring looping so event time progresses monotonically.
635 The source knows the loop length so it knows exactly where the
636 event occurs in the series of recorded loops and can implement
637 any desirable behaviour. We don't want to send event with
638 transport time here since that way the source can not
639 reconstruct their actual time; future clever MIDI looping should
640 probably be implemented in the source instead of here.
642 const framecnt_t loop_offset = _num_captured_loops * loop_length;
643 const framepos_t event_time = start_frame + loop_offset - _accumulated_capture_offset + ev.time();
644 if (event_time < 0 || event_time < first_recordable_frame) {
645 /* Event out of range, skip */
649 if (!filter || !filter->filter(ev.buffer(), ev.size())) {
650 _midi_buf->write (event_time, ev.event_type(), ev.size(), ev.buffer());
653 g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes);
655 if (buf.size() != 0) {
656 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK);
659 /* Copy this data into our GUI feed buffer and tell the GUI
660 that it can read it if it likes.
662 _gui_feed_buffer.clear ();
664 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
665 /* This may fail if buf is larger than _gui_feed_buffer, but it's not really
666 the end of the world if it does.
668 _gui_feed_buffer.push_back ((*i).time() + start_frame, (*i).size(), (*i).buffer());
672 DataRecorded (_midi_write_source); /* EMIT SIGNAL */
675 capture_captured += rec_nframes;
676 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 now captured %2 (by %3)\n", name(), capture_captured, rec_nframes));
680 /* not recording this time, but perhaps we were before .. */
684 _accumulated_capture_offset = 0;
688 /* AUDIO BUTLER REQUIRED CODE */
691 if (((framecnt_t) c->front()->buf->read_space() >= _chunk_frames)) {
696 /* MIDI BUTLER REQUIRED CODE */
698 if (_midi_buf->read_space() < _midi_buf->bufsize() / 2) {
704 DiskWriter::finish_capture (boost::shared_ptr<ChannelList> c)
706 was_recording = false;
707 first_recordable_frame = max_framepos;
708 last_recordable_frame = max_framepos;
710 if (capture_captured == 0) {
714 if (recordable() && destructive()) {
715 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
717 RingBufferNPT<CaptureTransition>::rw_vector transvec;
718 (*chan)->capture_transition_buf->get_write_vector(&transvec);
720 if (transvec.len[0] > 0) {
721 transvec.buf[0]->type = CaptureEnd;
722 transvec.buf[0]->capture_val = capture_captured;
723 (*chan)->capture_transition_buf->increment_write_ptr(1);
727 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
733 CaptureInfo* ci = new CaptureInfo;
735 ci->start = capture_start_frame;
736 ci->frames = capture_captured;
738 /* XXX theoretical race condition here. Need atomic exchange ?
739 However, the circumstances when this is called right
740 now (either on record-disable or transport_stopped)
741 mean that no actual race exists. I think ...
742 We now have a capture_info_lock, but it is only to be used
743 to synchronize in the transport_stop and the capture info
744 accessors, so that invalidation will not occur (both non-realtime).
747 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->frames));
749 capture_info.push_back (ci);
750 capture_captured = 0;
752 /* now we've finished a capture, reset first_recordable_frame for next time */
753 first_recordable_frame = max_framepos;
757 DiskWriter::set_record_enabled (bool yn)
759 if (!recordable() || !_session.record_enabling_legal() || record_safe ()) {
763 /* can't rec-enable in destructive mode if transport is before start */
765 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
769 /* yes, i know that this not proof against race conditions, but its
770 good enough. i think.
773 if (record_enabled() != yn) {
775 engage_record_enable ();
777 disengage_record_enable ();
780 RecordEnableChanged (); /* EMIT SIGNAL */
785 DiskWriter::set_record_safe (bool yn)
787 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty()) {
791 /* can't rec-safe in destructive mode if transport is before start ????
794 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
798 /* yes, i know that this not proof against race conditions, but its
799 good enough. i think.
802 if (record_safe () != yn) {
804 engage_record_safe ();
806 disengage_record_safe ();
809 RecordSafeChanged (); /* EMIT SIGNAL */
814 DiskWriter::prep_record_enable ()
816 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty() || record_safe ()) { // REQUIRES REVIEW "|| record_safe ()"
820 /* can't rec-enable in destructive mode if transport is before start */
822 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
826 boost::shared_ptr<ChannelList> c = channels.reader();
828 capturing_sources.clear ();
830 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
831 capturing_sources.push_back ((*chan)->write_source);
832 Source::Lock lock((*chan)->write_source->mutex());
833 (*chan)->write_source->mark_streaming_write_started (lock);
840 DiskWriter::prep_record_disable ()
842 capturing_sources.clear ();
847 DiskWriter::buffer_load () const
849 boost::shared_ptr<ChannelList> c = channels.reader();
855 return (float) ((double) c->front()->buf->write_space()/
856 (double) c->front()->buf->bufsize());
860 DiskWriter::set_note_mode (NoteMode m)
864 boost::shared_ptr<MidiPlaylist> mp = boost::dynamic_pointer_cast<MidiPlaylist> (_playlists[DataType::MIDI]);
867 mp->set_note_mode (m);
870 if (_midi_write_source && _midi_write_source->model())
871 _midi_write_source->model()->set_note_mode(m);
875 DiskWriter::seek (framepos_t frame, bool complete_refill)
878 ChannelList::iterator chan;
879 boost::shared_ptr<ChannelList> c = channels.reader();
881 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
882 (*chan)->buf->reset ();
886 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
887 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
889 /* can't rec-enable in destructive mode if transport is before start */
891 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
892 disengage_record_enable ();
895 playback_sample = frame;
902 DiskWriter::do_flush (RunContext ctxt, bool force_flush)
906 RingBufferNPT<Sample>::rw_vector vector;
907 RingBufferNPT<CaptureTransition>::rw_vector transvec;
915 boost::shared_ptr<ChannelList> c = channels.reader();
916 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
918 (*chan)->buf->get_read_vector (&vector);
920 total = vector.len[0] + vector.len[1];
922 if (total == 0 || (total < _chunk_frames && !force_flush && was_recording)) {
926 /* if there are 2+ chunks of disk i/o possible for
927 this track, let the caller know so that it can arrange
928 for us to be called again, ASAP.
930 if we are forcing a flush, then if there is* any* extra
931 work, let the caller know.
933 if we are no longer recording and there is any extra work,
934 let the caller know too.
937 if (total >= 2 * _chunk_frames || ((force_flush || !was_recording) && total > _chunk_frames)) {
941 to_write = min (_chunk_frames, (framecnt_t) vector.len[0]);
943 // check the transition buffer when recording destructive
944 // important that we get this after the capture buf
947 (*chan)->capture_transition_buf->get_read_vector(&transvec);
948 size_t transcount = transvec.len[0] + transvec.len[1];
951 for (ti=0; ti < transcount; ++ti) {
952 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
954 if (captrans.type == CaptureStart) {
955 // by definition, the first data we got above represents the given capture pos
957 (*chan)->write_source->mark_capture_start (captrans.capture_val);
958 (*chan)->curr_capture_cnt = 0;
960 } else if (captrans.type == CaptureEnd) {
962 // capture end, the capture_val represents total frames in capture
964 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
966 // shorten to make the write a perfect fit
967 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
969 if (nto_write < to_write) {
970 ret = 1; // should we?
972 to_write = nto_write;
974 (*chan)->write_source->mark_capture_end ();
976 // increment past this transition, but go no further
981 // actually ends just beyond this chunk, so force more work
989 (*chan)->capture_transition_buf->increment_read_ptr(ti);
993 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
994 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
998 (*chan)->buf->increment_read_ptr (to_write);
999 (*chan)->curr_capture_cnt += to_write;
1001 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < _chunk_frames) && !destructive()) {
1003 /* we wrote all of vector.len[0] but it wasn't an entire
1004 disk_write_chunk_frames of data, so arrange for some part
1005 of vector.len[1] to be flushed to disk as well.
1008 to_write = min ((framecnt_t)(_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1010 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 additional write of %2\n", name(), to_write));
1012 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1013 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1017 (*chan)->buf->increment_read_ptr (to_write);
1018 (*chan)->curr_capture_cnt += to_write;
1030 DiskWriter::reset_write_sources (bool mark_write_complete, bool /*force*/)
1032 ChannelList::iterator chan;
1033 boost::shared_ptr<ChannelList> c = channels.reader();
1036 if (!_session.writable() || !recordable()) {
1040 capturing_sources.clear ();
1042 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1044 if (!destructive()) {
1046 if ((*chan)->write_source) {
1048 if (mark_write_complete) {
1049 Source::Lock lock((*chan)->write_source->mutex());
1050 (*chan)->write_source->mark_streaming_write_completed (lock);
1051 (*chan)->write_source->done_with_peakfile_writes ();
1054 if ((*chan)->write_source->removable()) {
1055 (*chan)->write_source->mark_for_remove ();
1056 (*chan)->write_source->drop_references ();
1059 (*chan)->write_source.reset ();
1062 use_new_write_source (DataType::AUDIO, n);
1064 if (record_enabled()) {
1065 capturing_sources.push_back ((*chan)->write_source);
1070 if ((*chan)->write_source == 0) {
1071 use_new_write_source (DataType::AUDIO, n);
1076 if (_midi_write_source) {
1077 if (mark_write_complete) {
1078 Source::Lock lm(_midi_write_source->mutex());
1079 _midi_write_source->mark_streaming_write_completed (lm);
1082 use_new_write_source (DataType::MIDI);
1084 if (destructive() && !c->empty ()) {
1086 /* we now have all our write sources set up, so create the
1087 playlist's single region.
1090 if (_playlists[DataType::MIDI]->empty()) {
1091 setup_destructive_playlist ();
1098 DiskWriter::use_new_write_source (DataType dt, uint32_t n)
1100 if (dt == DataType::MIDI) {
1102 _accumulated_capture_offset = 0;
1103 _midi_write_source.reset();
1106 _midi_write_source = boost::dynamic_pointer_cast<SMFSource>(
1107 _session.create_midi_source_for_session (write_source_name ()));
1109 if (!_midi_write_source) {
1110 throw failed_constructor();
1114 catch (failed_constructor &err) {
1115 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1116 _midi_write_source.reset();
1120 boost::shared_ptr<ChannelList> c = channels.reader();
1122 if (!recordable()) {
1126 if (n >= c->size()) {
1127 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1131 ChannelInfo* chan = (*c)[n];
1134 if ((chan->write_source = _session.create_audio_source_for_session (
1135 c->size(), write_source_name(), n, destructive())) == 0) {
1136 throw failed_constructor();
1140 catch (failed_constructor &err) {
1141 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1142 chan->write_source.reset ();
1146 /* do not remove destructive files even if they are empty */
1148 chan->write_source->set_allow_remove_if_empty (!destructive());
1155 DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1157 uint32_t buffer_position;
1158 bool more_work = true;
1160 boost::shared_ptr<AudioRegion> region;
1161 framecnt_t total_capture;
1163 SourceList::iterator src;
1164 ChannelList::iterator chan;
1165 vector<CaptureInfo*>::iterator ci;
1166 boost::shared_ptr<ChannelList> c = channels.reader();
1168 bool mark_write_completed = false;
1172 boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> (_playlists[DataType::AUDIO]);
1174 /* butler is already stopped, but there may be work to do
1175 to flush remaining data to disk.
1178 while (more_work && !err) {
1179 switch (do_flush (TransportContext, true)) {
1186 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1191 /* XXX is there anything we can do if err != 0 ? */
1192 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1194 if (capture_info.empty()) {
1198 if (abort_capture) {
1200 if (destructive()) {
1204 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1206 if ((*chan)->write_source) {
1208 (*chan)->write_source->mark_for_remove ();
1209 (*chan)->write_source->drop_references ();
1210 (*chan)->write_source.reset ();
1213 /* new source set up in "out" below */
1219 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1220 total_capture += (*ci)->frames;
1223 /* figure out the name for this take */
1225 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1227 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1231 s->update_header (capture_info.front()->start, when, twhen);
1232 s->set_captured_for (_name.val());
1233 s->mark_immutable ();
1235 if (Config->get_auto_analyse_audio()) {
1236 Analyser::queue_source_for_analysis (s, true);
1239 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("newly captured source %1 length %2\n", s->path(), s->length (0)));
1247 /* destructive tracks have a single, never changing region */
1249 if (destructive()) {
1251 /* send a signal that any UI can pick up to do the right thing. there is
1252 a small problem here in that a UI may need the peak data to be ready
1253 for the data that was recorded and this isn't interlocked with that
1254 process. this problem is deferred to the UI.
1257 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1261 string whole_file_region_name;
1262 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1264 /* Register a new region with the Session that
1265 describes the entire source. Do this first
1266 so that any sub-regions will obviously be
1267 children of this one (later!)
1273 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1274 plist.add (Properties::length, total_capture);
1275 plist.add (Properties::name, whole_file_region_name);
1276 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1277 rx->set_automatic (true);
1278 rx->set_whole_file (true);
1280 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1281 region->special_set_position (capture_info.front()->start);
1285 catch (failed_constructor& err) {
1286 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1290 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1292 pl->clear_changes ();
1293 pl->set_capture_insertion_in_progress (true);
1296 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1297 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1301 RegionFactory::region_name (region_name, whole_file_region_name, false);
1303 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1304 _name, (*ci)->start, (*ci)->frames, region_name, buffer_position));
1310 plist.add (Properties::start, buffer_position);
1311 plist.add (Properties::length, (*ci)->frames);
1312 plist.add (Properties::name, region_name);
1314 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1315 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1316 if (preroll_off > 0) {
1317 region->trim_front (buffer_position + preroll_off);
1321 catch (failed_constructor& err) {
1322 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1323 continue; /* XXX is this OK? */
1326 i_am_the_modifier++;
1328 pl->add_region (region, (*ci)->start + preroll_off, 1, non_layered());
1329 pl->set_layer (region, DBL_MAX);
1330 i_am_the_modifier--;
1332 buffer_position += (*ci)->frames;
1336 pl->set_capture_insertion_in_progress (false);
1337 _session.add_command (new StatefulDiffCommand (pl));
1340 mark_write_completed = true;
1343 reset_write_sources (mark_write_completed);
1347 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1351 capture_info.clear ();
1352 capture_start_frame = 0;
1360 DiskWriter::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen*/, bool abort_capture)
1362 bool more_work = true;
1364 boost::shared_ptr<MidiRegion> region;
1365 MidiRegion::SourceList srcs;
1366 MidiRegion::SourceList::iterator src;
1367 vector<CaptureInfo*>::iterator ci;
1371 /* butler is already stopped, but there may be work to do
1372 to flush remaining data to disk.
1375 while (more_work && !err) {
1376 switch (do_flush (TransportContext, true)) {
1383 error << string_compose(_("MidiDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1388 /* XXX is there anything we can do if err != 0 ? */
1389 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1391 if (capture_info.empty()) {
1392 goto no_capture_stuff_to_do;
1395 if (abort_capture) {
1397 if (_write_source) {
1398 _write_source->mark_for_remove ();
1399 _write_source->drop_references ();
1400 _write_source.reset();
1403 /* new source set up in "out" below */
1407 framecnt_t total_capture = 0;
1408 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1409 total_capture += (*ci)->frames;
1412 if (_write_source->length (capture_info.front()->start) != 0) {
1414 /* phew, we have data */
1416 Source::Lock source_lock(_write_source->mutex());
1418 /* figure out the name for this take */
1420 srcs.push_back (_write_source);
1422 _write_source->set_timeline_position (capture_info.front()->start);
1423 _write_source->set_captured_for (_name);
1425 /* set length in beats to entire capture length */
1427 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
1428 const Evoral::Beats total_capture_beats = converter.from (total_capture);
1429 _write_source->set_length_beats (total_capture_beats);
1431 /* flush to disk: this step differs from the audio path,
1432 where all the data is already on disk.
1435 _write_source->mark_midi_streaming_write_completed (source_lock, Evoral::Sequence<Evoral::Beats>::ResolveStuckNotes, total_capture_beats);
1437 /* we will want to be able to keep (over)writing the source
1438 but we don't want it to be removable. this also differs
1439 from the audio situation, where the source at this point
1440 must be considered immutable. luckily, we can rely on
1441 MidiSource::mark_streaming_write_completed() to have
1442 already done the necessary work for that.
1445 string whole_file_region_name;
1446 whole_file_region_name = region_name_from_path (_write_source->name(), true);
1448 /* Register a new region with the Session that
1449 describes the entire source. Do this first
1450 so that any sub-regions will obviously be
1451 children of this one (later!)
1457 plist.add (Properties::name, whole_file_region_name);
1458 plist.add (Properties::whole_file, true);
1459 plist.add (Properties::automatic, true);
1460 plist.add (Properties::start, 0);
1461 plist.add (Properties::length, total_capture);
1462 plist.add (Properties::layer, 0);
1464 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1466 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1467 region->special_set_position (capture_info.front()->start);
1471 catch (failed_constructor& err) {
1472 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1476 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1478 _playlist->clear_changes ();
1479 _playlist->freeze ();
1481 /* Session frame time of the initial capture in this pass, which is where the source starts */
1482 framepos_t initial_capture = 0;
1483 if (!capture_info.empty()) {
1484 initial_capture = capture_info.front()->start;
1487 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1488 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1492 RegionFactory::region_name (region_name, _write_source->name(), false);
1494 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1495 _name, (*ci)->start, (*ci)->frames, region_name));
1498 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1503 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1504 plist.add (Properties::start, (*ci)->start - initial_capture);
1505 plist.add (Properties::length, (*ci)->frames);
1506 plist.add (Properties::length_beats, converter.from((*ci)->frames).to_double());
1507 plist.add (Properties::name, region_name);
1509 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1510 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1511 if (preroll_off > 0) {
1512 region->trim_front ((*ci)->start - initial_capture + preroll_off);
1516 catch (failed_constructor& err) {
1517 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1518 continue; /* XXX is this OK? */
1521 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1523 i_am_the_modifier++;
1524 _playlist->add_region (region, (*ci)->start + preroll_off);
1525 i_am_the_modifier--;
1529 _session.add_command (new StatefulDiffCommand(_playlist));
1533 /* No data was recorded, so this capture will
1534 effectively be aborted; do the same as we
1535 do for an explicit abort.
1538 if (_write_source) {
1539 _write_source->mark_for_remove ();
1540 _write_source->drop_references ();
1541 _write_source.reset();
1547 use_new_write_source (0);
1549 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1553 capture_info.clear ();
1554 capture_start_frame = 0;
1556 no_capture_stuff_to_do:
1563 DiskWriter::transport_looped (framepos_t transport_frame)
1565 if (was_recording) {
1566 // all we need to do is finish this capture, with modified capture length
1567 boost::shared_ptr<ChannelList> c = channels.reader();
1571 // the next region will start recording via the normal mechanism
1572 // we'll set the start position to the current transport pos
1573 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1574 capture_start_frame = transport_frame;
1575 first_recordable_frame = transport_frame; // mild lie
1576 last_recordable_frame = max_framepos;
1577 was_recording = true;
1579 if (recordable() && destructive()) {
1580 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1582 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1583 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1585 if (transvec.len[0] > 0) {
1586 transvec.buf[0]->type = CaptureStart;
1587 transvec.buf[0]->capture_val = capture_start_frame;
1588 (*chan)->capture_transition_buf->increment_write_ptr(1);
1592 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1600 /* Here we only keep track of the number of captured loops so monotonic
1601 event times can be delivered to the write source in process(). Trying
1602 to be clever here is a world of trouble, it is better to simply record
1603 the input in a straightforward non-destructive way. In the future when
1604 we want to implement more clever MIDI looping modes it should be done in
1605 the Source and/or entirely after the capture is finished.
1607 if (was_recording) {
1608 g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
1613 DiskWriter::setup_destructive_playlist ()
1616 boost::shared_ptr<ChannelList> c = channels.reader();
1618 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1619 srcs.push_back ((*chan)->write_source);
1622 /* a single full-sized region */
1624 assert (!srcs.empty ());
1627 plist.add (Properties::name, _name.val());
1628 plist.add (Properties::start, 0);
1629 plist.add (Properties::length, max_framepos - srcs.front()->natural_position());
1631 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
1632 _playlists[DataType::AUDIO]->add_region (region, srcs.front()->natural_position());
1634 /* apply region properties and update write sources */
1635 use_destructive_playlist();
1639 DiskWriter::use_destructive_playlist ()
1641 /* this is called from the XML-based constructor or ::set_destructive. when called,
1642 we already have a playlist and a region, but we need to
1643 set up our sources for write. we use the sources associated
1644 with the (presumed single, full-extent) region.
1647 boost::shared_ptr<Region> rp;
1649 const RegionList& rl (_playlists[DataType::AUDIO]->region_list_property().rlist());
1650 if (rl.size() > 0) {
1651 /* this can happen when dragging a region onto a tape track */
1652 assert((rl.size() == 1));
1658 reset_write_sources (false, true);
1662 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
1665 throw failed_constructor();
1668 /* be sure to stretch the region out to the maximum length (non-musical)*/
1670 region->set_length (max_framepos - region->position(), 0);
1673 ChannelList::iterator chan;
1674 boost::shared_ptr<ChannelList> c = channels.reader();
1676 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1677 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
1678 assert((*chan)->write_source);
1679 (*chan)->write_source->set_allow_remove_if_empty (false);
1681 /* this might be false if we switched modes, so force it */
1683 #ifdef XXX_OLD_DESTRUCTIVE_API_XXX
1684 (*chan)->write_source->set_destructive (true);
1686 // should be set when creating the source or loading the state
1687 assert ((*chan)->write_source->destructive());
1691 /* the source list will never be reset for a destructive track */
1695 DiskWriter::adjust_buffering ()
1697 boost::shared_ptr<ChannelList> c = channels.reader();
1699 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1700 (*chan)->resize (_session.butler()->audio_diskstream_capture_buffer_size());