在引导程序中播放声音的最佳方式

时间:2017-03-12 16:02:00

标签: audio assembly x86 bootloader

我正在尝试找出一种在bootloader代码中循环声音(目前以mp3 / wav格式存在)的方法,但我不知道从哪里开始。

因此我有3个问题:

  1. 当处理器处于16位模式或32位模式时,是否更容易播放声音?
  2. 声音的哪种格式最好?
  3. 有没有公共可用的图书馆?我没有找到任何有用的东西。 (也许我是瞎子?Idk)
  4. 提前致谢^^

1 个答案:

答案 0 :(得分:2)

  

当处理器处于16位模式或32位模式时,播放声音会更容易吗?

它几乎没有什么区别,主要取决于你试图瞄准的声卡 - 现代声卡需要你能够在第一个4GiB的任何地方寻址。
将CPU置于unreal mode将是最好的 - 它很容易,让您可以访问4GiB地址空间并让您使用BIOS服务。

  

声音的哪种格式最好?

您可以查看MP3 page on Wikipedia,即使在输入技术细节之前,MP3解码也是一个非常冗长的主题。
它假设Fourier series的知识,所以你必须精通复杂的分析(在涉及复数的意义上 - 理论本身是一个基本工具)和信号处理。
如果您从未听说过"采样","窗口功能","量化"在那时,是时候阅读一些本科书了 当然,您必须精通处理二进制数据,图片或字段表应足以让您记下代码。
必须将MP3解码为一系列样本 我猜想有些卡支持硬件解码(我从未真正检查过)。

WAV file format更容易 - 大多数文件具有相同的固定标题(或者您只能支持)。
它几乎可以直接播放 - 如果您确定采样率,每个通道的比特等,并生成只有最小块的wav文件,您甚至可以直接寻找特定的偏移量并将数据直接传输到卡上。登记/> 如果不使用压缩,则WAV格式已经是一系列样本。

  

有没有公共可用的图书馆?我还没有发现任何有用的东西。

当然不是,为什么会这样? 一些解码MP3的开源项目肯定存在,为你指出它们并不是很有责任的,但当然没有一个能成为x86启动环境的目标。
你需要移植它 - 它可能不是微不足道的 从找到支持实模式的编译器开始,实现所需的最小CRT。

你还需要精通:

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

既然你知道所需的巨大努力,这里有一些建议:

  • 你考虑过旧的speaker吗? 您只能生成方波(它打开或关闭,1位"声卡和#34;)非常类似于Game Boy。
    热身可能会很好,因为它仍然需要为您的代码计时。
  • 您可以对SB16进行相对简单的编程 SB16很旧,所以它比现代卡更简单 DOSBox可以模仿它。
    我曾在DOS下写过answer on how to play a WAV file with such card 你只需要移植它。
  • 如果您想使用现代卡片,请找出系统中存在的卡片 由于大多数英特尔芯片组都附带一个,因此可能有两个 用于其芯片组的英特尔数据表始终记录了英特尔集成高清音频PCI设备 其他卡可能有专有的数据表 - 找到它们是90%的工作。
  • 在VM内部进行测试 这将使您免于无数次重启。

我并不是想吓唬你,在集会中播放声音或一般的多媒体内容是一件了不起的事情,你不应该停下来,但要注意,这是一项非常重要的工作,假设能够精通装配。 /> 如果您正在寻找快速而有效的解决方案,那么最好停止使用 由您来判断自己并决定最佳行动方案。