在 GBDK c 中使用采样音频播放时如何运行代码?

Posted

技术标签:

【中文标题】在 GBDK c 中使用采样音频播放时如何运行代码?【英文标题】:How can I have code running while using sampled audio playback in GBDK c? 【发布时间】:2014-10-03 19:04:14 【问题描述】:

我正在为GBDK 的 GameBoy 制作游戏,并且我正在尝试为游戏添加声音。 GBDK 有一个函数可以从一组值中播放声音,唯一的问题是在播放声音时脚本的其余部分会冻结。有没有办法让它们同时运行?

【问题讨论】:

我不知道“gbdk”。是否支持多线程? 我不知道我不会假设,但我只是在 2 周前才开始了解它,所以也许 @SteveEmmerson Nope - GBDK 是 Nintendo Gameboy 的 C 编译器,它没有多线程。 @isaactschampl 很确定采样音频播放(这是您正在使用的)不支持同时做其他事情 - 采样播放实际上使用了大量的 CPU。您可以尝试使用其他音频播放方法,但显然它们不会有相同的效果。 这引出了一个问题,一个gameboy如何同时玩游戏和声音? 【参考方案1】:

使用sampled audio playback 时无法运行代码。这是因为它实际上使用全 CPU 来执行此播放。如果您想使用常规音效,则需要在游戏播放时暂停游戏,或使用其他方法。下面我尝试用其他的播放方法来总结一下,但是有点复杂,我不是专家。


使用“正常”音效

这是一种 WIP - 我对它不是很有经验,但它应该可以让你开始。

要使用音效,您需要写入 GameBoy 音频寄存器。这可以在 GBDK 的hardware.h 中找到,它自动包含在对gb\gb.h 的引用中。但是(当然)寄存器没有任何文档。此信息可在GB Cribsheet 上找到。还有this sound documentation file(不幸的是,它在windows 编码上的行为很奇怪——用记事本以外的东西打开),以及在Devrs.com sound documentation 上找到的一些其他信息。

处理 GBSOUND.TXT:

可以访问声道的地址是: $Addresses:(描述),(注册速记) $FF10 -- $FF14:通道 1,简称 NR10-NR14 $FF15 未使用,可能是通道 2 的扫描注册 原来 $FF16 -- $FF19:通道 2,简称 NR21-NR24 $FF1A -- $FF1E:通道 3,简称 NR30-NR34 $FF1F 未使用,可能是通道 4 的扫描注册 原来 $FF20 -- $FF23:通道 4,简称 NR41-NR44 $FF24控制Vin状态和音量,简称NR50 $FF25 选择每个通道去哪个输出,简称为NR51 $FF26是状态寄存器,也控制着音响电路的电源。 简称NR52 $FF27 -- $FF2F 未使用。 $FF30 -- $FF3F 是用于通道的 4 位样本的加载寄存器空间 3

在GBDK中,寄存器被命名为NR10_REGNR11_REGNR12_REG等。

另外,请尝试查看示例程序sound.c,不幸的是,它无法为我编译。我可能会对其进行编辑以包含更多信息。


回答@franklin的问题:

这引出了一个问题,一个游戏男孩如何同时玩游戏和声音?

他们通常不会在播放样本时这样做。例如,如果你看神奇宝贝黄色,皮卡丘的哭声是通过样本播放完成的。但是,在播放的同时,什么也没做。另一方面,诸如普通背景音乐之类的事情是使用另一个 audio hardware 完成的(对不起,不是很详细的 wiki 链接)。同样,虽然移动音效是通过噪声通道完成的(也用于采样播放),但它们实际上并不是采样音频。这样,游戏就可以继续运行了。

【讨论】:

以上是关于在 GBDK c 中使用采样音频播放时如何运行代码?的主要内容,如果未能解决你的问题,请参考以下文章

您如何获得 Windows 音频播放的当前采样率?

音频重采样

音频中采样位数,采样率,比特率的名词解释(转)

如何在iphone中同时播放音频和视频

ffplay源码分析6-音频重采样

.Net 如何直接播放音频样本