Skip to main content
Un componente clave del sistema de audio de XBOX One es el motor de procesamiento de audio de hardware escalable (SHAPE), que hace lo siguiente:
  • Realiza de forma eficiente funciones de audio de uso común mediante bloques de hardware de función fija: XMA, convertidor de frecuencia de muestreo (SRC), ecualizador y compresión, y filtro/volumen
  • Proporciona un procesador de control de audio (ACP) integrado y programable para controlar estos bloques
Los siguientes elementos están disponibles para el funcionamiento a alta velocidad y para minimizar el tráfico en el bus de memoria principal.
  • Un proceso de acceso directo a memoria (DMA) para acceder a la memoria del sistema
  • Memoria interna especial, denominada búferes de mezcla Un búfer de mezcla es un bloque de memoria que almacena un fotograma de audio completo de datos. El hardware SHAPE normalmente lee de uno o dos búferes de mezcla y escribe en un búfer de mezcla de salida. Hay algunas excepciones a este proceso general, como la descodificación XMA y los bloques DMA y SRC.
Muchos títulos no implementan grafos de flujo directamente. XAudio2 y el middleware de audio implementan los componentes SHAPE de forma implícita. Sin embargo, construir grafos de flujo proporciona la mayor flexibilidad y acceso a las capacidades de aceleración de audio de la consola XBOX One. Este tema proporciona información general sobre el hardware SHAPE y los bloques de funciones.

Flujo de control

El siguiente es un flujo de control típico para el procesamiento de audio.
  1. Se carga un archivo de datos de audio XMA comprimido en la memoria principal del sistema.
  2. El bloque descodificador XMA descodifica una parte de los datos XMA en datos de modulación por impulsos codificados (PCM). Esto almacena la salida en un búfer de descodificación XMA en la memoria del sistema.
  3. El bloque SRC lee las muestras PCM del búfer de descodificación XMA y realiza la conversión de frecuencia de muestreo y el cambio de tono necesarios. Esto permite introducir datos de audio con una frecuencia de muestreo arbitraria en los bloques aceleradores de SHAPE. El bloque SRC genera datos de audio a la frecuencia fija de 48 KHz en un búfer de mezcla interno.
  4. Ahora se realiza cualquier procesamiento SHAPE adicional y la lectura y escritura en búferes de mezcla temporales. El procesamiento lo controla el ACP, que a su vez es dirigido por la aplicación a través de la API de ACP que se describe en este conjunto de documentación. El procesamiento incluye ecualización, compresión, escalado de filtro y escalado de volumen.
  5. La fase final, denominada acumulación de salida de altavoces, es donde los búferes de mezcla de altavoces recopilan y mezclan las muestras de varias fuentes de sonido para su reproducción. En esta fase se pueden procesar efectos de audio globales opcionales.
Se puede usar un proceso alternativo para que la CPU principal de la aplicación realice un procesamiento más arbitrario. Los tres primeros pasos son idénticos a los descritos anteriormente.
  1. Se carga un archivo de datos de audio XMA comprimido en la memoria principal del sistema.
  2. El bloque descodificador XMA descodifica una parte de los datos XMA en datos PCM y almacena la salida en un búfer de descodificación XMA en la memoria del sistema.
  3. El bloque SRC lee las muestras PCM del búfer de descodificación XMA y realiza la conversión de frecuencia de muestreo y el cambio de tono necesarios. Esto permite introducir datos de audio con una frecuencia de muestreo arbitraria en los bloques aceleradores de SHAPE. El bloque SRC genera datos de audio a la frecuencia fija de 48 KHz en un búfer de mezcla interno.
  4. En este paso, el flujo del proceso diverge. El sistema DMA se usa para transferir uno o varios búferes de mezcla a la memoria principal del sistema.
  5. La CPU de la aplicación realiza el procesamiento de señales necesario en el búfer de la memoria principal.
  6. El sistema DMA se usa para transferir los datos de audio procesados desde el búfer de memoria principal a un búfer de mezcla temporal. Después de este paso, el proceso es idéntico al descrito anteriormente.
  7. Ahora se realiza cualquier procesamiento SHAPE adicional y la lectura y escritura en búferes de mezcla temporales. El procesamiento lo controla el ACP, que a su vez es dirigido por la aplicación a través de la API de ACP descrita en este conjunto de documentación. El procesamiento incluye ecualización, compresión, escalado de filtro y escalado de volumen.
  8. La fase final, la acumulación de salida de altavoces, es donde los búferes de mezcla de altavoces recopilan y mezclan las muestras de varias fuentes de sonido para su reproducción. En esta fase se pueden procesar efectos de audio globales opcionales.
