非 PCM 流的 S/PDIF 直通传输
索尼/菲利普斯数字接口(S/PDIF)格式主要用于传输 PCM 音频数据,但它可以轻松适应传输非 PCM 数据。 S/PDIF 直通传输的原则是,非 PCM 数据流可以通过 S/PDIF 链路,就像它是 PCM 流一样。 直通传输不需要 S/PDIF 发送和接收端口来了解非 PCM 流的编码。
WMA Pro 和 AC-3 都是压缩的非 PCM 格式,它们以称为同步帧的单元传输数字音频流。 每个同步帧都包含自己的标头,并且可以独立于流中的其他同步帧进行解码。 例如,以 48-kHz 采样率计算,WMA Pro 同步帧包含足够的数据来播放样本时钟的 2048 时钟时钟(42.67 毫秒)。 在同一速率下,AC-3 同步帧包含足够的数据,用于 1536 时钟周期(32 毫秒)。
以 48-kHz 采样率计算,5.1 通道 WMA Pro 同步帧永远不会超过 8192 字节,这是 2048 立体声(双声道)、16 位 PCM 样本占用的字节数。 同样,5.1 通道 AC-3 同步帧永远不会超过 6144 字节,这是 1536 立体声、16 位 PCM 样本占用的字节数。 (此规则有例外情况,但这些类型的 AC-3 同步帧非常罕见,无法通过 S/PDIF 传输,可在此处忽略)。
当 48-kHz WMA Pro 或 AC-3 音频流以数字形式通过 S/PDIF 链接而不进行解码时,S/PDIF 发送和接收端口可以将流视为与立体声、16 位、48-kHz PCM 流相同的流。 为可以传输 WMA Pro-over-S/PDIF 或 AC-3-over-S/PDIF 流的引脚指定数据范围时,波形格式标记本身是唯一不同于通过 S/PDIF 端口传输 PCM 流的引脚的数据范围。 有关示例,请参阅“指定 WMA Pro 数据范围”中的数据 范围声明。
为了避免在 S/PDIF 接口上传递 WMA Pro 压缩流的速度比实时快(也就是说,为了防止在不到 43 毫秒内传送 43 毫秒的音频),音频应用程序必须将 WMA Pro 同步帧填充为零,直到同步帧占用与 2048 立体声 PCM 样本相同的字节数。 AC-3 同步帧必须同样填充为 1536 立体声 PCM 样本的大小。
如果尝试将未写入的 WMA Pro 或 AC-3 同步帧发送到使用 WaveCyclic 的 PortCls 适配器驱动程序,请注意,当端口驱动程序感知数据饥饿时(因为数据流包含的字节数少于双通道未压缩流),它会以沉默填充循环缓冲区。 非 PCM 流解码器将有解释这些无声期的问题,它们采用 PCM 而不是非 PCM 格式。
下图显示了 S/PDIF 直通传输的示例应用。
该图显示通过同轴电缆连接到外部音频/视觉对象(A/V)接收器的电脑。 电缆将电脑上的音频设备上的 S/PDIF 输出端口连接到 A/V 接收器上的 S/PDIF 输入端口。
在图的左边缘,音频应用程序将 WMA Pro 音频流中的同步帧插入到 8192 字节缓冲区的开头。 (此缓冲区大小仅用于简化插图)。实际上,缓冲区大小为 4096 字节或 10240 字节,例如,可以改用。应用程序用零填充缓冲区中的任何剩余空间。 音频驱动程序将 S/PDIF 输出端口程序为传输缓冲区的内容,就像它们是 8192 字节的 PCM 数据一样。
同样,A/V 接收器上的 S/PDIF 输入端口接收流,就像它是 8192 字节的 PCM 数据一样。 它将数据加载到输入缓冲区中,在此示例中,该缓冲区的大小也为 8192 字节。 解码器从输入缓冲区中提取 WMA Pro 同步帧,将同步帧解码为 5.1 声道音频流,并通过图右边缘的环绕扬声器播放流。
若要让连接另一端的解码器知道音频流采用非 PCM 格式,音频驱动程序应在 S/PDIF 非线性上设置 /AUDIO 位。 解码器从 S/PDIF 通道状态块中读取此位,以确定数据流是否以非 PCM 格式进行编码。 设置此位是唯一特殊的事情,驱动程序需要执行以容纳非 PCM 流。 以其他方式,驱动程序将流视为包含 PCM 数据。
许多使用者设备支持 S/PDIF 直通传输,但 USB 和 1394 等其他数字接口也可以改编为将非 PCM 数据传输到外部音频解码器的数字直通传输。
Dolby 实验室在 1992 年引入了 AC-3(Dolby Digital)压缩音频格式。 大约 1997 年,第一个支持 AC-3 over S/PDIF 的使用者 A/V 接收器可用。 WMA Pro 音频流格式的软件支持随 2003 年 Microsoft Windows Media 9 系列技术发布一起提供。 2003 年引入了支持 WMA Pro-over-S/PDIF 的 A/V 接收器。
在 Windows XP 及更高版本中,waveOut、DirectSound 和 DirectShow API 支持非 PCM 格式。 DirectSound 和 waveOut API 的实现方式是让驱动程序公开的任何 PCM 或非 PCM 格式自动提供给这些 API 的客户端。