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 для завершения файлового ввода-вывода.

Другие вопросы по тегам