▼ 2008/05/02(Fri) 根を詰めても実らないこともある
賞金付きSRMも忘れて oggVorbis (というよりも、C++/CLI) と格闘。
C++/CLIで作る。System::IO::Streamを継承した、Vorbisデコーダクラス。
oggVorbisのライブラリは元ファイル読み込みにcallback関数が使える。
read_func(void *ptr, size_t size, size_t nmemb, void *datasource);
コンストラクタにVorbisのStreamを引数にとる。
Read(...)はデコードしたPCMを返す。
ことにしようと思った。
ov_open_callback から詰まった。
コールバック関数のポインタとして何をどうやって渡せばいいんだろう。
callbacks.read_func = (size_t (__cdecl *)(void *,size_t,size_t,void *)) (void*)Mashal::GetFunctionPointerForDelegate(gcnew read_func(this, &Vorbis::VorbisStream::inner_read));
こうですか? わかりません><;;
# 呼び出し規約からして怪しすぎるので、たぶんこれじゃあ動かないよなぁ……
あるいは、read_funcの最後の void* はユーザ定義の値を入れておけるんだけど、
これにManagedなクラスの参照を入れるのはpinする他は無理よなぁ……。
Unmanagedなクラスならポインタを突っ込んでおけば解決しちゃうけど。
結局……どうしようかなと思う。
OggVorbisの再生はどうしてもしたいので、
今回は普通のWin32なDLL + .NETのプラットフォーム呼び出し(C#でも使う)のか。
でも、なんか、.NETのDLL作ってみたいなと、思うんだけど。
……わかんないなぁ……。

loading...
1: J-SON 2008年05月02日(Fri) 午前4時51分
去年ぐらいに、C++/CLIでov_open_callback使って似たようなもん
作ったことあるよ。HDD掘れば昔のソースが出てくるかm
2: つーさ 2008年05月02日(Fri) 午前9時43分
たぶんここだけ解決できれば後はすらすら行くはずなのに……とか悔しい思いをしています。
もし、そのソースで、Managedなクラスへの参照を上手く扱えていて、
もし、差し支えなければ是非読んでみたいのですが……。
……なんかいつもJさんが1枚も2枚も、というより10枚も20枚も上手(ウワテ)でちょと悔しいです。
プログラミングも音ゲもその人の良さも弟子入りさせてほしいところです。