AudioBase.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /******************************************************************************
  2. |* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. |* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. |* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. |* PARTICULAR PURPOSE.
  6. |*
  7. |* Copyright 1995-2005 Nero AG. All Rights Reserved.
  8. |*-----------------------------------------------------------------------------
  9. |* NeroSDK / AudioPluginManager
  10. |*
  11. |* FILE: AudioBase.h
  12. |*
  13. |* PURPOSE: Definition of base classes for components and some helper classes
  14. ******************************************************************************/
  15. #ifndef _AUDIO_BASE
  16. # define _AUDIO_BASE
  17. #include "AudioPluginEnv.h"
  18. ///////////////////////////////////////////////////////////////////// CStatus //
  19. class CStatus : public IStatus, public IStatusCategory
  20. {
  21. // Construction/Destruction
  22. public:
  23. CStatus(DWORD syserror);
  24. CStatus(EAudioError audioerror);
  25. CStatus(const char *szError);
  26. // Operations
  27. public:
  28. void SetCategory(EStatusCategory cat);
  29. // IUnknown
  30. STDMETHODIMP QueryInterface(REFIID riid,
  31. void __RPC_FAR *__RPC_FAR *ppObj);
  32. STDMETHODIMP_(ULONG) AddRef();
  33. STDMETHODIMP_(ULONG) Release();
  34. // IStatus
  35. virtual const char * GetDescription();
  36. virtual EAudioError GetAudioError();
  37. virtual DWORD GetSysError();
  38. // IStatusCategory
  39. virtual EStatusCategory GetCategory();
  40. protected:
  41. // Data
  42. protected:
  43. long m_lRef;
  44. DWORD m_dwErr;
  45. EAudioError m_eAudioError;
  46. EStatusCategory m_category;
  47. CString m_csError;
  48. };
  49. /////////////////////////////////////////////////////////////// CAggregatable //
  50. #define AGGFLAG_NODELETE 0x00000001
  51. class CAggregatable : public IAggregatable
  52. {
  53. public:
  54. CAggregatable(DWORD dwFlags)
  55. : m_pAggregator (NULL),
  56. m_lRef (0),
  57. m_dwFlags (dwFlags)
  58. {}
  59. virtual ~CAggregatable()
  60. {}
  61. // IAggregatable
  62. virtual bool SetAggregator(IUnknown *pAggregator)
  63. {
  64. m_pAggregator = pAggregator;
  65. return true;
  66. }
  67. virtual bool GetAggregator(IUnknown **ppAggregator)
  68. {
  69. if(!ppAggregator)
  70. {
  71. ASSERT(FALSE);
  72. return false;
  73. }
  74. *ppAggregator = m_pAggregator;
  75. if(m_pAggregator)
  76. (*ppAggregator)->AddRef();
  77. return true;
  78. }
  79. virtual ULONG STDMETHODCALLTYPE InnerAddRef()
  80. {
  81. InterlockedIncrement(&m_lRef);
  82. return m_lRef;
  83. }
  84. virtual ULONG STDMETHODCALLTYPE InnerRelease()
  85. {
  86. InterlockedDecrement(&m_lRef);
  87. if(!m_lRef)
  88. {
  89. if(!(m_dwFlags & AGGFLAG_NODELETE))
  90. delete this;
  91. return 0;
  92. }
  93. return m_lRef;
  94. }
  95. protected:
  96. IUnknown *m_pAggregator;
  97. long m_lRef;
  98. DWORD m_dwFlags;
  99. };
  100. //////////////////////////////////////////////////////// AGGREGATABLE_UNKNOWN //
  101. #define AGGREGATABLE_INTERFACE_MAP_BEGIN \
  102. \
  103. STDMETHODIMP QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppObj) \
  104. { \
  105. return m_pAggregator? m_pAggregator->QueryInterface(riid, ppObj): \
  106. InnerQueryInterface(riid, ppObj); \
  107. } \
  108. \
  109. STDMETHODIMP_(ULONG) AddRef() \
  110. { \
  111. return m_pAggregator? m_pAggregator->AddRef(): InnerAddRef(); \
  112. } \
  113. \
  114. STDMETHODIMP_(ULONG) Release() \
  115. { \
  116. return m_pAggregator? m_pAggregator->Release(): InnerRelease(); \
  117. } \
  118. \
  119. virtual HRESULT STDMETHODCALLTYPE \
  120. InnerQueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppObj) \
  121. { \
  122. if(!ppObj) \
  123. { \
  124. ASSERT(FALSE); \
  125. \
  126. return E_INVALIDARG; \
  127. } \
  128. \
  129. *ppObj = NULL; \
  130. \
  131. if(IsEqualIID(riid, IID_IUnknown)) \
  132. *ppObj = static_cast<IUnknown*>(static_cast<IAggregatable*>(this)); \
  133. else \
  134. if(IsEqualIID(riid, IID_IAggregatable)) \
  135. *ppObj = static_cast<IAggregatable*>(this); \
  136. ////////////////////////////////////////////// AGGREGATABLE_INTERFACE_MAP_END //
  137. #define AGGREGATABLE_INTERFACE_MAP_END \
  138. \
  139. if(*ppObj) \
  140. AddRef(); \
  141. \
  142. return *ppObj? S_OK: E_NOINTERFACE; \
  143. \
  144. } \
  145. #define INTERFACE_ENTRY(i) \
  146. if(IsEqualIID(riid, IID_##i)) \
  147. *ppObj = static_cast<i*>(this); \
  148. #endif // _AUDIO_BASE