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 c999b03dd719ab158c29d1e218f73cda1d80a892
parent a0192404db3a05d8b46ebddede4b346e07f941dd
Author: dsp56300 <dsp56300@users.noreply.github.com>
Date:   Thu, 15 Jul 2021 17:41:10 +0200

generic presets write queue

Diffstat:
Msource/virusLib/microcontroller.cpp | 22+++++++++++-----------
Msource/virusLib/microcontroller.h | 14++++++++++++--
2 files changed, 23 insertions(+), 13 deletions(-)

diff --git a/source/virusLib/microcontroller.cpp b/source/virusLib/microcontroller.cpp @@ -98,8 +98,11 @@ void Microcontroller::writeHostBitsWithWait(const char flag1, const char flag2) bool Microcontroller::sendPreset(uint8_t program, const std::vector<TWord>& preset, bool cancelIfFull, bool isMulti) { - if(cancelIfFull && needsToWaitForHostBits(0,1)) - return false; + if(m_hdi08.hasDataToSend() || needsToWaitForHostBits(0,1)) + { + m_pendingPresetWrites.emplace_back(SPendingPresetWrite{program, isMulti, preset}); + return true; + } writeHostBitsWithWait(0,1); // Send header @@ -107,7 +110,6 @@ bool Microcontroller::sendPreset(uint8_t program, const std::vector<TWord>& pres buf[1] = buf[1] | (program << 8); m_hdi08.writeRX(buf, 2); - // Send to DSP m_hdi08.writeRX(preset); return true; @@ -618,7 +620,7 @@ bool Microcontroller::multiProgramChange(uint8_t _value) return loadMulti(_value, multi); } -bool Microcontroller::loadMulti(uint8_t _program, const TPreset& _multi, bool _loadMultiSingles) +bool Microcontroller::loadMulti(uint8_t _program, const TPreset& _multi) { if(!writeMulti(0, _program, _multi, true)) return false; @@ -626,8 +628,6 @@ bool Microcontroller::loadMulti(uint8_t _program, const TPreset& _multi, bool _l for(uint8_t p=0; p<16; ++p) loadMultiSingle(p, _multi); - m_pendingSingleWrites = 0; - return true; } @@ -647,12 +647,12 @@ bool Microcontroller::loadMultiSingle(uint8_t _part, const TPreset& _multi) void Microcontroller::process(size_t _size) { - if(m_pendingSingleWrites < 16 && !m_hdi08.hasDataToSend()) + if(!m_pendingPresetWrites.empty() && !m_hdi08.hasDataToSend()) { - if(writeSingle(0, m_pendingSingleWrites, m_singleEditBuffers[m_pendingSingleWrites], true)) - { - ++m_pendingSingleWrites; - } + const auto preset = m_pendingPresetWrites.front(); + m_pendingPresetWrites.pop_front(); + + sendPreset(preset.program, preset.data, false, preset.isMulti); } } diff --git a/source/virusLib/microcontroller.h b/source/virusLib/microcontroller.h @@ -7,6 +7,8 @@ #include "../synthLib/deviceTypes.h" +#include <list> + namespace synthLib { struct SMidiEvent; @@ -206,7 +208,7 @@ private: bool partBankSelect(uint8_t _part, uint8_t _value, bool _immediatelySelectSingle); bool partProgramChange(uint8_t _part, uint8_t _value, bool pendingSingleWrite = false); bool multiProgramChange(uint8_t _value); - bool loadMulti(uint8_t _program, const TPreset& _multi, bool _loadMultiSingles = true); + bool loadMulti(uint8_t _program, const TPreset& _multi); bool loadMultiSingle(uint8_t _part); bool loadMultiSingle(uint8_t _part, const TPreset& _multi); @@ -233,7 +235,15 @@ private: uint8_t m_currentSingle = 0; // Device does not like if we send everything at once, therefore we delay the send of Singles after sending a Multi - int m_pendingSingleWrites = 16; + struct SPendingPresetWrite + { + uint8_t program = 0; + bool isMulti = false; + std::vector<dsp56k::TWord> data; + }; + + std::list<SPendingPresetWrite> m_pendingPresetWrites; + uint32_t m_presetWriteCount = 0; }; }