Skip to content

Omniphony v0.7.0

Latest

Choose a tag to compare

@github-actions github-actions released this 13 Oct 18:35
· 4 commits to main since this release
353e135

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 carrying orender and 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 reach config.yaml through 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 (an install.sh with an uninstaller and an optional user service) and omniphony-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 the mpv-v0.7.0 player is published. The decoder bridge is installed apart; orender check-bridges says 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_coordinates reads 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 volumetric backend 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.yaml that fails to parse is never overwritten; unknown keys and unknown enum values are kept through a Save and written back unchanged; the file carries a schema_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_api moves from 0.4 to 0.6, and a bridge now loads only in a host of the same bridge_api minor. 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 combined libharletty_bridge is 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 .rpm are no longer built. The native Studio's assets are omniphony-studio-egui_0.7.0_… (installers) and omniphony-studio-egui-v0.7.0-<platform> (archives).
  • Latency. latency_target keeps 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-resampling flags are refused; the matching config keys, and the live input's backend, layout, clock_mode, channels, sample_rate, map and lfe_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.yaml on 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-square distance 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.conf names.
  • 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 --version names the liborender ABI and the bridge_api series it pairs with. The never-implemented ASIO live-input backend and the input-live command 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>.zip is 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 the orender beside it are built on Ubuntu 22.04: glibc 2.35 or later, and a system PipeWire for orender.
  • 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