QAXDecoder API

概要

QAXDecoder は、QAX/QAS ファイルファイルのデコードライブラリである。 QVorbis ライブラリを、Vorbis ストリームデコードライブラリとして使用している。 実装言語は、C++ で、Windows API に依存している。提供 API は、C++ クラスとして 公開される。

API の使用方法としては、libvorbis の vorbisfile API と類似しており、比較的容易に 移行が可能である。

API

QAX ネームスペース

コンポーネント基底クラス

  1. // QComponent
  2. class QComponent {
  3. public:
  4. virtual void STDCALL Release() = 0;
  5. }; // QComponent

QComponent

ライブラリが提供するコンポーネントクラスの基底クラス

Release() メソッドで、コンポーネントを解放する。COM インターフェイスとは異なり、 参照カウンターを管理しないので、呼び出しにより直ちに解放される。

ファイルマッピングコンポーネント

  1. // QFileMapping
  2. class QFileMapping : public QComponent {
  3. public:
  4. virtual const VOID* STDCALL MapView(
  5. UINT64 offset,
  6. SIZE_T size) = 0;
  7. virtual void STDCALL UnmapView(
  8. const VOID* p) = 0;
  9. }; // QFileMapping

QFileMapping

QAX ファイルにアクセスするために、メモリマップドファイル読み込み機能を提供する。

ファイル読み込みのカスタマイズを行わない場合は、特に考慮する必要はない。

MapView() メソッド

MapViewOfFile() API で読み込みビューを割り当てる。

UnmapView() メソッド

UnmapViewOfFile() API で読み込みビューの割り当てを解除する。

デコーダーファクトリーコンポーネント

  1. // QDecoderFactory
  2. class QDecoderFactory : public QComponent {
  3. public:
  4. virtual QVorbisDecoder* STDCALL CreateVorbisDecoder(
  5. const BYTE key[20],
  6. const VOID* id,
  7. SIZE_T idSize,
  8. const VOID* setup,
  9. SIZE_T setupSize) = 0;
  10. }; // QDecoderFactory

QDecoderFactory

デコーダーコンポーネントを作成するためのコンポーネント。

ライブラリ内部で使用されるコンポーネントなので、使用者側では特に考慮する必要はない。

デコーダーコンポーネント

  1. // QItem
  2. struct QItem {
  3. std::string Type;
  4. std::string Name;
  5. }; // QItem
  6. // QDecoder
  7. class QDecoder : public QComponent {
  8. public:
  9. virtual QDecoderOutput* STDCALL CreateOutput(
  10. const char* name) = 0;
  11. virtual INT32 STDCALL GetItemCount() = 0;
  12. virtual QItem STDCALL GetItem(
  13. INT32 index) = 0;
  14. }; // QDecoder

QDecoder

QAX ファイルのデコードを行うコンポーネント

CreateOutput() メソッド

指定された名前 (name) のデータを検索し、該当する出力コンポーネントを作成する。 該当するデータがない場合は、0 を返す。

GetItemCount() メソッド

QAX ファイル内に含まれるデータアイテム数を返す。

GetItem() メソッド

データアイテムの 名前 (Name) タイプ (Type) を返す。 現在タイプには 'vorbis' のみが定義されている。

出力コンポーネント

  1. // QDecoderSpec
  2. struct QDecoderSpec {
  3. INT32 Channels;
  4. INT32 SamplingRate;
  5. UINT64 Samples;
  6. }; // QDecoderSpec
  7. // QDecoderOutput
  8. class QDecoderOutput : public QComponent {
  9. public:
  10. virtual QDecoderSpec STDCALL GetDecoderSpec() = 0;
  11. virtual UINT32 STDCALL Decode(
  12. VOID* buffer,
  13. UINT32 samples) = 0;
  14. virtual void STDCALL Seek(
  15. UINT64 sample) = 0;
  16. virtual std::string STDCALL QueryProperty(
  17. const char* name) = 0;
  18. }; // QDecoderOutput

QDecoderOutput

ストリームのデコード結果を出力するコンポーネント

GetDecoderSpec() メソッド

ストリームのパラメータを返す。

チャンネル数 (Channels), サンプリングレート (SamplingRate), 全サンプル数 (Samples)

Decode() メソッド

ストリームのデコードを行い最大 1 フレーム分の PCM データの出力を行う。PCM フォーマットは、16 bit 符号つき整数、 リトルエンディアンである。

samples には、バッファの最大サンプル数を与える。 buffer として必要なメモリ量は、2 * チャンネル数 * samples (Byte) となるので、注意が必要。

戻り値は、出力されたサンプル数である。0 が返った場合は、ストリームの終端に達したことを表す。

Seek() メソッド

ストリームの指定されたサンプル位置 (sample) へ移動する。

移動は、サンプル単位で正確に処理される。

QueryProperty() メソッド

ストリームに関連付けられたプロパティ値を問い合わせる。

プロパティ値は、QAX ファイル作成ツール QAXMaker で指定することができる。ループポイントの位置など、 アプリケーションで利用できる任意の情報を設定可能。

初期化関数

  1. API_EXTERN bool STDCALL Initialize();

ライブラリ初期化のため、プロセス開始時に一度のみ呼び出す。

QVorbis ライブラリの初期化も内部で行う。

コンポーネント作成関数

  1. API_EXTERN QFileMapping* STDCALL QFileMappingCreate(
  2. LPCWSTR path);
  3. API_EXTERN QDecoderFactory* STDCALL QDecoderFactoryCreate();
  4. API_EXTERN QDecoder* STDCALL QDecoderCreate(
  5. QDecoderFactory* pFactory,
  6. QFileMapping* pFileMapping);
  7. API_EXTERN IStream* STDCALL StreamReaderCreate(
  8. LPCWSTR path);
  9. API_EXTERN QDecoderOutput* STDCALL QASDecoderOutputCreate(
  10. QDecoderFactory* pFactory,
  11. IStream* pStream);

QFileMappingCreate()

path で指定されたファイルのファイルマッピングコンポーネントを作成する。

QAX ファイルのオープンに使用する。

QDecoderFactoryCreate()

デコーダーファクトリーコンポーネントを作成する。

QDecoderCreate()

デコーダーファクトリーコンポーネントとファイルマッピングコンポーネントを指定して、デコーダー コンポーネントを作成する。

StreamReaderCreate()

path で指定されたファイルを読み込む、IStream COM インターフェイスを作成する。

QAS ファイルのオープンに使用できる。

QASDecoderOutputCreate()

デコーダーファクトリーコンポーネントと読み込み用 IStream インターフェイスを指定して、 QAS ファイル出力コンポーネントを作成する。

例外

QAXDecoder ライブラリでは、エラー時には例外を送出する。

例外安全性を確保するため、すべての API 呼び出しコードにおいて、try, catch 文で例外を捕捉する 必要がある。

  1. // Exception
  2. class Exception {
  3. public:
  4. virtual ~Exception()
  5. {
  6. }
  7. virtual std::string ToString() = 0;
  8. }; // Exception

Exception 基底例外クラス

QAXDecoder ライブラリで送出するすべての例外クラスの基底クラス

ToString() メソッドで、追加情報を取得できる。

実際に送出される、派生例外クラスは以下の通り。