Skip to main content
En este tema, recorreremos el flujo de código esperado sobre cómo usar la descodificación acelerada por hardware de Opus en dispositivos XBOX Series X mediante uno de los ejemplos incluidos con el Microsoft Game Development Kit (GDK). Este ejemplo se denomina DecodeOne.cpp y cubre un escenario de descodificación de una sola secuencia con un cliente.

Conexión con el hardware de audio e inicio

La descodificación comienza estableciendo una conexión con la unidad de aceleración de hardware mediante XApuConnect. El autor de la llamada establece los requisitos de la conexión mediante XApuConnectInputParameters para configurar lo siguiente:
  1. El tipo de procesamiento (en este caso, XApuProcessType::DecodeOpus).
  2. El número de secuencias (en este caso, 1).
  3. La memoria total necesaria para pasar y recuperar los datos de entrada y de salida; en este caso, 1024 para MaxInputBufferLength (debe ser igual o mayor que el paquete Opus más grande de la secuencia). El número también debe ser múltiplo de 16, y 7680. Esto corresponde a 20 ms de datos a 48 K, es decir, 960 × 2 × sizeof(float) = 7680 para MaxOutputBufferLength. La salida también debe ser múltiplo de 16.
Si esta llamada se realiza correctamente, el parámetro XApuConnectOutputParameters::baseData apunta a una ubicación de memoria asignada por el sistema operativo de forma que la unidad de aceleración de hardware pueda acceder directamente sin serialización ni copia adicionales. El autor de la llamada debe usar esta memoria para pasar los datos de entrada y recuperar los datos de salida. El siguiente ejemplo de un administrador de memoria sencillo se puede usar para establecer XApuConnectInputParameters y particionar XApuConnectOutputParameters::baseData en dos punteros: uno para los datos de entrada y otro para los datos de salida.
A continuación se muestra el ejemplo de código del primer paso para establecer una conexión.

Activación y desactivación de secuencias

Una vez establecida la conexión con el dispositivo, el autor de la llamada debe enviar un comando de activación de secuencia para poner en marcha un único motor de descodificación. El autor de la llamada debe especificar el índice de la secuencia y el número de canales. Solo se permiten secuencias mono o estéreo. El autor de la llamada debe llamar a XApuDequeueResult para obtener el resultado de la activación. Como XApuConnectInputParameters::maxQueuedCommandsPerStream está establecido en 1 en este ejemplo, el autor de la llamada tiene que esperar cada resultado antes de enviar el siguiente comando. Esto incluye los comandos Activate, Process y Deactivate (para obtener más detalles, consulte XApuCommandType). A continuación se muestra el código para activar una secuencia.
Después de recibir el resultado de la activación, el autor de la llamada puede empezar a enviar paquetes Opus para su descodificación. Esto debe hacerse mediante el comando XApuCommandType::Process. Para cada comando Process, el autor de la llamada debe hacer lo siguiente:
  1. Rellenar el búfer de entrada con exactamente un paquete Opus.
  2. Especificar la longitud del paquete.
  3. Proporcionar la ubicación del búfer de salida que la unidad de aceleración de hardware de audio rellenará con los datos descodificados.
  4. Especificar la longitud máxima del búfer de salida.
Además, el autor de la llamada debe especificar los valores streamIndex y frameCount. Si es necesario copiar todos los datos descodificados en el búfer de salida, el valor frameCount se puede establecer en cualquier valor igual o mayor que el número de fotogramas codificados en el paquete (por ejemplo, para un paquete de 20 ms, frameCount se puede establecer entre 960 y 0xFFFFFFFF).
A continuación, se debe llamar a XApuDequeueResult para obtener la salida descodificada del paquete. Una vez recuperado correctamente XApuResult, los datos de salida se almacenarán en result.outputData. Después de procesarlo, se debe enviar el siguiente paquete para su descodificación con una nueva llamada a XApuEnqueueCommand con el comando XApuCommandType::Process.
Después de descodificar todos los paquetes de la secuencia, se debe enviar un comando XApuCommandType::Deactivate.

Finalización

Una vez recibido el resultado de la desactivación, el autor de la llamada debe llamar a XApuDisconnect para desconectarse de la unidad de aceleración de hardware de audio y liberar todos los recursos asignados.
Última modificación el 28 de agosto de 2026