Apply clang-format across the whole tree
Run clang-format (the repo's .clang-format: LLVM base, 120 cols, tabs, Allman functions) over every source file so the tree is formatter-clean. Whitespace only -- no behavior change; full x64 + x86 suites pass. Also set SortIncludes: false in .clang-format. Windows include order is load-bearing (windows.h must precede tlhelp32.h / mmreg.h / xinput.h / dinput.h; winsock2.h must precede windows.h), and the default alphabetical sort reorders tlhelp32.h ahead of windows.h -- a build break. Leaving order alone keeps the manual, correct grouping.
This commit is contained in:
@@ -27,14 +27,12 @@
|
||||
|
||||
using namespace coop;
|
||||
|
||||
namespace
|
||||
{
|
||||
namespace {
|
||||
int g_failures = 0;
|
||||
void check(bool ok, const char* what)
|
||||
{
|
||||
std::printf("%s %s\n", ok ? " ok:" : "FAIL:", what);
|
||||
if (!ok)
|
||||
{
|
||||
if (!ok) {
|
||||
++g_failures;
|
||||
}
|
||||
}
|
||||
@@ -42,18 +40,14 @@ void check(bool ok, const char* what)
|
||||
void kill_stray_mock_games()
|
||||
{
|
||||
HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
||||
if (snap == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
if (snap == INVALID_HANDLE_VALUE) {
|
||||
return;
|
||||
}
|
||||
PROCESSENTRY32W pe{};
|
||||
pe.dwSize = sizeof(pe);
|
||||
for (BOOL ok = Process32FirstW(snap, &pe); ok; ok = Process32NextW(snap, &pe))
|
||||
{
|
||||
if (_wcsicmp(pe.szExeFile, L"coop_mock_game.exe") == 0)
|
||||
{
|
||||
if (HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID))
|
||||
{
|
||||
for (BOOL ok = Process32FirstW(snap, &pe); ok; ok = Process32NextW(snap, &pe)) {
|
||||
if (_wcsicmp(pe.szExeFile, L"coop_mock_game.exe") == 0) {
|
||||
if (HANDLE h = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID)) {
|
||||
TerminateProcess(h, 0);
|
||||
CloseHandle(h);
|
||||
}
|
||||
@@ -65,26 +59,22 @@ void kill_stray_mock_games()
|
||||
bool inject(unsigned long pid)
|
||||
{
|
||||
const std::wstring dll = deployed_artifact_path(L"coop_hook.dll");
|
||||
if (GetFileAttributesW(dll.c_str()) == INVALID_FILE_ATTRIBUTES)
|
||||
{
|
||||
if (GetFileAttributesW(dll.c_str()) == INVALID_FILE_ATTRIBUTES) {
|
||||
return false;
|
||||
}
|
||||
const DWORD access = PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION |
|
||||
PROCESS_VM_WRITE | PROCESS_VM_READ;
|
||||
const DWORD access =
|
||||
PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ;
|
||||
HANDLE process = OpenProcess(access, FALSE, pid);
|
||||
if (process == nullptr)
|
||||
{
|
||||
if (process == nullptr) {
|
||||
return false;
|
||||
}
|
||||
const SIZE_T bytes = (dll.size() + 1) * sizeof(wchar_t);
|
||||
void* remote = VirtualAllocEx(process, nullptr, bytes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
|
||||
bool ok = false;
|
||||
if (remote != nullptr && WriteProcessMemory(process, remote, dll.c_str(), bytes, nullptr))
|
||||
{
|
||||
auto load = reinterpret_cast<LPTHREAD_START_ROUTINE>(
|
||||
GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"));
|
||||
if (HANDLE th = CreateRemoteThread(process, nullptr, 0, load, remote, 0, nullptr))
|
||||
{
|
||||
if (remote != nullptr && WriteProcessMemory(process, remote, dll.c_str(), bytes, nullptr)) {
|
||||
auto load =
|
||||
reinterpret_cast<LPTHREAD_START_ROUTINE>(GetProcAddress(GetModuleHandleW(L"kernel32.dll"), "LoadLibraryW"));
|
||||
if (HANDLE th = CreateRemoteThread(process, nullptr, 0, load, remote, 0, nullptr)) {
|
||||
WaitForSingleObject(th, INFINITE);
|
||||
DWORD code = 0;
|
||||
GetExitCodeThread(th, &code);
|
||||
@@ -92,8 +82,7 @@ bool inject(unsigned long pid)
|
||||
ok = code != 0;
|
||||
}
|
||||
}
|
||||
if (remote != nullptr)
|
||||
{
|
||||
if (remote != nullptr) {
|
||||
VirtualFreeEx(process, remote, 0, MEM_RELEASE);
|
||||
}
|
||||
CloseHandle(process);
|
||||
@@ -102,10 +91,8 @@ bool inject(unsigned long pid)
|
||||
|
||||
bool inject_retry(unsigned long pid)
|
||||
{
|
||||
for (int i = 0; i < 4; ++i)
|
||||
{
|
||||
if (inject(pid))
|
||||
{
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (inject(pid)) {
|
||||
return true;
|
||||
}
|
||||
Sleep(300);
|
||||
@@ -113,8 +100,7 @@ bool inject_retry(unsigned long pid)
|
||||
return false;
|
||||
}
|
||||
|
||||
struct Scenario
|
||||
{
|
||||
struct Scenario {
|
||||
unsigned rate, channels, bits;
|
||||
bool distinct; // distinct per-channel content (so the channel count is recoverable)
|
||||
bool recover_layout; // false = rate only (step a); true = full layout (step b)
|
||||
@@ -128,25 +114,21 @@ FormatVerification run(const Scenario& sc, bool& ran)
|
||||
FormatVerification fv;
|
||||
kill_stray_mock_games();
|
||||
|
||||
if (sc.distinct)
|
||||
{
|
||||
if (sc.distinct) {
|
||||
SetEnvironmentVariableW(L"COOP_TONE_DISTINCT_CH", L"1");
|
||||
}
|
||||
const std::wstring exe = exe_directory() + L"coop_mock_game.exe";
|
||||
std::wstring cmd = L"\"" + exe + L"\" dx11 30 " + std::to_wstring(sc.rate) + L" " +
|
||||
std::to_wstring(sc.channels) + L" " + std::to_wstring(sc.bits) + L" " +
|
||||
(sc.bits == 16 ? L"pcm" : L"float");
|
||||
std::wstring cmd = L"\"" + exe + L"\" dx11 30 " + std::to_wstring(sc.rate) + L" " + std::to_wstring(sc.channels)
|
||||
+ L" " + std::to_wstring(sc.bits) + L" " + (sc.bits == 16 ? L"pcm" : L"float");
|
||||
STARTUPINFOW si{};
|
||||
si.cb = sizeof(si);
|
||||
PROCESS_INFORMATION pi{};
|
||||
const BOOL launched = CreateProcessW(exe.c_str(), cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr,
|
||||
&si, &pi);
|
||||
if (sc.distinct)
|
||||
{
|
||||
const BOOL launched =
|
||||
CreateProcessW(exe.c_str(), cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
|
||||
if (sc.distinct) {
|
||||
SetEnvironmentVariableW(L"COOP_TONE_DISTINCT_CH", nullptr);
|
||||
}
|
||||
if (!launched)
|
||||
{
|
||||
if (!launched) {
|
||||
return fv;
|
||||
}
|
||||
auto cleanup = [&] {
|
||||
@@ -160,9 +142,8 @@ FormatVerification run(const Scenario& sc, bool& ran)
|
||||
|
||||
SharedMemory shm;
|
||||
SharedMemory ring_shm;
|
||||
if (!shm.create(shared_memory_name(pi.dwProcessId), sizeof(SharedBlock)) ||
|
||||
!ring_shm.create(audio_ring_name(pi.dwProcessId), audio_ring_total_size(kAudioRingCapacity)))
|
||||
{
|
||||
if (!shm.create(shared_memory_name(pi.dwProcessId), sizeof(SharedBlock))
|
||||
|| !ring_shm.create(audio_ring_name(pi.dwProcessId), audio_ring_total_size(kAudioRingCapacity))) {
|
||||
cleanup();
|
||||
return fv;
|
||||
}
|
||||
@@ -178,8 +159,7 @@ FormatVerification run(const Scenario& sc, bool& ran)
|
||||
auto* ring = ring_shm.as<AudioRingHeader>();
|
||||
audio_ring_init(*ring, kAudioRingCapacity); // capture_enabled stays 0: audible + still measuring
|
||||
|
||||
if (!inject_retry(pi.dwProcessId))
|
||||
{
|
||||
if (!inject_retry(pi.dwProcessId)) {
|
||||
cleanup();
|
||||
return fv;
|
||||
}
|
||||
@@ -197,8 +177,7 @@ int main()
|
||||
const bool com = SUCCEEDED(CoInitializeEx(nullptr, COINIT_MULTITHREADED));
|
||||
|
||||
unsigned dev_rate = 48000, dev_channels = 2;
|
||||
if (WAVEFORMATEX* dev = default_render_format())
|
||||
{
|
||||
if (WAVEFORMATEX* dev = default_render_format()) {
|
||||
dev_rate = dev->nSamplesPerSec;
|
||||
dev_channels = dev->nChannels;
|
||||
CoTaskMemFree(dev);
|
||||
@@ -210,21 +189,17 @@ int main()
|
||||
std::printf("== (a) rate recovery: %u Hz / %u ch ==\n", mismatched, dev_channels);
|
||||
bool ran = false;
|
||||
FormatVerification a = run({mismatched, dev_channels, 32, /*distinct=*/false, /*recover_layout=*/false}, ran);
|
||||
if (!ran)
|
||||
{
|
||||
if (!ran) {
|
||||
std::printf(" environment can't run the mock+inject -- skipping audio_verify_test.\n");
|
||||
if (com)
|
||||
{
|
||||
if (com) {
|
||||
CoUninitialize();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
std::printf(" ok=%d rate=%u score=%.3f\n", a.ok ? 1 : 0, a.rate, a.score);
|
||||
if (!a.ok && a.rate == 0 && a.score == 0.0)
|
||||
{
|
||||
if (!a.ok && a.rate == 0 && a.score == 0.0) {
|
||||
std::printf(" no usable co-capture (no endpoint / silent) -- skipping.\n");
|
||||
if (com)
|
||||
{
|
||||
if (com) {
|
||||
CoUninitialize();
|
||||
}
|
||||
return 0;
|
||||
@@ -238,25 +213,20 @@ int main()
|
||||
FormatVerification b = run({44100, 2, 32, /*distinct=*/true, /*recover_layout=*/true}, ran);
|
||||
std::printf(" ok=%d rate=%u ch=%u bits=%u tag=%u score=%.3f\n", b.ok ? 1 : 0, b.rate, b.channels, b.bits,
|
||||
b.format_tag, b.score);
|
||||
if (b.ok || b.score > 0.0)
|
||||
{
|
||||
if (b.ok || b.score > 0.0) {
|
||||
check(b.layout_ok, "(b) verifier confidently recovered the layout");
|
||||
check(b.rate == 44100, "(b) recovered the true rate");
|
||||
check(b.channels == 2, "(b) recovered the true channel count (2, not the device's)");
|
||||
check(b.bits == 32 && b.format_tag == 3, "(b) recovered 32-bit float");
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
std::printf(" no usable co-capture for (b) -- skipping that scenario.\n");
|
||||
}
|
||||
|
||||
if (com)
|
||||
{
|
||||
if (com) {
|
||||
CoUninitialize();
|
||||
}
|
||||
|
||||
if (g_failures == 0)
|
||||
{
|
||||
if (g_failures == 0) {
|
||||
std::printf("PASS audio_verify_test\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user