From d28d1ab61872b3a653b07dd6dc02b3ec47d2511b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 29 Nov 2015 01:22:04 +0100 Subject: removed while loop in poll slot --- src/controllers/controllermanager.cpp | 18 ++++++++++-------- src/controllers/midi/portmidicontroller.cpp | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index 051c273726..d49865720d 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -37,6 +37,12 @@ const int kPollIntervalMillis = 5; const int kPollIntervalMillis = 1; #endif +// Note: A standard Midi device runs at 31.25 kbps, +// a usual Midi message has 30 bits so we may not expect more than +// 1000 messages per second +// PortMidiController uses a buffer of 64 messages which results in +// Maximum polling interval of 64 ms a theoritical minimum of 1 ms + QString firstAvailableFilename(QSet& filenames, const QString originalFilename) { QString filename = originalFilename; @@ -280,16 +286,12 @@ void ControllerManager::stopPolling() { void ControllerManager::pollDevices() { Trace tracer("ControllerManager::pollDevices"); - bool eventsProcessed(false); // Continue to poll while any device returned data. - do { - eventsProcessed = false; - foreach (Controller* pDevice, m_controllers) { - if (pDevice->isOpen() && pDevice->isPolling()) { - eventsProcessed = pDevice->poll() || eventsProcessed; - } + foreach (Controller* pDevice, m_controllers) { + if (pDevice->isOpen() && pDevice->isPolling()) { + pDevice->poll(); } - } while (eventsProcessed); + } } void ControllerManager::openController(Controller* pController) { diff --git a/src/controllers/midi/portmidicontroller.cpp b/src/controllers/midi/portmidicontroller.cpp index 77b3138a90..47a8a2347f 100644 --- a/src/controllers/midi/portmidicontroller.cpp +++ b/src/controllers/midi/portmidicontroller.cpp @@ -207,7 +207,7 @@ bool PortMidiController::poll() { receive(data, 0, 0); } else { m_cReceiveMsg[m_cReceiveMsg_index++] = data = - (m_midiBuffer[i].message >> shift) & 0xFF; + (m_midiBuffer[i].message >> shift) & 0xFF; } } -- cgit v1.2.3 From 3b1e66d31a7e0f85eca30b00537a10617486e456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 29 Nov 2015 11:54:15 +0100 Subject: remove outdated comment --- src/controllers/controllermanager.cpp | 1 - 1 file changed, 1 deletion(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index d49865720d..b59e493385 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -286,7 +286,6 @@ void ControllerManager::stopPolling() { void ControllerManager::pollDevices() { Trace tracer("ControllerManager::pollDevices"); - // Continue to poll while any device returned data. foreach (Controller* pDevice, m_controllers) { if (pDevice->isOpen() && pDevice->isPolling()) { pDevice->poll(); -- cgit v1.2.3 From da9e18364a7b6e98075506b00cedffd54d3ecc6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Mon, 30 Nov 2015 20:07:44 +0100 Subject: Midi: Added a more debug messaged (experimental) --- src/controllers/controllermanager.cpp | 3 +++ src/controllers/midi/midicontroller.cpp | 23 ++++++++++++++--------- src/controllers/midi/midicontroller.h | 6 +++--- src/controllers/midi/portmidicontroller.cpp | 6 +++--- src/test/midicontrollertest.cpp | 2 +- 5 files changed, 24 insertions(+), 16 deletions(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index b59e493385..f6003ce35f 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -12,6 +12,7 @@ #include "controllers/defs_controllers.h" #include "controllers/controllerlearningeventfilter.h" #include "util/cmdlineargs.h" +#include "util/timer.h" #include "controllers/midi/portmidienumerator.h" #ifdef __HSS1394__ @@ -285,6 +286,8 @@ void ControllerManager::stopPolling() { } void ControllerManager::pollDevices() { + qDebug() << "ControllerManager::pollDevices()"; + ScopedTimer t("ControllerManager::pollDevices"); Trace tracer("ControllerManager::pollDevices"); foreach (Controller* pDevice, m_controllers) { if (pDevice->isOpen() && pDevice->isPolling()) { diff --git a/src/controllers/midi/midicontroller.cpp b/src/controllers/midi/midicontroller.cpp index d11872575d..7797ea5b38 100644 --- a/src/controllers/midi/midicontroller.cpp +++ b/src/controllers/midi/midicontroller.cpp @@ -161,40 +161,44 @@ void MidiController::destroyOutputHandlers() { } QString formatMidiMessage(unsigned char status, unsigned char control, unsigned char value, - unsigned char channel, unsigned char opCode) { + unsigned char channel, unsigned char opCode, int32_t timestamp) { + + QString prefix = QString("MIDI t:%2 ms ").arg(QString::number(timestamp)); + //QString prefix = QString("MIDI "); + switch (opCode) { case MIDI_PITCH_BEND: - return QString("MIDI status 0x%1: pitch bend ch %2, value 0x%3") + return prefix + QString("status 0x%1: pitch bend ch %2, value 0x%3") .arg(QString::number(status, 16).toUpper(), QString::number(channel+1, 10), QString::number((value << 7) | control, 16).toUpper().rightJustified(4,'0')); case MIDI_SONG_POS: - return QString("MIDI status 0x%1: song position 0x%2") + return prefix + QString("status 0x%1: song position 0x%2") .arg(QString::number(status, 16).toUpper(), QString::number((value << 7) | control, 16).toUpper().rightJustified(4,'0')); case MIDI_PROGRAM_CH: case MIDI_CH_AFTERTOUCH: - return QString("MIDI status 0x%1 (ch %2, opcode 0x%3), value 0x%4") + return prefix + QString("status 0x%1 (ch %2, opcode 0x%3), value 0x%4") .arg(QString::number(status, 16).toUpper(), QString::number(channel+1, 10), QString::number((status & 255)>>4, 16).toUpper(), QString::number(control, 16).toUpper().rightJustified(2,'0')); case MIDI_SONG: - return QString("MIDI status 0x%1: select song #%2") + return prefix + QString("status 0x%1: select song #%2") .arg(QString::number(status, 16).toUpper(), QString::number(control+1, 10)); case MIDI_NOTE_OFF: case MIDI_NOTE_ON: case MIDI_AFTERTOUCH: case MIDI_CC: - return QString("MIDI status 0x%1 (ch %2, opcode 0x%3), ctrl 0x%4, val 0x%5") + return prefix + QString("status 0x%1 (ch %2, opcode 0x%3), ctrl 0x%4, val 0x%5") .arg(QString::number(status, 16).toUpper(), QString::number(channel+1, 10), QString::number((status & 255)>>4, 16).toUpper(), QString::number(control, 16).toUpper().rightJustified(2,'0'), QString::number(value, 16).toUpper().rightJustified(2,'0')); default: - return QString("MIDI status 0x%1") + return prefix + QString("status 0x%1") .arg(QString::number(status, 16).toUpper()); } } @@ -237,12 +241,13 @@ void MidiController::commitTemporaryInputMappings() { } void MidiController::receive(unsigned char status, unsigned char control, - unsigned char value) { + unsigned char value, int32_t timestamp) { unsigned char channel = MidiUtils::channelFromStatus(status); unsigned char opCode = MidiUtils::opCodeFromStatus(status); if (debugging()) { - qDebug() << formatMidiMessage(status, control, value, channel, opCode); + qDebug() << formatMidiMessage( + status, control, value, channel, opCode, timestamp); } MidiKey mappingKey(status, control); diff --git a/src/controllers/midi/midicontroller.h b/src/controllers/midi/midicontroller.h index dd7bd68d89..8e26503a28 100644 --- a/src/controllers/midi/midicontroller.h +++ b/src/controllers/midi/midicontroller.h @@ -62,9 +62,9 @@ class MidiController : public Controller { send(data, length); } - protected slots: - void receive(unsigned char status, unsigned char control = 0, - unsigned char value = 0); + void receive(unsigned char status, unsigned char control, + unsigned char value, int32_t timestamp); + // For receiving System Exclusive messages void receive(const QByteArray data); virtual int close(); diff --git a/src/controllers/midi/portmidicontroller.cpp b/src/controllers/midi/portmidicontroller.cpp index 47a8a2347f..1a5b79e074 100644 --- a/src/controllers/midi/portmidicontroller.cpp +++ b/src/controllers/midi/portmidicontroller.cpp @@ -171,7 +171,7 @@ bool PortMidiController::poll() { if ((status & 0xF8) == 0xF8) { // Handle real-time MIDI messages at any time - receive(status, 0, 0); + receive(status, 0, 0, m_midiBuffer[i].timestamp); continue; } @@ -185,7 +185,7 @@ bool PortMidiController::poll() { //unsigned char channel = status & 0x0F; unsigned char note = Pm_MessageData1(m_midiBuffer[i].message); unsigned char velocity = Pm_MessageData2(m_midiBuffer[i].message); - receive(status, note, velocity); + receive(status, note, velocity, m_midiBuffer[i].timestamp); } } @@ -204,7 +204,7 @@ bool PortMidiController::poll() { for (int shift = 0; shift < 32 && (data != MIDI_EOX); shift += 8) { if ((data & 0xF8) == 0xF8) { // Handle real-time messages at any time - receive(data, 0, 0); + receive(data, 0, 0, m_midiBuffer[i].timestamp); } else { m_cReceiveMsg[m_cReceiveMsg_index++] = data = (m_midiBuffer[i].message >> shift) & 0xFF; diff --git a/src/test/midicontrollertest.cpp b/src/test/midicontrollertest.cpp index af5e605a91..aa8bfebe30 100644 --- a/src/test/midicontrollertest.cpp +++ b/src/test/midicontrollertest.cpp @@ -40,7 +40,7 @@ class MidiControllerTest : public MixxxTest { void receive(unsigned char status, unsigned char control, unsigned char value) { - m_pController->receive(status, control, value); + m_pController->receive(status, control, value, 0); } MidiControllerPreset m_preset; -- cgit v1.2.3 From 28b4a33a7a75964580db392fbe7465862acf7390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Thu, 17 Dec 2015 22:17:01 +0100 Subject: Improve expermental debug output --- src/controllers/controllermanager.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index f6003ce35f..cb809dba1d 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -13,6 +13,7 @@ #include "controllers/controllerlearningeventfilter.h" #include "util/cmdlineargs.h" #include "util/timer.h" +#include "util/time.h" #include "controllers/midi/portmidienumerator.h" #ifdef __HSS1394__ @@ -286,14 +287,14 @@ void ControllerManager::stopPolling() { } void ControllerManager::pollDevices() { - qDebug() << "ControllerManager::pollDevices()"; - ScopedTimer t("ControllerManager::pollDevices"); - Trace tracer("ControllerManager::pollDevices"); + uint start = Time::elapsedMsecs(); foreach (Controller* pDevice, m_controllers) { if (pDevice->isOpen() && pDevice->isPolling()) { pDevice->poll(); } } + uint end = Time::elapsedMsecs(); + qDebug() << "ControllerManager::pollDevices()" << end - start << end; } void ControllerManager::openController(Controller* pController) { -- cgit v1.2.3 From a28243471ae48fcba4e04115b4c23d30b071a542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 18 Dec 2015 00:06:33 +0100 Subject: Add more debug --- src/controllers/midi/portmidicontroller.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src') diff --git a/src/controllers/midi/portmidicontroller.cpp b/src/controllers/midi/portmidicontroller.cpp index 1a5b79e074..3880cc1a8e 100644 --- a/src/controllers/midi/portmidicontroller.cpp +++ b/src/controllers/midi/portmidicontroller.cpp @@ -161,6 +161,8 @@ bool PortMidiController::poll() { int numEvents = Pm_Read(m_pInputStream, m_midiBuffer, MIXXX_PORTMIDI_BUFFER_LEN); + qDebug() << "PortMidiController::poll()" << numEvents; + if (numEvents < 0) { qWarning() << "PortMidi error:" << Pm_GetErrorText((PmError)numEvents); return false; -- cgit v1.2.3 From 953a3eca1e160943f3e50a35a770342050fc153b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Fri, 18 Dec 2015 00:13:09 +0100 Subject: more debug --- src/controllers/midi/portmidicontroller.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/controllers/midi/portmidicontroller.cpp b/src/controllers/midi/portmidicontroller.cpp index 3880cc1a8e..3e1ae3c47e 100644 --- a/src/controllers/midi/portmidicontroller.cpp +++ b/src/controllers/midi/portmidicontroller.cpp @@ -147,11 +147,14 @@ int PortMidiController::close() { bool PortMidiController::poll() { // Poll the controller for new data if it's an input device - if (!m_pInputStream) + if (!m_pInputStream) { + qDebug() << "PortMidiController::poll() no Input Stream"; return false; + } PmError gotEvents = Pm_Poll(m_pInputStream); if (gotEvents == FALSE) { + qDebug() << "PortMidiController::poll() no events"; return false; } if (gotEvents < 0) { -- cgit v1.2.3 From 86f41e207561e9b4f1dcc76ef3a3c94e57f237e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 19 Dec 2015 13:26:44 +0100 Subject: Add skip cycle in overload situations, Add a lot of comments explaining the expected load. --- src/controllers/controllermanager.cpp | 65 ++++++++++++++++++++++++++++++----- src/controllers/controllermanager.h | 1 + 2 files changed, 57 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index cb809dba1d..df04f6a62a 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -15,6 +15,8 @@ #include "util/timer.h" #include "util/time.h" +#include + #include "controllers/midi/portmidienumerator.h" #ifdef __HSS1394__ #include "controllers/midi/hss1394enumerator.h" @@ -28,6 +30,7 @@ #include "controllers/bulk/bulkenumerator.h" #endif +namespace { // http://developer.qt.nokia.com/wiki/Threads_Events_QObjects // Poll every 1ms (where possible) for good controller response @@ -39,11 +42,23 @@ const int kPollIntervalMillis = 5; const int kPollIntervalMillis = 1; #endif -// Note: A standard Midi device runs at 31.25 kbps, -// a usual Midi message has 30 bits so we may not expect more than -// 1000 messages per second -// PortMidiController uses a buffer of 64 messages which results in -// Maximum polling interval of 64 ms a theoritical minimum of 1 ms +// Note: +// A standard Midi device runs at 31.25 kbps, with 10 bits / byte +// 1 byte / 320 microseconds +// a usual Midi message has 3 byte so we may not expect more than +// 1042.6 messages per second +// +// The MIDI over IEEE-1394: +// http://www.midi.org/techspecs/rp27v10spec%281394%29.pdf +// which is also used for USB defines 3 speeds: +// 1 byte / 320 microseconds +// 2 bytes / 320 microseconds +// 3 bytes / 320 microseconds +// which results in up to 3125 messages per second +// +// For instants the SCS.1d, uses the 3 x speed + +} // anonymous namespace QString firstAvailableFilename(QSet& filenames, const QString originalFilename) { @@ -68,7 +83,8 @@ ControllerManager::ControllerManager(ConfigObject* pConfig) // ControllerManager because the CM is moved to its own thread and runs // its own event loop. m_pControllerLearningEventFilter(new ControllerLearningEventFilter()), - m_pollTimer(this) { + m_pollTimer(this), + m_skipPoll(false) { qRegisterMetaType("ControllerPresetPointer"); // Create controller mapping paths in the user's home directory. @@ -287,14 +303,45 @@ void ControllerManager::stopPolling() { } void ControllerManager::pollDevices() { - uint start = Time::elapsedMsecs(); + // Note: this function is called from a high priority thread which + // may stall the GUI or may reduce the available CPU time for other + // High Priority threads like caching reader or broadcasting more + // then desired, if it is called endless loop like. + // + // This especially happens if a controller like the 3x Speed + // Stanton SCS.1D emits more massages than Mixxx is able to handle + // or a controller like Hercules RMX2 goes wild. In such a case the + // receive buffer is stacked up every call to insane values > 500 messages. + // + // To avoid this we pick here a strategies similar like the audio + // thread. In case pollDevice() takes longer than a call cycle + // we are cooperative a skip the next cycle to free at least some + // CPU time + // + // Some random test data form a i5-3317U CPU @ 1.70GHz Running + // Ubuntu Trusty: + // * Idle poll: ~5 µs. + // * 5 messages burst (full midi bandwidth): ~872 µs. + + if (m_skipPoll) { + // skip poll in overload situation + m_skipPoll = false; + //qDebug() << "ControllerManager::pollDevices() skip"; + return; + } + + qint64 start = Time::elapsed(); foreach (Controller* pDevice, m_controllers) { if (pDevice->isOpen() && pDevice->isPolling()) { pDevice->poll(); } } - uint end = Time::elapsedMsecs(); - qDebug() << "ControllerManager::pollDevices()" << end - start << end; + + quint64 duration = Time::elapsed() - start; + if (duration > kPollIntervalMillis * 1000000) { + m_skipPoll = true; + } + //qDebug() << "ControllerManager::pollDevices()" << duration << start; } void ControllerManager::openController(Controller* pController) { diff --git a/src/controllers/controllermanager.h b/src/controllers/controllermanager.h index 79cb8c8fec..b4503965af 100644 --- a/src/controllers/controllermanager.h +++ b/src/controllers/controllermanager.h @@ -90,6 +90,7 @@ class ControllerManager : public QObject { QList m_controllers; QThread* m_pThread; PresetInfoEnumerator* m_pMainThreadPresetEnumerator; + bool m_skipPoll; }; #endif // CONTROLLERMANAGER_H -- cgit v1.2.3 From a5806ad61caafbb68771a618584695c6d565c327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 19 Dec 2015 14:51:44 +0100 Subject: Improve comments for MIXXX_PORTMIDI_BUFFER_LEN --- src/controllers/midi/portmidicontroller.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/controllers/midi/portmidicontroller.h b/src/controllers/midi/portmidicontroller.h index 628f08e112..37fd02b2e4 100644 --- a/src/controllers/midi/portmidicontroller.h +++ b/src/controllers/midi/portmidicontroller.h @@ -20,12 +20,19 @@ #include #include "controllers/midi/midicontroller.h" -// Mixxx completely stops responding to the controller if more than this number of messages queue up. -// Don't lower this (much.) The SCS.1d accumulated 500 messages in a single poll during stress-testing. -#define MIXXX_PORTMIDI_BUFFER_LEN 1024 /**Number of MIDI messages to buffer*/ -#define MIXXX_PORTMIDI_NO_DEVICE_STRING "None" /**String to display for no MIDI devices present */ +// Mixxx completely stops responding to the controller if more than this number +// of messages queue up. Don't lower this (much.) The SCS.1d a 3x Speed device +// accumulated 500 messages in a single poll during stress-testing. +// A midi message contains 1 .. 4 bytes. +// The maximum Midi Speed (3x Speed) is around 3125 messages per second +// if we assume normal 3 Byte messages. +// a 1024 messages buffer will buffer ~327 ms Midi-Stream +#define MIXXX_PORTMIDI_BUFFER_LEN 1024 -/** A PortMidi-based implementation of MidiController */ +// String to display for no MIDI devices present +#define MIXXX_PORTMIDI_NO_DEVICE_STRING "None" + +// A PortMidi-based implementation of MidiController class PortMidiController : public MidiController { Q_OBJECT public: -- cgit v1.2.3 From 23a0b3e3f788b4e68ed543f48ddce55e500562c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sat, 19 Dec 2015 15:45:10 +0100 Subject: silence debug --- src/controllers/midi/portmidicontroller.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/controllers/midi/portmidicontroller.cpp b/src/controllers/midi/portmidicontroller.cpp index 522120780f..2369d0c167 100644 --- a/src/controllers/midi/portmidicontroller.cpp +++ b/src/controllers/midi/portmidicontroller.cpp @@ -151,7 +151,7 @@ bool PortMidiController::poll() { PmError gotEvents = Pm_Poll(m_pInputStream); if (gotEvents == FALSE) { - qDebug() << "PortMidiController::poll() no events"; + //qDebug() << "PortMidiController::poll() no events"; return false; } if (gotEvents < 0) { @@ -161,7 +161,7 @@ bool PortMidiController::poll() { int numEvents = Pm_Read(m_pInputStream, m_midiBuffer, MIXXX_PORTMIDI_BUFFER_LEN); - qDebug() << "PortMidiController::poll()" << numEvents; + //qDebug() << "PortMidiController::poll()" << numEvents; if (numEvents < 0) { qWarning() << "PortMidi error:" << Pm_GetErrorText((PmError)numEvents); -- cgit v1.2.3 From 03852d92ae82a8ae8e6e6fbc2d895601ae71ec78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Sun, 20 Dec 2015 18:44:27 +0100 Subject: fixed type --- src/controllers/controllermanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index df04f6a62a..3a8549e870 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -337,7 +337,7 @@ void ControllerManager::pollDevices() { } } - quint64 duration = Time::elapsed() - start; + qint64 duration = Time::elapsed() - start; if (duration > kPollIntervalMillis * 1000000) { m_skipPoll = true; } -- cgit v1.2.3 From afc8e1d9cd632f91887e016227527d76d48f722f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 23 Dec 2015 19:47:16 +0100 Subject: Removed unused includes --- src/controllers/controllermanager.cpp | 3 --- 1 file changed, 3 deletions(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index 3a8549e870..942cd6b4bf 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -12,11 +12,8 @@ #include "controllers/defs_controllers.h" #include "controllers/controllerlearningeventfilter.h" #include "util/cmdlineargs.h" -#include "util/timer.h" #include "util/time.h" -#include - #include "controllers/midi/portmidienumerator.h" #ifdef __HSS1394__ #include "controllers/midi/hss1394enumerator.h" -- cgit v1.2.3 From a543a4be560f511859d5ec0e2af43b1980e072dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Sch=C3=BCrmann?= Date: Wed, 23 Dec 2015 19:52:29 +0100 Subject: move midi related comments to portmidicontrol.h --- src/controllers/controllermanager.cpp | 16 ---------------- src/controllers/midi/portmidicontroller.h | 24 ++++++++++++++++++++---- 2 files changed, 20 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/controllers/controllermanager.cpp b/src/controllers/controllermanager.cpp index 942cd6b4bf..2362f29a2e 100644 --- a/src/controllers/controllermanager.cpp +++ b/src/controllers/controllermanager.cpp @@ -39,22 +39,6 @@ const int kPollIntervalMillis = 5; const int kPollIntervalMillis = 1; #endif -// Note: -// A standard Midi device runs at 31.25 kbps, with 10 bits / byte -// 1 byte / 320 microseconds -// a usual Midi message has 3 byte so we may not expect more than -// 1042.6 messages per second -// -// The MIDI over IEEE-1394: -// http://www.midi.org/techspecs/rp27v10spec%281394%29.pdf -// which is also used for USB defines 3 speeds: -// 1 byte / 320 microseconds -// 2 bytes / 320 microseconds -// 3 bytes / 320 microseconds -// which results in up to 3125 messages per second -// -// For instants the SCS.1d, uses the 3 x speed - } // anonymous namespace QString firstAvailableFilename(QSet& filenames, diff --git a/src/controllers/midi/portmidicontroller.h b/src/controllers/midi/portmidicontroller.h index c3fa462678..213b1b3e5d 100644 --- a/src/controllers/midi/portmidicontroller.h +++ b/src/controllers/midi/portmidicontroller.h @@ -20,12 +20,28 @@ #include #include "controllers/midi/midicontroller.h" -// Mixxx completely stops responding to the controller if more than this number -// of messages queue up. Don't lower this (much.) The SCS.1d a 3x Speed device +// Note: +// A standard Midi device runs at 31.25 kbps, with 10 bits / byte +// 1 byte / 320 microseconds +// a usual Midi message has 3 byte which results to +// 1042.6 messages per second +// +// The MIDI over IEEE-1394: +// http://www.midi.org/techspecs/rp27v10spec%281394%29.pdf +// which is also used for USB defines 3 speeds: +// 1 byte / 320 microseconds +// 2 bytes / 320 microseconds +// 3 bytes / 320 microseconds +// which results in up to 3125 messages per second +// if we assume normal 3 Byte messages. +// +// For instants the SCS.1d, uses the 3 x speed +// +// Due to a bug Mixxx completely stops responding to the controller +// if more than this number of messages queue up. Don't lower this (much.) +// The SCS.1d a 3x Speed device // accumulated 500 messages in a single poll during stress-testing. // A midi message contains 1 .. 4 bytes. -// The maximum Midi Speed (3x Speed) is around 3125 messages per second -// if we assume normal 3 Byte messages. // a 1024 messages buffer will buffer ~327 ms Midi-Stream #define MIXXX_PORTMIDI_BUFFER_LEN 1024 -- cgit v1.2.3