//------------------------------------------------------------------------------
// Lamp : Open source game middleware
// Copyright (C) 2004  Junpei Ohtani ( Email : junpee@users.sourceforge.jp )
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//------------------------------------------------------------------------------

/** @file
 * Lampサウンドヘッダ
 * @author Junpee
 */

#ifndef LAMP_SOUND_H_
#define LAMP_SOUND_H_

namespace Lamp{

class SoundCapacity;
class SoundManager;
class SoundListener;

//------------------------------------------------------------------------------
/**
 * Lampサウンド
 *
 * 他のアプリケーションが流している音にも影響を与えてしまうので、プライマリバッファに
 * 対してのボリューム操作は行わない。
 */
class LampSound{
public:
	//--------------------------------------------------------------------------
	/**
	 * 初期化
	 * @param windowHandle ウィンドウハンドル
	 * @return 初期化に成功すればtrue
	 */
	static bool initialize(HWND windowHandle);

	/**
	 * 後始末
	 */
	static void finalize();

	/**
	 * プレゼンテーション
	 *
	 * 描画ループ毎に呼んでください。
	 * フェードや3Dサウンドパラメータが適用されます。
	 */
	static void presentation();

	//--------------------------------------------------------------------------
	/**
	 * サンプル数の取得
	 * @return サンプル数
	 */
	static int getSample(){ Assert(isInitialized_); return sample_; }

	/**
	 * チャンネル数の取得
	 * @return チャンネル数
	 */
	static int getChannel(){ Assert(isInitialized_); return channel_; }

	/**
	 * ビット数の取得
	 * @return ビット数
	 */
	static int getBit(){ Assert(isInitialized_); return bit_; }

	/**
	 * 文字列への変換
	 * @return 文字列
	 */
	static String toString();

	//--------------------------------------------------------------------------
	/**
	 * サウンド能力の取得
	 * @return サウンド能力
	 */
	static SoundCapacity* getCapacity(){
		Assert(isInitialized_);
		return soundCapacity_;
	}

	//--------------------------------------------------------------------------
	/**
	 * サウンドマネージャの取得
	 * @return サウンドマネージャ
	 */
	static SoundManager* getSoundManager(){
		Assert(isInitialized_);
		return soundManager_;
	}

	//--------------------------------------------------------------------------
	/**
	 * サウンドリスナの取得
	 * @return サウンドリスナ
	 */
	static SoundListener* getSoundListener(){
		Assert(isInitialized_);
		return soundListener_;
	}

private:
	//--------------------------------------------------------------------------
	// DirectSound
	static DirectSound* directSound_;
	// プライマリバッファ
	static DirectSoundPrimaryBuffer* primaryBuffer_;
	// サウンド能力
	static SoundCapacity* soundCapacity_;
	// サウンドマネージャ
	static SoundManager* soundManager_;
	// サウンドリスナ
	static SoundListener* soundListener_;
	// サンプル数
	static int sample_;
	// チャンネル数
	static int channel_;
	// ビット数
	static int bit_;
	// 初期化フラグ
	static bool isInitialized_;

};

//------------------------------------------------------------------------------
} // End of namespace Lamp
#endif // End of LAMP_SOUND_H_
//------------------------------------------------------------------------------
