QLC+ is built with a modular architecture separating the core engine from the user interface and I/O plugins. This design enables multiple UI implementations and extensive hardware support.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/mcallegari/qlcplus/llms.txt
Use this file to discover all available pages before exploring further.
High-Level Architecture
Core Components
Engine
The engine (engine/src/) is the heart of QLC+, managing all lighting control logic independently of the UI.
Doc (engine/src/doc.h:54)
Doc (engine/src/doc.h:54)
The main document class that owns and manages all project data:Responsibilities:
- Fixture and function lifecycle
- Project loading/saving
- Operating mode management (Design/Operate)
- Engine component coordination
MasterTimer
MasterTimer
The real-time engine that runs all functions and generates DMX output:
- Runs at configurable rate (typically 50Hz)
- Executes running functions
- Manages faders and crossfades
- Generates final DMX values
- Handles Grand Master
InputOutputMap (engine/src/inputoutputmap.h:27)
InputOutputMap (engine/src/inputoutputmap.h:27)
Manages the mapping between universes and I/O plugins:Features:
- Multiple universe support (default: 4)
- Plugin hot-swapping
- Input feedback
- Pass-through mode
Fixtures
Fixtures are instances of fixture definitions, representing physical lighting devices.
- Loads
.qxffiles fromresources/fixtures/ - Shared across multiple fixture instances
- Contains channel definitions, capabilities, and modes
Functions
Functions are reusable lighting programs. All inherit from the baseFunction class (engine/src/function.h:93).
- Scene
- Chaser
- EFX
- RGBMatrix
- Collection
Sets specific DMX values for fixtures:
User Interfaces
QLC+ supports two UI implementations:QtWidgets UI (QLC+ 4)
Traditional desktop interface inui/src/:
- Virtual Console - Live control interface
- Simple Desk - Direct channel control
- Show Manager - Timeline editor
- Fixture Manager - Fixture patching
- Function Manager - Function creation/editing
- Input/Output - Plugin configuration
QML UI (QLC+ 5)
Touch-optimized interface inqmlui/:
- Modern, responsive design
- Better touch support
- 3D visualization
- Same engine underneath
Web Interface
Thewebaccess/ module provides browser-based control:
- Remote control via HTTP
- Virtual console access
- Simple desk
- Function triggering
- No installation required on client
Plugin System
Plugins provide hardware I/O and protocol support through a common interface.
Plugin Interface
All plugins implementQLCIOPlugin (plugins/interfaces/qlcioplugin.h:90):
Available Plugins
Plugins inplugins/:
DMX USB
- ENTTEC DMX USB Pro
- DMXKing
- Eurolite
- Many USB-DMX adapters
Art-Net
- Art-Net III protocol
- Multiple universes
- Broadcast and unicast
E1.31 (sACN)
- ANSI E1.31 protocol
- Streaming ACN
- Multicast support
MIDI
- MIDI input/output
- Show control
- External controller support
OSC
- Open Sound Control
- Network-based control
- TouchOSC compatible
HID
- Generic HID devices
- Keyboards
- Game controllers
OLA
- Open Lighting Architecture
- Many protocols via OLA
Loopback
- Internal universe routing
- Testing
Plugin Architecture
Data Flow
DMX Output Pipeline
Input Processing
Resource Management
Fixture Definitions
- Location:
resources/fixtures/ - Format: XML (
.qxffiles) - Cache:
QLCFixtureDefCache - Validation: XML schema in
resources/schemas/
RGB Scripts
- Location:
resources/rgbscripts/ - Format: JavaScript
- API Version: 2
- Cache:
RGBScriptsCache
Input Profiles
- Location:
resources/inputprofiles/ - Format: XML
- Purpose: Map input devices to QLC+ controls
Threading Model
Thread Organization
- Main Thread: UI and user interaction
- MasterTimer Thread: Function execution and DMX generation
- Plugin Threads: Some plugins use separate threads for I/O
Thread Safety
- Use
QMutexfor shared data structures - Emit signals across thread boundaries
- Be careful with
Docaccess from MasterTimer
Build System Integration
The architecture is reflected in the CMake structure (CMakeLists.txt:73-89):Next Steps
- Build QLC+ to explore the code
- Create plugins to add hardware support
- Write functions to understand the function API
- Study the engine for core class details
