diff --git a/src/common/serialization/vst3.h b/src/common/serialization/vst3.h index a6ffa480..f14fe5d9 100644 --- a/src/common/serialization/vst3.h +++ b/src/common/serialization/vst3.h @@ -132,7 +132,8 @@ using ControlRequest = YaUnitInfo::GetSelectedUnit, YaUnitInfo::SelectUnit, YaUnitInfo::GetUnitByBus, - YaUnitInfo::SetUnitProgramData>; + YaUnitInfo::SetUnitProgramData, + YaXmlRepresentationController::GetXmlRepresentationStream>; template void serialize(S& s, ControlRequest& payload) { diff --git a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp index 9e99b7a4..ca1529dc 100644 --- a/src/plugin/bridges/vst3-impls/plugin-proxy.cpp +++ b/src/plugin/bridges/vst3-impls/plugin-proxy.cpp @@ -792,8 +792,18 @@ Vst3PluginProxyImpl::setUnitProgramData(int32 listOrUnitId, tresult PLUGIN_API Vst3PluginProxyImpl::getXmlRepresentationStream( Steinberg::Vst::RepresentationInfo& info /*in*/, Steinberg::IBStream* stream /*out*/) { - // TODO: Implement - bridge.logger.log( - "TODO: IXmlRepresentationController::getXmlRepresentationStream()"); - return Steinberg::kNotImplemented; + if (stream) { + const GetXmlRepresentationStreamResponse response = bridge.send_message( + YaXmlRepresentationController::GetXmlRepresentationStream{ + .instance_id = instance_id(), .info = info}); + + response.stream.write_back(stream); + + return response.result; + } else { + bridge.logger.log( + "WARNING: Null pointer passed to " + "'IXmlRepresentationController::getXmlRepresentationStream()'"); + return Steinberg::kInvalidArgument; + } } diff --git a/src/wine-host/bridges/vst3.cpp b/src/wine-host/bridges/vst3.cpp index 0911d37c..2b5c9127 100644 --- a/src/wine-host/bridges/vst3.cpp +++ b/src/wine-host/bridges/vst3.cpp @@ -50,7 +50,8 @@ InstanceInterfaces::InstanceInterfaces( plugin_base(object), unit_data(object), program_list_data(object), - unit_info(object) {} + unit_info(object), + xml_representation_controller(object) {} Vst3Bridge::Vst3Bridge(MainContext& main_context, std::string plugin_dll_path, @@ -894,6 +895,21 @@ void Vst3Bridge::run() { request.program_index, &request.data); }, + [&](YaXmlRepresentationController::GetXmlRepresentationStream& + request) -> YaXmlRepresentationController:: + GetXmlRepresentationStream::Response { + VectorStream stream{}; + const tresult result = + object_instances[request.instance_id] + .xml_representation_controller + ->getXmlRepresentationStream( + request.info, &stream); + + return YaXmlRepresentationController:: + GetXmlRepresentationStreamResponse{ + .result = result, + .stream = std::move(stream)}; + }, }); } diff --git a/src/wine-host/bridges/vst3.h b/src/wine-host/bridges/vst3.h index 8d8649a9..0766576e 100644 --- a/src/wine-host/bridges/vst3.h +++ b/src/wine-host/bridges/vst3.h @@ -163,6 +163,8 @@ struct InstanceInterfaces { Steinberg::FUnknownPtr unit_data; Steinberg::FUnknownPtr program_list_data; Steinberg::FUnknownPtr unit_info; + Steinberg::FUnknownPtr + xml_representation_controller; }; /**