DecodeOne.cpp,涵盖了一个客户端下的单流解码场景。
音频硬件连接与启动
解码从通过 XApuConnect 建立与硬件加速单元的连接开始。调用者使用 XApuConnectInputParameters 设置连接的要求,具体包括:- 处理类型(此处为 XApuProcessType::DecodeOpus)。
- 流的数量(此处为 1)。
- 用于传入和取出输入/输出数据所需的总内存。这里
MaxInputBufferLength为 1024(必须大于或等于流中最大的 Opus 数据包,且必须是 16 的倍数);MaxOutputBufferLength为 7680,即 48 K 下 20 ms 的数据,960 × 2 × sizeof(float) = 7680,输出也需要是 16 的倍数。
流的激活与停用
在与设备建立连接后,调用者应发送一个流激活命令来启用一个解码引擎。调用者必须指定流索引和声道数。只允许单声道或立体声流。 调用者应调用 XApuDequeueResult 获取激活结果。因为在本示例中 XApuConnectInputParameters::maxQueuedCommandsPerStream 设置为 1,所以调用者必须等到每个结果返回后再提交下一个命令。这包括Activate、Process 和 Deactivate 命令(详情见 XApuCommandType)。
以下是激活一个流的代码。
Process 命令,调用者必须完成以下工作:
- 用恰好一个 Opus 数据包填充输入缓冲区。
- 指定数据包的长度。
- 提供输出缓冲区的位置,音频硬件加速单元将把解码数据写入其中。
- 指定输出缓冲区的最大长度。
streamIndex 和 frameCount 值。如果需要把所有解码数据都拷贝到输出缓冲区,则可将 frameCount 值设为大于或等于数据包中编码帧数的任意值(例如,对于一个 20 ms 的数据包,frameCount 可以在 960 到 0xFFFFFFFF 之间取任意值)。
result.outputData 中。处理完后,应通过新的一次 XApuEnqueueCommand 调用(携带 XApuCommandType::Process 命令)提交下一个数据包进行解码。
