不播放声音,如何将应用添加至Windows音频混音器以创建IAudioSessionControl2?
无需播放音频即可创建IAudioSessionControl2的解决方案
核心思路是:Windows的音频会话与IAudioClient实例绑定,只要初始化一个静默的音频客户端(无需播放实际音频数据),系统就会自动为你的应用创建音频混音器会话,进而可以直接获取IAudioSessionControl2接口实现自定义音量控制。
具体实现步骤
- 初始化
MMDeviceEnumerator,获取系统默认的音频渲染设备(如扬声器) - 创建
IAudioClient实例,通过GetMixFormat获取系统默认的音频格式 - 调用
IAudioClient::Initialize初始化客户端,使用共享模式并设置AUDCLNT_STREAMFLAGS_NOPERSIST(避免会话持久化),无需启动播放 - 通过
IAudioClient::GetService直接获取IAudioSessionControl2接口
C++代码示例
#include <mmdeviceapi.h> #include <audioclient.h> #include <functiondiscoverykeys_devpkey.h> HRESULT CreateSilentAudioSession(IAudioSessionControl2** ppSessionControl) { HRESULT hr = S_OK; IMMDeviceEnumerator* pEnumerator = nullptr; IMMDevice* pDevice = nullptr; IAudioClient* pAudioClient = nullptr; WAVEFORMATEX* pMixFormat = nullptr; // 创建音频设备枚举器 hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pEnumerator); if (FAILED(hr)) goto cleanup; // 获取默认多媒体渲染设备 hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice); if (FAILED(hr)) goto cleanup; // 激活音频客户端 hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, nullptr, (void**)&pAudioClient); if (FAILED(hr)) goto cleanup; // 获取系统默认混合格式 hr = pAudioClient->GetMixFormat(&pMixFormat); if (FAILED(hr)) goto cleanup; // 初始化音频客户端(不启动播放,仅创建会话) hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_NOPERSIST, 0, 0, pMixFormat, nullptr); if (FAILED(hr)) goto cleanup; // 获取IAudioSessionControl2接口 hr = pAudioClient->GetService(__uuidof(IAudioSessionControl2), (void**)ppSessionControl); cleanup: // 释放资源 CoTaskMemFree(pMixFormat); if (pAudioClient) pAudioClient->Release(); if (pDevice) pDevice->Release(); if (pEnumerator) pEnumerator->Release(); return hr; }
关键说明
- 无需调用
IAudioClient::Start()播放任何数据,初始化客户端后系统就会创建音频会话,混音器中会立即显示你的应用 - 可以通过
IAudioSessionControl2::SetDisplayName设置会话的自定义显示名称,优化混音器中的展示效果 - 这种方式和Firefox、旧版Windows Media Player的实现逻辑一致,完全不需要嵌入或播放空白音频文件
内容的提问来源于stack exchange,提问作者Codrut
相关产品推荐
相关产品推荐

