ホーム < ゲームつくろー! < 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;
}