2025-04-27 07:49:33 -04:00

118 lines
3.5 KiB
C++

/*
* This file is loosely copied from the performance DLL sample in MSDN.
*
* To use performance counters with Whisper on NT:
* 1) Build a debug build of ttsperf.dll.
* 2) Run regedit and load ttsperf.reg (Just type "ttsperf.reg" at the command prompt)
* (Adjust dll location in .reg file if necessary; default is c:\nt\enduser\speech\tts\ms_entropic\perf\objd\i386\ttsperf.dll)
* 3) Run "unlodctr ms_entropicengine" if necessary to remove old performance registry values.
* 3) Run "lodctr ttsperf.ini" from this directory.
* 4) Run ttsapp (for example).
* 5) Run Perfmon and add counters under "TTS" object. One instance will appear for each running decoder.
*
* To add new TTS performance counter:
* 1) Add new perfc #define in ttsperf.h.
* 2) Add new name and help in ttsperf.ini.
* 3) Add new details in apc[], below.
* 4) Call m_pco.SetCounter() or m_pco.IncrementCounter() where necessary to implement counter.
* 5) Rebuild and reinstall ttsperf.dll as described above to add new counters to registry.
*
* To add performance counters to a different application:
* 1) RTFC
*/
// ttsperf.cpp : Defines the entry point for the DLL application.
//
#include <windows.h>
#include <winperf.h>
#include <stdlib.h>
#include "..\perfmon.h"
#include "ttsperf.h"
#include <crtdbg.h>
#define DIM(array) (sizeof(array)/sizeof((array)[0]))
PerfObject poTTS =
{
perfcTTS, // Name
PERF_DETAIL_NOVICE, // Will this make it harder to find for us?
0, // Default counter
{0,0}, // Perf time -- what is this, anyway?
{0,0} // Perf freq
};
/*
* The following array must contain all of the perfc #defines from whisperf.h IN ORDER!
* Debug builds should complain if this condition is not met.
*/
// BUGBUG Should provide #defines for the scale factors.
PerfCounter apc[] =
{
{ perfcSpeakCalls, DWORD(0), PERF_DETAIL_EXPERT, PERF_COUNTER_RAWCOUNT },
//
// Example of a rate counter (i.e. #/second):
//
// { perfcFramesPerSec, DWORD(0), PERF_DETAIL_EXPERT, PERF_COUNTER_COUNTER },
};
CPerfCounterManager g_pcm;
// BUGBUG: how to get dllexport to not decorate names?
// __declspec(dllexport)
PM_OPEN_PROC PerformanceOpen;
PM_COLLECT_PROC PerformanceCollect;
PM_CLOSE_PROC PerformanceClose;
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
DWORD APIENTRY PerformanceOpen(LPWSTR lpDeviceNames)
{
_ASSERTE(perfcMax / 2 - 1 == DIM(apc));
DWORD status = g_pcm.Init("TTSPerf", DIM(apc), 100);
if (status != ERROR_SUCCESS)
{
DebugBreak();
return status;
}
status = g_pcm.Open(lpDeviceNames, "ms_entropicengine", &poTTS, apc);
if (status != ERROR_SUCCESS)
{
DebugBreak();
}
return status;
}
DWORD APIENTRY PerformanceCollect(LPWSTR lpwszValue, LPVOID * lppData, LPDWORD lpcbBytes, LPDWORD lpcObjectTypes)
{
return g_pcm.Collect(lpwszValue, lppData, lpcbBytes, lpcObjectTypes);
}
DWORD APIENTRY PerformanceClose()
{
return g_pcm.Close();
}