Los bloques SHAPE individuales se controlan mediante dos elementos de software principales: los contextos y la lista de ejecución. Los contextos, que se almacenan en la memoria principal, conservan el estado y proporcionan control para los elementos de procesamiento dentro de los bloques de hardware SHAPE específicos. Inicialmente, los genera la CPU, pero pueden actualizarse tanto desde la CPU como desde el ACP de SHAPE. Los contextos se leen en el subsistema SHAPE con cada fotograma de audio según lo necesiten los bloques de hardware individuales. Con un tamaño de fotograma de audio de 128 muestras y una frecuencia de muestreo de 48 KHz, los contextos se intercambian a una velocidad de 375 Hz por canal de audio. La lista de ejecución consta de metacomandos procesados por el procesador de audio SHAPE. Dado que el procesador es programable y flexible, el formato y la función de la lista de ejecución son flexibles. Algunos metacomandos tienen datos implícitos y otros tienen argumentos explícitos. Los metacomandos también especifican la ubicación desde la que los bloques de hardware SHAPE específicos obtienen su entrada y en la que escriben la salida mediante búferes de mezcla, que asigna el hardware. La lista de comandos que se envía al hardware SHAPE para su procesamiento se conoce como grafo de flujo y se describe en la Información general sobre ACP. La figura 1 muestra los cuatro bloques aceleradores de SHAPE y su interacción con los demás componentes principales. Figura 1. Los cuatro bloques aceleradores de SHAPE y su interacción con los demás componentes principales.

DMA

El sistema de acceso directo a memoria (DMA) admite funcionalidad de lectura/escritura con conversión automática de float a entero y de entero a float. El sistema DMA usa búferes circulares que contienen muestras desentrelazadas en bloques de 128 muestras. El procesador DMA permite al motor SHAPE enviar datos desde los búferes de mezcla a la memoria principal del sistema y recuperar datos de la memoria principal del sistema en los búferes de mezcla, para su procesamiento posterior. El DMA se realiza por bloques. Se transfiere un fotograma de audio de datos a la vez. Para facilitar los datos entrelazados por bloques, un valor de salto especifica el número de bloques de fotogramas de audio en la memoria del sistema que se deben omitir (desde la dirección base) al leer o escribir muestras. Por este motivo, las secuencias multicanal requieren un contexto DMA por canal. Las muestras de datos de audio siempre se leen y escriben como valores de 32 bits, ya sea como enteros o como floats, y según lo especificado en la marca FloatConvert del contexto DMA. Para ayudar a reducir el ancho de banda de datos, la dirección del DMA (lectura o escritura) se especifica en el comando DMA en lugar de en el contexto DMA. El motor DMA no realiza procesamiento de señales, pero puede convertir floats en enteros y enteros en floats. Esto permite a la CPU de la aplicación procesar muestras de datos en formato de punto flotante. Para calcular el tamaño de un búfer DMA, use la fórmula siguiente.
Los punteros de lectura y escritura se incrementan de la manera siguiente.
Las direcciones dentro del búfer de audio se calculan de la manera siguiente.
Por ejemplo, si un búfer DMA contiene tres fotogramas y cuatro canales, el búfer se organizará como se muestra en la figura 2, con cada bloque de canal conteniendo 128 muestras contiguas. Figura 2. Un búfer DMA. Dado que el reloj de SHAPE es independiente del reloj de la CPU, la latencia puede ser un factor. Las transiciones de hardware a software y de software a hardware conllevan una latencia de 2,66 ms. Cuando sincronice código crítico y use varias transiciones para determinados sonidos, considere la posibilidad de implementar un retardo basado en el reloj de la CPU para sincronizar la representación del sonido. Además, considere la posibilidad de desarrollar submezclas tolerantes a la latencia para ayudar a reducir el uso de la CPU.

XMA

