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 cerr << name() << " using align style " << enum_2_string (_alignment_style) << endl;
318 set_capture_offset ();
319 AlignmentStyleChanged ();
324 DiskWriter::set_align_choice (AlignChoice a, bool force)
326 if (record_enabled() && _session.actively_recording()) {
330 if ((a != _alignment_choice) || force) {
331 _alignment_choice = a;
333 switch (_alignment_choice) {
334 case UseExistingMaterial:
335 set_align_style (ExistingMaterial);
338 set_align_style (CaptureTime);
341 error << string_compose (_("programming error: %1"), "DiskWriter: asked to use illegal alignment style") << endmsg;
348 DiskWriter::state (bool full)
350 XMLNode& node (DiskIOProcessor::state (full));
351 node.set_property (X_("type"), X_("diskwriter"));
352 node.set_property (X_("capture-alignment"), enum_2_string (_alignment_choice));
353 node.set_property (X_("record-safe"), (_record_safe ? X_("yes" : "no")));
358 DiskWriter::set_state (const XMLNode& node, int version)
360 if (DiskIOProcessor::set_state (node, version)) {
366 if (node.get_property (X_("capture-alignment"), ac)) {
367 set_align_choice (ac, true);
369 set_align_choice (Automatic, true);
372 if (!node.get_property (X_("record-safe"), _record_safe)) {
373 _record_safe = false;
376 reset_write_sources (false, true);
382 DiskWriter::non_realtime_locate (framepos_t position)
384 if (_midi_write_source) {
385 _midi_write_source->set_timeline_position (position);
388 DiskIOProcessor::non_realtime_locate (position);
393 DiskWriter::prepare_record_status(framepos_t capture_start_frame)
395 if (recordable() && destructive()) {
396 boost::shared_ptr<ChannelList> c = channels.reader();
397 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
399 RingBufferNPT<CaptureTransition>::rw_vector transitions;
400 (*chan)->capture_transition_buf->get_write_vector (&transitions);
402 if (transitions.len[0] > 0) {
403 transitions.buf[0]->type = CaptureStart;
404 transitions.buf[0]->capture_val = capture_start_frame;
405 (*chan)->capture_transition_buf->increment_write_ptr(1);
408 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
416 /** Do some record stuff [not described in this comment!]
419 * - Setup playback_distance with the nframes, or nframes adjusted
420 * for current varispeed, if appropriate.
421 * - Setup current_playback_buffer in each ChannelInfo to point to data
422 * that someone can read playback_distance worth of data from.
425 DiskWriter::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
426 double speed, pframes_t nframes, bool result_required)
429 boost::shared_ptr<ChannelList> c = channels.reader();
430 ChannelList::iterator chan;
431 framecnt_t rec_offset = 0;
432 framecnt_t rec_nframes = 0;
433 bool nominally_recording;
434 bool re = record_enabled ();
435 bool can_record = _session.actively_recording ();
438 if (!_pending_active) {
443 if (_pending_active) {
450 _need_butler = false;
452 check_record_status (start_frame, can_record);
458 nominally_recording = (can_record && re);
460 // Safeguard against situations where process() goes haywire when autopunching
461 // and last_recordable_frame < first_recordable_frame
463 if (last_recordable_frame < first_recordable_frame) {
464 last_recordable_frame = max_framepos;
467 const Location* const loop_loc = loop_location;
468 framepos_t loop_start = 0;
469 framepos_t loop_end = 0;
470 framepos_t loop_length = 0;
473 get_location_times (loop_loc, &loop_start, &loop_end, &loop_length);
476 adjust_capture_position = 0;
478 if (nominally_recording || (re && was_recording && _session.get_record_enabled() && (_session.config.get_punch_in() || _session.preroll_record_punch_enabled()))) {
480 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, start_frame, end_frame);
481 // XXX should this be transport_frame + nframes - 1 ? coverage() expects its parameter ranges to include their end points
482 // XXX also, first_recordable_frame & last_recordable_frame may both be == max_framepos: coverage() will return OverlapNone in that case. Is thak OK?
483 calculate_record_range (ot, start_frame, nframes, rec_nframes, rec_offset);
485 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: this time record %2 of %3 frames, offset %4\n", _name, rec_nframes, nframes, rec_offset));
487 if (rec_nframes && !was_recording) {
488 capture_captured = 0;
491 /* Loop recording, so pretend the capture started at the loop
492 start rgardless of what time it is now, so the source starts
493 at the loop start and can handle time wrapping around.
494 Otherwise, start the source right now as usual.
496 capture_captured = start_frame - loop_start;
497 capture_start_frame = loop_start;
500 if (_midi_write_source) {
501 _midi_write_source->mark_write_starting_now (capture_start_frame, capture_captured, loop_length);
504 g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
505 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
507 was_recording = true;
511 /* For audio: not writing frames to the capture ringbuffer offsets
512 * the recording. For midi: we need to keep track of the record range
513 * and subtract the accumulated difference from the event time.
516 _accumulated_capture_offset += rec_offset;
518 _accumulated_capture_offset += nframes;
523 if (can_record && !_last_capture_sources.empty()) {
524 _last_capture_sources.clear ();
531 const size_t n_buffers = bufs.count().n_audio();
533 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
535 ChannelInfo* chaninfo (*chan);
536 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
538 chaninfo->buf->get_write_vector (&chaninfo->rw_vector);
540 if (rec_nframes <= (framecnt_t) chaninfo->rw_vector.len[0]) {
542 Sample *incoming = buf.data (rec_offset);
543 memcpy (chaninfo->rw_vector.buf[0], incoming, sizeof (Sample) * rec_nframes);
547 framecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
549 if (rec_nframes > total) {
550 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 overrun in %2, rec_nframes = %3 total space = %4\n",
551 DEBUG_THREAD_SELF, name(), rec_nframes, total));
556 Sample *incoming = buf.data (rec_offset);
557 framecnt_t first = chaninfo->rw_vector.len[0];
559 memcpy (chaninfo->rw_vector.buf[0], incoming, sizeof (Sample) * first);
560 memcpy (chaninfo->rw_vector.buf[1], incoming + first, sizeof (Sample) * (rec_nframes - first));
563 chaninfo->buf->increment_write_ptr (rec_nframes);
569 // Pump entire port buffer into the ring buffer (TODO: split cycles?)
570 MidiBuffer& buf = bufs.get_midi (0);
571 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
572 MidiChannelFilter* filter = mt ? &mt->capture_filter() : 0;
574 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
575 Evoral::Event<MidiBuffer::TimeType> ev(*i, false);
576 if (ev.time() + rec_offset > rec_nframes) {
580 if (DEBUG_ENABLED(DEBUG::MidiIO)) {
581 const uint8_t* __data = ev.buffer();
583 DEBUG_STR_APPEND(a, string_compose ("mididiskstream %1 capture event @ %2 + %3 sz %4 ", this, ev.time(), start_frame, ev.size()));
584 for (size_t i=0; i < ev.size(); ++i) {
585 DEBUG_STR_APPEND(a,hex);
586 DEBUG_STR_APPEND(a,"0x");
587 DEBUG_STR_APPEND(a,(int)__data[i]);
588 DEBUG_STR_APPEND(a,' ');
590 DEBUG_STR_APPEND(a,'\n');
591 DEBUG_TRACE (DEBUG::MidiIO, DEBUG_STR(a).str());
594 /* Write events to the capture buffer in frames from session start,
595 but ignoring looping so event time progresses monotonically.
596 The source knows the loop length so it knows exactly where the
597 event occurs in the series of recorded loops and can implement
598 any desirable behaviour. We don't want to send event with
599 transport time here since that way the source can not
600 reconstruct their actual time; future clever MIDI looping should
601 probably be implemented in the source instead of here.
603 const framecnt_t loop_offset = _num_captured_loops * loop_length;
604 const framepos_t event_time = start_frame + loop_offset - _accumulated_capture_offset + ev.time();
605 if (event_time < 0 || event_time < first_recordable_frame) {
606 /* Event out of range, skip */
610 if (!filter || !filter->filter(ev.buffer(), ev.size())) {
611 _midi_buf->write (event_time, ev.event_type(), ev.size(), ev.buffer());
614 g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes);
616 if (buf.size() != 0) {
617 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK);
620 /* Copy this data into our GUI feed buffer and tell the GUI
621 that it can read it if it likes.
623 _gui_feed_buffer.clear ();
625 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
626 /* This may fail if buf is larger than _gui_feed_buffer, but it's not really
627 the end of the world if it does.
629 _gui_feed_buffer.push_back ((*i).time() + start_frame, (*i).size(), (*i).buffer());
633 DataRecorded (_midi_write_source); /* EMIT SIGNAL */
636 capture_captured += rec_nframes;
637 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 now captured %2 (by %3)\n", name(), capture_captured, rec_nframes));
641 /* not recording this time, but perhaps we were before .. */
645 _accumulated_capture_offset = 0;
649 /* AUDIO BUTLER REQUIRED CODE */
651 if (_playlists[DataType::AUDIO] && !c->empty()) {
652 if (((framecnt_t) c->front()->buf->read_space() >= _chunk_frames)) {
657 /* MIDI BUTLER REQUIRED CODE */
659 if (_playlists[DataType::MIDI] && (_midi_buf->read_space() < _midi_buf->bufsize() / 2)) {
663 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 writer run, needs butler = %2\n", name(), _need_butler));
667 DiskWriter::finish_capture (boost::shared_ptr<ChannelList> c)
669 was_recording = false;
670 first_recordable_frame = max_framepos;
671 last_recordable_frame = max_framepos;
673 if (capture_captured == 0) {
677 if (recordable() && destructive()) {
678 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
680 RingBufferNPT<CaptureTransition>::rw_vector transvec;
681 (*chan)->capture_transition_buf->get_write_vector(&transvec);
683 if (transvec.len[0] > 0) {
684 transvec.buf[0]->type = CaptureEnd;
685 transvec.buf[0]->capture_val = capture_captured;
686 (*chan)->capture_transition_buf->increment_write_ptr(1);
690 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
696 CaptureInfo* ci = new CaptureInfo;
698 ci->start = capture_start_frame;
699 ci->frames = capture_captured;
701 /* XXX theoretical race condition here. Need atomic exchange ?
702 However, the circumstances when this is called right
703 now (either on record-disable or transport_stopped)
704 mean that no actual race exists. I think ...
705 We now have a capture_info_lock, but it is only to be used
706 to synchronize in the transport_stop and the capture info
707 accessors, so that invalidation will not occur (both non-realtime).
710 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->frames));
712 capture_info.push_back (ci);
713 capture_captured = 0;
715 /* now we've finished a capture, reset first_recordable_frame for next time */
716 first_recordable_frame = max_framepos;
720 DiskWriter::set_record_enabled (bool yn)
722 if (!recordable() || !_session.record_enabling_legal() || record_safe ()) {
726 /* can't rec-enable in destructive mode if transport is before start */
728 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
732 /* yes, i know that this not proof against race conditions, but its
733 good enough. i think.
736 if (record_enabled() != yn) {
738 engage_record_enable ();
740 disengage_record_enable ();
743 RecordEnableChanged (); /* EMIT SIGNAL */
748 DiskWriter::set_record_safe (bool yn)
750 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty()) {
754 /* can't rec-safe in destructive mode if transport is before start ????
757 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
761 /* yes, i know that this not proof against race conditions, but its
762 good enough. i think.
765 if (record_safe () != yn) {
767 engage_record_safe ();
769 disengage_record_safe ();
772 RecordSafeChanged (); /* EMIT SIGNAL */
777 DiskWriter::prep_record_enable ()
779 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty() || record_safe ()) { // REQUIRES REVIEW "|| record_safe ()"
783 /* can't rec-enable in destructive mode if transport is before start */
785 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
789 boost::shared_ptr<ChannelList> c = channels.reader();
791 capturing_sources.clear ();
793 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
794 capturing_sources.push_back ((*chan)->write_source);
795 Source::Lock lock((*chan)->write_source->mutex());
796 (*chan)->write_source->mark_streaming_write_started (lock);
803 DiskWriter::prep_record_disable ()
805 capturing_sources.clear ();
810 DiskWriter::buffer_load () const
812 boost::shared_ptr<ChannelList> c = channels.reader();
818 return (float) ((double) c->front()->buf->write_space()/
819 (double) c->front()->buf->bufsize());
823 DiskWriter::set_note_mode (NoteMode m)
827 boost::shared_ptr<MidiPlaylist> mp = boost::dynamic_pointer_cast<MidiPlaylist> (_playlists[DataType::MIDI]);
830 mp->set_note_mode (m);
833 if (_midi_write_source && _midi_write_source->model())
834 _midi_write_source->model()->set_note_mode(m);
838 DiskWriter::seek (framepos_t frame, bool complete_refill)
841 ChannelList::iterator chan;
842 boost::shared_ptr<ChannelList> c = channels.reader();
844 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
845 (*chan)->buf->reset ();
849 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
850 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
852 /* can't rec-enable in destructive mode if transport is before start */
854 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
855 disengage_record_enable ();
858 playback_sample = frame;
865 DiskWriter::do_flush (RunContext ctxt, bool force_flush)
869 RingBufferNPT<Sample>::rw_vector vector;
870 RingBufferNPT<CaptureTransition>::rw_vector transvec;
878 boost::shared_ptr<ChannelList> c = channels.reader();
879 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
881 (*chan)->buf->get_read_vector (&vector);
883 total = vector.len[0] + vector.len[1];
885 if (total == 0 || (total < _chunk_frames && !force_flush && was_recording)) {
889 /* if there are 2+ chunks of disk i/o possible for
890 this track, let the caller know so that it can arrange
891 for us to be called again, ASAP.
893 if we are forcing a flush, then if there is* any* extra
894 work, let the caller know.
896 if we are no longer recording and there is any extra work,
897 let the caller know too.
900 if (total >= 2 * _chunk_frames || ((force_flush || !was_recording) && total > _chunk_frames)) {
904 to_write = min (_chunk_frames, (framecnt_t) vector.len[0]);
906 // check the transition buffer when recording destructive
907 // important that we get this after the capture buf
910 (*chan)->capture_transition_buf->get_read_vector(&transvec);
911 size_t transcount = transvec.len[0] + transvec.len[1];
914 for (ti=0; ti < transcount; ++ti) {
915 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
917 if (captrans.type == CaptureStart) {
918 // by definition, the first data we got above represents the given capture pos
920 (*chan)->write_source->mark_capture_start (captrans.capture_val);
921 (*chan)->curr_capture_cnt = 0;
923 } else if (captrans.type == CaptureEnd) {
925 // capture end, the capture_val represents total frames in capture
927 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
929 // shorten to make the write a perfect fit
930 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
932 if (nto_write < to_write) {
933 ret = 1; // should we?
935 to_write = nto_write;
937 (*chan)->write_source->mark_capture_end ();
939 // increment past this transition, but go no further
944 // actually ends just beyond this chunk, so force more work
952 (*chan)->capture_transition_buf->increment_read_ptr(ti);
956 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
957 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
961 (*chan)->buf->increment_read_ptr (to_write);
962 (*chan)->curr_capture_cnt += to_write;
964 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < _chunk_frames) && !destructive()) {
966 /* we wrote all of vector.len[0] but it wasn't an entire
967 disk_write_chunk_frames of data, so arrange for some part
968 of vector.len[1] to be flushed to disk as well.
971 to_write = min ((framecnt_t)(_chunk_frames - to_write), (framecnt_t) vector.len[1]);
973 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 additional write of %2\n", name(), to_write));
975 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
976 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
980 (*chan)->buf->increment_read_ptr (to_write);
981 (*chan)->curr_capture_cnt += to_write;
993 DiskWriter::reset_write_sources (bool mark_write_complete, bool /*force*/)
995 ChannelList::iterator chan;
996 boost::shared_ptr<ChannelList> c = channels.reader();
999 if (!_session.writable() || !recordable()) {
1003 capturing_sources.clear ();
1005 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1007 if (!destructive()) {
1009 if ((*chan)->write_source) {
1011 if (mark_write_complete) {
1012 Source::Lock lock((*chan)->write_source->mutex());
1013 (*chan)->write_source->mark_streaming_write_completed (lock);
1014 (*chan)->write_source->done_with_peakfile_writes ();
1017 if ((*chan)->write_source->removable()) {
1018 (*chan)->write_source->mark_for_remove ();
1019 (*chan)->write_source->drop_references ();
1022 (*chan)->write_source.reset ();
1025 use_new_write_source (DataType::AUDIO, n);
1027 if (record_enabled()) {
1028 capturing_sources.push_back ((*chan)->write_source);
1033 if ((*chan)->write_source == 0) {
1034 use_new_write_source (DataType::AUDIO, n);
1039 if (_midi_write_source) {
1040 if (mark_write_complete) {
1041 Source::Lock lm(_midi_write_source->mutex());
1042 _midi_write_source->mark_streaming_write_completed (lm);
1045 use_new_write_source (DataType::MIDI);
1047 if (destructive() && !c->empty ()) {
1049 /* we now have all our write sources set up, so create the
1050 playlist's single region.
1053 if (_playlists[DataType::MIDI]->empty()) {
1054 setup_destructive_playlist ();
1061 DiskWriter::use_new_write_source (DataType dt, uint32_t n)
1063 if (dt == DataType::MIDI) {
1065 _accumulated_capture_offset = 0;
1066 _midi_write_source.reset();
1069 _midi_write_source = boost::dynamic_pointer_cast<SMFSource>(
1070 _session.create_midi_source_for_session (write_source_name ()));
1072 if (!_midi_write_source) {
1073 throw failed_constructor();
1077 catch (failed_constructor &err) {
1078 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1079 _midi_write_source.reset();
1083 boost::shared_ptr<ChannelList> c = channels.reader();
1085 if (!recordable()) {
1089 if (n >= c->size()) {
1090 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1094 ChannelInfo* chan = (*c)[n];
1097 if ((chan->write_source = _session.create_audio_source_for_session (
1098 c->size(), write_source_name(), n, destructive())) == 0) {
1099 throw failed_constructor();
1103 catch (failed_constructor &err) {
1104 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1105 chan->write_source.reset ();
1109 /* do not remove destructive files even if they are empty */
1111 chan->write_source->set_allow_remove_if_empty (!destructive());
1118 DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1120 uint32_t buffer_position;
1121 bool more_work = true;
1123 boost::shared_ptr<AudioRegion> region;
1124 framecnt_t total_capture;
1126 SourceList::iterator src;
1127 ChannelList::iterator chan;
1128 vector<CaptureInfo*>::iterator ci;
1129 boost::shared_ptr<ChannelList> c = channels.reader();
1131 bool mark_write_completed = false;
1135 boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> (_playlists[DataType::AUDIO]);
1137 /* butler is already stopped, but there may be work to do
1138 to flush remaining data to disk.
1141 while (more_work && !err) {
1142 switch (do_flush (TransportContext, true)) {
1149 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1154 /* XXX is there anything we can do if err != 0 ? */
1155 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1157 if (capture_info.empty()) {
1161 if (abort_capture) {
1163 if (destructive()) {
1167 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1169 if ((*chan)->write_source) {
1171 (*chan)->write_source->mark_for_remove ();
1172 (*chan)->write_source->drop_references ();
1173 (*chan)->write_source.reset ();
1176 /* new source set up in "out" below */
1182 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1183 total_capture += (*ci)->frames;
1186 /* figure out the name for this take */
1188 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1190 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1194 s->update_header (capture_info.front()->start, when, twhen);
1195 s->set_captured_for (_name.val());
1196 s->mark_immutable ();
1198 if (Config->get_auto_analyse_audio()) {
1199 Analyser::queue_source_for_analysis (s, true);
1202 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("newly captured source %1 length %2\n", s->path(), s->length (0)));
1210 /* destructive tracks have a single, never changing region */
1212 if (destructive()) {
1214 /* send a signal that any UI can pick up to do the right thing. there is
1215 a small problem here in that a UI may need the peak data to be ready
1216 for the data that was recorded and this isn't interlocked with that
1217 process. this problem is deferred to the UI.
1220 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1224 string whole_file_region_name;
1225 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1227 /* Register a new region with the Session that
1228 describes the entire source. Do this first
1229 so that any sub-regions will obviously be
1230 children of this one (later!)
1236 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1237 plist.add (Properties::length, total_capture);
1238 plist.add (Properties::name, whole_file_region_name);
1239 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1240 rx->set_automatic (true);
1241 rx->set_whole_file (true);
1243 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1244 region->special_set_position (capture_info.front()->start);
1248 catch (failed_constructor& err) {
1249 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1253 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1255 pl->clear_changes ();
1256 pl->set_capture_insertion_in_progress (true);
1259 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1260 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1264 RegionFactory::region_name (region_name, whole_file_region_name, false);
1266 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1267 _name, (*ci)->start, (*ci)->frames, region_name, buffer_position));
1273 plist.add (Properties::start, buffer_position);
1274 plist.add (Properties::length, (*ci)->frames);
1275 plist.add (Properties::name, region_name);
1277 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1278 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1279 if (preroll_off > 0) {
1280 region->trim_front (buffer_position + preroll_off);
1284 catch (failed_constructor& err) {
1285 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1286 continue; /* XXX is this OK? */
1289 i_am_the_modifier++;
1291 pl->add_region (region, (*ci)->start + preroll_off, 1, non_layered());
1292 pl->set_layer (region, DBL_MAX);
1293 i_am_the_modifier--;
1295 buffer_position += (*ci)->frames;
1299 pl->set_capture_insertion_in_progress (false);
1300 _session.add_command (new StatefulDiffCommand (pl));
1303 mark_write_completed = true;
1306 reset_write_sources (mark_write_completed);
1310 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1314 capture_info.clear ();
1315 capture_start_frame = 0;
1323 DiskWriter::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen*/, bool abort_capture)
1325 bool more_work = true;
1327 boost::shared_ptr<MidiRegion> region;
1328 MidiRegion::SourceList srcs;
1329 MidiRegion::SourceList::iterator src;
1330 vector<CaptureInfo*>::iterator ci;
1334 /* butler is already stopped, but there may be work to do
1335 to flush remaining data to disk.
1338 while (more_work && !err) {
1339 switch (do_flush (TransportContext, true)) {
1346 error << string_compose(_("MidiDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1351 /* XXX is there anything we can do if err != 0 ? */
1352 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1354 if (capture_info.empty()) {
1355 goto no_capture_stuff_to_do;
1358 if (abort_capture) {
1360 if (_write_source) {
1361 _write_source->mark_for_remove ();
1362 _write_source->drop_references ();
1363 _write_source.reset();
1366 /* new source set up in "out" below */
1370 framecnt_t total_capture = 0;
1371 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1372 total_capture += (*ci)->frames;
1375 if (_write_source->length (capture_info.front()->start) != 0) {
1377 /* phew, we have data */
1379 Source::Lock source_lock(_write_source->mutex());
1381 /* figure out the name for this take */
1383 srcs.push_back (_write_source);
1385 _write_source->set_timeline_position (capture_info.front()->start);
1386 _write_source->set_captured_for (_name);
1388 /* set length in beats to entire capture length */
1390 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
1391 const Evoral::Beats total_capture_beats = converter.from (total_capture);
1392 _write_source->set_length_beats (total_capture_beats);
1394 /* flush to disk: this step differs from the audio path,
1395 where all the data is already on disk.
1398 _write_source->mark_midi_streaming_write_completed (source_lock, Evoral::Sequence<Evoral::Beats>::ResolveStuckNotes, total_capture_beats);
1400 /* we will want to be able to keep (over)writing the source
1401 but we don't want it to be removable. this also differs
1402 from the audio situation, where the source at this point
1403 must be considered immutable. luckily, we can rely on
1404 MidiSource::mark_streaming_write_completed() to have
1405 already done the necessary work for that.
1408 string whole_file_region_name;
1409 whole_file_region_name = region_name_from_path (_write_source->name(), true);
1411 /* Register a new region with the Session that
1412 describes the entire source. Do this first
1413 so that any sub-regions will obviously be
1414 children of this one (later!)
1420 plist.add (Properties::name, whole_file_region_name);
1421 plist.add (Properties::whole_file, true);
1422 plist.add (Properties::automatic, true);
1423 plist.add (Properties::start, 0);
1424 plist.add (Properties::length, total_capture);
1425 plist.add (Properties::layer, 0);
1427 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1429 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1430 region->special_set_position (capture_info.front()->start);
1434 catch (failed_constructor& err) {
1435 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1439 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1441 _playlist->clear_changes ();
1442 _playlist->freeze ();
1444 /* Session frame time of the initial capture in this pass, which is where the source starts */
1445 framepos_t initial_capture = 0;
1446 if (!capture_info.empty()) {
1447 initial_capture = capture_info.front()->start;
1450 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1451 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1455 RegionFactory::region_name (region_name, _write_source->name(), false);
1457 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1458 _name, (*ci)->start, (*ci)->frames, region_name));
1461 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1466 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1467 plist.add (Properties::start, (*ci)->start - initial_capture);
1468 plist.add (Properties::length, (*ci)->frames);
1469 plist.add (Properties::length_beats, converter.from((*ci)->frames).to_double());
1470 plist.add (Properties::name, region_name);
1472 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1473 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1474 if (preroll_off > 0) {
1475 region->trim_front ((*ci)->start - initial_capture + preroll_off);
1479 catch (failed_constructor& err) {
1480 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1481 continue; /* XXX is this OK? */
1484 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1486 i_am_the_modifier++;
1487 _playlist->add_region (region, (*ci)->start + preroll_off);
1488 i_am_the_modifier--;
1492 _session.add_command (new StatefulDiffCommand(_playlist));
1496 /* No data was recorded, so this capture will
1497 effectively be aborted; do the same as we
1498 do for an explicit abort.
1501 if (_write_source) {
1502 _write_source->mark_for_remove ();
1503 _write_source->drop_references ();
1504 _write_source.reset();
1510 use_new_write_source (0);
1512 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1516 capture_info.clear ();
1517 capture_start_frame = 0;
1519 no_capture_stuff_to_do:
1526 DiskWriter::transport_looped (framepos_t transport_frame)
1528 if (was_recording) {
1529 // all we need to do is finish this capture, with modified capture length
1530 boost::shared_ptr<ChannelList> c = channels.reader();
1534 // the next region will start recording via the normal mechanism
1535 // we'll set the start position to the current transport pos
1536 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1537 capture_start_frame = transport_frame;
1538 first_recordable_frame = transport_frame; // mild lie
1539 last_recordable_frame = max_framepos;
1540 was_recording = true;
1542 if (recordable() && destructive()) {
1543 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1545 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1546 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1548 if (transvec.len[0] > 0) {
1549 transvec.buf[0]->type = CaptureStart;
1550 transvec.buf[0]->capture_val = capture_start_frame;
1551 (*chan)->capture_transition_buf->increment_write_ptr(1);
1555 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1563 /* Here we only keep track of the number of captured loops so monotonic
1564 event times can be delivered to the write source in process(). Trying
1565 to be clever here is a world of trouble, it is better to simply record
1566 the input in a straightforward non-destructive way. In the future when
1567 we want to implement more clever MIDI looping modes it should be done in
1568 the Source and/or entirely after the capture is finished.
1570 if (was_recording) {
1571 g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
1576 DiskWriter::setup_destructive_playlist ()
1579 boost::shared_ptr<ChannelList> c = channels.reader();
1581 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1582 srcs.push_back ((*chan)->write_source);
1585 /* a single full-sized region */
1587 assert (!srcs.empty ());
1590 plist.add (Properties::name, _name.val());
1591 plist.add (Properties::start, 0);
1592 plist.add (Properties::length, max_framepos - srcs.front()->natural_position());
1594 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
1595 _playlists[DataType::AUDIO]->add_region (region, srcs.front()->natural_position());
1597 /* apply region properties and update write sources */
1598 use_destructive_playlist();
1602 DiskWriter::use_destructive_playlist ()
1604 /* this is called from the XML-based constructor or ::set_destructive. when called,
1605 we already have a playlist and a region, but we need to
1606 set up our sources for write. we use the sources associated
1607 with the (presumed single, full-extent) region.
1610 boost::shared_ptr<Region> rp;
1612 const RegionList& rl (_playlists[DataType::AUDIO]->region_list_property().rlist());
1613 if (rl.size() > 0) {
1614 /* this can happen when dragging a region onto a tape track */
1615 assert((rl.size() == 1));
1621 reset_write_sources (false, true);
1625 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
1628 throw failed_constructor();
1631 /* be sure to stretch the region out to the maximum length (non-musical)*/
1633 region->set_length (max_framepos - region->position(), 0);
1636 ChannelList::iterator chan;
1637 boost::shared_ptr<ChannelList> c = channels.reader();
1639 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1640 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
1641 assert((*chan)->write_source);
1642 (*chan)->write_source->set_allow_remove_if_empty (false);
1644 /* this might be false if we switched modes, so force it */
1646 #ifdef XXX_OLD_DESTRUCTIVE_API_XXX
1647 (*chan)->write_source->set_destructive (true);
1649 // should be set when creating the source or loading the state
1650 assert ((*chan)->write_source->destructive());
1654 /* the source list will never be reset for a destructive track */
1658 DiskWriter::adjust_buffering ()
1660 boost::shared_ptr<ChannelList> c = channels.reader();
1662 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1663 (*chan)->resize (_session.butler()->audio_diskstream_capture_buffer_size());
1668 DiskWriter::realtime_handle_transport_stopped ()
1670 realtime_speed_change ();
1674 DiskWriter::set_name (string const & str)
1676 string my_name = X_("writer:");
1679 if (_name != my_name) {
1680 SessionObject::set_name (my_name);