Answer event queries within the Wine VST host

This commit is contained in:
Robbert van der Helm
2020-02-09 20:05:47 +01:00
parent 73256d0055
commit 875308bd6f
5 changed files with 67 additions and 18 deletions
+1 -1
View File
@@ -44,6 +44,6 @@ executable(
],
native : false,
include_directories : include_dir,
dependencies : [],
link_args : []
dependencies : [msgpack_dep],
)
+6 -4
View File
@@ -1,6 +1,7 @@
#pragma once
#include <cinttypes>
#include <iostream>
#include <msgpack.hpp>
#include <optional>
@@ -49,14 +50,14 @@ struct EventResult {
*
* @relates read_object
*/
template <typename Stream, typename T>
template <typename T, typename Stream>
inline void write_object(Stream& stream, const T& object) {
// TODO: Reuse buffers
msgpack::sbuffer buffer;
msgpack::pack(buffer, object);
stream << buffer.size();
stream << buffer.data();
stream.write(buffer.data(), buffer.size());
stream.flush();
}
@@ -66,11 +67,12 @@ inline void write_object(Stream& stream, const T& object) {
available.
*
* @param stream The stream to read from.
* @throw msgpack::type_error If the conversion to an object was not successful.
*
* @relates write_object
*/
template <typename Stream>
inline EventResult read_object(Stream& stream) {
template <typename T, typename Stream>
inline T read_object(Stream& stream) {
size_t message_length;
stream >> message_length;
+11 -11
View File
@@ -15,7 +15,7 @@
namespace bp = boost::process;
namespace fs = boost::filesystem;
constexpr auto yabridge_wine_host_name = "yabridge-host.exeTODO";
constexpr auto yabridge_wine_host_name = "yabridge-host.exe";
fs::path find_wine_vst_host();
@@ -38,15 +38,6 @@ intptr_t Bridge::dispatch(AEffect* /*plugin*/,
intptr_t value,
void* result,
float option) {
Event event{opcode, parameter, value, option};
write_object(vst_stdin, event);
EventResult response = read_object(vst_stdout);
if (response.result) {
std::copy(response.result->begin(), response.result->end(),
static_cast<char*>(result));
}
// Some events need some extra handling
// TODO: Handle other things such as GUI itneraction
switch (opcode) {
@@ -64,6 +55,15 @@ intptr_t Bridge::dispatch(AEffect* /*plugin*/,
break;
}
Event event{opcode, parameter, value, option};
write_object(vst_stdin, event);
auto response = read_object<EventResult>(vst_stdout);
if (response.result) {
std::copy(response.result->begin(), response.result->end(),
static_cast<char*>(result));
}
return response.return_value;
}
@@ -109,7 +109,7 @@ fs::path find_wine_vst_host() {
// Bosot will return an empty path if the file could not be found in the
// search path
fs::path vst_host_path = bp::search_path(yabridge_wine_host_name);
if (fs::is_empty(vst_host_path)) {
if (vst_host_path == "") {
throw std::runtime_error("Could not locate '" +
std::string(yabridge_wine_host_name) + "'");
}
+26
View File
@@ -0,0 +1,26 @@
#pragma once
// Libraries like Boost and msgpack think we're compiling on Windows or using a
// MSVC toolchain. This will cause them to make assumptions about the way
// certain types are defined, which headers are available and which features to
// disable (i.e. POSIX specific features). The only way around this I could
// think of was to just temporarily undefine the macros these libraries use to
// detect it's running under a WIN32 environment. If anyone knows a better way
// to do this, please let me know!
#pragma push_macro("WIN32")
#pragma push_macro("_WIN32")
#pragma push_macro("__WIN32__")
#pragma push_macro("_WIN64")
#undef WIN32
#undef _WIN32
#undef __WIN32__
#undef _WIN64
#include <msgpack.hpp>
#pragma pop_macro("WIN32")
#pragma pop_macro("_WIN32")
#pragma pop_macro("__WIN32__")
#pragma pop_macro("_WIN64")
+23 -2
View File
@@ -1,7 +1,28 @@
// TODO: Do something useful here!
#include <vestige/aeffect.h>
#include <iostream>
#include "native-includes.h"
// `native-includes.h` has to be included before any other files as otherwise we
// might get the wrong version of certain libraries
#include "../common/communication.h"
int main() {
std::cout << "Hello, world!" << std::endl;
// TODO: The program should terminate automatically when stdin gets closed
// TODO: Remove debug
while (true) {
auto event = read_object<Event>(std::cin);
EventResult response;
if (event.opcode == effGetEffectName) {
response.return_value = 1;
response.result = "Hello, world!";
} else {
response.return_value = 0;
}
write_object(std::cout, response);
}
}