Communicate over the socket instead of STDIN

This commit is contained in:
Robbert van der Helm
2020-02-24 16:43:04 +01:00
parent df47104297
commit 5c946fff6a
3 changed files with 16 additions and 17 deletions
+12 -13
View File
@@ -16,6 +16,7 @@
#pragma once #pragma once
#include <boost/asio/buffer.hpp>
#include <cinttypes> #include <cinttypes>
#include <iostream> #include <iostream>
#include <msgpack.hpp> #include <msgpack.hpp>
@@ -66,15 +67,14 @@ struct EventResult {
* *
* @relates read_object * @relates read_object
*/ */
template <typename T, typename Stream> template <typename T, typename Socket>
inline void write_object(Stream& stream, const T& object) { inline void write_object(Socket& socket, const T& object) {
// TODO: Reuse buffers // TODO: Reuse buffers
// TODO: Use boost's buffers directly after switching to bitsery
msgpack::sbuffer buffer; msgpack::sbuffer buffer;
msgpack::pack(buffer, object); msgpack::pack(buffer, object);
stream << buffer.size(); socket.send(boost::asio::buffer(buffer.data(), buffer.size()));
stream.write(buffer.data(), buffer.size());
stream.flush();
} }
/** /**
@@ -87,13 +87,12 @@ inline void write_object(Stream& stream, const T& object) {
* *
* @relates write_object * @relates write_object
*/ */
template <typename T, typename Stream> template <typename T, typename Socket>
inline T read_object(Stream& stream) { inline T read_object(Socket& socket) {
size_t message_length;
stream >> message_length;
// TODO: Reuse buffers // TODO: Reuse buffers
std::vector<char> buffer(message_length); // TODO: Use boost's buffers directly after switching to bitsery
stream.read(buffer.data(), message_length); char buffer[65536];
return msgpack::unpack(buffer.data(), message_length).get().convert(); auto message_length = socket.receive(boost::asio::buffer(buffer));
return msgpack::unpack(buffer, message_length).get().convert();
} }
+2 -2
View File
@@ -102,9 +102,9 @@ intptr_t Bridge::dispatch(AEffect* /*plugin*/,
} }
const Event event{opcode, parameter, value, option}; const Event event{opcode, parameter, value, option};
write_object(vst_stdin, event); write_object(host_vst_dispatch, event);
const auto response = read_object<EventResult>(vst_stdout); const auto response = read_object<EventResult>(host_vst_dispatch);
if (response.result) { if (response.result) {
std::copy(response.result->begin(), response.result->end(), std::copy(response.result->begin(), response.result->end(),
static_cast<char*>(result)); static_cast<char*>(result));
+2 -2
View File
@@ -86,7 +86,7 @@ int main(int argc, char* argv[]) {
// TODO: Remove debug, we're just reporting the plugin's name we retrieved // TODO: Remove debug, we're just reporting the plugin's name we retrieved
// above // above
while (true) { while (true) {
auto event = read_object<Event>(std::cin); auto event = read_object<Event>(host_vst_dispatch);
EventResult response; EventResult response;
if (event.opcode == effGetEffectName) { if (event.opcode == effGetEffectName) {
@@ -96,7 +96,7 @@ int main(int argc, char* argv[]) {
response.return_value = 0; response.return_value = 0;
} }
write_object(std::cout, response); write_object(host_vst_dispatch, response);
} }
} }