summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-01-07 18:11:36 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-01-07 18:11:45 -0500
commit9d3cbe44a3789d43de0a82a0ef35d03e30efa7d2 (patch)
treebf1d83476ce8621a98f7560cb02d89e4d8610e70
parentc615e26f3c7155105b8520879111ff7c214f9772 (diff)
coreaudio: correctly clear MIDI port buffers
-rw-r--r--libs/backends/coreaudio/coreaudio_backend.cc28
-rw-r--r--libs/backends/coreaudio/coreaudio_backend.h3
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;