Skip to content

Commit 78a2cce

Browse files
Merge pull request #57 from RomanPudashkin/fix_long_pedal_playback
Fix #33451: fix ringbuffer overflow caused by duplicate pedal CC events
2 parents 3bccd78 + c9758c2 commit 78a2cce

2 files changed

Lines changed: 27 additions & 2 deletions

File tree

framework/audio/engine/internal/synthesizers/fluidsynth/fluidsequencer.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,12 +237,23 @@ void FluidSequencer::addControlChangeEvent(EventSequenceMap& destination, const
237237
void FluidSequencer::addControlChange(EventSequenceMap& destination, const mpe::timestamp_t timestamp,
238238
const int midiControlIdx, const channel_t channelIdx, const uint32_t value)
239239
{
240+
EventSequence& events = destination[timestamp];
241+
for (const EventType& e : events) {
242+
const midi::Event& midiEvent = std::get<midi::Event>(e);
243+
if (midiEvent.opcode() == Event::Opcode::ControlChange
244+
&& midiEvent.channel() == channelIdx
245+
&& midiEvent.index() == static_cast<uint8_t>(midiControlIdx)
246+
&& midiEvent.data() == value) {
247+
return;
248+
}
249+
}
250+
240251
midi::Event cc(Event::Opcode::ControlChange, Event::MessageType::ChannelVoice10);
241252
cc.setIndex(midiControlIdx);
242253
cc.setChannel(channelIdx);
243254
cc.setData(value);
244255

245-
destination[timestamp].emplace_back(std::move(cc));
256+
events.emplace_back(cc);
246257
}
247258

248259
void FluidSequencer::addPitchCurve(EventSequenceMap& destination, const mpe::NoteEvent& noteEvent,

framework/vst/internal/synth/vstsequencer.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,21 @@ void VstSequencer::addParamChange(EventSequenceMap& destination, const mpe::time
201201
return;
202202
}
203203

204-
destination[timestamp].emplace_back(ParamChangeEvent { controlIt->second, value });
204+
const PluginParamId paramId = controlIt->second;
205+
EventSequence& events = destination[timestamp];
206+
207+
for (const EventType& e : events) {
208+
if (!std::holds_alternative<ParamChangeEvent>(e)) {
209+
continue;
210+
}
211+
212+
const ParamChangeEvent& pce = std::get<ParamChangeEvent>(e);
213+
if (pce.paramId == paramId && RealIsEqual(pce.value, value)) {
214+
return;
215+
}
216+
}
217+
218+
events.emplace_back(ParamChangeEvent { paramId, value });
205219
}
206220

207221
void VstSequencer::addPitchCurve(EventSequenceMap& destination, const mpe::NoteEvent& noteEvent,

0 commit comments

Comments
 (0)