{"id":18983803,"url":"https://github.com/dechamps/apo","last_synced_at":"2025-04-19T20:11:40.594Z","repository":{"id":65242208,"uuid":"494902946","full_name":"dechamps/APO","owner":"dechamps","description":"Some random notes about Windows Audio Processing Objects (APOs).","archived":false,"fork":false,"pushed_at":"2022-05-29T14:22:39.000Z","size":158,"stargazers_count":71,"open_issues_count":0,"forks_count":4,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-03-29T12:46:50.499Z","etag":null,"topics":["apo","audio-filter","dsp","vst","windows","windows-audio"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dechamps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-05-21T21:54:57.000Z","updated_at":"2025-03-13T22:48:29.000Z","dependencies_parsed_at":"2023-01-16T14:53:00.384Z","dependency_job_id":null,"html_url":"https://github.com/dechamps/APO","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dechamps%2FAPO","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dechamps%2FAPO/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dechamps%2FAPO/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dechamps%2FAPO/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dechamps","download_url":"https://codeload.github.com/dechamps/APO/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249246259,"owners_count":21237013,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["apo","audio-filter","dsp","vst","windows","windows-audio"],"created_at":"2024-11-08T16:18:35.592Z","updated_at":"2025-04-16T13:34:26.378Z","avatar_url":"https://github.com/dechamps.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# APO\n\nSome random notes about [Windows Audio Processing Objects][apo] (APOs) by\n[Etienne Dechamps][].\n\n## What is an APO?\n\nAPO stands for \"Audio Processing Object\". It is an API and framework designed by\nMicrosoft for building pluggable audio filters ([DSP][]). It is quite similar to\n[VST][] in principle.\n\nMore technically, an APO takes the form of a [COM][] class that implements the\n[APO interfaces][apodesign]. The resulting class is typically provided as part\nof a [DLL][] which is then registered in the system-wide COM registry (e.g.\nusing [regsvr32][]).\n\nThe class can then be instantiated, and each instance can [process][] a\ncontinuous audio stream, making arbitrary changes to the audio data.\n\n### The Windows Audio Engine\n\nWhat differentiates APOs from other audio filtering frameworks (such as VST) is\nthat it is the filtering framework used by the [Windows Audio Engine][arch].\n\nThe Windows Audio Engine is a core component of the Windows audio stack. Its\nrole is to bridge the gap between individual application audio streams and\nhardware audio devices. As such it handles various tasks such as mixing audio\nfrom multiple applications, automatic format conversions, etc.\n\nMost application audio goes through the Windows Audio Engine. In particular it\nwill process any audio stream that is opened through the [WASAPI][] (Shared)\nAPI (and by extension [DirectSound][] and [MME][], which use WASAPI Shared\ninternally). The only exceptions are streams opened in [WASAPI Exclusive][]\nmode, [Kernel Streaming][] (WDM-KS), and native [ASIO][], which all bypass the\nWindows Audio Engine; but these are seldom used by typical applications.\n\nThe Windows Audio Engine [uses a number of APOs internally][enum] as part of its\nnormal operation, each handling a specific task such as automatic sample rate\nconversion. These internal APOs notably include the (in)famous\n[CAudioLimiter][asrdebate].\n\nAPOs run inside the Windows audio graph process (`audiodg.exe`) which is itself\nmanaged by the Windows Audio service (`audiosrv`).\n\n### System effect APOs (sAPOs)\n\nAPOs can be installed as *system effect APOs*, or sAPOs, by implementing the\n[`IAudioSystemEffects`][] interface. sAPOs are optional APOs that can be\ninserted at various points inside the Windows audio engine pipeline. sAPOs can\nbe extremely useful because they can be used to arbitrarily filter audio for\nall Windows applications running system-wide; and because they run directly\ninside the Windows audio engine, they can do so in a very clean and efficient\nmanner with no additional conversions and zero additional latency.\n\nsAPOs can be [positioned][apoarch] to filter audio data at the following stages\nof the Windows audio pipeline:\n\n- **Stream Effect (SFX)** APOs are instantiated for every application stream.\n  They process the audio signal as it comes in and out of a single application.\n  - In particular, in the playback direction, processing occurs before any\n    mixing or sample rate conversion takes place.\n  - SFX APOs are the only sAPOs that are allowed to change the channel count\n    (i.e. downmix/upmix).\n- **Mode Effect (MFX)** APOs operate at an intermediate stage, on the mixed\n  audio from all streams that share a common [mode][].\n- **Endpoint Effect (EFX)** APOs operate on the audio signal that comes in and\n  out of the audio device.\n  - In particular, in the playback direction, processing occurs after all mixing\n    and sample rate conversion takes place (but *before* CAudioLimiter).\n\nThe above describes the modern sAPO architecture as it was introduced in Windows\n8.1. Previously, different kinds of APOs were used:\n\n- **Local Effect (LFX)** APOs, also known as *pre-mix* APOs, serve the same\n  purpose as SFX APOs.\n- **Global Effect (GFX)** APOs, also known as *post-mix* APOs, serve the same\n  purpose as EFX APOs.\n\nLFX and GFX APOs can still be used in modern versions of Windows, but Microsoft\ndoes not document them anymore; they should be considered deprecated. If both\nmodern (SFX/MFX/EFX) and legacy (LFX/GFX) sAPOs are configured, then Windows\nwill use the modern ones.\n\n### System effect APO installation\n\nsAPOs are configured on a per-[audio endpoint device][endpoint] basis. That is,\neach audio device uses its own set of APOs.\n\nWhich APOs to use is normally decided by the audio device driver; specifically,\nthey are defined in the [audio driver INF file][inf]. \n\nAn audio device driver can decide to use some of the [sAPOs that are bundled\nwith Windows][bundled], or it can implement its own [custom sAPO][apodesign] and\ninclude it in the driver package. Keep in mind, however, that APOs always run in\nuser mode (in the `audiodg.exe` process), not in kernel mode; they are merely\n*bundled* with the driver, and are not part of the kernel-mode driver module\nitself.\n\nWhen an audio driver is installed, any custom sAPOs are installed and\nregistered, and the sAPO configuration from its INF file is copied to the\nWindows Audio Engine configuration (see below).\n\nAfter the audio driver is installed, it is technically possible to go in and\nchange the Windows Audio Engine configuration after the fact to use different\nsAPOs, even third-party sAPOs that are not part of Windows nor the original\ndriver. This is extremely powerful because that makes it possible to apply any\narbitrary audio filtering to any audio device, independent of driver (think\n\"system-wide VSTs\"). This is precisely how [Equalizer APO][] works. Note,\nhowever, that this approach to setting up sAPOs *is not officially supported by\nMicrosoft*; the fact that it works should be considered an \"happy accident\".\nAlso note that such custom configuration will be overwritten every time the\naudio driver is reinstalled, and that some Windows updates have a tendency to\nreinstall audio drivers.\n\n## Manipulating system effect APO configuration\n\nAll commands shown in this section are Powershell commands. Commands that make\nchanges will only work when run as Administrator.\n\n### Location\n\nThe configuration for the Windows Audio Engine lives under the following\nWindows registry key:\n\n```\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\n```\n\nPlayback devices are found under the `Render` key. Recording devices are found\nunder the `Capture` key.\n\nUnder `Render` and `Capture`, each [audio endpoint device][endpoint] has its own\nkey, named after the endpoint GUID (see below).\n\nUnder each endpoint device key, the `FxProperties` key contains system effect\nAPO configuration.\n\nFor example, the following key contains system effect APO configuration for the\nplayback endpoint device with GUID `{b39fc22d-4c5d-4e65-8276-db7f999d2d06}`:\n\n```\nHKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render\\{b39fc22d-4c5d-4e65-8276-db7f999d2d06}\\FxProperties\n```\n\nThe initial configuration comes from the driver store, which is itself populated\n[from the audio device driver INF file][inf].\n\n### Determining the GUID of an audio endpoint device\n\nOne way is to determine the GUID of an endpoint device is to open the [Equalizer\nAPO][] Configurator, select a device, and click on \"Copy Device command to\nclipboard\". The copied command includes the endpoint GUID.\n\nOtherwise, you can use the following command:\n\n```powershell\nGet-PnpDevice -Class AudioEndpoint | Format-Table -Property InstanceId,Present,FriendlyName\n```\n\nExample output:\n\n```\nFriendlyName                                                  Present InstanceId\n------------                                                  ------- ----------\nHeadset (CORSAIR VIRTUOSO Wireless Gaming Headset)              False SWD\\MMDEVAPI\\{0.0.0.00000000}.{A8079308-1956-4FB7-BBB0-8D8842611102}\nHeadset Microphone (CORSAIR VIRTUOSO Wireless Gaming Headset)   False SWD\\MMDEVAPI\\{0.0.1.00000000}.{4ED8903D-2C88-4EAC-93E4-39B0BFE7475C}\nMonitors (Xonar U7)                                              True SWD\\MMDEVAPI\\{0.0.0.00000000}.{5D16E8DA-37A3-4657-8D52-57FFE97F4EF9}\nS/PDIF 1 (Virtual Audio Cable)                                  False SWD\\MMDEVAPI\\{0.0.1.00000000}.{42BA34C2-E6E7-452D-BCE3-ADCBEC30E1A4}\nLine 1 (Virtual Audio Cable)                                    False SWD\\MMDEVAPI\\{0.0.0.00000000}.{185D6665-3115-45BD-9E85-39BA4E326DDD}\n```\n\nThe `InstanceId` is normally `SWD\\MMDEVAPI\\` followed by the\n*[endpoint ID string][]*. The endpoint ID string is itself composed of a\n`{0.0.0.00000000}.` or  `{0.0.1.00000000}.` prefix (denoting Render and Capture\nendpoints, respectively), followed by the endpoint GUID. So in the above\nexample, `Monitors` is a Render endpoint device and its GUID is\n`{5D16E8DA-37A3-4657-8D52-57FFE97F4EF9}`.\n\nEndpoint GUIDs will change if the audio driver is reinstalled. Note that some\nWindows updates reinstall all audio drivers as a side effect.\n\nIn code, the proper way to enumerate audio endpoints is to use\n[`IMMDeviceEnumerator::EnumAudioEndpoints()`][EnumAudioEndpoints].\n\n### `FxProperties` values\n\nThe `FxProperties` registry key holds the system effect APO configuration for a\nspecific audio endpoint device.\n\nThe configuration is organized as a set of registry values, which correspond\nto individual properties. A property is identified by a GUID, followed by a\ncomma `,`, followed by a number. For example:\n`{b725f130-47ef-101a-a5f1-02608c9eebac},10`.\n\nThe official list of supported system effect APO properties can be found in the\n[audio driver INF settings][infsettings] documentation (look for properties\nthat are installed under `HKR,FX\\0` in the INF File Sample).  Alternatively,\nthe `audioenginebaseapo.idl` file in the [Windows SDK][] contains a more\nexhaustive list (e.g. it includes legacy LFX/GFX properties).\n\nThe most important properties are those that control which sAPOs are used. These\nare:\n\n| Type | Property ID                                | Property name                     |\n|------|--------------------------------------------|-----------------------------------|\n| SFX  | `{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},5` | [`PKEY_FX_StreamEffectClsid`][]   |\n| MFX  | `{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},6` | [`PKEY_FX_ModeEffectClsid`][]     |\n| EFX  | `{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},7` | [`PKEY_FX_EndpointEffectClsid`][] |\n| LFX  | `{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},1` | `PKEY_FX_PreMixEffectClsid`       |\n| GFX  | `{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},2` | `PKEY_FX_PostMixEffectClsid`      |\n\nIf any of SFX, MFX or EFX are present, then LFX and GFX are ignored.\n\nAll properties are optional. If no properties are present, or if the\n`FxProperties` key is absent entirely, then no system effect APOs are used.\n\nAnother notable property is [`PKEY_AudioEndpoint_Disable_SysFx`][]\n(`{1da5d803-d492-4edd-8c23-e0c0ffee7f0e},5`, DWORD), which, if set to 1,\ndisables all sAPOs. It is mapped to the \"Enable audio enhancements\" checkbox in\nthe Windows audio device settings.\n\n### Locating an sAPO\n\nThe string value of a `PKEY_FX_*EffectClsid` property is a [CLSID][] which\nidentifies the specific APO COM class to instantiate to filter the audio signal.\nCLSIDs are globally unique and chosen by the sAPO developer, so they can be\nexpected to be stable even across different machines and OS versions.\n\nWhen a sAPO is installed, it is registered in the system-wide COM class store\nfound at `HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes\\CLSID` so that it can be looked up\nby its CLSID.\n\nFor example, the following command will look up information about CLSID\n`{EC1CC9CE-FAED-4822-828A-82A81A6F018F}` which is the [Equalizer APO][] GFX\nsAPO:\n\n```powershell\n$RegistryKey = Get-Item \"HKLM:\\SOFTWARE\\Classes\\CLSID\\{EC1CC9CE-FAED-4822-828A-82A81A6F018F}\"\n$RegistryKey.GetValue(\"\")\n$RegistryKey.OpenSubKey(\"InprocServer32\").GetValue(\"\")\n```\n\nExample output:\n\n```\nEqualizerAPO Post-Mix Class\nC:\\Program Files\\EqualizerAPO\\EqualizerAPO.dll\n```\n\nIn this example `EqualizerAPO.dll` is the DLL that contains the sAPO code. The\nWindows Audio engine `audiodg.exe` process will load that DLL to instantiate the\nfilter and process the audio.\n\n### How to remove all sAPOs for an audio endpoint\n\nThe following example command will delete all registry values directly under\n`FxProperties` for the `{2f716148-66dd-4afe-9698-d3c74eea039a}` endpoint GUID,\nthus removing all sAPO configuration for that endpoint:\n\n```powershell\n$RegistryKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey(\n  \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render\\{2f716148-66dd-4afe-9698-d3c74eea039a}\\FxProperties\",\n  [Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,\n  [System.Security.AccessControl.RegistryRights]::QueryValues -bor [System.Security.AccessControl.RegistryRights]::SetValue)\n$RegistryKey.GetValueNames() | ForEach-Object { $RegistryKey.DeleteValue($_) }\n```\n\nYou can use the Registry Editor to make a backup of the contents of the registry\nkey before running the above command so that you can restore them later. Another\nway to revert to the default state is to reinstall the audio driver.\n\nThe same result can be achieved by deleting or renaming the `FxProperties` key,\nbut permissions might get in the way (see below).\n\n### Registry permission issues\n\nBy default, special permissions apply to the overall `MMDevices` registry key.\nThe only user with full control of that key is `TrustedInstaller`. Even\nAdministrators have restricted permissions: they can add, modify and remove\nregistry values, but they cannot change the keys.\n\nThis can prevent certain useful operations on the `FxProperties` key, such as\ndeleting or renaming it, or even creating it in the first place (which is\nnecessary in order to add sAPOs to an endpoint that never had any).\n\nFixing the permissions from the command line is surprisingly hard for a number\nof silly technical reasons. Namely: there is no easy way to run commands under\nthe `TrustedInstaller` user or to enable the `TakeOwnership` [privilege][]\nwithout the help of external tools, and built-in tools such as [takeown][]\ncannot be used on the registry.\n\nHowever, it is possible to fix the permissions manually using the Registry\nEditor (`regedit`):\n\n1. Navigate to `HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio`.\n2. Open the permissions of the `Audio` registry key and change its owner to the\n   Administrators group.\n3. Give the Administrators group Full Control over the registry key.\n\nYou should then be able to make any change you like, including creating,\ndeleting and renaming `FxProperties` keys.\n\n### Applying the changes\n\nThe relevant registry entries are consumed by the Windows Audio service\n(`audiosrv`). To make sure changes are picked up, the service usually needs to\nbe restarted:\n\n```powershell\nRestart-Service -Name audiosrv\n```\n\n## Access rights, permissions, ACL issues when running APOs\n\nAs previously explained, APOs run inside the `audiodg.exe` process which itself\nruns under the Windows Audio Service (`Audiosrv`).\n\nThis service, like virtually all services, does *not* run under your normal\nWindows user account. Instead, its [access token][] gives it permissions that\nare roughly equivalent to the [LocalService][] account.\n\nMost notably, for security and isolation reasons, the service does *not* have\naccess to your user directory (i.e. `C:\\Users\\\u003cusername\u003e`).\n\nIn some cases this can lead to an APO misbehaving because it is attempting to\nopen a file (or other [securable object][], such as a registry key) that it is\nnot allowed to access.\n\nOne example is attempting to store an [Equalizer APO][] configuration file\ninside a user directory. The Equalizer APO Configuration Editor will display a\nhelpful warning in this case, and the APO itself will log an error message into\nits logfile (`C:\\Windows\\ServiceProfiles\\LocalService\\AppData\\Local\\Temp\\EqualizerAPO.log`).\n\nIn other cases the issue might be harder to troubleshoot. For example, most\n[VSTs][VST] do not anticipate running into permission issues. When such VSTs are\nused inside Equalizer APO (for example) and run into unexpected access issues,\nthe resulting behaviour can be erratic and hard to troubleshoot.\n\n### Troubleshooting access control issues\n\nOne way to confirm that an APO is having trouble accessing specific objects is\nto use [Process Monitor][]. Use the following filters:\n\n- \"Process Name\" is `audiodg.exe`\n- \"Result\" is `ACCESS DENIED`\n\nThen restart the Windows Audio service and start streaming audio. Access denied\nerrors should then appear in Process Monitor.\n\nThe following example shows Equalizer APO attempting to open an inaccessible\nconfiguration file:\n\n![](ProcessMonitor-AccessDenied.png)\n\nIt is possible to determine which DLL is making the offending calls by looking\nat the *event stack* in Process Monitor. In this example it is\n`EqualizerAPO.dll`, as expected. If the failure originates from a VST used\nwithin Equalizer APO, the stack should mention the offending VST DLL alongside\n(or instead of) Equalizer APO.\n\n![](ProcessMonitor-Stack.png)\n\nSome issues can be more subtle. For example some VSTs might expect to find files\nor registry entries under the *current* user profile. These objects might exist\nunder your personal user profile, but not in the local service user profile. To\ntroubleshoot such issues you might need to widen your search and expand your\nProcess Monitor filters to include more failure modes, such as \"not found\"\nerrors.\n\n### Fixing access control issues\n\nThere are two ways to fix this issue:\n\n- Move the offending files/objects in a location that the Audio service can\n  access. For example Program Files or ProgramData. Or:\n- Change the permissions ([DACL][]) on the offending files/objects to allow\n  access by the Audio service.\n\nTo adjust the permissions, go to the Security properties of the offending\nfile/object (or a parent) and ensure the `NT SERVICE\\Audiosrv` user principal\nhas access. (This principal is the [service SID][]. You can also use the local\nservice account, but only allowing the Windows audio service is cleaner.)\n\n![](Permissions-Audiosrv.png)\n\nThen restart the Windows Audio service.\n\n**Note:** while this technique can be used to store Equalizer APO configuration\nfiles outside of the standard `config` directory, keep in mind that doing so\nwill break the Equalizer APO \"instant mode\" feature (i.e. live changes) because\nEqualizer APO only watches its `config` directory for changes.\n\n## Useful links\n\n- [Windows Audio Architecture][arch]\n- [Audio Processing Object Architecture][apo]\n- [Audio INF File Settings][infsettings]\n- [Equalizer APO][], notably the [developer documentation][eapodev]\n- [Audio Endpoint Devices][endpoint]\n- [Custom Audio Effects in Windows Vista][vista] (notably explains the meaning\n  of the deprecated LFX and GFX APO placements)\n- [Enumerate APOs][enum]\n\n[access token]: https://docs.microsoft.com/en-us/windows/win32/secauthz/access-tokens\n[apo]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/audio-processing-object-architecture\n[apoarch]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/audio-processing-object-architecture#audio-processing-objects-architecture\n[apodesign]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/implementing-audio-processing-objects#design-considerations-for-custom-apo-development\n[ASIO]: https://en.wikipedia.org/wiki/Audio_Stream_Input/Output\n[asrdebate]: https://www.audiosciencereview.com/forum/index.php?threads/ending-the-windows-audio-quality-debate.19438/\n[bundled]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/audio-signal-processing-modes#audio-effects\n[CLSID]: https://docs.microsoft.com/en-us/windows/win32/com/com-class-objects-and-clsids\n[COM]: https://en.wikipedia.org/wiki/Component_Object_Model\n[DACL]: https://docs.microsoft.com/en-us/windows/win32/secauthz/dacls-and-aces\n[DLL]: https://en.wikipedia.org/wiki/Dynamic-link_library\n[eapodev]: https://sourceforge.net/p/equalizerapo/wiki/Developer%20documentation/\n[endpoint]: https://docs.microsoft.com/en-us/windows/win32/coreaudio/audio-endpoint-devices\n[endpoint ID string]: https://docs.microsoft.com/en-us/windows/win32/coreaudio/endpoint-id-strings\n[enum]: https://matthewvaneerde.wordpress.com/2010/06/03/how-to-enumerate-wasapi-audio-processing-objects-apos-on-your-system/\n[EnumAudioEndpoints]: https://docs.microsoft.com/en-us/windows/win32/api/mmdeviceapi/nf-mmdeviceapi-immdeviceenumerator-enumaudioendpoints\n[Equalizer APO]: https://sourceforge.net/projects/equalizerapo/\n[Etienne Dechamps]: mailto:etienne@edechamps.fr\n[DirectSound]: https://en.wikipedia.org/wiki/DirectSound\n[DSP]: https://en.wikipedia.org/wiki/Digital_signal_processing\n[`IAudioSystemEffects`]: https://docs.microsoft.com/en-us/windows/win32/api/audioenginebaseapo/nn-audioenginebaseapo-iaudiosystemeffects\n[inf]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/implementing-audio-processing-objects#registering-apos-for-processing-modes-and-effects-in-the-inf-file\n[infsettings]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/media-class-inf-extensions\n[Kernel Streaming]: https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/kernel-streaming\n[LocalService]: https://docs.microsoft.com/en-us/windows/win32/services/localservice-account\n[MME]: https://en.wikipedia.org/wiki/Windows_legacy_audio_components#Multimedia_Extensions_(MME)\n[mode]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/audio-signal-processing-modes\n[`PKEY_AudioEndpoint_Disable_SysFx`]: https://docs.microsoft.com/en-us/windows/win32/coreaudio/pkey-audioendpoint-disable-sysfx\n[`PKEY_FX_EndpointEffectClsid`]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/pkey-fx-endpointeffectclsid\n[`PKEY_FX_ModeEffectClsid`]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/pkey-fx-modeeffectclsid\n[`PKEY_FX_StreamEffectClsid`]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/pkey-fx-streameffectclsid\n[privilege]: https://docs.microsoft.com/en-us/windows/win32/secauthz/privilege-constants\n[process]: https://docs.microsoft.com/en-us/windows/win32/api/audioenginebaseapo/nf-audioenginebaseapo-iaudioprocessingobjectrt-apoprocess\n[Process Monitor]: https://docs.microsoft.com/en-us/sysinternals/downloads/procmon\n[regsvr32]: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/regsvr32\n[securable object]: https://docs.microsoft.com/en-us/windows/win32/secauthz/securable-objects\n[service SID]: https://sourcedaddy.com/windows-7/understanding-service-sids.html\n[takeown]: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/takeown\n[vista]: https://download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/sysfx.doc\n[VST]: https://en.wikipedia.org/wiki/Virtual_Studio_Technology\n[arch]: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/windows-audio-architecture\n[WASAPI]: https://docs.microsoft.com/en-us/windows/desktop/coreaudio/wasapi\n[WASAPI Exclusive]: https://docs.microsoft.com/en-us/windows/win32/coreaudio/exclusive-mode-streams\n[Windows Property System]: https://docs.microsoft.com/en-us/windows/win32/properties/windows-properties-system\n[Windows SDK]: https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdechamps%2Fapo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdechamps%2Fapo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdechamps%2Fapo/lists"}