diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2016-01-07 18:11:36 -0500 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2016-01-07 18:11:45 -0500 |
commit | 9d3cbe44a3789d43de0a82a0ef35d03e30efa7d2 (patch) | |
tree | bf1d83476ce8621a98f7560cb02d89e4d8610e70 | |
parent | c615e26f3c7155105b8520879111ff7c214f9772 (diff) |
coreaudio: correctly clear MIDI port buffers
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.cc | 28 | ||||
-rw-r--r-- | libs/backends/coreaudio/coreaudio_backend.h | 3 |
2 files changed, 16 insertions, 15 deletions
diff --git a/libs/backends/coreaudio/coreaudio_backend.cc b/libs/backends/coreaudio/coreaudio_backend.cc index 4e2349cd7f..ee03173cab 100644 --- a/libs/backends/coreaudio/coreaudio_backend.cc +++ b/libs/backends/coreaudio/coreaudio_backend.cc @@ -1707,7 +1707,9 @@ CoreAudioBackend::process_callback (const uint32_t n_samples, const uint64_t hos uint64_t time_ns; uint8_t data[128]; // matches CoreMidi's MIDIPacket size_t size = sizeof(data); - + + port->clear_events (); + while (_midiio->recv_event (i, nominal_time, time_ns, data, size)) { pframes_t time = floor((float) time_ns * _samplerate * 1e-9); assert (time < n_samples); @@ -2079,6 +2081,9 @@ void* CoreMidiPort::get_buffer (pframes_t /* nframes */) i != get_connections ().end (); ++i) { const CoreMidiBuffer * src = static_cast<const CoreMidiPort*>(*i)->const_buffer (); + if (!src->empty()) { + fprintf (stderr, "Copying %d events from %s\n", src->size(), (*i)->name().c_str()); + } for (CoreMidiBuffer::const_iterator it = src->begin (); it != src->end (); ++it) { (_buffer[_bufperiod]).push_back (boost::shared_ptr<CoreMidiEvent>(new CoreMidiEvent (**it))); } @@ -2097,22 +2102,17 @@ CoreMidiPort::queue_event ( pframes_t timestamp, const uint8_t* buffer, size_t size) { - if (!buffer || !port_buffer) return -1; - _event._pending = false; - CoreMidiBuffer& dst = * static_cast<CoreMidiBuffer*>(port_buffer); - if (dst.size () && (pframes_t)dst.back ()->timestamp () > timestamp) { -#ifndef NDEBUG - // nevermind, ::get_buffer() sorts events - fprintf (stderr, "CoreMidiBuffer: unordered event: %d > %d\n", - (pframes_t)dst.back ()->timestamp (), timestamp); -#endif - } - fprintf (stderr, "coremidi: queue event/buffer size %d @ %d\n", size, timestamp); - dst.push_back (boost::shared_ptr<CoreMidiEvent>(new CoreMidiEvent (timestamp, buffer, size))); - return 0; + return CoreAudioBackend::_midi_event_put (port_buffer, timestamp, buffer, size); } void +CoreMidiPort::clear_events () +{ + CoreMidiBuffer* mbuf = static_cast<CoreMidiBuffer*>(get_buffer(0)); + mbuf->clear(); +} + +void CoreMidiPort::parse_events (const uint64_t time, const uint8_t *data, const size_t size) { CoreMidiBuffer* mbuf = static_cast<CoreMidiBuffer*>(get_buffer(0)); diff --git a/libs/backends/coreaudio/coreaudio_backend.h b/libs/backends/coreaudio/coreaudio_backend.h index 8bec7d939a..cd3a49b7ca 100644 --- a/libs/backends/coreaudio/coreaudio_backend.h +++ b/libs/backends/coreaudio/coreaudio_backend.h @@ -150,6 +150,7 @@ class CoreMidiPort : public CoreBackendPort { void set_n_periods(int n) { if (n > 0 && n < 3) { _n_periods = n; } } void parse_events (const uint64_t time, const uint8_t *data, const size_t size); + void clear_events (); private: CoreMidiBuffer _buffer[2]; @@ -158,7 +159,7 @@ class CoreMidiPort : public CoreBackendPort { int queue_event (void* port_buffer, pframes_t timestamp, const uint8_t* buffer, size_t size); bool process_byte (const uint64_t, const uint8_t); - + void record_byte(uint8_t byte) { if (_total_bytes < sizeof(_parser_buffer)) { _parser_buffer[_total_bytes] = byte; |