Composición de varios circuitos de 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 Información general sobre las extensiones de clase de audio ACX.
Como se describe en Resumen de objetos ACX, un AcxCircuit representa una ruta 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 de circuitos ACX
ACX enlaza los circuitos hasta que forman una ruta de audio completa. ACX usa enlaces de audio para conectar circuitos de audio. 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 analiza el gráfico de filtros KS detectado y crea el punto de conexión de audio de software que representa la infraestructura de audio de subrayado cuando detecta 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.
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 usar directamente.
El administrador de ACX analiza las plantillas de circuito en el momento en que los controladores de ACX los registran con el administrador de ACX. Los controladores de ACX registran plantillas compuestas o enlaces 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 se encarga de crear elementos ACXCOMPOSITEMANAGER (3) cuando detecta el circuito "principal" 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 de audio compuesto de subrayado. El administrador de composición se encarga de supervisar cualquier segmento de circuito opcional que pueda aparecer después de que se haya creado o inicializado la composición.
A su vez, ACXCOMPOSITE crea un ACXCIRCUITMANAGER (6) para cada circuito que forma parte de la composición. ACXCIRCUITMANAGER se encarga de crear, supervisar y controlar un único circuito (7).
Es 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 la composición (8). ACXCIRCUITFACTORY crea un ACXCIRCUIT como 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 audio completa, representada por el generador de puntos de conexión de audio (AEB) con un dispositivo de audio de software.
Negociación de formato de varios circuitos
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 (representar) o reciben datos (capturar) de un dispositivo de audio físico directa o indirectamente. Este tipo de pines puede tener o no ACXMODEFORMATLISTs asociadas. Estos pines de puente tienen un tipo ‘AcxPinQualifierBridgeB’ o ‘AcxPinQualifierBridgeDevice’. Para obtener más información sobre ACXMODEFORMATLIST, consulte el Encabezado acxdataformat.h.
En este diagrama, y en este artículo, se usa el nivel superior y el nivel inferior para describir la dirección del flujo, ya que la dirección del flujo ascendente o descendente depende de si los pines envían datos (representar) o reciben datos (capturar).
Pines de puente de nivel inferior sin ACXMODEFORMATLIST
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 nivel 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 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 secuencia única sin elementos que modifican la frecuencia de muestreo entrante/saliente. Un ejemplo es el circuito del dispositivo de audio USB. En este escenario, las listas de formato de modo están asociadas al pin de nivel superior.
La ausencia de la lista de formato de datos implica que el formato de datos de la secuencia que se origina en este pin es compatible con uno de los formatos de datos del pin de nivel superior del circuito conectado.
Pines de puente de nivel inferior con ACXMODEFORMATLIST
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 con formato de datos controla/especifica la frecuencia 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 permiten 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 listas de formatos, consulte el Encabezado acxdataformat.h.
Pines de puente de nivel superior
Los pines de puente de nivel superior son los pines que reciben datos (representar) o envían datos (capturar) un módulo de software directa o indirectamente. Este tipo de pines debe tener ACXMODEFORMATLIST asociadas. 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.
Pines de [puente] de nivel superior inferior sin ACXMODEFORMATLIST
Los pines de nivel superior sin listas de formato de modo no son una combinación válida y esto da como resultado un punto de conexión mal configurado. El punto de conexión no es visible desde el punto de vista del usuario.
Pines de [puente] de nivel superior con ACXMODEFORMQATLIST
Los pines de nivel superior siempre deben tener una o varias ACXMODEFORMATLIST. 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 secuencia única o circuitos de varias secuencias pueden admitir una o varias listas de formato de modo. Los circuitos de secuencia única 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.
Asignación de modo
En esta sección se proporciona una breve introducción de los modos estándar y se explica por qué se usa la asignación de "modo".
Modo RAW: la secuencia 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: la secuencia o circuito realiza algún efecto predeterminado.
<mode_name> mode
: la secuencia o circuito aplica efectos específicos del modo <mode_name> seleccionado.
Es obligatorio que los pines de streaming admitan el modo sin formato o predeterminado. Es opcional que los pines de streaming admitan cualquier otro <mode_name> modes
.
En un punto de conexión compuesto, es 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 secuencia única.
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 y mantiene las mismas tasas de muestra.
m1/f1 a > default/f1
m1/f2 a > default/f2
m2/f3 a > default/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 m2/f4 como opción para sus formatos admitidos. Tenga en cuenta que esto podría haber ocurrido en la inversa, es decir, el pin de nivel superior del circuito inferior podría haber admitido también f4 y f5. En cuyo caso se admitía default-f4, pero no era default-f5. En tal caso, es el pin de nivel superior del circuito inferior responsable de no enumerar m?/f5 como opción de su lista. En otras secciones siguientes se explica este proceso.
Negociaciones de formato
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 la devolución de llamada compuesta inicializar 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 del panel de control de formato de 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 muestran en el panel de control es la lista de formato de datos de patillas de streaming, es decir, la lista de formato de datos expuesta al pin de nivel superior.
Creación automática de flujos de nivel inferior de varios circuitos
ACX usa objetos ACXSTREAMBRIDGE asociados a un pin de puente de nivel inferior para propagar automáticamente la solicitud de secuencias 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 propietario del pin de streaming la solicitud create-stream a través de la devolución de llamada proporcionada especificada en el tiempo de creación del circuito. En la devolución de llamada, el controlador crea un objeto ACXSTREAM que representa la secuencia y, a continuación, 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 al controlador realizar cualquier operación posterior después de que los circuitos de nivel inferior hayan tenido la oportunidad de procesar sus solicitudes de creación.
ACX usa la siguiente lógica predeterminada para la creación de secuencias:
- 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 acXSTREAMBRIDGE para el modo especificado, genera un error en la solicitud.
- ACX agrega la nueva secuencia que creó el controlador con ACXSTREAMBRIDGE recuperado.
ACXSTREAMBRIDGE actúa como un elemento de entrada múltiple o de salida único. Siempre que haya una secuencia de entrada, ACXSTREAMBRIDGE mantiene una secuencia de salida. La secuencia de salida solo se elimina cuando se quita la última secuencia de entrada. ACXSTREAMBRIDGE usa las ACXDATAFORMATLIST asociadas 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 secuencia de salida y el formato de datos:
Si no se especifica MODE para la secuencia de salida, compruebe si hay una lista de formato "predeterminada".
Si no se especifica MODE para la secuencia de salida y la lista de formato "default" no está presente, compruebe si hay una lista de formato "sin procesar".
Si MODE es NULL_GUID, compruebe si hay una lista de formato asociada al MODO de la primera secuencia de entrada.
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 de entrada.
ACXSTREAMBRIDGE crea una solicitud de creación de secuencia mediante ACXTARGETSTREAM mediante el MODO recuperado y el formato de datos como se indica a continuación:
- Si se especificó MODE, se usa.
- Si MODE es NULL_GUID, se usa MODE de la primera secuencia de entrada.
- De lo contrario, no se usa ningún modo.
ACX se encarga de eliminar o cerrar la secuencia de destino cuando se quita la última secuencia de entrada.
Otro trabajo de ACXSTREAMCIRCUIT es propagar automáticamente un estado de secuencia a lo largo de la cadena de streaming.
Un controlador puede desactivar la creación del puente de la secuencia remota 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 vuelva de la función de devolución de llamada EVT_ACX_CIRCUIT_CREATE_STREAM ‘create-stream’.
En el caso de los circuitos que usan varios pines de captura/representación, como host/offload/loopback/kws, es decir, cuando se admite el elemento motor de audio, el controlador debe crear un puente de secuencia sin ningún tipo de conexión especificado y agregar manualmente los objetos ACXSTREAM entrantes al puente de streaming al procesar la devolución de llamada de creación de secuencias.
Para obtener más información sobre la creación de puentes de streaming, consulte:
Propagación automática del estado de secuencia de varios circuitos a secuencias de nivel inferior
ACXSTREAMBRIDGE propaga automáticamente una solicitud de estado de secuencia 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:
Cambia primero los estados de las secuencias de nivel superior en estos escenarios:
- Representación && de Detener->Ejecutar
- Captura && de Ejecutar->Detener
- Otros && de Ejecutar->Detener
Cambia por último los estados de las secuencias de nivel superior en estos escenarios:
- Representación && de Ejecutar->Detener
- Captura && de Detener->Ejecutar
- Otros && de Detener->Ejecutar
Los controladores tienen una opción para invertir este orden a través de una configuración.
Nota:
Es un requisito para que un controlador, un circuito o secuencia siempre realice correctamente las transiciones de secuencia de ejecución a detención. Por otro lado, se permite que un controlador falle al revés, es decir, de detención a ejecución.
Consulte también
Información general sobre las extensiones de clase de audio de ACX