gearmulator

Emulation of classic VA synths of the late 90s/2000s that are based on Motorola 56300 family DSPs
Log | Files | Refs | Submodules | README | LICENSE

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:
Msource/wLib/wMidi.cpp | 29+++++++++++++++++++++--------
Msource/wLib/wMidi.h | 4++--
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;