commit aac67e9f256b82d24a95dc5b006ef22faf3ea4ae
parent a5ae5b4f757ff548263c3bae439e8c9a1282c6db
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date: Wed, 12 Jun 2024 20:43:29 +0200
fix sysex delay being too slow for very small packets
Diffstat:
2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/source/wLib/wMidi.cpp b/source/wLib/wMidi.cpp
@@ -18,11 +18,24 @@ namespace wLib
{
std::unique_lock lock(m_mutex);
- if(m_remainingSysexDelay)
- m_remainingSysexDelay -= std::min(m_remainingSysexDelay, _numSamples);
+ if(m_readingSysex)
+ return;
+
+ auto remainingSamples = _numSamples;
- while(m_remainingSysexDelay == 0 && !m_transmittingSysex && !m_pendingSysexBuffers.empty())
+ while(!m_pendingSysexBuffers.empty())
{
+ if(m_remainingSysexDelay > 0)
+ {
+ const auto sub = std::min(m_remainingSysexDelay, remainingSamples);
+ remainingSamples -= sub;
+
+ m_remainingSysexDelay -= sub;
+ }
+
+ if(m_remainingSysexDelay)
+ break;
+
const auto& msg = m_pendingSysexBuffers.front();
for (const auto b : msg)
@@ -40,10 +53,10 @@ namespace wLib
if(_byte == 0xf0)
{
- m_receivingSysex = true;
+ m_writingSysex = true;
}
- if(m_receivingSysex)
+ if(m_writingSysex)
{
m_pendingSysexMessage.push_back(_byte);
}
@@ -54,7 +67,7 @@ namespace wLib
if (_byte == 0xf7)
{
- m_receivingSysex = false;
+ m_writingSysex = false;
if (!m_pendingSysexMessage.empty())
m_pendingSysexBuffers.push_back(std::move(m_pendingSysexMessage));
@@ -78,9 +91,9 @@ namespace wLib
const uint8_t d = data & 0xff;
if(d == 0xf0)
- m_transmittingSysex = true;
+ m_readingSysex = true;
else if(d == 0xf7)
- m_transmittingSysex = false;
+ m_readingSysex = false;
_result.push_back(d);
}
diff --git a/source/wLib/wMidi.h b/source/wLib/wMidi.h
@@ -35,8 +35,8 @@ namespace wLib
private:
mc68k::Qsm& m_qsm;
- bool m_transmittingSysex = false;
- bool m_receivingSysex = false;
+ bool m_readingSysex = false;
+ bool m_writingSysex = false;
uint32_t m_remainingSysexDelay = 0;
std::deque< std::vector<uint8_t> > m_pendingSysexBuffers;