# Fundamentos de Arquitectura

**I/O** se basa en el concepto de contexto de audio o `AudioGraph`

Un **grafo de nodos** define el recorrido del sonido desde su fuente de origen—*que puede ser, por ejemplo, un archivo de audio*— hasta el dispositivo de salida.

A medida que el flujo atraviesa cada nodo, sus propiedades pueden modificarse.&#x20;

En este esquema, los **nodos** se representan como bloques y las conexiones como enlaces direccionales, pudiendo existir múltiples entradas y salidas por nodo. De forma predeterminada, si un nodo recibe varias conexiones, **I/O** suma todas las señales recibidas.

#### **Hilos**

Los **sistemas de audio** de *baja latencia* suelen implementarse mediante funciones de `callback`, en las que el sistema operativo invoca al programa cada vez que es necesario generar audio para que la reproducción continúe sin interrupciones.&#x20;

La ejecución ocurre en un hilo de **alta prioridad**, cruzar los límites o añadir almacenamiento intermedio inevitablemente introduce **latencia** y menor toleracia a fallos.

**I/O** se implementa utilizando un *hilo de control y un hilo de renderizado*.&#x20;

El **hilo de control** es aquel desde el que se instancia el `AudioGraph` y en el que los desarrolladores manipulan el grafo, invocando operaciones. El **hilo de control** utiliza un *event loop* mientras que el hilo de renderizado emplea un bucle especializado, donde se calcula la salida de audio en respuesta a las acciones realizadas desde el hilo de control.

La comunicación entre hilos se realiza mediante **mensajes** de control, mientras que en la dirección contraria se lleva a cabo mediante tareas regulares del event loop.&#x20;

#### Automatizaciones

Una de las principales fortalezas de **I/O** es que incorpora un *modelo de temporización* de baja latencia. La **temporización** permite programar eventos para que ocurran en momentos específicos del futuro, lo cual resulta útil en escenas y en aplicaciones espaciales.&#x20;

Una de las funciones que ofrece el contexto de audio en **I/O** es un modelo de temporización consistente y un marco de referencia temporal propio.

{% hint style="info" %}
El diseño basado en **dos hilos** permite que el *procesamiento de audio* ocurra de forma determinista sin bloquear la **UI** ni comprometer la **estabilidad del sistema**. Las operaciones del grafo se validan en el *hilo de control* y se ejecutan asíncronamente en el de *renderizado*.
{% endhint %}

#### **Operaciones**

En **I/O**, las operaciones sobre un `AudioNode` se dividen en dos fases:&#x20;

* Una **síncrona**, que se ejecuta en el hilo de control para cambio de parámetros.
* Una **asíncrona**, que se realiza en el hilo de renderizado mediante un mensaje encolado.&#x20;

Esto garantiza seguridad al modificar parámetros o estados sin bloquear el procesamiento. Si una operación A se invoca antes que una B, tanto sus fases síncronas como asíncronas deben ejecutarse en el mismo orden, evitando cualquier *reordenamiento*.

#### **Nodos**

Los nodos pueden clasificarse básicamente en *tres categorías*.&#x20;

Los nodos **fuente** (`Renderer`) abarcan elementos como búferes de audio, entradas en vivo y osciladores, por otra parte, los nodos de **procesamiento** incluyen filtros, convolvers, panners y otros efectos; los nodos de **análisis** engloban analizadores.

Aunque el nodo destino final suele ser un sistema de reproducción como los altavoces, **I/O** también permite procesar audio sin reproducirlo —*por ejemplo, visualización o procesamiento offline,* donde el flujo de audio se guarda en un búfer para su uso posterior.

La salida de cualquier nodo en **I/O** puede conectarse a la entrada de otro nodo.

En entornos interactivos, múltiples fuentes se combinan para conformar la mezcla final. Estas pueden incluir música de fondo, efectos, señales de retroalimentación de UI, et&#x63;**.** Una vez establecido el grafo, éste puede modificarse de forma dinámica.

**I/O** ofrece control independiente sobre canal, así como sobre el conjunto completo.&#x20;

{% hint style="info" %}
Cuando un `AudioNode` recibe **varias entradas**, ajusta los canales mediante mezcla ascendente o descendente para mantener *compatibilidad entre señales*. En nodos con **tail-time**, los cambios de canales se aplican solo cuando la señal anterior deja de influir.&#x20;
{% endhint %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.comdigis.com/i-o/fundamentos-de-arquitectura.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