El formato XMA admite sonido mono, estéreo y multicanal entrelazado con velocidades de bits y compresión variables. Se han realizado varias mejoras con respecto a la implementación de XMA de XBOX 360, incluido un aumento de la frecuencia de reloj (con una mejora del 40 por ciento en las capacidades de cambio de tono, por ejemplo) y un aumento del número de voces de 320 a 512. El bloque descodificador XMA descodifica una parte de los datos XMA en la memoria principal y devuelve los datos PCM a un búfer de descodificación XMA en la memoria principal. El bloque descodificador XMA es idéntico al bloque descodificador XMA de XBOX 360, salvo por pequeñas mejoras relacionadas con el estado para interactuar con otros componentes de SHAPE. El bloque de registros del descodificador XMA se ha ampliado con la información de estado relacionada con la salida descodificada de cada voz. Cinco bits por contexto XMA especifican la cantidad de datos de audio que quedan sin consumir en el búfer de salida PCM. Estos registros se implementan dentro del bloque descodificador XMA. Esto hace que siempre estén disponibles para determinar si hay suficientes muestras para bloquear el contexto para el SRC sin leer la memoria principal.
xWMA no es compatible con SHAPE, pero sí mediante XAudio2.

PCM

La modulación por impulsos codificados (PCM) lineal admite hasta sonido envolvente 7.1 a 48 KHz. El ACP realizará una mezcla de reducción si el sistema de sonido del usuario es, por ejemplo, sonido envolvente 5.1 o estéreo. Se admitirá la salida S/PDIF. También hay compatibilidad con búferes PCM lineales y circulares que contienen enteros de 16 bits mono o estéreo, floats mono de 32 bits o enteros mono de 32 bits (24 bits justificados a la izquierda, o 32 bits con los 8 bits inferiores enmascarados).

Bloque del convertidor de frecuencia de muestreo (SRC)

El bloque SRC realiza la conversión de frecuencia de muestreo basada en enteros y escribe los datos de salida en los búferes de mezcla. El SRC se usa normalmente para la emulación de instrumentos musicales, la conversión de muestras de entrada a una octava más baja o más alta que la de la fuente, y para efectos Doppler y de otro tipo. Desde la memoria del sistema, el bloque SRC lee datos PCM de punto flotante de 32 bits o datos de punto fijo de 16, 24 o 32 bits. Como datos de entrada, el bloque puede tomar la salida del descodificador de hardware XMA o los datos mantenidos por software. Dado que está estrechamente integrado con el descodificador XMA, el bloque SRC puede determinar si el número de muestras de datos PCM descodificados en el búfer de descodificación XMA es suficiente para crear y completar un fotograma de audio de muestras sin leer la memoria principal. El SRC funciona en modo mono o estéreo. Los datos PCM se leen de la memoria y se convierten a un formato común de punto fijo de 24 bits para la conversión de frecuencia de muestreo. La salida se escribe en uno o dos búferes de mezcla, según el modo. Los datos estéreo se almacenan en memoria como una secuencia entrelazada de datos de 16 bits. El canal izquierdo está en los 16 bits menos significativos de cada palabra de 32 bits, y el canal derecho en los 16 bits más significativos. Además, en modo estéreo, los datos PCM se leen y desentrelazan simultáneamente. Los datos del canal izquierdo (muestras 0,2,4,6…) se procesan y se envían a un búfer de mezcla. Los datos del canal derecho (muestras 1,3,5,7…) se escriben en un segundo búfer de mezcla. La figura 3 muestra los modos de conversión de frecuencia de muestreo. Figura 3. Modos de conversión de frecuencia de muestreo. La entrada del bloque SRC puede estar a cualquier frecuencia de muestreo que no supere 384 KHz menos épsilon. Sin embargo, la salida estará a una frecuencia constante de 48 KHz. Épsilon es la pequeña diferencia entre los valores enteros solicitados y los valores de punto flotante que usa el hardware. SHAPE puede procesar hasta 512 canales (cualquier combinación de mono y estéreo) de SRC por fotograma de audio. El SRC admite interpolación lineal y polifásica, mono y estéreo, y un intervalo de remuestreo desde 1:16, o cuatro octavas hacia abajo, hasta 3,99:1, o casi dos octavas hacia arriba.

Ecualización y compresión

El compresor limita el rango dinámico de la señal supervisando el nivel de entrada y creando un valor de ganancia dinámico. A continuación, el compresor usa el valor de ganancia como multiplicador de la señal, escalándola apropiadamente según el nivel actual de la señal de entrada. En otras palabras, el compresor es un control de volumen automático que supervisa constantemente la señal de entrada y se ajusta a sí mismo. El compresor actúa solo sobre las señales que superan un umbral específico. Las señales por debajo del umbral pasan sin alteraciones. La aplicación establece el umbral como parte de los datos de contexto de EQComp. Se usa un control programable en el contexto para realizar la compresión o la expansión. El compresor altera los datos de sonido según un parámetro que especifica la relación entre el nivel de entrada y el nivel de salida. La relación representa el grado de atenuación que se debe aplicar a la señal entrante si supera el umbral. Algunos ejemplos son los siguientes.
  • Con 2:1, por cada 2 dB por encima del umbral, el compresor genera 1 dB por encima del nivel del umbral.
  • Con 1:1, el compresor está esencialmente desactivado.
