mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-07 03:50:11 +02:00
Communicate over the socket instead of STDIN
This commit is contained in:
+12
-13
@@ -16,6 +16,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <boost/asio/buffer.hpp>
|
||||
#include <cinttypes>
|
||||
#include <iostream>
|
||||
#include <msgpack.hpp>
|
||||
@@ -66,15 +67,14 @@ struct EventResult {
|
||||
*
|
||||
* @relates read_object
|
||||
*/
|
||||
template <typename T, typename Stream>
|
||||
inline void write_object(Stream& stream, const T& object) {
|
||||
template <typename T, typename Socket>
|
||||
inline void write_object(Socket& socket, const T& object) {
|
||||
// TODO: Reuse buffers
|
||||
// TODO: Use boost's buffers directly after switching to bitsery
|
||||
msgpack::sbuffer buffer;
|
||||
msgpack::pack(buffer, object);
|
||||
|
||||
stream << buffer.size();
|
||||
stream.write(buffer.data(), buffer.size());
|
||||
stream.flush();
|
||||
socket.send(boost::asio::buffer(buffer.data(), buffer.size()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -87,13 +87,12 @@ inline void write_object(Stream& stream, const T& object) {
|
||||
*
|
||||
* @relates write_object
|
||||
*/
|
||||
template <typename T, typename Stream>
|
||||
inline T read_object(Stream& stream) {
|
||||
size_t message_length;
|
||||
stream >> message_length;
|
||||
|
||||
template <typename T, typename Socket>
|
||||
inline T read_object(Socket& socket) {
|
||||
// TODO: Reuse buffers
|
||||
std::vector<char> buffer(message_length);
|
||||
stream.read(buffer.data(), message_length);
|
||||
return msgpack::unpack(buffer.data(), message_length).get().convert();
|
||||
// TODO: Use boost's buffers directly after switching to bitsery
|
||||
char buffer[65536];
|
||||
auto message_length = socket.receive(boost::asio::buffer(buffer));
|
||||
|
||||
return msgpack::unpack(buffer, message_length).get().convert();
|
||||
}
|
||||
|
||||
@@ -102,9 +102,9 @@ intptr_t Bridge::dispatch(AEffect* /*plugin*/,
|
||||
}
|
||||
|
||||
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) {
|
||||
std::copy(response.result->begin(), response.result->end(),
|
||||
static_cast<char*>(result));
|
||||
|
||||
@@ -86,7 +86,7 @@ int main(int argc, char* argv[]) {
|
||||
// TODO: Remove debug, we're just reporting the plugin's name we retrieved
|
||||
// above
|
||||
while (true) {
|
||||
auto event = read_object<Event>(std::cin);
|
||||
auto event = read_object<Event>(host_vst_dispatch);
|
||||
|
||||
EventResult response;
|
||||
if (event.opcode == effGetEffectName) {
|
||||
@@ -96,7 +96,7 @@ int main(int argc, char* argv[]) {
|
||||
response.return_value = 0;
|
||||
}
|
||||
|
||||
write_object(std::cout, response);
|
||||
write_object(host_vst_dispatch, response);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user