Repository navigation
New here? Step-by-step install, from nothing to a film playing:
Linux ·
Windows ·
macOS
Highlights
Omniphony 0.7.0 has one Studio and installs it, loads one decoder bridge per codec family, holds its latency with a single number, and renders measured rooms on headphones.
- One Studio, with installers. The native Studio (egui/wgpu) is the only Studio from this release; the web-based one and its bundles are gone. It ships as
.deb, AppImage, Windows setup and MSI, and a macOS.dmg, each carryingorenderand the engine library, and it copies that library where the player looks for it on every start, so updating Studio updates the engine mpv uses. It opens on an Essentials view, with the full panels one switch away, and a first-run banner that says what is missing instead of an empty scene. The whole view is kept across launches. Settings that change the sound reachconfig.yamlthrough Save only, and Studio asks before unsaved edits are lost on quit, reload or profile switch. - One installer for player, engine and Studio.
omniphony-v0.7.0-linux-x86_64.tar.gz(aninstall.shwith an uninstaller and an optional user service) andomniphony-v0.7.0-windows-x86_64-setup.exe(per user, no administrator rights) lay down the player, the engine and Studio from releases that pair, in the places each one searches. They are attached to this release once thempv-v0.7.0player is published. The decoder bridge is installed apart;orender check-bridgessays which bridges the engine finds and loads. - Several decoder bridges, one per codec family. The engine loads every bridge it is given (
render.bridge_paths, or every bridge found in the engine's folders) and routes each stream to the one that recognises it, by the bridge's own probe. Studio edits the list and highlights the bridge decoding the current stream. The evaluation grid follows the active bridge, or is forced (render.evaluation_grid). This is what harletty-bridge 0.9.0 ships: three plugins (Dolby, DTS and Auro-3D, IAMF) instead of one library. - Latency held by one number. The adaptive resampler, its controller and the auto-tune wizard are replaced by a sync engine with one setting,
latency_target: the time between audio reaching the renderer and leaving the output device. One loop holds it, on Linux, Windows and macOS; there are no gains, bands or recovery margins to tune. Pauses, seeks and track changes on a pipe are followed instead of drifting or deadlocking. - Measured rooms on headphones. A binaural room impulse response set (SOFA) is loaded as emitters and orientations and rendered on the set's own loudspeakers, in the room the file describes. Studio's 3D view follows the headphone path that actually renders: it draws the listening room the early reflections mirror sources in, or the measured room in metres, and a badge names the path and the set. Fixed channels are placed by their angle on headphones by default, and
render.binaural.sphere_coordinatesreads object coordinates on the listener's sphere, so a place a speaker takes in the room is heard at that speaker's nominal angle. A SOFA set is triangulated in milliseconds where it took minutes. - A backend with depth, and no speaker limit. The new
volumetricbackend keeps VBAP's gains for the direction and adds the object's depth inside the room. The 24-speaker limit is gone: gain buffers are sized for the layout, and layouts are tested up to 128 speakers. VBAP closes every coplanar face of the hull around a virtual loudspeaker at its centre, which removes the left/right asymmetry a four-speaker ceiling or rear wall could show. - A render path that does not wait. No heap allocation and no lock on the mix, metered or not; live parameters are read without a lock; a wait-free ring feeds the device callbacks; stream telemetry leaves from its own thread. Convolution runs with AVX2 or AVX-512 where the CPU has them, the crossover filters eight objects per instruction, and the BRIR convolution uses non-uniform partitions. On small boxes the engine can decode on a thread of its own (off by default; a switch in Studio).
- Control that answers. A local Studio reaches the engine over loopback TCP, datagrams otherwise, so large payloads such as HRTF uploads and gain tables travel in a few packets. A refused control is acknowledged with its reason (
/state/control_error), state updates carry a generation count, and the OSC contract has a revision clients can read. - A config that survives. A
config.yamlthat fails to parse is never overwritten; unknown keys and unknown enum values are kept through a Save and written back unchanged; the file carries aschema_version, and Studio shows a banner when it is not being written. Hostile or damaged input is bounded before it reaches the render: SOFA arrays, test clips, OSC datagrams, gain-table transfers, oversized layouts and grids. - IAMF. With the IAMF plugin, a dialogue element's level is a live setting, and objects of an IAMF v2.0 mix reach the renderer as objects. Experimental: a private IEC 61937 burst type carries an IAMF stream inside PCM channels, and the engine's own sink can be switched to take such a carrier (
render.live_input.carrier_channels, a switch in Studio's Audio Input panel).
Behaviour changes
- Decoder bridge ABI.
bridge_apimoves from 0.4 to 0.6, and a bridge now loads only in a host of the samebridge_apiminor. This release requires harletty-bridge 0.9.0: a 0.8.0 bridge is refused at load, and a 0.9.0 plugin is refused by an older engine. Update both together. A config that still names the combinedlibharletty_bridgeis read as the family plugins beside it, for this release only. - Player ABI. liborender goes from 0.8 to 0.12, additions only: an mpv built for 0.6.0 keeps loading this engine.
- The web Studio is gone. The
Omniphony.Studio_…bundles and the.rpmare no longer built. The native Studio's assets areomniphony-studio-egui_0.7.0_…(installers) andomniphony-studio-egui-v0.7.0-<platform>(archives). - Latency.
latency_targetkeeps its key and changes meaning: it was the level of the output buffer, it is the end-to-end latency. A value sized for the buffer is raised when the stream needs more, and Studio says so. The--adaptive-resampling-*and--enable-adaptive-resamplingflags are refused; the matching config keys, and the live input'sbackend,layout,clock_mode,channels,sample_rate,mapandlfe_mode, are still read, do nothing, and are named once per run. OSC contract revision 7 removes the addresses and states that went with them. - Persistence. Options, profile operations and OSC writes that change the render no longer write
config.yamlon their own; they wait for Save. Display state (view, layout of the panels, language) is kept the moment it changes. - Placement on headphones. A family that chose no placement mode is placed in Sphere on headphones, where it was Room. A mode you chose is kept.
- BRIR. A BRIR set is rendered onto the loudspeakers the file measured, not onto the user's speaker layout, and without per-speaker gain, delay or band settings.
- Distance. The
inverse-squaredistance model is 1/d in amplitude beyond the speakers and unity inside them. It used to multiply gains by 1/d², which boosted objects inside the ring by up to 40 dB and fell twice as fast as the law it is named after. - Sample rate. Both hosts render at the stream's sample rate. The standalone renderer always built its filters, delays and binaural stages for 48 kHz, whatever the stream.
- First start. An engine inside a player turns OSC on when no config file exists, so Studio finds it. On Windows, output falls back to WASAPI (shared mode) when no ASIO driver is present; ASIO stays the first choice. The engine also looks for bridges in the per-user engine folder, and Studio lends its renderer the bridges
mpv.confnames. - Windows builds link the C runtime statically:
orender, the engine library and Studio start without the Visual C++ Redistributable. - A layout wider than the output device is refused with a message, not rendered past it. Stopping the engine or taking its OSC port is accepted from this machine only.
orender --versionnames the liborender ABI and thebridge_apiseries it pairs with. The never-implemented ASIO live-input backend and theinput-livecommand are removed.- Releases. Every crate of the renderer carries the release version. The standalone engine library is no longer a release of its own:
liborender-v0.7.0-<platform>.zipis attached here, with a manifest (omniphony-v0.7.0-manifest.json) naming the player and the bridge series this release goes with. The same table is in the README.
What the Linux files run on
- Studio (
.deb, AppImage, archive) and theorenderbeside it are built on Ubuntu 22.04: glibc 2.35 or later, and a system PipeWire fororender. - The combined installer carries the player as an AppImage, which brings its own libraries.
- The decoder bridge comes from its own release (harletty-bridge 0.9.0, built on Ubuntu 24.04); its IAMF plugin uses the system's libopus.
Known limitations
- Unsigned. The Windows installers are not code-signed, so SmartScreen warns on first run. The macOS builds are ad-hoc signed and not notarized (see below). There is no combined installer for macOS.
- Windows service. The combined installer is per user and starts the renderer at logon. A per-machine install and a Windows service exist on the command line only (
/ALLUSERS,/SERVICE); audio output from a service session has not been validated. - Sync engine on Windows and macOS. It builds and passes its tests on the three platforms, but has not been followed against a foreign DAC clock over hours outside Linux.
- IAMF over IEC 61937 is a private burst type, not a standard one, and has only been exercised on one machine. Use it on a dedicated sink: a carrier played as audio is full-scale noise.
- Through mpv, a layout is limited to 64 speakers, the width of mpv's channel maps. Wider layouts render through
orender. - The Studio reads a CJK-capable font from the system (Noto CJK, Droid Sans Fallback, MS Gothic, Hiragino); without one, Japanese, Chinese and Korean labels render as boxes.
- Switching the crossover engine or its transition width mid-playback still rebuilds the filter bank with a brief discontinuity.
The decoder bridge is distributed separately and this release needs its 0.9.0: one plugin per codec family, IAMF, faster decoders, and E-AC-3 object gains read as the stream signals them.
macOS install note
The macOS builds (omniphony-studio-egui_0.7.0_aarch64.dmg and the Studio's zip) are ad-hoc signed and not notarized yet, so Gatekeeper will refuse to open the downloaded app ("can't be opened" / "damaged"). After installing or extracting, clear the download quarantine once:
xattr -rd com.apple.quarantine "/Applications/Omniphony Studio (native).app"
xattr -rd com.apple.quarantine /path/to/omniphony-studio-egui-v0.7.0-macos-arm64
Alternatively: try to open it once, then System Settings → Privacy & Security → "Open Anyway" (if offered). See #201.
Full changelog: v0.6.0...v0.7.0