La aplicación establece la relación como parte de los datos de contexto. El diagrama siguiente (figura 4) muestra el efecto del compresor sobre una señal de entrada. Por debajo del umbral, la salida es igual a la entrada. Por encima del umbral, el compresor reduce la salida en una cantidad especificada por la relación: aproximadamente 2:1. Figura 4. La curva de volumen de entrada/salida. Los parámetros attack y release especifican la rapidez con la que se activa el compresor; es decir, cuánto tarda en atenuar por completo, en la cantidad especificada por la relación, los sonidos que superan el umbral. Attack y release se especifican en milisegundos y corresponden a la rapidez con la que el compresor debe variar la ganancia de salida en respuesta a una señal que supera el umbral o cae por debajo de él. Estos ajustes pueden ser lineales o logarítmicos. El diagrama siguiente (figura 5) muestra cómo el nivel de salida deseado no se alcanza hasta que la entrada ha superado el umbral durante el tiempo especificado por attack. El diagrama también muestra cómo la entrada y la salida vuelven a la unidad solo después de que la entrada esté por debajo del umbral durante el tiempo especificado por release. Figura 5. La temporización de attack/release. A continuación, la entrada se multiplica por la ganancia de salida actual. Esa primera multiplicación realiza la compresión propiamente dicha, es decir, el escalado de la señal mediante una función variable en el tiempo según la amplitud de entrada. Hay un escalado de ganancia adicional, que es el paso final. La ganancia de compensación (makeup gain) es un valor invariable que establece la aplicación. Dado que la compresión, especialmente con umbrales bajos, puede dar como resultado una señal de ganancia relativamente baja, la ganancia de compensación se usa para devolver la señal a un rango utilizable. Un parámetro adicional del compresor es RMS. En modo normal, el nivel de entrada es instantáneo y se calcula para cada muestra. En modo RMS, se mantiene un promedio móvil (una aproximación del valor RMS) sobre las 128 muestras anteriores. El promedio móvil se usa como nivel de entrada en lugar del nivel absoluto de la muestra de entrada actual. El bloque EQ/compresor-expansor contiene dos unidades de procesamiento independientes en serie: un ecualizador programable de tres bandas y un compresor de rango dinámico (figura 6). El bloque se usa para controlar la frecuencia y el rango dinámico de los sonidos, y toma la entrada de uno o dos búferes de mezcla.
  • Una entrada es la señal de audio que se va a procesar.
  • La segunda entrada, denominada sidechain, es la señal de control opcional que se usa para determinar la compresión de audio.
El ecualizador tiene coeficientes totalmente programables. El software puede controlar por completo la función de transferencia del ecualizador. Figura 6. El ecualizador se implementa como tres filtros biquad en serie, designados como A, B y C. Cada filtro biquad implementa la ecuación siguiente, donde x es la entrada, y es la salida y a1, a2, b0, b1 y b2 son los coeficientes. Se puede acceder a los coeficientes en una estructura SHAPE_EQCOMP_CONTEXT.
Normalmente, cuando se realiza la ecualización de un sonido, las zonas de una determinada frecuencia se recortan o se realzan. No surgen problemas cuando se recortan (atenúan) las frecuencias: la señal de salida estará a un nivel igual o inferior al de la entrada. Sin embargo, cuando se realzan las frecuencias, a menudo se produce un aumento correspondiente en el rango dinámico de pico a pico de la señal. Por ejemplo, realzar los graves en 6 dB da como resultado una ganancia de salida superior a la de la entrada. Si la señal de entrada ya estaba a escala completa (-0 dBFS), la salida superará con certeza el máximo. Por esta razón, el rango dinámico dentro de las tres secciones biquad de EQ en cascada mantiene 8 bits adicionales de precisión a la izquierda del punto binario, de modo que el formato de entrada s.23 se convierte en s8.23 durante el procesamiento de EQ. El rango adicional permite que cada fase de EQ proporcione un realce de ganancia sin saturar la salida de audio en la mayoría de los casos. Sin embargo, en condiciones de entrada máxima y con una ganancia máxima de +18 dB aplicada en las tres fases, será posible saturar la tercera fase, en cuyo caso el hardware detectaría este evento de desbordamiento de pico. Los coeficientes de filtro de cada biquad (b0, b1, b2, a1 y a2) son enteros de 24 bits. Esto permite un rango de coeficientes de hasta +/- 7,998, que es adecuado para proporcionar coeficientes para los tipos de filtros permitidos, un rango de frecuencias de 20 Hz a 18 KHz y un rango de ganancia de -18 dB a 18 dB. El compresor-expansor puede funcionar en uno de tres modos de sidechain.
  • En el modo normal (figura 7), hay una única entrada de audio desde un búfer de mezcla. La entrada pasa por el ecualizador, donde posteriormente la procesa el compresor y se envía a un búfer de mezcla. Figura 7. Modo normal.
  • En el modo interno (figura 8), la señal de entrada se introduce directamente en la entrada de audio del compresor, y se divide y se envía al ecualizador. Desde el ecualizador, se envía a la entrada de sidechain del compresor. Figura 8. Modo interno.
  • En el modo externo (figura 9), se usan dos señales de entrada independientes procedentes de dos búferes de mezcla independientes. La señal de entrada pasa por el ecualizador y llega a la entrada de audio del bloque de compresión. La señal de entrada de sidechain se introduce directamente en la entrada de sidechain del compresor. Figura 9. Modo externo.
