Compartir a través de


Composición de varios circuitos ACX

En este tema se describe la composición de varios circuitos ACX. Para obtener información general sobre ACX y la lista de términos de ACX, consulte Introducción a las extensiones de clase de audio de ACX.

Como se describe en Resumen de objetos ACX, un AcxCircuit representa una ruta de acceso de audio parcial o completa a un dispositivo de audio percibido por el usuario (altavoces, micrófonos, etc.). Un AcxCircuit tiene al menos un pin de entrada y un pin de salida (ACXPIN) y puede agregar uno o varios objetos similares a AcxElements. Para obtener información general, consulte Circuitos ACX.

Composición del circuito ACX

ACX enlaza los circuitos hasta que forman un camino de audio completo. ACX usa enlaces de audio para conectar circuitos de audio juntos. Al mismo tiempo, cada circuito ACX se convierte en un filtro KS, estos filtros KS los detecta el Generador de puntos de conexión de audio (AEB) que se ejecuta como servicio en modo de usuario. AEB examina el gráfico de filtros KS detectado y crea un extremo de audio de software que representa la infraestructura de audio subyacente al detectar una ruta de audio completa.

En el diagrama siguiente se muestran los objetos ACX usados por ACX para detectar, compilar y supervisar los circuitos que componen el punto de conexión de audio compuesto.

Diagrama que muestra la arquitectura objetivo de ACX con ACXCIRCUITTEMPLATE, ACXCOMPOSITEMANAGER, ACXMANAGER, ACXCIRCUITFACTORY y ACXCIRCUIT.

Importante

Tenga en cuenta que solo los tipos que se muestran en azul son públicos: ACXCIRCUITTEMPLATE, ACXCOMPOSITETEMPLATE (no se muestra), ACXMANAGER, ACXCIRCUITFACTORY y ACXCIRCUIT. Todos los tipos que se muestran en violeta son internos y se enumeran aquí solo con fines ilustrativos. No se garantiza que los tipos internos permanezcan iguales o estén disponibles en diferentes versiones de ACX, y no se deben llamar ni utilizar directamente.

