1 #pragma once 2 3 ////////////////////////////////////////////////////////////////////////// 4 // AsyncCallback [template] 5 // 6 // Description: 7 // Helper class that routes IMFAsyncCallback::Invoke calls to a class 8 // method on the parent class. 9 // 10 // Usage: 11 // Add this class as a member variable. In the parent class constructor, 12 // initialize the AsyncCallback class like this: 13 // m_cb(this, &CYourClass::OnInvoke) 14 // where 15 // m_cb = AsyncCallback object 16 // CYourClass = parent class 17 // OnInvoke = Method in the parent class to receive Invoke calls. 18 // 19 // The parent's OnInvoke method (you can name it anything you like) must 20 // have a signature that matches the InvokeFn typedef below. 21 ////////////////////////////////////////////////////////////////////////// 22 23 // T: Type of the parent object 24 template<class T> 25 class AsyncCallback : public IMFAsyncCallback 26 { 27 public: 28 typedef HRESULT (T::*InvokeFn)(IMFAsyncResult *pAsyncResult); 29 30 AsyncCallback(T *pParent, InvokeFn fn) : m_pParent(pParent), m_pInvokeFn(fn) 31 { 32 } 33 34 // IUnknown 35 STDMETHODIMP_(ULONG) AddRef() { 36 // Delegate to parent class. 37 return m_pParent->AddRef(); 38 } 39 STDMETHODIMP_(ULONG) Release() { 40 // Delegate to parent class. 41 return m_pParent->Release(); 42 } 43 STDMETHODIMP QueryInterface(REFIID iid, void** ppv) 44 { 45 if (!ppv) 46 { 47 return E_POINTER; 48 } 49 if (iid == __uuidof(IUnknown)) 50 { 51 *ppv = static_cast<IUnknown*>(static_cast<IMFAsyncCallback*>(this)); 52 } 53 else if (iid == __uuidof(IMFAsyncCallback)) 54 { 55 *ppv = static_cast<IMFAsyncCallback*>(this); 56 } 57 else 58 { 59 *ppv = NULL; 60 return E_NOINTERFACE; 61 } 62 AddRef(); 63 return S_OK; 64 } 65 66 67 // IMFAsyncCallback methods 68 STDMETHODIMP GetParameters(DWORD*, DWORD*) 69 { 70 // Implementation of this method is optional. 71 return E_NOTIMPL; 72 } 73 74 STDMETHODIMP Invoke(IMFAsyncResult* pAsyncResult) 75 { 76 return (m_pParent->*m_pInvokeFn)(pAsyncResult); 77 } 78 79 T *m_pParent; 80 InvokeFn m_pInvokeFn; 81 }; 82