<<Back To index
CEasySoundクラス リファレンスマニュアル

概要
 DirectSoundを簡単に使うためのクラスです。実際に再生するデータ(セカンダリバッファ)はクラスの外に出ているので、いくつ使おうがプログラマの自由です。クラスでは主に、初期化、データの読み込み、再生、解放を行います。

用語説明

プライマリバッファ
 直接サウンドカードが再生するデータを保持するバッファです。サウンドの合成などは、プライマリバッファ上で、DirectXが行います。通常、プログラマはセカンダリバッファを使い、プライマリバッファに直接アクセスする事はありません。

 EasySoundでは、内部的にプライマリバッファを持ちます。プログラマがプライマリバッファの存在を意識する必要はありません。

セカンダリバッファ
 再生する効果音などのデータを保持するバッファです。プログラマは、使う効果音の分だけセカンダリバッファを用意し、データをロード、再生用のメソッドを呼ぶことで、サウンドの再生をします。複数のセカンダリバッファを同時に再生した場合、サウンドはプライマリバッファ上で合成されます。

 EasySoundでは、セカンダリバッファを外部に持つことにしています。プログラマは好きなだけ(ハードの許す限り)セカンダリバッファを持つことが出来ます(同じサウンドの場合、内容を共有してメモリ使用量を抑える事もできます)。

メンバ関数

初期化
 bool InitDxSound(HWND hWnd,int nChannel,int nSps,int nBps);
セカンダリバッファを作る
 bool MakeSoundBuffer(LPDIRECTSOUNDBUFFER &pDSData,int nResID);
再生
 bool PlaySE(LPDIRECTSOUNDBUFFER &pDSData);
解放
 void ReleaseBuffer(LPDIRECTSOUNDBUFFER &pDSData);
DirectSoundオブジェクトの取得
 LPDIRECTSOUND GetDirectSound();

初期化
bool InitDxSound(HWND hWnd,int nChannel,int nSps,int nBps);

引数
HWND hWnd
 ウィンドウハンドルです。初期化に必要なので、必ず渡してください。

int nChannel
 チャンネル数です。ステレオの場合で、2になります。普通は2を指定すれば良いと思います。

int nSps
 サンプリングレートです。CDクォリティで44100Hzを指定します。ゲームの効果音なら22050Hzで十分です。実際に効果音に使うWAVEファイルも、このレートに合わせて作成してください。

int nBps
 ビット深度です。CDクォリティで32bitです。ゲームの効果音なら16bitで十分です。実際に効果音に使うWAVEファイルも、このレートに合わせて作成してください。

戻り値
 bool型 失敗>false 成功>true

解説
 DirectSoundを初期化します。ウィンドウハンドル、サンプリングレート、ビット深度を指定してください。失敗するとfalseを返します。成功しない限り、他のメンバ関数は使えません。

使用例
CEasySound MySound;//EasySoundオブジェクト
MySound.InitDxSound(hWnd,2,22050,16);//初期化

セカンダリバッファを作る
bool MakeSoundBuffer(LPDIRECTSOUNDBUFFER &pDSData,int nResID);

引数
LPDIRECTSOUNDBUFFER &pDSData
 セカンダリバッファのアドレスです。作成したセカンダリバッファのポインタを、ここに格納します。

int nResID
 音源のWAVEリソースIDです。WAVEファイルを元にセカンダリバッファを作るため、必要です。

戻り値
 bool型 失敗>false 成功>true

解説
 セカンダリバッファを作ります。効果音一つにつき、一つのセカンダリバッファが必要です。同じ音を再生する場合でも、セカンダリバッファが一つ必要になります。

使用例
CEasySound MySound;//EasySoundオブジェクト
LPDIRECTSOUNDBUFFER pDsoundData;//セカンダリバッファ
//初期化とかいろいろ.....
MySound.MakeSoundBuffer(pDsoundData,IDR_WAVE_LEFT);//バッファを初期化&WAVEを登録

再生
bool PlaySE(LPDIRECTSOUNDBUFFER &pDSData);

引数
LPDIRECTSOUNDBUFFER &pDSData
 CEasySound::MakeSoundBuffer()で作成したセカンダリバッファのポインタ。

戻り値
 bool型 失敗>false 成功>true

解説
 セカンダリバッファの内容を再生します。同時に複数の効果音を鳴らすことも出来ます。失敗するとfalseを返します。

使用例
CEasySound MySound;//EasySoundオブジェクト
LPDIRECTSOUNDBUFFER pDsoundData;//セカンダリバッファ
//初期化とかいろいろ.....
MySound.PlaySE(pDsoundData);//再生

解放
void ReleaseBuffer(LPDIRECTSOUNDBUFFER &pDSData);

引数
LPDIRECTSOUNDBUFFER &pDSData
 CEasySound::MakeSoundBuffer()で作成したセカンダリバッファのアドレス。

戻り値
 なし

解説
 セカンダリバッファを解放します。

使用例
MySound.ReleaseBuffer(pDsoundData);

DirectSoundオブジェクトの取得
LPDIRECTSOUND GetDirectSound();

引数
なし

戻り値
LPDIRECTSOUND型

解説
DirectSoundオブジェクトのポインタを返します。EasyMusicの初期化などで必要になります。