El administrador de ACX analiza las plantillas de circuito durante la inicialización de los controladores cuando los controladores de ACX los registran con el administrador de ACX. Los controladores de ACX registran plantillas compuestas y vinculaciones mediante ACXCIRCUTTEMPLATES (#1).

Cuando el administrador de ACX recibe una plantilla de circuito, comprueba si se trata de una plantilla de instancia o una plantilla de clase genérica.

Para las plantillas de instancia, ACX crea un ACXCOMPOSITEMANAGER (#4), para plantillas de clase genéricas, ACX crea un ACXCOMPOSITEFACTORY (#2), que es responsable de crear elementos ACXCOMPOSITEMANAGER (#3) cuando detecta el circuito "core" del compuesto. Los circuitos principales son los circuitos que proporcionan la identidad a un punto de conexión de audio compuesto.

AcXCOMPOSITEMANAGER crea el ACXCOMPOSITE (#5) para representar el punto de conexión compuesto de audio subyacente. El gestor compuesto es responsable de supervisar cualquier segmento opcional del circuito que pueda surgir tras la creación o inicialización de la composición.

A su vez, ACXCOMPOSITE crea un ACXCIRCUITMANAGER (#6) para cada circuito que forma parte de la composición. ACXCIRCUITMANAGER es responsable de crear, supervisar y controlar un único circuito (#7).

Puede ser posible que un circuito se etiquete "a petición", en tal caso, el ACXCIRCUITMANAGER busca su fábrica de circuitos y solicita un nuevo circuito para el compuesto (#8). ACXCIRCUITFACTORY crea un ACXCIRCUIT según la solicitud (#9).

Cuando se detectan y activan todos los ACXCIRCUIT, ACXCOMPOSITE también se activa e indica al ACXCIRCUITMANAGERS que active las interfaces de "audio" para sus circuitos.

En el diagrama de secuencia siguiente se muestra cómo se enlazan dos circuitos ACX (Circuito A y B) para crear una ruta de acceso de audio completa, representada por el generador de puntos de conexión de audio (AEB) con un dispositivo de audio de software.

Diagrama con columnas etiquetadas Driver A, Driver B, ACX Interface B, Circuit Manager A y B, ACX Composite y ACX Manager, que ilustran la secuencia de llamada con flechas de flujo entre las columnas.

Negociación de formato multicircuito

En esta sección se describe la negociación de formato que tiene lugar cuando el punto de conexión de audio está compuesto por dos o más circuitos. Para obtener información general sobre los circuitos ACX, consulte Comunicaciones entre controladores de varias pilas de ACX.

Pines de puente de nivel inferior

Los pines de puente de nivel inferior son los pines que envían datos a (representar) o reciben datos de (captura) de un dispositivo de audio físico directa o indirectamente. Este tipo de pines pueden o no tener ACXMODEFORMATLISTs asociados con ellos. Estos pines de puente tienen un tipo "AcxPinQualifierBridgeB" o "AcxPinQualifierBridgeDevice". Para obtener más información sobre ACXMODEFORMATLIST, consulte el archivo de cabecera acxdataformat.h.

Diagrama que muestra el flujo de datos de representación y captura entre un pin de streaming, dos circuitos y un dispositivo.

En este diagrama y en este artículo, se utilizan los términos flujo ascendente y flujo descendente para describir la dirección del flujo, ya que la dirección de este flujo depende de si las patillas están enviando datos para renderizar o recibiendo datos para capturar.

Patillas de puente de nivel inferior sin ACXMODEFORMATLIST(s)

Un controlador puede optar por no exponer listas de formato de modo en su pin de nivel inferior. Si las listas de formato de modo no están disponibles en un pin de puente de versión inferior, un usuario (a través del panel de control de sonido) u otra entidad de software no puede controlar o especificar directamente el formato de audio de este pin y de las secuencias asociadas. Estos son algunos escenarios en los que no se necesitan estas listas:

  • Circuitos de solo streaming que se pueden conectar a un circuito DSP, a un circuito CODEC o directamente al dispositivo de audio. Estos circuitos simplemente mueven los datos del punto A al punto B sin modificarlos. Estos circuitos no cambian la frecuencia de muestreo de datos de las secuencias entrantes o salientes. En este caso, las listas de formato de modo están asociadas al pin de nivel superior.

  • Circuitos de flujo único sin elementos que modifican la frecuencia de muestreo entrante/saliente. Un ejemplo de esto es el circuito del dispositivo de audio USB. En este escenario, las listas de modos de formato están asociadas al pin superior.

La ausencia de la lista de formatos de datos implica que el formato de datos del flujo proveniente de este pin es compatible con uno de los formatos de datos del pin de nivel superior conectado del circuito.

Pasadores de puente de nivel inferior con ACXMODEFORMATLIST(s)

Un controlador puede optar por exponer listas de formato de modo en sus pines de nivel inferior. Si las listas de formato de modo están disponibles en un pin de puente de nivel inferior, un usuario (a través del panel de control de sonido) u otra entidad de software puede controlar o especificar directamente el formato de audio de este pin y secuencias asociadas.

Estos son algunos escenarios válidos en los que se usan estas listas de formato de modo:

  • Circuitos DSP: normalmente este tipo de circuitos admite varias secuencias que se ejecutan a diferentes velocidades de muestra, estas secuencias se convierten internamente en una frecuencia de muestreo común y se mezclan antes de que los datos se muevan al circuito siguiente. La lista de formato de datos controla/especifica la velocidad de muestreo final para este circuito.

Cuando la lista de formato de datos está presente, estos formatos de datos deben coincidir con ejemplos de formato de datos en el pin de nivel superior del pin del circuito siguiente. Tenga en cuenta que los modos no necesitan coincidir, consulte la explicación de los modos, en las secciones siguientes.

Las listas de formato de nivel inferior ofrecen la oportunidad de que el usuario o la capa superior controlen el formato de la secuencia resultante, en este caso, el valor predeterminado de la lista es la frecuencia de muestreo utilizada hasta que se realiza una acción explícita para cambiar el formato de este pin.

Para obtener más información sobre las listas de formato, consulte el archivo de cabecera acxdataformat.h.

Pines de puente de nivel superior

Los pines de puente de nivel superior son los pines que reciben datos de (representar) o envían datos a (capturar) un módulo de software directa o indirectamente. Este tipo de pines deben tener ACXMODEFORMATLISTs asociados a ellos. Estos pines de puente tienen un tipo "AcxPinQualifierBridgeA".

El diagrama anterior que se muestra aquí de nuevo, también se puede usar para mostrar el flujo de datos de representación y captura entre un pin de streaming, dos circuitos y un dispositivo.

Diagrama que muestra el flujo de datos de representación y captura entre un pin de transmisión, dos circuitos y un dispositivo. Las flechas indican que el flujo de datos de representación va hacia la derecha y el de captura también hacia la derecha.

Patillas de nivel superior [Bridge] sin ACXMODEFORMATLIST(s)

Los pines de nivel superior sin listas de formato de modo no son una combinación válida y esto provoca una mala configuración del punto de conexión. El punto de conexión no es visible desde el punto de vista del usuario.

Mejorar [Bridge] pines con ACXMODEFORMQATLIST(s)

Los pines de nivel superior siempre deben tener uno o varios ACXMODEFORMATLISTs. Las listas con formato de modo especifican todas las tasas de muestreo posibles para un modo y su frecuencia de muestreo predeterminada. Los distintos modos pueden tener diferentes conjuntos de frecuencias de muestreo. La frecuencia de muestreo predeterminada es la frecuencia de muestreo preferida para ese modo.

Modos y circuitos

Los pines de nivel superior de circuitos de flujo único o de múltiples flujos pueden admitir una o más listas de formatos de modo. Los circuitos de flujo único tienen un modo activo a la vez, mientras que los circuitos de varias secuencias pueden tener dos o más secuencias que se ejecutan al mismo tiempo con diferentes modos.

Mapeo de modos

En esta sección se proporciona una breve introducción de los modos de operación estándar y se explica por qué se usa el mapeo de "modo".

Modo RAW: el flujo o circuito no aplica ningún efecto en la secuencia (excepto para las restricciones de volumen, silenciación y seguridad, como la protección del altavoz).

Modo DEFAULT: el flujo o circuito realiza algún efecto predeterminado.

<mode_name> mode: el flujo/circuito aplica efectos específicos del modo <mode_name> seleccionado.

Es obligatorio que los pines de streaming admitan el modo bruto y/o predeterminado. Es opcional que los pines de streaming admitan cualquier otro <mode_name> modes.

En un punto de conexión compuesto, puede ser posible que el circuito de nivel superior admita varios modos y que los circuitos de nivel inferior solo admitan RAW o DEFAULT.

Ejemplo en un punto de conexión de dos circuitos:

  • El pin de nivel inferior del circuito de nivel superior admite los modos y los formatos asociados m1{f1,f2} y m2{f3,f4}, es decir, esto significa que la secuencia del pin tiene un formato f1 o f2 cuando se usa m1, o un formato de f3 o f4 cuando se usa m2. Esto supone que el circuito de nivel superior es un circuito de flujo único.

  • El pin de nivel superior del circuito de nivel inferior admite el modo predeterminado{f1,f2,f3}.

En este caso, el modo de la secuencia se convierte del modo <mode_name> al modo predeterminado, mientras mantiene las mismas frecuencias de muestreo.

m1/f1 a > predeterminado/f1

m1/f2 a > predeterminado/f2

m2/f3 a > predeterminado/f3

Entrada no válida: m2/f4 a > Ninguno

El controlador realiza la asignación de modo con la ayuda de ACX. En la tabla anterior, la última entrada no es válida, el pin de nivel inferior del circuito de nivel superior debe quitar el m2/f4 como opción para sus formatos admitidos. Tenga en cuenta que esto podría haber ocurrido al revés, es decir, el pin de nivel superior del circuito de nivel inferior también podría haber soportado f4 y f5. En cuyo caso se admitía default-f4, pero no default-f5. En tal caso, es el pin superior del circuito inferior el responsable de no enumerar m?/f5 como opción de su lista. En otras secciones siguientes se explica este proceso.

Formato de negociaciones

Antes de que ACX habilite las interfaces de audio de los circuitos que componen el dispositivo compuesto, se asegura de que los circuitos puedan negociar el modo o los formatos de los datos de audio. ACX realiza esta notificación de circuito invocando el callback de inicialización compuesto en todos los circuitos de la composición. La secuencia va desde el nivel inferior (lado del dispositivo) hasta el nivel superior (lado del sistema). Los circuitos tienen la oportunidad de actualizar sus formatos durante esta fase.

Pantalla de control de formato del dispositivo

La lógica actual del panel de control de sonido muestra la lista de formato de dispositivo de la siguiente manera:

  • Si el dispositivo de audio admite un elemento de motor de audio, la lista de formatos de datos que se muestran en el panel de control es la lista de formato de datos del dispositivo, es decir, la lista de formato de datos adjunta al pin de nivel inferior (que está conectado al pin de salida del elemento del motor de audio).
  • Si el dispositivo de audio no admite un elemento del motor de audio, la lista de formatos de datos que se muestra en el panel de control es la lista de formato de datos de pin de flujo, es decir, la lista de formato de datos asignada al pin de nivel superior.

Creación automática de flujos descendentes en múltiples circuitos

ACX usa objetos ACXSTREAMBRIDGE asociados a un pin de puente de nivel inferior para propagar automáticamente la solicitud de flujos de creación a circuitos remotos.

Cuando una aplicación cliente crea una secuencia, esa solicitud se recibe por primera vez mediante un pin de streaming. ACX notifica al controlador que posee el pin de streaming sobre la solicitud de creación de flujo a través de la devolución de llamada proporcionada, especificada al momento de la creación del circuito. En el callback, el controlador crea un objeto ACXSTREAM que representa la secuencia y luego devuelve el control a ACX. Cuando ACX recibe el control, comprueba si necesita reenviar esta solicitud de creación al siguiente circuito (nivel inferior). Opcionalmente, el controlador puede reenviar la solicitud de creación al siguiente circuito (nivel inferior) antes de volver desde la devolución de llamada de create-stream. Esta última opción permite que el controlador realice operaciones posteriores después de que los circuitos de nivel inferior tuvieran la oportunidad de procesar sus solicitudes de creación.

ACX usa la siguiente lógica predeterminada para la creación de flujos:

  • Si no hay ningún pin de puente de nivel inferior, todo listo.
  • Si el controlador ya ha asociado manualmente la secuencia con ACXSTREAMBRIDGE, todo listo.
  • Si el pin de puente de nivel inferior no tiene un ACXSTREAMBRIDGE para el MODO especificado, rechace la solicitud.
  • ACX agrega la nueva secuencia creada por el controlador usando el ACXSTREAMBRIDGE recuperado.

ACXSTREAMBRIDGE actúa como un sistema de múltiple entrada y una sola salida. Siempre que haya una corriente de entrada, ACXSTREAMBRIDGE mantiene un flujo de salida presente. El flujo de salida solo se elimina cuando se quita el último flujo de entrada. ACXSTREAMBRIDGE usa los ACXDATAFORMATLISTs asociados con el pin de puente de nivel inferior al decidir el modo y el formato que se usarán para el circuito remoto.

ACXSTREAMBRIDGE usa la siguiente lógica para seleccionar el modo de flujo de salida y el formato de datos:

  • Si no se especifica MODE para out-stream, compruebe si hay una lista de formato "predeterminado".

  • Si no se ha especificado el MODO para el flujo de salida y la lista de formatos "default" no está presente, compruebe si hay una lista de formatos "raw".

  • Si MODE es NULL_GUID, compruebe si hay una lista de formato asociada al MODO de la primera secuencia en streaming.

  • Si se especifica MODE, compruebe si hay una lista de formato para este MODO.

  • Si se encuentra la lista de formatos, obtenga el formato predeterminado de la lista de formatos.

  • Si no se encuentra el formato, ACXSTREAMBRIDGE usa el formato de la primera secuencia.

  • ACXSTREAMBRIDGE construye una solicitud de creación de secuencia utilizando ACXTARGETSTREAM, empleando el MODO recuperado y el formato de datos como se indica a continuación:

    • Si se especificó MODE, se usa mode.
    • Si MODE era NULL_GUID, se usa el MODO del primer flujo entrante.
    • En caso contrario, no se utilizará ningún modo.

ACX se encarga de eliminar o cerrar la secuencia de destino cuando se quita la última secuencia en secuencia.

Otro trabajo de ACXSTREAMCIRCUIT es propagar automáticamente un estado de flujo a lo largo de la cadena de streaming.

Un controlador tiene la oportunidad de desactivar la creación del puente de flujo remoto del circuito predeterminado llamando a AcxCircuitInitDisableDefaultStreamBridgeHandling o asociando manualmente el objeto ACXSTREAM con acXSTREAMBRIDGE antes de devolver el control a ACX. En este último caso, la secuencia remota se crea antes de que el controlador regrese de la función de devolución de llamada 'create-stream' EVT_ACX_CIRCUIT_CREATE_STREAM.

En el caso de circuitos que utilizan varios pines de captura/renderización, como host/offload/loopback/kws, es decir, cuando el elemento audio-engine está admitido, el controlador debe crear un stream-bridge sin especificar ningún modo y agregar manualmente los objetos ACXSTREAM entrantes al stream-bridge al procesar el callback de creación de secuencia.

Para obtener más información sobre la creación de puentes de flujo, consulte:

Propagación automática del estado de flujo multicircuito a flujos de nivel inferior

ACXSTREAMBRIDGE propaga automáticamente una solicitud de estado de flujo hacia abajo a circuitos remotos. Cuando cambia el estado de una secuencia, ACXSTREAMBRIDGE calcula el estado mixto de la secuencia de salida y envía esa nueva solicitud "stream-state" a la secuencia remota mediante ACXTARGETSTREAM.

ACXSTREAM junto con ACXSTREAMBRIDGE usan la siguiente lógica:

  • Cambie primero los estados de los flujos de nivel superior en estos escenarios:

    • Render y transición desde Stop-Run>
    • Capturar y pasar de Ejecutar a Parar>
    • Transición de Run a Stop>
  • Cambie los estados de las secuencias de nivel superior por última vez en estos escenarios:

    • Renderizar && ir desde Ejecutar-Detener
    • Capturar y pasar del estado Parar-Ejecutar>
    • Otros yendo desde Stop-Run>

Los controladores tienen una opción para invertir este orden a través de una configuración.

Nota:

Es un requisito que un controlador, un circuito o un flujo siempre realicen correctamente las transiciones de ejecución a detención. Por otro lado, se permite que un controlador produzca un error en la inversa, es decir, de detener para ejecutarse.

Consulte también

Circuitos ACX

Información general sobre las extensiones de clase de audio de ACX

Comunicaciones entre controladores de varias pilas de ACX

Resumen de objetos ACX