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_("type"), X_("diskwriter"));
407 node.add_property (X_("capture-alignment"), enum_2_string (_alignment_choice));
408 node.add_property (X_("record-safe"), (_record_safe ? X_("yes" : "no")));
413 DiskWriter::set_state (const XMLNode& node, int version)
415 XMLProperty const * prop;
417 if (DiskIOProcessor::set_state (node, version)) {
421 if ((prop = node.property (X_("capture-alignment"))) != 0) {
422 set_align_choice (AlignChoice (string_2_enum (prop->value(), _alignment_choice)), true);
424 set_align_choice (Automatic, true);
428 if ((prop = node.property ("record-safe")) != 0) {
429 _record_safe = PBD::string_is_affirmative (prop->value()) ? 1 : 0;
436 DiskWriter::non_realtime_locate (framepos_t position)
438 if (_midi_write_source) {
439 _midi_write_source->set_timeline_position (position);
442 DiskIOProcessor::non_realtime_locate (position);
447 DiskWriter::prepare_record_status(framepos_t capture_start_frame)
449 if (recordable() && destructive()) {
450 boost::shared_ptr<ChannelList> c = channels.reader();
451 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
453 RingBufferNPT<CaptureTransition>::rw_vector transitions;
454 (*chan)->capture_transition_buf->get_write_vector (&transitions);
456 if (transitions.len[0] > 0) {
457 transitions.buf[0]->type = CaptureStart;
458 transitions.buf[0]->capture_val = capture_start_frame;
459 (*chan)->capture_transition_buf->increment_write_ptr(1);
462 fatal << X_("programming error: capture_transition_buf is full on rec start! inconceivable!")
470 /** Do some record stuff [not described in this comment!]
473 * - Setup playback_distance with the nframes, or nframes adjusted
474 * for current varispeed, if appropriate.
475 * - Setup current_playback_buffer in each ChannelInfo to point to data
476 * that someone can read playback_distance worth of data from.
479 DiskWriter::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame,
480 double speed, pframes_t nframes, bool result_required)
483 boost::shared_ptr<ChannelList> c = channels.reader();
484 ChannelList::iterator chan;
485 framecnt_t rec_offset = 0;
486 framecnt_t rec_nframes = 0;
487 bool nominally_recording;
488 bool re = record_enabled ();
489 bool can_record = _session.actively_recording ();
491 _need_butler = false;
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 */
690 if (_playlists[DataType::AUDIO] && !c->empty()) {
691 if (((framecnt_t) c->front()->buf->read_space() >= _chunk_frames)) {
696 /* MIDI BUTLER REQUIRED CODE */
698 if (_playlists[DataType::MIDI] && (_midi_buf->read_space() < _midi_buf->bufsize() / 2)) {
702 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 writer run, needs butler = %2\n", name(), _need_butler));
706 DiskWriter::finish_capture (boost::shared_ptr<ChannelList> c)
708 was_recording = false;
709 first_recordable_frame = max_framepos;
710 last_recordable_frame = max_framepos;
712 if (capture_captured == 0) {
716 if (recordable() && destructive()) {
717 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
719 RingBufferNPT<CaptureTransition>::rw_vector transvec;
720 (*chan)->capture_transition_buf->get_write_vector(&transvec);
722 if (transvec.len[0] > 0) {
723 transvec.buf[0]->type = CaptureEnd;
724 transvec.buf[0]->capture_val = capture_captured;
725 (*chan)->capture_transition_buf->increment_write_ptr(1);
729 fatal << string_compose (_("programmer error: %1"), X_("capture_transition_buf is full when stopping record! inconceivable!")) << endmsg;
735 CaptureInfo* ci = new CaptureInfo;
737 ci->start = capture_start_frame;
738 ci->frames = capture_captured;
740 /* XXX theoretical race condition here. Need atomic exchange ?
741 However, the circumstances when this is called right
742 now (either on record-disable or transport_stopped)
743 mean that no actual race exists. I think ...
744 We now have a capture_info_lock, but it is only to be used
745 to synchronize in the transport_stop and the capture info
746 accessors, so that invalidation will not occur (both non-realtime).
749 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("Finish capture, add new CI, %1 + %2\n", ci->start, ci->frames));
751 capture_info.push_back (ci);
752 capture_captured = 0;
754 /* now we've finished a capture, reset first_recordable_frame for next time */
755 first_recordable_frame = max_framepos;
759 DiskWriter::set_record_enabled (bool yn)
761 if (!recordable() || !_session.record_enabling_legal() || record_safe ()) {
765 /* can't rec-enable in destructive mode if transport is before start */
767 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
771 /* yes, i know that this not proof against race conditions, but its
772 good enough. i think.
775 if (record_enabled() != yn) {
777 engage_record_enable ();
779 disengage_record_enable ();
782 RecordEnableChanged (); /* EMIT SIGNAL */
787 DiskWriter::set_record_safe (bool yn)
789 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty()) {
793 /* can't rec-safe in destructive mode if transport is before start ????
796 if (destructive() && yn && _session.transport_frame() < _session.current_start_frame()) {
800 /* yes, i know that this not proof against race conditions, but its
801 good enough. i think.
804 if (record_safe () != yn) {
806 engage_record_safe ();
808 disengage_record_safe ();
811 RecordSafeChanged (); /* EMIT SIGNAL */
816 DiskWriter::prep_record_enable ()
818 if (!recordable() || !_session.record_enabling_legal() || channels.reader()->empty() || record_safe ()) { // REQUIRES REVIEW "|| record_safe ()"
822 /* can't rec-enable in destructive mode if transport is before start */
824 if (destructive() && _session.transport_frame() < _session.current_start_frame()) {
828 boost::shared_ptr<ChannelList> c = channels.reader();
830 capturing_sources.clear ();
832 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
833 capturing_sources.push_back ((*chan)->write_source);
834 Source::Lock lock((*chan)->write_source->mutex());
835 (*chan)->write_source->mark_streaming_write_started (lock);
842 DiskWriter::prep_record_disable ()
844 capturing_sources.clear ();
849 DiskWriter::buffer_load () const
851 boost::shared_ptr<ChannelList> c = channels.reader();
857 return (float) ((double) c->front()->buf->write_space()/
858 (double) c->front()->buf->bufsize());
862 DiskWriter::set_note_mode (NoteMode m)
866 boost::shared_ptr<MidiPlaylist> mp = boost::dynamic_pointer_cast<MidiPlaylist> (_playlists[DataType::MIDI]);
869 mp->set_note_mode (m);
872 if (_midi_write_source && _midi_write_source->model())
873 _midi_write_source->model()->set_note_mode(m);
877 DiskWriter::seek (framepos_t frame, bool complete_refill)
880 ChannelList::iterator chan;
881 boost::shared_ptr<ChannelList> c = channels.reader();
883 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
884 (*chan)->buf->reset ();
888 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
889 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
891 /* can't rec-enable in destructive mode if transport is before start */
893 if (destructive() && record_enabled() && frame < _session.current_start_frame()) {
894 disengage_record_enable ();
897 playback_sample = frame;
904 DiskWriter::do_flush (RunContext ctxt, bool force_flush)
908 RingBufferNPT<Sample>::rw_vector vector;
909 RingBufferNPT<CaptureTransition>::rw_vector transvec;
917 boost::shared_ptr<ChannelList> c = channels.reader();
918 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
920 (*chan)->buf->get_read_vector (&vector);
922 total = vector.len[0] + vector.len[1];
924 if (total == 0 || (total < _chunk_frames && !force_flush && was_recording)) {
928 /* if there are 2+ chunks of disk i/o possible for
929 this track, let the caller know so that it can arrange
930 for us to be called again, ASAP.
932 if we are forcing a flush, then if there is* any* extra
933 work, let the caller know.
935 if we are no longer recording and there is any extra work,
936 let the caller know too.
939 if (total >= 2 * _chunk_frames || ((force_flush || !was_recording) && total > _chunk_frames)) {
943 to_write = min (_chunk_frames, (framecnt_t) vector.len[0]);
945 // check the transition buffer when recording destructive
946 // important that we get this after the capture buf
949 (*chan)->capture_transition_buf->get_read_vector(&transvec);
950 size_t transcount = transvec.len[0] + transvec.len[1];
953 for (ti=0; ti < transcount; ++ti) {
954 CaptureTransition & captrans = (ti < transvec.len[0]) ? transvec.buf[0][ti] : transvec.buf[1][ti-transvec.len[0]];
956 if (captrans.type == CaptureStart) {
957 // by definition, the first data we got above represents the given capture pos
959 (*chan)->write_source->mark_capture_start (captrans.capture_val);
960 (*chan)->curr_capture_cnt = 0;
962 } else if (captrans.type == CaptureEnd) {
964 // capture end, the capture_val represents total frames in capture
966 if (captrans.capture_val <= (*chan)->curr_capture_cnt + to_write) {
968 // shorten to make the write a perfect fit
969 uint32_t nto_write = (captrans.capture_val - (*chan)->curr_capture_cnt);
971 if (nto_write < to_write) {
972 ret = 1; // should we?
974 to_write = nto_write;
976 (*chan)->write_source->mark_capture_end ();
978 // increment past this transition, but go no further
983 // actually ends just beyond this chunk, so force more work
991 (*chan)->capture_transition_buf->increment_read_ptr(ti);
995 if ((!(*chan)->write_source) || (*chan)->write_source->write (vector.buf[0], to_write) != to_write) {
996 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1000 (*chan)->buf->increment_read_ptr (to_write);
1001 (*chan)->curr_capture_cnt += to_write;
1003 if ((to_write == vector.len[0]) && (total > to_write) && (to_write < _chunk_frames) && !destructive()) {
1005 /* we wrote all of vector.len[0] but it wasn't an entire
1006 disk_write_chunk_frames of data, so arrange for some part
1007 of vector.len[1] to be flushed to disk as well.
1010 to_write = min ((framecnt_t)(_chunk_frames - to_write), (framecnt_t) vector.len[1]);
1012 DEBUG_TRACE (DEBUG::Butler, string_compose ("%1 additional write of %2\n", name(), to_write));
1014 if ((*chan)->write_source->write (vector.buf[1], to_write) != to_write) {
1015 error << string_compose(_("AudioDiskstream %1: cannot write to disk"), id()) << endmsg;
1019 (*chan)->buf->increment_read_ptr (to_write);
1020 (*chan)->curr_capture_cnt += to_write;
1032 DiskWriter::reset_write_sources (bool mark_write_complete, bool /*force*/)
1034 ChannelList::iterator chan;
1035 boost::shared_ptr<ChannelList> c = channels.reader();
1038 if (!_session.writable() || !recordable()) {
1042 capturing_sources.clear ();
1044 for (chan = c->begin(), n = 0; chan != c->end(); ++chan, ++n) {
1046 if (!destructive()) {
1048 if ((*chan)->write_source) {
1050 if (mark_write_complete) {
1051 Source::Lock lock((*chan)->write_source->mutex());
1052 (*chan)->write_source->mark_streaming_write_completed (lock);
1053 (*chan)->write_source->done_with_peakfile_writes ();
1056 if ((*chan)->write_source->removable()) {
1057 (*chan)->write_source->mark_for_remove ();
1058 (*chan)->write_source->drop_references ();
1061 (*chan)->write_source.reset ();
1064 use_new_write_source (DataType::AUDIO, n);
1066 if (record_enabled()) {
1067 capturing_sources.push_back ((*chan)->write_source);
1072 if ((*chan)->write_source == 0) {
1073 use_new_write_source (DataType::AUDIO, n);
1078 if (_midi_write_source) {
1079 if (mark_write_complete) {
1080 Source::Lock lm(_midi_write_source->mutex());
1081 _midi_write_source->mark_streaming_write_completed (lm);
1084 use_new_write_source (DataType::MIDI);
1086 if (destructive() && !c->empty ()) {
1088 /* we now have all our write sources set up, so create the
1089 playlist's single region.
1092 if (_playlists[DataType::MIDI]->empty()) {
1093 setup_destructive_playlist ();
1100 DiskWriter::use_new_write_source (DataType dt, uint32_t n)
1102 if (dt == DataType::MIDI) {
1104 _accumulated_capture_offset = 0;
1105 _midi_write_source.reset();
1108 _midi_write_source = boost::dynamic_pointer_cast<SMFSource>(
1109 _session.create_midi_source_for_session (write_source_name ()));
1111 if (!_midi_write_source) {
1112 throw failed_constructor();
1116 catch (failed_constructor &err) {
1117 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1118 _midi_write_source.reset();
1122 boost::shared_ptr<ChannelList> c = channels.reader();
1124 if (!recordable()) {
1128 if (n >= c->size()) {
1129 error << string_compose (_("AudioDiskstream: channel %1 out of range"), n) << endmsg;
1133 ChannelInfo* chan = (*c)[n];
1136 if ((chan->write_source = _session.create_audio_source_for_session (
1137 c->size(), write_source_name(), n, destructive())) == 0) {
1138 throw failed_constructor();
1142 catch (failed_constructor &err) {
1143 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1144 chan->write_source.reset ();
1148 /* do not remove destructive files even if they are empty */
1150 chan->write_source->set_allow_remove_if_empty (!destructive());
1157 DiskWriter::transport_stopped_wallclock (struct tm& when, time_t twhen, bool abort_capture)
1159 uint32_t buffer_position;
1160 bool more_work = true;
1162 boost::shared_ptr<AudioRegion> region;
1163 framecnt_t total_capture;
1165 SourceList::iterator src;
1166 ChannelList::iterator chan;
1167 vector<CaptureInfo*>::iterator ci;
1168 boost::shared_ptr<ChannelList> c = channels.reader();
1170 bool mark_write_completed = false;
1174 boost::shared_ptr<AudioPlaylist> pl = boost::dynamic_pointer_cast<AudioPlaylist> (_playlists[DataType::AUDIO]);
1176 /* butler is already stopped, but there may be work to do
1177 to flush remaining data to disk.
1180 while (more_work && !err) {
1181 switch (do_flush (TransportContext, true)) {
1188 error << string_compose(_("AudioDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1193 /* XXX is there anything we can do if err != 0 ? */
1194 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1196 if (capture_info.empty()) {
1200 if (abort_capture) {
1202 if (destructive()) {
1206 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1208 if ((*chan)->write_source) {
1210 (*chan)->write_source->mark_for_remove ();
1211 (*chan)->write_source->drop_references ();
1212 (*chan)->write_source.reset ();
1215 /* new source set up in "out" below */
1221 for (total_capture = 0, ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1222 total_capture += (*ci)->frames;
1225 /* figure out the name for this take */
1227 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1229 boost::shared_ptr<AudioFileSource> s = (*chan)->write_source;
1233 s->update_header (capture_info.front()->start, when, twhen);
1234 s->set_captured_for (_name.val());
1235 s->mark_immutable ();
1237 if (Config->get_auto_analyse_audio()) {
1238 Analyser::queue_source_for_analysis (s, true);
1241 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("newly captured source %1 length %2\n", s->path(), s->length (0)));
1249 /* destructive tracks have a single, never changing region */
1251 if (destructive()) {
1253 /* send a signal that any UI can pick up to do the right thing. there is
1254 a small problem here in that a UI may need the peak data to be ready
1255 for the data that was recorded and this isn't interlocked with that
1256 process. this problem is deferred to the UI.
1259 pl->LayeringChanged(); // XXX this may not get the UI to do the right thing
1263 string whole_file_region_name;
1264 whole_file_region_name = region_name_from_path (c->front()->write_source->name(), true);
1266 /* Register a new region with the Session that
1267 describes the entire source. Do this first
1268 so that any sub-regions will obviously be
1269 children of this one (later!)
1275 plist.add (Properties::start, c->front()->write_source->last_capture_start_frame());
1276 plist.add (Properties::length, total_capture);
1277 plist.add (Properties::name, whole_file_region_name);
1278 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1279 rx->set_automatic (true);
1280 rx->set_whole_file (true);
1282 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1283 region->special_set_position (capture_info.front()->start);
1287 catch (failed_constructor& err) {
1288 error << string_compose(_("%1: could not create region for complete audio file"), _name) << endmsg;
1292 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1294 pl->clear_changes ();
1295 pl->set_capture_insertion_in_progress (true);
1298 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1299 for (buffer_position = c->front()->write_source->last_capture_start_frame(), ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1303 RegionFactory::region_name (region_name, whole_file_region_name, false);
1305 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture bufpos %5 start @ %2 length %3 add new region %4\n",
1306 _name, (*ci)->start, (*ci)->frames, region_name, buffer_position));
1312 plist.add (Properties::start, buffer_position);
1313 plist.add (Properties::length, (*ci)->frames);
1314 plist.add (Properties::name, region_name);
1316 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1317 region = boost::dynamic_pointer_cast<AudioRegion> (rx);
1318 if (preroll_off > 0) {
1319 region->trim_front (buffer_position + preroll_off);
1323 catch (failed_constructor& err) {
1324 error << _("AudioDiskstream: could not create region for captured audio!") << endmsg;
1325 continue; /* XXX is this OK? */
1328 i_am_the_modifier++;
1330 pl->add_region (region, (*ci)->start + preroll_off, 1, non_layered());
1331 pl->set_layer (region, DBL_MAX);
1332 i_am_the_modifier--;
1334 buffer_position += (*ci)->frames;
1338 pl->set_capture_insertion_in_progress (false);
1339 _session.add_command (new StatefulDiffCommand (pl));
1342 mark_write_completed = true;
1345 reset_write_sources (mark_write_completed);
1349 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1353 capture_info.clear ();
1354 capture_start_frame = 0;
1362 DiskWriter::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen*/, bool abort_capture)
1364 bool more_work = true;
1366 boost::shared_ptr<MidiRegion> region;
1367 MidiRegion::SourceList srcs;
1368 MidiRegion::SourceList::iterator src;
1369 vector<CaptureInfo*>::iterator ci;
1373 /* butler is already stopped, but there may be work to do
1374 to flush remaining data to disk.
1377 while (more_work && !err) {
1378 switch (do_flush (TransportContext, true)) {
1385 error << string_compose(_("MidiDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
1390 /* XXX is there anything we can do if err != 0 ? */
1391 Glib::Threads::Mutex::Lock lm (capture_info_lock);
1393 if (capture_info.empty()) {
1394 goto no_capture_stuff_to_do;
1397 if (abort_capture) {
1399 if (_write_source) {
1400 _write_source->mark_for_remove ();
1401 _write_source->drop_references ();
1402 _write_source.reset();
1405 /* new source set up in "out" below */
1409 framecnt_t total_capture = 0;
1410 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1411 total_capture += (*ci)->frames;
1414 if (_write_source->length (capture_info.front()->start) != 0) {
1416 /* phew, we have data */
1418 Source::Lock source_lock(_write_source->mutex());
1420 /* figure out the name for this take */
1422 srcs.push_back (_write_source);
1424 _write_source->set_timeline_position (capture_info.front()->start);
1425 _write_source->set_captured_for (_name);
1427 /* set length in beats to entire capture length */
1429 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
1430 const Evoral::Beats total_capture_beats = converter.from (total_capture);
1431 _write_source->set_length_beats (total_capture_beats);
1433 /* flush to disk: this step differs from the audio path,
1434 where all the data is already on disk.
1437 _write_source->mark_midi_streaming_write_completed (source_lock, Evoral::Sequence<Evoral::Beats>::ResolveStuckNotes, total_capture_beats);
1439 /* we will want to be able to keep (over)writing the source
1440 but we don't want it to be removable. this also differs
1441 from the audio situation, where the source at this point
1442 must be considered immutable. luckily, we can rely on
1443 MidiSource::mark_streaming_write_completed() to have
1444 already done the necessary work for that.
1447 string whole_file_region_name;
1448 whole_file_region_name = region_name_from_path (_write_source->name(), true);
1450 /* Register a new region with the Session that
1451 describes the entire source. Do this first
1452 so that any sub-regions will obviously be
1453 children of this one (later!)
1459 plist.add (Properties::name, whole_file_region_name);
1460 plist.add (Properties::whole_file, true);
1461 plist.add (Properties::automatic, true);
1462 plist.add (Properties::start, 0);
1463 plist.add (Properties::length, total_capture);
1464 plist.add (Properties::layer, 0);
1466 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1468 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1469 region->special_set_position (capture_info.front()->start);
1473 catch (failed_constructor& err) {
1474 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
1478 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
1480 _playlist->clear_changes ();
1481 _playlist->freeze ();
1483 /* Session frame time of the initial capture in this pass, which is where the source starts */
1484 framepos_t initial_capture = 0;
1485 if (!capture_info.empty()) {
1486 initial_capture = capture_info.front()->start;
1489 const framepos_t preroll_off = _session.preroll_record_trim_len ();
1490 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1494 RegionFactory::region_name (region_name, _write_source->name(), false);
1496 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
1497 _name, (*ci)->start, (*ci)->frames, region_name));
1500 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1505 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1506 plist.add (Properties::start, (*ci)->start - initial_capture);
1507 plist.add (Properties::length, (*ci)->frames);
1508 plist.add (Properties::length_beats, converter.from((*ci)->frames).to_double());
1509 plist.add (Properties::name, region_name);
1511 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1512 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1513 if (preroll_off > 0) {
1514 region->trim_front ((*ci)->start - initial_capture + preroll_off);
1518 catch (failed_constructor& err) {
1519 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1520 continue; /* XXX is this OK? */
1523 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1525 i_am_the_modifier++;
1526 _playlist->add_region (region, (*ci)->start + preroll_off);
1527 i_am_the_modifier--;
1531 _session.add_command (new StatefulDiffCommand(_playlist));
1535 /* No data was recorded, so this capture will
1536 effectively be aborted; do the same as we
1537 do for an explicit abort.
1540 if (_write_source) {
1541 _write_source->mark_for_remove ();
1542 _write_source->drop_references ();
1543 _write_source.reset();
1549 use_new_write_source (0);
1551 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1555 capture_info.clear ();
1556 capture_start_frame = 0;
1558 no_capture_stuff_to_do:
1565 DiskWriter::transport_looped (framepos_t transport_frame)
1567 if (was_recording) {
1568 // all we need to do is finish this capture, with modified capture length
1569 boost::shared_ptr<ChannelList> c = channels.reader();
1573 // the next region will start recording via the normal mechanism
1574 // we'll set the start position to the current transport pos
1575 // no latency adjustment or capture offset needs to be made, as that already happened the first time
1576 capture_start_frame = transport_frame;
1577 first_recordable_frame = transport_frame; // mild lie
1578 last_recordable_frame = max_framepos;
1579 was_recording = true;
1581 if (recordable() && destructive()) {
1582 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1584 RingBufferNPT<CaptureTransition>::rw_vector transvec;
1585 (*chan)->capture_transition_buf->get_write_vector(&transvec);
1587 if (transvec.len[0] > 0) {
1588 transvec.buf[0]->type = CaptureStart;
1589 transvec.buf[0]->capture_val = capture_start_frame;
1590 (*chan)->capture_transition_buf->increment_write_ptr(1);
1594 fatal << X_("programming error: capture_transition_buf is full on rec loop! inconceivable!")
1602 /* Here we only keep track of the number of captured loops so monotonic
1603 event times can be delivered to the write source in process(). Trying
1604 to be clever here is a world of trouble, it is better to simply record
1605 the input in a straightforward non-destructive way. In the future when
1606 we want to implement more clever MIDI looping modes it should be done in
1607 the Source and/or entirely after the capture is finished.
1609 if (was_recording) {
1610 g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
1615 DiskWriter::setup_destructive_playlist ()
1618 boost::shared_ptr<ChannelList> c = channels.reader();
1620 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1621 srcs.push_back ((*chan)->write_source);
1624 /* a single full-sized region */
1626 assert (!srcs.empty ());
1629 plist.add (Properties::name, _name.val());
1630 plist.add (Properties::start, 0);
1631 plist.add (Properties::length, max_framepos - srcs.front()->natural_position());
1633 boost::shared_ptr<Region> region (RegionFactory::create (srcs, plist));
1634 _playlists[DataType::AUDIO]->add_region (region, srcs.front()->natural_position());
1636 /* apply region properties and update write sources */
1637 use_destructive_playlist();
1641 DiskWriter::use_destructive_playlist ()
1643 /* this is called from the XML-based constructor or ::set_destructive. when called,
1644 we already have a playlist and a region, but we need to
1645 set up our sources for write. we use the sources associated
1646 with the (presumed single, full-extent) region.
1649 boost::shared_ptr<Region> rp;
1651 const RegionList& rl (_playlists[DataType::AUDIO]->region_list_property().rlist());
1652 if (rl.size() > 0) {
1653 /* this can happen when dragging a region onto a tape track */
1654 assert((rl.size() == 1));
1660 reset_write_sources (false, true);
1664 boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (rp);
1667 throw failed_constructor();
1670 /* be sure to stretch the region out to the maximum length (non-musical)*/
1672 region->set_length (max_framepos - region->position(), 0);
1675 ChannelList::iterator chan;
1676 boost::shared_ptr<ChannelList> c = channels.reader();
1678 for (n = 0, chan = c->begin(); chan != c->end(); ++chan, ++n) {
1679 (*chan)->write_source = boost::dynamic_pointer_cast<AudioFileSource>(region->source (n));
1680 assert((*chan)->write_source);
1681 (*chan)->write_source->set_allow_remove_if_empty (false);
1683 /* this might be false if we switched modes, so force it */
1685 #ifdef XXX_OLD_DESTRUCTIVE_API_XXX
1686 (*chan)->write_source->set_destructive (true);
1688 // should be set when creating the source or loading the state
1689 assert ((*chan)->write_source->destructive());
1693 /* the source list will never be reset for a destructive track */
1697 DiskWriter::adjust_buffering ()
1699 boost::shared_ptr<ChannelList> c = channels.reader();
1701 for (ChannelList::iterator chan = c->begin(); chan != c->end(); ++chan) {
1702 (*chan)->resize (_session.butler()->audio_diskstream_capture_buffer_size());
1707 DiskWriter::realtime_handle_transport_stopped ()
1709 realtime_set_speed (0.0f, true);