我正在使用fmod而我正在尝试使用不同的回调来定义我自己的文件读取。但似乎fmod不仅仅使用我的功能。实际上,在这种情况下,他会返回自己的结果。
FMOD_RESULT F_CALLBACK myopen(const char *name, int unicode, unsigned int *filesize, void **handle, void **userdata)
{
FILE *fp;
fp = fopen("Pump.mp3", "rb");
if (!fp)
{
return FMOD_ERR_FILE_NOTFOUND;
}
fseek(fp, 0, SEEK_END);
*filesize = ftell(fp);
FMOD_RESULT res = FMOD_System_CreateStream(gsystem, "Pump.mp3", FMOD_HARDWARE | FMOD_2D | FMOD_OPENONLY, 0, &son2);
ERRCHECK(res);
FMOD_Sound_SeekData(son2, 0);
*handle = son2;
return FMOD_OK;
}
int main()
{
FMOD_CREATESOUNDEXINFO *settings = malloc(sizeof(FMOD_CREATESOUNDEXINFO));
memset(info, 0, sizeof(FMOD_CREATESOUNDEXINFO));
settings->cbsize = sizeof(FMOD_CREATESOUNDEXINFO);
settings->decodebuffersize = 44100;
settings->useropen = myopen;
settings->userclose = myclose;
settings->userread = myread;
settings->userseek = myseek;
result = FMOD_System_CreateSound(system, "Pump.mp3", FMOD_SOFTWARE | FMOD_2D, settings, &sound);
// result != FMOD_OK if file doesn't exist for example
return 0;
}
我尝试了不同的方法来传递fmod我的函数,如FMOD_System_AttachFileSystem或FMOD_System_SetFileSystem。
我做错了什么?
感谢。
答案 0 :(得分:0)
看起来你的回调中混入了一些应用程序代码。 open回调不应该调用System :: createStream。通常的流程如下:
然后您将使用myread,myseek,myclose中的其他回调(代码中没有图示)来完成文件I / O.