我遇到了Ogg Vorbis回调无效的问题,特别是read_func回调,其他一切似乎都有效。我只是做了这个(在我看来毫无意义)改变,突然它开始工作了。有谁知道确切原因,因为我很难看到这里的确切差异。看来对函数指针的显式强制转换是必要的吗?
之前(尽管尝试过,Ogg仍未读入有效的标题数据):
ov_callbacks oggFileCallbacks;
oggFileCallbacks.read_func = ogg_read_func;
oggFileCallbacks.seek_func = ogg_seek_func;
oggFileCallbacks.tell_func = ogg_tell_func;
oggFileCallbacks.close_func = ogg_close_func;
AFTER(完美按预期工作):
ov_callbacks oggFileCallbacks = {
(size_t (*)(void *, size_t, size_t, void *)) ogg_read_func,
(int (*)(void *, ogg_int64_t, int)) ogg_seek_func,
(int (*)(void *)) ogg_close_func,
(long (*)(void *)) ogg_tell_func
};
编辑:更多信息
当我修复问题时结构初始化确实改变了,因为它是使用括号中的内容构造的,但我不知何故怀疑真正的问题是缺少显式转换。我以为我对C ++有很好的了解,但我已经决定在遇到C ++时我需要真正弄清楚这些奇怪之处。需要注意的是,我的代码是用C ++编写的,而Vorbis库是用简单的C语言编写的。我还决定强制使用这些函数指针来使用C原型声明样式,但这也没有帮助。 结构是这样初始化的(对于那种不起作用的旧方式):
ov_callbacks oggFileCallbacks;
这是ogg_read_func的函数定义:
size_t ogg_read_func(void *ptr, size_t size, size_t nmemb, void *datasource) {
以下是原型:
// Ogg read functions (mainly useful for android (non standard file io ))
extern "C" {
size_t ogg_read_func(void *ptr, size_t size, size_t nmemb, void *datasource);
int ogg_seek_func(void *datasource, ogg_int64_t offset, int whence);
int ogg_close_func(void *datasource);
long ogg_tell_func(void *datasource);
}
当我调试问题时,ogg_read_func只是一个fread的包装器,尽管在更改结构初始化和执行转换之前,返回的错误始终是" Not ogg vorbis",或者在代码术语中这个值:
#define OV_ENOTVORBIS -132