5

編集: うーん...それは非常に興味深いです。設定をポインタにして渡しました。美しく働きました。ということで、これで解決です。答えに興味のある人のために開いたままにします。

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 になります (3 番目のパラメーターが 0 であることを考えると、これは理にかなっています)。私が間違っていることは何か分かりますか?

また、std::string の使用を無視してください。テスト目的で使用していました。

4

2 に答える 2

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;
}
于 2011-09-22T02:15:02.007 に答える
1

使用する前に設定をmemsetする必要があります。

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

そうしないと、ゴミが含まれ、クラッシュする可能性があります。

于 2011-09-22T21:56:47.887 に答える