Skip to content

🔌 Plugin Validation - Tests de Conformidad

🎯 Bypass Test (Null Test)

El test más importante:

[Input] → [Plugin bypassed] → [Output]

Output debe ser BIT-IDENTICAL a Input

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:

  1. Set todos parámetros a valores únicos/random
  2. Serialize estado completo
  3. Create nueva instancia de plugin
  4. Deserialize estado
  5. 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
  • âś… IEditController en 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:

  1. Feed impulse (single sample = 1.0)
  2. Measure delay to first non-zero output
  3. 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