summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tracker-kinect-face/tracker.cpp26
-rw-r--r--tracker-kinect-face/tracker.h28
2 files changed, 46 insertions, 8 deletions
diff --git a/tracker-kinect-face/tracker.cpp b/tracker-kinect-face/tracker.cpp
index 073cf0be..8c2c164d 100644
--- a/tracker-kinect-face/tracker.cpp
+++ b/tracker-kinect-face/tracker.cpp
@@ -232,6 +232,7 @@ void KinectFaceTracker::ExtractFaceRotationInDegrees(const Vector4* pQuaternion,
}
+
/// <summary>
/// Initializes the default Kinect sensor
/// </summary>
@@ -248,9 +249,9 @@ HRESULT KinectFaceTracker::InitializeDefaultSensor()
if (m_pKinectSensor)
{
- // Initialize Kinect and get color, body and face readers
- IColorFrameSource* pColorFrameSource = nullptr;
- IBodyFrameSource* pBodyFrameSource = nullptr;
+ // Initialize Kinect and get color, body and face readers
+ UniqueInterface<IBodyFrameSource> pBodyFrameSource;
+ UniqueInterface<IColorFrameSource> pColorFrameSource;
hr = m_pKinectSensor->Open();
@@ -261,17 +262,23 @@ HRESULT KinectFaceTracker::InitializeDefaultSensor()
if (SUCCEEDED(hr))
{
- hr = m_pKinectSensor->get_ColorFrameSource(&pColorFrameSource);
+ hr = m_pKinectSensor->get_ColorFrameSource(pColorFrameSource.PtrPtr());
+ pColorFrameSource.Reset();
}
+
+ //std::unique_ptr<IColorFrameSource, decltype(&SafeRelease)> colorFrameSource(pColorFrameSource, SafeRelease);
if (SUCCEEDED(hr))
{
+ //hr = (*pColorFrameSource.PtrPtr())->OpenReader(&m_pColorFrameReader);
hr = pColorFrameSource->OpenReader(&m_pColorFrameReader);
}
+
if (SUCCEEDED(hr))
{
- hr = m_pKinectSensor->get_BodyFrameSource(&pBodyFrameSource);
+ hr = m_pKinectSensor->get_BodyFrameSource(pBodyFrameSource.PtrPtr());
+ pBodyFrameSource.Reset();
}
if (SUCCEEDED(hr))
@@ -297,8 +304,13 @@ HRESULT KinectFaceTracker::InitializeDefaultSensor()
}
}
- SafeRelease(pColorFrameSource);
- SafeRelease(pBodyFrameSource);
+ //pColorFrameSource.Free();
+ //pBodyFrameSource.Free();
+ //SafeRelease(pColorFrameSource);
+ //SafeRelease(pBodyFrameSource);
+
+ //SafeRelease(*pBodyFrameSource.PtrPtr());
+ //SafeRelease(*pColorFrameSource.PtrPtr());
}
if (!m_pKinectSensor || FAILED(hr))
diff --git a/tracker-kinect-face/tracker.h b/tracker-kinect-face/tracker.h
index 5068f185..220a126f 100644
--- a/tracker-kinect-face/tracker.h
+++ b/tracker-kinect-face/tracker.h
@@ -14,7 +14,7 @@
#pragma once
-// Safe release for interfaces
+// @deprecated Use UniqueInterface instead. Remove it at some point.
template<class Interface>
inline void SafeRelease(Interface *& pInterfaceToRelease)
{
@@ -25,6 +25,32 @@ inline void SafeRelease(Interface *& pInterfaceToRelease)
}
}
+template<class Interface>
+inline void ReleaseInterface(Interface* pInterfaceToRelease)
+{
+ if (pInterfaceToRelease != nullptr)
+ {
+ pInterfaceToRelease->Release();
+ }
+}
+
+// Safely use Microsoft interfaces.
+template<typename T>
+class UniqueInterface : public std::unique_ptr<T, decltype(&ReleaseInterface<T>)> ///**/
+{
+public:
+ UniqueInterface() : std::unique_ptr<T, decltype(&ReleaseInterface<T>)>(nullptr, ReleaseInterface<T>){}
+ // Access pointer, typically for creation
+ T** PtrPtr() { return &iPtr; };
+ // Called this once the pointer was created
+ void Reset() { std::unique_ptr<T, decltype(&ReleaseInterface<T>)>::reset(iPtr); }
+ // If ever you want to release that interface before the object is deleted
+ void Free() { iPtr = nullptr; Reset(); }
+private:
+ T* iPtr = nullptr;
+};
+
+
class KinectFaceTracker : public ITracker
{