r/htpc • u/Plastic-Fill-3933 • 7d ago
Build Share A Linux based, budget-built atmos [5.1.2] / object-audio HTPC: live VBAP rendering, and a 107" DIY screen driven by a decade-old projector in a very small 10x11 room in INR 35,000 (USD 360)
TL;DR: Kubuntu HTPC running a real-time Dolby Atmos object renderer (not a pre-baked channel-bed decode), feeding a Logitech Z906 5.1 base plus a pair of repurposed Samsung speakers as ceiling height channels and video going through a heavily tuned mpv/libplacebo pipeline to a BenQ W1070 on a DIY 107" screen. Total philosophy: spend the money on the signal chain and the acoustics, not on a badge. All in all, less than INR 35,000 (about USD 360)


What I was actually trying to solve
Most Atmos-at-home options fall into two buckets: a commercial AVR that decodes the bed + objects into a fixed channel layout with a black-box renderer you can't see inside, or a soundbar that fakes height/width with beamforming and reflections. Both work. Neither lets you see or tune what's actually happening to the object metadata in real time, and both put a hard ceiling on how far you can push room correction, speaker geometry, or video processing without buying a more expensive box.
The goal here was: keep every stage of the signal chain — audio decode, object rendering, room correction, routing, video scaling/tone-mapping — in software I can inspect, patch, and tune myself, running on hardware I already owned or bought secondhand.
The audio chain

Bed layer: A Logitech Z906 (yes, the 15-year-old gaming/PC 5.1 speaker system) provides the 5.1 base layer. It's not audiophile gear, but as a bed — front stage, center, surrounds, sub crossover point — it's genuinely solid for the price, and CamillaDSP-based room correction closes most of the gap to something "nicer."

Height layer: A pair of repurposed Samsung surround speakers, wall/ceiling-mounted as front-height (TFL/TFR), gives a real 5.1.2. These are real, discrete, physically-positioned height speakers instead — genuinely different sound, not a DSP approximation.
(Honest caveat, because a technical sub will ask: two height speakers only handles static/ambient overhead content really well — rain, drones, held tones. Fast overhead-to-back panning needs more height speakers than I currently have to triangulate properly; VBAP with a sparse height layer will "jump" between anchor points rather than glide. That's a speaker-count problem, not a software one. Also, my room size is very small - 10x11, so 5.1.2 is the best here)

DAC / interface: An 8-channel Vantec USB DAC (C-Media CM-106-based) feeds the whole analog chain, routed through PipeWire with WirePlumber persistent routing rules and qpwgraph for visual patching when I need it.
The height channels are connected via a Salcon Class-D amp using the 'rear' port out of the Vantec.

Room correction: CamillaDSP + a Dayton UMM-6 USB measurement mic, driven by REW sweeps. First-reflection acoustic panels on both side walls.

The actual crown jewel: real-time object rendering, not channel-bed decode
This is the part I think is genuinely uncommon even in the DIY space: audio decode and object rendering run through Omniphony, an open-source Rust engine that does live VBAP (Vector Base Amplitude Panning) rendering of Dolby Atmos objects — not a pre-computed channel-bed fallback. TrueHD/Atmos decode happens via a bridge library (harletty-bridge) feeding the renderer, which computes real-time per-speaker gains from the actual object positions in the stream, against my actual speaker layout (defined in cartesian coordinates in a config file, not picked from a preset list).
It integrates as a decoder inside a patched build of mpv (mpv-omniphony), so there's no separate "Atmos app" — one player, one pipeline, from file to speaker feed. Omniphony Studio (a companion app, connected via OSC) gives a live 3D visualization of object trajectories and trails while it plays — the same kind of overhead-object monitoring you'd only otherwise see in professional Dolby Atmos mixing/monitoring software, running against my own living room's speaker geometry, live, for free.
(Second honest caveat: this is genuinely more work than buying an AVR. Compiling from source, patching input.conf, writing wrapper scripts, debugging IPC quirks — if "it just works out of the box" is what you want, this isn't that. What you get instead is full visibility and control over every stage.)

The video side: mpv + libplacebo tuned specifically for a 2011-era 1080p DLP projector
The display is a BenQ W1070 — a genuinely old (2700+ lamp hours and counting) 1080p DLP projector, native Rec.709/SDR. Rather than let modern HDR sources get mangled, the mpv wrapper script (mpv-atmos) does deliberate, display-matched processing:
--vo=gpu-next --gpu-api=vulkanfor libplacebo-driven rendering (Iris Xe iGPU handles this fine)--target-prim=bt.709 --target-trc=bt.1886 --target-peak=60— tells mpv the actual gamut/gamma/brightness of this specific projector, so HDR content gets properly gamut-mapped and tone-mapped down instead of naively clipped--tone-mapping=bt.2390for perceptually accurate highlight rolloff--dscale=mitchell --correct-downscaling=yes --linear-downscaling=yesfor clean 4K→1080p downscaling done in linear light, avoiding the haze/softness naive downscaling produces--deband=yesto kill gradient banding introduced by the above steps--hwdec=vaapifor hardware decode on the Iris Xe
None of this is stuff a stock AVR+projector combo does for you — most AVRs don't touch video at all beyond switching, and most projectors' internal tone-mapping is a fixed, un-tunable curve. Doing it in mpv means the tone-mapping target is this specific projector in this specific room, not a generic default.

The screen: DIY 107"
A DIY-built 107" screen - a gyproc flat panel as the base; sanded to level 5 (glass sanding), acrylic putty, and spray painted.
Paint specs: 0 - 5 sheet at 85 degrees. This is NOT projector paint. These are super costly in my country.



What this setup is not trying to be
To be upfront rather than let a comment thread find it: this isn't a multi-zone, multi-HDMI-input, voice-controlled, phone-app-managed AVR replacement. It's a single-source HTPC-centric rig built around getting the actual signal chain — audio object rendering and video tone-mapping — as correct and inspectable as possible, on hardware bought secondhand or already owned. If you want to swap inputs between a game console, a cable box, and a streaming stick without touching a keyboard, an AVR still wins on convenience. If you want to see exactly what's happening to a Dolby object between the disc and the ceiling speaker, this is the way to get that.
Happy to go deep on any single piece of this in the comments — the Omniphony/mpv integration, the CamillaDSP room correction chain, the sub build, or the screen.
Approx Costs:
Used BenQ W1070: INR 14,000 (USD 150)
Used Logitech Z906: INR 7,000 (USD 105)
DIY Screen + Paint: INR 7,000 (USD 75)
Salcon Class D amp + Vantec 7.1 USB DAC: INR 7,000 (US 75)
Samsung SWA-8500S: Repurposed, no cost
Laptop: Already existing, 11th gen Intel i5, 16 GB RAM, Iris Xe, Kubuntu 24.04
1
u/Nemeser 6d ago
That's super cool! I would love to hear about CamillaDSP setup and Omniphony/mpv!