Custom sAPOs are installed with the associated device driver by using an INF file. The driver package includes the LFX and GFX sAPOs and any associated configuration UI. The device installation program or a setup program copies the sAPOs and configuration UI to the system and registers them.
A GFX or LFX sAPO is identified by its COM class ID (CLSID). The INF can associate each physical output device’s PnP ID with only one GFX and one LFX. The association is specified with registry directives in the INF file. The audio engine accesses this registry information through the IPropertyStore interfaces on Multimedia Device API (MMDevAPI) objects.
Because an audio adapter can support multiple audio inputs and outputs, an sAPO might not be compatible with all input types. If so, the sAPO must be explicitly associated with the compatible kernel-streaming (KS) node types.
Specifying the compatible KS node types may still not be sufficient for multiplexed capture devices such as microphone arrays, which can have multiple inputs with the same KS node type. In that case, the sAPO must determine whether it can operate on the current endpoint by querying the audio driver or endpoint property store for additional information. If the system effect cannot operate on the endpoint, the sAPO should behave like a copy or pass-through APO. This means that the sAPO should bypass its internal DSP algorithms and not fail initialization.
Note: The audio engine does not normally load an unsigned sAPO. However, signing is not done until the development process is complete and the driver has been submitted to WHQL. For development and test purposes, the signing requirement can be bypassed by setting the DisableProtectedAudioDG registry value to 1, as shown in this example:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Audio
"DisableProtectedAudioDG"=dword:00000001
|