2 Copyright (C) 2000-2003 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
31 #include "pbd/error.h"
33 #include "pbd/basename.h"
34 #include <glibmm/threads.h>
35 #include "pbd/xml++.h"
36 #include "pbd/memento_command.h"
37 #include "pbd/enumwriter.h"
38 #include "pbd/stateful_diff_command.h"
39 #include "pbd/stacktrace.h"
41 #include "ardour/audioengine.h"
42 #include "ardour/butler.h"
43 #include "ardour/debug.h"
44 #include "ardour/io.h"
45 #include "ardour/midi_diskstream.h"
46 #include "ardour/midi_model.h"
47 #include "ardour/midi_playlist.h"
48 #include "ardour/midi_port.h"
49 #include "ardour/midi_region.h"
50 #include "ardour/playlist_factory.h"
51 #include "ardour/region_factory.h"
52 #include "ardour/session.h"
53 #include "ardour/session_playlists.h"
54 #include "ardour/smf_source.h"
55 #include "ardour/types.h"
56 #include "ardour/utils.h"
58 #include "midi++/types.h"
64 using namespace ARDOUR;
67 framecnt_t MidiDiskstream::midi_readahead = 4096;
69 MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
70 : Diskstream(sess, name, flag)
73 , _note_mode(Sustained)
74 , _frames_written_to_ringbuffer(0)
75 , _frames_read_from_ringbuffer(0)
76 , _frames_pending_write(0)
77 , _num_captured_loops(0)
78 , _accumulated_capture_offset(0)
79 , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
85 use_new_write_source (0);
90 throw failed_constructor();
94 MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
95 : Diskstream(sess, node)
98 , _note_mode(Sustained)
99 , _frames_written_to_ringbuffer(0)
100 , _frames_read_from_ringbuffer(0)
101 , _frames_pending_write(0)
102 , _num_captured_loops(0)
103 , _accumulated_capture_offset(0)
104 , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
110 if (set_state (node, Stateful::loading_state_version)) {
111 in_set_state = false;
112 throw failed_constructor();
115 use_new_write_source (0);
117 in_set_state = false;
121 MidiDiskstream::init ()
123 /* there are no channels at this point, so these
124 two calls just get speed_buffer_size and wrap_buffer
125 size setup without duplicating their code.
128 set_block_size (_session.get_block_size());
129 allocate_temporary_buffers ();
131 const size_t size = _session.butler()->midi_diskstream_buffer_size();
132 _playback_buf = new MidiRingBuffer<framepos_t>(size);
133 _capture_buf = new MidiRingBuffer<framepos_t>(size);
135 _n_channels = ChanCount(DataType::MIDI, 1);
138 MidiDiskstream::~MidiDiskstream ()
140 Glib::Threads::Mutex::Lock lm (state_lock);
141 delete _playback_buf;
147 MidiDiskstream::non_realtime_locate (framepos_t position)
150 _write_source->set_timeline_position (position);
152 seek (position, false);
157 MidiDiskstream::non_realtime_input_change ()
160 Glib::Threads::Mutex::Lock lm (state_lock);
162 if (input_change_pending.type == IOChange::NoChange) {
166 if (input_change_pending.type & IOChange::ConfigurationChanged) {
167 uint32_t ni = _io->n_ports().n_midi();
169 if (ni != _n_channels.n_midi()) {
170 error << string_compose (_("%1: I/O configuration change %4 requested to use %2, but channel setup is %3"),
173 _n_channels, input_change_pending.type)
178 _source_port.reset ();
180 _source_port = _io->midi(0);
184 if (input_change_pending.type & IOChange::ConnectionsChanged) {
185 set_capture_offset ();
186 set_align_style_from_io ();
189 input_change_pending.type = IOChange::NoChange;
191 /* implicit unlock */
194 /* unlike with audio, there is never any need to reset write sources
195 based on input configuration changes because ... a MIDI track
196 has just 1 MIDI port as input, always.
199 /* now refill channel buffers */
201 if (speed() != 1.0f || speed() != -1.0f) {
202 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
205 seek (_session.transport_frame());
208 g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
209 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
213 MidiDiskstream::find_and_use_playlist (const string& name)
215 boost::shared_ptr<MidiPlaylist> playlist;
217 if ((playlist = boost::dynamic_pointer_cast<MidiPlaylist> (_session.playlists->by_name (name))) == 0) {
218 playlist = boost::dynamic_pointer_cast<MidiPlaylist> (PlaylistFactory::create (DataType::MIDI, _session, name));
222 error << string_compose(_("MidiDiskstream: Playlist \"%1\" isn't a midi playlist"), name) << endmsg;
226 return use_playlist (playlist);
230 MidiDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
232 if (boost::dynamic_pointer_cast<MidiPlaylist>(playlist)) {
233 Diskstream::use_playlist(playlist);
240 MidiDiskstream::use_new_playlist ()
243 boost::shared_ptr<MidiPlaylist> playlist;
245 if (!in_set_state && destructive()) {
250 newname = Playlist::bump_name (_playlist->name(), _session);
252 newname = Playlist::bump_name (_name, _session);
255 if ((playlist = boost::dynamic_pointer_cast<MidiPlaylist> (PlaylistFactory::create (
256 DataType::MIDI, _session, newname, hidden()))) != 0) {
258 return use_playlist (playlist);
266 MidiDiskstream::use_copy_playlist ()
272 if (_playlist == 0) {
273 error << string_compose(_("MidiDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
278 boost::shared_ptr<MidiPlaylist> playlist;
280 newname = Playlist::bump_name (_playlist->name(), _session);
282 if ((playlist = boost::dynamic_pointer_cast<MidiPlaylist>(PlaylistFactory::create (midi_playlist(), newname))) != 0) {
283 return use_playlist (playlist);
289 /** Overloaded from parent to die horribly
292 MidiDiskstream::set_destructive (bool yn)
298 MidiDiskstream::set_note_mode (NoteMode m)
301 midi_playlist()->set_note_mode(m);
302 if (_write_source && _write_source->model())
303 _write_source->model()->set_note_mode(m);
306 /** Get the start, end, and length of a location "atomically".
308 * Note: Locations don't get deleted, so all we care about when I say "atomic"
309 * is that we are always pointing to the same one and using start/length values
310 * obtained just once. Use this function to achieve this since location being
311 * a parameter achieves this.
314 get_location_times(const Location* location,
320 *start = location->start();
321 *end = location->end();
322 *length = *end - *start;
327 MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
329 framecnt_t rec_offset = 0;
330 framecnt_t rec_nframes = 0;
331 bool nominally_recording;
332 bool re = record_enabled ();
333 bool can_record = _session.actively_recording ();
335 playback_distance = 0;
337 check_record_status (transport_frame, can_record);
339 nominally_recording = (can_record && re);
345 boost::shared_ptr<MidiPort> sp = _source_port.lock ();
351 Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK);
357 const Location* const loop_loc = loop_location;
358 framepos_t loop_start = 0;
359 framepos_t loop_end = 0;
360 framepos_t loop_length = 0;
361 get_location_times(loop_loc, &loop_start, &loop_end, &loop_length);
363 adjust_capture_position = 0;
365 if (nominally_recording || (re && was_recording && _session.get_record_enabled() && _session.config.get_punch_in())) {
366 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
368 calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset);
369 /* For audio: not writing frames to the capture ringbuffer offsets
370 * the recording. For midi: we need to keep track of the record range
371 * and subtract the accumulated difference from the event time.
374 _accumulated_capture_offset += rec_offset;
376 _accumulated_capture_offset += nframes;
379 if (rec_nframes && !was_recording) {
381 /* Loop recording, so pretend the capture started at the loop
382 start rgardless of what time it is now, so the source starts
383 at the loop start and can handle time wrapping around.
384 Otherwise, start the source right now as usual.
386 capture_captured = transport_frame - loop_start;
387 capture_start_frame = loop_start;
389 _write_source->mark_write_starting_now(
390 capture_start_frame, capture_captured, loop_length);
391 g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
392 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
393 was_recording = true;
397 if (can_record && !_last_capture_sources.empty()) {
398 _last_capture_sources.clear ();
401 if (nominally_recording || rec_nframes) {
403 // Pump entire port buffer into the ring buffer (FIXME: split cycles?)
404 MidiBuffer& buf = sp->get_midi_buffer(nframes);
405 ChannelMode mode = AllChannels; // _track->get_capture_channel_mode ();
406 uint32_t mask = 0xffff; // _track->get_capture_channel_mask ();
408 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
409 Evoral::MIDIEvent<MidiBuffer::TimeType> ev(*i, false);
410 if (ev.time() + rec_offset > rec_nframes) {
414 if (DEBUG::MidiIO & PBD::debug_bits) {
415 const uint8_t* __data = ev.buffer();
417 DEBUG_STR_APPEND(a, string_compose ("mididiskstream %1 capture event @ %2 + %3 sz %4 ", this, ev.time(), transport_frame, ev.size()));
418 for (size_t i=0; i < ev.size(); ++i) {
419 DEBUG_STR_APPEND(a,hex);
420 DEBUG_STR_APPEND(a,"0x");
421 DEBUG_STR_APPEND(a,(int)__data[i]);
422 DEBUG_STR_APPEND(a,' ');
424 DEBUG_STR_APPEND(a,'\n');
425 DEBUG_TRACE (DEBUG::MidiIO, DEBUG_STR(a).str());
428 /* Write events to the capture buffer in frames from session start,
429 but ignoring looping so event time progresses monotonically.
430 The source knows the loop length so it knows exactly where the
431 event occurs in the series of recorded loops and can implement
432 any desirable behaviour. We don't want to send event with
433 transport time here since that way the source can not
434 reconstruct their actual time; future clever MIDI looping should
435 probably be implemented in the source instead of here.
437 const framecnt_t loop_offset = _num_captured_loops * loop_length;
438 const framepos_t event_time = transport_frame + loop_offset - _accumulated_capture_offset + ev.time();
439 if (event_time < 0 || event_time < first_recordable_frame) {
444 _capture_buf->write(event_time,
445 ev.type(), ev.size(), ev.buffer());
448 if (ev.is_channel_event()) {
449 if ((1<<ev.channel()) & mask) {
450 _capture_buf->write(event_time,
451 ev.type(), ev.size(), ev.buffer());
454 _capture_buf->write(event_time,
455 ev.type(), ev.size(), ev.buffer());
459 if (ev.is_channel_event()) {
460 ev.set_channel (PBD::ffs(mask) - 1);
462 _capture_buf->write(event_time,
463 ev.type(), ev.size(), ev.buffer());
467 g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes);
469 if (buf.size() != 0) {
470 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK);
473 /* Copy this data into our GUI feed buffer and tell the GUI
474 that it can read it if it likes.
476 _gui_feed_buffer.clear ();
478 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
479 /* This may fail if buf is larger than _gui_feed_buffer, but it's not really
480 the end of the world if it does.
482 _gui_feed_buffer.push_back ((*i).time() + transport_frame, (*i).size(), (*i).buffer());
486 DataRecorded (_write_source); /* EMIT SIGNAL */
494 _accumulated_capture_offset = 0;
500 /* data will be written to disk */
502 if (rec_nframes == nframes && rec_offset == 0) {
503 playback_distance = nframes;
506 adjust_capture_position = rec_nframes;
508 } else if (nominally_recording) {
510 /* XXXX do this for MIDI !!!
511 can't do actual capture yet - waiting for latency effects to finish before we start
514 playback_distance = nframes;
518 /* XXX: should be doing varispeed stuff here, similar to the code in AudioDiskstream::process */
520 playback_distance = nframes;
524 if (need_disk_signal) {
525 /* copy the diskstream data to all output buffers */
527 MidiBuffer& mbuf (bufs.get_midi (0));
528 get_playback (mbuf, nframes);
530 /* leave the audio count alone */
531 ChanCount cnt (DataType::MIDI, 1);
532 cnt.set (DataType::AUDIO, bufs.count().n_audio());
533 bufs.set_count (cnt);
540 MidiDiskstream::calculate_playback_distance (pframes_t nframes)
542 frameoffset_t playback_distance = nframes;
544 /* XXX: should be doing varispeed stuff once it's implemented in ::process() above */
546 if (_actual_speed < 0.0) {
547 return -playback_distance;
549 return playback_distance;
554 MidiDiskstream::commit (framecnt_t playback_distance)
556 bool need_butler = false;
558 if (_actual_speed < 0.0) {
559 playback_sample -= playback_distance;
561 playback_sample += playback_distance;
564 if (adjust_capture_position != 0) {
565 capture_captured += adjust_capture_position;
566 adjust_capture_position = 0;
569 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
570 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
573 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
574 " = " << frames_written - frames_read
575 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
578 /* frames_read will generally be less than frames_written, but
579 * immediately after an overwrite, we can end up having read some data
580 * before we've written any. we don't need to trip an assert() on this,
581 * but we do need to check so that the decision on whether or not we
582 * need the butler is done correctly.
585 if (frames_read <= frames_written) {
586 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
596 MidiDiskstream::set_pending_overwrite (bool yn)
598 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
600 _pending_overwrite = yn;
601 overwrite_frame = playback_sample;
605 MidiDiskstream::overwrite_existing_buffers ()
607 /* This is safe as long as the butler thread is suspended, which it should be */
608 _playback_buf->reset ();
610 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
611 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
613 read (overwrite_frame, disk_io_chunk_frames, false);
614 file_frame = overwrite_frame; // it was adjusted by ::read()
615 overwrite_queued = false;
616 _pending_overwrite = false;
622 MidiDiskstream::seek (framepos_t frame, bool complete_refill)
624 Glib::Threads::Mutex::Lock lm (state_lock);
627 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
628 /* we haven't read anything since the last seek,
629 so flush all note trackers to prevent
635 _playback_buf->reset();
636 _capture_buf->reset();
637 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
638 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
640 playback_sample = frame;
643 if (complete_refill) {
644 while ((ret = do_refill_with_alloc ()) > 0) ;
646 ret = do_refill_with_alloc ();
653 MidiDiskstream::can_internal_playback_seek (framecnt_t distance)
655 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
656 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
657 return ((frames_written - frames_read) < distance);
661 MidiDiskstream::internal_playback_seek (framecnt_t distance)
663 first_recordable_frame += distance;
664 playback_sample += distance;
669 /** @a start is set to the new frame position (TIME) read up to */
671 MidiDiskstream::read (framepos_t& start, framecnt_t dur, bool reversed)
673 framecnt_t this_read = 0;
675 framepos_t loop_end = 0;
676 framepos_t loop_start = 0;
677 framecnt_t loop_length = 0;
683 get_location_times(loc, &loop_start, &loop_end, &loop_length);
685 /* if we are looping, ensure that the first frame we read is at the correct
686 position within the loop.
689 if (loc && (start >= loop_end)) {
690 //cerr << "start adjusted from " << start;
691 start = loop_start + ((start - loop_start) % loop_length);
692 //cerr << "to " << start << endl;
694 // cerr << "start is " << start << " end " << start+dur << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
699 /* take any loop into account. we can't read past the end of the loop. */
701 if (loc && (loop_end - start <= dur)) {
702 this_read = loop_end - start;
703 // cerr << "reloop true: thisread: " << this_read << " dur: " << dur << endl;
710 if (this_read == 0) {
714 this_read = min(dur,this_read);
716 if (midi_playlist()->read (*_playback_buf, start, this_read) != this_read) {
717 error << string_compose(
718 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
719 id(), this_read, start) << endmsg;
723 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
727 // Swap note ons with note offs here. etc?
728 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
729 // CC values etc. hard.
733 /* if we read to the end of the loop, go back to the beginning */
735 // Synthesize LoopEvent here, because the next events
736 // written will have non-monotonic timestamps.
744 //offset += this_read;
751 MidiDiskstream::do_refill_with_alloc ()
757 MidiDiskstream::do_refill ()
760 size_t write_space = _playback_buf->write_space();
761 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
763 if (write_space == 0) {
771 /* at end: nothing to do */
772 if (file_frame == max_framepos) {
776 /* no space to write */
777 if (_playback_buf->write_space() == 0) {
781 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
782 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
783 if ((frames_written - frames_read) >= midi_readahead) {
787 framecnt_t to_read = midi_readahead - (frames_written - frames_read);
789 //cout << "MDS read for midi_readahead " << to_read << " rb_contains: "
790 // << frames_written - frames_read << endl;
792 to_read = (framecnt_t) min ((framecnt_t) to_read, (framecnt_t) (max_framepos - file_frame));
794 if (read (file_frame, to_read, reversed)) {
801 /** Flush pending data to disk.
803 * Important note: this function will write *AT MOST* disk_io_chunk_frames
804 * of data to disk. it will never write more than that. If it writes that
805 * much and there is more than that waiting to be written, it will return 1,
806 * otherwise 0 on success or -1 on failure.
808 * If there is less than disk_io_chunk_frames to be written, no data will be
809 * written at all unless @a force_flush is true.
812 MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush)
817 if (!_write_source) {
821 const framecnt_t total = g_atomic_int_get(const_cast<gint*> (&_frames_pending_write));
824 _capture_buf->read_space() == 0 ||
825 (!force_flush && (total < disk_io_chunk_frames) && was_recording)) {
829 /* if there are 2+ chunks of disk i/o possible for
830 this track), let the caller know so that it can arrange
831 for us to be called again, ASAP.
833 if we are forcing a flush, then if there is* any* extra
834 work, let the caller know.
836 if we are no longer recording and there is any extra work,
837 let the caller know too.
840 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
845 /* push out everything we have, right now */
846 to_write = max_framecnt;
848 to_write = disk_io_chunk_frames;
851 if (record_enabled() && ((total > disk_io_chunk_frames) || force_flush)) {
852 if (_write_source->midi_write (*_capture_buf, get_capture_start_frame (0), to_write) != to_write) {
853 error << string_compose(_("MidiDiskstream %1: cannot write to disk"), id()) << endmsg;
856 g_atomic_int_add(const_cast<gint*> (&_frames_pending_write), -to_write);
864 MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen*/, bool abort_capture)
866 bool more_work = true;
868 boost::shared_ptr<MidiRegion> region;
869 MidiRegion::SourceList srcs;
870 MidiRegion::SourceList::iterator src;
871 vector<CaptureInfo*>::iterator ci;
875 /* butler is already stopped, but there may be work to do
876 to flush remaining data to disk.
879 while (more_work && !err) {
880 switch (do_flush (TransportContext, true)) {
887 error << string_compose(_("MidiDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
892 /* XXX is there anything we can do if err != 0 ? */
893 Glib::Threads::Mutex::Lock lm (capture_info_lock);
895 if (capture_info.empty()) {
896 goto no_capture_stuff_to_do;
902 _write_source->mark_for_remove ();
903 _write_source->drop_references ();
904 _write_source.reset();
907 /* new source set up in "out" below */
911 framecnt_t total_capture = 0;
912 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
913 total_capture += (*ci)->frames;
916 if (_write_source->length (capture_info.front()->start) != 0) {
918 /* phew, we have data */
920 /* figure out the name for this take */
922 srcs.push_back (_write_source);
924 _write_source->set_timeline_position (capture_info.front()->start);
925 _write_source->set_captured_for (_name);
927 /* set length in beats to entire capture length */
929 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
930 const double total_capture_beats = converter.from (total_capture);
931 _write_source->set_length_beats (total_capture_beats);
933 /* flush to disk: this step differs from the audio path,
934 where all the data is already on disk.
937 _write_source->mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::MusicalTime>::ResolveStuckNotes, total_capture_beats);
939 /* we will want to be able to keep (over)writing the source
940 but we don't want it to be removable. this also differs
941 from the audio situation, where the source at this point
942 must be considered immutable. luckily, we can rely on
943 MidiSource::mark_streaming_write_completed() to have
944 already done the necessary work for that.
947 string whole_file_region_name;
948 whole_file_region_name = region_name_from_path (_write_source->name(), true);
950 /* Register a new region with the Session that
951 describes the entire source. Do this first
952 so that any sub-regions will obviously be
953 children of this one (later!)
959 plist.add (Properties::name, whole_file_region_name);
960 plist.add (Properties::whole_file, true);
961 plist.add (Properties::automatic, true);
962 plist.add (Properties::start, 0);
963 plist.add (Properties::length, total_capture);
964 plist.add (Properties::layer, 0);
966 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
968 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
969 region->special_set_position (capture_info.front()->start);
973 catch (failed_constructor& err) {
974 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
978 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
980 _playlist->clear_changes ();
981 _playlist->freeze ();
983 /* Session frame time of the initial capture in this pass, which is where the source starts */
984 framepos_t initial_capture = 0;
985 if (!capture_info.empty()) {
986 initial_capture = capture_info.front()->start;
989 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
993 RegionFactory::region_name (region_name, _write_source->name(), false);
995 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
996 _name, (*ci)->start, (*ci)->frames, region_name));
999 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1004 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1005 plist.add (Properties::start, (*ci)->start - initial_capture);
1006 plist.add (Properties::length, (*ci)->frames);
1007 plist.add (Properties::length_beats, converter.from((*ci)->frames));
1008 plist.add (Properties::name, region_name);
1010 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1011 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1014 catch (failed_constructor& err) {
1015 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1016 continue; /* XXX is this OK? */
1019 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1021 i_am_the_modifier++;
1022 _playlist->add_region (region, (*ci)->start);
1023 i_am_the_modifier--;
1027 _session.add_command (new StatefulDiffCommand(_playlist));
1031 /* No data was recorded, so this capture will
1032 effectively be aborted; do the same as we
1033 do for an explicit abort.
1036 if (_write_source) {
1037 _write_source->mark_for_remove ();
1038 _write_source->drop_references ();
1039 _write_source.reset();
1045 use_new_write_source (0);
1047 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1051 capture_info.clear ();
1052 capture_start_frame = 0;
1054 no_capture_stuff_to_do:
1060 MidiDiskstream::transport_looped (framepos_t)
1062 /* Here we only keep track of the number of captured loops so monotonic
1063 event times can be delivered to the write source in process(). Trying
1064 to be clever here is a world of trouble, it is better to simply record
1065 the input in a straightforward non-destructive way. In the future when
1066 we want to implement more clever MIDI looping modes it should be done in
1067 the Source and/or entirely after the capture is finished.
1069 if (was_recording) {
1070 g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
1075 MidiDiskstream::finish_capture ()
1077 was_recording = false;
1079 if (capture_captured == 0) {
1083 CaptureInfo* ci = new CaptureInfo;
1085 ci->start = capture_start_frame;
1086 ci->frames = capture_captured;
1088 /* XXX theoretical race condition here. Need atomic exchange ?
1089 However, the circumstances when this is called right
1090 now (either on record-disable or transport_stopped)
1091 mean that no actual race exists. I think ...
1092 We now have a capture_info_lock, but it is only to be used
1093 to synchronize in the transport_stop and the capture info
1094 accessors, so that invalidation will not occur (both non-realtime).
1097 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1099 capture_info.push_back (ci);
1100 capture_captured = 0;
1104 MidiDiskstream::set_record_enabled (bool yn)
1106 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_midi() == 0) {
1110 /* yes, i know that this not proof against race conditions, but its
1111 good enough. i think.
1114 if (record_enabled() != yn) {
1116 engage_record_enable ();
1118 disengage_record_enable ();
1121 RecordEnableChanged (); /* EMIT SIGNAL */
1126 MidiDiskstream::prep_record_enable ()
1128 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_midi() == 0) {
1132 bool const rolling = _session.transport_speed() != 0.0f;
1134 boost::shared_ptr<MidiPort> sp = _source_port.lock ();
1136 if (sp && Config->get_monitoring_model() == HardwareMonitoring) {
1137 sp->request_input_monitoring (!(_session.config.get_auto_input() && rolling));
1144 MidiDiskstream::prep_record_disable ()
1151 MidiDiskstream::get_state ()
1153 XMLNode& node (Diskstream::get_state());
1155 LocaleGuard lg (X_("POSIX"));
1157 if (_write_source && _session.get_record_enabled()) {
1159 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1160 XMLNode* cs_grandchild;
1162 cs_grandchild = new XMLNode (X_("file"));
1163 cs_grandchild->add_property (X_("path"), _write_source->path());
1164 cs_child->add_child_nocopy (*cs_grandchild);
1166 /* store the location where capture will start */
1170 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1171 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1173 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1176 cs_child->add_property (X_("at"), buf);
1177 node.add_child_nocopy (*cs_child);
1184 MidiDiskstream::set_state (const XMLNode& node, int version)
1186 XMLNodeList nlist = node.children();
1187 XMLNodeIterator niter;
1188 XMLNode* capture_pending_node = 0;
1189 LocaleGuard lg (X_("POSIX"));
1191 /* prevent write sources from being created */
1193 in_set_state = true;
1195 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1196 if ((*niter)->name() == X_("CapturingSources")) {
1197 capture_pending_node = *niter;
1201 if (Diskstream::set_state (node, version)) {
1205 if (capture_pending_node) {
1206 use_pending_capture_data (*capture_pending_node);
1209 in_set_state = false;
1215 MidiDiskstream::use_new_write_source (uint32_t n)
1217 if (!_session.writable() || !recordable()) {
1221 _accumulated_capture_offset = 0;
1222 _write_source.reset();
1225 _write_source = boost::dynamic_pointer_cast<SMFSource>(
1226 _session.create_midi_source_for_session (write_source_name ()));
1228 if (!_write_source) {
1229 throw failed_constructor();
1233 catch (failed_constructor &err) {
1234 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1235 _write_source.reset();
1242 * We want to use the name of the existing write source (the one that will be
1243 * used by the next capture) for another purpose. So change the name of the
1244 * current source, and return its current name.
1246 * Return an empty string if the change cannot be accomplished.
1249 MidiDiskstream::steal_write_source_name ()
1251 string our_old_name = _write_source->name();
1253 /* this will bump the name of the current write source to the next one
1254 * (e.g. "MIDI 1-1" gets renamed to "MIDI 1-2"), thus leaving the
1255 * current write source name (e.g. "MIDI 1-1" available). See the
1256 * comments in Session::create_midi_source_by_stealing_name() about why
1261 string new_path = _session.new_midi_source_path (name());
1263 if (_write_source->rename (new_path)) {
1270 return our_old_name;
1274 MidiDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1276 if (!_session.writable() || !recordable()) {
1280 if (_write_source && mark_write_complete) {
1281 _write_source->mark_streaming_write_completed ();
1283 use_new_write_source (0);
1287 MidiDiskstream::set_block_size (pframes_t /*nframes*/)
1292 MidiDiskstream::allocate_temporary_buffers ()
1297 MidiDiskstream::ensure_input_monitoring (bool yn)
1299 boost::shared_ptr<MidiPort> sp = _source_port.lock ();
1302 sp->ensure_input_monitoring (yn);
1307 MidiDiskstream::set_align_style_from_io ()
1309 if (_alignment_choice != Automatic) {
1313 /* XXX Not sure what, if anything we can do with MIDI
1314 as far as capture alignment etc.
1317 set_align_style (ExistingMaterial);
1322 MidiDiskstream::playback_buffer_load () const
1324 /* For MIDI it's not trivial to differentiate the following two cases:
1326 1. The playback buffer is empty because the system has run out of time to fill it.
1327 2. The playback buffer is empty because there is no more data on the playlist.
1329 If we use a simple buffer load computation, we will report that the MIDI diskstream
1330 cannot keep up when #2 happens, when in fact it can. Since MIDI data rates
1331 are so low compared to audio, just give a pretend answer here.
1338 MidiDiskstream::capture_buffer_load () const
1340 /* We don't report playback buffer load, so don't report capture load either */
1346 MidiDiskstream::use_pending_capture_data (XMLNode& /*node*/)
1352 MidiDiskstream::flush_playback (framepos_t start, framepos_t end)
1354 _playback_buf->flush (start, end);
1355 g_atomic_int_add (&_frames_read_from_ringbuffer, end - start);
1358 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1359 * so that an event at playback_sample has time = 0
1362 MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes)
1366 Location* loc = loop_location;
1368 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1369 "%1 MDS pre-read read %8 @ %4..%5 from %2 write to %3, LOOPED ? %6-%7\n", _name,
1370 _playback_buf->get_read_ptr(), _playback_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1371 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes));
1373 // cerr << "================\n";
1374 // _playback_buf->dump (cerr);
1375 // cerr << "----------------\n";
1377 size_t events_read = 0;
1380 framepos_t effective_start;
1382 if (playback_sample >= loc->end()) {
1383 effective_start = loc->start() + ((playback_sample - loc->end()) % loc->length());
1385 effective_start = playback_sample;
1388 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1390 if (effective_start == loc->start()) {
1391 /* We need to turn off notes that may extend
1392 beyond the loop end.
1395 _playback_buf->loop_resolve (dst, 0);
1398 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1399 /* end of loop is within the range we are reading, so
1400 split the read in two, and lie about the location
1403 framecnt_t first, second;
1405 first = loc->end() - effective_start;
1406 second = nframes - first;
1408 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4\n",
1409 effective_start, loc->end(), first, second));
1412 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1413 effective_start, first));
1414 events_read = _playback_buf->read (dst, effective_start, first);
1418 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1419 loc->start(), second));
1420 events_read += _playback_buf->read (dst, loc->start(), second);
1424 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1425 effective_start, nframes));
1426 events_read = _playback_buf->read (dst, effective_start, effective_start + nframes);
1429 events_read = _playback_buf->read (dst, playback_sample, playback_sample + nframes);
1432 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1433 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1434 _name, events_read, playback_sample, playback_sample + nframes,
1435 _playback_buf->read_space(), _playback_buf->write_space(),
1436 _playback_buf->get_read_ptr(), _playback_buf->get_write_ptr()));
1438 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1442 MidiDiskstream::set_name (string const & name)
1444 if (_name == name) {
1447 Diskstream::set_name (name);
1449 /* get a new write source so that its name reflects the new diskstream name */
1450 use_new_write_source (0);
1456 MidiDiskstream::set_write_source_name (const std::string& str) {
1457 if (_write_source_name == str) {
1460 Diskstream::set_write_source_name (str);
1461 if (_write_source_name == name()) {
1464 use_new_write_source (0);
1468 boost::shared_ptr<MidiBuffer>
1469 MidiDiskstream::get_gui_feed_buffer () const
1471 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1473 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1474 b->copy (_gui_feed_buffer);
1479 MidiDiskstream::reset_tracker ()
1481 _playback_buf->reset_tracker ();
1483 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1486 mp->clear_note_trackers ();