Mercurial > hg > svcore
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(); +} +