From fd2aea103790a1f49211f3bec7e9cdc246762e77 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 4 Nov 2011 17:52:12 +0000 Subject: Remove non-RT-safe alloc in the MIDI process() call. git-svn-id: svn://localhost/ardour2/branches/3.0@10441 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/midi_diskstream.cc | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'libs/ardour/midi_diskstream.cc') diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc index 7ab8c46c30..81217b179a 100644 --- a/libs/ardour/midi_diskstream.cc +++ b/libs/ardour/midi_diskstream.cc @@ -77,6 +77,7 @@ MidiDiskstream::MidiDiskstream (Session &sess, const string &name, Diskstream::F , _note_mode(Sustained) , _frames_written_to_ringbuffer(0) , _frames_read_from_ringbuffer(0) + , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI)) { in_set_state = true; @@ -96,6 +97,7 @@ MidiDiskstream::MidiDiskstream (Session& sess, const XMLNode& node) , _note_mode(Sustained) , _frames_written_to_ringbuffer(0) , _frames_read_from_ringbuffer(0) + , _gui_feed_buffer(AudioEngine::instance()->raw_buffer_size (DataType::MIDI)) { in_set_state = true; @@ -549,17 +551,23 @@ MidiDiskstream::process (framepos_t transport_frame, pframes_t nframes, framecnt } if (buf.size() != 0) { - /* XXX this needs fixing - realtime new() call for - every time we get MIDI data in a process callback! - */ - - /* Make a copy of this data and emit it for the GUI to see */ - boost::shared_ptr copy (new MidiBuffer (buf.capacity ())); - for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) { - copy->push_back ((*i).time() + transport_frame, (*i).size(), (*i).buffer()); + Glib::Mutex::Lock lm (_gui_feed_buffer_mutex, Glib::TRY_LOCK); + + if (lm.locked ()) { + /* Copy this data into our GUI feed buffer and tell the GUI + that it can read it if it likes. + */ + _gui_feed_buffer.clear (); + + for (MidiBuffer::iterator i = buf.begin(); i != buf.end(); ++i) { + /* This may fail if buf is larger than _gui_feed_buffer, but it's not really + the end of the world if it does. + */ + _gui_feed_buffer.push_back ((*i).time() + transport_frame, (*i).size(), (*i).buffer()); + } } - DataRecorded (copy, _write_source); /* EMIT SIGNAL */ + DataRecorded (_write_source); /* EMIT SIGNAL */ } } else { @@ -1450,3 +1458,12 @@ MidiDiskstream::set_name (string const & name) return true; } +boost::shared_ptr +MidiDiskstream::get_gui_feed_buffer () const +{ + boost::shared_ptr b (new MidiBuffer (AudioEngine::instance()->raw_buffer_size (DataType::MIDI))); + + Glib::Mutex::Lock lm (_gui_feed_buffer_mutex); + b->copy (_gui_feed_buffer); + return b; +} -- cgit v1.2.3