Window音频处理对象APO(SFX,GFX,EFX,MFX,SFX)
APO代表“音频处理对象”。它是一个API和框架,由Microsoft设计,用于构建可插拔的音频过滤器(DSP)。原则上它与VST非常相似。
Window音频处理对象APO用于实现对系统的声卡的数据处理,通过处理,可以实现用户自定义的均衡器、混响、颤音、回声消除 (AEC) 和自动增益控制 (AGC)等功能。
从技术上讲,APO采用实现APO接口的COM类的形式。生成的类通常作为DLL的一部分提供,然后在系统范围的COM注册表中注册(例如,使用regsvr32)。
然后可以实例化该类,每个实例可以处理连续的音频流,对音频数据进行任意更改。
APO是工作在应用层的驱动程序。当然Windows系统也提供了一些自己的APO对象,可以供用户使用。
用户自行开发的APO对象叫自定义APO。其实体包括INF文件和DLL文件。他们通过将其音频算法打包为 APO 并修改标准 INF 文件以将其 APO 插入音频引擎的信号处理图中来实现这一点。
音频处理对象APO架构
通过实现IAudioSystemEffects接口,可以将APO安装为系统效果APO或sAPO。sAPO是可选的APO,可以插入Windows音频引擎管道内的各个点。
sAPO可以用于任意过滤系统范围内运行的所有Windows应用程序的音频;而且,由于它们直接在Windows音频引擎中运行,因此可以以非常干净和高效的方式运行,无需额外的转换和零附加延迟。
音频处理按位置可分为三种:
- 流式音效Stream effects (SFX)
- 模式音效Mode effects (MFX)
- 端点音效 Endpoint effects (EFX)
在Windows8.1之前,APO被分为LFX和GFX.
Type | Property ID | Property name |
---|---|---|
SFX | {d04e05a6-594b-4fb6-a80d-01af5eed7d1d},5 | PKEY_FX_StreamEffectClsid |
MFX | {d04e05a6-594b-4fb6-a80d-01af5eed7d1d},6 | PKEY_FX_ModeEffectClsid |
EFX | {d04e05a6-594b-4fb6-a80d-01af5eed7d1d},7 | PKEY_FX_EndpointEffectClsid |
LFX | {d04e05a6-594b-4fb6-a80d-01af5eed7d1d},1 | PKEY_FX_PreMixEffectClsid |
GFX | {d04e05a6-594b-4fb6-a80d-01af5eed7d1d},2 | PKEY_FX_PostMixEffectClsid |
{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},12 | PKEY_FX_Offload_ModeEffectClsid | |
{d04e05a6-594b-4fb6-a80d-01af5eed7d1d},11 | PKEY_FX_Offload_StreamEffectClsid | |
{D3993A3F-99C2-4402-B5EC-A92A0367664B},11 | PKEY_SFX_Offload_ProcessingModes_Supported_For_Streaming | |
{D3993A3F-99C2-4402-B5EC-A92A0367664B},12 | PKEY_MFX_Offload_ProcessingModes_For_Streaming | |
{D3993A3F-99C2-4402-B5EC-A92A0367664B},7 | PKEY_EFX_ProcessingModes_Supported_For_Streaming | |
{D3993A3F-99C2-4402-B5EC-A92A0367664B},6 | PKEY_MFX_ProcessingModes_For_Streaming | |
{D3993A3F-99C2-4402-B5EC-A92A0367664B},5 | PKEY_SFX_ProcessingModes_For_Streaming |
Audio INF File Settings:https://learn.microsoft.com/en-us/windows-hardware/drivers/audio/media-class-inf-extensions
流式音效Stream effects (SFX)
对于流式音效SFX,每个音频流都有一个APO实例。流式音效在在音频信号进出单个应用程序时对其进行处理。故流式音频对于Render设备而言,位于混音之前;对于Capture设备而言,位于拾音之后。所以流式音频可以在混音之前,更改音频通道数量。
模式音效Mode effects (MFX)
模式音效MFX,用于对具人相同模式的音频流处理。
模式音效用于给定模式的混音之后。模式音频更省电,因为多个流有一个实例,它们共享相同的特征,如周期性和格式
模式音频在中间阶段运行,对共享一个共同模式的所有流的混合音频。
端点音效 (EFX)
端点效果 (EFX) 对进出音频设备的音频信号进行操作,应用于使用相同端点的所有流。
LFX,GFX
- Local Effect (LFX) APOs 也称为pre-mix APOs(预混音APO),与SFX APO具有相同的用途。
- Global Effect (GFX) APOs,混合后APO,与EFX APO具有相同的用途。
LFX和GFX APO仍然可以在现代版本的Windows中使用,但它们不再出现在文档中;它们应该被视为已弃用。如果同时配置了现代(SFX/MFX/EFX)和传统(LFX/GFX)sAPO,则Windows将使用现代sAPO。
所有APO的禁用与启用
一个值得注意的属性是PKEY_AudioEndpoint_Disable_SysFx({1da5d803-d492-4edd-8c23-e0c0ffee7f0e},5,DWORD),如果设置为1,则禁用所有sAPO。它映射到Windows音频设备设置中的“启用音频增强”复选框。
static const wchar_t* disableEnhancementsValueName = L"{1da5d803-d492-4edd-8c23-e0c0ffee7f0e},5";
所以如果要使用当前设备的APO,如果有些项,需要删除注册表.
#define commonKeyPath L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio"
#define renderKeyPath commonKeyPath L"\\Render"
#define captureKeyPath commonKeyPath L"\\Capture"
wstring keyPath = captureKeyPath L"\\" + deviceGuidStrings[i];
// force-enable enhancements
if (RegistryHelper::valueExists(keyPath + L"\\FxProperties", disableEnhancementsValueName))
RegistryHelper::deleteValue(keyPath + L"\\FxProperties", disableEnhancementsValueName);
参考文档:https://github.com/dechamps/APO