www.pudn.com > NeroSDK-v1.05.zip > AudioBase.h
/******************************************************************************
|* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
|* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|* PARTICULAR PURPOSE.
|*
|* Copyright 1995-2004 Ahead Software AG. All Rights Reserved.
|*-----------------------------------------------------------------------------
|* NeroSDK / AudioPluginManager
|*
|* FILE: AudioBase.h
|*
|* PURPOSE: Definition of base classes for components and some helper classes
******************************************************************************/
#ifndef _AUDIO_BASE
# define _AUDIO_BASE
#include "AudioPluginEnv.h"
///////////////////////////////////////////////////////////////////// CStatus //
class CStatus : public IStatus, public IStatusCategory
{
// Construction/Destruction
public:
CStatus(DWORD syserror);
CStatus(EAudioError audioerror);
CStatus(const char *szError);
// Operations
public:
void SetCategory(EStatusCategory cat);
// IUnknown
STDMETHODIMP QueryInterface(REFIID riid,
void __RPC_FAR *__RPC_FAR *ppObj);
STDMETHODIMP_(ULONG) AddRef();
STDMETHODIMP_(ULONG) Release();
// IStatus
virtual const char * GetDescription();
virtual EAudioError GetAudioError();
virtual DWORD GetSysError();
// IStatusCategory
virtual EStatusCategory GetCategory();
protected:
// Data
protected:
long m_lRef;
DWORD m_dwErr;
EAudioError m_eAudioError;
EStatusCategory m_category;
CString m_csError;
};
/////////////////////////////////////////////////////////////// CAggregatable //
#define AGGFLAG_NODELETE 0x00000001
class CAggregatable : public IAggregatable
{
public:
CAggregatable(DWORD dwFlags)
: m_pAggregator (NULL),
m_lRef (0),
m_dwFlags (dwFlags)
{}
virtual ~CAggregatable()
{}
// IAggregatable
virtual bool SetAggregator(IUnknown *pAggregator)
{
m_pAggregator = pAggregator;
return true;
}
virtual bool GetAggregator(IUnknown **ppAggregator)
{
if(!ppAggregator)
{
ASSERT(FALSE);
return false;
}
*ppAggregator = m_pAggregator;
if(m_pAggregator)
(*ppAggregator)->AddRef();
return true;
}
virtual ULONG STDMETHODCALLTYPE InnerAddRef()
{
InterlockedIncrement(&m_lRef);
return m_lRef;
}
virtual ULONG STDMETHODCALLTYPE InnerRelease()
{
InterlockedDecrement(&m_lRef);
if(!m_lRef)
{
if(!(m_dwFlags & AGGFLAG_NODELETE))
delete this;
return 0;
}
return m_lRef;
}
protected:
IUnknown *m_pAggregator;
long m_lRef;
DWORD m_dwFlags;
};
//////////////////////////////////////////////////////// AGGREGATABLE_UNKNOWN //
#define AGGREGATABLE_INTERFACE_MAP_BEGIN \
\
STDMETHODIMP QueryInterface(REFIID riid, void __RPC_FAR *__RPC_FAR *ppObj) \
{ \
return m_pAggregator? m_pAggregator->QueryInterface(riid, ppObj): \
InnerQueryInterface(riid, ppObj); \
} \
\
STDMETHODIMP_(ULONG) AddRef() \
{ \
return m_pAggregator? m_pAggregator->AddRef(): InnerAddRef(); \
} \
\
STDMETHODIMP_(ULONG) Release() \
{ \
return m_pAggregator? m_pAggregator->Release(): InnerRelease(); \
} \
\
virtual HRESULT STDMETHODCALLTYPE \
InnerQueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppObj) \
{ \
if(!ppObj) \
{ \
ASSERT(FALSE); \
\
return E_INVALIDARG; \
} \
\
*ppObj = NULL; \
\
if(IsEqualIID(riid, IID_IUnknown)) \
*ppObj = static_cast(static_cast(this)); \
else \
if(IsEqualIID(riid, IID_IAggregatable)) \
*ppObj = static_cast(this); \
////////////////////////////////////////////// AGGREGATABLE_INTERFACE_MAP_END //
#define AGGREGATABLE_INTERFACE_MAP_END \
\
if(*ppObj) \
AddRef(); \
\
return *ppObj? S_OK: E_NOINTERFACE; \
\
} \
#define INTERFACE_ENTRY(i) \
if(IsEqualIID(riid, IID_##i)) \
*ppObj = static_cast(this); \
#endif // _AUDIO_BASE