windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dvoice/dxvutils/dxvtimer.cpp
2020-09-26 16:20:57 +08:00

166 lines
4.6 KiB
C++

/*==========================================================================
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: timer.cpp
* Content: Class to handle multimedia timers
*
* History:
* Date By Reason
* ==== == ======
* 10/05/99 rodtoll Added DPF_MODNAMEs
* 01/14/2000 rodtoll Updated to use DWORD_PTR to allow proper 64-bit operation
*
***************************************************************************/
#include "dxvutilspch.h"
// ORIGINAL HEADER:
//
// Timer.cpp
//
// This file is from the MSDN, Visual Studuio 6.0 Edition
//
// Article:
// Streaming Wave Files With DirectSound
//
// Author:
// Mark McCulley, Microsoft Corporation
//
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_VOICE
static bool TimeKillSynchronousFlagAvailable( void );
static MMRESULT CompatibleTimeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent );
// constructor
#undef DPF_MODNAME
#define DPF_MODNAME "Timer::Timer"
Timer::Timer (void)
{
DPFX(DPFPREP, DVF_INFOLEVEL, "Timer::Timer\n\r");
m_nIDTimer = NULL;
}
// Destructor
#undef DPF_MODNAME
#define DPF_MODNAME "Timer::~Timer"
Timer::~Timer (void)
{
DPFX(DPFPREP, DVF_INFOLEVEL, "Timer::~Timer\n\r");
if (m_nIDTimer)
{
timeKillEvent (m_nIDTimer);
}
}
// Create
#undef DPF_MODNAME
#define DPF_MODNAME "Timer::Create"
BOOL Timer::Create (UINT nPeriod, UINT nRes, DWORD_PTR dwUser, TIMERCALLBACK pfnCallback)
{
BOOL bRtn = SUCCESS; // assume success
DPFX(DPFPREP, DVF_INFOLEVEL, "Timer::Create\n\r");
DNASSERT (pfnCallback);
DNASSERT (nPeriod > 10);
DNASSERT (nPeriod >= nRes);
m_nPeriod = nPeriod;
m_nRes = nRes;
m_dwUser = dwUser;
m_pfnCallback = pfnCallback;
if ((m_nIDTimer = CompatibleTimeSetEvent (m_nPeriod, m_nRes, TimeProc, (DWORD_PTR) this, TIME_PERIODIC | TIME_KILL_SYNCHRONOUS)) == NULL)
{
bRtn = FAILURE;
}
return (bRtn);
}
/******************************************************************************
CompatibleTimeSetEvent
CompatibleTimeSetEvent() unsets the TIME_KILL_SYNCHRONOUS flag before calling
timeSetEvent() if the current operating system does not support the
TIME_KILL_SYNCHRONOUS flag. TIME_KILL_SYNCHRONOUS is supported on Windows XP and
later operating systems.
Parameters:
- The same parameters as timeSetEvent(). See timeSetEvent()'s documentation in
the Platform SDK for more information.
Return Value:
- The same return value as timeSetEvent(). See timeSetEvent()'s documentation in
the Platform SDK for more information.
******************************************************************************/
MMRESULT CompatibleTimeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent )
{
static bool fCheckedVersion = false;
static bool fTimeKillSynchronousFlagAvailable = false;
if( !fCheckedVersion ) {
fTimeKillSynchronousFlagAvailable = TimeKillSynchronousFlagAvailable();
fCheckedVersion = true;
}
if( !fTimeKillSynchronousFlagAvailable ) {
fuEvent = fuEvent & (TIME_ONESHOT |
TIME_PERIODIC |
TIME_CALLBACK_FUNCTION |
TIME_CALLBACK_EVENT_SET |
TIME_CALLBACK_EVENT_PULSE);
}
return timeSetEvent( uDelay, uResolution, lpTimeProc, dwUser, fuEvent );
}
bool TimeKillSynchronousFlagAvailable( void )
{
OSVERSIONINFO osverinfo;
osverinfo.dwOSVersionInfoSize = sizeof(osverinfo);
if( GetVersionEx( &osverinfo ) ) {
// Windows XP's major version is 5 and its' minor version is 1.
// timeSetEvent() started supporting the TIME_KILL_SYNCHRONOUS flag
// in Windows XP.
if( (osverinfo.dwMajorVersion > 5) ||
( (osverinfo.dwMajorVersion == 5) && (osverinfo.dwMinorVersion >= 1) ) ) {
return true;
}
}
return false;
}
// Timer proc for multimedia timer callback set with timeSetTime().
//
// Calls procedure specified when Timer object was created. The
// dwUser parameter contains "this" pointer for associated Timer object.
//
#undef DPF_MODNAME
#define DPF_MODNAME "Timer::TimeProc"
void CALLBACK Timer::TimeProc(UINT uID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
// dwUser contains ptr to Timer object
Timer * ptimer = (Timer *) dwUser;
if( ptimer != NULL )
{
// Call user-specified callback and pass back user specified data
(ptimer->m_pfnCallback) (ptimer->m_dwUser);
}
}