{"id":35174521,"url":"https://github.com/voidxh/cavern","last_synced_at":"2026-05-10T17:26:47.174Z","repository":{"id":39988291,"uuid":"97760696","full_name":"VoidXH/Cavern","owner":"VoidXH","description":"Object-based audio engine and codec pack with Dolby Atmos rendering, room correction, HRTF, one-click Unity audio takeover, and much more.","archived":false,"fork":false,"pushed_at":"2026-04-05T01:04:02.000Z","size":3832,"stargazers_count":484,"open_issues_count":1,"forks_count":30,"subscribers_count":13,"default_branch":"master","last_synced_at":"2026-04-05T03:12:30.582Z","etag":null,"topics":["atmos","audio","audio-calibration","audio-engine","cinema","dolby-atmos","room-correction","sound","spatial-audio","surround-sound","unity3d"],"latest_commit_sha":null,"homepage":"http://cavern.sbence.hu","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VoidXH.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-07-19T20:58:53.000Z","updated_at":"2026-04-05T01:01:29.000Z","dependencies_parsed_at":"2026-01-28T23:01:33.929Z","dependency_job_id":null,"html_url":"https://github.com/VoidXH/Cavern","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/VoidXH/Cavern","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoidXH%2FCavern","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoidXH%2FCavern/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoidXH%2FCavern/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoidXH%2FCavern/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VoidXH","download_url":"https://codeload.github.com/VoidXH/Cavern/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VoidXH%2FCavern/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31533824,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"ssl_error","status_checked_at":"2026-04-07T16:28:06.951Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["atmos","audio","audio-calibration","audio-engine","cinema","dolby-atmos","room-correction","sound","spatial-audio","surround-sound","unity3d"],"created_at":"2025-12-28T21:53:40.370Z","updated_at":"2026-04-08T00:01:29.005Z","avatar_url":"https://github.com/VoidXH.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cavern\nThe bleeding edge audio framework that gives you Dolby Atmos and top end room\ncorrection on any sound system. Cavern is also an all-in-one toolkit for game\naudio development and the swiss army knife of filtering and measurement tools\nwith a leading performance among C# implementations.\n\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/VoidXH/Cavern/Build.yml)\n[![GitHub release (latest by date)](https://img.shields.io/github/v/release/VoidXH/Cavern)](https://github.com/VoidXH/Cavern/releases/latest)\n![GitHub commits since latest release (by date)](https://img.shields.io/github/commits-since/VoidXH/Cavern/latest)\n[![Codacy Badge](https://app.codacy.com/project/badge/Grade/087eefd2734a48c08e6b4b1006f84021)](https://app.codacy.com/gh/VoidXH/Cavern)\n\n[![NuGet - Cavern](https://img.shields.io/nuget/v/Cavern?label=NuGet%3A%20Cavern)](https://www.nuget.org/packages/Cavern/)\n[![NuGet - Cavern.Format](https://img.shields.io/nuget/v/Cavern.Format?label=NuGet%3A%20Cavern.Format)](https://www.nuget.org/packages/Cavern.Format/)\n[![NuGet - Cavern.QuickEQ](https://img.shields.io/nuget/v/Cavern.QuickEQ?label=NuGet%3A%20Cavern.QuickEQ)](https://www.nuget.org/packages/Cavern.QuickEQ/)\n\n## Features\n* Unlimited objects and output channels without position restrictions\n* Supports lots of immersive formats, including Dolby Atmos\n* Advanced self-calibration with a microphone\n\t* Reaches the desired targets with \u003c0.01 dB and \u003c0.01 ms of uniformity\n\t* Sound bubble creation without a calibration file\n\t* Multi-sub handling that can use not just the subs to flatten the bass in the room\n* Direction and distance virtualization for headphones\n* Filter engine with the most common filters seamlessly integrated into the renderer\n* Measurement subsystem for science projects\n* Real-time upconversion of regular surround sound mixes to 3D\n* Mix repositioning based on occupied seats\n* Seat movement generation\n* Ultra low latency, even the upconverter can work from as low as one sample per frame\n* Unity-like listener and source functionality\n* Fixes for Unity's Microphone API\n\t* Works in WebGL too\n\n\n### Supported codecs\n* Meridian Lossless Packing (Dolby TrueHD Atmos, in Cavernize only, with Truehdd)\n* E-AC-3 with Joint Object Coding (Dolby Digital Plus Atmos)\n* Limitless Audio Format\n* RIFF WAVE\n* Core Audio Format\n* Audio Definition Model Broadcast Wave Format\n* Dolby Atmos Master Format\n* Supported containers: .ac3, .eac3, .ec3, .laf, .m4a, .m4v, .mka, .mkv, .mov, .mp4, .qt, .wav, .weba, .webm\n\n### Supported software/hardware for EQ export\n* PC, Mac, and Linux: Equalizer APO, CamillaDSP, AU N-Band EQ\n* DSP: MiniDSP 2x4 Advanced, 2x4 HD, DDRC-88A, Flex HTx\n* AVRs and processors: Acurus Muse, Emotiva, Monolith HTP-1, Rotel, Sony ES series, StormAudio, Tonewinner AT series, WiiM, Yamaha CX-A, RX, RX-A series\n* Amplifiers: Behringer NX series\n* Others: Audyssey MultEQ-X, Dirac Live, JL Audio T�N, Roon, Wavelet\n\n## User documentation\nUser documentation can be found at the [Cavern documentation webpage](http://cavern.sbence.hu/cavern/doc.php).\nPlease go to this page for basic setup, in-depth QuickEQ tutorials, and\ncommand-line arguments.\n\nThe full list of changes for each version can be found in [CHANGELOG.md](./CHANGELOG.md).\n\n## How to build\n### Cavern\nCavern is a .NET Standard project with no dependencies. Open the `Cavern.sln`\nsolution with Microsoft Visual Studio 2022 or later and all projects should\nbuild.\n\n### Sample projects\nThese examples use the Cavern library to show how it works. The solution\ncontaining all sample projects is found at `CavernSamples/CavernSamples.sln`.\nThe same build instructions apply as to the base project.\n\nSingle-purpose sample codes are found under `docs/Code samples`.\n\n### Cavern for Unity\nOpen the `CavernUnity DLL.sln` solution with Microsoft Visual Studio 2022.\nRemove the references from the CavernUnity DLL project to UnityEngine and\nUnityEditor. Add these files from your own Unity installation as references.\nThey are found in `Editor\\Data\\Managed` under Unity's installation folder.\n\n### CavernAmp\nThis is a Code::Blocks project, set up for the MingW compiler. No additional\nlibraries were used, this is standard C++ code, so importing just the .cpp and\n.h files into any IDE will work perfectly.\n\n## Library quick start\n### Clip\nCavern is using audio clips to render the audio scene. A `Clip` is basically a\nsingle audio file, which can be an effect or music. The easiest method of\nloading from a file is through the `Cavern.Format` library, which will\nauto-detect the format:\n```cs\nClip clip = AudioReader.ReadClip(pathToFile);\n```\nRefer to the [scripting API](http://cavern.sbence.hu/cavern/doc.php?if=api/Cavern/Clip/index)\nfor the complete description of this object.\n\n### Listener\nThe `Listener` is the center of the sound stage, which will render the audio\nsources attached to it. The listener has a `Position` and `Rotation` (Euler\nangles, degrees) field for spatial placement. All sources will be rendered\nrelative to it. Here's its creation:\n```cs\nListener listener = new Listener() {\n    SampleRate = 48000, // Match this with your output\n    UpdateRate = 256 // Match this with your buffer size\n};\n```\nThe `Listener` will set up itself automatically with the user's saved\nconfiguration. The used audio channels can be queried through\n`Listener.Channels`, which should be respected, and the output audio channel\ncount should be set to its length. If this is not possible, the layout could be\nset to a standard by the number of channels, for example, this line will set up\nall listeners to 5.1:\n```cs\nListener.ReplaceChannels(6);\n```\nRefer to the [scripting API](http://cavern.sbence.hu/cavern/doc.php?if=api/Cavern/Listener/index)\nfor the complete description of this object.\n\n### Source\nThis is an audio placed in the sound space, renders a `Clip` at where it's\npositioned relative to the `Listener`. Here's how to create a new source at a\ngiven position and attach it to the listener:\n```cs\nSource source = new Source() {\n    Clip = clip,\n    Position = new Vector3(10, 0, 0)\n};\nlistener.AttachSource(source);\n```\nSources that are no longer used should be detached from the listener using\n`DetachSource`. Refer to the [scripting API](http://cavern.sbence.hu/cavern/doc.php?if=api/Cavern/Source/index)\nfor the complete description of this object.\n\n### Rendering\nTo generate the output of the audio space and get the audio samples which should\nbe output to the system, use the following line:\n```cs\nfloat[] output = listener.Render();\n```\nThe length of this array is `listener.UpdateRate * Listener.Channels.Length`.\n\n### Working with audio files\nThe `Cavern.Format` library handles reading and writing audio files. For custom\nrendering or transcoding, they can be handled on a lower level than loading a\n`Clip`.\n\n#### Reading\nTo open any supported audio file for reading, use the following static function:\n```cs\nAudioReader reader = AudioReader.Open(string path);\n```\nThere is an overload for `AudioReader.Open` to read audio files from an\narbitrary `Stream`. After opening a file, the following workflows are available.\n\n##### Getting all samples\nThe `Read()` function of an `AudioReader` returns all samples from the file in\nan interlaced array with the size of `reader.ChannelCount * reader.Length`.\n\n##### Getting the samples block by block\nFor real-time use or cases where progress should be displayed, an audio file can\nbe read block-by-block. First, the header must be read, this is not done\nautomatically. Until the header is not read, metadata like length or channel\ncount are unavailable. Header reading is accomplished by calling\n`reader.ReadHeader()`.\n\nThe `ReadBlock(float[] samples, long from, long to)` function of an\n`AudioReader` reads the next interlaced sample block to the specified array in\nthe specified index range. Samples are counted for all channels. A version of\n`ReadBlock` for multichannel arrays (`float[channel][sample]`) is also\navailable, but in this case, the index range is given for a single channel.\n\nSeeking in local files are supported by calling `reader.Seek(long sample)`. The\ntime in `sample`s is relative to `reader.Length`, which means it's per a single\nchannel.\n\n##### Rendering in an environment\nThe `reader.GetRenderer()` function returns a `Renderer` instance that creates\n`Source`s for each channel or audio object. These can be retrieved from the\n`Objects` property of the renderer. When all of them are attached to a\n`Listener`, they will handle fetching the samples. Seeking the reader or the\nrenderer works in this use case.\n\n#### Writing\nTo create an audio file, use an `AudioWriter`:\n```cs\nAudioWriter writer = AudioWriter.Create(string path, int channelCount, long length, int sampleRate, BitDepth bits);\n```\nThis will create the `AudioWriter` for the appropriate file extension if it's\nsupported.\n\nJust like `AudioReader`, an `AudioWriter` can be used with a single call\n(`Write(float[] samples)` or `Write(float[][] samples)`) or block by block\n(`WriteHeader()` and `WriteBlock(float[] samples, long from, long to)`).\n\n## Unity quick start\nCavern works exactly the same way as Unity's audio engine, only the names are\ndifferent. For `AudioSource`, there's `AudioSource3D`, and for `AudioListener`,\nthere's `AudioListener3D`, and so on. You will find all Cavern components in the\ncomponent browser, under audio, and they will automatically add all their Unity\ndependencies.\n\n## Development documents\n* [Knowledge base](./docs)\n* [API browser](http://cavern.sbence.hu/cavern/doc.php?if=api/index) with descriptions of all public members for all public classes\n* [Virtualizer repository](https://github.com/VoidXH/HRTF) which contains the raw IR measurements and detailed information about their use\n\n## Disclaimers\n### Code\nCavern is a performance software written in an environment that wasn't made for\nit. This means that clean code policies like DRY are broken many times if the\ncode is faster this way, usually by orders of magnitude. Most changes should be\nbenchmarked in the target environment, and the fastest code should be chosen,\nregardless of how bad it looks. This, however, can't result in inconsistent\ninterfaces. In that case, wrappers should be used with the least possible method\ncalls.\n\n### Driver\nWhile Cavern itself is open-source, the setup utility and most converter\ninterfaces are not, because they are built on licences not allowing it. However,\ntheir functionality is almost entirely using this plugin. Builds can be\ndownloaded from the [Cavern website](http://cavern.sbence.hu).\n\n## Licence\nBy downloading, using, copying, modifying, or compiling the source code or a\nbuild, you are accepting the licence [available here](LICENSE.md).\n\nThis licence heavily discourages commercial usage. If you're not supporting the\nopen source community with your work, you will need to contact the original\nauthor for a Cavern Pro licence through the Cavern website's contact form.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoidxh%2Fcavern","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvoidxh%2Fcavern","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvoidxh%2Fcavern/lists"}