SHAPE puede procesar hasta 512 contextos EQCOMP por fotograma de audio.

Bloque de filtro/volumen (FLTVOL)

FLTVOL se usa para hacer lo siguiente:
  • Modelar la oclusión de los sonidos que rodean o atraviesan un objeto
  • Distribuir la energía del sonido a varios altavoces, para modelar la dirección desde la que llega el sonido.
FLTVOL toma un único canal de datos de entrada de un búfer de mezcla, lo filtra y escala su volumen y, a continuación, escribe la salida en un búfer de mezcla. Normalmente, se usan varios controles de filtro/volumen para generar una panoramización de una entrada y varias salidas, como una panoramización de sonido envolvente. El panoramizador se usa normalmente para tomar un sonido y realizar una panoramización de n altavoces y uno o varios efectos de reverberación. Mediante el filtro de variables de estado, un título puede crear fácilmente efectos de distancia mejorados y efectos de oclusión y obstrucción de estilo I3DL2. Por su naturaleza, el filtro de variables de estado puede crear resonancias que harían que los valores intermedios superaran 1,0 o -1,0. Para mitigar los problemas creados por la saturación de valores intermedios, FLTVOL tiene una cantidad programable de escalado de margen (headroom) aplicado a la señal entrante que luego se compensa en la salida. El escalado se consigue desplazando aritméticamente los datos a la derecha un determinado número de bits. El campo headroom del contexto especifica el número de bits (0, 1, 2 o 3) del desplazamiento a la derecha que recibe la señal entrante antes del procesamiento de FLTVOL. Por ejemplo, si se especifica un valor de headroom de 3, el filtro de variables de estado puede mantener tres bits adicionales (18 dB) de margen para las resonancias creadas internamente y el desbordamiento. Desplazar los datos entrantes a la derecha reducirá necesariamente la precisión en el extremo inferior. Los bits inferiores de headroom de la señal de audio entrante se pierden para siempre. Por lo tanto, si se ha producido saturación interna en el filtro de variables de estado, especifique los bits de headroom como distintos de cero únicamente. Para ello, compruebe el valor del bit de desbordamiento interno en el contexto FLTVOL. Si los datos de origen originales son de 16 bits (por ejemplo, si los datos de origen originales son XMA), los bits de headroom normalmente se pueden establecer en su máximo de 3 sin un cambio perceptible en el sonido, ya que los bits de orden inferior se rellenan con ceros de todos modos. La implementación del flexible filtro de variables de estado también permite aplicar un filtrado resonante a una voz para ayudar a crear efectos de audio y variaciones interesantes. Para proporcionar una transición suave entre los puntos de ajuste de entrada y salida, los parámetros del filtro y los atributos de volumen se ajustan gradualmente por muestra. El bloque FLTVOL se implementa como un filtro Chamberlin, que proporciona tres modos: paso alto, paso bajo y paso banda con un control de Q (ancho de banda) variable. Los parámetros del filtro Chamberlin se calculan de la manera siguiente.
Los parámetros f y q los calcula el software fuera del bloque SHAPE. Cuando se actualiza un coeficiente, se aplica una rampa hasta el nuevo valor a lo largo de un fotograma de audio. Se usan bits de control para determinar qué salida (rechazo de banda, paso alto, paso banda o paso bajo) se usará como salida final del bloque FLTVOL. Los datos de contexto de cada canal o secuencia se almacenan en la memoria del sistema. Aunque el rendimiento está limitado a 2560 secuencias simultáneas de 48 KHz (lo que significa que SHAPE puede procesar hasta 2560 contextos FLTVOL por fotograma de audio), el número de contextos direccionables en memoria es mayor, para simplificar los escenarios de reutilización de secuencias. El comportamiento de filtrado está diseñado para ser idéntico al de XAudio2.

