diff --git a/meson.build b/meson.build index 670ac30a..06002a9a 100644 --- a/meson.build +++ b/meson.build @@ -44,6 +44,6 @@ executable( ], native : false, include_directories : include_dir, - dependencies : [], link_args : [] + dependencies : [msgpack_dep], ) diff --git a/src/common/communication.h b/src/common/communication.h index 9f0a8639..754d2ee9 100644 --- a/src/common/communication.h +++ b/src/common/communication.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include @@ -49,14 +50,14 @@ struct EventResult { * * @relates read_object */ -template +template 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 -inline EventResult read_object(Stream& stream) { +template +inline T read_object(Stream& stream) { size_t message_length; stream >> message_length; diff --git a/src/plugin/bridge.cpp b/src/plugin/bridge.cpp index 4ff89e85..721ac1fd 100644 --- a/src/plugin/bridge.cpp +++ b/src/plugin/bridge.cpp @@ -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(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(vst_stdout); + if (response.result) { + std::copy(response.result->begin(), response.result->end(), + static_cast(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) + "'"); } diff --git a/src/wine-host/native-includes.h b/src/wine-host/native-includes.h new file mode 100644 index 00000000..7905b7a3 --- /dev/null +++ b/src/wine-host/native-includes.h @@ -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 + +#pragma pop_macro("WIN32") +#pragma pop_macro("_WIN32") +#pragma pop_macro("__WIN32__") +#pragma pop_macro("_WIN64") diff --git a/src/wine-host/vst-host.cpp b/src/wine-host/vst-host.cpp index bca1cb37..11b5240f 100644 --- a/src/wine-host/vst-host.cpp +++ b/src/wine-host/vst-host.cpp @@ -1,7 +1,28 @@ -// TODO: Do something useful here! +#include #include +#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(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); + } }