Sound.readData和Sound.lock之间的FMOD差异?

时间:2010-09-17 03:30:57

标签: c# c++ audio fmod

我正在尝试在FMOD库中对Sound.readData和Sound.lock之间的区别进行排序(我使用C#/ C ++进行编程,但我会用任何语言编写答案!)。最终目标是创建一个波形视图,我理解无法通过Channel.getWaveData轻松完成。

我已经能够同时获得Sound.readData和Sound.lock方法来分别使用createStream和createSound返回相同的数据(不确定它是否有效 - 例如解码 - 数据)。我想尽可能使用流方法来最小化内存占用,但我不确定我现在正在阅读的是什么,文档并不完全清楚。

2 个答案:

答案 0 :(得分:1)

本质上,两者之间的差异就是您正在访问的内容。

使用Sound :: lock锁定声音的样本缓冲区,因此当您使用createSound加载时,它会将文件解压缩为PCM并将其放入样本缓冲区。您可以使用此功能直接访问该缓冲区(您可以锁定所需的部分)。如果您在控制台上,则数据可能是本机压缩格式。作为旁注,“锁定”声音的想法来自于DirectSound API,您可以在其中“锁定”缓冲区以防止在您读取或写入时访问它,当您完成后,您可以解锁给定的访问权限。音频系统。

Sound :: readData是一种更加渐进的方式从声音中提取(流)PCM数据,这里实际上是在每次readData调用时将压缩数据解码为PCM。您可以在较小的块中执行此操作,并始终获得最终解码的PCM数据。这种方法更灵活,内存效率更高。

例如,您可以将10MB MP3作为流加载,然后使用Sound :: readData将其解码为PCM。否则,您需要将其作为样本加载(在createSound时将其解码为PCM),然后锁定一个大型缓冲区以获取PCM。

getWaveData用于在当前播放时显示波形,不应该用于解码文件的完整波形。根据对getWaveData的调用频率,您可能会多次获得相同的数据块,因为它是一次快照。

答案 1 :(得分:0)

经过更多的研究,我很确定两者之间没有显着差异。我可能最终会使用readData,因为它似乎更容易,更灵活。此外,锁定是此方法的一个令人困惑的名称:)。

相关问题