我正在使用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,即不同的用户数据 这是特定于文件的。
但是如何访问此文件特定指针?或者还有其他解决办法吗?
感谢。
答案 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::map
或std::unordered_map
将每个句柄与C ++对象指针相关联,或
使用动态创建的trampoline函数,并将对象地址硬连线。
使用了第三种选择,例如在1990年代的Borland的ObjectWindows框架中,它通常是最快的,但它与当前的恶意软件保护方案相冲突,并且因为C ++标准库不支持它(据我所知,Boost也不支持它,尽管在SO的C ++休息室里,Good Puppy曾经提出了一个关于它的建议,它必然是特定于平台的机器代码。
因此,如果你不知道如何做第一个选项,我建议你选择第二个,std::map
或std::unordered_map
将句柄与C ++对象相关联。
然后,主要的剩余技术障碍是确定创建地图条目的适当时间,以及删除它的适当时间。这在很大程度上取决于回调方案。不幸的是,我没有与你的经验,但也许其他人可能会对这个细节感兴趣。