www.pudn.com > WINCEOS.zip > btagpriv.h
// // Copyright (c) Microsoft Corporation. All rights reserved. // // // This source code is licensed under Microsoft Shared Source License // Version 1.0 for Windows CE. // For a copy of the license visit http://go.microsoft.com/fwlink/?LinkId=3223. // #ifndef __AUDIOGW_H__ #define __AUDIOGW_H__ #include#include #include #include #include #include #include #include #include #include #include "btagpub.h" #include "btagdbg.h" #include "btagutil.h" #define AG_CAP_3WAY_CALL 0x01 #define AG_CAP_EC_NR 0x02 #define AG_CAP_VOICE_RECOG 0x04 #define AG_CAP_INBAND_RING 0x08 #define AG_CAP_VOICE_TAG 0x10 #define AG_CAP_REJECT_CALL 0x20 #define DEFAULT_AG_CAPABILITY (AG_CAP_REJECT_CALL|AG_CAP_3WAY_CALL) #define HF_CAP_EC_NR 0x01 #define HF_CAP_3WAY_CALL 0x02 #define HF_CAP_CLI 0x04 #define HF_CAP_VOICE_RECOG 0x08 #define HF_CAP_VOLUME 0x10 #define HANGUP_DELAY_MS 2000 #define HANGUP_DELAY_BUSY_MS 14000 //14 seconds to capture the long US busy signal #define DEFAULT_PAGE_TIMEOUT 0x2500 // approx 6 seconds #define DEFAULT_SNIFF_DELAY 5000 #define DEFAULT_SNIFF_MAX 0x800 #define DEFAULT_SNIFF_MIN 0x640 #define DEFAULT_SNIFF_ATTEMPT 0x20 #define DEFAULT_SNIFF_TO 0x20 #define MAX_PAIRINGS 4 #define DEFAULT_BTEXTHANDLER_MODULE L"btagext.dll" #define BTATHANDLER_SETCALLBACK_API L"BthAGATSetCallback" #define BTATHANDLER_HANDLER_API L"BthAGATHandler" #define BTAGEXT_ON_VOICETAG L"BthAGOnVoiceTag" typedef enum _AG_STATE { AG_STATE_DISCONNECTED = 0x00, AG_STATE_CONNECTING = 0x01, AG_STATE_CONNECTED = 0x02, AG_STATE_RINGING = 0x03, AG_STATE_AUDIO_UP = 0x04, AG_STATE_RINGING_AUDIO_UP = 0x5 } AG_STATE; typedef enum _AG_CALL_TYPE { AG_CALL_TYPE_NONE = 0x00, AG_CALL_TYPE_IN = 0x01, AG_CALL_TYPE_OUT = 0x02 } AG_CALL_TYPE; typedef struct _AG_DEVICE { BT_ADDR bta; GUID service; } AG_DEVICE, *PAG_DEVICE; //gets the list of devices from the registry DWORD GetBTAddrList(AG_DEVICE* pDevices, USHORT usNumDevices); typedef struct _AG_PROPS { DWORD state; USHORT usCallType; AG_DEVICE DeviceList[MAX_PAIRINGS]; BT_ADDR btAddrClient; USHORT usSpeakerVolume; USHORT usMicVolume; USHORT usRemoteFeatures; USHORT usCallSetup; USHORT usHFCapability; USHORT usPageTimeout; ULONG ulSniffDelay; USHORT usSniffMax; USHORT usSniffMin; USHORT usSniffAttempt; USHORT usSniffTimeout; BOOL fInCall : 1; BOOL fPCMMode : 1; BOOL fAuth : 1; BOOL fEncrypt : 1; BOOL fNotifyCallWait : 1; BOOL fNotifyCLI : 1; BOOL fIndicatorUpdates : 1; BOOL fHandsfree : 1; BOOL fNoHandsfree : 1; BOOL fHaveService : 1; BOOL fPowerSave : 1; BOOL fMuteRings : 1; BOOL fUseHFAudio : 1; } AG_PROPS, *PAG_PROPS; extern HINSTANCE g_hInstance; extern CRITICAL_SECTION g_csLock; extern DWORD g_dwState; typedef void (*PFN_BthAGATSetCallback) (PFN_SendATCommand pfn); typedef BOOL (*PFN_BthAGATHandler) (LPSTR szCommand, DWORD cbCommand); #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) #endif class CATParser; class CAGEngine : public SVSSynch, public SVSRefObj { public: CAGEngine(void); DWORD Init(CATParser* pParser); void Deinit(void); void GetAGProps(PAG_PROPS pAGProps); void SetAGProps(PAG_PROPS pAGProps); DWORD OpenAGConnection(BOOL fOpenAudio, BOOL fFirstOnly); void CloseAGConnection(BOOL fCloseControl); void ConnectionEvent(void); DWORD NotifyConnect(SOCKET sockClient, BOOL fHFSupport); BOOL FindBTAddrInList(const BT_ADDR btaSearch); void SetSpeakerVolume(unsigned short usVolume); void SetMicVolume(unsigned short usVolume); DWORD SetBTAddrList(BT_ADDR btAddr, BOOL fHFSupport); // General handlers void OnUnknownCommand(void); void OnSpeakerVol(LPSTR pszParams, int cchParam); void OnMicVol(LPSTR pszParams, int cchParam); // Headset handlers void OnHeadsetButton(LPSTR pszParams, int cchParam); // Hands-Free handlers void OnDial(LPSTR pszParams, int cchParam); void OnDialLast(LPSTR pszParams, int cchParam); void OnDialMemory(LPSTR pszParams, int cchParam); void OnAnswerCall(LPSTR pszParams, int cchParam); void OnHangupCall(LPSTR pszParam, int cchParam); void OnDTMF(LPSTR pszParams, int cchParam); void OnCallHold(LPSTR pszParams, int cchParam); void OnSupportedFeatures(LPSTR pszParams, int cchParam); void OnTestIndicators(LPSTR pszParams, int cchParam); void OnReadIndicators(LPSTR pszParams, int cchParam); void OnRegisterIndicatorUpdates(LPSTR pszParams, int cchParam); void OnEnableCallWaiting(LPSTR pszParams, int cchParam); void OnEnableCLI(LPSTR pszParams, int cchParam); void OnVoiceRecognition(LPSTR pszParams, int cchParam); void OnOK(void); void OnError(void); // Called from Network Module void OnNetworkEvent(DWORD dwEvent, LPVOID lpvParam, DWORD cbParam); // Called from PhoneExt Module void OnServiceCallback(BOOL fHaveService); static DWORD WINAPI AGUIThread(LPVOID pv); void AGUIThread_Int(void); static DWORD WINAPI TimeoutConnection(LPVOID pv); void TimeoutConnection_Int(void); static DWORD WINAPI EnterSniffModeThread(LPVOID pv); void EnterSniffModeThread_Int(void); DWORD ExternalSendATCommand(LPSTR pszCommand, unsigned int cbCommand); private: DWORD SendATCommand(LPSTR pszCommand, unsigned int cbCommand); DWORD OpenControlChannel(BOOL fFirstOnly); DWORD OpenAudioChannel(void); void CloseControlChannel(void); DWORD CloseAudioChannel(void); void ServiceConnectionUp(); void EnsureActiveBaseband(void); DWORD NotifySCOConnect(unsigned short handle); void ClearSCO(void); void OnNetworkAnswerCall(void); void OnNetworkHangupCall(DWORD dwRemainingCalls, DWORD dwHangUpDelayMS); void OnNetworkRejectCall(void); void OnNetworkCallIn(LPSTR pszNumber); void OnNetworkInfo(LPSTR pszNumber); void OnNetworkCallOut(void); void OnNetworkRing(void); void OnNetworkCallFailed(USHORT usCallType, DWORD dwStatus); PFN_BthAGOnVoiceTag GetVoiceTagHandler(void); SVSThreadPool* m_pTP; SVSCookie m_CloseCookie; SVSCookie m_SniffCookie; AG_PROPS m_AGProps; HANDLE m_hUIThread; SOCKET m_sockClient; unsigned short m_hSco; CATParser* m_pParser; WCHAR m_wszCLI[MAX_PHONE_NUMBER]; BOOL m_fCancelCloseConnection; BOOL m_fExpectHeadsetButton; BOOL m_fAudioConnect; BOOL m_fNetworkInited; BOOL m_fPhoneExtInited; }; extern CAGEngine* g_pAGEngine; class CATParser : public SVSSynch { public: CATParser(); static DWORD WINAPI ATParserThread(LPVOID pv); void ATParserThread_Int(void); DWORD Init(void); void Deinit(void); DWORD Start(CAGEngine* pHandler, SOCKET sockClient); void Stop(void); PFN_BthAGOnVoiceTag GetVoiceTagHandler() { return m_pfnBthAGOnVoiceTag; } private: DWORD ReadCommand(SOCKET s, CBuffer& buffCommand); SOCKET m_sockClient; CAGEngine* m_pHandler; BOOL m_fShutdown; HANDLE m_hThread; CBuffer m_buffRecv; int m_cbUnRead; HINSTANCE m_hBtExtHandler; PFN_BthAGATSetCallback m_pfnBthAGExtATSetCallback; PFN_BthAGATHandler m_pfnBthAGExtATHandler; PFN_BthAGOnVoiceTag m_pfnBthAGOnVoiceTag; }; class CAGService : public SVSSynch { public: CAGService(); DWORD Init(void); void Deinit(void); DWORD Start(void); void Stop(void); DWORD OpenAudio(void); DWORD CloseAudio(void); DWORD OpenControlConnection(BOOL fFirstOnly); DWORD CloseControlConnection(void); DWORD SetSpeakerVolume(unsigned short usVolume); DWORD SetMicVolume(unsigned short usVolume); DWORD GetSpeakerVolume(unsigned short* pusVolume); DWORD GetMicVolume(unsigned short* pusVolume); DWORD GetPowerMode(BOOL* pfPowerSave); DWORD SetPowerMode(BOOL fPowerSave); static DWORD WINAPI ListenThread(LPVOID pv); void ListenThread_Int(void); static DWORD WINAPI CAGService::SCOListenThread(LPVOID pv); void CAGService::SCOListenThread_Int(void); private: DWORD LoadAGState(void); DWORD SaveAGState(void); DWORD AddSDPRecord(PBYTE rbgSdpRecord, DWORD cbSdpRecord, DWORD dwChannelOffset, unsigned long ulPort, unsigned long* pSdpRecord); DWORD RemoveSDPRecord(unsigned long* pSdpRecord); CATParser m_ATParser; CAGEngine m_AGEngine; HANDLE m_hThread; HANDLE m_hScoThread; HANDLE m_hCloseEvent; SOCKET m_sockServer[2]; BOOL m_fShutdown; ULONG m_SDPRecordHS; ULONG m_SDPRecordHF; DWORD m_dwHFCapability; }; #endif // __AUDIOGW_H__