You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
6.3 KiB
218 lines
6.3 KiB
/*==========================================================================
|
|
*
|
|
* Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: diagnos.cpp
|
|
* Content: Utility functions to write out diagnostic files when registry key is set.
|
|
*
|
|
* History:
|
|
* Date By Reason
|
|
* ==== == ======
|
|
* 07/13/00 rodtoll Created (Bug #31468 - Add diagnostic spew to logfile to show what is failing
|
|
* 08/22/2000 rodtoll Bug #43060 - DPVOICE: Diagnostics data which is dumped to memory / debugger contains garbage
|
|
* 02/28/2002 rodtoll Fix for regression caused by TCHAR conversion (Post DirectX 8.1 work)
|
|
* - Source was updated to retrieve device information from DirectSound w/Unicode
|
|
* but routines which wanted the information needed Unicode.
|
|
*
|
|
***************************************************************************/
|
|
|
|
#include "dxvutilspch.h"
|
|
|
|
|
|
#undef DPF_SUBCOMP
|
|
#define DPF_SUBCOMP DN_SUBCOMP_VOICE
|
|
|
|
|
|
#define DPLOG_MAX_STRING 256
|
|
|
|
FILE *g_hOutputFile = NULL;
|
|
BOOL g_fDiagnosisEnabled = FALSE;
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnostics_WriteDeviceInfo"
|
|
void Diagnostics_WriteDeviceInfo( DWORD dwLevel, const char *szDeviceName, PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA pData )
|
|
{
|
|
Diagnostics_Write( dwLevel, "%hs Device Information:", szDeviceName );
|
|
Diagnostics_Write( dwLevel, "Device Name:\n%hs", pData->Description ? pData->Description : "<NULL>");
|
|
Diagnostics_Write( dwLevel, "Device ID:" );
|
|
Diagnostics_WriteGUID(dwLevel, pData->DeviceId );
|
|
|
|
switch( pData->Type )
|
|
{
|
|
case DIRECTSOUNDDEVICE_TYPE_EMULATED: Diagnostics_Write( dwLevel, "Device Type:\nEmulated" ); break;
|
|
case DIRECTSOUNDDEVICE_TYPE_VXD: Diagnostics_Write( dwLevel, "Device Type:\nVXD" ); break;
|
|
case DIRECTSOUNDDEVICE_TYPE_WDM: Diagnostics_Write( dwLevel, "Device Type:\nWDM" ); break;
|
|
default: Diagnostics_Write( dwLevel, "Device Type:\n<UNKNOWN>" ); break;
|
|
}
|
|
|
|
Diagnostics_Write( dwLevel, "Description:\n%hs", pData->Description ? pData->Description : "<NULL>" );
|
|
Diagnostics_Write( dwLevel, "Module:\n%hs", pData->Module ? pData->Module : "<NULL>" );
|
|
Diagnostics_Write( dwLevel, "WaveID:\n%d", pData->WaveDeviceId );
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnostics_DeviceInfo"
|
|
HRESULT Diagnostics_DeviceInfo( const GUID *pguidPlayback, const GUID *pguidCapture )
|
|
{
|
|
if( !g_fDiagnosisEnabled )
|
|
return DV_OK;
|
|
|
|
LPKSPROPERTYSET lpksProperty = NULL;
|
|
HRESULT hr = DV_OK;
|
|
GUID guidTruePlayback;
|
|
GUID guidTrueCapture;
|
|
PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA pPlaybackDesc = NULL;
|
|
PDSPROPERTY_DIRECTSOUNDDEVICE_DESCRIPTION_A_DATA pCaptureDesc = NULL;
|
|
|
|
hr = DV_MapCaptureDevice( pguidPlayback, &guidTruePlayback );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error getting true playback device hr=0x%x", hr );
|
|
goto DEVICEINFO_EXIT;
|
|
}
|
|
|
|
hr = DV_MapPlaybackDevice( pguidCapture, &guidTrueCapture );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error getting true capture device hr=0x%x", hr );
|
|
goto DEVICEINFO_EXIT;
|
|
}
|
|
|
|
hr = DirectSoundPrivateCreate( &lpksProperty );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error getting interface to get device name hr=0x%x", hr );
|
|
goto DEVICEINFO_EXIT;
|
|
}
|
|
|
|
hr = PrvGetDeviceDescription( lpksProperty, guidTruePlayback, &pPlaybackDesc );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error getting device description hr=0x%x", hr );
|
|
goto DEVICEINFO_EXIT;
|
|
}
|
|
|
|
Diagnostics_WriteDeviceInfo( DVF_INFOLEVEL, "Playback", pPlaybackDesc );
|
|
|
|
hr = PrvGetDeviceDescription( lpksProperty, guidTrueCapture, &pCaptureDesc );
|
|
|
|
if( FAILED( hr ) )
|
|
{
|
|
DPFX(DPFPREP, 0, "Error getting device description hr=0x%x", hr );
|
|
goto DEVICEINFO_EXIT;
|
|
}
|
|
|
|
Diagnostics_WriteDeviceInfo( DVF_INFOLEVEL, "Capture", pPlaybackDesc );
|
|
|
|
DEVICEINFO_EXIT:
|
|
|
|
if( pPlaybackDesc )
|
|
delete pPlaybackDesc;
|
|
|
|
if( pCaptureDesc )
|
|
delete pCaptureDesc;
|
|
|
|
if( lpksProperty )
|
|
{
|
|
lpksProperty->Release();
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnostics_Begin"
|
|
HRESULT Diagnostics_Begin( BOOL fEnabled, const char *szFileName )
|
|
{
|
|
// Prevent double-open
|
|
if( g_fDiagnosisEnabled )
|
|
return DV_OK;
|
|
|
|
HRESULT hr = DV_OK;
|
|
|
|
g_fDiagnosisEnabled = fEnabled;
|
|
|
|
if( !fEnabled )
|
|
return DV_OK;
|
|
|
|
g_hOutputFile = fopen( szFileName, "w" );
|
|
|
|
if( !g_hOutputFile )
|
|
{
|
|
hr = DVERR_GENERIC;
|
|
DPFX(DPFPREP, 0, "Error opening diagnostics file" );
|
|
goto BEGIN_ERROR;
|
|
}
|
|
|
|
return DV_OK;
|
|
|
|
BEGIN_ERROR:
|
|
|
|
Diagnostics_End();
|
|
|
|
return hr;
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnostics_End"
|
|
void Diagnostics_End()
|
|
{
|
|
if( g_fDiagnosisEnabled )
|
|
{
|
|
if( g_hOutputFile )
|
|
{
|
|
fclose( g_hOutputFile );
|
|
g_hOutputFile = NULL;
|
|
}
|
|
g_fDiagnosisEnabled = FALSE;
|
|
}
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnostics_Write"
|
|
void Diagnostics_Write( DWORD dwLevel, const char *szFormat, ... )
|
|
{
|
|
char szBuffer[DPLOG_MAX_STRING];
|
|
va_list argptr;
|
|
va_start(argptr, szFormat);
|
|
|
|
if( g_fDiagnosisEnabled )
|
|
{
|
|
vfprintf( g_hOutputFile, szFormat, argptr );
|
|
fputs( "\n", g_hOutputFile );
|
|
}
|
|
|
|
_vsnprintf( szBuffer, DPLOG_MAX_STRING, szFormat, argptr );
|
|
|
|
DPFX(DPFPREP, dwLevel, szBuffer );
|
|
|
|
va_end(argptr);
|
|
|
|
fflush( g_hOutputFile );
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnositcs_WriteWAVEFORMATEX"
|
|
void Diagnostics_WriteGUID( DWORD dwLevel, GUID &guid )
|
|
{
|
|
Diagnostics_Write( dwLevel, "{%-08.8X-%-04.4X-%-04.4X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X}", guid.Data1, guid.Data2, guid.Data3,
|
|
guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
|
|
guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7] );
|
|
}
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "Diagnositcs_WriteWAVEFORMATEX"
|
|
void Diagnositcs_WriteWAVEFORMATEX( DWORD dwLevel, PWAVEFORMATEX lpwfxFormat )
|
|
{
|
|
Diagnostics_Write( dwLevel, "wFormatTag = %d", lpwfxFormat->wFormatTag );
|
|
Diagnostics_Write( dwLevel, "nSamplesPerSec = %d", lpwfxFormat->nSamplesPerSec );
|
|
Diagnostics_Write( dwLevel, "nChannels = %d", lpwfxFormat->nChannels );
|
|
Diagnostics_Write( dwLevel, "wBitsPerSample = %d", lpwfxFormat->wBitsPerSample );
|
|
Diagnostics_Write( dwLevel, "nAvgBytesPerSec = %d", lpwfxFormat->nAvgBytesPerSec );
|
|
Diagnostics_Write( dwLevel, "nBlockAlign = %d", lpwfxFormat->nBlockAlign );
|
|
Diagnostics_Write( dwLevel, "cbSize = %d", lpwfxFormat->cbSize );
|
|
}
|