TheoraLib - WaveDecoder


目次

概要

theoralib_w_create
theoralib_w_free
theoralib_w_init
theoralib_w_load
theoralib_w_exists
theoralib_w_decodesample
theoralib_w_nowsample
theoralib_w_totalsample
theoralib_w_totaltime
theoralib_w_info
theoralib_w_comment


概要

音声をデコードし、任意フレームの画像を取得するためのWaveDecoderクラスです。
とはいっても、DLL上でのものですから普通のクラスのようには扱えません。
DLL側の命令を使って、生成、使用、解放を制御します。

音声がないファイルでもこのクラスは使用(Load)できます。
ただし、チャンネル数は1(Mono)〜2(Stereo)の範囲しか扱えません。


theoralib_w_create

function theoralib_w_create:Pointer;

RESULT...WaveDecoderClassアドレス

WaveDecoderクラスを生成し、アドレスを返します。
以後はこのアドレスを用いて操作を行います。


theoralib_w_free

procedure theoralib_w_free(
  ptr:Pointer               //WaveDecoderClassアドレス
);

WaveDecoderクラスを解放します。
忘れずに。


theoralib_w_init

procedure theoralib_w_init(
  ptr:Pointer                //WaveDecoderClassアドレス
);

初期化します。
Load前に戻します。


theoralib_w_load

function theoralib_w_load(
  ptr:Pointer;                         //WaveDecoderClassアドレス
  datasource:Pointer;                  //データソースアドレス
  readfunc:Ttheoralib_cb_read;         //データソースreadコールバック関数
  sizefunc:Ttheoralib_cb_size;         //データソースsizeコールバック関数
):Integer;

Theoraファイルを読み込みます。
この命令を行う前に「theoralib_m_load」と同じく、あらかじめデータソース対象となるストリームにファイルを読み込ませておく必要があります。
各種コールバック関数については「コールバック関数」を参照してください。
成功すると1、失敗すると0を返します。
データソースアドレスとコールバック関数は「MovieDecoder」クラスと同じものを共有することが可能です。

読み込みが行われると、ファイル全体のパケット情報を取得し、シーク情報を生成します。
読み込みにはそれなりの処理負荷と読み込み負荷がかかることに留意してください。

//TheoraMovieDecoder
movie := theoralib_m_create;
theoralib_m_setvrevers(movie,1); //上下反転
theoralib_m_load(
  movie,
  stream,cb_read,cb_size,    //データストリームポインタとコールバック関数
  bmp,cb_scanline,cb_resize, //ビットマップポインタとコールバック関数
  nil                        //デコードコールバック関数。使用しないのでNULL
);
//TheoraWaveDecoder
wave := theoralib_w_create;
theoralib_w_load(
  wave,
  stream,cb_read,cb_size       //データをWaveDecoderと共有
);

水色の部分が、データソースの共有部分です。


theoralib_w_exists

function theoralib_w_exists(
  ptr:Pointer                //WaveDecoderClassアドレス
):Integer;

RESULT...0:なし / 1:あり

音声情報があるかどうかを返します。
Theoraファイルに音声があるかどうかのチェックは、一度WaveDecoderでLoadさせて、このExists命令で取得してください。


theoralib_w_decodesample

function theoralib_w_decodesample(
  ptr:Pointer;                //WaveDecoderClassアドレス
  buf:Pointer;                //音声転送先アドレス
  offset:Integer;             //開始オフセットサンプル数
  size:Integer                //取得サンプル数
):Integer;

RESULT...デコードしたサンプル数

指定サンプル位置から、指定の長さのサンプル数を、転送先アドレスにデコード・転送します。
サンプル数は内包されたフォーマットをそのまま返しますが、チャンネル数は2チャンネル(L/R)、精度は16Bit整数に強制変換されます。
よって常に、[L][R][L][R][L][R][L][R]…というデータの並びでbufに転送されます。
戻り値にはデコードされたサンプル数が返されます。size未満の場合は終端に達したということになります。

指定位置を後方に移動させたり、前方に大きく移動させると、内部でシーク処理が発生します。
シーク処理の負荷はそれなりに重い処理ですので、基本的には現在のデコード位置(nowsample)から進めるようにして、シークを極力減らすコードを書くようにしましょう。

nowpos = theora_w_nowsample(wave);
theoralib_w_decodesample(wave,SoundBuffer,nowpos,1024*64);



theoralib_w_nowsample

function theoralib_w_nowsample(
  ptr:Pointer                 //WaveDecoderClassアドレス
):Integer;

RESULT...現在のサンプル位置

現在の処理サンプル位置を返します。
nowtimeはありませんので、TotalTimeとTitalSampleを使って計算してください。


theoralib_w_totalsample

function theoralib_w_totalsample(
  ptr:Pointer                 //WaveDecoderClassアドレス
):Integer;

RESULT...トータルサンプル数

トータルサンプル数を返します。


theoralib_w_totaltime

function theoralib_w_totaltime(
  ptr:Pointer                 //WaveDecoderClassアドレス
):Integer;

RESULT...トータルタイム(ms)

トータルタイムを返します。
単位はミリ秒(ms)です。

あまり正確ではありません。
音声はサンプル数で扱うことが前提で設計されています。

MovieDecoderのTotalTimeとは異なる数値を返すようなので注意してください。


theoralib_w_info

function theoralib_w_info(
  ptr:Pointer                 //WaveDecoderClassアドレス
):Pointer;

RESULT...Ptheoralib_vorbisinfo (Ttheoralib_vorbisinfo構造体のアドレス)

Vorbisインフォメーション情報の構造体のアドレスを返します。
以下のようにして情報を取得します。

var
  vi : Ptheoralib_vorbisinfo;
begin
  vi := theoralib_w_info(wave);
  Memo1.Lines.Add(format('Rate %d',[vi.rate]));
end;

構造体についてはソースファイルを参照してください。


theoralib_w_comment

function theoralib_w_comment(
  ptr:Pointer                 //WaveDecoderClassアドレス
):Pointer;

RESULT...Ptheoralib_vorbiscomment (Ttheoralib_vorbiscomment構造体のアドレス)

Vorbisコメント情報の構造体のアドレスを返します。
theoralib_w_infoと同じようにアドレスを受け取ってください。
構造体についてはソースファイルを参照してください。