0

我遇到了 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;

之后(按预期完美工作):

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++ 编写的,而 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 只是我调试问题时的一个包装器,尽管在更改结构初始化和执行强制转换之前返回的错误始终是“Not ogg vorbis”,或者在代码术语中这个值:

#define OV_ENOTVORBIS -132

4

0 回答 0