/*========================================================================== * * 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); } }