/**
 * @file Sound.h
 * @brief サウンド周りのクラス、定数、変数定義を行う。
 *
 * @author S.F.
 * @version $Id:
 *
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */

/// 二重インクルード防止マクロ
#if !defined(AFX_SOUND_H__87CC9C63_C71A_4276_9ACF_912DC2A4DD44__INCLUDED_)
#define AFX_SOUND_H__87CC9C63_C71A_4276_9ACF_912DC2A4DD44__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "sf.h"
extern "C" {
namespace sf{
	namespace system {
		/// サウンド関係のクラス・定数などはすべてここに含まれます。
		namespace sound {
			const int OBJECT_MAX = 128;///< サウンドオブジェクトの最大数
			const int LOAD_ERROR = -1; ///< ロードエラー
			/// サウンドのタイプ
			enum TYPE
			{
				NONE,///< 何もならない
				TEST///< TEST
			};

			/// サウンド・ボリューム
			namespace volume {
				const int MAX = 0;///< 最大音量
				const int MIN = -9600;///< 最小音量
			};

			/** サウンドを制御する.
			 * BGM・効果音を制御するインターフェースです。*/
			class Sound 
			{
				// LIFECYCLE //
			public:
				/// コンストラクタ
				Sound(){};
				/// デストラクタ
				virtual ~Sound(){};
				// OPERATORS //
				// OPERATIONS //
				/** サウンドインターフェースの初期化を行う 
				　@throw FatalErrorException 初期化に失敗した場合 */
				virtual void initialize(void) = 0;
	
				/** 指定したサウンド番号にサウンドファイルのロードを行う.
				 * @param ObjNo ロードしたいサウンドオブジェクトの番号
				 * @param pFileName ファイルネーム文字列のポインタ */
				virtual void load(const int ObjNo,const char * const pFileName) = 0;

				/** サウンドファイルのロードを行う.
				 * あいているサウンド番号があれば、そこにロードし、ロードした番号を返します。
				 * @param pFileName サウンドファイルのPATH
				 * @return サウンド番号(0 - OBJECT_MAX) */
				virtual const int load(const char * const pFileName) = 0;

				/** サウンドリソースのアンロードを行う.
				 * サウンドリソースを開放します */
				virtual void unload() = 0;

				/** サウンドの再生を行う.
				 * @param ObjNo サウンド番号
				 * @param Repeat リピート回数(0は∞回)
				 * @param bPrimary プライマリバッファで再生するかどうか
				 * @param bSync BGMに同期して再生するかどうか*/
				virtual void play(const int ObjNo,const DWORD Repeat,const bool bPrimary,const bool bSync) = 0;

				/** サウンド再生を止める. 
				 * @param ObjNo 止めたいサウンドの番号 */
				virtual void stop(const int ObjNo = 0) = 0;

				/** サウンドオブジェクトの更新をおこなう.
				 * 再生の更新作業を行います。*/
				virtual void update() = 0;
				// ACCESS //

				/** マスターボリューム(全体の音量)をセットする. 
				 * @param value 音量 volume::MIN 〜 volume::MAX 間での値 */
				virtual void masterVolume(const int value) = 0;

				/** マスターボリューム(全体の音量)を読み出す. 
				* @return  音量 volume::MIN 〜 volume::MAX 間での値*/
				virtual const int masterVolume() const = 0;
				
				/**　最大音量をセットする. 
				 * @param value 音量 volume::MIN 〜 volume::MAX 間での値*/
				virtual void volumeMax(const int value) = 0;

				/** 最大音量を読み出す. 
				* @return  音量 volume::MIN 〜 volume::MAX 間での値*/
				virtual const int volumeMax()  const = 0;
				
				// INQUIRY //
				
				/**  サウンドオブジェクトの状態を問い合わせる
				 * @retval true 現在使用可能
				 * @retval false 現在使用不可*/
				virtual const bool isEnabled(void) const = 0;

			};
		}
	}
}
}
#endif // !defined(AFX_SOUND_H__87CC9C63_C71A_4276_9ACF_912DC2A4DD44__INCLUDED_)
