🔌 Plugin Validation - Tests de Conformidad¶
🎯 Bypass Test (Null Test)¶
El test más importante:
Criterio: Output === Input (bit-perfect) Tolerancia: CERO RazĂłn: Processing leak en bypass es bug crĂtico
🎚️ Automation Smoothness¶
Validar:¶
- Parameter changes sin clicks audibles
- Ramping suave (no discontinuidades)
- Smooth tanto para cambios lentos como rápidos
MĂ©tricas:¶
// Derivada del parámetro debe ser limitada
float maxDerivative = calculateMaxDerivative(parameterRamp);
assert(maxDerivative < SMOOTHING_THRESHOLD);
// No zero-crossings abruptas en señal
bool hasClickArtifacts = detectTransientArtifacts(outputBuffer);
assert(!hasClickArtifacts);
Target: Inaudible bajo cualquier material musical
đź’ľ State Recall (Serialization)¶
Test protocol:¶
- Set todos parámetros a valores únicos/random
- Serialize estado completo
- Create nueva instancia de plugin
- Deserialize estado
- Comparar: todos parámetros deben ser idénticos
Criterio: 100% accuracy Include: Parámetros, estado interno, buffers
📊 Parameter Ranges¶
Validar:¶
// Min/max respetados
setParameter(ID, value);
assert(getParameter(ID) >= minValue);
assert(getParameter(ID) <= maxValue);
// Clamping correcto
setParameter(ID, maxValue + 1000.0f);
assert(getParameter(ID) == maxValue);
// Out-of-range handled gracefully (no crash)
setParameter(ID, NaN); // Must not crash
setParameter(ID, Infinity); // Must not crash
âś… Host Compliance¶
VST3 Specific:¶
- âś…
IAudioProcessor::process()thread-safe - âś…
IEditControlleren thread separado - âś… Latency reporting correcto
- âś… Tail time reporting (para reverbs, delays)
- âś… Preset management funcionando
AU Specific (macOS):¶
- âś…
AudioUnitInitialize()success - âś… Stream format handling
- âś… Property listeners funcionando
- âś… Carbon/Cocoa UI validado
AAX Specific (Pro Tools):¶
- âś… Stem format support
- âś… Sidechain routing
- âś… Delay compensation
- âś… AudioSuite offline processing
🔄 Concurrency & Thread Safety¶
Critical tests:¶
// Simultaneous parameter changes desde UI y automation
std::thread uiThread([&]() { setParameter(ID, 0.5f); });
std::thread automationThread([&]() { setParameter(ID, 0.7f); });
// Must not crash, race condition free
// Audio processing mientras cambios de parámetros
while (audioThreadRunning) {
processBlock(buffer);
// UI thread changing parameters concurrently
}
// Must be glitch-free
📏 Latency Validation¶
Test:¶
- Feed impulse (single sample = 1.0)
- Measure delay to first non-zero output
- Compare con reported latency
Criterio: Reported latency === Measured latency
🎛️ Preset Compatibility¶
Validate:¶
- âś… Load presets from previous versions
- âś… Handle missing parameters gracefully
- âś… Default values sensible para new parameters
- âś… Backward compatibility maintained
🔍 Resource Management¶
Check:¶
// Memory leaks
createPlugin();
processAudio(1000000 iterations);
destroyPlugin();
// Memory usage debe volver a baseline
// CPU usage reasonable
float cpuUsage = measureCPUUsage(processBlock);
assert(cpuUsage < REAL_TIME_THRESHOLD);
// File handles cerrados
int openFilesBefore = getOpenFileCount();
plugin.loadPreset();
int openFilesAfter = getOpenFileCount();
assert(openFilesBefore == openFilesAfter);
âś… Validation Checklist¶
â–ˇ Bypass test passed (bit-perfect)
â–ˇ Automation smooth (no clicks)
â–ˇ State recall 100% accurate
â–ˇ Parameter ranges enforced
â–ˇ Host-specific compliance verified
â–ˇ Thread-safety validated
â–ˇ Latency reporting correct
â–ˇ Preset compatibility checked
â–ˇ Resource management clean
â–ˇ Regression tests passing