【问题标题】:FMod Memory Stream ProblemFMod 内存流问题
【发布时间】:2011-09-23 05:56:47
【问题描述】:

编辑:嗯……这很有趣。我将设置变成了一个指针并传递了它。工作得很漂亮。所以,这就解决了。我会把它留给任何对答案感兴趣的人。

我在 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->createSound() 上遇到访问冲突。我已经确认 tempSys 是有效的,因为它在从文件创建声音时工作。我还通过将内容写入文件来确认我的数据中的 char * 是有效的,然后我可以在 Media Player 中打开该文件。感觉设置有问题。如果我将该参数更改为 0,则程序不会崩溃,我最终会得到 result = FMOD_ERR_INVALID_HANDLE(考虑到第三个参数为 0,这很有意义)。知道我做错了什么吗?

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

【问题讨论】:

    标签: c++ access-violation fmod


    【解决方案1】:

    通过将设置变成指针来解决。见以下代码:

    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;
    }
    

    【讨论】:

      【解决方案2】:

      使用前需要进行memset设置。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-14
        • 2011-08-03
        • 2016-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多