Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sound.readData和Sound.lock之间的FMOD差异?_C#_C++_Audio_Fmod - Fatal编程技术网

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

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返回相同的数据(不确定它是否有效-例如解码数据)。如果可能的话,我想使用流方法来减少内存占用,但我不确定我现在读的是什么,文档也不完全

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


我已经能够使用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的频率,您可能会多次获得同一数据块,因为它是一个快照