You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
11 KiB
317 lines
11 KiB
/*
|
|
* 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
|
|
|
|
|
|
|
|
|