自家製DirectSoundライブラリsslib2/dsoundの紹介

AKIYAMA Kouhei

2002年10月11日

1.概要

DirectSoundの薄いラップクラスと、各種Waveファイル読み込みクラスです。圧縮形式のwavファイル(ACM使用)やoggファイル(OggVorbis Win32 SDK使用)、独自waveアーカイブファイルを再生できます。

そのまま役に立つかは分かりませんが、参考程度にはなるかもしれません。

2.ソースコード

3.使い方

3.1.前準備

boost.orgのshared_ptrを使用しています。shared_ptr.hppがインクルードできるようにしておいてください。気に入らない場合は自分で適当なスマートポインタを用意するか、SoundBufferが自分で解放するように細工してください。

WarFileReader, OggFileReaderを使う場合はwww.vorbis.comからOggVorbis-win32sdk-1.0.zipを落としてきて使えるようにしてください。リンカエラーを防ぐためにプロジェクトの設定をしてください。このライブラリの使い方はgoogle等で検索して調べてください。

dxguid.libをリンクするようにしてください。

3.2.コード例

例えば以下のようにして使います。

#include <windows.h>
#include <boost/shared_ptr.hpp>
#include <sslib2/dsound/DirectSound.h>
#include <sslib2/dsound/OggFileReader.h>
#include <sslib2/dsound/StreamSoundBuffer.h>

void Test(HWND hWnd)
{
  //DirectSoundオブジェクトの作成
  sslib2::CDirectSound ds;
  if(!ds.Create(hWnd)){
    MessageBox(hWnd, "DirectSound初期化失敗", "error", MB_OK);
    return;
  }

  //Reader作成
  boost::shared_ptr<sslib2::COggFileReader> reader(new sslib2::COggFileReader());
  if(!reader->Open("test.ogg")){
    MessageBox(hWnd, "test.oggが開けない", "error", MB_OK);
    return;
  }

  //SoundBuffer作成
  sslib2::CStreamSoundBuffer buffer;
  if(!buffer.Create(ds, reader)){
    MessageBox(hWnd, "SoundBufferを作れなかった", "error", MB_OK);
    return;
  }

  //再生
  buffer.Play();

  //待ち
  MessageBox(hWnd, "再生中", "wait", MB_OK);
}

WinMain()
{
  //適当にメインウィンドウを作っておく。ハンドルをhWndとする。

  //COM初期化
  CoInitialize(NULL);

  Test(hWnd);

  //COM解放
  CoUninitialize();

  return 0;
}

4.解説

本ライブラリが提供するのは下図に示すクラス群です。

CDirectSoundはDirectSoundオブジェクトを作るためのクラスです。プライマリバッファへの操作なんかも付けてみました。

CSoundBufferは一つのサウンドを再生する役割を持ちます。CStaticSoundBufferは全てのサウンドデータをメモリに蓄えてから再生します。CStreamSoundBufferは少しずつ読みながら再生します。いずれもCWaveReaderインタフェースを通じてPCMデータを読み込みます。

CWaveReaderはSoundBufferがPCMデータを読み込むために使用するインタフェースを規定します。このインタフェースを実装するクラスは以下の通りです。

読みたいファイルに応じて適切なReaderオブジェクトを生成して、それをSoundBufferに関連づけてください。

5.wavearc(war)について

warファイルは独自のwaveアーカイブファイルフォーマットです。ループに関する情報も埋め込めるのが特徴です。詳しくは以下をご覧ください。

6.使用条件

フリーソフトウェアです。改変、配布、商用利用などをする自由があります。そのまま使うもよし、自分のプログラムに組み込むのもよし。各自の責任で自由に扱ってください。

バグなどがありましたら教えていただけると助かります。適当に「ここまちがってるよー」とメールしてください。「ありがとー」と返して修正できたら修正します。

7.最後に

基本的に自分に必要なものしか作っていないので、機能など至らない部分が多々あると思います。コーディング規約が気に入らないという人もいるでしょう。そのへんは適当に修正して使ってください。もしくは参考程度にご利用ください。


AKIYAMA Kouhei <k-akiのあとはアットマークでgreenwood.co.jp>
http://www.greenwood.co.jp/~k-aki/

Last modified: Tue Oct 22 16:40:53 2002