在C ++下使用Fmodex回调

时间:2015-06-22 16:45:52

标签: c++ fmod

我正在使用fmodex,而且我试图在C ++下使用FMOD_FILE_OPEN_CALLBACK。

FMOD_RESULT F_CALLBACK FMOD_FILE_OPEN_CALLBACK(const char *name, unsigned int *filesize, void **handle, void *userdata);

但我想执行一个类的方法。所以我想把当前对象作为回调的userdata传递,并执行我的回调方法,因为它提出了here。 但与Fmod Studio不同,FMOD_CREATESOUNDEXINFO中没有fileuserdata,只有userdata指针。

文档说:

  

[w]可选。指定0以忽略。这是要附加到的用户数据   创作过程中的声音。通过Sound :: getUserData访问。注意:这个   未传递给FMOD_FILE_OPENCALLBACK,即不同的用户数据   这是特定于文件的。

但是如何访问此文件特定指针?或者还有其他解决办法吗?

感谢。

2 个答案:

答案 0 :(得分:1)

这个解决了吗?如果不是,我是怎么做的。

FMOD_CREATESOUNDEXINFO* info = new FMOD_CREATESOUNDEXINFO();
info->cbsize = sizeof(FMOD_CREATESOUNDEXINFO);

// This is the field you want to set
info->fileuserdata = someUserData;

_system->createStream(file.c_str(), FMOD_DEFAULT, info, &_currentSound);

您使用的是旧版本的fmod库吗?在我的系统上,fileuserdata字段确实存在。我使用fmod studio安装附带的fmodex低级api。

答案 1 :(得分:0)

当有问题的API没有为回调提供用户数据指针,但确实提供某种句柄时,就像这里的情况一样,那么你可以将每个回调调用转发给C ++方法(非静态成员函数)以两种通用方式+ 1种API特定方式:

  • 使用API​​功能将C ++对象指针与每个句柄相关联,或

  • 使用静态存储std::mapstd::unordered_map将每个句柄与C ++对象指针相关联,或

  • 使用动态创建的trampoline函数,并将对象地址硬连线。

使用了第三种选择,例如在1990年代的Borland的ObjectWindows框架中,它通常是最快的,但它与当前的恶意软件保护方案相冲突,并且因为C ++标准库不支持它(据我所知,Boost也不支持它,尽管在SO的C ++休息室里,Good Puppy曾经提出了一个关于它的建议,它必然是特定于平台的机器代码。

因此,如果你不知道如何做第一个选项,我建议你选择第二个,std::mapstd::unordered_map将句柄与C ++对象相关联。

然后,主要的剩余技术障碍是确定创建地图条目的适当时间,以及删除它的适当时间。这在很大程度上取决于回调方案。不幸的是,我没有与你的经验,但也许其他人可能会对这个细节感兴趣。