static inline DWORD WaitIfOBS(DWORD id, const wchar_t *expected) { wchar_t path[MAX_PATH]; wchar_t *name; *path = 0; WinHandle proc = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | SYNCHRONIZE, false, id); if (!proc.Valid()) return WAITIFOBS_WRONG_PROCESS; if (!GetProcessImageFileName(proc, path, _countof(path))) return WAITIFOBS_WRONG_PROCESS; name = wcsrchr(path, L'\\'); if (name) name += 1; else name = path; if (_wcsnicmp(name, expected, 5) == 0) { HANDLE hWait[2]; hWait[0] = proc; hWait[1] = cancelRequested; int i = WaitForMultipleObjects(2, hWait, false, INFINITE); if (i == WAIT_OBJECT_0 + 1) return WAITIFOBS_CANCELLED; return WAITIFOBS_SUCCESS; } return WAITIFOBS_WRONG_PROCESS; }
void WASAPISource::InitCapture() { HRESULT res = client->GetService(__uuidof(IAudioCaptureClient), (void**)capture.Assign()); if (FAILED(res)) throw HRError("Failed to create capture context", res); res = client->SetEventHandle(receiveSignal); if (FAILED(res)) throw HRError("Failed to set event handle", res); captureThread = CreateThread(nullptr, 0, WASAPISource::CaptureThread, this, 0, nullptr); if (!captureThread.Valid()) throw "Failed to create capture thread"; client->Start(); active = true; blog(LOG_INFO, "WASAPI: Device '%s' initialized", device_name.c_str()); }