53 lines
1.7 KiB
C++
53 lines
1.7 KiB
C++
// native_bridge/juce_fx/main_juce_fx.cpp
|
|
// Entry point của juce_fx_bridge.exe — G1 POC: JUCE AudioProcessorGraph
|
|
// thay RealtimeFxChain trong SHM realtime loop. Windows only.
|
|
// --juce-fx <job.json> --shm <name> [--parent <pid>]
|
|
#include "JuceFxLoop.h"
|
|
|
|
#ifdef _WIN32
|
|
#include <windows.h>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#endif
|
|
|
|
#include <cstring>
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
#ifdef _WIN32
|
|
static LONG WINAPI JuceCrashDumpHandler(EXCEPTION_POINTERS* ep) {
|
|
static LONG once = 0;
|
|
if (InterlockedCompareExchange(&once, 1, 0)) return EXCEPTION_CONTINUE_SEARCH;
|
|
PEXCEPTION_RECORD er = ep ? ep->ExceptionRecord : nullptr;
|
|
std::cerr << "[CRASH] juce_fx_bridge exception code=0x" << std::hex
|
|
<< (er ? er->ExceptionCode : 0) << " addr=0x"
|
|
<< (er ? (void*)er->ExceptionAddress : nullptr) << std::dec << std::endl;
|
|
return EXCEPTION_CONTINUE_SEARCH;
|
|
}
|
|
#endif
|
|
|
|
int main(int argc, char** argv) {
|
|
#ifdef _WIN32
|
|
SetUnhandledExceptionFilter(JuceCrashDumpHandler);
|
|
#endif
|
|
std::string mode, jobPath, shmName;
|
|
uint32_t parentPid = 0;
|
|
for (int i = 1; i < argc; ++i) {
|
|
const std::string a = argv[i];
|
|
if (a == "--juce-fx" && i + 1 < argc) {
|
|
mode = a;
|
|
jobPath = argv[++i];
|
|
} else if (a == "--shm" && i + 1 < argc) {
|
|
shmName = argv[++i];
|
|
} else if (a == "--parent" && i + 1 < argc) {
|
|
parentPid = (uint32_t)std::strtoul(argv[++i], nullptr, 10);
|
|
}
|
|
}
|
|
if (mode != "--juce-fx" || jobPath.empty() || shmName.empty()) {
|
|
std::cerr << "usage: juce_fx_bridge --juce-fx <job.json> --shm <name> "
|
|
"[--parent <pid>]" << std::endl;
|
|
return 1;
|
|
}
|
|
return run_juce_fx_loop(jobPath, shmName, parentPid);
|
|
}
|