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.
20 #include "ardour/analyser.h"
21 #include "ardour/audioengine.h"
22 #include "ardour/audiofilesource.h"
23 #include "ardour/audio_buffer.h"
24 #include "ardour/audioplaylist.h"
25 #include "ardour/audioregion.h"
26 #include "ardour/butler.h"
27 #include "ardour/debug.h"
28 #include "ardour/disk_writer.h"
29 #include "ardour/midi_playlist.h"
30 #include "ardour/midi_source.h"
31 #include "ardour/midi_track.h"
32 #include "ardour/port.h"
33 #include "ardour/region_factory.h"
34 #include "ardour/session.h"
35 #include "ardour/smf_source.h"
39 using namespace ARDOUR;
43 ARDOUR::samplecnt_t DiskWriter::_chunk_samples = DiskWriter::default_chunk_samples ();
44 PBD::Signal0<void> DiskWriter::Overrun;
46 DiskWriter::DiskWriter (Session& s, string const & str, DiskIOProcessor::Flag f)
47 : DiskIOProcessor (s, str, f)
50 , capture_start_sample (0)
51 , capture_captured (0)
52 , was_recording (false)
53 , adjust_capture_position (0)
55 , first_recordable_sample (max_samplepos)
56 , last_recordable_sample (max_samplepos)
57 , last_possibly_recording (0)
58 , _alignment_style (ExistingMaterial)
59 , _num_captured_loops (0)
60 , _accumulated_capture_offset (0)
61 , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
63 DiskIOProcessor::init ();
66 DiskWriter::~DiskWriter ()
68 DEBUG_TRACE (DEBUG::Destruction, string_compose ("DiskWriter %1 @ %2 deleted\n", _name, this));
70 boost::shared_ptr<ChannelList> c = channels.reader();
72 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
73 (*chan)->write_source.reset ();
78 DiskWriter::default_chunk_samples ()
84 DiskWriter::set_write_source_name (string const & str)
86 _write_source_name = str;
91 DiskWriter::check_record_status (samplepos_t transport_sample, bool can_record)
93 int possibly_recording;
96 const int transport_rolling = 0x4;
97 const int track_rec_enabled = 0x2;
98 const int global_rec_enabled = 0x1;
99 const int fully_rec_enabled = (transport_rolling|track_rec_enabled|global_rec_enabled);
101 /* merge together the 3 factors that affect record status, and compute
105 rolling = _session.transport_speed() != 0.0f;
106 possibly_recording = (rolling << 2) | ((int)record_enabled() << 1) | (int)can_record;
107 change = possibly_recording ^ last_possibly_recording;
109 if (possibly_recording == last_possibly_recording) {
113 const samplecnt_t existing_material_offset = _session.worst_playback_latency();
115 if (possibly_recording == fully_rec_enabled) {
117 if (last_possibly_recording == fully_rec_enabled) {
121 capture_start_sample = _session.transport_sample();
122 first_recordable_sample = capture_start_sample + _capture_offset;
123 last_recordable_sample = max_samplepos;
125 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: @ %7 (%9) FRF = %2 CSF = %4 CO = %5, EMO = %6 RD = %8 WOL %10 WTL %11\n",
126 name(), first_recordable_sample, last_recordable_sample, capture_start_sample,
128 existing_material_offset,
130 _session.transport_sample(),
131 _session.worst_output_latency(),
132 _session.worst_track_latency()));
135 if (_alignment_style == ExistingMaterial) {
136 first_recordable_sample += existing_material_offset;
137 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("\tshift FRF by EMO %1\n",
138 first_recordable_sample));
141 prepare_record_status (capture_start_sample);
145 if (last_possibly_recording == fully_rec_enabled) {
147 /* we were recording last time */
149 if (change & transport_rolling) {
151 /* transport-change (stopped rolling): last_recordable_sample was set in ::prepare_to_stop(). We
152 * had to set it there because we likely rolled past the stopping point to declick out,
153 * and then backed up.
159 last_recordable_sample = _session.transport_sample() + _capture_offset;
161 if (_alignment_style == ExistingMaterial) {
162 last_recordable_sample += existing_material_offset;
168 last_possibly_recording = possibly_recording;
172 DiskWriter::calculate_record_range (Evoral::OverlapType ot, samplepos_t transport_sample, samplecnt_t nframes,
173 samplecnt_t & rec_nframes, samplecnt_t & rec_offset)
176 case Evoral::OverlapNone:
180 case Evoral::OverlapInternal:
181 /* ---------- recrange
184 rec_nframes = nframes;
188 case Evoral::OverlapStart:
189 /* |--------| recrange
192 rec_nframes = transport_sample + nframes - first_recordable_sample;
194 rec_offset = first_recordable_sample - transport_sample;
198 case Evoral::OverlapEnd:
199 /* |--------| recrange
200 * |-------- transrange
202 rec_nframes = last_recordable_sample - transport_sample;
206 case Evoral::OverlapExternal:
207 /* |--------| recrange
208 * -------------- transrange
210 rec_nframes = last_recordable_sample - first_recordable_sample;
211 rec_offset = first_recordable_sample - transport_sample;
215 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 rec? %2 @ %3 (for %4) FRF %5 LRF %6 : rf %7 @ %8\n",
216 _name, enum_2_string (ot), transport_sample, nframes,
217 first_recordable_sample, last_recordable_sample, rec_nframes, rec_offset));
221 DiskWriter::prepare_to_stop (samplepos_t transport_sample, samplepos_t audible_sample)
223 switch (_alignment_style) {
224 case ExistingMaterial:
225 last_recordable_sample = transport_sample + _capture_offset;
226 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose("%1: prepare to stop sets last recordable sample to %2 + %3 = %4\n", _name, transport_sample, _capture_offset, last_recordable_sample));
230 last_recordable_sample = audible_sample; // note that capture_offset is zero
231 /* we may already have captured audio before the last_recordable_sample (audible sample),
234 if (last_recordable_sample > capture_start_sample) {
235 capture_captured = min (capture_captured, last_recordable_sample - capture_start_sample);
237 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose("%1: prepare to stop sets last recordable sample to audible sample @ %2\n", _name, audible_sample));
244 DiskWriter::engage_record_enable ()
246 g_atomic_int_set (&_record_enabled, 1);
250 DiskWriter::disengage_record_enable ()
252 g_atomic_int_set (&_record_enabled, 0);
256 DiskWriter::engage_record_safe ()
258 g_atomic_int_set (&_record_safe, 1);
262 DiskWriter::disengage_record_safe ()
264 g_atomic_int_set (&_record_safe, 0);
267 /** Get the start position (in session samples) of the nth capture in the current pass */
269 DiskWriter::get_capture_start_sample (uint32_t n) const
271 Glib::Threads::Mutex::Lock lm (capture_info_lock);
273 if (capture_info.size() > n) {
274 /* this is a completed capture */
275 return capture_info[n]->start;
277 /* this is the currently in-progress capture */
278 return capture_start_sample;
283 DiskWriter::get_captured_samples (uint32_t n) const
285 Glib::Threads::Mutex::Lock lm (capture_info_lock);
287 if (capture_info.size() > n) {
288 /* this is a completed capture */
289 return capture_info[n]->samples;
291 /* this is the currently in-progress capture */
292 return capture_captured;
297 DiskWriter::set_input_latency (samplecnt_t l)
299 Processor::set_input_latency (l);
300 set_capture_offset ();
304 DiskWriter::set_capture_offset ()
306 switch (_alignment_style) {
307 case ExistingMaterial:
308 _capture_offset = _input_latency;
317 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: using input latency %4, capture offset set to %2 with style = %3\n", name(), _capture_offset, enum_2_string (_alignment_style), _input_latency));
322 DiskWriter::set_align_style (AlignStyle a, bool force)
324 if (record_enabled() && _session.actively_recording()) {
328 if ((a != _alignment_style) || force) {
329 _alignment_style = a;
330 set_capture_offset ();
331 AlignmentStyleChanged ();
336 DiskWriter::state (bool full)
338 XMLNode& node (DiskIOProcessor::state (full));
339 node.set_property (X_("type"), X_("diskwriter"));
340 node.set_property (X_("record-safe"), (_record_safe ? X_("yes" : "no")));
345 DiskWriter::set_state (const XMLNode& node, int version)
347 if (DiskIOProcessor::set_state (node, version)) {
351 if (!node.get_property (X_("record-safe"), _record_safe)) {
352 _record_safe = false;
355 reset_write_sources (false, true);
361 DiskWriter::non_realtime_locate (samplepos_t position)
363 if (_midi_write_source) {
364 _midi_write_source->set_timeline_position (position);
367 DiskIOProcessor::non_realtime_locate (position);
372 DiskWriter::prepare_record_status(samplepos_t capture_start_sample)
374 if (recordable() && destructive()) {
375 boost::shared_ptr<ChannelList> c = channels.reader();
376 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
378 RingBufferNPT<CaptureTransition>::rw_vector transitions;
379 (*chan)->capture_transition_buf->get_write_vector (&transitions);
381 if (transitions.len[0] > 0) {
382 transitions.buf[0]->type = CaptureStart;
383 transitions.buf[0]->capture_val = capture_start_sample;
384 (*chan)->capture_transition_buf->increment_write_ptr(1);
387 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
395 /** Do some record stuff [not described in this comment!]
398 * - Setup playback_distance with the nframes, or nframes adjusted
399 * for current varispeed, if appropriate.
400 * - Setup current_playback_buffer in each ChannelInfo to point to data
401 * that someone can read playback_distance worth of data from.
404 DiskWriter::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sample,
405 double speed, pframes_t nframes, bool result_required)
408 boost::shared_ptr<ChannelList> c = channels.reader();
409 ChannelList::iterator chan;
410 samplecnt_t rec_offset = 0;
411 samplecnt_t rec_nframes = 0;
412 bool nominally_recording;
413 bool re = record_enabled ();
414 bool can_record = _session.actively_recording ();
417 if (!_pending_active) {
422 if (_pending_active) {
429 _need_butler = false;
431 check_record_status (start_sample, can_record);
437 nominally_recording = (can_record && re);
439 // Safeguard against situations where process() goes haywire when autopunching
440 // and last_recordable_sample < first_recordable_sample
442 if (last_recordable_sample < first_recordable_sample) {
443 last_recordable_sample = max_samplepos;
446 const Location* const loop_loc = loop_location;
447 samplepos_t loop_start = 0;
448 samplepos_t loop_end = 0;
449 samplepos_t loop_length = 0;
452 get_location_times (loop_loc, &loop_start, &loop_end, &loop_length);
455 adjust_capture_position = 0;
457 if (nominally_recording || (re && was_recording && _session.get_record_enabled() && (_session.config.get_punch_in() || _session.preroll_record_punch_enabled()))) {
459 Evoral::OverlapType ot = Evoral::coverage (first_recordable_sample, last_recordable_sample, start_sample, end_sample);
460 // XXX should this be transport_sample + nframes - 1 ? coverage() expects its parameter ranges to include their end points
461 // XXX also, first_recordable_sample & last_recordable_sample may both be == max_samplepos: coverage() will return OverlapNone in that case. Is thak OK?
462 calculate_record_range (ot, start_sample, nframes, rec_nframes, rec_offset);
464 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1: this time record %2 of %3 samples, offset %4\n", _name, rec_nframes, nframes, rec_offset));
466 if (rec_nframes && !was_recording) {
467 capture_captured = 0;
470 /* Loop recording, so pretend the capture started at the loop
471 start rgardless of what time it is now, so the source starts
472 at the loop start and can handle time wrapping around.
473 Otherwise, start the source right now as usual.
475 capture_captured = start_sample - loop_start;
476 capture_start_sample = loop_start;
479 if (_midi_write_source) {
480 _midi_write_source->mark_write_starting_now (capture_start_sample, capture_captured, loop_length);
483 g_atomic_int_set(const_cast<gint*> (&_samples_pending_write), 0);
484 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
486 was_recording = true;
490 /* For audio: not writing samples to the capture ringbuffer offsets
491 * the recording. For midi: we need to keep track of the record range
492 * and subtract the accumulated difference from the event time.
495 _accumulated_capture_offset += rec_offset;
497 _accumulated_capture_offset += nframes;
502 if (can_record && !_last_capture_sources.empty()) {
503 _last_capture_sources.clear ();
510 const size_t n_buffers = bufs.count().n_audio();
512 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
514 ChannelInfo* chaninfo (*chan);
515 AudioBuffer& buf (bufs.get_audio (n%n_buffers));
517 chaninfo->buf->get_write_vector (&chaninfo->rw_vector);
519 if (rec_nframes <= (samplecnt_t) chaninfo->rw_vector.len[0]) {
521 Sample *incoming = buf.data (rec_offset);
522 memcpy (chaninfo->rw_vector.buf[0], incoming, sizeof (Sample) * rec_nframes);
526 samplecnt_t total = chaninfo->rw_vector.len[0] + chaninfo->rw_vector.len[1];
528 if (rec_nframes > total) {
529 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 overrun in %2, rec_nframes = %3 total space = %4\n",
530 DEBUG_THREAD_SELF, name(), rec_nframes, total));
535 Sample *incoming = buf.data (rec_offset);
536 samplecnt_t first = chaninfo->rw_vector.len[0];
538 memcpy (chaninfo->rw_vector.buf[0], incoming, sizeof (Sample) * first);
539 memcpy (chaninfo->rw_vector.buf[1], incoming + first, sizeof (Sample) * (rec_nframes - first));
542 chaninfo->buf->increment_write_ptr (rec_nframes);
548 // Pump entire port buffer into the ring buffer (TODO: split cycles?)
549 MidiBuffer& buf = bufs.get_midi (0);
550 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack>(_route);
551 MidiChannelFilter* filter = mt ? &mt->capture_filter() : 0;
553 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
554 Evoral::Event<MidiBuffer::TimeType> ev(*i, false);
555 if (ev.time() + rec_offset > rec_nframes) {
559 if (DEBUG_ENABLED(DEBUG::MidiIO)) {
560 const uint8_t* __data = ev.buffer();
562 DEBUG_STR_APPEND(a, string_compose ("mididiskstream %1 capture event @ %2 + %3 sz %4 ", this, ev.time(), start_sample, ev.size()));
563 for (size_t i=0; i < ev.size(); ++i) {
564 DEBUG_STR_APPEND(a,hex);
565 DEBUG_STR_APPEND(a,"0x");
566 DEBUG_STR_APPEND(a,(int)__data[i]);
567 DEBUG_STR_APPEND(a,' ');
569 DEBUG_STR_APPEND(a,'\n');
570 DEBUG_TRACE (DEBUG::MidiIO, DEBUG_STR(a).str());
573 /* Write events to the capture buffer in samples from session start,
574 but ignoring looping so event time progresses monotonically.
575 The source knows the loop length so it knows exactly where the
576 event occurs in the series of recorded loops and can implement
577 any desirable behaviour. We don't want to send event with
578 transport time here since that way the source can not
579 reconstruct their actual time; future clever MIDI looping should
580 probably be implemented in the source instead of here.
582 const samplecnt_t loop_offset = _num_captured_loops * loop_length;
583 const samplepos_t event_time = start_sample + loop_offset - _accumulated_capture_offset + ev.time();
584 if (event_time < 0 || event_time < first_recordable_sample) {
585 /* Event out of range, skip */
589 if (!filter || !filter->filter(ev.buffer(), ev.size())) {
590 _midi_buf->write (event_time, ev.event_type(), ev.size(), ev.buffer());
593 g_atomic_int_add(const_cast<gint*>(&_samples_pending_write), nframes);
595 if (buf.size() != 0) {
596 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK);
599 /* Copy this data into our GUI feed buffer and tell the GUI
600 that it can read it if it likes.
602 _gui_feed_buffer.clear ();
604 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
605 /* This may fail if buf is larger than _gui_feed_buffer, but it's not really
606 the end of the world if it does.
608 _gui_feed_buffer.push_back ((*i).time() + start_sample, (*i).size(), (*i).buffer());
612 DataRecorded (_midi_write_source); /* EMIT SIGNAL */
615 capture_captured += rec_nframes;
616 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 now captured %2 (by %3)\n", name(), capture_captured, rec_nframes));
620 /* not recording this time, but perhaps we were before .. */
624 _accumulated_capture_offset = 0;
628 /* AUDIO BUTLER REQUIRED CODE */
630 if (_playlists[DataType::AUDIO] && !c->empty()) {
631 if (((samplecnt_t) c->front()->buf->read_space() >= _chunk_samples)) {
636 /* MIDI BUTLER REQUIRED CODE */
638 if (_playlists[DataType::MIDI] && (_midi_buf->read_space() < _midi_buf->bufsize() / 2)) {
642 // DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 writer run, needs butler = %2\n", name(), _need_butler));
646 DiskWriter::finish_capture (boost::shared_ptr<ChannelList> c)
648 was_recording = false;
649 first_recordable_sample = max_samplepos;
650 last_recordable_sample = max_samplepos;
652 if (capture_captured == 0) {
656 if (recordable() && destructive()) {
657 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
659 RingBufferNPT<CaptureTransition>::rw_vector transvec;
660 (*chan)->capture_transition_buf->get_write_vector(&transvec);
662 if (transvec.len[0] > 0) {
663 transvec.buf[0]->type = CaptureEnd;
664 transvec.buf[0]->capture_val = capture_captured;
665 (*chan)->capture_transition_buf->increment_write_ptr(1);
669 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
675 CaptureInfo* ci = new CaptureInfo;
677 ci->start = capture_start_sample;
678 ci->samples = capture_captured;
680 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->samples));
682 /* XXX theoretical race condition here. Need atomic exchange ?
683 However, the circumstances when this is called right
684 now (either on record-disable or transport_stopped)
685 mean that no actual race exists. I think ...
686 We now have a capture_info_lock, but it is only to be used
687 to synchronize in the transport_stop and the capture info
688 accessors, so that invalidation will not occur (both non-realtime).
691 capture_info.push_back (ci);
692 capture_captured = 0;
694 /* now we've finished a capture, reset first_recordable_sample for next time */
695 first_recordable_sample = max_samplepos;
699 DiskWriter::set_record_enabled (bool yn)
701 if (!recordable() || !_session.record_enabling_legal() || record_safe ()) {
705 /* can't rec-enable in destructive mode if transport is before start */
707 if (destructive() && yn && _session.transport_sample() < _session.current_start_sample()) {
711 /* yes, i know that this not proof against race conditions, but its
712 good enough. i think.
715 if (record_enabled() != yn) {
717 engage_record_enable ();
719 disengage_record_enable ();
722 RecordEnableChanged (); /* EMIT SIGNAL */
727 DiskWriter::set_record_safe (bool yn)
729 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty()) {
733 /* can't rec-safe in destructive mode if transport is before start ????
736 if (destructive() && yn && _session.transport_sample() < _session.current_start_sample()) {
740 /* yes, i know that this not proof against race conditions, but its
741 good enough. i think.
744 if (record_safe () != yn) {
746 engage_record_safe ();
748 disengage_record_safe ();
751 RecordSafeChanged (); /* EMIT SIGNAL */
756 DiskWriter::prep_record_enable ()
758 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty() || record_safe ()) { // REQUIRES REVIEW "|| record_safe ()"
762 /* can't rec-enable in destructive mode if transport is before start */
764 if (destructive() && _session.transport_sample() < _session.current_start_sample()) {
768 boost::shared_ptr<ChannelList> c = channels.reader();
770 capturing_sources.clear ();
772 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
773 capturing_sources.push_back ((*chan)->write_source);
774 Source::Lock lock((*chan)->write_source->mutex());
775 (*chan)->write_source->mark_streaming_write_started (lock);
782 DiskWriter::prep_record_disable ()
784 capturing_sources.clear ();
789 DiskWriter::buffer_load () const
791 boost::shared_ptr<ChannelList> c = channels.reader();
797 return (float) ((double) c->front()->buf->write_space()/
798 (double) c->front()->buf->bufsize());
802 DiskWriter::set_note_mode (NoteMode m)
806 boost::shared_ptr<MidiPlaylist> mp = boost::dynamic_pointer_cast<MidiPlaylist> (_playlists[DataType::MIDI]);
809 mp->set_note_mode (m);
812 if (_midi_write_source && _midi_write_source->model())
813 _midi_write_source->model()->set_note_mode(m);
817 DiskWriter::seek (samplepos_t sample, bool complete_refill)
820 ChannelList::iterator chan;
821 boost::shared_ptr<ChannelList> c = channels.reader();
823 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
824 (*chan)->buf->reset ();
828 g_atomic_int_set(&_samples_read_from_ringbuffer, 0);
829 g_atomic_int_set(&_samples_written_to_ringbuffer, 0);
831 /* can't rec-enable in destructive mode if transport is before start */
833 if (destructive() && record_enabled() && sample < _session.current_start_sample()) {
834 disengage_record_enable ();
837 playback_sample = sample;
843 DiskWriter::do_flush (RunContext ctxt, bool force_flush)
847 RingBufferNPT<Sample>::rw_vector vector;
848 RingBufferNPT<CaptureTransition>::rw_vector transvec;
856 boost::shared_ptr<ChannelList> c = channels.reader();
857 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
859 (*chan)->buf->get_read_vector (&vector);
861 total = vector.len[0] + vector.len[1];
863 if (total == 0 || (total < _chunk_samples && !force_flush && was_recording)) {
867 /* if there are 2+ chunks of disk i/o possible for
868 this track, let the caller know so that it can arrange
869 for us to be called again, ASAP.
871 if we are forcing a flush, then if there is* any* extra
872 work, let the caller know.
874 if we are no longer recording and there is any extra work,
875 let the caller know too.
878 if (total >= 2 * _chunk_samples || ((force_flush || !was_recording) && total > _chunk_samples)) {
882 to_write = min (_chunk_samples, (samplecnt_t) vector.len[0]);
884 // check the transition buffer when recording destructive
885 // important that we get this after the capture buf
888 (*chan)->capture_transition_buf->get_read_vector(&transvec);
889 size_t transcount = transvec.len[0] + transvec.len[1];
892 for (ti=0; ti < transcount; ++ti) {
893 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
895 if (captrans.type == CaptureStart) {
896 // by definition, the first data we got above represents the given capture pos
898 (*chan)->write_source->mark_capture_start (captrans.capture_val);
899 (*chan)->curr_capture_cnt = 0;
901 } else if (captrans.type == CaptureEnd) {
903 // capture end, the capture_val represents total samples in capture
905 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
907 // shorten to make the write a perfect fit
908 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
910 if (nto_write < to_write) {
911 ret = 1; // should we?
913 to_write = nto_write;
915 (*chan)->write_source->mark_capture_end ();
917 // increment past this transition, but go no further
922 // actually ends just beyond this chunk, so force more work
930 (*chan)->capture_transition_buf->increment_read_ptr(ti);
934 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
935 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
939 (*chan)->buf->increment_read_ptr (to_write);
940 (*chan)->curr_capture_cnt += to_write;
942 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < _chunk_samples) && !destructive()) {
944 /* we wrote all of vector.len[0] but it wasn't an entire
945 disk_write_chunk_samples of data, so arrange for some part
946 of vector.len[1] to be flushed to disk as well.
949 to_write = min ((samplecnt_t)(_chunk_samples - to_write), (samplecnt_t) vector.len[1]);
951 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 additional write of %2\n", name(), to_write));
953 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
954 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
958 (*chan)->buf->increment_read_ptr (to_write);
959 (*chan)->curr_capture_cnt += to_write;
965 if (_midi_write_source) {
967 const samplecnt_t total = g_atomic_int_get(const_cast<gint*> (&_samples_pending_write));
970 _midi_buf->read_space() == 0 ||
971 (!force_flush && (total < _chunk_samples) && was_recording)) {
975 /* if there are 2+ chunks of disk i/o possible for
976 this track), let the caller know so that it can arrange
977 for us to be called again, ASAP.
979 if we are forcing a flush, then if there is* any* extra
980 work, let the caller know.
982 if we are no longer recording and there is any extra work,
983 let the caller know too.
986 if (total >= 2 * _chunk_samples || ((force_flush || !was_recording) && total > _chunk_samples)) {
991 /* push out everything we have, right now */
992 to_write = UINT32_MAX;
994 to_write = _chunk_samples;
997 if (record_enabled() && ((total > _chunk_samples) || force_flush)) {
998 Source::Lock lm(_midi_write_source->mutex());
999 if (_midi_write_source->midi_write (lm, *_midi_buf, get_capture_start_sample (0), to_write) != to_write) {
1000 error << string_compose(_("MidiDiskstream %1: cannot write to disk"), id()) << endmsg;
1003 g_atomic_int_add(const_cast<gint*> (&_samples_pending_write), -to_write);
1013 DiskWriter::reset_write_sources (bool mark_write_complete, bool /*force*/)
1015 ChannelList::iterator chan;
1016 boost::shared_ptr<ChannelList> c = channels.reader();
1019 if (!_session.writable() || !recordable()) {
1023 capturing_sources.clear ();
1025 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1027 if (!destructive()) {
1029 if ((*chan)->write_source) {
1031 if (mark_write_complete) {
1032 Source::Lock lock((*chan)->write_source->mutex());
1033 (*chan)->write_source->mark_streaming_write_completed (lock);
1034 (*chan)->write_source->done_with_peakfile_writes ();
1037 if ((*chan)->write_source->removable()) {
1038 (*chan)->write_source->mark_for_remove ();
1039 (*chan)->write_source->drop_references ();
1042 (*chan)->write_source.reset ();
1045 use_new_write_source (DataType::AUDIO, n);
1047 if (record_enabled()) {
1048 capturing_sources.push_back ((*chan)->write_source);
1053 if ((*chan)->write_source == 0) {
1054 use_new_write_source (DataType::AUDIO, n);
1059 if (_midi_write_source) {
1060 if (mark_write_complete) {
1061 Source::Lock lm(_midi_write_source->mutex());
1062 _midi_write_source->mark_streaming_write_completed (lm);
1066 if (_playlists[DataType::MIDI]) {
1067 use_new_write_source (DataType::MIDI);
1070 if (destructive() && !c->empty ()) {
1072 /* we now have all our write sources set up, so create the
1073 playlist's single region.
1076 if (_playlists[DataType::MIDI]->empty()) {
1077 setup_destructive_playlist ();
1083 DiskWriter::use_new_write_source (DataType dt, uint32_t n)
1085 if (dt == DataType::MIDI) {
1087 _accumulated_capture_offset = 0;
1088 _midi_write_source.reset();
1091 _midi_write_source = boost::dynamic_pointer_cast<SMFSource>(
1092 _session.create_midi_source_for_session (write_source_name ()));
1094 if (!_midi_write_source) {
1095 throw failed_constructor();
1099 catch (failed_constructor &err) {
1100 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1101 _midi_write_source.reset();
1105 boost::shared_ptr<ChannelList> c = channels.reader();
1107 if (!recordable()) {
1111 if (n >= c->size()) {
1112 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1116 ChannelInfo* chan = (*c)[n];
1119 if ((chan->write_source = _session.create_audio_source_for_session (
1120 c->size(), write_source_name(), n, destructive())) == 0) {
1121 throw failed_constructor();
1125 catch (failed_constructor &err) {
1126 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1127 chan->write_source.reset ();
1131 /* do not remove destructive files even if they are empty */
1133 chan->write_source->set_allow_remove_if_empty (!destructive());
1140 DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1142 bool more_work = true;
1144 samplecnt_t total_capture;
1145 SourceList audio_srcs;
1146 SourceList midi_srcs;
1147 ChannelList::iterator chan;
1148 vector<CaptureInfo*>::iterator ci;
1149 boost::shared_ptr<ChannelList> c = channels.reader();
1151 bool mark_write_completed = false;
1156 /* butler is already stopped, but there may be work to do
1157 to flush remaining data to disk.
1160 while (more_work && !err) {
1161 switch (do_flush (TransportContext, true)) {
1168 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1173 /* XXX is there anything we can do if err != 0 ? */
1174 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1176 if (capture_info.empty()) {
1180 if (abort_capture) {
1182 if (destructive()) {
1186 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1188 if ((*chan)->write_source) {
1190 (*chan)->write_source->mark_for_remove ();
1191 (*chan)->write_source->drop_references ();
1192 (*chan)->write_source.reset ();
1195 /* new source set up in "out" below */
1198 if (_midi_write_source) {
1199 _midi_write_source->mark_for_remove ();
1200 _midi_write_source->drop_references ();
1201 _midi_write_source.reset();
1207 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1208 total_capture += (*ci)->samples;
1211 /* figure out the name for this take */
1213 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1215 boost::shared_ptr<AudioFileSource> as = (*chan)->write_source;
1218 audio_srcs.push_back (as);
1219 as->update_header (capture_info.front()->start, when, twhen);
1220 as->set_captured_for (_name.val());
1221 as->mark_immutable ();
1223 if (Config->get_auto_analyse_audio()) {
1224 Analyser::queue_source_for_analysis (as, true);
1227 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("newly captured source %1 length %2\n", as->path(), as->length (0)));
1230 if (_midi_write_source) {
1231 midi_srcs.push_back (_midi_write_source);
1238 if (_midi_write_source) {
1240 if (_midi_write_source->length (capture_info.front()->start) == 0) {
1241 /* No data was recorded, so this capture will
1242 effectively be aborted; do the same as we
1243 do for an explicit abort.
1245 if (_midi_write_source) {
1246 _midi_write_source->mark_for_remove ();
1247 _midi_write_source->drop_references ();
1248 _midi_write_source.reset();
1254 /* phew, we have data */
1256 Source::Lock source_lock(_midi_write_source->mutex());
1258 /* figure out the name for this take */
1260 midi_srcs.push_back (_midi_write_source);
1262 _midi_write_source->set_timeline_position (capture_info.front()->start);
1263 _midi_write_source->set_captured_for (_name);
1265 /* set length in beats to entire capture length */
1267 BeatsSamplesConverter converter (_session.tempo_map(), capture_info.front()->start);
1268 const Temporal::Beats total_capture_beats = converter.from (total_capture);
1269 _midi_write_source->set_length_beats (total_capture_beats);
1271 /* flush to disk: this step differs from the audio path,
1272 where all the data is already on disk.
1275 _midi_write_source->mark_midi_streaming_write_completed (source_lock, Evoral::Sequence<Temporal::Beats>::ResolveStuckNotes, total_capture_beats);
1278 _last_capture_sources.insert (_last_capture_sources.end(), audio_srcs.begin(), audio_srcs.end());
1279 _last_capture_sources.insert (_last_capture_sources.end(), midi_srcs.begin(), midi_srcs.end());
1283 _route->use_captured_sources (audio_srcs, capture_info);
1284 _route->use_captured_sources (midi_srcs, capture_info);
1287 mark_write_completed = true;
1290 reset_write_sources (mark_write_completed);
1294 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1298 capture_info.clear ();
1299 capture_start_sample = 0;
1303 DiskWriter::transport_looped (samplepos_t transport_sample)
1305 if (was_recording) {
1306 // all we need to do is finish this capture, with modified capture length
1307 boost::shared_ptr<ChannelList> c = channels.reader();
1311 // the next region will start recording via the normal mechanism
1312 // we'll set the start position to the current transport pos
1313 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1314 capture_start_sample = transport_sample;
1315 first_recordable_sample = transport_sample; // mild lie
1316 last_recordable_sample = max_samplepos;
1317 was_recording = true;
1319 if (recordable() && destructive()) {
1320 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1322 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1323 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1325 if (transvec.len[0] > 0) {
1326 transvec.buf[0]->type = CaptureStart;
1327 transvec.buf[0]->capture_val = capture_start_sample;
1328 (*chan)->capture_transition_buf->increment_write_ptr(1);
1332 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1340 /* Here we only keep track of the number of captured loops so monotonic
1341 event times can be delivered to the write source in process(). Trying
1342 to be clever here is a world of trouble, it is better to simply record
1343 the input in a straightforward non-destructive way. In the future when
1344 we want to implement more clever MIDI looping modes it should be done in
1345 the Source and/or entirely after the capture is finished.
1347 if (was_recording) {
1348 g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
1353 DiskWriter::setup_destructive_playlist ()
1356 boost::shared_ptr<ChannelList> c = channels.reader();
1358 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1359 srcs.push_back ((*chan)->write_source);
1362 /* a single full-sized region */
1364 assert (!srcs.empty ());
1367 plist.add (Properties::name, _name.val());
1368 plist.add (Properties::start, 0);
1369 plist.add (Properties::length, max_samplepos - srcs.front()->natural_position());
1371 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
1372 _playlists[DataType::AUDIO]->add_region (region, srcs.front()->natural_position());
1374 /* apply region properties and update write sources */
1375 use_destructive_playlist();
1379 DiskWriter::use_destructive_playlist ()
1381 /* this is called from the XML-based constructor or ::set_destructive. when called,
1382 we already have a playlist and a region, but we need to
1383 set up our sources for write. we use the sources associated
1384 with the (presumed single, full-extent) region.
1387 boost::shared_ptr<Region> rp;
1389 const RegionList& rl (_playlists[DataType::AUDIO]->region_list_property().rlist());
1390 if (rl.size() > 0) {
1391 /* this can happen when dragging a region onto a tape track */
1392 assert((rl.size() == 1));
1398 reset_write_sources (false, true);
1402 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
1405 throw failed_constructor();
1408 /* be sure to stretch the region out to the maximum length (non-musical)*/
1410 region->set_length (max_samplepos - region->position(), 0);
1413 ChannelList::iterator chan;
1414 boost::shared_ptr<ChannelList> c = channels.reader();
1416 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1417 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
1418 assert((*chan)->write_source);
1419 (*chan)->write_source->set_allow_remove_if_empty (false);
1421 /* this might be false if we switched modes, so force it */
1423 #ifdef XXX_OLD_DESTRUCTIVE_API_XXX
1424 (*chan)->write_source->set_destructive (true);
1426 // should be set when creating the source or loading the state
1427 assert ((*chan)->write_source->destructive());
1431 /* the source list will never be reset for a destructive track */
1435 DiskWriter::adjust_buffering ()
1437 boost::shared_ptr<ChannelList> c = channels.reader();
1439 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1440 (*chan)->resize (_session.butler()->audio_diskstream_capture_buffer_size());
1445 DiskWriter::realtime_handle_transport_stopped ()
1447 realtime_speed_change ();
1451 DiskWriter::set_name (string const & str)
1453 string my_name = X_("recorder:");
1456 if (_name != my_name) {
1457 SessionObject::set_name (my_name);
1464 DiskWriter::steal_write_source_name ()
1466 if (_playlists[DataType::MIDI]) {
1467 string our_old_name = _midi_write_source->name();
1469 /* this will bump the name of the current write source to the next one
1470 * (e.g. "MIDI 1-1" gets renamed to "MIDI 1-2"), thus leaving the
1471 * current write source name (e.g. "MIDI 1-1" available). See the
1472 * comments in Session::create_midi_source_by_stealing_name() about why
1477 string new_path = _session.new_midi_source_path (name());
1479 if (_midi_write_source->rename (new_path)) {
1486 return our_old_name;
1489 return std::string();
1493 DiskWriter::configure_io (ChanCount in, ChanCount out)
1495 if (!DiskIOProcessor::configure_io (in, out)) {
1499 reset_write_sources (false, true);