// MCpp_MulticamObjectWithSignalingImpl.h - MULTICAM C++ API - MulticamObjectWithSignalingImpl
|
#if !defined(__MCPP_MULTICAMOBJECTWITHSIGNALINGIMPL_H__)
|
#define __MCPP_MULTICAMOBJECTWITHSIGNALINGIMPL_H__
|
|
#include "MCpp_MultiCamObjectWithSignaling.h"
|
#include "containers.h"
|
#include "CCallbacks.h"
|
|
namespace Euresys
|
{
|
namespace MultiCam
|
{
|
inline MultiCamObjectWithSignaling::MultiCamObjectWithSignaling() : CbReg(false)
|
{
|
Callbacks = new Euresys::MultiCam::Internal::AssociativeArray < Callback* > ();
|
}
|
|
inline MultiCamObjectWithSignaling::~MultiCamObjectWithSignaling()
|
{
|
if (Callbacks != NULL)
|
{
|
Callbacks->DeleteAll();
|
delete Callbacks;
|
}
|
}
|
|
// Callback dispatcher routine
|
inline void MultiCamObjectWithSignaling::CbRoutine(PMCSIGNALINFO mcInfo)
|
{
|
SignalInfo info;
|
Callback *cb = NULL;
|
|
GetSignalInfo(mcInfo, &info);
|
|
if (info.Signal <= 0 )
|
return;
|
|
cb = Callbacks->At(info.Signal);
|
if (cb == NULL)
|
cb = Callbacks->At(MC_SIG_ANY);
|
|
if (cb != NULL)
|
cb->RunUntyped(this, info);
|
}
|
|
// WaitSignal
|
inline void MultiCamObjectWithSignaling::WaitForSignal(MCSIGNAL Signal, unsigned int Timeout, SignalInfo &Info)
|
{
|
MCSTATUS status;
|
MCSIGNALINFO mcInfo;
|
|
status = McWaitSignal(Handle, Signal, Timeout, &mcInfo);
|
if (status != MC_OK)
|
ThrowMultiCamException(status, TYPE_WAIT_SIGNAL);
|
GetSignalInfo(&mcInfo, &Info);
|
}
|
|
// GetSignalInfo
|
inline void MultiCamObjectWithSignaling::GetSignalInfo(MCSIGNAL Signal, SignalInfo &Info)
|
{
|
MCSTATUS status;
|
MCSIGNALINFO mcInfo;
|
|
status = McGetSignalInfo(Handle, Signal, &mcInfo);
|
if (status != MC_OK)
|
ThrowMultiCamException(status, TYPE_GET_SIGNALINFO);
|
GetSignalInfo(&mcInfo, &Info);
|
}
|
|
// Convert MCSIGNALINFO to Euresys.MultiCam.SignalInfo
|
inline void MultiCamObjectWithSignaling::GetSignalInfo(PMCSIGNALINFO mcInfo, SignalInfo *Info)
|
{
|
Info->Signal = mcInfo->Signal;
|
|
if (Info->Signal == MC_SIG_SURFACE_FILLED ||
|
Info->Signal == MC_SIG_SURFACE_PROCESSING)
|
Info->Surf = GetSurface(mcInfo->SignalInfo);
|
else
|
Info->Surf = NULL;
|
}
|
|
inline void MultiCamObjectWithSignaling::RegisterCallbackInternal(Callback *cb, MCSIGNAL Signal)
|
{
|
if (Signal < 0)
|
ThrowMultiCamException(MC_OUT_OF_BOUND, TYPE_REGISTER_CB);
|
|
// Register the user callback
|
if (Callbacks->At(Signal) != NULL)
|
delete Callbacks->At(Signal);
|
Callbacks->Assign(Signal, cb);
|
|
// Register the global callback function (if necessary)
|
if (!CbReg)
|
{
|
MCSTATUS status = McRegisterCallback(Handle, GlobalCallbackFunction, this);
|
if (status != MC_OK)
|
ThrowMultiCamException(status, TYPE_REGISTER_CB);
|
CbReg = true;
|
}
|
}
|
|
inline void MultiCamObjectWithSignaling::RegisterRawCallback(void *CbFunction, void *CbContext, int Signal)
|
{
|
if (CbFunction == NULL)
|
{
|
Euresys::MultiCam::Exception e(MC_INTERNAL_ERROR, "Invalid callback function");
|
throw e;
|
}
|
|
Callback *cb = new Euresys::MultiCam::CFunctionCallback(CbContext, (PMCPP_C_CALLBACK)CbFunction);
|
RegisterCallbackInternal(cb, Signal);
|
}
|
|
inline void MultiCamObjectWithSignaling::UnregisterCallback(MCSIGNAL Signal)
|
{
|
if (Signal < 0)
|
ThrowMultiCamException(MC_OUT_OF_BOUND, TYPE_UNREGISTER_CB);
|
|
// Unregister the user callback
|
Callback *cb = Callbacks->At(Signal);
|
Callbacks->Assign(Signal, NULL);
|
delete cb;
|
|
// Unregister the global callback function (if necessary)
|
if (CbReg)
|
{
|
int i;
|
int count = Callbacks->GetCount();
|
for (i = 0 ; i <= count && Callbacks->At(i) == NULL ; i++);
|
if (i > Callbacks->GetCount())
|
{
|
MCSTATUS status = McRegisterCallback(Handle, NULL, NULL);
|
if (status != MC_OK)
|
ThrowMultiCamException(status, TYPE_UNREGISTER_CB);
|
CbReg = false;
|
}
|
}
|
}
|
}
|
}
|
|
#endif
|