0

Ogg Vorbis コールバック、特に read_func コールバックが機能しないという問題がありましたが、他のすべては機能しているように見えました。私はこれを(私の意見では無意味な)変更を加えたところ、突然機能し始めました。ここで正確な違いを見るのに苦労しているので、誰かが正確な理由を知っていますか. 関数ポインタへの明示的なキャストが必要なようですか?

BEFORE (試行しても、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 は、私が問題をデバッグしていたときに fread する単なるラッパーでした。それにもかかわらず、構造の初期化を変更してキャストを実行する前に返されたエラーは常に「Not ogg vorbis」、またはコード用語では次の値でした:

#定義 OV_ENOTVORBIS -132

4

0 に答える 0