windows-nt/Source/XPSP1/NT/multimedia/directx/dxdiag/musinfo.cpp
2020-09-26 16:20:57 +08:00

650 lines
23 KiB
C++

/****************************************************************************
*
* File: musinfo.cpp
* Project: DxDiag (DirectX Diagnostic Tool)
* Author: Mike Anderson (manders@microsoft.com)
* Purpose: Gather information about DirectMusic
*
* (C) Copyright 1998 Microsoft Corp. All rights reserved.
*
****************************************************************************/
#include <tchar.h>
#include <Windows.h>
#include <multimon.h>
#include <dmusicc.h>
#include <dmusici.h>
#include <stdio.h> // for sscanf
#include "reginfo.h"
#include "sysinfo.h"
#include "dispinfo.h" // for TestResult
#include "fileinfo.h" // for GetFileVersion
#include "musinfo.h"
#include "resource.h"
static BOOL DoesDMHWAccelExist(IDirectMusic* pdm);
static BOOL IsDMHWAccelEnabled(VOID);
static HRESULT CheckRegistry(RegError** ppRegErrorFirst);
/****************************************************************************
*
* GetBasicMusicInfo - Just create the MusicInfo object and note whether
* a valid installation of DirectMusic is present.
*
****************************************************************************/
HRESULT GetBasicMusicInfo(MusicInfo** ppMusicInfo)
{
HRESULT hr = S_OK;
MusicInfo* pMusicInfoNew;
TCHAR szPath[MAX_PATH];
TCHAR szVersion[100];
DWORD dwMajor;
DWORD dwMinor;
DWORD dwRevision;
DWORD dwBuild;
pMusicInfoNew = new MusicInfo;
if (pMusicInfoNew == NULL)
return E_OUTOFMEMORY;
*ppMusicInfo = pMusicInfoNew;
ZeroMemory(pMusicInfoNew, sizeof(MusicInfo));
GetSystemDirectory(szPath, MAX_PATH);
lstrcat(szPath, TEXT("\\dmusic.dll"));
WIN32_FIND_DATA findFileData;
HANDLE hFind = FindFirstFile(szPath, &findFileData);
if (hFind != INVALID_HANDLE_VALUE)
{
FindClose(hFind);
// Only accept DX 6.1 or higher, since tests fail on 6.0's DirectMusic:
if (SUCCEEDED(hr = GetFileVersion(szPath, szVersion, NULL, NULL, NULL)))
{
_stscanf(szVersion, TEXT("%d.%d.%d.%d"), &dwMajor, &dwMinor, &dwRevision, &dwBuild);
if (dwMajor > 4 ||
dwMajor >= 4 && dwMinor > 6 ||
dwMajor >= 4 && dwMinor >= 6 && dwRevision >= 2)
{
pMusicInfoNew->m_bDMusicInstalled = TRUE;
return S_OK;
}
}
}
return hr;
}
/****************************************************************************
*
* GetExtraMusicInfo - Get details of all ports, default port, and DLS path.
*
****************************************************************************/
HRESULT GetExtraMusicInfo(MusicInfo* pMusicInfo)
{
HRESULT hr = S_OK;
IDirectMusic* pdm = NULL;
LONG iPort;
DMUS_PORTCAPS portCaps;
MusicPort* pMusicPortNew = NULL;
MusicPort* pMusicPort = NULL;
GUID guidDefaultPort;
if (pMusicInfo == NULL)
return E_FAIL;
BOOL bWasDisabled = FALSE;
HKEY hkey = NULL;
DWORD dwSize;
DWORD dwType;
DWORD dwData;
// See if HW is disabled in registry, and if so, re-enable it (briefly)
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\DirectMusic"), 0, KEY_ALL_ACCESS, &hkey))
{
dwSize = sizeof(dwData);
if (ERROR_SUCCESS == RegQueryValueEx(hkey, TEXT("DisableHWAcceleration"), NULL, &dwType, (BYTE *)&dwData, &dwSize))
{
if (dwData != 0)
{
bWasDisabled = TRUE;
dwData = FALSE; // enable (un-disable) HW
RegSetValueEx(hkey, TEXT("DisableHWAcceleration"), NULL,
REG_DWORD, (BYTE *)&dwData, sizeof(dwData));
}
}
// note: don't close hkey until end of function
}
// Initialize COM
if (FAILED(hr = CoInitialize(NULL)))
return hr;
if (FAILED(hr = CoCreateInstance(CLSID_DirectMusic, NULL, CLSCTX_INPROC,
IID_IDirectMusic, (VOID**)&pdm)))
{
goto LEnd;
}
pMusicInfo->m_bAccelerationExists = DoesDMHWAccelExist(pdm);
if (bWasDisabled)
{
// re-disable HW
dwData = TRUE; // disable HW
RegSetValueEx(hkey, TEXT("DisableHWAcceleration"), NULL,
REG_DWORD, (BYTE *)&dwData, sizeof(dwData));
}
if (hkey != NULL)
RegCloseKey(hkey);
pMusicInfo->m_bAccelerationEnabled = IsDMHWAccelEnabled();
// Get default port
if (FAILED(hr = pdm->GetDefaultPort(&guidDefaultPort)))
goto LEnd;
iPort = 0;
portCaps.dwSize = sizeof(portCaps);
while (TRUE)
{
hr = pdm->EnumPort(iPort, &portCaps);
if (hr == S_FALSE)
break;
if (FAILED(hr))
goto LEnd;
pMusicPortNew = new MusicPort;
if (pMusicPortNew == NULL)
{
hr = E_OUTOFMEMORY;
goto LEnd;
}
ZeroMemory(pMusicPortNew, sizeof(MusicPort));
if (guidDefaultPort == portCaps.guidPort)
{
// Special case: always put default device at head of the list.
pMusicPortNew->m_pMusicPortNext = pMusicInfo->m_pMusicPortFirst;
pMusicInfo->m_pMusicPortFirst = pMusicPortNew;
}
else if (pMusicInfo->m_pMusicPortFirst == NULL)
{
pMusicInfo->m_pMusicPortFirst = pMusicPortNew;
}
else
{
for (pMusicPort = pMusicInfo->m_pMusicPortFirst;
pMusicPort->m_pMusicPortNext != NULL;
pMusicPort = pMusicPort->m_pMusicPortNext)
{
}
pMusicPort->m_pMusicPortNext = pMusicPortNew;
}
pMusicPortNew->m_guid = portCaps.guidPort;
pMusicPortNew->m_dwMaxAudioChannels = portCaps.dwMaxAudioChannels;
pMusicPortNew->m_dwMaxChannelGroups = portCaps.dwMaxChannelGroups;
if (guidDefaultPort == portCaps.guidPort)
pMusicPortNew->m_bDefaultPort = TRUE;
pMusicPortNew->m_bSoftware = (portCaps.dwFlags & DMUS_PC_SOFTWARESYNTH ? TRUE : FALSE);
pMusicPortNew->m_bKernelMode = (portCaps.dwType == DMUS_PORT_KERNEL_MODE ? TRUE : FALSE);
pMusicPortNew->m_bUsesDLS = (portCaps.dwFlags & DMUS_PC_DLS ? TRUE : FALSE);
pMusicPortNew->m_bExternal = (portCaps.dwFlags & DMUS_PC_EXTERNAL ? TRUE : FALSE);
pMusicPortNew->m_bOutputPort = (portCaps.dwClass == DMUS_PC_OUTPUTCLASS);
#ifdef UNICODE
lstrcpy(pMusicPortNew->m_szDescription, portCaps.wszDescription);
#else
WideCharToMultiByte(CP_ACP, 0, portCaps.wszDescription, -1, pMusicPortNew->m_szDescription, sizeof pMusicPortNew->m_szDescription, 0, 0);
#endif
iPort++;
}
// Get General Midi DLS File Path and store it in first MusicPort
TCHAR szGMFilePath[MAX_PATH];
DWORD dwBufferLen;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\DirectMusic"), 0, KEY_READ, &hkey))
{
dwBufferLen = MAX_PATH;
if (ERROR_SUCCESS == RegQueryValueEx(hkey, TEXT("GMFilePath"), 0, NULL, (LPBYTE)szGMFilePath, &dwBufferLen))
{
ExpandEnvironmentStrings(szGMFilePath, pMusicInfo->m_szGMFilePath, MAX_PATH);
GetRiffFileVersion(pMusicInfo->m_szGMFilePath, pMusicInfo->m_szGMFileVersion);
}
RegCloseKey(hkey);
}
LEnd:
if (pdm != NULL)
pdm->Release();
// Release COM
CoUninitialize();
if (FAILED(hr = CheckRegistry(&pMusicInfo->m_pRegErrorFirst)))
return hr;
return hr;
}
/****************************************************************************
*
* DoesDMHWAccelExist
*
****************************************************************************/
BOOL DoesDMHWAccelExist(IDirectMusic* pdm)
{
BOOL bHWAccel = FALSE;
// See if default port is hardware
GUID guidDefaultPort;
LONG iPort;
DMUS_PORTCAPS portCaps;
HRESULT hr;
if (SUCCEEDED(pdm->GetDefaultPort(&guidDefaultPort)))
{
iPort = 0;
portCaps.dwSize = sizeof(portCaps);
while (TRUE)
{
hr = pdm->EnumPort(iPort, &portCaps);
if (hr == S_FALSE)
break;
if (FAILED(hr))
break;
if (guidDefaultPort == portCaps.guidPort)
{
if ((portCaps.dwFlags & DMUS_PC_SOFTWARESYNTH) == 0)
bHWAccel = TRUE;
break;
}
iPort++;
}
}
return bHWAccel;
}
/****************************************************************************
*
* IsDMHWAccelEnabled
*
****************************************************************************/
BOOL IsDMHWAccelEnabled(VOID)
{
HKEY hkey;
DWORD dwSize;
DWORD dwType;
DWORD dwData;
BOOL bIsDMHWAccelEnabled = TRUE;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,
TEXT("SOFTWARE\\Microsoft\\DirectMusic"), 0, KEY_ALL_ACCESS, &hkey))
{
dwSize = sizeof(dwData);
if (ERROR_SUCCESS == RegQueryValueEx(hkey, TEXT("DisableHWAcceleration"), NULL, &dwType, (BYTE *)&dwData, &dwSize))
{
if (dwData != 0)
bIsDMHWAccelEnabled = FALSE;
}
RegCloseKey( hkey );
}
return bIsDMHWAccelEnabled;
}
/****************************************************************************
*
* CheckRegistryClass - Helper function for CheckRegistry
*
****************************************************************************/
HRESULT CheckRegistryClass(RegError** ppRegErrorFirst, TCHAR* pszGuid,
TCHAR* pszName, TCHAR* pszLeaf, TCHAR* pszOptLeaf2 = NULL )
{
HRESULT hr;
HKEY HKCR = HKEY_CLASSES_ROOT;
TCHAR szKey[200];
TCHAR szData[200];
wsprintf(szKey, TEXT("CLSID\\%s"), pszGuid);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszName)))
return hr;
wsprintf(szKey, TEXT("CLSID\\%s\\InprocServer32"), pszGuid);
if( pszOptLeaf2 == NULL )
{
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszLeaf, CRF_LEAF)))
return hr;
}
else
{
HRESULT hrReg1, hrReg2;
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszLeaf, CRF_LEAF, &hrReg1 )))
return hr;
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszOptLeaf2, CRF_LEAF, &hrReg2 )))
return hr;
if( hrReg1 == RET_NOERROR || hrReg2 == RET_NOERROR )
{
// If one succeeded, then the other failed, and they both can't succeed.
// So delete the first error, since it isn't needed.
RegError* pRegErrorDelete = *ppRegErrorFirst;
*ppRegErrorFirst = (*ppRegErrorFirst)->m_pRegErrorNext;
delete pRegErrorDelete;
}
}
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT("ThreadingModel"), TEXT("Both"))))
return hr;
wsprintf(szKey, TEXT("CLSID\\%s\\ProgID"), pszGuid);
wsprintf(szData, TEXT("Microsoft.%s.1"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), szData)))
return hr;
wsprintf(szKey, TEXT("CLSID\\%s\\VersionIndependentProgID"), pszGuid);
wsprintf(szData, TEXT("Microsoft.%s"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), szData)))
return hr;
wsprintf(szKey, TEXT("Microsoft.%s"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszName)))
return hr;
wsprintf(szKey, TEXT("Microsoft.%s\\CLSID"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszGuid)))
return hr;
wsprintf(szKey, TEXT("Microsoft.%s\\CurVer"), pszName);
wsprintf(szData, TEXT("Microsoft.%s.1"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), szData)))
return hr;
wsprintf(szKey, TEXT("Microsoft.%s.1"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszName)))
return hr;
wsprintf(szKey, TEXT("Microsoft.%s.1\\CLSID"), pszName);
if (FAILED(hr = CheckRegString(ppRegErrorFirst, HKCR, szKey, TEXT(""), pszGuid)))
return hr;
return S_OK;
}
/****************************************************************************
*
* CheckRegistry
*
****************************************************************************/
HRESULT CheckRegistry(RegError** ppRegErrorFirst)
{
HRESULT hr;
HKEY HKCR = HKEY_CLASSES_ROOT;
TCHAR szVersion[100];
HKEY hkey;
DWORD cbData;
ULONG ulType;
DWORD dwMajor = 0;
DWORD dwMinor = 0;
DWORD dwRevision = 0;
DWORD dwBuild = 0;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\DirectX"),
0, KEY_READ, &hkey))
{
cbData = 100;
RegQueryValueEx(hkey, TEXT("Version"), 0, &ulType, (LPBYTE)szVersion, &cbData);
RegCloseKey(hkey);
if (lstrlen(szVersion) > 6 &&
lstrlen(szVersion) < 20)
{
_stscanf(szVersion, TEXT("%d.%d.%d.%d"), &dwMajor, &dwMinor, &dwRevision, &dwBuild);
}
}
// No registry checking on DX versions before DX7
if (dwMinor < 7)
return S_OK;
// DirectMusicCollection
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{480FF4B0-28B2-11D1-BEF7-00C04FBF8FEF}"), TEXT("DirectMusicCollection"), TEXT("dmusic.dll"), TEXT("dmusicd.dll") )))
return hr;
// DirectMusic
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{636B9F10-0C7D-11D1-95B2-0020AFDC7421}"), TEXT("DirectMusic"), TEXT("dmusic.dll"), TEXT("dmusicd.dll") )))
return hr;
// DirectMusicSection
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{3F037241-414E-11D1-A7CE-00A0C913F73C}"), TEXT("DirectMusicSection"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicSynth
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{58C2B4D0-46E7-11D1-89AC-00A0C9054129}"), TEXT("DirectMusicSynth"), TEXT("dmsynth.dll"), TEXT("dmsynthd.dll") )))
return hr;
// DirectMusicBand
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{79BA9E00-B6EE-11D1-86BE-00C04FBF8FEF}"), TEXT("DirectMusicBand"), TEXT("dmband.dll"), TEXT("dmbandd.dll") )))
return hr;
// DirectMusicSynthSink
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{AEC17CE3-A514-11D1-AFA6-00AA0024D8B6}"), TEXT("DirectMusicSynthSink"), TEXT("dmsynth.dll"), TEXT("dmsynthd.dll") )))
return hr;
// DirectMusicPerformance
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2881-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicPerformance"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicSegment
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2882-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicSegment"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicSegmentState
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2883-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicSegmentState"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicGraph
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2884-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicGraph"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicTempoTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2885-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicTempoTrack"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicSeqTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2886-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicSeqTrack"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicSysExTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2887-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicSysExTrack"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicTimeSigTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2888-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicTimeSigTrack"), TEXT("dmime.dll"), TEXT("dmimed.dll") )))
return hr;
// DirectMusicStyle
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC288a-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicStyle"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicChordTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC288b-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicChordTrack"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicCommandTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC288c-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicCommandTrack"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicStyleTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC288d-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicStyleTrack"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicMotifTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC288e-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicMotifTrack"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicChordMap
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC288f-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicChordMap"), TEXT("dmcompos.dll"), TEXT("dmcompod.dll") )))
return hr;
// DirectMusicComposer
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2890-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicComposer"), TEXT("dmcompos.dll"), TEXT("dmcompod.dll") )))
return hr;
// DirectMusicLoader
// This check fails when upgrading Win98SE (or possibly any system with DX 6.1 or 6.1a) to Win2000 RC2. So skip it
// if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2892-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicLoader"), TEXT("dmloader.dll"))))
// return hr;
// DirectMusicBandTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2894-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicBandTrack"), TEXT("dmband.dll"), TEXT("dmbandd.dll") )))
return hr;
// DirectMusicChordMapTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2896-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicChordMapTrack"), TEXT("dmcompos.dll"), TEXT("dmcompod.dll") )))
return hr;
// DirectMusicAuditionTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2897-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicAuditionTrack"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicMuteTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D2AC2898-B39B-11D1-8704-00600893B1BD}"), TEXT("DirectMusicMuteTrack"), TEXT("dmstyle.dll"), TEXT("dmstyled.dll") )))
return hr;
// DirectMusicTemplate
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{D30BCC65-60E8-11D1-A7CE-00A0C913F73C}"), TEXT("DirectMusicTemplate"), TEXT("dmcompos.dll"), TEXT("dmcompod.dll") )))
return hr;
// DirectMusicSignPostTrack
if (FAILED(hr = CheckRegistryClass(ppRegErrorFirst, TEXT("{F17E8672-C3B4-11D1-870B-00600893B1BD}"), TEXT("DirectMusicSignPostTrack"), TEXT("dmcompos.dll"), TEXT("dmcompod.dll") )))
return hr;
return S_OK;
}
/****************************************************************************
*
* DestroyMusicInfo
*
****************************************************************************/
VOID DestroyMusicInfo(MusicInfo* pMusicInfo)
{
if( pMusicInfo )
{
DestroyReg( &pMusicInfo->m_pRegErrorFirst );
MusicPort* pMusicPort;
MusicPort* pMusicPortNext;
for (pMusicPort = pMusicInfo->m_pMusicPortFirst; pMusicPort != NULL;
pMusicPort = pMusicPortNext)
{
pMusicPortNext = pMusicPort->m_pMusicPortNext;
delete pMusicPort;
}
delete pMusicInfo;
}
}
/****************************************************************************
*
* DiagnoseMusic
*
****************************************************************************/
VOID DiagnoseMusic(SysInfo* pSysInfo, MusicInfo* pMusicInfo)
{
TCHAR szMessage[500];
BOOL bProblem = FALSE;
_tcscpy( pSysInfo->m_szMusicNotes, TEXT("") );
_tcscpy( pSysInfo->m_szMusicNotesEnglish, TEXT("") );
// Report any problems
if (pMusicInfo == NULL || pMusicInfo->m_pMusicPortFirst == NULL)
{
LoadString(NULL, IDS_NOPORTS, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
LoadString(NULL, IDS_NOPORTS_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
bProblem = TRUE;
}
else if (lstrlen(pMusicInfo->m_szGMFilePath) == 0)
{
LoadString(NULL, IDS_NOGMDLS, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
LoadString(NULL, IDS_NOGMDLS_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
bProblem = TRUE;
}
else
{
WIN32_FIND_DATA findFileData;
HANDLE hFind = FindFirstFile(pMusicInfo->m_szGMFilePath, &findFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
LoadString(NULL, IDS_GMDLSFILEMISSING, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
LoadString(NULL, IDS_GMDLSFILEMISSING_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
bProblem = TRUE;
}
else
{
FindClose(hFind);
}
}
if (pMusicInfo && pMusicInfo->m_pRegErrorFirst != NULL)
{
LoadString(NULL, IDS_REGISTRYPROBLEM, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
LoadString(NULL, IDS_REGISTRYPROBLEM_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
bProblem = TRUE;
}
// Show test results or instructions to run test:
if (pMusicInfo && pMusicInfo->m_testResult.m_bStarted)
{
LoadString(NULL, IDS_DMUSICRESULTS, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
_tcscat( pSysInfo->m_szMusicNotes, pMusicInfo->m_testResult.m_szDescription );
_tcscat( pSysInfo->m_szMusicNotes, TEXT("\r\n") );
LoadString(NULL, IDS_DMUSICRESULTS_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
_tcscat( pSysInfo->m_szMusicNotesEnglish, pMusicInfo->m_testResult.m_szDescriptionEnglish );
_tcscat( pSysInfo->m_szMusicNotesEnglish, TEXT("\r\n") );
bProblem = TRUE;
}
else
{
LoadString(NULL, IDS_DMUSICINSTRUCTIONS, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
LoadString(NULL, IDS_DMUSICINSTRUCTIONS_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
}
if (!bProblem)
{
LoadString(NULL, IDS_NOPROBLEM, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotes, szMessage );
LoadString(NULL, IDS_NOPROBLEM_ENGLISH, szMessage, 500);
_tcscat( pSysInfo->m_szMusicNotesEnglish, szMessage );
}
}