Files
video-shader-toys/src/main.cpp
2026-05-02 14:20:38 +10:00

85 lines
1.8 KiB
C++

#include "AppState.h"
#include "AppConfig.h"
#include "D3DProcessor.h"
#include "DeckLinkPipeline.h"
#include "ShaderLibrary.h"
#include "WebServer.h"
#include <combaseapi.h>
#include <atomic>
#include <chrono>
#include <csignal>
#include <iostream>
#include <thread>
namespace
{
std::atomic<bool> g_running = true;
void signalHandler(int)
{
g_running = false;
}
}
int main()
{
std::signal(SIGINT, signalHandler);
std::signal(SIGTERM, signalHandler);
HRESULT hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
if (FAILED(hr))
{
std::cerr << "CoInitializeEx failed: 0x" << std::hex << static_cast<unsigned long>(hr) << "\n";
return 1;
}
AppState appState;
D3DProcessor processor;
try
{
auto shaders = loadShaders(APP_SHADER_DIR);
appState.setShaders(shaders);
std::string error;
if (!processor.initialize(shaders.front(), error))
{
std::cerr << "Shader/D3D initialization failed:\n" << error << "\n";
CoUninitialize();
return 1;
}
}
catch (const std::exception& ex)
{
std::cerr << ex.what() << "\n";
CoUninitialize();
return 1;
}
DeckLinkPipeline pipeline(appState, processor);
std::string error;
if (!pipeline.initialize(error))
{
appState.setError(error);
std::cerr << error << "\n";
}
WebServer webServer(appState, pipeline, APP_CONTENT_DIR);
if (!webServer.start(8080, error))
{
std::cerr << error << "\n";
CoUninitialize();
return 1;
}
std::cout << "video-shader is running at http://127.0.0.1:8080\n";
while (g_running)
std::this_thread::sleep_for(std::chrono::milliseconds(200));
webServer.stop();
pipeline.stop();
CoUninitialize();
return 0;
}