Fix speaker arrangement bitsets

The sizes were wrong, and Blue Cat Audio's VST3 plugins seem to use the
upper bits to store the channel configuration, which thus got read out
incorrectly.
This commit is contained in:
Robbert van der Helm
2021-06-11 17:22:46 +02:00
parent 78f6921cd8
commit 9c30d64975
2 changed files with 24 additions and 11 deletions
+13 -10
View File
@@ -915,9 +915,10 @@ bool Vst3Logger::log_request(
if (!first) {
message << ", ";
}
message << "SpeakerArrangement: 0b"
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement)>(
arrangement);
message
<< "SpeakerArrangement: 0b"
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement) * 8>(
arrangement);
first = false;
}
@@ -927,9 +928,10 @@ bool Vst3Logger::log_request(
if (!first) {
message << ", ";
}
message << "SpeakerArrangement: 0b"
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement)>(
arrangement);
message
<< "SpeakerArrangement: 0b"
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement) * 8>(
arrangement);
first = false;
}
@@ -1778,10 +1780,11 @@ void Vst3Logger::log_response(
log_response_base(is_host_vst, [&](auto& message) {
message << response.result.string();
if (response.result == Steinberg::kResultOk) {
message << ", <SpeakerArrangement: 0b"
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement)>(
response.arr)
<< ">";
message
<< ", <SpeakerArrangement: 0b"
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement) * 8>(
response.arr)
<< ">";
}
});
}
+11 -1
View File
@@ -34,6 +34,8 @@
* `IComponent` pointer into an `IPluginBase` smart pointer. This way we can
* keep the rest of yabridge's design in tact.
*/
using std::endl;
Steinberg::FUnknownPtr<Steinberg::IPluginBase> hack_init_plugin_base(
Steinberg::IPtr<Steinberg::FUnknown> object,
Steinberg::IPtr<Steinberg::Vst::IComponent> component);
@@ -1174,12 +1176,20 @@ AudioShmBuffer::Config Vst3Bridge::setup_shared_audio_buffers(
audio_processor->getBusArrangement(direction, bus,
speaker_arrangement);
std::cout << speaker_arrangement << std::endl;
std::cout
<< std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement) * 8>(
speaker_arrangement)
<< endl;
const size_t num_channels =
std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement)>(
std::bitset<sizeof(Steinberg::Vst::SpeakerArrangement) * 8>(
speaker_arrangement)
.count();
bus_offsets[bus].resize(num_channels);
std::cout << num_channels << " channels" << std::endl;
for (size_t channel = 0; channel < num_channels; channel++) {
bus_offsets[bus][channel] = current_offset;
current_offset += setup.maxSamplesPerBlock;