多年来,我使用微软操作系统,多次遇到现在才明白的情况。当你在听音乐时遇到 BSOD 时,会有一段短暂的时间(1-2 秒),屏幕会冻结,音乐的最后部分会重复几次,然后一切就会恢复正常。蓝色深渊。今天,我对这种情况背后的机制非常好奇——是什么让音频的某个部分循环播放?我恳求您,仁慈的先生们,满足我的好奇心。
答案1
它只是与缓冲和 DMA 有关。
操作系统不直接播放声音,而是对其进行解码(解压缩等)并将其发送到声音硬件进行播放。
这很少由处理器直接完成,而是由 DMA 子系统(直接内存访问)独立处理。处理器基本上会告诉 DMA 系统将内存块 A 复制到声音硬件并指示何时完成。
如果操作系统崩溃了,那么它将永远不会收到来自 DMA 芯片的传输已完成的信号,因此它将永远无法告诉 DMA 芯片传输下一个块。那么 DMA 芯片会做什么呢?除非有人告诉它做其他事情,否则它很可能会再次传输同一块数据……一次又一次……直到它关闭,导致重复的声音。可能发生的另一种情况是,操作系统已收到传输已完成的信号,然后发送信号开始新的传输,但尚未将任何新数据放入缓冲区,导致再次传输同一块数据……一次又一次……等等。这些情况究竟是怎样的,完全取决于 MS 决定如何使用 DMA 系统进行音频播放,如果没有看到 Windows 的源代码,我真的无法说出是哪一种情况。
无论如何,我希望这能带来一些见解。
答案2
RAM 的一小部分,或缓冲,声卡用来播放的是圆声卡内的 DAC 一旦到达此缓冲区的末尾,就会立即返回到开头。在此之前,操作系统应该已经用新的声音数据覆盖缓冲区中的旧数据。但是,如果由于 CPU 占用高或崩溃而导致操作系统尚未完成此操作,声卡中的 DAC 将继续运行。
大多数硬件都是这样“愚蠢”的,这是设计使然。就硬件和网络设计而言,简单就是可靠。这也适用于操作系统设计,但是,你知道……
这就是许多数字音频的工作原理。CD 播放器基于相同的原理,这就是为什么当遇到坏扇区时,您会听到它们跳过的方式。
答案3
据我所知,声音是实时发生的并且相当复杂 - 编解码器/缓冲区/缓存等都发生在芯片内。
简单来说,计算机基本上将要听的音频放入缓存/缓冲区并告诉它开始播放。需要告诉它停止,如果它没有收到停止命令,它将继续在缓存/缓冲区上播放,直到被迫停止。
Windows 音频服务以可用的方式将声卡链接到操作系统。在 BSOD 期间,此服务会失败,并且在声卡/芯片断电/超时之间的几秒钟内,它会一遍又一遍地重播缓冲区/其最后一个命令。