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

210 lines
7.2 KiB
C++

/*==========================================================================
*
* Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
*
* File: dvengine.cpp
* Content: Implementation of CDirectVoiceEngine's static functions
*
* History:
* Date By Reason
* ==== == ======
* 07/19/99 rodtoll Created
* 07/29/99 rodtoll Added static members to load default settings
* 08/10/99 rodtoll Removed the TODOs
* 08/25/99 rodtoll General Cleanup/Modifications to support new
* compression sub-system.
* Added default parameter reads from the registry
* 08/30/99 rodtoll Distinguish between primary buffer format and
* playback format.
* Changed playback format to be 8Khz, 16Bit mono
* 10/05/99 rodtoll Additional comments/DPFs
* 10/07/99 rodtoll Updated to work in Unicode
* 02/08/2000 rodtoll Bug #131496 - Selecting DVTHRESHOLD_DEFAULT results in voice
* never being detected
* 03/03/2000 rodtoll Updated to handle alternative gamevoice build.
* 04/21/2000 rodtoll Bug #32889 - Does not run on Win2k on non-admin account
* 04/24/2000 rodtoll Bug #33203 - Aureal Vortex plays back at the wrong rate
* 07/12/2000 rodtoll Bug #31468 - Add diagnostic spew to logfile to show what is failing the HW Wizard
* 08/31/2000 rodtoll Bug #43804 - DVOICE: dwSensitivity structure member is confusing - should be dwThreshold
* 10/10/2000 rodtoll Bug #46907 - 3D Sound position not working correctly with Win9X & VxD
* 04/06/2001 kareemc Added Voice Defense
*
***************************************************************************/
#include "dxvoicepch.h"
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_VOICE
// Registry settings and their defaults
#define DPVOICE_REGISTRY_DEFAULTAGGRESSIVENESS L"DefaultAggressiveness"
#define DPVOICE_DEFAULT_DEFAULTAGGRESSIVENESS 15
#define DPVOICE_REGISTRY_DEFAULTQUALITY L"DefaultQuality"
#define DPVOICE_DEFAULT_DEFAULTQUALITY 15
#define DPVOICE_REGISTRY_DEFAULTSENSITIVITY L"DefaultSensitivity"
#define DPVOICE_DEFAULT_DEFAULTSENSITIVITY 20
#define DPVOICE_REGISTRY_ASO L"AltStart"
#define DPVOICE_DEFAULT_ASO FALSE
#define DPVOICE_REGISTRY_DUMPDIAGNOSTICS L"InitDiagnostics"
#define DPVOICE_DEFAULT_DUMPDIAGNOSTICS FALSE
// Fix for bug #33203 -- Some cards having trouble with playback at 8Khz.
#define DPVOICE_REGISTRY_PLAYBACKFORMAT L"PlaybackFormat"
#define DPVOICE_DEFAULT_PLAYBACKFORMAT CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 22050, 16 )
#define DPVOICE_REGISTRY_PRIMARYFORMAT L"PrimaryFormat"
#define DPVOICE_DEFAULT_PRIMARYFORMAT CreateWaveFormat( WAVE_FORMAT_PCM, TRUE, 22050, 16 )
#define DPVOICE_REGISTRY_MIXERFORMAT L"MixerFormat"
#define DPVOICE_DEFAULT_MIXERFORMAT CreateWaveFormat( WAVE_FORMAT_PCM, FALSE, 8000, 16 );
// Initialize static member variables
DWORD CDirectVoiceEngine::s_dwDefaultBufferAggressiveness = DPVOICE_DEFAULT_DEFAULTAGGRESSIVENESS;
DWORD CDirectVoiceEngine::s_dwDefaultBufferQuality = DPVOICE_DEFAULT_DEFAULTQUALITY;
DWORD CDirectVoiceEngine::s_dwDefaultSensitivity = DPVOICE_DEFAULT_DEFAULTSENSITIVITY;
LPWAVEFORMATEX CDirectVoiceEngine::s_lpwfxPrimaryFormat = NULL;
LPWAVEFORMATEX CDirectVoiceEngine::s_lpwfxPlaybackFormat = NULL;
LPWAVEFORMATEX CDirectVoiceEngine::s_lpwfxMixerFormat = NULL;
BOOL CDirectVoiceEngine::s_fASO = DPVOICE_DEFAULT_ASO;
WCHAR CDirectVoiceEngine::s_szRegistryPath[_MAX_PATH];
BOOL CDirectVoiceEngine::s_fDumpDiagnostics = DPVOICE_DEFAULT_DUMPDIAGNOSTICS;
DNCRITICAL_SECTION CDirectVoiceEngine::s_csSTLLock;
#undef DPF_MODNAME
#define DPF_MODNAME "CDirectVoiceEngine::Startup"
//
// Startup
//
// Called to load global settings and compression info from the registry.
//
HRESULT CDirectVoiceEngine::Startup(const WCHAR *szPath)
{
HRESULT hr;
DPFX(DPFPREP, DVF_WARNINGLEVEL, "Starting up global DLL state" );
wcscpy( s_szRegistryPath, szPath );
if (!DNInitializeCriticalSection( &s_csSTLLock ) )
{
return DVERR_OUTOFMEMORY;
}
hr = DVCDB_LoadCompressionInfo( s_szRegistryPath );
if( FAILED( hr ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to load compression info: hr=0x%x", hr );
return hr;
}
InitRecordFormats();
CRegistry cregSettings;
if( !cregSettings.Open( HKEY_CURRENT_USER, s_szRegistryPath, FALSE, TRUE ) )
{
s_dwDefaultBufferQuality = DPVOICE_DEFAULT_DEFAULTAGGRESSIVENESS;
s_dwDefaultBufferAggressiveness = DPVOICE_DEFAULT_DEFAULTQUALITY;
s_dwDefaultSensitivity = DPVOICE_DEFAULT_DEFAULTSENSITIVITY;
CDirectVoiceEngine::s_lpwfxPlaybackFormat = DPVOICE_DEFAULT_PLAYBACKFORMAT;
CDirectVoiceEngine::s_lpwfxPrimaryFormat = DPVOICE_DEFAULT_PRIMARYFORMAT;
CDirectVoiceEngine::s_lpwfxMixerFormat = DPVOICE_DEFAULT_MIXERFORMAT;
CDirectVoiceEngine::s_fDumpDiagnostics = DPVOICE_DEFAULT_DUMPDIAGNOSTICS;
return DV_OK;
}
cregSettings.ReadDWORD( DPVOICE_REGISTRY_DEFAULTQUALITY, s_dwDefaultBufferQuality );
cregSettings.ReadDWORD( DPVOICE_REGISTRY_DEFAULTAGGRESSIVENESS, s_dwDefaultBufferAggressiveness );
cregSettings.ReadDWORD( DPVOICE_REGISTRY_DEFAULTSENSITIVITY, s_dwDefaultSensitivity );
cregSettings.ReadBOOL( DPVOICE_REGISTRY_ASO, s_fASO );
cregSettings.ReadBOOL( DPVOICE_REGISTRY_DUMPDIAGNOSTICS, s_fDumpDiagnostics );
if( FAILED( CREG_ReadAndAllocWaveFormatEx( cregSettings, DPVOICE_REGISTRY_PLAYBACKFORMAT, &CDirectVoiceEngine::s_lpwfxPlaybackFormat ) ) )
{
CDirectVoiceEngine::s_lpwfxPlaybackFormat = DPVOICE_DEFAULT_PLAYBACKFORMAT;
}
if( FAILED( CREG_ReadAndAllocWaveFormatEx( cregSettings, DPVOICE_REGISTRY_PRIMARYFORMAT, &CDirectVoiceEngine::s_lpwfxPrimaryFormat ) ) )
{
CDirectVoiceEngine::s_lpwfxPrimaryFormat = DPVOICE_DEFAULT_PRIMARYFORMAT;
}
if( FAILED( CREG_ReadAndAllocWaveFormatEx( cregSettings, DPVOICE_REGISTRY_MIXERFORMAT, &CDirectVoiceEngine::s_lpwfxMixerFormat ) ) )
{
CDirectVoiceEngine::s_lpwfxMixerFormat = DPVOICE_DEFAULT_MIXERFORMAT;
}
return DV_OK;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CDirectVoiceEngine::Shutdown"
//
// Shutdown
//
// Called to free the global settings and compression list
//
HRESULT CDirectVoiceEngine::Shutdown()
{
HRESULT hr;
DPFX(DPFPREP, DVF_WARNINGLEVEL, "Shutting down global DLL state" );
DeInitRecordFormats();
if( CDirectVoiceEngine::s_lpwfxPlaybackFormat != NULL )
delete CDirectVoiceEngine::s_lpwfxPlaybackFormat;
if( CDirectVoiceEngine::s_lpwfxMixerFormat != NULL )
delete CDirectVoiceEngine::s_lpwfxMixerFormat;
if( CDirectVoiceEngine::s_lpwfxPrimaryFormat != NULL )
delete CDirectVoiceEngine::s_lpwfxPrimaryFormat;
hr = DVCDB_FreeCompressionInfo();
if( FAILED( hr ) )
{
DPFX(DPFPREP, DVF_ERRORLEVEL, "Unable to un-load compression info: hr=0x%x", hr );
return hr;
}
DNDeleteCriticalSection( &s_csSTLLock );
return DV_OK;
}
#undef DPF_MODNAME
#define DPF_MODNAME "CDirectVoiceEngine::ValidateSpeechPacketSize"
//
// ValidateSpeechPacketSize
//
// Called to make sure the speech packet size is valid
//
BOOL CDirectVoiceEngine::ValidateSpeechPacketSize(LPDVFULLCOMPRESSIONINFO lpdvfCompressionInfo, DWORD dwSize)
{
BOOL bValid;
// return true in this case because it isn't a hack attempt
if( lpdvfCompressionInfo == NULL)
return TRUE;
// Check for VR12
if( lpdvfCompressionInfo->guidType == DPVCTGUID_VR12 )
bValid = ( dwSize <= lpdvfCompressionInfo->dwFrameLength );
else
bValid = ( dwSize == lpdvfCompressionInfo->dwFrameLength );
return bValid;
}