210 lines
7.2 KiB
C++
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;
|
||
|
}
|
||
|
|