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/midi_ring_buffer.h"
51 #include "ardour/playlist_factory.h"
52 #include "ardour/region_factory.h"
53 #include "ardour/session.h"
54 #include "ardour/session_playlists.h"
55 #include "ardour/smf_source.h"
56 #include "ardour/types.h"
57 #include "ardour/utils.h"
59 #include "midi++/types.h"
65 using namespace ARDOUR;
68 framecnt_t MidiDiskstream::midi_readahead = 4096;
70 MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::Flag flag)
71 : Diskstream(sess, name, flag)
74 , _note_mode(Sustained)
75 , _frames_written_to_ringbuffer(0)
76 , _frames_read_from_ringbuffer(0)
77 , _frames_pending_write(0)
78 , _num_captured_loops(0)
79 , _accumulated_capture_offset(0)
80 , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
86 use_new_write_source (0);
91 throw failed_constructor();
95 MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node)
96 : Diskstream(sess, node)
99 , _note_mode(Sustained)
100 , _frames_written_to_ringbuffer(0)
101 , _frames_read_from_ringbuffer(0)
102 , _frames_pending_write(0)
103 , _num_captured_loops(0)
104 , _accumulated_capture_offset(0)
105 , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI))
111 if (set_state (node, Stateful::loading_state_version)) {
112 in_set_state = false;
113 throw failed_constructor();
116 use_new_write_source (0);
118 in_set_state = false;
122 MidiDiskstream::init ()
124 /* there are no channels at this point, so these
125 two calls just get speed_buffer_size and wrap_buffer
126 size setup without duplicating their code.
129 set_block_size (_session.get_block_size());
130 allocate_temporary_buffers ();
132 const size_t size = _session.butler()->midi_diskstream_buffer_size();
133 _playback_buf = new MidiRingBuffer<framepos_t>(size);
134 _capture_buf = new MidiRingBuffer<framepos_t>(size);
136 _n_channels = ChanCount(DataType::MIDI, 1);
139 MidiDiskstream::~MidiDiskstream ()
141 Glib::Threads::Mutex::Lock lm (state_lock);
142 delete _playback_buf;
148 MidiDiskstream::non_realtime_locate (framepos_t position)
151 _write_source->set_timeline_position (position);
153 seek (position, false);
158 MidiDiskstream::non_realtime_input_change ()
161 Glib::Threads::Mutex::Lock lm (state_lock);
163 if (input_change_pending.type == IOChange::NoChange) {
167 if (input_change_pending.type & IOChange::ConfigurationChanged) {
168 uint32_t ni = _io->n_ports().n_midi();
170 if (ni != _n_channels.n_midi()) {
171 error << string_compose (_("%1: I/O configuration change %4 requested to use %2, but channel setup is %3"),
174 _n_channels, input_change_pending.type)
179 _source_port.reset ();
181 _source_port = _io->midi(0);
185 if (input_change_pending.type & IOChange::ConnectionsChanged) {
186 set_capture_offset ();
187 set_align_style_from_io ();
190 input_change_pending.type = IOChange::NoChange;
192 /* implicit unlock */
195 /* unlike with audio, there is never any need to reset write sources
196 based on input configuration changes because ... a MIDI track
197 has just 1 MIDI port as input, always.
200 /* now refill channel buffers */
202 if (speed() != 1.0f || speed() != -1.0f) {
203 seek ((framepos_t) (_session.transport_frame() * (double) speed()));
206 seek (_session.transport_frame());
209 g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
210 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
214 MidiDiskstream::find_and_use_playlist (const string& name)
216 boost::shared_ptr<MidiPlaylist> playlist;
218 if ((playlist = boost::dynamic_pointer_cast<MidiPlaylist> (_session.playlists->by_name (name))) == 0) {
219 playlist = boost::dynamic_pointer_cast<MidiPlaylist> (PlaylistFactory::create (DataType::MIDI, _session, name));
223 error << string_compose(_("MidiDiskstream: Playlist \"%1\" isn't a midi playlist"), name) << endmsg;
227 return use_playlist (playlist);
231 MidiDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
233 if (boost::dynamic_pointer_cast<MidiPlaylist>(playlist)) {
234 Diskstream::use_playlist(playlist);
241 MidiDiskstream::use_new_playlist ()
244 boost::shared_ptr<MidiPlaylist> playlist;
246 if (!in_set_state && destructive()) {
251 newname = Playlist::bump_name (_playlist->name(), _session);
253 newname = Playlist::bump_name (_name, _session);
256 if ((playlist = boost::dynamic_pointer_cast<MidiPlaylist> (PlaylistFactory::create (
257 DataType::MIDI, _session, newname, hidden()))) != 0) {
259 return use_playlist (playlist);
267 MidiDiskstream::use_copy_playlist ()
273 if (_playlist == 0) {
274 error << string_compose(_("MidiDiskstream %1: there is no existing playlist to make a copy of!"), _name) << endmsg;
279 boost::shared_ptr<MidiPlaylist> playlist;
281 newname = Playlist::bump_name (_playlist->name(), _session);
283 if ((playlist = boost::dynamic_pointer_cast<MidiPlaylist>(PlaylistFactory::create (midi_playlist(), newname))) != 0) {
284 return use_playlist (playlist);
290 /** Overloaded from parent to die horribly
293 MidiDiskstream::set_destructive (bool yn)
299 MidiDiskstream::set_note_mode (NoteMode m)
302 midi_playlist()->set_note_mode(m);
303 if (_write_source && _write_source->model())
304 _write_source->model()->set_note_mode(m);
307 /** Get the start, end, and length of a location "atomically".
309 * Note: Locations don't get deleted, so all we care about when I say "atomic"
310 * is that we are always pointing to the same one and using start/length values
311 * obtained just once. Use this function to achieve this since location being
312 * a parameter achieves this.
315 get_location_times(const Location* location,
321 *start = location->start();
322 *end = location->end();
323 *length = *end - *start;
328 MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t nframes, framecnt_t& playback_distance, bool need_disk_signal)
330 framecnt_t rec_offset = 0;
331 framecnt_t rec_nframes = 0;
332 bool nominally_recording;
333 bool re = record_enabled ();
334 bool can_record = _session.actively_recording ();
336 playback_distance = 0;
338 check_record_status (transport_frame, can_record);
340 nominally_recording = (can_record && re);
346 boost::shared_ptr<MidiPort> sp = _source_port.lock ();
352 Glib::Threads::Mutex::Lock sm (state_lock, Glib::Threads::TRY_LOCK);
358 const Location* const loop_loc = loop_location;
359 framepos_t loop_start = 0;
360 framepos_t loop_end = 0;
361 framepos_t loop_length = 0;
362 get_location_times(loop_loc, &loop_start, &loop_end, &loop_length);
364 adjust_capture_position = 0;
366 if (nominally_recording || (re && was_recording && _session.get_record_enabled() && _session.config.get_punch_in())) {
367 Evoral::OverlapType ot = Evoral::coverage (first_recordable_frame, last_recordable_frame, transport_frame, transport_frame + nframes);
369 calculate_record_range(ot, transport_frame, nframes, rec_nframes, rec_offset);
370 /* For audio: not writing frames to the capture ringbuffer offsets
371 * the recording. For midi: we need to keep track of the record range
372 * and subtract the accumulated difference from the event time.
375 _accumulated_capture_offset += rec_offset;
377 _accumulated_capture_offset += nframes;
380 if (rec_nframes && !was_recording) {
382 /* Loop recording, so pretend the capture started at the loop
383 start rgardless of what time it is now, so the source starts
384 at the loop start and can handle time wrapping around.
385 Otherwise, start the source right now as usual.
387 capture_captured = transport_frame - loop_start;
388 capture_start_frame = loop_start;
390 _write_source->mark_write_starting_now(
391 capture_start_frame, capture_captured, loop_length);
392 g_atomic_int_set(const_cast<gint*> (&_frames_pending_write), 0);
393 g_atomic_int_set(const_cast<gint*> (&_num_captured_loops), 0);
394 was_recording = true;
398 if (can_record && !_last_capture_sources.empty()) {
399 _last_capture_sources.clear ();
402 if (nominally_recording || rec_nframes) {
404 // Pump entire port buffer into the ring buffer (FIXME: split cycles?)
405 MidiBuffer& buf = sp->get_midi_buffer(nframes);
406 ChannelMode mode = AllChannels; // _track->get_capture_channel_mode ();
407 uint32_t mask = 0xffff; // _track->get_capture_channel_mask ();
409 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
410 Evoral::MIDIEvent<MidiBuffer::TimeType> ev(*i, false);
411 if (ev.time() + rec_offset > rec_nframes) {
415 if (DEBUG::MidiIO & PBD::debug_bits) {
416 const uint8_t* __data = ev.buffer();
418 DEBUG_STR_APPEND(a, string_compose ("mididiskstream %1 capture event @ %2 + %3 sz %4 ", this, ev.time(), transport_frame, ev.size()));
419 for (size_t i=0; i < ev.size(); ++i) {
420 DEBUG_STR_APPEND(a,hex);
421 DEBUG_STR_APPEND(a,"0x");
422 DEBUG_STR_APPEND(a,(int)__data[i]);
423 DEBUG_STR_APPEND(a,' ');
425 DEBUG_STR_APPEND(a,'\n');
426 DEBUG_TRACE (DEBUG::MidiIO, DEBUG_STR(a).str());
429 /* Write events to the capture buffer in frames from session start,
430 but ignoring looping so event time progresses monotonically.
431 The source knows the loop length so it knows exactly where the
432 event occurs in the series of recorded loops and can implement
433 any desirable behaviour. We don't want to send event with
434 transport time here since that way the source can not
435 reconstruct their actual time; future clever MIDI looping should
436 probably be implemented in the source instead of here.
438 const framecnt_t loop_offset = _num_captured_loops * loop_length;
439 const framepos_t event_time = transport_frame + loop_offset - _accumulated_capture_offset + ev.time();
440 if (event_time < 0 || event_time < first_recordable_frame) {
445 _capture_buf->write(event_time,
446 ev.type(), ev.size(), ev.buffer());
449 if (ev.is_channel_event()) {
450 if ((1<<ev.channel()) & mask) {
451 _capture_buf->write(event_time,
452 ev.type(), ev.size(), ev.buffer());
455 _capture_buf->write(event_time,
456 ev.type(), ev.size(), ev.buffer());
460 if (ev.is_channel_event()) {
461 ev.set_channel (PBD::ffs(mask) - 1);
463 _capture_buf->write(event_time,
464 ev.type(), ev.size(), ev.buffer());
468 g_atomic_int_add(const_cast<gint*>(&_frames_pending_write), nframes);
470 if (buf.size() != 0) {
471 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::Threads::TRY_LOCK);
474 /* Copy this data into our GUI feed buffer and tell the GUI
475 that it can read it if it likes.
477 _gui_feed_buffer.clear ();
479 for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) {
480 /* This may fail if buf is larger than _gui_feed_buffer, but it's not really
481 the end of the world if it does.
483 _gui_feed_buffer.push_back ((*i).time() + transport_frame, (*i).size(), (*i).buffer());
487 DataRecorded (_write_source); /* EMIT SIGNAL */
495 _accumulated_capture_offset = 0;
501 /* data will be written to disk */
503 if (rec_nframes == nframes && rec_offset == 0) {
504 playback_distance = nframes;
507 adjust_capture_position = rec_nframes;
509 } else if (nominally_recording) {
511 /* XXXX do this for MIDI !!!
512 can't do actual capture yet - waiting for latency effects to finish before we start
515 playback_distance = nframes;
519 /* XXX: should be doing varispeed stuff here, similar to the code in AudioDiskstream::process */
521 playback_distance = nframes;
525 if (need_disk_signal) {
526 /* copy the diskstream data to all output buffers */
528 MidiBuffer& mbuf (bufs.get_midi (0));
529 get_playback (mbuf, nframes);
531 /* leave the audio count alone */
532 ChanCount cnt (DataType::MIDI, 1);
533 cnt.set (DataType::AUDIO, bufs.count().n_audio());
534 bufs.set_count (cnt);
541 MidiDiskstream::calculate_playback_distance (pframes_t nframes)
543 frameoffset_t playback_distance = nframes;
545 /* XXX: should be doing varispeed stuff once it's implemented in ::process() above */
547 if (_actual_speed < 0.0) {
548 return -playback_distance;
550 return playback_distance;
555 MidiDiskstream::commit (framecnt_t playback_distance)
557 bool need_butler = false;
559 if (_actual_speed < 0.0) {
560 playback_sample -= playback_distance;
562 playback_sample += playback_distance;
565 if (adjust_capture_position != 0) {
566 capture_captured += adjust_capture_position;
567 adjust_capture_position = 0;
570 uint32_t frames_read = g_atomic_int_get(const_cast<gint*>(&_frames_read_from_ringbuffer));
571 uint32_t frames_written = g_atomic_int_get(const_cast<gint*>(&_frames_written_to_ringbuffer));
574 cerr << name() << " MDS written: " << frames_written << " - read: " << frames_read <<
575 " = " << frames_written - frames_read
576 << " + " << playback_distance << " < " << midi_readahead << " = " << need_butler << ")" << endl;
579 /* frames_read will generally be less than frames_written, but
580 * immediately after an overwrite, we can end up having read some data
581 * before we've written any. we don't need to trip an assert() on this,
582 * but we do need to check so that the decision on whether or not we
583 * need the butler is done correctly.
586 if (frames_read <= frames_written) {
587 if ((frames_written - frames_read) + playback_distance < midi_readahead) {
597 MidiDiskstream::set_pending_overwrite (bool yn)
599 /* called from audio thread, so we can use the read ptr and playback sample as we wish */
601 _pending_overwrite = yn;
602 overwrite_frame = playback_sample;
606 MidiDiskstream::overwrite_existing_buffers ()
608 /* This is safe as long as the butler thread is suspended, which it should be */
609 _playback_buf->reset ();
611 g_atomic_int_set (&_frames_read_from_ringbuffer, 0);
612 g_atomic_int_set (&_frames_written_to_ringbuffer, 0);
614 read (overwrite_frame, disk_io_chunk_frames, false);
615 file_frame = overwrite_frame; // it was adjusted by ::read()
616 overwrite_queued = false;
617 _pending_overwrite = false;
623 MidiDiskstream::seek (framepos_t frame, bool complete_refill)
625 Glib::Threads::Mutex::Lock lm (state_lock);
628 if (g_atomic_int_get (&_frames_read_from_ringbuffer) == 0) {
629 /* we haven't read anything since the last seek,
630 so flush all note trackers to prevent
636 _playback_buf->reset();
637 _capture_buf->reset();
638 g_atomic_int_set(&_frames_read_from_ringbuffer, 0);
639 g_atomic_int_set(&_frames_written_to_ringbuffer, 0);
641 playback_sample = frame;
644 if (complete_refill) {
645 while ((ret = do_refill_with_alloc ()) > 0) ;
647 ret = do_refill_with_alloc ();
654 MidiDiskstream::can_internal_playback_seek (framecnt_t distance)
656 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
657 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
658 return ((frames_written - frames_read) < distance);
662 MidiDiskstream::internal_playback_seek (framecnt_t distance)
664 first_recordable_frame += distance;
665 playback_sample += distance;
670 /** @a start is set to the new frame position (TIME) read up to */
672 MidiDiskstream::read (framepos_t& start, framecnt_t dur, bool reversed)
674 framecnt_t this_read = 0;
676 framepos_t loop_end = 0;
677 framepos_t loop_start = 0;
678 framecnt_t loop_length = 0;
684 get_location_times(loc, &loop_start, &loop_end, &loop_length);
686 /* if we are looping, ensure that the first frame we read is at the correct
687 position within the loop.
690 if (loc && (start >= loop_end)) {
691 //cerr << "start adjusted from " << start;
692 start = loop_start + ((start - loop_start) % loop_length);
693 //cerr << "to " << start << endl;
695 // cerr << "start is " << start << " end " << start+dur << " loopstart: " << loop_start << " loopend: " << loop_end << endl;
700 /* take any loop into account. we can't read past the end of the loop. */
702 if (loc && (loop_end - start <= dur)) {
703 this_read = loop_end - start;
704 // cerr << "reloop true: thisread: " << this_read << " dur: " << dur << endl;
711 if (this_read == 0) {
715 this_read = min(dur,this_read);
717 if (midi_playlist()->read (*_playback_buf, start, this_read) != this_read) {
718 error << string_compose(
719 _("MidiDiskstream %1: cannot read %2 from playlist at frame %3"),
720 id(), this_read, start) << endmsg;
724 g_atomic_int_add (&_frames_written_to_ringbuffer, this_read);
728 // Swap note ons with note offs here. etc?
729 // Fully reversing MIDI requires look-ahead (well, behind) to find previous
730 // CC values etc. hard.
734 /* if we read to the end of the loop, go back to the beginning */
736 // Synthesize LoopEvent here, because the next events
737 // written will have non-monotonic timestamps.
745 //offset += this_read;
752 MidiDiskstream::do_refill_with_alloc ()
758 MidiDiskstream::do_refill ()
761 size_t write_space = _playback_buf->write_space();
762 bool reversed = (_visible_speed * _session.transport_speed()) < 0.0f;
764 if (write_space == 0) {
772 /* at end: nothing to do */
773 if (file_frame == max_framepos) {
777 /* no space to write */
778 if (_playback_buf->write_space() == 0) {
782 uint32_t frames_read = g_atomic_int_get(&_frames_read_from_ringbuffer);
783 uint32_t frames_written = g_atomic_int_get(&_frames_written_to_ringbuffer);
784 if ((frames_written - frames_read) >= midi_readahead) {
788 framecnt_t to_read = midi_readahead - (frames_written - frames_read);
790 //cout << "MDS read for midi_readahead " << to_read << " rb_contains: "
791 // << frames_written - frames_read << endl;
793 to_read = (framecnt_t) min ((framecnt_t) to_read, (framecnt_t) (max_framepos - file_frame));
795 if (read (file_frame, to_read, reversed)) {
802 /** Flush pending data to disk.
804 * Important note: this function will write *AT MOST* disk_io_chunk_frames
805 * of data to disk. it will never write more than that. If it writes that
806 * much and there is more than that waiting to be written, it will return 1,
807 * otherwise 0 on success or -1 on failure.
809 * If there is less than disk_io_chunk_frames to be written, no data will be
810 * written at all unless @a force_flush is true.
813 MidiDiskstream::do_flush (RunContext /*context*/, bool force_flush)
818 if (!_write_source) {
822 const framecnt_t total = g_atomic_int_get(const_cast<gint*> (&_frames_pending_write));
825 _capture_buf->read_space() == 0 ||
826 (!force_flush && (total < disk_io_chunk_frames) && was_recording)) {
830 /* if there are 2+ chunks of disk i/o possible for
831 this track), let the caller know so that it can arrange
832 for us to be called again, ASAP.
834 if we are forcing a flush, then if there is* any* extra
835 work, let the caller know.
837 if we are no longer recording and there is any extra work,
838 let the caller know too.
841 if (total >= 2 * disk_io_chunk_frames || ((force_flush || !was_recording) && total > disk_io_chunk_frames)) {
846 /* push out everything we have, right now */
847 to_write = max_framecnt;
849 to_write = disk_io_chunk_frames;
852 if (record_enabled() && ((total > disk_io_chunk_frames) || force_flush)) {
853 if (_write_source->midi_write (*_capture_buf, get_capture_start_frame (0), to_write) != to_write) {
854 error << string_compose(_("MidiDiskstream %1: cannot write to disk"), id()) << endmsg;
857 g_atomic_int_add(const_cast<gint*> (&_frames_pending_write), -to_write);
865 MidiDiskstream::transport_stopped_wallclock (struct tm& /*when*/, time_t /*twhen*/, bool abort_capture)
867 bool more_work = true;
869 boost::shared_ptr<MidiRegion> region;
870 MidiRegion::SourceList srcs;
871 MidiRegion::SourceList::iterator src;
872 vector<CaptureInfo*>::iterator ci;
876 /* butler is already stopped, but there may be work to do
877 to flush remaining data to disk.
880 while (more_work && !err) {
881 switch (do_flush (TransportContext, true)) {
888 error << string_compose(_("MidiDiskstream \"%1\": cannot flush captured data to disk!"), _name) << endmsg;
893 /* XXX is there anything we can do if err != 0 ? */
894 Glib::Threads::Mutex::Lock lm (capture_info_lock);
896 if (capture_info.empty()) {
897 goto no_capture_stuff_to_do;
903 _write_source->mark_for_remove ();
904 _write_source->drop_references ();
905 _write_source.reset();
908 /* new source set up in "out" below */
912 framecnt_t total_capture = 0;
913 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
914 total_capture += (*ci)->frames;
917 if (_write_source->length (capture_info.front()->start) != 0) {
919 /* phew, we have data */
921 /* figure out the name for this take */
923 srcs.push_back (_write_source);
925 _write_source->set_timeline_position (capture_info.front()->start);
926 _write_source->set_captured_for (_name);
928 /* set length in beats to entire capture length */
930 BeatsFramesConverter converter (_session.tempo_map(), capture_info.front()->start);
931 const Evoral::MusicalTime total_capture_beats = converter.from (total_capture);
932 _write_source->set_length_beats (total_capture_beats);
934 /* flush to disk: this step differs from the audio path,
935 where all the data is already on disk.
938 _write_source->mark_midi_streaming_write_completed (Evoral::Sequence<Evoral::MusicalTime>::ResolveStuckNotes, total_capture_beats);
940 /* we will want to be able to keep (over)writing the source
941 but we don't want it to be removable. this also differs
942 from the audio situation, where the source at this point
943 must be considered immutable. luckily, we can rely on
944 MidiSource::mark_streaming_write_completed() to have
945 already done the necessary work for that.
948 string whole_file_region_name;
949 whole_file_region_name = region_name_from_path (_write_source->name(), true);
951 /* Register a new region with the Session that
952 describes the entire source. Do this first
953 so that any sub-regions will obviously be
954 children of this one (later!)
960 plist.add (Properties::name, whole_file_region_name);
961 plist.add (Properties::whole_file, true);
962 plist.add (Properties::automatic, true);
963 plist.add (Properties::start, 0);
964 plist.add (Properties::length, total_capture);
965 plist.add (Properties::layer, 0);
967 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
969 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
970 region->special_set_position (capture_info.front()->start);
974 catch (failed_constructor& err) {
975 error << string_compose(_("%1: could not create region for complete midi file"), _name) << endmsg;
979 _last_capture_sources.insert (_last_capture_sources.end(), srcs.begin(), srcs.end());
981 _playlist->clear_changes ();
982 _playlist->freeze ();
984 /* Session frame time of the initial capture in this pass, which is where the source starts */
985 framepos_t initial_capture = 0;
986 if (!capture_info.empty()) {
987 initial_capture = capture_info.front()->start;
990 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
994 RegionFactory::region_name (region_name, _write_source->name(), false);
996 DEBUG_TRACE (DEBUG::CaptureAlignment, string_compose ("%1 capture start @ %2 length %3 add new region %4\n",
997 _name, (*ci)->start, (*ci)->frames, region_name));
1000 // cerr << _name << ": based on ci of " << (*ci)->start << " for " << (*ci)->frames << " add a region\n";
1005 /* start of this region is the offset between the start of its capture and the start of the whole pass */
1006 plist.add (Properties::start, (*ci)->start - initial_capture);
1007 plist.add (Properties::length, (*ci)->frames);
1008 plist.add (Properties::length_beats, converter.from((*ci)->frames));
1009 plist.add (Properties::name, region_name);
1011 boost::shared_ptr<Region> rx (RegionFactory::create (srcs, plist));
1012 region = boost::dynamic_pointer_cast<MidiRegion> (rx);
1015 catch (failed_constructor& err) {
1016 error << _("MidiDiskstream: could not create region for captured midi!") << endmsg;
1017 continue; /* XXX is this OK? */
1020 // cerr << "add new region, buffer position = " << buffer_position << " @ " << (*ci)->start << endl;
1022 i_am_the_modifier++;
1023 _playlist->add_region (region, (*ci)->start);
1024 i_am_the_modifier--;
1028 _session.add_command (new StatefulDiffCommand(_playlist));
1032 /* No data was recorded, so this capture will
1033 effectively be aborted; do the same as we
1034 do for an explicit abort.
1037 if (_write_source) {
1038 _write_source->mark_for_remove ();
1039 _write_source->drop_references ();
1040 _write_source.reset();
1046 use_new_write_source (0);
1048 for (ci = capture_info.begin(); ci != capture_info.end(); ++ci) {
1052 capture_info.clear ();
1053 capture_start_frame = 0;
1055 no_capture_stuff_to_do:
1061 MidiDiskstream::transport_looped (framepos_t)
1063 /* Here we only keep track of the number of captured loops so monotonic
1064 event times can be delivered to the write source in process(). Trying
1065 to be clever here is a world of trouble, it is better to simply record
1066 the input in a straightforward non-destructive way. In the future when
1067 we want to implement more clever MIDI looping modes it should be done in
1068 the Source and/or entirely after the capture is finished.
1070 if (was_recording) {
1071 g_atomic_int_add(const_cast<gint*> (&_num_captured_loops), 1);
1076 MidiDiskstream::finish_capture ()
1078 was_recording = false;
1080 if (capture_captured == 0) {
1084 CaptureInfo* ci = new CaptureInfo;
1086 ci->start = capture_start_frame;
1087 ci->frames = capture_captured;
1089 /* XXX theoretical race condition here. Need atomic exchange ?
1090 However, the circumstances when this is called right
1091 now (either on record-disable or transport_stopped)
1092 mean that no actual race exists. I think ...
1093 We now have a capture_info_lock, but it is only to be used
1094 to synchronize in the transport_stop and the capture info
1095 accessors, so that invalidation will not occur (both non-realtime).
1098 // cerr << "Finish capture, add new CI, " << ci->start << '+' << ci->frames << endl;
1100 capture_info.push_back (ci);
1101 capture_captured = 0;
1105 MidiDiskstream::set_record_enabled (bool yn)
1107 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_midi() == 0) {
1111 /* yes, i know that this not proof against race conditions, but its
1112 good enough. i think.
1115 if (record_enabled() != yn) {
1117 engage_record_enable ();
1119 disengage_record_enable ();
1122 RecordEnableChanged (); /* EMIT SIGNAL */
1127 MidiDiskstream::prep_record_enable ()
1129 if (!recordable() || !_session.record_enabling_legal() || _io->n_ports().n_midi() == 0) {
1133 bool const rolling = _session.transport_speed() != 0.0f;
1135 boost::shared_ptr<MidiPort> sp = _source_port.lock ();
1137 if (sp && Config->get_monitoring_model() == HardwareMonitoring) {
1138 sp->request_input_monitoring (!(_session.config.get_auto_input() && rolling));
1145 MidiDiskstream::prep_record_disable ()
1152 MidiDiskstream::get_state ()
1154 XMLNode& node (Diskstream::get_state());
1156 LocaleGuard lg (X_("POSIX"));
1158 if (_write_source && _session.get_record_enabled()) {
1160 XMLNode* cs_child = new XMLNode (X_("CapturingSources"));
1161 XMLNode* cs_grandchild;
1163 cs_grandchild = new XMLNode (X_("file"));
1164 cs_grandchild->add_property (X_("path"), _write_source->path());
1165 cs_child->add_child_nocopy (*cs_grandchild);
1167 /* store the location where capture will start */
1171 if (_session.config.get_punch_in() && ((pi = _session.locations()->auto_punch_location()) != 0)) {
1172 snprintf (buf, sizeof (buf), "%" PRId64, pi->start());
1174 snprintf (buf, sizeof (buf), "%" PRId64, _session.transport_frame());
1177 cs_child->add_property (X_("at"), buf);
1178 node.add_child_nocopy (*cs_child);
1185 MidiDiskstream::set_state (const XMLNode& node, int version)
1187 XMLNodeList nlist = node.children();
1188 XMLNodeIterator niter;
1189 XMLNode* capture_pending_node = 0;
1190 LocaleGuard lg (X_("POSIX"));
1192 /* prevent write sources from being created */
1194 in_set_state = true;
1196 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1197 if ((*niter)->name() == X_("CapturingSources")) {
1198 capture_pending_node = *niter;
1202 if (Diskstream::set_state (node, version)) {
1206 if (capture_pending_node) {
1207 use_pending_capture_data (*capture_pending_node);
1210 in_set_state = false;
1216 MidiDiskstream::use_new_write_source (uint32_t n)
1218 if (!_session.writable() || !recordable()) {
1222 _accumulated_capture_offset = 0;
1223 _write_source.reset();
1226 _write_source = boost::dynamic_pointer_cast<SMFSource>(
1227 _session.create_midi_source_for_session (write_source_name ()));
1229 if (!_write_source) {
1230 throw failed_constructor();
1234 catch (failed_constructor &err) {
1235 error << string_compose (_("%1:%2 new capture file not initialized correctly"), _name, n) << endmsg;
1236 _write_source.reset();
1243 * We want to use the name of the existing write source (the one that will be
1244 * used by the next capture) for another purpose. So change the name of the
1245 * current source, and return its current name.
1247 * Return an empty string if the change cannot be accomplished.
1250 MidiDiskstream::steal_write_source_name ()
1252 string our_old_name = _write_source->name();
1254 /* this will bump the name of the current write source to the next one
1255 * (e.g. "MIDI 1-1" gets renamed to "MIDI 1-2"), thus leaving the
1256 * current write source name (e.g. "MIDI 1-1" available). See the
1257 * comments in Session::create_midi_source_by_stealing_name() about why
1262 string new_path = _session.new_midi_source_path (name());
1264 if (_write_source->rename (new_path)) {
1271 return our_old_name;
1275 MidiDiskstream::reset_write_sources (bool mark_write_complete, bool /*force*/)
1277 if (!_session.writable() || !recordable()) {
1281 if (_write_source && mark_write_complete) {
1282 _write_source->mark_streaming_write_completed ();
1284 use_new_write_source (0);
1288 MidiDiskstream::set_block_size (pframes_t /*nframes*/)
1293 MidiDiskstream::allocate_temporary_buffers ()
1298 MidiDiskstream::ensure_input_monitoring (bool yn)
1300 boost::shared_ptr<MidiPort> sp = _source_port.lock ();
1303 sp->ensure_input_monitoring (yn);
1308 MidiDiskstream::set_align_style_from_io ()
1310 if (_alignment_choice != Automatic) {
1314 /* XXX Not sure what, if anything we can do with MIDI
1315 as far as capture alignment etc.
1318 set_align_style (ExistingMaterial);
1323 MidiDiskstream::playback_buffer_load () const
1325 /* For MIDI it's not trivial to differentiate the following two cases:
1327 1. The playback buffer is empty because the system has run out of time to fill it.
1328 2. The playback buffer is empty because there is no more data on the playlist.
1330 If we use a simple buffer load computation, we will report that the MIDI diskstream
1331 cannot keep up when #2 happens, when in fact it can. Since MIDI data rates
1332 are so low compared to audio, just give a pretend answer here.
1339 MidiDiskstream::capture_buffer_load () const
1341 /* We don't report playback buffer load, so don't report capture load either */
1347 MidiDiskstream::use_pending_capture_data (XMLNode& /*node*/)
1353 MidiDiskstream::flush_playback (framepos_t start, framepos_t end)
1355 _playback_buf->flush (start, end);
1356 g_atomic_int_add (&_frames_read_from_ringbuffer, end - start);
1359 /** Writes playback events from playback_sample for nframes to dst, translating time stamps
1360 * so that an event at playback_sample has time = 0
1363 MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes)
1367 Location* loc = loop_location;
1369 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1370 "%1 MDS pre-read read %8 @ %4..%5 from %2 write to %3, LOOPED ? %6-%7\n", _name,
1371 _playback_buf->get_read_ptr(), _playback_buf->get_write_ptr(), playback_sample, playback_sample + nframes,
1372 (loc ? loc->start() : -1), (loc ? loc->end() : -1), nframes));
1374 // cerr << "================\n";
1375 // _playback_buf->dump (cerr);
1376 // cerr << "----------------\n";
1378 size_t events_read = 0;
1381 framepos_t effective_start;
1383 if (playback_sample >= loc->end()) {
1384 effective_start = loc->start() + ((playback_sample - loc->end()) % loc->length());
1386 effective_start = playback_sample;
1389 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("looped, effective start adjusted to %1\n", effective_start));
1391 if (effective_start == loc->start()) {
1392 /* We need to turn off notes that may extend
1393 beyond the loop end.
1396 _playback_buf->loop_resolve (dst, 0);
1399 if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
1400 /* end of loop is within the range we are reading, so
1401 split the read in two, and lie about the location
1404 framecnt_t first, second;
1406 first = loc->end() - effective_start;
1407 second = nframes - first;
1409 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read for eff %1 end %2: %3 and %4\n",
1410 effective_start, loc->end(), first, second));
1413 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
1414 effective_start, first));
1415 events_read = _playback_buf->read (dst, effective_start, first);
1419 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
1420 loc->start(), second));
1421 events_read += _playback_buf->read (dst, loc->start(), second);
1425 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
1426 effective_start, nframes));
1427 events_read = _playback_buf->read (dst, effective_start, effective_start + nframes);
1430 events_read = _playback_buf->read (dst, playback_sample, playback_sample + nframes);
1433 DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
1434 "%1 MDS events read %2 range %3 .. %4 rspace %5 wspace %6 r@%7 w@%8\n",
1435 _name, events_read, playback_sample, playback_sample + nframes,
1436 _playback_buf->read_space(), _playback_buf->write_space(),
1437 _playback_buf->get_read_ptr(), _playback_buf->get_write_ptr()));
1439 g_atomic_int_add (&_frames_read_from_ringbuffer, nframes);
1443 MidiDiskstream::set_name (string const & name)
1445 if (_name == name) {
1448 Diskstream::set_name (name);
1450 /* get a new write source so that its name reflects the new diskstream name */
1451 use_new_write_source (0);
1457 MidiDiskstream::set_write_source_name (const std::string& str) {
1458 if (_write_source_name == str) {
1461 Diskstream::set_write_source_name (str);
1462 if (_write_source_name == name()) {
1465 use_new_write_source (0);
1469 boost::shared_ptr<MidiBuffer>
1470 MidiDiskstream::get_gui_feed_buffer () const
1472 boost::shared_ptr<MidiBuffer> b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI)));
1474 Glib::Threads::Mutex::Lock lm (_gui_feed_buffer_mutex);
1475 b->copy (_gui_feed_buffer);
1480 MidiDiskstream::reset_tracker ()
1482 _playback_buf->reset_tracker ();
1484 boost::shared_ptr<MidiPlaylist> mp (midi_playlist());
1487 mp->clear_note_trackers ();