Jer*_*dge 6 delphi audio volume delphi-xe2
我有一个有声音的应用程序.我有一个全球属性来静音.问题是,有很多不同的东西可以发出声音,我讨厌迭代不同的类类型并静音/取消静音.相反,我正在寻找一种在全局应用程序级别上静音的方法.我并不是说要将整个系统音量静音.
一种情况:在Windows 7中,您可以打开音量混合器并调整各个应用程序的音量.虽然我不打算改变这个实际的特定值(因为我知道它是特定于Windows 7的),但我想一次性更改应用程序中所有内容的数量.我还需要完全静音应用程序中所有内容的声音.我需要这种能力与Windows XP及更高版本兼容.我假设它将涉及Windows API调用,但我不知道调用什么.
你所要求的在 XP 上是不可能的;操作系统根本不支持每个应用程序的音量级别。
您可以通过创建一个保留类似SoundActive: Boolean或PlaySounds: Boolean类似内容的设置类来完成您想要的任务。将它放在它自己的单元中,并有一个初始化部分来创建它的实例,还有一个终结部分来释放它(使其有效地成为全局值的集合)。
每个需要访问这些设置的单元只需使用包含它们的单元,并相应地调整行为。因此,您的每个孩子的班级或表格或其他任何内容都只需要添加一张支票:
if CurrentSettings.PlaySounds then
// Code that makes sounds, plays music, whatever.
Run Code Online (Sandbox Code Playgroud)
设置类还可以包含跟踪当前音量级别(在 XP 上,系统范围级别)的方法,以及使用音量MMSystem函数增加或减少音量的方法(这里和 Google 上有大量这样做的示例) )。然后,您的应用程序可以使用OnActivate和OnDeactivate事件来设置应用程序获得焦点时的音量级别,并在应用程序失去焦点时将其恢复到适当的音量。
在 Vista 及更高版本中,您可以使用IAudioEndPointVolume我之前提到的接口以及 或GetMasterVolumeLevel方法SetMasterVolumeLevel来控制系统范围的音量(我有一个执行此操作的示例以及适当的MMDevAPI接口定义)或设备级别音量(用于IMMDevioce.Activate选择正确的设备)首先,然后在参数中IAudioEndPointVolume接收设备接口上的上述方法)。IMMDevice.ActivateppInterface
对于单个应用程序,您可以使用该ISimpleAudioVolume接口,该接口有四种方法:GetMasterVolume和SetMasterVolume,它们控制应用程序音频会话的音量级别,并且GetMute和SetMute允许您检索当前静音标志值或分别设置它。(MS 的 Larry Osterman 是 Vista 和 Win7 中新音频支持的开发人员之一,他的博客上有一篇很好的起点文章,介绍了新 API 中的音频类型以及何时使用每种音频。 )
从概念上讲,可以在运行时确定您正在使用哪个操作系统,并以编程方式在使用MMSystemXP 及更早版本上的功能和MMDevAPIVista 及更高版本上的功能之间进行切换。然而,期望这里有人提供这样做的代码有点不合理。我提供的链接应该可以帮助您走上正确的道路,当您遇到障碍时,解决这些障碍的具体帮助将是很好的问题。