在Windows上隐藏其他应用程序的音频

xwbd5t1u  于 2023-11-21  发布在  Windows
关注(0)|答案(1)|浏览(175)

我试图激活Windows默认的自动音频回避:mmsys.cpl->“通信选项卡”,在我的C++桌面应用程序中,这样我就可以只回避其余应用程序的音频,而不是我的音频,这样任何重要的音频都可以听到,而不会被背景重叠。
问题是,我不仅回避了其他应用程序的音频- Spotify,像YouTube这样的浏览器音频,还有我的应用程序的音频。
我已经从this Microsoft示例中提取了音频回避功能,可以从here下载。
注意到当前应用程序的音频也被隐藏的最明显的方法是将Windows声音设置中的音频隐藏设置设置为“静音所有其他声音”,如here所示。
据我所知,上面提供的音频回避示例模拟了一个通信会话/活动-WASAPI聊天。我认为这是我的音频也被回避的原因,因为尽管我的应用程序打开了一个通信流,但微软示例中的这个示例通信活动可能在优先级方面覆盖了我的应用程序的音频。这只是一个假设/假设。假设应该在示例代码的this部分中进行更改。
我愿意接受所有应该修复/更改/添加的建议。我再次确认我想使用所谓的“自动”,或者我会说是Windows提供的现成的集成音频ducking-上面屏幕截图中显示的那个。我不想通过将其他应用程序的音量降低到任意级别来提供自定义的ducking行为。
有两个API直接提到了音频隐藏:IAudioSessionControl2::SetDuckingPreferenceIAudioClientDuckingControl::SetDuckingOptionsForCurrentStream
第一个只在自动躲避行为和自定义行为之间切换,即自动关闭。我目前正在测试第二个。它的问题是最低要求的Windows版本。

mlnl4t2r

mlnl4t2r1#

下面是触发音频回避的最小代码:

  1. CComPtr<IMMDeviceEnumerator> deviceEnumerator;
  2. HRESULT hr = CoCreateInstance(
  3. __uuidof(MMDeviceEnumerator),
  4. nullptr,
  5. CLSCTX_ALL /* CLSCTX_INPROC_SERVER */,
  6. IID_PPV_ARGS(&deviceEnumerator));
  7. if (FAILED(hr))
  8. {
  9. return;
  10. }
  11. CComPtr<IMMDevice> communicationsDevice;
  12. hr = deviceEnumerator->GetDefaultAudioEndpoint(
  13. eRender, // eCapture for microphone
  14. eCommunications,
  15. &communicationsDevice);
  16. if (FAILED(hr))
  17. {
  18. return;
  19. }
  20. CComPtr<IAudioClient3> audioClient;
  21. hr = communicationsDevice->Activate(
  22. __uuidof(IAudioClient3),
  23. CLSCTX_ALL /* CLSCTX_INPROC_SERVER */,
  24. nullptr,
  25. reinterpret_cast<LPVOID*>(&audioClient));
  26. if (FAILED(hr))
  27. {
  28. return;
  29. }
  30. WAVEFORMATEX* mixFormat = nullptr;
  31. hr = audioClient->GetMixFormat(&mixFormat);
  32. if (FAILED(hr))
  33. {
  34. return false;
  35. }
  36. hr = audioClient->Initialize(
  37. AUDCLNT_SHAREMODE_SHARED,
  38. AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE
  39. | AUDCLNT_STREAMFLAGS_EVENTCALLBACK
  40. | AUDCLNT_STREAMFLAGS_NOPERSIST,
  41. 500000,
  42. 0,
  43. mixFormat,
  44. nullptr);
  45. if (FAILED(hr))
  46. {
  47. return;
  48. }
  49. CoTaskMemFree(mixFormat);
  50. mixFormat = nullptr;
  51. hr = audioClient->Start();
  52. if (FAILED(hr))
  53. {
  54. return;
  55. }

字符串
此外,还有缓冲区操作--初始的和单独的线程上的,但它们似乎不是触发音频回避的最低要求的一部分。

展开查看全部

相关问题