在 bootloader 中播放声音的最佳方法是什么?

3
我目前正在尝试找出一种在引导加载程序代码中循环声音(目前以mp3 / wav格式存在)的方法,但我不知道从哪里开始。因此,我有3个问题:
  1. 当处理器处于16位模式还是32位模式下播放声音更容易?
  2. 哪种声音格式最好?
  3. 是否有任何公共可用库可以做到这一点? 我没有找到有用的东西。(也许我瞎了?IDK)
提前感谢^^

我猜首先要知道你所说的引导加载程序是什么意思,有些引导加载程序是完整的操作系统,这有点违背了初衷。但归根结底,如果你是裸机,那么你需要担心音频设备以及如何向它们提供16/32位数据,格式并不一定重要,开销越小越好,mp3的开销相对较大,除非硬件可以直接解码,否则就会变得很容易。否则,选择具有最多原始数据的格式。所有这些的库都已经存在,你找不到的是什么? - old_timer
3
如果你真的想在EFI或BIOS的引导加载程序中实现这个功能,那么你将面临一个非常困难的问题。你需要有效地创建声卡驱动程序、检测可用的声卡(如果有的话),然后使用你编写的驱动程序来访问该卡以播放所需的声音... 除非你只是想发出简单的蜂鸣声.. 那并不太难。 - David Hoelzer
如果你只是想在现代计算机上启动,你可以只编写代码(就像David Hoelzer所说的那样)来访问AC'97声音设备。但是,在使用模拟器时,您可能需要编写用于访问SoundBlaster 16卡的代码。查找解码MP3的库代码并不难,但您需要将其适应裸机环境,其中甚至基本的东西如malloc也不可用,除非您自己编写它们。 - Ross Ridge
1个回答

3

当处理器处于16位模式还是32位模式时,播放某些声音是否更容易?

这并没有太大的区别,主要取决于您想要针对哪种声卡 - 现代声卡需要您能够在前4GiB内的任何位置进行寻址。
将CPU放入非真实模式是最好的选择-它简单易用,可以访问4GiB地址空间,并允许您使用BIOS服务。

哪种声音格式最好?

你可以查看维基百科上的MP3页面,即使在进入技术细节之前,MP3解码也是一个非常冗长的话题。
它预设了傅里叶级数的知识,因此您必须精通复杂分析(涉及复数的意义-这个理论本身是一种基本工具)和信号处理。
如果你从未听说过"采样"、"窗函数"、"量化",那么现在是时候阅读一些本科教材了。
当然,您必须熟练掌握二进制数据的处理,一张图片或一个表格的字段应该足够让您编写代码。
MP3必须被解码成一系列的样本。
我想有些卡支持硬件解码(我从未真正检查过)。

WAV文件格式要简单得多 - 大多数文件都有相同的固定头(或者你只需要支持它)。
基本上,它是为了几乎直接播放而设计的 - 如果你确定采样率、每个通道的位数等,并仅使用最小的块生成wav文件,甚至可以直接寻找到特定偏移量并将数据直接流式传输到卡中。
如果没有使用压缩,则WAV格式已经是一系列样本。

有没有公开可用的库?我没有找到有用的东西。

当然没有,为什么会有呢?
肯定有一些开源项目用于解码MP3,但SO不负责指出它们,而且当然没有一个针对x86引导环境的目标。
你需要进行移植 - 这可能并不容易。
从找到支持实模式的编译器开始,以实现所需的最小CRT结束。


你还需要精通以下内容:

  • IRQ
  • DMA
  • PCI / PCI-E
  • IO和MMIO
  • 从磁盘读取

现在你已经知道需要付出的巨大努力,以下是一些建议:

  • 你考虑过旧的 speaker 吗?
    它只能产生方波(要么开着,要么关着,就像Game Boy一样的1位“音频卡”)。
    它可能很适合热身,因为它仍然需要计时你的代码。
  • 你可以相对容易地编程 SB16
    SB16已经过时了,所以比现代卡片简单。
    DOSBox可以模拟它。
    我曾经写过一个有关如何在DOS下播放WAV文件的答案,你只需要进行移植。
  • 如果你想使用现代卡,请查找系统中存在的卡。
    可能会有两个,因为大多数Intel芯片组都配备了一个。
    Intel芯片组的数据手册总是记录了Intel集成HD音频PCI设备。
    其他卡可能有专有的数据手册——找到它们是工作的90%。
  • 在虚拟机中测试
    这将使您免受无数次重启的困扰。

我并不想吓唬你,使用汇编语言播放声音或多媒体内容确实是一件神奇的事情,你不应该放弃,但要注意这需要非常熟练的汇编技能,是一项不容易的工作。
如果你只是想找一个快速而简单的解决方案,那最好还是放弃。
你需要自己判断并决定最佳行动方案。

唉...请不要建议任何人使用虚拟模式。它远非易用。很难正确使用,而且不值得麻烦。如果您可以在保护模式和实模式之间切换,那么您可以在保护模式下更轻松地完成所需的操作。 - Ross Ridge
@Ross,为什么这很难?我知道应该避免对段寄存器的每次更新,但我已经使用它了,并发现这比在pm和rm之间来回切换更容易。 - Margaret Bloom
你必须来回切换它们以启用虚幻模式,所以就像我说的那样,你最好在受保护模式下做任何你需要在虚幻模式下做的事情。 几乎没有人在早期使用它的原因是有道理的(HIMEM.SYS和Ultima VII是我知道的仅有的两个严肃的例子),这只会带来麻烦。请记住,你是一位x86汇编语言专家。对于刚入门的汇编语言程序员来说,玩转引导加载程序可能是一个艰巨的任务。 - Ross Ridge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接