Skip to content

Commit a9e2cfb

Browse files
authored
Fix #279 - Fail to render when non-VST fx are in fx chains (#280)
* Update reaper_plugin_functions.h to MODIFIED v6.37 v6.37 supports TrackFX_GetNamedConfigParm( track, 0, "fx_name" ) Some earlier versions support TrackFX_GetNamedConfigParm, but not with the "fx_name" arg Modification is to address this bug in the header: https://forum.cockos.com/showthread.php?p=2548853 (post 4) * Use TrackFX_GetNamedConfigParm over custom state chunk parsing * Remove redundant funcs and associated tests * Update CHANGELOG.md
1 parent 8e5f79a commit a9e2cfb

File tree

7 files changed

+380
-491
lines changed

7 files changed

+380
-491
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
UNRELEASED
2+
Note: This release bumps the minimum required REAPER version from v6.11 to v6.37
23

34
* Fix occasional crash bug in start up of Binaural Monitoring plugin [#277](https://github.com/ebu/ear-production-suite/issues/277) [#278](https://github.com/ebu/ear-production-suite/pull/278)
5+
* Fix fail to render when non-VST plugins are in FX chains [#279](https://github.com/ebu/ear-production-suite/issues/279) [#280](https://github.com/ebu/ear-production-suite/pull/280)
46

57
Version 1.1.0b
68

reaper-adm-extension/src/reaper_adm/reaper_plugin_functions.h

+362-196
Large diffs are not rendered by default.

reaper-adm-extension/src/reaper_adm/reaperapi.h

-3
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,6 @@ class ReaperAPI {
194194
virtual void CleanFXName(std::string& name) const = 0;
195195
virtual int TrackFX_PositionByActualName(MediaTrack* track, const std::string& fxName) const = 0;
196196
virtual int TrackFX_AddByActualName(MediaTrack* track, const char* fxname, bool recFX, int instantiate) const = 0;
197-
virtual std::vector<std::pair<int, std::string>> GetVSTElementsFromTrackStateChunk(const std::string& fullChunk) const = 0;
198-
virtual std::vector<std::string> SplitVSTElement(const std::string& elm, bool stripBoundingQuotes, bool includeSeperators) const = 0;
199-
virtual std::string GetTrackStateChunkStr(MediaTrack* track) const = 0;
200197
virtual int GetDawChannelCount() const = 0;
201198

202199
};

reaper-adm-extension/src/reaper_adm/reaperapiimpl.cpp

+16-165
Original file line numberDiff line numberDiff line change
@@ -824,186 +824,37 @@ std::optional<std::pair<double, double>> admplug::ReaperAPIImpl::getTrackAudioBo
824824
return std::optional<std::pair<double, double>>();
825825
}
826826

827-
std::vector<std::pair<int, std::string>> admplug::ReaperAPIImpl::GetVSTElementsFromTrackStateChunk(const std::string& fullChunk) const
828-
{
829-
std::vector<std::pair<int, std::string>> vst3Elements;
830-
831-
const std::vector<char> quoteMarks{ '\'', '`', '"' };
832-
int elmStart = -1;
833-
834-
for (int pos = 0; pos < fullChunk.length(); ++pos) {
835-
836-
bool escapedQuote = false;
837-
for (auto quote : quoteMarks) {
838-
if (fullChunk[pos] == quote) {
839-
// Entered a quote mark
840-
if (pos == fullChunk.length() - 1) {
841-
// Already at EOF - don't attempt to find
842-
escapedQuote = true;
843-
break;
844-
}
845-
// Find end quote mark
846-
auto newPos = fullChunk.find(quote, pos + 1);
847-
if (newPos == std::string::npos) {
848-
// End not found to EOF - abort
849-
escapedQuote = true;
850-
break;
851-
}
852-
pos = newPos;
853-
}
854-
}
855-
if (escapedQuote) {
856-
break;
857-
}
858-
859-
if (elmStart == -1) {
860-
// Not in an element - check if at start of one
861-
if (fullChunk.substr(pos, 5) == "<VST ") {
862-
elmStart = pos;
863-
}
864-
}
865-
else {
866-
// In an element - check if at end
867-
if (fullChunk.substr(pos, 1) == ">") {
868-
vst3Elements.push_back(std::make_pair(
869-
elmStart,
870-
fullChunk.substr(elmStart, pos - elmStart + 1))
871-
);
872-
elmStart = -1;
873-
}
874-
}
875-
}
876-
877-
return vst3Elements;
878-
}
879-
880-
std::vector<std::string> admplug::ReaperAPIImpl::SplitVSTElement(const std::string& elm, bool stripBoundingQuotes, bool includeSeperators) const
881-
{
882-
std::vector<std::string> sec;
883-
884-
const std::vector<char> quoteMarks{ '\'', '`', '"' };
885-
const std::vector<char> splitMarks{ ' ', '\r', '\n' };
886-
int secStart = 5;
887-
888-
for (int pos = 5; pos < elm.length(); ++pos) {
889-
890-
bool escapedQuote = false;
891-
for (auto quote : quoteMarks) {
892-
if (elm[pos] == quote) {
893-
// Entered a quote mark
894-
if (pos == elm.length() - 1) {
895-
// Already at EOF - don't attempt to find
896-
escapedQuote = true;
897-
break;
898-
}
899-
// Find end quote mark
900-
auto newPos = elm.find(quote, pos + 1);
901-
if (newPos == std::string::npos) {
902-
// End not found to EOF - abort
903-
escapedQuote = true;
904-
break;
905-
}
906-
pos = newPos;
907-
}
908-
}
909-
if (escapedQuote) {
910-
break;
911-
}
912-
913-
for (auto splitMark : splitMarks) {
914-
if (elm[pos] == splitMark) {
915-
// Close this section and start a new one
916-
sec.push_back(elm.substr(secStart, pos - secStart));
917-
if (includeSeperators) {
918-
sec.push_back(std::string{ splitMark });
919-
}
920-
secStart = pos + 1;
921-
break;
922-
}
923-
}
924-
}
925-
926-
if (stripBoundingQuotes) {
927-
for (auto& s : sec) {
928-
if (s.length() >= 2) {
929-
for (auto quote : quoteMarks) {
930-
if (s[0] == quote && s[s.length() - 1] == quote) {
931-
s = s.substr(1, s.length() - 2);
932-
break;
933-
}
934-
}
935-
}
936-
}
937-
}
938-
939-
return sec;
940-
}
941-
942-
std::string admplug::ReaperAPIImpl::GetTrackStateChunkStr(MediaTrack* track) const
943-
{
944-
const size_t chunkMaxLen = 65535; // Should be plenty
945-
char chunk[chunkMaxLen];
946-
auto res = GetTrackStateChunk(track, chunk, chunkMaxLen, false);
947-
if (!res) return std::string();
948-
std::string fullChunk{ chunk, strnlen(chunk, chunkMaxLen) };
949-
return fullChunk;
950-
}
951-
952827
int admplug::ReaperAPIImpl::GetDawChannelCount() const
953828
{
954829
return GetReaperChannelCount(GetAppVersion());
955830
}
956831

957-
bool admplug::ReaperAPIImpl::TrackFX_GetActualFXName(MediaTrack* track, int fx, std::string& name) const
832+
bool admplug::ReaperAPIImpl::TrackFX_GetActualFXName(MediaTrack* track, int fxNum, std::string& name) const
958833
{
959-
// Note that;
960-
// TrackFX_GetNamedConfigParm( track, 0, "fx_name" )
961-
// can get the pre-aliased name but is only supported from v6.37
962-
// Also does not support FX renamed in FX selection window
963-
// (although neither does this)
964-
965-
auto chunk = GetTrackStateChunkStr(track);
966-
967-
auto vst3Elements = GetVSTElementsFromTrackStateChunk(chunk);
968-
if (fx >= vst3Elements.size()) {
969-
return false;
970-
}
971-
972-
const int nameSectionNum = 0;
973-
974-
auto vst3Sections = SplitVSTElement(vst3Elements[fx].second, true, false);
975-
if (vst3Sections.size() <= nameSectionNum) {
976-
return false;
977-
}
978-
979-
name = vst3Sections[nameSectionNum];;
834+
const size_t fxNameMaxLen = 1024; // Should be plenty
835+
char fxName[fxNameMaxLen];
836+
auto fxNameRes = TrackFX_GetNamedConfigParm(track, fxNum, "fx_name", fxName, fxNameMaxLen);
837+
if (!fxNameRes) return false;
838+
name = std::string{ fxName, strnlen(fxName, fxNameMaxLen) };
980839
return true;
981840
}
982841

983842
std::vector<std::string> admplug::ReaperAPIImpl::TrackFX_GetActualFXNames(MediaTrack* track) const
984843
{
985-
// Only gets and parses state chunk once
986-
// More efficient when you want to query every plugin on the track
987-
988-
std::vector<std::string> names;
989-
990-
auto chunk = GetTrackStateChunkStr(track);
991-
992-
auto vst3Elements = GetVSTElementsFromTrackStateChunk(chunk);
993-
994-
const int nameSectionNum = 0;
995-
996-
for (auto const& elmPair : vst3Elements) {
997-
auto vst3Sections = SplitVSTElement(elmPair.second, true, false);
998-
if (vst3Sections.size() <= nameSectionNum) {
999-
names.push_back("");
844+
std::vector<std::string> fxNames;
845+
auto numFx = TrackFX_GetCount(track);
846+
for (int fxNum = 0; fxNum < numFx; fxNum++) {
847+
const size_t fxNameMaxLen = 1024; // Should be plenty
848+
char fxName[fxNameMaxLen];
849+
auto fxNameRes = TrackFX_GetNamedConfigParm(track, fxNum, "fx_name", fxName, fxNameMaxLen);
850+
if (fxNameRes) {
851+
fxNames.push_back(std::string{ fxName, strnlen(fxName, fxNameMaxLen) });
1000852
}
1001853
else {
1002-
names.push_back(vst3Sections[nameSectionNum]);
854+
fxNames.push_back("");
1003855
}
1004856
}
1005-
1006-
return names;
857+
return fxNames;
1007858
}
1008859

1009860
void admplug::ReaperAPIImpl::CleanFXName(std::string& fxName) const

reaper-adm-extension/src/reaper_adm/reaperapiimpl.h

-3
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,6 @@ class ReaperAPIImpl : public ReaperAPI
144144
void CleanFXName(std::string& name) const override;
145145
int TrackFX_PositionByActualName(MediaTrack* track, const std::string& fxName) const override;
146146
int TrackFX_AddByActualName(MediaTrack* track, const char* fxname, bool recFX, int instantiate) const override;
147-
std::vector<std::pair<int, std::string>> GetVSTElementsFromTrackStateChunk(const std::string& fullChunk) const override;
148-
std::vector<std::string> SplitVSTElement(const std::string& elm, bool stripBoundingQuotes, bool includeSeperators) const override;
149-
std::string GetTrackStateChunkStr(MediaTrack* track) const override;
150147
int GetDawChannelCount() const override;
151148

152149
private:

reaper-adm-extension/test/reaper_adm/mocks/reaperapi.h

-3
Original file line numberDiff line numberDiff line change
@@ -236,9 +236,6 @@ class MockReaperAPI : public ReaperAPI {
236236
MOCK_CONST_METHOD1(CleanFXName, void(std::string& name));
237237
MOCK_CONST_METHOD2(TrackFX_PositionByActualName, int(MediaTrack* track, const std::string& fxName));
238238
MOCK_CONST_METHOD4(TrackFX_AddByActualName, int(MediaTrack* track, const char* fxname, bool recFX, int instantiate));
239-
MOCK_CONST_METHOD1(GetVSTElementsFromTrackStateChunk, std::vector<std::pair<int, std::string>>(const std::string& fullChunk));
240-
MOCK_CONST_METHOD3(SplitVSTElement, std::vector<std::string>(const std::string& elm, bool stripBoundingQuotes, bool includeSeperators));
241-
MOCK_CONST_METHOD1(GetTrackStateChunkStr, std::string(MediaTrack* track));
242239
MOCK_CONST_METHOD0(GetDawChannelCount, int());
243240
};
244241

reaper-adm-extension/test/reaper_adm/pluginrenametests.cpp

-121
Original file line numberDiff line numberDiff line change
@@ -2,129 +2,8 @@
22
#include <catch2/catch_all.hpp>
33
#include <reaperapiimpl.h>
44

5-
const std::string trackState =
6-
R"STATESTRING(<TRACK
7-
NAME ""
8-
PEAKCOL 16576
9-
BEAT -1
10-
AUTOMODE 0
11-
VOLPAN 1 0 -1 -1 1
12-
MUTESOLO 0 0 0
13-
IPHASE 0
14-
PLAYOFFS 0 1
15-
ISBUS 0 0
16-
BUSCOMP 0 0 0 0 0
17-
SHOWINMIX 1 0.6667 0.5 1 0.5 0 -1 0
18-
REC 0 0 0 0 0 0 0
19-
VU 2
20-
TRACKHEIGHT 0 0 0 0 0 0
21-
INQ 0 0 0 0.5 100 0 0 100
22-
NCHAN 64
23-
FX 1
24-
TRACKID {BD8FCB16-184B-4852-83A2-A916009600D0}
25-
PERF 0
26-
MIDIOUT -1
27-
MAINSEND 1 0
28-
<FXCHAIN
29-
SHOW 0
30-
LASTSEL 0
31-
DOCKED 0
32-
BYPASS 0 0 0
33-
<VST "VST3: EAR Object (EBU)" "EAR Object.vst3" 0 "Custom Name" 1933719658{ABCDEF019182FAEB4542552045505311} ""
34-
ajhCc+5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAEAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAA
35-
QAAAAAAAAACAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAA
36-
AAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgJ0BAAABAAAA//8QgA==
37-
jQEAAAEAAABWQzIhSAEAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+IDxPYmplY3RzUGx1Z2luIGNvbm5lY3Rpb25faWQ9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIgcm91dGluZz0iLTEiIGdhaW49IjAuMCIgYXppbXV0aD0iMC4wIiBlbGV2YXRpb249IjAuMCIgZGlzdGFuY2U9IjEuMCIgbGlua19zaXplPSIwIiBzaXpl
38-
PSIwLjAiIHdpZHRoPSIwLjAiIGhlaWdodD0iMC4wIiBkZXB0aD0iMC4wIiBkaWZmdXNlPSIwLjAiIGRpdmVyZ2VuY2U9IjAiIGZhY3Rvcj0iMC4wIiByYW5nZT0iNDUuMCIgdXNlX3RyYWNrX25hbWU9IjEiIG5hbWU9IlRyYWNrIDEiLz4AAAAAAAAAAABKVUNFUHJpdmF0ZURhdGEAAQFCeXBhc3MAAQEDAB0AAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=
39-
AFByb2dyYW0gMQAQAAAA
40-
>
41-
PRESETNAME "Program 1"
42-
FLOATPOS 1944 -62 616 512
43-
FXID {159FD704-E101-42BC-A4D2-8F3F263F5160}
44-
WAK 0 0
45-
BYPASS 0 0 0
46-
<VST "VST3: EAR Object (EBU)" "EAR Object.vst3" 0 SingleWord 1933719658{ABCDEF019182FAEB4542552045505311} ""
47-
ajhCc+5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAEAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAA
48-
QAAAAAAAAACAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAA
49-
AAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgJ0BAAABAAAA//8QAA==
50-
jQEAAAEAAABWQzIhSAEAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+IDxPYmplY3RzUGx1Z2luIGNvbm5lY3Rpb25faWQ9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIgcm91dGluZz0iLTEiIGdhaW49IjAuMCIgYXppbXV0aD0iMC4wIiBlbGV2YXRpb249IjAuMCIgZGlzdGFuY2U9IjEuMCIgbGlua19zaXplPSIwIiBzaXpl
51-
PSIwLjAiIHdpZHRoPSIwLjAiIGhlaWdodD0iMC4wIiBkZXB0aD0iMC4wIiBkaWZmdXNlPSIwLjAiIGRpdmVyZ2VuY2U9IjAiIGZhY3Rvcj0iMC4wIiByYW5nZT0iNDUuMCIgdXNlX3RyYWNrX25hbWU9IjEiIG5hbWU9IlRyYWNrIDEiLz4AAAAAAAAAAABKVUNFUHJpdmF0ZURhdGEAAQFCeXBhc3MAAQEDAB0AAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=
52-
AFByb2dyYW0gMQAQAAAA
53-
>
54-
PRESETNAME "Program 1"
55-
FLOATPOS 1944 -62 742 738
56-
FXID {66EFE191-C8CE-4786-8C38-4BE42D751146}
57-
WAK 0 0
58-
BYPASS 0 0 0
59-
<VST "VST3: EAR Object (EBU)" "EAR Object.vst3" 0 `'quote' "Marks" 'lol'` 1933719658{ABCDEF019182FAEB4542552045505311} ""
60-
ajhCc+5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAEAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAA
61-
QAAAAAAAAACAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAA
62-
AAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgJ0BAAABAAAA//8QAA==
63-
jQEAAAEAAABWQzIhSAEAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+IDxPYmplY3RzUGx1Z2luIGNvbm5lY3Rpb25faWQ9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIgcm91dGluZz0iLTEiIGdhaW49IjAuMCIgYXppbXV0aD0iMC4wIiBlbGV2YXRpb249IjAuMCIgZGlzdGFuY2U9IjEuMCIgbGlua19zaXplPSIwIiBzaXpl
64-
PSIwLjAiIHdpZHRoPSIwLjAiIGhlaWdodD0iMC4wIiBkZXB0aD0iMC4wIiBkaWZmdXNlPSIwLjAiIGRpdmVyZ2VuY2U9IjAiIGZhY3Rvcj0iMC4wIiByYW5nZT0iNDUuMCIgdXNlX3RyYWNrX25hbWU9IjEiIG5hbWU9IlRyYWNrIDEiLz4AAAAAAAAAAABKVUNFUHJpdmF0ZURhdGEAAQFCeXBhc3MAAQEDAB0AAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=
65-
AFByb2dyYW0gMQAQAAAA
66-
>
67-
PRESETNAME "Program 1"
68-
FLOATPOS 1944 -62 742 738
69-
FXID {24D3CD65-1A9A-44D6-B8A1-5FBC65C39DD5}
70-
WAK 0 0
71-
BYPASS 0 0 0
72-
<VST "VST3: EAR Object (EBU)" "EAR Object.vst3" 0 '"just in quotes"' 1933719658{ABCDEF019182FAEB4542552045505311} ""
73-
ajhCc+5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAEAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAA
74-
QAAAAAAAAACAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAA
75-
AAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgJ0BAAABAAAA//8QAA==
76-
jQEAAAEAAABWQzIhSAEAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+IDxPYmplY3RzUGx1Z2luIGNvbm5lY3Rpb25faWQ9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIgcm91dGluZz0iLTEiIGdhaW49IjAuMCIgYXppbXV0aD0iMC4wIiBlbGV2YXRpb249IjAuMCIgZGlzdGFuY2U9IjEuMCIgbGlua19zaXplPSIwIiBzaXpl
77-
PSIwLjAiIHdpZHRoPSIwLjAiIGhlaWdodD0iMC4wIiBkZXB0aD0iMC4wIiBkaWZmdXNlPSIwLjAiIGRpdmVyZ2VuY2U9IjAiIGZhY3Rvcj0iMC4wIiByYW5nZT0iNDUuMCIgdXNlX3RyYWNrX25hbWU9IjEiIG5hbWU9IlRyYWNrIDEiLz4AAAAAAAAAAABKVUNFUHJpdmF0ZURhdGEAAQFCeXBhc3MAAQEDAB0AAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=
78-
AFByb2dyYW0gMQAQAAAA
79-
>
80-
PRESETNAME "Program 1"
81-
FLOATPOS 1944 -62 742 738
82-
FXID {493829B3-8224-4E57-AC50-ED2C5E652E31}
83-
WAK 0 0
84-
BYPASS 0 0 0
85-
<VST "VST3: EAR Object (EBU)" "EAR Object.vst3" 0 "" 1933719658{ABCDEF019182FAEB4542552045505311} ""
86-
ajhCc+5e7f4CAAAAAQAAAAAAAAACAAAAAAAAAEAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAA
87-
QAAAAAAAAACAAAAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAAAQAAAAAAAAACAAAAAAAAA
88-
AAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAABAAAAAAAAAAIAAAAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgAAAAAAAAAEAAAAAAAAAAgJ0BAAABAAAA//8QAA==
89-
jQEAAAEAAABWQzIhSAEAADw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+IDxPYmplY3RzUGx1Z2luIGNvbm5lY3Rpb25faWQ9IjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIgcm91dGluZz0iLTEiIGdhaW49IjAuMCIgYXppbXV0aD0iMC4wIiBlbGV2YXRpb249IjAuMCIgZGlzdGFuY2U9IjEuMCIgbGlua19zaXplPSIwIiBzaXpl
90-
PSIwLjAiIHdpZHRoPSIwLjAiIGhlaWdodD0iMC4wIiBkZXB0aD0iMC4wIiBkaWZmdXNlPSIwLjAiIGRpdmVyZ2VuY2U9IjAiIGZhY3Rvcj0iMC4wIiByYW5nZT0iNDUuMCIgdXNlX3RyYWNrX25hbWU9IjEiIG5hbWU9IlRyYWNrIDEiLz4AAAAAAAAAAABKVUNFUHJpdmF0ZURhdGEAAQFCeXBhc3MAAQEDAB0AAAAAAAAASlVDRVByaXZhdGVEYXRhAAAAAAAAAAA=
91-
AFByb2dyYW0gMQAQAAAA
92-
>
93-
PRESETNAME "Program 1"
94-
FLOATPOS 1944 -62 742 738
95-
FXID {17FB49CB-DDA3-41B4-BAF3-9365DF7AC29C}
96-
WAK 0 0
97-
>
98-
>)STATESTRING";
99-
1005
using namespace admplug;
1016

102-
TEST_CASE("Track State Chunk Parsing") {
103-
104-
reaper_plugin_info_t info{};
105-
admplug::ReaperAPIImpl api(info);
106-
107-
auto vst3Elements = api.GetVSTElementsFromTrackStateChunk(trackState);
108-
109-
REQUIRE(vst3Elements.size() == 5);
110-
111-
for (int i = 0; i < vst3Elements.size(); ++i) {
112-
auto el = vst3Elements[i];
113-
auto s = api.SplitVSTElement(el.second, true, false);
114-
115-
REQUIRE(s.size() >= 6);
116-
REQUIRE(s[0] == "VST3: EAR Object (EBU)");
117-
REQUIRE(s[1] == "EAR Object.vst3");
118-
119-
if (i == 0) REQUIRE(s[3] == "Custom Name");
120-
if (i == 1) REQUIRE(s[3] == "SingleWord");
121-
if (i == 2) REQUIRE(s[3] == "'quote' \"Marks\" 'lol'");
122-
if (i == 3) REQUIRE(s[3] == "\"just in quotes\"");
123-
if (i == 4) REQUIRE(s[3] == "");
124-
}
125-
126-
}
127-
1287
TEST_CASE("Clean Plugin Name") {
1298

1309
reaper_plugin_info_t info{};

0 commit comments

Comments
 (0)