diff data/midi/MIDIInput.cpp @ 562:ecce042cc374

* Wire up MIDI input port (as far as printing a message when an event comes in, anyway)
author Chris Cannam
date Mon, 23 Feb 2009 17:50:17 +0000
parents
children 3086876472dc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/data/midi/MIDIInput.cpp	Mon Feb 23 17:50:17 2009 +0000
@@ -0,0 +1,86 @@
+/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
+
+/*
+    Sonic Visualiser
+    An audio file viewer and annotation editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2006-2009 Chris Cannam and QMUL.
+    
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version.  See the file
+    COPYING included with this distribution for more information.
+*/
+
+#include "MIDIInput.h"
+
+#include "rtmidi/RtMidi.h"
+
+MIDIInput::MIDIInput(QString name) :
+    m_rtmidi(),
+    m_buffer(1023)
+{
+    try {
+        m_rtmidi = new RtMidiIn(name.toStdString());
+        m_rtmidi->setCallback(staticCallback, this);
+        m_rtmidi->openPort();
+    } catch (RtError e) {
+        e.printMessage();
+        delete m_rtmidi;
+        m_rtmidi = 0;
+    }
+}
+
+MIDIInput::~MIDIInput()
+{
+    delete m_rtmidi;
+}
+
+void
+MIDIInput::staticCallback(double timestamp, std::vector<unsigned char> *message,
+                          void *userData)
+{
+    ((MIDIInput *)userData)->callback(timestamp, message);
+}
+
+void
+MIDIInput::callback(double timestamp, std::vector<unsigned char> *message)
+{
+    std::cerr << "MIDIInput::callback(" << timestamp << ")" << std::endl;
+
+}
+
+MIDIEvent
+MIDIInput::readEvent()
+{
+    MIDIEvent *event = m_buffer.readOne();
+    MIDIEvent revent = *event;
+    delete event;
+    return revent;
+}
+
+void
+MIDIInput::postEvent(MIDIEvent e)
+{
+    int count = 0, max = 5;
+    while (m_buffer.getWriteSpace() == 0) {
+        if (count == max) {
+            std::cerr << "ERROR: MIDIInput::postEvent: MIDI event queue is full and not clearing -- abandoning incoming event" << std::endl;
+            return;
+        }
+        std::cerr << "WARNING: MIDIInput::postEvent: MIDI event queue (capacity " << m_buffer.getSize() << " is full!" << std::endl;
+        std::cerr << "Waiting for something to be processed" << std::endl;
+#ifdef _WIN32
+        Sleep(1);
+#else
+        sleep(1);
+#endif
+        count++;
+    }
+
+    MIDIEvent *me = new MIDIEvent(e);
+    m_buffer.write(&me, 1);
+    emit eventsAvailable();
+}
+