0

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

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

4

2 回答 2

1

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

于 2010-09-19T04:00:14.230 回答
0

本质上,两者之间的区别在于您正在访问什么。

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

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

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

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

于 2010-09-20T00:32:08.903 回答