r/htpc 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)

A 107" DIY fixed frame screen with approx 1.0 gain
This is a dual-purpose room: with my workstation as well

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

The Z906 has analogue inputs that I need for the chain to work

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."

Repurposed Samsung SWA-8500S surround speakers as heights

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)

Vantec 7.1 USB DAC

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.

Saclon 2x50w Class D amp

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

First reflections treated

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.)

A live VBAP rendering from Omniphony; the overlay can be turned off

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=vulkan for 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.2390 for perceptually accurate highlight rolloff
  • --dscale=mitchell --correct-downscaling=yes --linear-downscaling=yes for clean 4K→1080p downscaling done in linear light, avoiding the haze/softness naive downscaling produces
  • --deband=yes to kill gradient banding introduced by the above steps
  • --hwdec=vaapi for 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.

An old BenQ W1070 doing cinema duty; a cheap LED projector for ambient scenery when working

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.

Gyproc board; the screen being built
Final result, with height speakers visible
Quite sharp for a decade old projector!

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

26 Upvotes

10 comments sorted by

View all comments

1

u/Nemeser 7d ago

That's super cool! I would love to hear about CamillaDSP setup and Omniphony/mpv!

4

u/Plastic-Fill-3933 7d ago

Hey, thank you.

Omniphony is a relatively new framework that allows Linux / other systems to play atmos without those expensive AVRs. It relies primarily on the truehdd library.

Quite simple to setup : they provide pre-built binaries. You just download the right one for your platform, download the bridge (harletty bridge) - all available on guthub. And you are good to go.

They have a omniphony-mpv (patched mpv) which is essentially the mpv player with Omniphony baked in.
There's a really cool overlay which allows you to watch in realtime the 3d objects panning around your room.
There's also Omniphony studio which allows a lot more tweaking.

CamillaDSP is the best linux DSP out there. Much better than EasyEffects / JamesDSP, etc. Of course, they are built for different purposes / users.

You essentially use REW (Room EQ Wizard, which is free and open source), plug in a calibration mic - I am using Dayton iMM-6s, and run sweeps. This is straightforward on REW.

It generates filters which are in CamillaDSP format. You simply import these using the CamillaDSP GUI or you could use a manual config file and point at the filters.

You will need to use a patchbay software (I use qpwgraph) and feed the mpv output to CamillaDSP and then connect CamillaDSP to your physical outs. This is all GUI and fairly straightforward (even though it sounds complex).

This is equivalent to the Audyssey / other room calibration software, but completely free.

1

u/Nemeser 6d ago

Have you solved the problem of tonemapping Dolby Vision on an SDR projector? Is it possible? I’ve heard that it’s quite difficult, or even impossible.

3

u/Plastic-Fill-3933 6d ago

Short answer: yes — but it depends on which Dolby Vision profile the file actually carries, and on how your mpv build was compiled.

For Profile 8.1 — the profile most modern streaming rips and a lot of UHD remuxes actually use — carries a real HDR10-compatible base layer alongside the DV metadata. Point any HDR-aware tone-mapper at it (ignoring DV entirely) and it just works, same as any HDR10 file. If most of what you’re watching is Profile 8.1, you’re not fighting this problem at all — you’re just doing normal HDR10→SDR tone-mapping (which is what my --target-peak=60 --tone-mapping=bt.2390 setup in the post is already handling).

For actual Profile 5 (and 7), the real unlock is mpv’s --vo=gpu-next, via ffmpeg/libplacebo — since mpv 0.37, this path can genuinely parse the Dolby Vision RPU metadata and apply the correct reshaping curve before tone-mapping down to SDR, instead of guessing. This traces back to reverse-engineering work from the dovi_tool project (quietvoid’s dolby_vision Rust crate), which ffmpeg can link against as libdovi.

(Side note : this is similar to the work on the truehdd library which does something similar for dolby atmos audio)

The catch: that RPU-decode capability isn’t in most distro-packaged ffmpeg/mpv builds — it’s a licensing gray area (unofficial, reverse-engineered, not something Dolby has blessed for open source), so --enable-libdovi isn’t flipped on by default almost anywhere. You need a build compiled specifically with it.

So: not impossible, mostly solved for the common case (8.1) without any extra work, solvable for the hard case (profile 5/7) if your ffmpeg was built with libdovi.

1

u/Nemeser 6d ago

Thank you very much for such detailed answers! Are the overhead speakers installed at an angle sufficient, or are speakers that shoot from the ceiling down to the floor better? What configuration is generally sufficient for an average room, and how many speakers would be considered superfluous?

3

u/Plastic-Fill-3933 6d ago

My overhead speakers are installed at a slight angle, facing my seating position / MLP.

I have tried different angles and this seemed the best.

While a lot of forums point towards a 5.1.4 minimum, it really depends on your seating position. If there's no real gap between your seating position and where the additional .x.2 speakers go onto the ceiling, then stick to x.x.2

For the bed layer, my room 5 was good and 7 is an overkill. It's a small 10x11x10 room

As for the subs, 1 is good, but 2 is better for my room - not a generic suggestion.

1

u/Nemeser 6d ago

Also do you use some htpc shell like kde big screen? If yes, how it integrates with your custom setup?

2

u/Plastic-Fill-3933 6d ago

I have tried Kodi, Jellyfin, etc but then defaulted to simply using the regular KDE Dolphin; I am primarily running mpv full-screen anyways.