diff options
| -rw-r--r-- | tracker-kinect-face/tracker.cpp | 26 | ||||
| -rw-r--r-- | tracker-kinect-face/tracker.h | 28 | 
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  { | 
