diff --git a/README.md b/README.md index 0d3ed641..a4e913ec 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,6 @@ There are a few things that should be done before making this public, including: thing. - Fix `processReplacing` forwarding. - Implement GUIs. -- Chunks. For `effSetChunk` we can now just use the strings. For `effGetChunk` - we need to find a clean way to 1. make the returned string exactly `n` bytes - long, where `n` is the value returned by the VST plugin's `dispatch()` - function (could be an option for `WritableBuffer`), and 2. store the returned - data in a `std::vector` on the `HostBridge` struct and write back a - pointer to that instead. That might involve extending `DefaultDataConverter` - to also handle writing back values. - Check if we need special handling for the `effGetChunk` and `effSetChunk` events. - Mention precompiled binaries and building from source in the installation diff --git a/src/common/communication.h b/src/common/communication.h index 4d331088..5a417c3e 100644 --- a/src/common/communication.h +++ b/src/common/communication.h @@ -116,7 +116,9 @@ inline T read_object(Socket& socket) { */ class DefaultDataConverter { public: - EventPayload read(const int /*opcode*/, const void* data) { + virtual ~DefaultDataConverter() {}; + + virtual EventPayload read(const int /*opcode*/, const intptr_t /*value*/, const void* data) { if (data == nullptr) { return nullptr; } @@ -130,7 +132,7 @@ class DefaultDataConverter { } } - void write(const int /*opcode*/, void* data, const EventResult& response) { + virtual void write(const int /*opcode*/, void* data, const EventResult& response) { if (response.data.has_value()) { char* output = static_cast(data); @@ -173,7 +175,7 @@ intptr_t send_event(boost::asio::local::stream_protocol::socket& socket, std::optional> logging) { // Encode the right payload type for this event. Check the documentation for // `EventPayload` for more information. - const EventPayload payload = data_converter.read(opcode, data); + const EventPayload payload = data_converter.read(opcode, value, data); if (logging.has_value()) { auto [logger, is_dispatch] = *logging; diff --git a/src/plugin/host-bridge.cpp b/src/plugin/host-bridge.cpp index 3c7e9305..d6ed65b5 100644 --- a/src/plugin/host-bridge.cpp +++ b/src/plugin/host-bridge.cpp @@ -142,18 +142,24 @@ class DispatchDataConverter : DefaultDataConverter { DispatchDataConverter(std::vector& chunk_data) : chunk(chunk_data) {} - EventPayload read(const int opcode, const void* data) { + EventPayload read(const int opcode, const intptr_t value, const void* data) { // There are some events that need specific structs that we can't simply // serialize as a string because they might contain null bytes // TODO: More of these structs switch (opcode) { case effGetChunk: return WantsChunkBuffer(); + break; + case effSetChunk: + // When the host passes a chunk it will use the value parameter + // to tell us its length + return std::string(static_cast(data), value); + break; case effProcessEvents: return DynamicVstEvents(*static_cast(data)); break; default: - return DefaultDataConverter::read(opcode, data); + return DefaultDataConverter::read(opcode, value, data); break; } }