Fix off-by-one error in speaker arrangement read

This is why you don't do pointer arithmetic. Fixes an error message in
Renoise when trying to load a plugin as an effect.
This commit is contained in:
Robbert van der Helm
2020-11-14 19:37:04 +01:00
parent f40f031bb0
commit ed5f0c42d9
2 changed files with 12 additions and 8 deletions
+7
View File
@@ -6,6 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic
Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Fixed
- Fixed an issue where _Renoise_ would show an error message when trying to load
a plugin in the mixer.
## [2.0.2] - 2020-11-14
### Fixed
+5 -8
View File
@@ -31,7 +31,9 @@ VstEvents& DynamicVstEvents::as_c_events() {
// First we need to allocate enough memory for the entire object. The events
// are stored as pointers to objects in the `events` vector that we sent
// over the socket.
// over the socket. Our definition of `VstEvents` contains a single
// `VstEvent`, so our buffer needs to be large enough to store that plus the
// number of events minus one pointers.
static_assert(std::extent_v<decltype(VstEvents::events)> == 1);
const size_t buffer_size =
sizeof(VstEvents) + ((events.size() - 1) * sizeof(VstEvent*));
@@ -52,15 +54,10 @@ DynamicSpeakerArrangement::DynamicSpeakerArrangement(
const VstSpeakerArrangement& speaker_arrangement)
: flags(speaker_arrangement.flags),
speakers(speaker_arrangement.num_speakers) {
using speaker_type =
std::remove_extent_t<decltype(speaker_arrangement.speakers)>;
static_assert(std::is_same_v<speaker_type, VstSpeaker>);
// Copy from the C-style array into a vector for serialization
speakers.assign(
speaker_arrangement.speakers,
speaker_arrangement.speakers +
(speaker_arrangement.num_speakers * sizeof(speaker_type)));
&speaker_arrangement.speakers[0],
&speaker_arrangement.speakers[speaker_arrangement.num_speakers]);
}
VstSpeakerArrangement& DynamicSpeakerArrangement::as_c_speaker_arrangement() {