FMod记忆流问题

时间:2011-09-22 01:42:15

标签: c++ access-violation fmod

编辑:嗯......这很有趣。我将设置设置为指针并传递给它。工作得很漂亮。所以,这就解决了。对于那些对答案好奇的人,我会保持开放。

我遇到了从内存流在FMod中创建声音的问题。我查看了FMod附带的loadfrommemory示例,然后进行了操作。首先,我正在使用的代码......

CSFX::CSFX(CFileData *fileData)
{
FMOD_RESULT result;
FMOD_CREATESOUNDEXINFO settings;
settings.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
settings.length = fileData->getSize();
_Sound = 0;
std::string temp = "";

for (int i = 0; i < fileData->getSize(); i++)
    temp += fileData->getData()[i];

result = tempSys->createSound(temp.c_str(), FMOD_SOFTWARE | FMOD_OPENMEMORY, &settings,        &_Sound);
}

就像这样,我在tempSys-&gt; createSound()上遇到了访问冲突。我已经确认tempSys有效,因为它在从文件创建声音时起作用。我还通过将内容写入文件来确认我的数据的char *是有效的,然后我可以在Media Player中打开该文件。我觉得设置有问题。如果我将该参数更改为0,程序不会爆炸,我最终得到结果= FMOD_ERR_INVALID_HANDLE(考虑到第3个参数为0,这是有意义的)。知道我做错了吗?

另外,请忽略std :: string的使用,我将其用于某些测试目的。

2 个答案:

答案 0 :(得分:2)

通过将设置转换为指针来解决。请参阅以下代码:

CSFX::CSFX(CFileData *fileData)
{
FMOD_RESULT result;
FMOD_CREATESOUNDEXINFO * settings;

_Sound = 0;
std::string temp = "";

for (int i = 0; i < fileData->getSize(); i++)
    temp += fileData->getData()[i];
settings = new FMOD_CREATESOUNDEXINFO();
settings->cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
settings->length = fileData->getSize();

result = tempSys->createSound(temp.c_str(), FMOD_SOFTWARE | FMOD_OPENMEMORY, settings, &_Sound);
delete settings;
settings = 0;
}

答案 1 :(得分:1)

使用前需要设置memset。

memset(&amp; settings,0,sizeof(FMOD_CREATESOUNDEXINFO);

否则它将包含垃圾并可能崩溃。