2012-01-31 143 views
1

这是一个后续行动,我刚才的问题:Rendering some sound data into one new sound data?fmod:如何使用FMOD_OUTPUTTYPE_WAVWRITER_NRT?

我创建一个程序,将处理包含了完善的银行和时间偏移标记时,声音必须进行播放,并从其生成波形文件文件。

所以我想FMOD_OUTPUTTYPE_WAVWRITER是完美的工作。

对于音库,想象这样的事情在一个文件:

0 kick.wav 
1 hit.wav 
2 flute.wav 

,其中左边的数字说明在右边, 和时间偏移声音文件名的声音ID:

1000 0 
2000 1 
3000 2 

其中左边的数字告诉节目何时必须以毫秒播放声音,而右边的数字是声音ID。因此,当我开始播放节目时,FMOD将生成一个波形文件,其中包含第一秒钟内的kick(来自kick.wav),第二秒钟内击中,第三秒钟内有一个笛子,而我必须等待至少3秒才能完成任务。但是,如果我想渲染更长的音乐,比如说5分钟,那么我必须等待至少5分钟才能完成任务,因为我会依赖系统计时器来播放声音在文件中指定的偏移量以及更新FMOD :: System的while(true)循环。我认为必须有一种更快的渲染方式,而不必等待程序在指定的时间实际渲染声音,因为我在像DAW程序中看到的那样,例如索尼ACID,可以使轨道真的很快。

然后我稍微查看一下API参考,有FMOD_OUTPUTTYPE_WAVWRITER_NRT,然后我认为这可能是解决方案,所以我试图立即更改输出设备而不修改任何其他内容,并且生成的波形文件听起来很乱!我听到很多重复的声音,很长的延迟等。

那么,如何正确使用非实时版本呢?在我的情况下使用NRT时,更新fmod系统的正确方法是什么?

我无法在fmod文档本身中找到有关NRT输出类型使用情况的明确说明。

无论如何,我在Windows环境中使用C++。

谢谢。

回答

1

FMOD_OUTPUTTYPE_WAVEWRITER_NRT的工作方式是每次调用System :: update时生成音频。每'更新'生成的数据量由System :: setDSPBufferSize的bufferlength参数控制。

所以你调用System :: update的速度越快,数据生成的速度就越快。现在,您工作的重要部分是将“x”次呼叫转换为System :: update,以便将其与您的时间线匹配。

默认情况下,FMOD以每秒48000个样本的采样率运行(可通过System :: setSoftwareFormat进行配置)。因此,如果将'bufferlength'设置为1024,则每次调用System :: update时,将生成1024个样本(写入wav文件)。所以... 1024/48000 = 0.021333秒〜每次通话产生21.3毫秒的数据。现在你可以计算你需要调用System :: update来获得你有的时间戳的次数。