Búferes de mezcla

Los búferes de mezcla cumplen tres propósitos principales.
  • Los búferes de mezcla actúan como destino de mezcla final para cada salida de altavoz del sistema (o de un jugador individual). Cuando se procesa cada sonido, su salida posterior se mezcla en estos búferes.
  • Los búferes de mezcla actúan como ubicaciones de almacenamiento temporal cuando se pasan búferes de datos de audio entre bloques de hardware.
  • Junto con el motor DMA, los búferes de mezcla sirven como mecanismo para pasar datos desde el hardware SHAPE y el subsistema de audio hasta el sistema principal, así como para pasar datos desde la memoria principal del sistema de vuelta al hardware SHAPE y al subsistema de audio.
El sistema SHAPE hace un uso extensivo de los búferes de mezcla. Puede haber hasta 8192 búferes de mezcla virtuales simultáneos (con identificadores de 0 a 8191) representando en 128 canales físicos. La mezcla puede realizarse mediante acumuladores de hardware y sin necesidad de DMA hacia y desde la memoria. Los búferes de mezcla admiten medición y recorte (clipping).

Desbordamiento, magnitud y saturación

En un motor de audio de un título, administrar el margen (headroom) puede ser muy difícil. Por esta razón, cada bloque SHAPE mantiene el estado asociado con el margen y la ganancia de la señal. Cada bloque, excepto el SRC, mantiene una marca que indica si se ha producido saturación interna durante el procesamiento. Además de la marca de saturación interna, cada bloque de hardware también mantiene dos números de cuatro bits que representan la magnitud de la salida del bloque de hardware. La magnitud se calcula determinando el pico de salida durante el fotograma de audio y contando los ceros iniciales del valor absoluto del pico. Un número de cuatro bits se mantiene con la magnitud de pico persistente, y el otro lo restablece el hardware en cada fotograma de audio. Además de supervisar la magnitud de pico de cada bloque de hardware individual, también se mantiene la magnitud de pico de los búferes de mezcla. Cuando la salida de un bloque de hardware se agrega a un búfer de mezcla, la magnitud de pico se calcula de la misma manera: contando los ceros iniciales. El estado de cada bloque de hardware mantiene un par adicional de valores de magnitud de pico de cuatro bits. Estos valores representan la magnitud de pico del búfer de mezcla después de que la salida del bloque de hardware se haya acumulado en el búfer de mezcla. Un número de cuatro bits representa la magnitud de pico continua y persistente. El otro se actualiza en cada fotograma de audio. Los valores de magnitud de pico se guardan en el contexto de los bloques SHAPE, aunque lo que se representa es el estado del búfer de mezcla. La magnitud de pico se codifica según la tabla siguiente (codificada en el archivo ShapeHardwareContexts.h). Para ayudar a administrar el margen y evitar el desbordamiento y la saturación, además de la configuración de ganancia de grano fino, se puede realizar un desplazamiento a la derecha de 0 a 7 bits en la salida de un bloque de hardware antes de la acumulación en el búfer de mezcla de salida. Esto se designa en el contexto de cada bloque de hardware SHAPE.

Colas de SHAPE

El procesador de audio SHAPE administra dos colas que ayudan a reducir los interbloqueos entre el hardware del sistema y el hardware de la aplicación.
  1. La cola de comandos y control (CCQ) se usa para dar al procesador de audio SHAPE una serie de comandos para ejecutar cuando pueda, normalmente cuando termina el procesamiento del fotograma de audio actual. La lista de ejecución de SHAPE se lee una vez por cada fotograma de audio de salida. Sin embargo, la CCQ se leerá y ejecutará solo una vez. La CCQ es el mecanismo para que la CPU actualice los datos de contexto de cualquier bloque en un límite de fotograma de audio sin requerir un interbloqueo de hardware con el hardware SHAPE. Algunos ejemplos de esto incluyen suministrar más datos de flujo de bits para el bloque XMA, actualizar parámetros de contexto para varios bloques y apuntar a una nueva lista de ejecución. Esto se hace normalmente mientras se cambia el grafo de flujo de procesamiento de audio.
  2. La cola de estado y notificación (SRQ) la usa el procesador de audio SHAPE para notificar a la CPU diversos eventos que no requieren respuestas en tiempo real. Algunos ejemplos incluyen la actualización del consumo del búfer de flujo de bits, errores, advertencias y marcas, datos de depuración, datos de rendimiento e información de estado.

