windows-nt/Source/XPSP1/NT/enduser/netmeeting/av/nac/acmcaps.h
2020-09-26 16:20:57 +08:00

317 lines
11 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* File: acmcaps.h
*
*
* ACM implementation of Microsoft Network Audio capability object.
*
* Additional methods supported by this implementation:
* BOOL OpenACMDriver(HACMDRIVERID hadid); // (internal)
* VOID CloseACMDriver(); // (internal)
* HACMDRIVER GetDriverHandle(); // (internal)
*
* AUDIO_FORMAT_ID AddEncodeFormat(AUDCAP_DETAILS *pFmtBuf,LPVOID lpvMappingData, UINT uSize);
* AUDIO_FORMAT_ID AddDecodeFormat(AUDCAP_DETAILS *pFmtBuf,LPVOID lpvMappingData, UINT uSize);
*
* Revision History:
*
* 12/27/95 mikev created
*/
#ifndef _ACMCAPS_H
#define _ACMCAPS_H
// ACM enumeration support functions
BOOL GetFormatBuffer(VOID);
BOOL __stdcall ACMFormatTagEnumCallback(HACMDRIVERID hadid, LPACMFORMATTAGDETAILS paftd,
DWORD_PTR dwInstance, DWORD fdwSupport);
BOOL __stdcall ACMFormatEnumCallback(HACMDRIVERID hadid,
LPACMFORMATDETAILS pafd, DWORD_PTR dwInstance, DWORD fdwSupport);
BOOL __stdcall ACMDriverEnumCallback(HACMDRIVERID hadid,
DWORD_PTR dwInstance, DWORD fdwSupport);
#ifdef __cplusplus
class CAcmCapability
{
protected:
HACMDRIVER hAcmDriver;
public:
CAcmCapability();
~CAcmCapability();
BOOL DriverEnum(DWORD_PTR pAppParam);
HACMDRIVER GetDriverHandle() {return hAcmDriver;};
virtual BOOL FormatEnumHandler(HACMDRIVERID hadid,
LPACMFORMATDETAILS pafd, DWORD_PTR dwInstance, DWORD fdwSupport);
virtual BOOL OpenACMDriver(HACMDRIVERID hadid);
virtual VOID CloseACMDriver();
};
#define PREF_ORDER_UNASSIGNED 0xffff
typedef enum {
SortByAppPref=0
}SortMode;
typedef struct AudioParameters
{
BYTE RTPPayload; // RTP payload type
DWORD dwFormatDescriptor; // the unique ID of this format
UINT uSamplesPerSec;
UINT uBitsPerSample;
}AUDIO_PARAMS;
typedef struct H245AudCaps
{
H245_CAPDIR_T Dir;
H245_DATA_T DataType;
H245_CLIENT_T ClientType;
H245_CAPID_T CapId;
H245_CAP_NONSTANDARD_T H245_NonStd;
H245_CAP_NONSTANDARD_T H245Aud_NONSTD;
unsigned short H245Aud_G711_ALAW64;
unsigned short H245Aud_G711_ULAW64;
H245_CAP_G723_T H245Aud_G723;
} H245_TERMCAP;
// default initializer for NSC_CHANNEL_PARAMETERS
#define STD_CHAN_PARAMS {0, 0,0,0,0,0,0,0,0}
// initializers for CC_TERMCAP
#define NONSTD_TERMCAP {H245_CAPDIR_LCLRX, H245_DATA_AUDIO,H245_CLIENT_AUD_NONSTD, 0, {0}}
#define STD_TERMCAP(tc) {H245_CAPDIR_LCLRX, H245_DATA_AUDIO,(tc), 0, {0}}
// Capability cache structure. This contains local capabilities, public versions of
// those capabilities, parameters for capabilities, plus other information
// that is used to affect how the local machine proritizes or selects a format
//
typedef struct AudCapDetails
{
WORD wFormatTag;
H245_TERMCAP H245TermCap;
NSC_CHANNEL_PARAMETERS nonstd_params;
AUDIO_PARAMS audio_params;
DWORD dwPublicRefIndex; // index of the local capability entry that will be
// advertized. Zero if this entry is the one to advertize
BOOL bSendEnabled;
BOOL bRecvEnabled;
DWORD dwDefaultSamples; // default number of samples per packet
UINT uMaxBitrate; // max bandwidth used by this format (calculated: bits per sample * sample rate)
UINT uAvgBitrate; // average bandwidth used by this format (we get this from the codec)
WORD wCPUUtilizationEncode;
WORD wCPUUtilizationDecode;
WORD wApplicationPrefOrder; // overriding preference - lower number means more preferred
UINT uLocalDetailsSize; // size in bytes of what lpLocalFormatDetails points to
LPVOID lpLocalFormatDetails;
UINT uRemoteDetailsSize; // size in bytes of what lpRemoteFormatDetails points to
LPVOID lpRemoteFormatDetails;
char szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
}AUDCAP_DETAILS, *PAUDCAP_DETAILS;
//Registry Format Cache Structure
//Use In the ACM routines. They build a list of format names, and a list of format data blocks.
//rrf_nFormats is the number of formats we read from the registry.
typedef struct rrfCache {
char **pNames;
BYTE **pData;
UINT nFormats;
} RRF_INFO, *PRRF_INFO;
/*
* ACM interface
* Definitions for interfacing with ACM
*/
#define ACMAPP_FORMATENUMHANDLER_MASK 0x3
#define ACMAPP_FORMATENUMHANDLER_ENUM 0x0
#define ACMAPP_FORMATENUMHANDLER_ADD 0x1
typedef struct
{
CAcmCapability *pCapObject; // the "calling" capability object
PAUDCAP_DETAILS pAudcapDetails; // a pointer to an AUDCAP_DETAILS structure
DWORD dwFlags; // misc flags...
LPWAVEFORMATEX lpwfx; // pointer to wave format structure. used when adding formats
LPACMFORMATTAGDETAILS paftd; // pointer to an ACM format tag details.
// is filled in during DriverEnum
HRESULT hr;
PRRF_INFO pRegCache;
} ACM_APP_PARAM, *PACM_APP_PARAM;
//
// implementation class of the audio interface
//
class CImpAppAudioCap : public IAppAudioCap
{
public:
STDMETHOD_(ULONG, AddRef());
STDMETHOD_(ULONG, Release());
STDMETHOD(GetNumFormats(UINT *puNumFmtOut));
STDMETHOD(ApplyAppFormatPrefs(PBASIC_AUDCAP_INFO pFormatPrefsBuf,
UINT uNumFormatPrefs));
STDMETHOD(EnumFormats(PBASIC_AUDCAP_INFO pFmtBuf, UINT uBufsize,
UINT *uNumFmtOut));
STDMETHOD(EnumCommonFormats(PBASIC_AUDCAP_INFO pFmtBuf, UINT uBufsize,
UINT *uNumFmtOut, BOOL bTXCaps));
STDMETHOD( GetBasicAudcapInfo (AUDIO_FORMAT_ID Id,
PBASIC_AUDCAP_INFO pFormatPrefsBuf));
STDMETHOD( AddACMFormat (LPWAVEFORMATEX lpwfx, PBASIC_AUDCAP_INFO pAudCapInfo));
STDMETHOD( RemoveACMFormat (LPWAVEFORMATEX lpwfx));
STDMETHOD_ (LPVOID, GetFormatDetails) (AUDIO_FORMAT_ID Id) ;
void Init(class CMsiaCapability * pCapObject) {m_pCapObject = pCapObject;};
protected:
class CMsiaCapability * m_pCapObject;
};
class CMsiaCapability : public IH323MediaCap, public CAcmCapability
{
protected:
UINT uRef;
BOOL bPublicizeTXCaps;
BOOL bPublicizeTSTradeoff;
PRRF_INFO pRegFmts; //Registry cache info structure
// LOOKLOOK this supports a hack to disable CPU intensive codecs if not running on a pentium
WORD wMaxCPU;
UINT m_uPacketDuration; // packet duration in millisecs
static MEDIA_FORMAT_ID IDsByRank[MAX_CAPS_PRESORT];
static UINT uNumLocalFormats; // # of active entries in pLocalFormats
static UINT uCapIDBase; // rebase capability ID to index into IDsByRank
static AUDCAP_DETAILS *pLocalFormats; // cached list of formats that we can receive
static UINT uLocalFormatCapacity; // size of pLocalFormats (in multiples of AUDCAP_DETAILS)
static UINT uStaticRef; // global ref count for all instances of CMsiaCapability
AUDCAP_DETAILS *pRemoteDecodeFormats; // cached list of formats that the
UINT uNumRemoteDecodeFormats; // # of entries for remote decode capabilities
UINT uRemoteDecodeFormatCapacity; // size of pRemoteDecodeFormats (in multiples of VIDCAP_DETAILS)
// other end can receive/decode
// embedded interface classes
CImpAppAudioCap m_IAppCap;
public:
protected:
// Internal functions
UINT IDToIndex(MEDIA_FORMAT_ID id) {return id - uCapIDBase;};
MEDIA_FORMAT_ID IndexToId(UINT uIndex){return uIndex + uCapIDBase;};
LPTSTR AllocRegistryKeyName(LPTSTR lpDriverName,
UINT uSampleRate, UINT uBitsPerSample, UINT uBytesPerSec);
VOID FreeRegistryKeyName(LPTSTR lpszKeyName);
virtual VOID CalculateFormatProperties(AUDCAP_DETAILS *pFmtBuf,LPWAVEFORMATEX lpwfx);
virtual BOOL IsFormatSpecified(LPWAVEFORMATEX lpFormat, LPACMFORMATDETAILS pafd,
LPACMFORMATTAGDETAILS paftd, AUDCAP_DETAILS *pAudcapDetails);
virtual VOID SortEncodeCaps(SortMode sortmode);
BOOL UpdateFormatInRegistry(AUDCAP_DETAILS *pFmt);
BOOL BuildFormatName( AUDCAP_DETAILS *pAudcapDetails,
char *pszFormatTagName,
char *pszFormatName);
virtual AUDIO_FORMAT_ID AddFormat(AUDCAP_DETAILS *pFmtBuf,LPVOID lpvMappingData, UINT uSize);
DWORD MaxFramesPerPacket(WAVEFORMATEX *pwf);
DWORD MinFramesPerPacket(WAVEFORMATEX *pwf);
UINT MinSampleSize(WAVEFORMATEX *pwf);
public:
STDMETHOD_(BOOL, Init());
STDMETHOD_(BOOL, ReInit());
CMsiaCapability();
~CMsiaCapability();
// handler for codec enumeration callback
virtual BOOL FormatEnumHandler(HACMDRIVERID hadid,
LPACMFORMATDETAILS pafd, DWORD_PTR dwInstance, DWORD fdwSupport);
virtual BOOL AddFormatEnumHandler(HACMDRIVERID hadid,
LPACMFORMATDETAILS pafd, DWORD_PTR dwInstance, DWORD fdwSupport);
//
// Common interface methods
//
STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR * ppvObj);
STDMETHOD_(ULONG, AddRef());
STDMETHOD_(ULONG, Release());
//
// IACapApi methods
//
STDMETHOD(GetNumFormats(UINT *puNumFmtOut));
STDMETHOD(ApplyAppFormatPrefs(PBASIC_AUDCAP_INFO pFormatPrefsBuf,
UINT uNumFormatPrefs));
STDMETHOD(EnumFormats(PBASIC_AUDCAP_INFO pFmtBuf, UINT uBufsize,
UINT *uNumFmtOut));
STDMETHOD(EnumCommonFormats(PBASIC_AUDCAP_INFO pFmtBuf, UINT uBufsize,
UINT *uNumFmtOut, BOOL bTXCaps));
STDMETHOD( GetBasicAudcapInfo (AUDIO_FORMAT_ID Id,
PBASIC_AUDCAP_INFO pFormatPrefsBuf));
STDMETHOD( AddACMFormat (LPWAVEFORMATEX lpwfx, PAUDCAP_INFO pAudCapInfo));
STDMETHOD( RemoveACMFormat (LPWAVEFORMATEX lpwfx));
// support of IACapApi
virtual HRESULT CopyAudcapInfo (PAUDCAP_DETAILS pDetails, PAUDCAP_INFO pInfo,
BOOL bDirection);
//
// H.323 method implementations
//
STDMETHOD_(VOID, FlushRemoteCaps());
STDMETHOD( AddRemoteDecodeCaps(PCC_TERMCAPLIST pTermCapList));
STDMETHOD_(MEDIA_FORMAT_ID, AddRemoteDecodeFormat(PCC_TERMCAP pCCThisCap));
STDMETHOD( CreateCapList(LPVOID *ppCapBuf));
STDMETHOD( DeleteCapList(LPVOID pCapBuf));
STDMETHOD( ResolveEncodeFormat(AUDIO_FORMAT_ID *pIDEncodeOut,
AUDIO_FORMAT_ID *pIDRemoteDecode));
STDMETHOD_(UINT, GetLocalSendParamSize(MEDIA_FORMAT_ID dwID));
STDMETHOD_(UINT, GetLocalRecvParamSize(PCC_TERMCAP pCapability));
STDMETHOD( GetEncodeParams(LPVOID pBufOut, UINT uBufSize,LPVOID pLocalParams, UINT uSizeLocal,
AUDIO_FORMAT_ID idRemote, AUDIO_FORMAT_ID idLocal));
STDMETHOD( GetLocalDecodeParams(LPVOID lpvBuf, UINT uBufSize, AUDIO_FORMAT_ID id));
STDMETHOD( GetPublicDecodeParams(LPVOID pBufOut, UINT uBufSize, AUDIO_FORMAT_ID id));
STDMETHOD( GetDecodeParams(PCC_RX_CHANNEL_REQUEST_CALLBACK_PARAMS pChannelParams,
AUDIO_FORMAT_ID * pFormatID, LPVOID lpvBuf, UINT uBufSize));
STDMETHOD_(BOOL, IsCapabilityRecognized(PCC_TERMCAP pCCThisCap));
STDMETHOD_(BOOL, IsFormatPublic(MEDIA_FORMAT_ID FormatID));
STDMETHOD_(MEDIA_FORMAT_ID, GetPublicID(MEDIA_FORMAT_ID FormatID));
STDMETHOD_ (VOID, EnableTXCaps(BOOL bSetting)) {bPublicizeTXCaps = bSetting;};
STDMETHOD_ (VOID, EnableRemoteTSTradeoff(BOOL bSetting)) {bPublicizeTSTradeoff= bSetting;};
STDMETHOD (SetAudioPacketDuration( UINT durationInMs));
STDMETHOD (ResolveToLocalFormat(MEDIA_FORMAT_ID FormatIDLocal,
MEDIA_FORMAT_ID * pFormatIDRemote));
// Methods common to H.323 and MSICCP
STDMETHOD_(UINT, GetNumCaps()){return uNumLocalFormats;};
STDMETHOD_(UINT, GetNumCaps(BOOL bRXCaps));
STDMETHOD_(BOOL, IsHostForCapID(MEDIA_FORMAT_ID CapID));
STDMETHOD(SetCapIDBase(UINT uNewBase));
STDMETHOD_(UINT, GetCapIDBase()) {return uCapIDBase;};
STDMETHOD (IsFormatEnabled (MEDIA_FORMAT_ID FormatID, PBOOL bRecv, PBOOL bSend));
// methods provided to the Data pump, common to H.323 and MSICCP
STDMETHOD(GetEncodeFormatDetails(MEDIA_FORMAT_ID FormatID, VOID **ppFormat, UINT *puSize));
STDMETHOD(GetDecodeFormatDetails(MEDIA_FORMAT_ID FormatID, VOID **ppFormat, UINT *puSize));
};
#endif // __cplusplus
#endif //#ifndef _ACMCAPS_H