Docs

Playback via mpv-omniphony

Point a real film at your speaker rig — mpv hands the audio to Omniphony instead of letting FFmpeg flatten it.

Want your films to actually use that speaker rig? mpv-omniphony is plain mpv with one extra trick: ad_orender, an opt-in decoder that hands raw access units to liborender — the shared-library form of the renderer — for real VBAP object rendering, instead of letting FFmpeg downmix them into mush.

Opting in

Spatial rendering is opt-in per playback:

mpv --ad=orender your-film.mkv

Plain streams keep playing through mpv’s standard decoders; only when you pass --ad=orender does the spatial path engage. mpv-omniphony reads the same shared config as the standalone orender CLI and Studio (~/.config/omniphony/config.yaml, or %ProgramData%\omniphony\config.yaml on Windows), so a single setup serves all three.

Output routing

  • Linux — output goes through PipeWire.
  • Windows — builds ship the Steinberg ASIO output driver (--ao=asio) alongside the usual WASAPI / DirectSound paths.

The decoder bridge (omniphony-bridge) is packaged separately and loaded at runtime via dlopen.

Channel-render modes (non-object content)

Some streams carry spatial objects (object-based immersive audio), which always render through VBAP. Others are plain channel beds — a 5.1 or 7.1 mix with no objects. How that non-object content is rendered is controlled by one of three modes, applied identically by the CLI and the embedded mpv decoder:

Mode What happens
virtual (default) Each input channel becomes a virtual object at its theoretical speaker angle and is rendered through VBAP across your whole layout. The flagship behaviour.
direct Each bed channel is routed straight to the matching speaker of your layout; channels with no matching speaker are dropped.
host No spatialization. In mpv the decoder declines and mpv falls back to its own native decoder / downmix.

Object-based content is never affected by this setting.

Setting the mode

Where How
Studio Renderer panel → Channel content selector. Live, and saved to config.
Config render.channel_render_mode: virtual | direct | host
mpv (one invocation) mpv --ad=orender --ad-orender-channel-mode=host|direct|virtual …
OSC (live) /omniphony/control/channel_render_mode with a string argument

Output speaker layout

The output layout — how many speakers you have and where they sit — is a separate setting from the modes above. Configure it in Studio (stored as render.current_layout) or point render.speaker_layout at a layout YAML; bundled layouts (5.1.4, 7.1.4, 9.1.6, …) live in the layouts/ folder. In virtual mode every input channel is spread across whatever output layout you configure — e.g. a 5.1 bed virtualized over a 7.1.4 rig.

Troubleshooting

  • A non-Atmos bed plays, but you want mpv’s normal downmix → set the mode to host.
  • A non-object track won’t start → make sure a speaker layout is configured; without a resolvable output layout the renderer hands the track back to the native decoder rather than stalling.