Switch to message buffer / dispatcher for MIDI messages

This commit is contained in:
WarmUpTill
2024-02-21 20:29:37 +01:00
committed by WarmUpTill
parent 97983d5ac5
commit 04631964d3
6 changed files with 93 additions and 129 deletions

View File

@@ -13,14 +13,17 @@ bool MacroConditionMidi::_registered = MacroConditionFactory::Register(
bool MacroConditionMidi::CheckCondition()
{
auto messages = _device.GetMessages();
if (!messages) {
if (!_messageBuffer) {
return false;
}
for (const auto &m : *messages) {
if (m.Matches(_message)) {
SetVariableValues(m);
while (!_messageBuffer->Empty()) {
auto message = _messageBuffer->ConsumeMessage();
if (!message) {
continue;
}
if (message->Matches(_message)) {
SetVariableValues(*message);
return true;
}
}
@@ -41,6 +44,7 @@ bool MacroConditionMidi::Load(obs_data_t *obj)
MacroCondition::Load(obj);
_message.Load(obj);
_device.Load(obj);
_messageBuffer = _device.RegisterForMidiMessages();
return true;
}
@@ -49,6 +53,12 @@ std::string MacroConditionMidi::GetShortDesc() const
return _device.Name();
}
void MacroConditionMidi::SetDevice(const MidiDevice &dev)
{
_device = dev;
_messageBuffer = dev.RegisterForMidiMessages();
}
void MacroConditionMidi::SetupTempVars()
{
MacroCondition::SetupTempVars();
@@ -137,7 +147,7 @@ void MacroConditionMidiEdit::UpdateEntryData()
}
_message->SetMessage(_entryData->_message);
_devices->SetDevice(_entryData->_device);
_devices->SetDevice(_entryData->GetDevice());
adjustSize();
updateGeometry();
@@ -155,7 +165,7 @@ void MacroConditionMidiEdit::DeviceSelectionChanged(const MidiDevice &device)
{
auto lock = LockContext();
_entryData->_device = device;
_entryData->SetDevice(device);
}
emit HeaderInfoChanged(
QString::fromStdString(_entryData->GetShortDesc()));
@@ -182,10 +192,12 @@ void MacroConditionMidiEdit::EnableListening(bool enable)
if (_currentlyListening == enable) {
return;
}
_entryData->_device.UseForMessageSelection(enable);
if (enable) {
_messageBuffer =
_entryData->GetDevice().RegisterForMidiMessages();
_listenTimer.start();
} else {
_messageBuffer.reset();
_listenTimer.stop();
}
}
@@ -196,13 +208,6 @@ void MacroConditionMidiEdit::ToggleListen()
return;
}
if (!_currentlyListening &&
_entryData->_device.IsUsedForMessageSelection()) {
DisplayMessage(obs_module_text(
"AdvSceneSwitcher.midi.startListenFail"));
return;
}
_listen->setText(
_currentlyListening
? obs_module_text("AdvSceneSwitcher.midi.startListen")
@@ -215,14 +220,24 @@ void MacroConditionMidiEdit::ToggleListen()
void MacroConditionMidiEdit::SetMessageSelectionToLastReceived()
{
auto lock = LockContext();
auto messages = _entryData->_device.GetMessages(true);
if (!_entryData || !messages || messages->empty()) {
if (!_entryData || !_messageBuffer || _messageBuffer->Empty()) {
return;
}
_message->SetMessage(messages->back());
_entryData->_message = messages->back();
_entryData->_device.ClearMessageBuffer();
std::optional<MidiMessage> message;
while (!_messageBuffer->Empty()) {
message = _messageBuffer->ConsumeMessage();
if (!message) {
continue;
}
}
if (!message) {
return;
}
_message->SetMessage(*message);
_entryData->_message = *message;
}
} // namespace advss