Sound.readData 和 Sound.lock 之间 FMOD 的区别?

Posted

技术标签:

【中文标题】Sound.readData 和 Sound.lock 之间 FMOD 的区别?【英文标题】:Difference in FMOD between Sound.readData and Sound.lock? 【发布时间】:2010-09-17 03:30:56 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

以上是关于Sound.readData 和 Sound.lock 之间 FMOD 的区别?的主要内容,如果未能解决你的问题,请参考以下文章

& 和 && 区别和联系,| 和 || 区别和联系

第三十一节:扫盲并发和并行同步和异步进程和线程阻塞和非阻塞响应和吞吐等

shell中$()和 ` `${}${!}${#}$[] 和$(()),[ ] 和(( ))和 [[ ]]

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

JS中some()和every()和join()和concat()和pop(),push(),shift(),unshfit()和map()和filter()