C定义我的fmod回调

时间:2015-06-23 18:16:01

标签: 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 个答案:

答案 0 :(得分:0)

看起来你的回调中混入了一些应用程序代码。 open回调不应该调用System :: createStream。通常的流程如下:

  • Pass' name'来fopen
  • 寻求结束,使用ftell获取' filesize'
  • 回到起点
  • 将文件句柄存储在' handle'

然后您将使用myread,myseek,myclose中的其他回调(代码中没有图示)来完成文件I / O.