mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-09 20:29:10 +02:00
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:
@@ -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
|
and this project adheres to [Semantic
|
||||||
Versioning](https://semver.org/spec/v2.0.0.html).
|
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
|
## [2.0.2] - 2020-11-14
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ VstEvents& DynamicVstEvents::as_c_events() {
|
|||||||
|
|
||||||
// First we need to allocate enough memory for the entire object. The 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
|
// 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);
|
static_assert(std::extent_v<decltype(VstEvents::events)> == 1);
|
||||||
const size_t buffer_size =
|
const size_t buffer_size =
|
||||||
sizeof(VstEvents) + ((events.size() - 1) * sizeof(VstEvent*));
|
sizeof(VstEvents) + ((events.size() - 1) * sizeof(VstEvent*));
|
||||||
@@ -52,15 +54,10 @@ DynamicSpeakerArrangement::DynamicSpeakerArrangement(
|
|||||||
const VstSpeakerArrangement& speaker_arrangement)
|
const VstSpeakerArrangement& speaker_arrangement)
|
||||||
: flags(speaker_arrangement.flags),
|
: flags(speaker_arrangement.flags),
|
||||||
speakers(speaker_arrangement.num_speakers) {
|
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
|
// Copy from the C-style array into a vector for serialization
|
||||||
speakers.assign(
|
speakers.assign(
|
||||||
speaker_arrangement.speakers,
|
&speaker_arrangement.speakers[0],
|
||||||
speaker_arrangement.speakers +
|
&speaker_arrangement.speakers[speaker_arrangement.num_speakers]);
|
||||||
(speaker_arrangement.num_speakers * sizeof(speaker_type)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
VstSpeakerArrangement& DynamicSpeakerArrangement::as_c_speaker_arrangement() {
|
VstSpeakerArrangement& DynamicSpeakerArrangement::as_c_speaker_arrangement() {
|
||||||
|
|||||||
Reference in New Issue
Block a user