[{"data":1,"prerenderedAt":24},["ShallowReactive",2],{"project-omx-dsp-":3},{"page":4,"others":20},{"slug":5,"src":6,"title":7,"source":8,"toc":9,"html":19},"","README.md","omx-dsp","https:\u002F\u002Fgithub.com\u002FFreeMixer\u002Fomx-dsp\u002Fblob\u002Ff5c279a980a76a9b2ca53df5a9000f9416cb6cc3\u002FREADME.md",[10,13,16],{"id":11,"title":12},"install","Install",{"id":14,"title":15},"use","Use",{"id":17,"title":18},"licence","Licence","\u003Ch1 id=\"omx-dsp\">omx-dsp\u003C\u002Fh1>\n\u003Cp>The DSP library of \u003Ca href=\"https:\u002F\u002Fwww.openmixer.org\">OpenMixer\u003C\u002Fa>: the building blocks of\nthe console (biquads, one-poles, envelopes, gain computers, delay rings, the oversampler) and the\neffect kernels built from them. The OpenMixer engine and the omx plugins compile the same kernels\nfrom this library, so an effect sounds the same on the console and in any other host.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Plain C11 and \u003Ccode>-lm\u003C\u002Fcode>. No allocation, lock or system call on the audio path; every state is\nowned by the caller, so any number of threads can run the kernels on their own states.\u003C\u002Fli>\n\u003Cli>Pre- and postconditions on every function, compiled in with \u003Ccode>-DOMX_CONTRACTS\u003C\u002Fcode> for testing and\nabsent from a release build.\u003C\u002Fli>\n\u003Cli>Every kernel is tested against its closed form at 44.1, 48, 88.2, 96, 176.4 and 192 kHz, and\nits output is held bit for bit by golden digests. The dynamics, balance, rotor, limiter and\nloudness are also tested at 32, 64 and 128 kHz, the other rates of the oracle set.\u003C\u002Fli>\n\u003Cli>Build time only: headers and a static library. Nothing is installed that a running program\nloads.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"install\">Install\u003C\u002Fh2>\n\u003Cp>Fedora 44, x86_64 or aarch64:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>sudo dnf install https:\u002F\u002Fwww.openmixer.org\u002Frpm\u002Fopenmixer-release.noarch.rpm\nsudo dnf install omx-dsp-devel\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Debian bookworm and trixie, amd64 or arm64 (also Raspberry Pi OS and Zynthian):\u003C\u002Fp>\n\u003Cpre>\u003Ccode>curl -fsSLO https:\u002F\u002Fwww.openmixer.org\u002Fdeb\u002Fopenmixer-release.deb &amp;&amp; sudo apt install .\u002Fopenmixer-release.deb\nsudo apt install libomxdsp-dev\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"use\">Use\u003C\u002Fh2>\n\u003Cpre>\u003Ccode>cc $(pkg-config --cflags omxdsp) -c my_plugin.c\ncc -shared -o my_plugin.so my_plugin.o $(pkg-config --libs omxdsp)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode class=\"language-c\">#include &lt;omxdsp\u002Ffx\u002Fomx_delay.h&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>A consumer's CI can check that it calls the library instead of carrying its own copies of\nwhat the library exports. The devel package installs \u003Ccode>omx-dsp-copy-check\u003C\u002Fcode> and the exports file it\nreads; from the root of the consumer's checkout:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>omx-dsp-copy-check --enforce\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>It scans the tracked C and TypeScript sources (tests, fakes, fixtures, oracles and generated\ndirectories excluded) and names each function that defines an exported name or a twin the\nlibrary's documentation declares, repeats an export's body, carries two of its distinctive\nconstants with the same maths calls, or writes a short export inline, such as \u003Ccode>20 * log10(x)\u003C\u002Fcode> or\nthe mono sum \u003Ccode>0.5f * (l[i] + r[i])\u003C\u002Fcode>. Without \u003Ccode>--enforce\u003C\u002Fcode> it only reports. Copies kept on purpose\ngo in \u003Ccode>omx-dsp-copies.allow\u003C\u002Fcode> at the root, one per line:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>tools\u002Fmeasure.c:main | omx_lin_to_db_d | an independent measurement, kept on purpose | owner#12\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>An entry that no longer covers a copy, or that has no reason or owner, fails the check, so the\nlist only shrinks. \u003Ccode>omx-dsp-copy-check --help\u003C\u002Fcode> describes every rule.\u003C\u002Fp>\n\u003Cp>The library comes in three flavours, each with its own archive and pkg-config file. A program\nbuilds against the one that matches its own build, so that its contract and TSan builds also\ncheck the library's compiled code:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>pkg-config\u003C\u002Fth>\n\u003Cth>archive\u003C\u002Fth>\n\u003Cth>for\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>omxdsp\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>libomxdsp.a\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>release builds; contracts compiled out\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>omxdsp-contracts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>libomxdsp-contracts.a\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>test builds with \u003Ccode>-DOMX_CONTRACTS\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>omxdsp-tsan\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>libomxdsp-tsan.a\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>test builds under ThreadSanitizer, contracts on\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The contracts and TSan flavours put \u003Ccode>-DOMX_CONTRACTS\u003C\u002Fcode> (and \u003Ccode>-fsanitize=thread\u003C\u002Fcode>) in the cflags.\nThe program defines the violation ledger in one of its files with \u003Ccode>#define OMX_CONTRACT_STORAGE\u003C\u002Fcode>\nbefore including the headers.\u003C\u002Fp>\n\u003Cp>Building from source and running the tests: \u003Ca href=\"\u002Fprojects\u002Fomx-dsp\u002Fbuilding\">BUILDING.md\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"licence\">Licence\u003C\u002Fh2>\n\u003Cp>GPL-3.0-or-later.\u003C\u002Fp>\n",[21],{"slug":22,"title":23},"building","Building omx-dsp",1793954995952]