⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mediatimer.cpp

📁 PC端
💻 CPP
字号:

#include "stdafx.h"
#include "MediaTimer.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMediaTimer::CMediaTimer()
{
	m_MaxTimeSpace  = 2560;      //最大定时器间隔为 2560 ms [2^X]          
	m_MinTimeSpace  = 10  ;      //最小定时器间隔为 10 ms  [原速]
	//
	m_CurTimerRes   = 10;        //初始多媒体定时间隔10ms
	m_bTimerStop    = TRUE;
	m_bTimerPause   = TRUE;
	m_pCallBackProc = NULL;

	//利用函数timeGetDevCaps取出系统分辨率的取值范围,如果无错则继续; 
	if(::timeGetDevCaps(&m_tc,sizeof(TIMECAPS)) == TIMERR_NOERROR) 	
	{ 
		//分辨率的值不能超出系统的取值范围
		m_wAccuracy = min(max(m_tc.wPeriodMin,TIMER_ACCURACY),m_tc.wPeriodMax);
		timeBeginPeriod(m_wAccuracy); //调用timeBeginPeriod函数设置定时器的分辨率 
	}	
}

CMediaTimer::~CMediaTimer()
{
	timeKillEvent(m_TimerID);
	timeEndPeriod(m_wAccuracy);
}

//启动定时器
void CMediaTimer::Start(BOOL bOneShot /*= FALSE/**/)
{
	ASSERT(m_pCallBackProc != NULL);
	UINT fuEvent = (bOneShot ? TIME_ONESHOT : TIME_PERIODIC);
	if(m_bTimerStop || m_bTimerPause)
	{
		m_TimerID = timeSetEvent(m_CurTimerRes, 
			                     m_wAccuracy,
								 (LPTIMECALLBACK) m_pCallBackProc,
								 m_dwUser,
								 fuEvent);
		m_bTimerStop  = FALSE;
		m_bTimerPause = FALSE;
	}
}

void CMediaTimer::Start(UINT timerCurRes, BOOL bOneShot)
{
	ASSERT(m_pCallBackProc != NULL);
	m_CurTimerRes = max(min(timerCurRes,m_tc.wPeriodMax),m_wAccuracy);
	UINT fuEvent  = (bOneShot ? TIME_ONESHOT : TIME_PERIODIC);
	if(m_bTimerStop || m_bTimerPause)
	{
		m_TimerID = timeSetEvent(m_CurTimerRes, 
			m_wAccuracy,
			m_pCallBackProc,
			m_dwUser,
			fuEvent);
		m_bTimerStop  = FALSE;
		m_bTimerPause = FALSE;
	}
}

//停止定时器
void CMediaTimer::Stop()
{
	timeKillEvent(m_TimerID);
	m_bTimerStop  = TRUE;
	m_bTimerPause = FALSE;
}

//暂停定时器
void CMediaTimer::Pause()
{
	timeKillEvent(m_TimerID);
	if(!m_bTimerStop && !m_bTimerPause)
	{
		m_bTimerPause = TRUE;
	}
}

//加快播放速度,减少定时间隔
BOOL CMediaTimer::SpeedUp()
{
	switch(GetResState())
	{
	case TIMER_UPLIMIT:
		m_CurTimerRes = m_MaxTimeSpace;
		break;
	case TIMER_LOWLIMIT:
		m_CurTimerRes = m_MinTimeSpace;
		break;
	default:;
	}
	UINT nOldRes = m_CurTimerRes;
	OnSpeedUp(nOldRes);
	if(GetResState(nOldRes) == TIMER_NORMAL)
		m_CurTimerRes = nOldRes;
	else return FALSE;
	
	if(!m_bTimerStop && !m_bTimerPause)
	{
		timeKillEvent(m_TimerID);
		m_TimerID = timeSetEvent(m_CurTimerRes, 
			m_wAccuracy,
			m_pCallBackProc,
			m_dwUser,
			TIME_PERIODIC);
	}
	return TRUE;
}

//减慢播放速度,增加定时间隔
BOOL CMediaTimer::SlowDown()
{	
	switch(GetResState())
	{
	case TIMER_UPLIMIT:
		m_CurTimerRes = m_MaxTimeSpace;
		break;
	case TIMER_LOWLIMIT:
		m_CurTimerRes = m_MinTimeSpace;
		break;
	default:;
	}
	UINT nOldRes = m_CurTimerRes;
	OnSlowDown(nOldRes);
	if(GetResState(nOldRes) == TIMER_NORMAL)
		m_CurTimerRes = nOldRes;
	else return FALSE;
	
	if(!m_bTimerStop && !m_bTimerPause)
	{
		timeKillEvent(m_TimerID);
		m_TimerID = timeSetEvent(m_CurTimerRes, 
			m_wAccuracy,
			m_pCallBackProc,
			m_dwUser,
			TIME_PERIODIC);
	}
	return TRUE;
}

//设置定时时间调节范围,对带参的Start和SetCurRes函数无效
void CMediaTimer::SetRange(UINT Lower, UINT Upper)
{
	//Make change
	if(Lower > Upper)
	{
		UINT temp = Lower;
		Lower = Upper;
		Upper = temp;
	}
	m_MinTimeSpace = max(min(Lower,m_tc.wPeriodMax),m_wAccuracy);
	m_MaxTimeSpace = max(min(m_tc.wPeriodMax,Upper),m_MinTimeSpace);
}

//获得定时时间范围
void CMediaTimer::GetRange(UINT &Lower, UINT &Upper) const
{
	Lower = m_MinTimeSpace;
	Upper = m_MaxTimeSpace;
}

//获得当前时间间隔
void CMediaTimer::SetCurRes(UINT timerCurRes)
{
	m_CurTimerRes = max(min(timerCurRes,m_tc.wPeriodMax),m_wAccuracy);
}

//设置回调函数和传入参数
void CMediaTimer::SetProcParameter(LPTIMECALLBACK callbackproc, DWORD dwUser)
{
	m_pCallBackProc = callbackproc;
	m_dwUser = dwUser;
}

//定时器是否运行
BOOL CMediaTimer::IsStart() const
{
	return (!m_bTimerPause && !m_bTimerStop);
}

//定时器是否已经启动
BOOL CMediaTimer::IsStop() const
{
	return m_bTimerStop;
}

//获得定时器暂停状态
BOOL CMediaTimer::IsPause() const
{
	return m_bTimerPause;
}

//返回Res的状态
UINT CMediaTimer::GetResState(UINT Res) const
{
	if(Res < m_MinTimeSpace)
		return TIMER_LOWLIMIT;
	if(Res > m_MaxTimeSpace)
		return  TIMER_UPLIMIT;
	return TIMER_NORMAL;
}

//获得定时器状态
UINT CMediaTimer::GetResState() const
{
	return GetResState(m_CurTimerRes);	
}

//获得当前时间间隔
UINT CMediaTimer::GetCurRes() const
{
	return m_CurTimerRes;
}

//获得定时器分辨率范围
const TIMECAPS& CMediaTimer::timeGetDevCaps() const
{
	return m_tc;
}

//当速度提高的时候被调用
void CMediaTimer::OnSpeedUp(UINT &timerCurRes)
{//SpeedUp algorithm
	timerCurRes = timerCurRes / 2;
}

//当速度降低的时候被调用
void CMediaTimer::OnSlowDown(UINT &timerCurRes)
{//SlowDown algorithm
	timerCurRes = timerCurRes * 2;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -