/*========================================================================== * * 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; }