windows-nt/Source/XPSP1/NT/multimedia/directx/dplay/dvoice/dxvoice/dvrecsub.h
2020-09-26 16:20:57 +08:00

167 lines
6.7 KiB
C++

/*==========================================================================
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: ClientRecordSubSystem.h
* Content: Recording sub-system.
*
* History:
* Date By Reason
* ==== == ======
* 07/19/99 rodtoll Modified from original
* 08/25/99 rodtoll General Cleanup/Modifications to support new
* compression sub-system.
* 08/27/99 rodtoll General cleanup/Simplification of recording subsystem
* Added reset of message when target changes
* Fixed recording start/stop notifications
* 09/29/99 pnewson Major AGC overhaul
* 10/29/99 rodtoll Bug #113726 - Integrate Voxware Codecs, updating to use new
* pluggable codec architecture.
* 11/12/99 rodtoll Updated to use new recording classes, improved error
* handling and new initialize function.
* rodtoll Added new high CPU handling code for record.
* 11/13/99 rodtoll Added parameter to GetNextFrame
* 11/18/99 rodtoll Re-activated recording pointer lockup detection code
* 01/10/00 pnewson AGC and VA tuning
* 01/14/2000 rodtoll Updated to handle new multiple targets
* 02/08/2000 rodtoll Bug #131496 - Selecting DVTHRESHOLD_DEFAULT results in voice
* never being detected
* 02/17/2000 rodtoll Bug #133691 - Choppy audio - queue was not adapting
* Added instrumentation
* 04/05/2000 rodtoll Updated to use new async, no buffer copy sends, removed old transmit buffer
* 04/19/2000 pnewson Fix to make AGC code work properly with VA off
* 07/09/2000 rodtoll Added signature bytes
* 08/18/2000 rodtoll Bug #42542 - DPVoice retrofit: Voice retrofit locks up after host migration
* 08/29/2000 rodtoll Bug #43553 - Start() returns 0x80004005 after lockup
* rodtoll Bug #43620 - DPVOICE: Recording buffer locks up on Aureal Vortex (VxD).
* Updated reset procedure so it ignores Stop failures and if Start() fails
* it tries resetting the recording system.
* 08/31/2000 rodtoll Bug #43804 - DVOICE: dwSensitivity structure member is confusing - should be dwThreshold
* 04/11/2001 rodtoll WINBUG #221494 DPVOICE: Updates to lockup detection methods
*
***************************************************************************/
#ifndef __CLIENTRECORDSUBSYSTEM_H
#define __CLIENTRECORDSUBSYSTEM_H
class CAGCVA;
// CClientRecordSubSystem
//
// This class implements the recording subsystem for the BattleCom client.
// It works closely with the control CShadowClientControl object to
// provide the recording / compression and transmissions portions of the
// client. This includes addition of microphone clicks to outgoing
// audio streams when appropriate.
//
// The core of the recording system is a finite state machine which
// is used to provide a way of managing the recording system's
// state and to provide smooth transitions between various
// states.
//
// It looks to the CShadowClientControl object to detect when keys
// are pressed and to provide neccessary parameters.
//
#define VSIG_CLIENTRECORDSYSTEM 'SRCV'
#define VSIG_CLIENTRECORDSYSTEM_FREE 'SRC_'
//
class CClientRecordSubSystem
{
protected: // State Machine States
typedef enum {
RECORDSTATE_IDLE = 0, // Recording is idle, no transmissions required
RECORDSTATE_VA, // Voice activated mode
RECORDSTATE_PTT // Push to talk mode
} RecordState;
public:
CClientRecordSubSystem( CDirectVoiceClientEngine *clientEngine );
~CClientRecordSubSystem();
protected:
friend class CDirectVoiceClientEngine;
HRESULT Initialize();
HRESULT GetNextFrame( LPBOOL fContinue );
BOOL IsMuted();
BOOL IsValidTarget();
inline BOOL IsPTT() { return !IsVA(); };
inline BOOL IsVA() { return (m_clientEngine->m_dvClientConfig.dwFlags & DVCLIENTCONFIG_MANUALVOICEACTIVATED || m_clientEngine->m_dvClientConfig.dwFlags & DVCLIENTCONFIG_AUTOVOICEACTIVATED); };
BOOL CheckVA();
HRESULT DoAGC();
void EndMessage();
void StartMessage();
HRESULT TransmitFrame();
protected: // FSM
HRESULT BuildAndTransmitSpeechHeader( BOOL bSendToServer );
HRESULT BuildAndTransmitSpeechWithTarget( BOOL bSendToServer );
HRESULT RecordFSM();
HRESULT HandleAutoVolumeAdjust();
HRESULT CleanupForReset();
HRESULT ResetForLockup();
void InitStats();
void BeginStats();
void CompleteStats();
protected:
DWORD m_dwSignature;
DWORD m_dwSilentTime; // # of ms that the input has been silent
DWORD m_dwFrameTime; // Amount of ms per frame
CAGCVA* m_pagcva; // Auto Gain control and Voice Activation algorithm
void DoFrameCheck();
protected:
RecordState m_recordState; // Current state of the FSM
PDPVCOMPRESSOR m_converter; // AudioConverter for outgoing data
DWORD m_uncompressedSize; // Size of frame in uncompressed format
DWORD m_compressedSize; // Maximum size in bytes of compressed frame
BOOL m_eightBit; // Is recording format 8-bit?
DWORD m_remain; // # of trailing frames we should have
unsigned char m_currentBuffer; // Buffer ID of current recording buffer
unsigned long m_framesPerPeriod; // # of subbuffers in the recording bfufer
CDirectVoiceClientEngine *m_clientEngine; // The client engine this subsystem is for
BOOL m_transmitFrame; // Transmit Current frame?
unsigned char *m_bufferPtr; // Pointer to current buffer?
DWORD m_dwSilenceTimeout; // Amount of silence in ms before transmissions tops
BOOL m_lastFrameTransmitted;
// Was the last frame transmitted
unsigned char m_msgNum; // Current message number
unsigned char m_seqNum; // Current sequence #
LPBYTE m_pbConstructBuffer;
DWORD m_dwCurrentPower; // Power level of the last packet
DWORD m_dwLastTargetVersion; // Version of target info on last frame (to check for changes)
LONG m_lSavedVolume; // System record volume when recording started
BOOL m_fRecordVolumeSaved; // Was the system record volume saved?
DWORD m_dwResetCount;
DWORD m_dwNextReadPos;
DWORD m_dwLastReadPos;
DWORD m_dwLastBufferPos;
DWORD m_dwPassesSincePosChange;
BOOL m_fIgnoreFrame;
DWORD m_dwLastFrameTime; // GetTickCount() at last frame
BOOL m_fLostFocus;
DWORD m_dwFrameCount;
DVID *m_prgdvidTargetCache;
DWORD m_dwTargetCacheSize;
DWORD m_dwTargetCacheEntries;
DWORD m_dwFullBufferSize; // Cached version of m_uncompressedSize*m_framesPerPeriod
};
#endif