Skip to main content

Getting Started

Language:

QAROS ships a native C API and an idiomatic C#/.NET binding over it. Pick your language above — the selection follows you across the whole Developer Guide. Whichever you choose, the simplest integration is genuinely simple: initialize the library, create a runtime, obtain a session, do work, tear down in reverse.

This guide is self-contained. If you want the mental model first, read Concepts; otherwise start here.

Setting up​

The C SDK consists of:

  • qar_streaming.h — a single amalgamated header containing the complete v0 C API. It is auto-generated from the authoritative API sources on every runtime build, so the header in a given package always matches its binaries exactly. Never edit it.
  • qar-streaming-c.dll / .so — the library your app links against or loads at runtime.
  • Runtime binaries — the services the library spawns/uses, in the binary package's bin/ folder.
  • Examples — small, self-contained C programs in qar-streaming-c/examples/, compiled as part of this repository so they are always valid against the current header. The Tutorials are built from them.

Static linking vs. dynamic loading​

Both modes expose identical function names.

Static / import-library linkingDynamic loading
HowLink qar-streaming-c.lib, call functions directlyDefine QAR_ENABLE_DYNAMIC_LOADING, load the DLL at runtime
Startup dependencyDLL must be present at process startYour app starts without QAROS; loads it on demand
Failure modeLoader error dialogYou handle a bool load failure gracefully
Recommended forTools that always ship with QAROSPlugins and apps where AR/VR is optional

Dynamic loading is recommended for integrating into an existing application: your software keeps working on machines without QAROS installed.

// Dynamic-loading mode: one macro before the include, one macro in ONE .c file.
#define QAR_ENABLE_DYNAMIC_LOADING
#include <qar_streaming.h>

QAR_IMPLEMENT_DYNAMIC_LOADING() // exactly once per application

int main(int argc, char** argv)
{
if (not qar_library_load("path/to/qar-streaming-c.dll"))
{
// QAROS not present — run without AR/VR features
return 1;
}
// ... use the API exactly as in static mode ...
qar_library_unload();
return 0;
}

Functions are loaded from the DLL by symbol name into application-owned function tables — there is no loader struct in the ABI, so newer DLLs keep working with older applications and vice versa. Full walkthrough: Dynamic Loading tutorial.

Building the examples​

# 1. Drop the QAROS binary package into ./package (see the Operator Guide's
# Installation page for the package layout).
# 2. Configure and build
cmake --preset x64-windows
cmake --build --preset x64-windows-debug

# 3. Run an example
./build/x64-windows/Debug/dynamic_loading.exe ./package/bin/qar-streaming-c.dll

The canonical program skeleton​

Every QAROS application has the same shape: library init → runtime → session → work → teardown in reverse.

#include <qar_streaming.h>

int main(void)
{
// 1. Library init (process-wide, once)
QarLibraryInit lib_init = qar_library_init_default();
lib_init.enable_console_logging = true;
qar_result_log_if_error(qar_library_init(&lib_init));

// 2. Runtime create (your process's QAROS context)
QarRuntimeInit rt_init = qar_runtime_init_default();
QarRuntime* runtime = NULL;
qar_result_log_if_error(qar_runtime_create(&rt_init, &runtime));

// 3. Obtain a session: rejoin if we onboarded before, else onboard
// (see Onboarding and Sessions)

// 4. Do work: streams, panels, volumes, peers

// 5. Teardown, in reverse
qar_runtime_destroy(runtime);
qar_result_log_if_error(qar_library_destroy());
return 0;
}

Steps 3 and 4 are what the rest of this guide is about. Read API Conventions once — the API follows a handful of strict patterns in both languages, and knowing them makes every module predictable. Then continue to Onboarding and Sessions.