Skip to content

Using the CORE Library

Guía completa para entender y usar la biblioteca 04_CORE en tus proyectos


🎯 ¿Qué es 04_CORE?

04_CORE es la biblioteca base compartida de AudioLab. Es el "motor" que proporciona toda la funcionalidad fundamental que necesitan los plugins y módulos de audio.

Analogía Simple

┌────────────────────────────────────────────┐
│  TU PLUGIN (Delay, Reverb, Compressor)     │
│           ↓ usa                            │
├────────────────────────────────────────────┤
│  04_CORE (Motor compartido)                │
│  - RingBuffer, Parameters, AudioProcessor  │
│           ↓ usa                            │
├────────────────────────────────────────────┤
│  STL/OS (std::vector, threading)           │
└────────────────────────────────────────────┘

Piensa en 04_CORE como: - Motor de coche → Tu plugin es el coche específico (sedan, SUV, deportivo) - React/Vue → Tu plugin es la aplicación web específica - Unity Engine → Tu plugin es el juego específico


🏗️ Arquitectura de CORE

Las 16 Subsistemas

CORE está organizado en 5 capas arquitectónicas con 16 subsistemas:

LAYER 5: Cross-Cutting (12-15)
├── 04_12_error_recovery       # Manejo de errores
├── 04_13_platform_abstraction  # Windows/Mac/Linux
├── 04_14_audio_test_utilities  # Testing tools
└── 04_15_core_config           # Configuración

LAYER 4: Plugin Infrastructure (08-11)
├── 04_08_parameter_system      # Parámetros con smoothing
├── 04_09_plugin_lifecycle      # Lifecycle management
├── 04_10_audio_processor       # Clase base para plugins
└── 04_11_state_serialization   # Save/load presets

LAYER 3: Audio Processing (05-07)
├── 04_05_buffer_management     # AudioBuffer, multi-canal
├── 04_06_threading_architecture # Threads RT-safe
└── 04_07_event_dispatcher      # GUI ↔ Audio communication

LAYER 2: Memory & Safety (03-04)
├── 04_03_memory_management     # RingBuffer, PoolAllocator
└── 04_04_realtime_safety       # RT-safe patterns, lock-free

LAYER 1: Foundation (00-02)
├── 04_00_type_system           # Sample, SIMD types
├── 04_01_core_interfaces       # IAudioProcessor, etc.
└── 04_02_math_primitives       # DSP math, fast sin/cos

Dependencias Entre Capas

graph TD
    L1[Layer 1: Foundation] --> L2[Layer 2: Memory & Safety]
    L2 --> L3[Layer 3: Audio Processing]
    L3 --> L4[Layer 4: Plugin Infrastructure]
    L4 --> L5[Layer 5: Cross-Cutting]

    L1 -.->|"usa"| STL[C++ STL]
    L5 -.->|"usa todo"| L1

Regla de oro: Capas superiores usan capas inferiores, NUNCA al revés.


💡 Por Qué Existe CORE

Problema: Código Duplicado

Sin CORE, cada plugin reimplementa lo mismo:

// En delay_plugin.cpp
class MyRingBuffer { /* 200 líneas */ };
class MyParameter { /* 150 líneas */ };
class MyAudioProcessor { /* 300 líneas */ };

// En reverb_plugin.cpp
class MyRingBuffer { /* 200 líneas - DUPLICADO! */ };
class MyParameter { /* 150 líneas - DUPLICADO! */ };
class MyAudioProcessor { /* 300 líneas - DUPLICADO! */ };

// En compressor_plugin.cpp
class MyRingBuffer { /* 200 líneas - DUPLICADO! */ };
// ... más duplicación

Resultado: 650 líneas × 10 plugins = 6,500 líneas duplicadas 😱

Solución: CORE como Biblioteca Compartida

Con CORE, escribes una vez, usas infinitas:

// En 04_CORE/04_03_memory_management/ring_buffer.hpp
class RingBuffer { /* 200 líneas - UNA VEZ */ };

// En delay_plugin.cpp
#include "04_CORE/.../ring_buffer.hpp"
RingBuffer<float> delayLine;  // ← 1 línea

// En reverb_plugin.cpp
#include "04_CORE/.../ring_buffer.hpp"
RingBuffer<float> combFilter;  // ← 1 línea

// En compressor_plugin.cpp
#include "04_CORE/.../ring_buffer.hpp"
RingBuffer<float> lookAhead;  // ← 1 línea

Resultado: 200 líneas escritas una vez, reutilizadas 1000+ veces 🎉


🔧 Cómo Se Usa CORE

1. Compilación como Biblioteca

CORE se compila a una biblioteca estática que otros proyectos enlazan:

# En 04_CORE/CMakeLists.txt
add_library(audiolab_core STATIC
    04_00_type_system/sample.hpp
    04_03_memory_management/ring_buffer.hpp
    04_07_event_dispatcher/event_dispatcher.cpp
    04_10_audio_processor/audio_processor.hpp
    # ... todos los componentes
)

# Resultado: libaudiolab_core.a (Linux/Mac) o audiolab_core.lib (Windows)

2. Enlace desde Tu Proyecto

Tu plugin/módulo enlaza con CORE:

