/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "event_win.h"
#include "Mmsystem.h"
namespace webrtc {
EventWindows::EventWindows()
: _event(::CreateEvent(NULL /* security attributes */,
FALSE /* manual reset */,
FALSE /* initial state */,
NULL /* name of event */)),
_timerID(NULL)
{
}
EventWindows::~EventWindows()
{
CloseHandle(_event);
}
bool EventWindows::Set()
{
// Note: setting an event that is already set has no effect.
return SetEvent(_event) == 1 ? true : false;
}
bool EventWindows::Reset()
{
return ResetEvent(_event) == 1 ? true : false;
}
EventTypeWrapper EventWindows::Wait(unsigned long maxTime)
{
unsigned long res = WaitForSingleObject(_event, maxTime);
switch(res)
{
case WAIT_OBJECT_0:
return kEventSignaled;
case WAIT_TIMEOUT:
return kEventTimeout;
default:
return kEventError;
}
}
bool EventWindows::StartTimer(bool periodic, unsigned long time)
{
if (_timerID != NULL)
{
timeKillEvent(_timerID);
_timerID=NULL;
}
if (periodic)
{
_timerID=timeSetEvent(time, 0,(LPTIMECALLBACK)HANDLE(_event),0,
TIME_PERIODIC|TIME_CALLBACK_EVENT_PULSE);
} else {
_timerID=timeSetEvent(time, 0,(LPTIMECALLBACK)HANDLE(_event),0,
TIME_ONESHOT|TIME_CALLBACK_EVENT_SET);
}
if (_timerID == NULL)
{
return false;
}
return true;
}
bool EventWindows::StopTimer()
{
timeKillEvent(_timerID);
_timerID = NULL;
return true;
}
} // namespace webrtc