Consideraciones de programación

La programación directa sobre el hardware SHAPE se habilita a través de la interfaz IACPHAL. Sin embargo, el proceso de preparar los datos de audio para el hardware SHAPE es complejo. Se proporcionan muchos métodos, estructuras y enumeraciones de utilidad. Estas utilidades proporcionan todos o la mayoría de los métodos necesarios para controlar el hardware SHAPE. El Microsoft Game Development Kit (GDK) incluye el código fuente de estas utilidades para los casos poco frecuentes en los que sea necesario modificar el código para controlar ciertos tipos de datos. El único archivo de encabezado que debe incluirse explícitamente en el proyecto es acphal.h, que hace referencia a todos los archivos de encabezado de utilidades. Todas las funciones de utilidad hacen referencia a la macro NO_SHAPE_CONTEXT_VALIDATION. Si esta macro está definida, se omitirán todas las validaciones. Esto será útil para las compilaciones comerciales finales. Para obtener más detalles sobre el uso compartido de recursos SHAPE y XMA con instancias de XAudio2, consulte la sección de comentarios de la función XAudio2Create. Para obtener más detalles sobre todos los métodos de utilidad, consulte Información general sobre ACP.

Grafos de flujo persistentes y no persistentes

Puede enviar grafos de flujo para su procesamiento como persistentes o no persistentes. Los grafos de flujo persistentes se procesan y permanecen residentes de modo que su procesamiento se repite en el fotograma siguiente después de que los punteros de lectura y escritura hayan avanzado y después de que se actualice otra información de contexto. Use grafos de flujo persistentes para cualquiera de los escenarios siguientes.
  • Grafos de flujo muy complejos, que requieren una cantidad significativa de procesamiento de CPU para volver a ensamblar cada fotograma
  • Grafos de flujo muy estáticos, que tienen el mismo número y configuración de voces durante un período prolongado
Use grafos de flujo no persistentes para cualquiera de los escenarios siguientes.
  • Las topologías de voces cambian con frecuencia.
  • La cadencia de procesamiento del motor de software de audio de su título está desacoplada del hardware SHAPE; es decir, no es un múltiplo de 2,667 ms.
  • Desea ejecutar el procesamiento de audio más rápido que en tiempo real, enviando grafos para que se consuman tan pronto como estén disponibles.

Depuración de problemas

Cuando desarrolle grafos de flujo, registrarse para recibir mensajes le ayudará a depurar los problemas que puedan surgir. En concreto, use el parámetro NumMessages de Connect. El sistema de mensajería proporciona información detallada sobre diversos problemas, incluidos los grafos de flujo no válidos (ACP_FLOWGRAPH_TERMINATED_REASON_INVALID_GRAPH), los comandos bloqueados y los desbordamientos de fotograma que se producen cuando se intenta realizar más procesamiento del que permite el tamaño de fotograma del hardware de 2,667 ms. Antes de publicar un título, compruebe que el procesamiento de los grafos de flujo se realiza correctamente de forma sistemática observando los mensajes ACP_MESSAGE_TYPE_FLOWGRAPH_COMPLETED de cada grafo de flujo enviado.

Mensajes perdidos

Si usa mensajes ACP para dirigir el estado del motor, y si controla muchos mensajes, debe examinar el campo droppedMessageCount de ACP_MESSAGE durante el desarrollo. Un valor distinto de cero en el campo indica que la cola de mensajes estaba llena y hubo que descartar mensajes. En este escenario, considere la posibilidad de dar servicio a la cola más rápido y de hacerla más grande.

Desbordamientos de fotograma

Hay muchas razones por las que un grafo de flujo podría no completarse antes de que se alcance el final de un fotograma de audio (2,667 ms), por ejemplo, el procesamiento de demasiados grafos de flujo o el procesamiento de un grafo de flujo mal estructurado. Este grafo de flujo incompleto dará como resultado un mensaje ACP_FLOWGRAPH_TERMINATED_TIME_EXCEEDED para los grafos de flujo persistentes, y estos grafos de flujo persistentes quedarán incompletos. Por el contrario, un grafo de flujo no persistente no está restringido de esta manera y se ejecutará hasta completarse, incluso a lo largo de varios fotogramas.