使用例
CEasySound MySound;//EasySoundオブジェクト
CEasyMusic MyMusic;//EasyMusicオブジェクト
MyMusic.InitDxMusic(MySound.GetDirectSound(),"");//EasyMusicの初期化

サンプルソース


//------------------------------------------------------------------
// sound.cpp : CEasySoundサンプルプログラム
//
//------------------------------------------------------------------
//内容
// DirectSoundの初期化、WAVEのロード、再生、停止、多重再生、解放の
//サンプルです。EasySound3Dをつかっています。
//------------------------------------------------------------------

#include "stdafx.h"
#include "resource.h"
#include "EasySound.h"
#include "EasySound3D.h"


HRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);//メッセージ処理

CEasySound3D MySound3D;//EasySound3Dオブジェクト
SOUND_DATA_3D pDsoundDataLeft,pDsoundDataCenter,pDsoundDataRight;


//---------------------------------------------------
//関数名  WinMain()
//機能    メイン関数
//---------------------------------------------------
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
{

  WNDCLASSEX wndclass;//ウィンドウクラス
  HWND hWnd;      // ウインドウハンドル
  MSG msg;      //メッセージ
  // ウインドウクラスの生成
  ZeroMemory( &wndclass, sizeof( wndclass));
  wndclass.style    = 0;
  wndclass.lpfnWndProc = WinProc;
  wndclass.cbClsExtra  = 0;
  wndclass.cbWndExtra  = 0;
  wndclass.hInstance  = hInstance;
  wndclass.hCursor  = LoadCursor(NULL, IDC_ARROW);
  wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  wndclass.lpszClassName = "Easy Lib Test";
  wndclass.cbSize    = sizeof(WNDCLASSEX);

  if( !RegisterClassEx( &wndclass)) {
    MessageBox(NULL,"ウィンドウのレジストに失敗。","Error",MB_OK|MB_ICONEXCLAMATION);
    return 0;
  }
  // ウインドウの生成
  hWnd = CreateWindowEx(WS_EX_APPWINDOW,"Easy Lib Test","Easy Lib Test",WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,640,480,HWND_DESKTOP, NULL,hInstance, NULL);

  ShowWindow( hWnd,SW_SHOW);
  UpdateWindow( hWnd);

  //EasySound初期化
  if(!MySound3D.InitDxSound(hWnd,2,22050,16)) {
    MessageBox(hWnd,"DirectSoundの初期化に失敗","Error",NULL);
    PostQuitMessage(0);
  }

  //Waveをロード&セカンダリバッファを作成
  MySound3D.MakeSoundBuffer(pDsoundDataLeft,IDR_WAVE1);
  MySound3D.MakeSoundBuffer(pDsoundDataCenter,IDR_WAVE2);
  MySound3D.MakeSoundBuffer(pDsoundDataRight,IDR_WAVE3);


  // メイン メッセージ ループ:
  while(TRUE)
  {
    if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
      if (msg.message == WM_QUIT){
        PostQuitMessage(msg.wParam);
        return 0;
      }
      TranslateMessage( &msg );
      DispatchMessage( &msg );
    }
  }
  return 0;
}

//---------------------------------------------------
//関数名  WinProc()
//機能    メイン ウィンドウのメッセージを処理します。
//---------------------------------------------------
HRESULT CALLBACK WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  switch(message) {
    case WM_DESTROY://終了処理
      //セカンダリバッファを解放
      MySound3D.ReleaseBuffer(pDsoundDataLeft);
      MySound3D.ReleaseBuffer(pDsoundDataCenter);
      MySound3D.ReleaseBuffer(pDsoundDataRight);


      PostQuitMessage(0);
      break;
    case WM_KEYDOWN:
      switch(wParam){
        case 'Z':
          MySound3D.PlaySE(pDsoundDataLeft,-3,0,0);//ぐっじょぶ再生
          break;
        case 'X':
          MySound3D.PlaySE(pDsoundDataCenter,0,0,0);//ぐれぃと再生
          break;
        case 'C':
          MySound3D.PlaySE(pDsoundDataRight,3,0,0);//やったぁ再生
          break;
      }
      break;
    case WM_PAINT:{
      char strBuff[128];
      PAINTSTRUCT rPaintRect;
      HDC hDC = BeginPaint(hWnd, &rPaintRect);

      sprintf(strBuff, "ぐっじょぶ! 再生[Z]");
      TextOut(hDC,0,0,strBuff,strlen(strBuff));

      sprintf(strBuff, "ぐれぃと! 再生[X]");
      TextOut(hDC,0,20,strBuff,strlen(strBuff));

      sprintf(strBuff, "やったぁ! 再生[C]");
      TextOut(hDC,0,40,strBuff,strlen(strBuff));

      EndPaint(hWnd, &rPaintRect);
    }
    default:
      return DefWindowProc( hWnd, message, wParam, lParam );
  }
  return 0;
}


 タブは全角スペースになってます。ビルドするためには、プロジェクトにEasySound.hとEasySound.cppを追加して、dxguid.lib、dsound.libをリンクしてください。当然ですが、DirectX7のSDKが必要になりますので、別途入手してください。

 stdafx.hでは、windows.h、stdlib.h、malloc.h、memory.h、tchar.h、stdio.h、time.hをインクルードしていますが、多分全部は必要ないです。

written by Matsumoto keizi