我有一个音乐播放器程序,可以创建一个
IAudioSessionControl2
。这是为了能够更改其自己的自定义音量混合器音量所必需的。
问题是,当应用程序没有音频混合器实例时,无法创建
IAudioSessionControl2
,为了创建音频混合器实例,我需要使用 PlaySound()
函数或任何其他音频来播放一些声音。 Windows 在播放一些声音后将实例添加到应用程序。
我可以使用的一个解决方案是制作一个空白波形并在创建应用程序时播放它,但这感觉很麻烦,而且我需要通过资源将文件嵌入到应用程序中。
某些应用程序(例如 Firefox 或 Windows Media Player 旧版)在打开时能够执行此操作,即使它们没有播放任何声音。
那么,是否有一个更优雅的解决方案可以将应用程序添加到音量混合器而不使用任何类型的空白音频文件?
按照
SilverWarior
的建议查看IAudioSessionManager2,按照this文档,我能够创建以下函数,将应用程序添加到音量混合器:
procedure ActivateAudioSession;
var
AEnumerator: IMMDeviceEnumerator;
ADevice: IMMDevice;
ASessionManager: IAudioSessionManager2;
ASessionControl: IAudioSessionControl;
begin
// Initialize COM
CoInitialize(nil);
try
// Create an instance of the device enumerator
CoCreateInstance(CLSID_MMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, AEnumerator);
AEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, ADevice);
ADevice.Activate(IID_IAudioSessionManager2, CLSCTX_ALL, nil, ASessionManager);
// Create session
ASessionManager.GetAudioSessionControl(nil, 0, ASessionControl);
finally
CoUninitialize;
end;
end;