# En tu plugin/CMakeLists.txt
add_library(my_delay_plugin SHARED
    delay_plugin.cpp
)

# ⚡ ENLAZA con CORE (la magia ocurre aquí)
target_link_libraries(my_delay_plugin
    PRIVATE audiolab_core  # ← Importa toda la funcionalidad
)

3. Uso en Código

Simplemente incluyes los headers que necesitas:

// En delay_plugin.cpp
#include "04_CORE/04_10_audio_processor/audio_processor.hpp"
#include "04_CORE/04_03_memory_management/ring_buffer.hpp"
#include "04_CORE/04_08_parameter_system/parameter.hpp"

using namespace audiolab::core;

class DelayPlugin : public AudioProcessor {
private:
    RingBuffer<float> delayLine_;        // ← De CORE
    Parameter<float> delayTime_;         // ← De CORE
    // Solo escribes la lógica del delay
};

📦 Qué Ofrece CORE

Componentes Más Usados

Componente Subsistema Para Qué Se Usa Ejemplo
AudioProcessor 04_10 Clase base para plugins class MyPlugin : public AudioProcessor
RingBuffer 04_03 Delay lines, reverb, chorus RingBuffer<float> delay(48000);
Parameter 04_08 Controles con smoothing Parameter<float> gain("Gain", 0, 10, 1);
EventDispatcher 04_07 GUI ↔ Audio messaging EventDispatcher::instance().dispatch(event);
AudioBuffer 04_05 Buffers multi-canal AudioBuffer<float> buffer(2, 512);
PoolAllocator 04_03 Voices, eventos (RT-safe) PoolAllocator<128> voicePool(64);
WaitFreeSPSC 04_04 Queue lock-free WaitFreeSPSC<Event, 256> queue;
FastMath 04_02 Sin/cos rápidos fast_sin(phase); // 1000x faster

API Highlights

AudioProcessor (Plugin Base)

class MyPlugin : public AudioProcessor {
protected:
    // Allocate resources
    void on_prepare(const ProcessorConfig& config) override {
        delayBuffer_.resize(config.sample_rate * 2.0);
    }

    // RT-safe processing (MUST implement)
    void on_process(const float* const* inputs,
                    float** outputs,
                    uint32_t num_samples) noexcept override {
        // Your DSP here
    }

    // Release resources
    void on_release() override {
        delayBuffer_.clear();
    }
};

RingBuffer (Delay Line)

RingBuffer<float> delay(48000);  // 1 second @ 48kHz

// Write samples
delay.write(inputSample);

// Read with delay
float delayed = delay.read(12000);  // 250ms ago

// Read with interpolation (fractional delay)
float smoothDelayed = delay.readInterpolated(delaySamples);

Parameter (Controls)

Parameter<float> gain("Gain", 0.0f, 10.0f, 1.0f);  // min, max, default

// Set from GUI (thread-safe)
gain.set(newValue);

// Get in audio thread (RT-safe, smoothed)
float currentGain = gain.get();

🚀 Ejemplo Completo

Ver Delay Plugin Example para código completo funcional.

Estructura del Ejemplo

DelayPlugin
├── Hereda: AudioProcessor (CORE)
├── Usa: RingBuffer<float> (CORE)
├── Usa: Parameter<float> × 3 (CORE)
└── Implementa: on_process() (TU código)

Líneas de código:
- Tu código DSP: ~50 líneas
- CORE código usado: ~2000 líneas (gratis)
- Ratio: 1:40 (escribes 1, obtienes 40)

Main Takeaways del Ejemplo

  1. Lifecycle automático: prepare→activate→process→deactivate→release
  2. RT-safety garantizado: on_process() es noexcept, no puede alocar
  3. Thread-safety built-in: Parámetros actualizables desde GUI sin locks
  4. Zero boilerplate: Solo implementas la lógica DSP

📊 Beneficios Cuantificados

Reducción de Código

Sin CORE Con CORE Ahorro
800 líneas/plugin 150 líneas/plugin 81%
20 días/plugin 3 días/plugin 85%
100% bugs propios 20% bugs propios 80%

Calidad Garantizada

RT-Safety: Verificado con tests exhaustivos ✅ Thread-Safety: Lock-free donde importa ✅ Performance: SIMD, fast-math, zero-alloc ✅ Portabilidad: Windows/Mac/Linux/ARM ✅ Testing: 80%+ code coverage


🎓 Próximos Pasos

1. Explora la Arquitectura

Lee Architecture Overview para entender las 5 capas y cómo interactúan.

2. Construye Tu Primer Plugin

Sigue Building Plugins Tutorial para crear un plugin desde cero.

3. Estudia el Ejemplo

Clona y modifica Delay Example: - Cambia el algoritmo (reverb, chorus) - Añade parámetros - Experimenta con CORE

4. Explora Subsistemas

Cada subsistema tiene README detallado: - 04_00_type_system - 04_03_memory_management - 04_04_realtime_safety - 04_10_audio_processor - ...y 12 más


🔗 Referencias


Resumen en una frase:

CORE hace todo el trabajo aburrido (lifecycle, RT-safety, threading) para que tú solo escribas la magia DSP. 🎵


¿Preguntas? Consulta los READMEs individuales o el ejemplo funcional.