OggVorbisデータを汎用ストリーム経由で再生する

OggVorbisライブラリは汎用ストリームに対応しています。
C++でいうiostream、istream、ostreamに相当します。
今回はistreamを用いてOggVorbisデータを再生してみます。
この汎用ストリームを用いることで、ファイル以外にメモリ上やネットワークからOggVorbisデータを読み込み、再生することが可能になります。

OggVirbisデータをストリームでオープンするにはov_open_callbacks()関数を使います。
これは以下のフォーマットになっています。

第1引数のdatasourceにはアプリケーションで使うデータへのポインタを指定します。
これは後述するコールバック関数に渡されるポインタです。
したがって、ストリームのインスタンスなどを指定すればよいです。

第2引数のvfにはOggVorbis_File型の変数へのポインタをしていします。

第3引数のinitialはとりあえずNULLで構いません。
第4引数のibytesには0を指定します。

第5引数のcallbacksには次の構造体データへのポインタを指定します。

この関数ポインタからコールバック関数を呼び出します。
ov_open_callbacks()関数の呼び出し以降は通常通りにOggVorbisデータを扱うことが出来るようになります。
重要なのは初期化の部分です。

以上を踏まえ、istream経由でOggVorbisファイルを再生するプログラムを以下に記します。

今回のポイントは次の部分です。

ifstreamでOggVorbisファイルを開き、それをov_open_callbacksの第1引数に指定しています。
ov_callbacks構造体には自前で用意した関数を指定しています。
これらの関数は以下のように実装しました。

Callback_Read()はデータ読み込み、Callback_Seek()はシーク、Callback_Close()はストリームクローズ、Callback_Tell()はストリーム位置を返す関数となります。
上記プログラムでは、istreamを用いてこれらの動作を実現させています。

このように、汎用ストリームでの再生はすんなりと出来ます。
因みに、ov_open()関数は以下のように実装されています。

上記より、C言語の標準ライブラリのファイル操作関数を直で指定していることが分かります。

このように、OggVorbisライブラリは最初から汎用ストリームを意識して設計されているので融通が利きますね。

■参考サイト
その5 メモリにあるOggファイルを再生する
https://svn.xiph.org/trunk/Tremor/vorbisfile.c