У меня были проблемы с не работающими обратными вызовами 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
Задача ещё не решена.