C# Sound.readData和Sound.lock之间的FMOD差异?
我正在尝试对FMOD库中Sound.readData和Sound.lock之间的差异进行排序(我用C#/C++编程,但我会用任何语言回答!)。最终目标是创建波形视图,据我所知,使用Channel.getWaveData无法(轻松)完成此操作C# Sound.readData和Sound.lock之间的FMOD差异?,c#,c++,audio,fmod,C#,C++,Audio,Fmod,我正在尝试对FMOD库中Sound.readData和Sound.lock之间的差异进行排序(我用C#/C++编程,但我会用任何语言回答!)。最终目标是创建波形视图,据我所知,使用Channel.getWaveData无法(轻松)完成此操作 我已经能够使用Sound.readData和Sound.lock方法分别使用createStream和createSound返回相同的数据(不确定它是否有效-例如解码数据)。如果可能的话,我想使用流方法来减少内存占用,但我不确定我现在读的是什么,文档也不完全
我已经能够使用Sound.readData和Sound.lock方法分别使用createStream和createSound返回相同的数据(不确定它是否有效-例如解码数据)。如果可能的话,我想使用流方法来减少内存占用,但我不确定我现在读的是什么,文档也不完全清楚。经过更多的研究,我相当确定这两者之间没有显著的区别。我可能最终会使用readData,因为它看起来更简单、更灵活。此外,lock是这个方法的一个令人困惑的名称:)。从本质上讲,两者之间的区别在于您正在访问什么 使用Sound::lock,您将锁定声音的样本缓冲区,因此当您使用createSound加载时,它将文件解压缩到PCM并将其放入样本缓冲区。您可以使用此函数直接访问该缓冲区(锁定所需的缓冲区部分)。如果您在控制台上,则数据可能是本机压缩格式。作为旁注,“锁定”声音的想法是针对DirectSound API的,在DirectSound API中,您可以“锁定”缓冲区,以防止在读取或写入缓冲区时对其进行访问,完成后,您可以解锁对音频系统的访问权限 声音::readData是从声音中提取(流式传输)PCM数据的一种更为渐进的方法,在这里,您实际上是通过每次readData调用将压缩数据解码到PCM。在较小的块中执行此操作,始终可以获得最终解码的PCM数据。这种方法更灵活,内存效率更高 例如,您可以将一个10MB的MP3作为流加载,然后使用Sound::readData分块将其解码到PCM。否则,您需要将其作为样本加载(在createSound时间将其解码到PCM),然后锁定大量缓冲区以获取PCM getWaveData用于显示当前播放时的波形,不应用于解码文件的完整波形。根据调用getWaveData的频率,您可能会多次获得同一数据块,因为它是一个快照