//-----------------------------------------------------
//	DirectShowによる音声ファイル再生サンプル
//	2010.01.05 TMO
//-----------------------------------------------------

#include "pch_core.h"
#include "ShowSound.h"

#pragma comment(lib,"strmiids.lib") 


CShowSound::CShowSound()
:
m_p_graph_builder( NULL ),
m_p_media_ctrl( NULL ),
m_p_media_pos( NULL ),

m_b_play( false ),
m_b_loop_mode( false )//,
{
}


CShowSound::~CShowSound()
{
	Release();
}


/**
 * ファイルの読み込み
 * 
 * @param file
 */
void CShowSound::LoadFile( BSTR file )
{
	CoInitialize( NULL );
	CoCreateInstance(
		CLSID_FilterGraph,
		NULL,
		CLSCTX_INPROC,
		IID_IGraphBuilder,
		reinterpret_cast<LPVOID*>( &m_p_graph_builder )
		);
	m_p_graph_builder->QueryInterface(
		IID_IMediaControl,
		reinterpret_cast<LPVOID*>( &m_p_media_ctrl )
		);
		
	m_p_graph_builder->QueryInterface(
		IID_IMediaPosition,
		reinterpret_cast<LPVOID*>( &m_p_media_pos )
		);
	
	m_p_media_ctrl->RenderFile( file );
}


/**
 * 再生
 */
void CShowSound::Play()
{
	//if( !IS_DEBUG_SWITCH( MUTE_BGM ) )
	{
		m_p_media_ctrl->Run();
		m_b_play		= true;
		m_b_loop_mode	= false;
	}
}


/**
 * ループ再生
 */
void CShowSound::PlayLoop()
{
//	if( !IS_DEBUG_SWITCH( MUTE_BGM ) )
	{
		m_p_media_ctrl->Run();
		m_b_play		= true;
		m_b_loop_mode	= true;
	}
}


void CShowSound::ChkLoop()
{
	if( m_b_play && m_b_loop_mode )
	{
		REFTIME pos, end;
		m_p_media_pos->get_CurrentPosition( &pos );
		m_p_media_pos->get_StopTime( &end );
		
		if( pos >= end )
		{	
			//この方法で戻すと開始が少し途切れてしまった
			//m_p_media_pos->put_CurrentPosition(0);
			//m_p_media_ctrl->Run();
			
			//そこでいったん止めてから再生する
			Stop();
			PlayLoop();
		}
	}
}


/**
 * 再生中の場合でも先頭に戻して再生し直す
 */
void CShowSound::PlayFromStart()
{
	m_p_media_pos->put_CurrentPosition(0);
	m_p_media_ctrl->Run();
	
	m_b_play = true;
}


/**
 * 一時停止
 */
void CShowSound::Pause()
{
	m_p_media_ctrl->Pause();
	
	m_b_play = false;
}


/**
 * 停止
 */
void CShowSound::Stop()
{
	m_p_media_ctrl->Stop();
	//Stop()でも再生位置が先頭に戻らないので、自分で戻す
	m_p_media_pos->put_CurrentPosition(0);
	
	m_b_play = false;
}


/**
 * ボリュームアップ
 */
void CShowSound::VolUp()
{
	IBasicAudio *p_basic_audio;
	m_p_graph_builder->QueryInterface(
		IID_IBasicAudio,
		reinterpret_cast<LPVOID*>( &p_basic_audio )
		);

	long vol = 0;
	p_basic_audio->get_Volume( &vol );
	vol += 100;
	if( vol > 0 )
	{
		vol = 0;
	}
	p_basic_audio->put_Volume(vol);

	p_basic_audio->Release();
}


/**
 * ボリュームダウン
 */
void CShowSound::VolDown()
{
	IBasicAudio*	p_basic_audio;
	m_p_graph_builder->QueryInterface(
		IID_IBasicAudio,
		reinterpret_cast<LPVOID*>( &p_basic_audio )
		);

	long vol = 0;
	p_basic_audio->get_Volume( &vol );
	vol -= 100;
	if( vol < -10000 )
	{
		vol = -10000;
	}
	p_basic_audio->put_Volume(vol);

	p_basic_audio->Release();
}


/**
 * リソース解放
 */
void CShowSound::Release()
{
	if( m_p_media_pos )
	{
		m_p_media_pos->Release();
		m_p_media_pos = NULL;
	}

	if( m_p_media_ctrl )
	{
		m_p_media_ctrl->Release();
		m_p_media_ctrl = NULL;
	}
	
	if( m_p_graph_builder )
	{
		m_p_graph_builder->Release();
		m_p_graph_builder = NULL;

		CoUninitialize();
	}
}