/***************************************************************************/
/** @file       Sound.h
    @brief      3Dサウンドには対応しない
    @author     shom
    @internal
****************************************************************************/

#pragma once

#include <mmsystem.h>	//dsound.hのインクルードの前に必須
#include <dsound.h>
#pragma comment( lib, "dsound.lib" )  // ライブラリのロード

#include "WaveFile.h"
#include "Sound_def.h"


// === 定数の宣言 ===
// - プライマリバッファのフォーマット設定（PCM波形フォーマット） -
// チャンネル数
#define	kPRM_BUF_CHANNELS	2		// ステレオ
// サンプリングレート（周波数）[Hz]
#define	kPRM_BUF_FREQ		44100	// 44.10kHz
// ビットレート: 1サンプル当たりのビット数
#define	kPRM_BUF_BITRATE	32		// PCM波形フォーマットの場合、8または16

// - Waveファイルをおくフォルダ名 -
#define kWV_PATH "sound"


// === クラスの定義 ===
class CSound
{
public:
	CSound();
	~CSound();

	HRESULT Initialize(
		HWND HWnd  // [in] 協調レベルの設定に用いる
		);

	void LoadFile(
		LPCWSTR  WvName,	  // [in] 読み込むWaveファイル名
		u32     Flags,	  // [in] セカンダリバッファの生成フラグ
		u32     dwNofBufs,	// [in] 複製するバッファ数（同時再生用）
		
		theSound* pSnd	  // [out] セカンダリバッファの格納先
		);

	HRESULT PlaySound(
		theSound* pSnd,	  // [in] Waveファイルが読み込まれた構造体
		u32     Priority,  // [in] 再生の優先度
		u32     Flag,	  // [in] 再生フラグ
		BOOL      boOverride
		// [in] 再生中でないバッファが見つからないとき、
		//      停止、巻き戻しして再生中でないバッファをこしらえるか
		);

	HRESULT	StopSound(
		theSound* pSnd	 // [in] Waveファイルが読み込まれた構造体
		);

	void	InitTheSound(
		theSound* pSnd	// [in/out] 初期化する構造体
		);

	void	ZeroTheSound(
		theSound* pSnd	// [in/out] ゼロリセットする構造体
		);

	void	ReleaseTheSound(
		theSound* pSnd  // [in/out] 解放する構造体
		);

protected:
	HRESULT SetPrimaryBufFormat(
		LPDIRECTSOUND8 pDSound  // [in] DSoundインタフェース
		);

	HRESULT GetI3DListener(
		LPDIRECTSOUND3DLISTENER* pp3DListener	 // [out] 格納先
		);

	HRESULT fillup_sound_buffer(
		theSound* pSnd,
		u32     NumBuf
		);

	HRESULT   restore_ds_buffer(
		LPDIRECTSOUNDBUFFER pDSBuf,  // [in/out] 確認するDSバッファ
		
		bool* pboDone	// [out] 復旧実施フラグ（NULL指定可）
		);

	HRESULT SelectFreeBuffer(
		theSound* pSnd,	 // [in]  探すバッファを含むtheSound構造体
		BOOL boOverride,
		// [in] 再生中でないDSバッファが見つからないとき、
		//      バッファをランダムで選び、停止、巻戻しして返すか
		u32* pNumFreeBuf
		// [out] 再生中でないDSバッファのインデックス値の格納先
		//       再生中でないDSバッファが見つからなければ、負数が格納
		);

	// - インスタンス -
	CWaveFile				wvfile;  // CWaveFileクラス

	// - クラス変数 -
	LPDIRECTSOUND8          m_pDSound;			 // DSoundインタフェース

	LPDIRECTSOUND3DLISTENER m_p3DListener;		 // 3Dリスナインタフェース
	DS3DLISTENER            m_3DListenerParams;	 // 3Dリスナのパラメータ
};

