diff --git a/src/common/serialization/vst3/physical-ui-map-list.cpp b/src/common/serialization/vst3/physical-ui-map-list.cpp index c0149c35..419b3c74 100644 --- a/src/common/serialization/vst3/physical-ui-map-list.cpp +++ b/src/common/serialization/vst3/physical-ui-map-list.cpp @@ -16,6 +16,8 @@ #include "physical-ui-map-list.h" +#include + YaPhysicalUIMapList::YaPhysicalUIMapList() {} YaPhysicalUIMapList::YaPhysicalUIMapList( @@ -27,3 +29,14 @@ Steinberg::Vst::PhysicalUIMapList YaPhysicalUIMapList::get() { .count = static_cast(maps.size()), .map = maps.data()}; } + +void YaPhysicalUIMapList::write_back( + Steinberg::Vst::PhysicalUIMapList& list) const { + assert(list.count == maps.size()); + + // Write the note expression IDs as updated by the plugin (if the plugin + // updated them) back to the original list we've read from + for (Steinberg::uint32 i = 0; i < list.count; i++) { + list.map[i].noteExpressionTypeID = maps[i].noteExpressionTypeID; + } +} diff --git a/src/common/serialization/vst3/physical-ui-map-list.h b/src/common/serialization/vst3/physical-ui-map-list.h index 70616626..98673e5c 100644 --- a/src/common/serialization/vst3/physical-ui-map-list.h +++ b/src/common/serialization/vst3/physical-ui-map-list.h @@ -22,7 +22,10 @@ /** * Serialization wrapper around `PhysicalUIMapList` that allows loading such a - * list and recreating one from a `YaPhysicalUIMapList` object. + * list and writing the changes made by the plugin back to the original list. + * The host provides a list with the `physicalUITypeID` field set for each + * mapping, and the plugin then sets the `noteExpressionTypeID` to one of its + * note expression of it can handle it. */ class YaPhysicalUIMapList { public: @@ -35,12 +38,19 @@ class YaPhysicalUIMapList { /** * Reconstruct the original `PhysicalUIMapList` object passed to the - * constructor and return it. This is used as part of - * `YaProcessData::get()`. The returned object is valid as long as this - * object is alive. + * constructor and return it. This is used to handle + * `INoteExpressionPhysicalUIMapping::getPhysicalUIMapping()` on the Wine + * plugin host side. The returned object is valid as long as this object is + * alive. */ Steinberg::Vst::PhysicalUIMapList get(); + /** + * Write the `noteExpressionTypeID` values stored in `maps` back to the + * original physical UI mapping list we copied `maps` from. + */ + void write_back(Steinberg::Vst::PhysicalUIMapList& list) const; + template void serialize(S& s) { s.container(maps, 1 << 31);