ホーム < ゲームつくろー! < Ogg Vorbis入門編

Ogg Vorbis入門編
その5 メモリにあるOggファイルを再生する:サンプルプログラム


 Ogg Vorbis入門編その5「メモリにあるOggファイルを再生する」で説明した内容を踏まえたサンプルプログラムです。実行するとコンソール画面が現れて、指定のOggファイルがストリーム再生されます。


サンプルスクリーンショット。シンプル過ぎますが機能はあります!

このサンプルはOggファイルを一度メモリにすべて展開し、それをライブラリに解析させて再生しています。Oggライブラリがファイル読み込みに使用するコールバック関数を置き換えることによって実現しています。


○ サンプルの動かし方

 サンプルを動かすために必要なファイルはこちらからダウンロードできます(OggSmp_No5.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 "OggDecoderInMemory.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::OggDecoderInMemory > spOggDecoder( new Dix::OggDecoderInMemory( "test.ogg" ) );
    Dix::PCMPlayer player( cpDS8, spOggDecoder );

    bool isLoop = true;
    if( player.play( isLoop ) == false ) {
        printf( "ファイル準備に失敗しています" );
        return 0;
    }

    // 再生
    printf( "ただ今再生中\n" );
    StopProc();

    // 停止
    player.stop();
    printf( "\n停止しました\n" );

    return 0;
}