// yabridge: a Wine plugin bridge
// Copyright (C) 2020-2022 Robbert van der Helm
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
#include "vst2.h"
Vst2Event::Payload DefaultDataConverter::read_data(const int /*opcode*/,
const int /*index*/,
const intptr_t /*value*/,
const void* data) const {
if (!data) {
return nullptr;
}
// This is a simple fallback that will work in almost every case. Because
// some plugins don't zero out their string buffers when sending host
// callbacks, we will explicitely list all callbacks that expect a string in
// `DispatchDataConverter` and `HostCallbackDataConverter`.
const char* str = static_cast(data);
if (str[0] != 0) {
return std::string(str);
} else {
return WantsString{};
}
}
std::optional DefaultDataConverter::read_value(
const int /*opcode*/,
const intptr_t /*value*/) const {
return std::nullopt;
}
void DefaultDataConverter::write_data(const int /*opcode*/,
void* data,
const Vst2EventResult& response) const {
// The default behavior is to handle this as a null terminated C-style
// string
std::visit(overload{[&](const auto&) {},
[&](const std::string& s) {
char* output = static_cast(data);
// We use std::string for easy transport but in
// practice we're always writing null terminated
// C-style strings
std::copy(s.begin(), s.end(), output);
output[s.size()] = 0;
}},
response.payload);
}
void DefaultDataConverter::write_value(
const int /*opcode*/,
intptr_t /*value*/,
const Vst2EventResult& /*response*/) const {}
intptr_t DefaultDataConverter::return_value(const int /*opcode*/,
const intptr_t original) const {
return original;
}
Vst2EventResult DefaultDataConverter::send_event(
asio::local::stream_protocol::socket& socket,
const Vst2Event& event,
SerializationBufferBase& buffer) const {
write_object(socket, event, buffer);
return read_object(socket, buffer);
}