Pular para o conteúdo principal
Neste tópico, vamos percorrer o fluxo de código esperado sobre como usar a decodificação Opus acelerada por hardware em dispositivos XBOX Series X usando um dos exemplos incluídos no Microsoft Game Development Kit (GDK). Esse exemplo se chama DecodeOne.cpp e aborda um cenário de decodificação de fluxo único com um cliente.

Conexão e inicialização do hardware de áudio

A decodificação começa com o estabelecimento de uma conexão com a unidade de aceleração de hardware por meio de XApuConnect. O chamador define os requisitos da conexão usando XApuConnectInputParameters para configurar o seguinte:
  1. O tipo de processamento (neste caso, XApuProcessType::DecodeOpus).
  2. O número de fluxos (neste caso, 1).
  3. A memória total necessária para passar e recuperar os dados de entrada e de saída; neste caso, 1024 para MaxInputBufferLength (deve ser igual ou maior que o maior pacote Opus no fluxo). O número também deve ser múltiplo de 16, e 7680. Isso corresponde a 20 ms de dados a 48 K, ou seja, 960 × 2 × sizeof(float) = 7680 para MaxOutputBufferLength. A saída também precisa ser múltipla de 16.
Se essa chamada for bem-sucedida, o parâmetro XApuConnectOutputParameters::baseData apontará para um local de memória alocado pelo sistema operacional de forma que a unidade de aceleração de hardware possa acessá-lo diretamente, sem marshaling ou cópia adicionais. Essa memória deve ser usada pelo chamador para passar os dados de entrada e recuperar os dados de saída. O exemplo a seguir de um gerenciador de memória simples pode ser usado para definir XApuConnectInputParameters e particionar XApuConnectOutputParameters::baseData em dois ponteiros: um para os dados de entrada e outro para os dados de saída.
Veja a seguir o exemplo de código da primeira etapa para estabelecer uma conexão.

Ativação e desativação de fluxos

Depois que a conexão com o dispositivo for estabelecida, o chamador deverá enviar um comando de ativação de fluxo para acionar um único mecanismo de decodificação. O chamador deve especificar o índice do fluxo e a contagem de canais. Somente fluxos mono ou estéreo são permitidos. O chamador deve chamar XApuDequeueResult para obter o resultado da ativação. Como XApuConnectInputParameters::maxQueuedCommandsPerStream está definido como 1 neste exemplo, o chamador precisa aguardar cada resultado antes de enviar o próximo comando. Isso inclui os comandos Activate, Process e Deactivate (para obter detalhes, confira XApuCommandType). Veja a seguir o código para ativar um fluxo.
Depois que o resultado da ativação for recebido, o chamador poderá começar a enviar pacotes Opus para decodificação. Isso deve ser feito usando o comando XApuCommandType::Process. Para cada comando Process, o chamador deve fazer o seguinte:
  1. Preencher o buffer de entrada com exatamente um pacote Opus.
  2. Especificar o tamanho do pacote.
  3. Fornecer o local do buffer de saída que será preenchido com os dados decodificados pela unidade de aceleração de hardware de áudio.
  4. Especificar o tamanho máximo do buffer de saída.
Além disso, o chamador deve especificar os valores streamIndex e frameCount. Se for necessário copiar todos os dados decodificados para o buffer de saída, o valor frameCount poderá ser definido como qualquer valor igual ou maior que o número de quadros codificados no pacote (por exemplo, para um pacote de 20 ms, frameCount pode ser definido entre 960 e 0xFFFFFFFF).
Em seguida, XApuDequeueResult deve ser chamado para obter a saída decodificada do pacote. Depois que XApuResult for recuperado com êxito, os dados de saída serão armazenados em result.outputData. Depois que eles forem processados, o próximo pacote deverá ser enviado para decodificação com uma nova chamada para XApuEnqueueCommand com o comando XApuCommandType::Process.
Depois que todos os pacotes do fluxo forem decodificados, um comando XApuCommandType::Deactivate deverá ser enviado.

Encerramento

Depois que o resultado da desativação for recebido, o chamador deverá chamar XApuDisconnect para se desconectar da unidade de aceleração de hardware de áudio e liberar todos os recursos alocados.
Última modificação em 6 de outubro de 2026