#pragma once
#include<DxLib.h>
#include<string>
#define NULL_HANDLE -1

namespace DXFW
{
///	<summary>音声の再生方式</summary>
enum class PlayType
{
	Normal = DX_PLAYTYPE_NORMAL,/// 再生中、他の処理を止める
	Back = DX_PLAYTYPE_BACK,/// 再生中、他の処理を止めない
	Loop = DX_PLAYTYPE_LOOP,/// 他の処理を止めず、最初から
};

///	<summary>音声クラス</summary>
///	<example>
///	[サンプルコード:未完成]<BR>
/// 音声を読みこんで再生する<BR>
///	<code>
///	int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow )<BR>
///	{<BR>
///		if( !Dx::Initialise() ) return -1;<BR>
///		Dx::End();<BR>
///		return 0;<BR>
/// }<BR>
/// </code>		
/// </example>
class Sound
{
private:
	int handle;
public:		
	Sound():
		handle( NULL_HANDLE)
	{}

	///<summary>音声ファイルをメモリに読み込む</summary>
	Sound(const char *fileName)
	{
		this->handle = DxLib::LoadSoundMem(fileName);
	}
		
	///<summary>音声ファイルをメモリに読み込む</summary>
	int Load(const char *fileName)
	{
		if(this->handle != NULL_HANDLE ) DxLib::DeleteSoundMem(handle);
		return this->handle = DxLib::LoadSoundMem(fileName);
	}
	
	///<summary>音声ファイルをメモリから開放</summary>
	bool Release()
	{
		return !DxLib::DeleteSoundMem(handle);
	}

	///<summary>ハンドルを取得</summary>
	int GetHandle() const
	{
		return this->handle;
	}
		
	///<summary>音声ファイルを再生</summary>
	bool Play(PlayType playType = PlayType::Back , bool isTopPosition = true) const
	{
		return !DxLib::PlaySoundMem(this->handle , (int)playType , isTopPosition);
	}
		
	///<summary>再生中か判定</summary>
	bool Check() const
	{
		return !DxLib::CheckSoundMem(this->handle);
	}
		
	/// <summary>再生を停止</summary>
	bool Stop()
	{
		return !DxLib::StopSoundMem(this->handle);
	}
		
	/// <summary>音声パンを設定</summary>
	bool SetPan(int panPal)
	{
		return !DxLib::SetPanSoundMem(panPal,this->handle);
	}
		
	/// <summary>音量を設定</summary>
	bool SetVolume(double volumePal)
	{
		return !DxLib::ChangeVolumeSoundMem( int(volumePal*255),this->handle);
	}
		
	/// <summary>再生周波数を設定</summary>
	///単位はヘルツで100〜100,000
	bool SetFrequency(int frequencyPal)
	{
		return !DxLib::SetFrequencySoundMem(frequencyPal,this->handle);
	}
		
	///<summary>ループ位置を設定</summary>
	///ミリ秒単位でループ位置を設定
	bool SetLoopPos(int loopTime)
	{
		return !DxLib::SetLoopPosSoundMem( loopTime , this->handle );
	}
		
	///<summary>ループ位置を設定(サンプリング周波数)</summary>
	///サンプリング周波数でループ位置を指定。
	///周期が44.1KHzの場合、44,100を渡すと1秒の位置でループする
	bool SetLoopSamplePos(int loopSamplePosition)
	{
		return !DxLib::SetLoopSamplePosSoundMem( loopSamplePosition , this->handle );
	}
};
}