C Определить мои обратные вызовы fmod
Я использую 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.
Что я делаю неправильно?
Благодарю.
1 ответ
Похоже, у вас есть некоторый код приложения, смешанный с вашим обратным вызовом. Открытый обратный вызов не должен делать вызовы System::createStream. Обычный процесс выглядит следующим образом:
- Передайте "имя" в fopen
- Искать до конца, используйте ftell, чтобы получить "размер файла"
- Ищите назад к началу
- Сохраните дескриптор файла в "ручке"
Затем вы должны использовать другие обратные вызовы (не изображенные в вашем коде) myread, myseek, myclose для завершения файлового ввода-вывода.