Windowsゲームプログラミング

MP3プレイヤーを作る>dllによる再生

 最近、携帯プレイヤーのブームなどで話題のMP3プレイヤーを作ってみましょう。MP3とは簡単に言えば音声の圧縮形式の事ですから、デコードさえすれば再生出来るわけです。今回は、再生にフリーウエアとして公開されているMP3用ライブラリVBMP3.dll((C)苅込大輔氏)を利用してみました。このライブラリを使うと、ファイル名を指定するだけで簡単にMP3ファイルを再生する事が出来ます。

dllの利用

 MP3用ライブラリVBMP3.dllは、dllという形式のライブラリになっています。dllは、Windowsで関数をライブラリ化する標準的な形式でAPIの実体もこのdllの集合です。dllを使うのは簡単で、まず関数の型を宣言して関数がdllである事をコンパイラに通知するだけで後は通常の関数と同じ感覚で使う事が出来ます。つまり関数の型さえわかれば、そしてその型を扱う事さえ出来れば、どんな言語でもdll内の関数を利用出来るわけです。実際、今回使うVBMP3.dllもその名の通り最初はVisualBasci用であったものがVC++で動作確認され、VC++用のヘッダを付けて公開されたようです。そして、今回ここで改めてDelphiでの動作も確認できたわけですね。
 ネットワーク上には他にも便利なdllがたくさん公開されていますから、いろいろなdllを試してみると良いでしょう。多くの場合、dllにはC/C++用のヘッダしか付いてきませんが、ヘッダやドキュメントなどで関数の形式を調べて自分で宣言する事でdllDelphiでも使う事が出来ます。また、別の場所でDelphi用のヘッダが公開されている場合もあります。

 では、早速今回使うVBMP3.dllの初期化関数vbmp3_init()を宣言してみましょう。この関数は、VC++用のヘッダファイルで以下のように宣言されていますので、これと同じ形式の宣言をDelphiで行えば良いわけです。

  BOOL APIENTRY vbmp3_init();

 この関数の型宣言とDLL宣言をDelphiで行うと以下のようになります。

  function vbmp3_init:Boolean;stdcall;external 'VBMP3';

 前半のfunction vbmp3_init:Boolean;が関数自体の型ですね。次のstdcallは引数の受け渡し形式を指定する「呼び出し規約」というもので、dllでは通常stdcallになります。そして、最後のexternal 'VBMP3'で、この関数がVBMP3.dll内にある事を宣言するわけです。

 一度この宣言をしておけば、後はプログラム内で通常の関数と同じようにvbmp3_initを使用できます。今回は、とりあえず再生だけする事にして、必要になりそうな関数を宣言しておきました。この宣言は、implementation節で行います。

  function vbmp3_init:Boolean;stdcall;external 'VBMP3';
  function vbmp3_open(pszName:PChar;pInfo:Pointer):Boolean;
    stdcall;external 'VBMP3';
  function vbmp3_play:Boolean;stdcall;external 'VBMP3';
  function vbmp3_free:Boolean;stdcall;external 'VBMP3';
  function vbmp3_close:Boolean;stdcall;external 'VBMP3';

 名前を見れば、大体機能は想像できますね。まず、vbmp3_initで初期化したら、再生するファイルをopenし、playする。これで再生できます。ただし、既にファイルを開いているかもしれないので、openの前にcloseしましょう。アプリケーションの終了時には、freeでライブラリが使用していたメモリを解放します。

 なお、vbmp3_openでポインタを渡していますが、これは以下の形の構造体のアドレスです。この構造体には、再生時間や曲名などファイルに関する情報が入って来ます。

  InputInfo=packed record
    szTrackName:array [0..127] of char;
    szArtistName:array [0..127] of char;
    channels:Integer;
    bitRate:Integer;
    samplingRate:Integer;
    totalSec:Integer;
  end;

 今回のプログラムでは、この構造体をグローバル変数として用意し、@演算子で構造体のアドレスを渡すようにしました。

プログラム

 プログラムを起動して「開く」ボタンをクリックするとファイル選択のダイアログが出てくるので、MP3ファイルを選択してください。ファイルを選択するとそのファイルを再生します。「開く」ボタンのイベントハンドラは以下の通り。

  procedure TForm1.Button1Click(Sender: TObject);
  begin

    if not(OpenDialog1.Execute) then
      Exit;

    vbmp3_close;
    vbmp3_open(PChar(OpenDialog1.FileName),@info);
    vbmp3_play;

  end;

 なお、プログラムの実行にはVBMP3.dllを実行ファイルと同じディレクトリ、またはWindowsのシステムディレクトリにおいておく必要があります。

 最後になりましたが、VBMP3.dllという素晴らしいライブラリを公開されている作者の苅込大輔(ミケ)さんに感謝いたします。実際、今回私がMP3を再生するためにやった事と言えば単に関数・構造体の宣言とファイル名の設定だけで、後はすべてVBMP3.dllの機能で再生出来ました。

プログラムダウンロード(Delphi2以上、158KB)
戻る