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:
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;
};
}