Comandos bloqueados

Los comandos SRC y DMA pueden notificarse como bloqueados (ACP_MESSAGE_TYPE_SRC_BLOCKED, ACP_MESSAGE_TYPE_DMA_BLOCKED) en varios escenarios, como se muestra en la tabla siguiente. | Tipo de comando| Escenario de bloqueo| | --- | --- | --- | --- | | XMA SRC| El contexto XMA asociado tiene un error del analizador o no tiene datos de origen. El error es SHAPE_XMA_ERROR_STATUS_READ_BUFFER_INVALID_VALIDBUFFER_CURRBUF_IS_0 | SHAPE_XMA_ERROR_STATUS_FRAME_CROSSES_BOUNDARY_INTO_INVALID_READ_BUFFER_VALIDBUFFER_CURRBUF_IS_0 | SHAPE_XMA_ERROR_STATUS_FRAME_CROSSES_BOTH_READ_BUFFER_BOUNDARIES. XMA SRC no se bloqueará por falta de datos descodificados.| | PCM SRC| El contexto PCM asociado es SHAPE_PCM_MODE_CIRCULAR y no hay datos de origen.| | Lectura (DMA desde el búfer de mezcla)| El búfer DMA está lleno.| | Escritura (DMA hacia el búfer de mezcla)| El búfer DMA está vacío.| Una vez que se determina que los comandos están bloqueados (lo que ocurre tanto antes de agregarlos a una cola de SHAPE para su procesamiento como en tiempo de ejecución), se eliminan del grafo, lo que puede provocar pérdida de audio. Durante el desarrollo, use los comandos bloqueados como el primer lugar donde buscar mejoras en el manejo de los grafos de flujo. Además, antes de publicar, asegúrese de que su título evita por completo que los comandos se bloqueen. Puede evitar el bloqueo de los comandos DMA asegurándose de que el búfer de audio sea lo suficientemente grande y de que los datos se transmitan a intervalos regulares en relación con el tamaño del búfer. Por ejemplo, si está transmitiendo cuatro fotogramas de hardware a la vez, asegúrese de que haya algún múltiplo de esos fotogramas (al menos con doble búfer, es decir, ocho) en el búfer para que el hardware pueda escribir por delante del puntero de lectura del título. Como alternativa, podría exigir el vaciado del búfer antes de enviar el siguiente grafo de flujo: consumir, actualizar el puntero de lectura del DMA y, a continuación, enviar el grafo de flujo. Los comandos SRC tienen tres modos.
  • SHAPE_SRC_COMMAND_TYPE_START se usa para casi todos los comandos SRC de un grafo de flujo. Realice el procesamiento normal y espere que más datos de audio sigan al grafo de flujo actual.
  • SHAPE_SRC_COMMAND_TYPE_STOP_IMMEDIATE se usa para detener inmediatamente el procesamiento de los datos XMA o PCM de origen. El SRC generará un búfer a cero para este fotograma.
  • SHAPE_SRC_COMMAND_TYPE_STOP_END se usa para indicar el último paquete de una voz.
Si el último paquete de una voz no se envía con STOP_END o STOP_IMMEDIATE, el comando SRC no se completará, lo que hará que el grafo de flujo activo se detenga. Un grafo de flujo persistente terminará al final del fotograma de audio, y un grafo de flujo no persistente nunca se completará.

Problemas de sincronización

Pueden surgir problemas de sincronización si no se respetan las prácticas de consumo de contextos y comandos del hardware SHAPE. Aunque sus títulos conservan acceso completo a la memoria asignada por el ACP, tenga cuidado de no modificar una estructura de contexto mientras esté en uso. Puede usar SubmitCommand para enviar comandos que se produzcan en un fotograma específico, al principio del fotograma siguiente o lo antes posible.
El escenario “lo antes posible” sigue siendo asincrónico con respecto a cualquier procesamiento de la CPU del título. Es posible que algunos comandos no se completen inmediatamente, por ejemplo, si un contexto está en medio de una operación no interrumpible. Espere un ACP_MESSAGE_TYPE_COMMAND_COMPLETED para comprobar que un comando se ha procesado realmente.
Para obtener más información, consulte Ponerse en forma con SHAPE: procedimientos recomendados para la construcción de grafos de flujo de audio.
Última modificación el 28 de agosto de 2026