ホーム < ゲームつくろー! < Ogg Vorbis入門編
Ogg Vorbis入門編
その4 Ogg Vorbisプレイヤークラス:サンプルプログラム
Ogg Vorbis入門編その4「Ogg Vorbisプレイヤークラス」で説明した内容を踏まえたサンプルプログラムです。実行するとコンソール画面が現れて、指定のOggファイルがストリーム再生されます。
サンプルスクリーンショット。現在の操作が表示されています。
このサンプルはOgg VorbisからPCM音声をデコードしてDirectSoundを通してストリーム再生をしています。エスケープを押すとあらかじめ決めてあるテスト動作を連続して行います。見た目は前章の「Oggファイルでストリーム再生」とほとんど変わりませんが、ストリーム再生の部分がクラスに置き換わっています。以下のメイン関数を見てお分かりになると思いますが、使い方は極めて簡単です(^-^)
○ サンプルの動かし方
サンプルを動かすために必要なファイルはこちらからダウンロードできます(OggSmp_No4.lzh)。空のコンソールアプリケーションを作成し、アーカイブに入っているクラスをすべて追加し、Ogg Vorbisライブラリを環境に設定するとビルドできます。実行して音楽を聴くにはプロジェクトフォルダ下に「Test.Ogg」というOggファイルが必要です。お手元の音楽をOggファイルに変換して試してみてください。
PCMDecoderオブジェクトはスマートポインタに包む必要があります。またIDirectSound8インターフェイスはCOMポインタに包みます。これはポインタ先のアクセスを保障するためです。使用の際はご注意下さい。
○ Ogg Vorbisライブラリについて
このサンプルを動かすには別途Ogg Vorbisライブラリを組み込む必要があります。組み込み方についてはOgg Vorbis入門編その1「Ogg Vorbisライブラリのインストール」に詳しく記載しておりますのでご参照ください。うまくいかない場合は掲示板にご報告下さい。
// Ogg Vorbisストリーム再生クラステストプログラム // // 製作者 : IKD // HP : http://marupeke296.com // #pragma comment ( lib, "dxguid.lib" ) #pragma comment ( lib, "dsound.lib" ) #include <dsound.h> #include <tchar.h> #include "OggDecoder.h" #include "PCMPlayer.h" #include "DixSmartPtr.h" #include "DixComPtr.h" // コンソールのウィンドウハンドル取得 HWND GetConsoleHwnd(void) { TCHAR pszWindowTitle[ 1024 ]; GetConsoleTitle( pszWindowTitle, 1024 ); return FindWindow( NULL, pszWindowTitle ); } // 一時停止関数 void StopProc() { while ( 1 ) { Sleep( 200 ); // Escapeキーを押したら抜ける if ( GetAsyncKeyState( VK_ESCAPE ) ) break; } } int _tmain(int argc, _TCHAR* argv[]) { // DirectSoundの作成 IDirectSound8 *pDS8; DirectSoundCreate8( NULL, &pDS8, NULL ); Dix::Com_ptr< IDirectSound8 > cpDS8( pDS8 ); pDS8->SetCooperativeLevel( GetConsoleHwnd(), DSSCL_PRIORITY ); // Oggオブジェクト作成 Dix::sp< Dix::OggDecoder > spOggDecoder( new Dix::OggDecoder( "test.ogg" ) ); Dix::PCMPlayer player( cpDS8, spOggDecoder ); bool isLoop = true; if( player.play( isLoop ) == false ) { printf( "ファイル準備に失敗しています" ); return 0; } // 再生 printf( "ただ今再生中\n" ); StopProc(); // 一時停止 player.pause(); printf( "\n一時停止しました\n" ); StopProc(); // 再開 player.play( isLoop ); printf( "\nただ今再度再生中\n" ); StopProc(); // 停止 player.stop(); printf( "\n停止しました。最初からの再生になります。\n" ); StopProc(); // 再開 player.play( isLoop ); printf( "\nただ今再度再生中\n" ); StopProc(); // ボリュームを小さく player.setVolume( -2000 ); printf( "\n音量を小さくしました\n" ); StopProc(); // ボリュームを元に player.setVolume( 0 ); printf( "\n音量を元に戻しました\n" ); StopProc(); // 左へパン player.setPan( -10000 ); printf( "\n左にパンを振りました\n" ); StopProc(); // 右へパン player.setPan( 10000 ); printf( "\n右にパンを振りました\n" ); StopProc(); // パンを戻す player.setPan( 0 ); printf( "\nパンを戻しました\n" ); StopProc(); // 停止 player.stop(); printf( "\n停止しました\n" ); return 0; }