Service both VST3 parameter channels, and promote pitch key-track and Trigger length so all 44 ids issue

The SDK's own single-component sample drains inputParameterChanges in
process() and implements setParamNormalized; automation was reading the
GUI channel alone. The audio thread now patches a block it solely owns.
This commit is contained in:
2026-08-02 16:22:17 -04:00
parent bfaa0f2614
commit de5654fb6f
44 changed files with 1205 additions and 302 deletions
+12 -11
View File
@@ -150,22 +150,23 @@ static void testTheExposedSetIsExactlyThePredicateAnswer() {
}
}
static void testAReservedRowIsNumberedButNotIssued() {
// Key-track (pitch) and Trigger length are note-on-latch candidates that still route through
// the reload tier, so they are NOT issued to the host today. Their numbers stay reserved
// rather than retired: nothing shipped under them, so a later promotion issues the same id
// and no other id moves.
static void testEveryNumberedRowIsIssued() {
// Key-track (pitch) and Trigger length were reserved-but-unissued while they routed through
// the reload tier; both are note-on-latched now, so both are issued under the numbers that
// were held for them and no other id moved — which is what the block-and-step scheme bought.
CHECK(paramIdFor(DeckParam::kKeyTrack) == 1000);
CHECK(paramIdFor(DeckParam::kTrigLength) == 1450);
CHECK(!isExposed(DeckParam::kKeyTrack));
CHECK(!isExposed(DeckParam::kTrigLength));
CHECK(exposedRowFor(1000) == nullptr);
CHECK(exposedRowFor(1450) == nullptr);
CHECK(isExposed(DeckParam::kKeyTrack));
CHECK(isExposed(DeckParam::kTrigLength));
CHECK(exposedRowFor(1000) != nullptr);
CHECK(exposedRowFor(1450) != nullptr);
// Master gain IS issued: one atomic store the audio thread picks up next block is the live
// tier by that tier's own definition.
CHECK(isExposed(DeckParam::kMasterGain));
CHECK(exposedRowFor(1700) != nullptr);
CHECK(exposedParams().size() == paramTable().size() - 2);
// The whole table is issued today — 44 of 44.
CHECK(exposedParams().size() == paramTable().size());
CHECK(exposedParams().size() == 44);
}
static void testEveryRowCarriesADistinctTitleAndShortTitle() {
@@ -186,7 +187,7 @@ int main() {
testAnInnerDialSitsBesideTheKnobItShapes();
testABlockCarriesOnlyItsOwnGroup();
testTheExposedSetIsExactlyThePredicateAnswer();
testAReservedRowIsNumberedButNotIssued();
testEveryNumberedRowIsIssued();
testEveryRowCarriesADistinctTitleAndShortTitle();
if (g_fail == 0) std::printf("param_id: all tests passed\n");
return g_fail == 0 ? 0 : 1;