Subversion Repositories alarming

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 daniel-mar 1
unit AudioVolCntrl;
2
 
3
interface
4
 
5
uses
6
  Windows, SysUtils;
7
 
8
procedure MuteAllAudioDevices(bMute: boolean);
9
 
10
implementation
11
 
12
uses
13
  ActiveX, ComObj;
14
 
15
type
16
  // https://stackoverflow.com/questions/49310147/iaudioendpointvolume-setmode-fails-with-a-call-to-an-os-function-failed
17
  BOOL = Cardinal;
18
 
19
const
20
  CLSID_MMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
21
  IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
22
  IID_IMMDevice : TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
23
  IID_IMMDeviceCollection : TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
24
  IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
25
  IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
26
  IID_IAudioEndpointVolumeCallback : TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
27
  IID_IMMNotificationClient : TGUID = '{7991EEC9-7E89-4D85-8390-6C703CEC60C0}';
28
 
29
  DEVICE_STATE_ACTIVE = $00000001;
30
  DEVICE_STATE_UNPLUGGED = $00000002;
31
  DEVICE_STATE_NOTPRESENT = $00000004;
32
  DEVICE_STATEMASK_ALL = $00000007;
33
 
34
type
35
  EDataFlow = TOleEnum;
36
 
37
const
38
  eRender = $00000000;
39
  eCapture = $00000001;
40
  eAll = $00000002;
41
  EDataFlow_enum_count = $00000003;
42
 
43
type
44
  ERole = TOleEnum;
45
 
46
const
47
  eConsole = $00000000;
48
  eMultimedia = $00000001;
49
  eCommunications = $00000002;
50
  ERole_enum_count = $00000003;
51
 
52
type
53
  IAudioEndpointVolumeCallback = interface(IUnknown)
54
  ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
55
  end;
56
 
57
  IAudioEndpointVolume = interface(IUnknown)
58
  ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
59
    function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): HRESULT; stdcall;
60
    function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): HRESULT; stdcall;
61
    function GetChannelCount(out PInteger): HRESULT; stdcall;
62
    function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): HRESULT; stdcall;
63
    function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): HRESULT; stdcall;
64
    function GetMasterVolumeLevel(out fLevelDB: single): HRESULT; stdcall;
65
    function GetMasterVolumeLevelScaler(out fLevelDB: single): HRESULT; stdcall;
66
    function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: Single; pguidEventContext: PGUID): HRESULT; stdcall;
67
    function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: Single; pguidEventContext: PGUID): HRESULT; stdcall;
68
    function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: Single): HRESULT; stdcall;
69
    function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: Single): HRESULT; stdcall;
70
    function SetMute(bMute: Boolean(*!*); pguidEventContext: PGUID): HRESULT; stdcall;
71
    function GetMute(out bMute: Boolean(*!*)): HRESULT; stdcall;
72
    function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): HRESULT; stdcall;
73
    function VolumeStepUp(pguidEventContext: PGUID): HRESULT; stdcall;
74
    function VolumeStepDown(pguidEventContext: PGUID): HRESULT; stdcall;
75
    function QueryHardwareSupport(out pdwHardwareSupportMask): HRESULT; stdcall;
76
    function GetVolumeRange(out pflVolumeMindB: Single; out pflVolumeMaxdB: Single; out pflVolumeIncrementdB: Single): HRESULT; stdcall;
77
  end;
78
 
79
  IAudioMeterInformation = interface(IUnknown)
80
  ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}']
81
    function GetPeakValue(out Peak: Real): HRESULT; stdcall;
82
  end;
83
 
84
  IPropertyStore = interface(IUnknown)
85
  end;
86
 
87
  IMMDevice = interface(IUnknown)
88
  ['{D666063F-1587-4E43-81F1-B948E807363F}']
89
    function Activate(const refId: TGUID; dwClsCtx: DWORD; pActivationParams: PInteger; out pEndpointVolume: IAudioEndpointVolume): HRESULT; stdCall;
90
    function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): HRESULT; stdcall;
91
    function GetId(out ppstrId: PLPWSTR): HRESULT; stdcall;
92
    function GetState(out State: Integer): HRESULT; stdcall;
93
  end;
94
 
95
  IMMDeviceCollection = interface(IUnknown)
96
  ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}']
97
    function GetCount(out pcDevices: UINT): HRESULT; stdcall;
98
    function Item(nDevice: UINT; out ppDevice: IMMDevice): HRESULT; stdcall;
99
  end;
100
 
101
  IMMNotificationClient = interface(IUnknown)
102
  ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}']
103
  end;
104
 
105
  IMMDeviceEnumerator = interface(IUnknown)
106
  ['{A95664D2-9614-4F35-A746-DE8DB63617E6}']
107
    function EnumAudioEndpoints(dataFlow: EDataFlow; deviceState: SYSUINT; out DevCollection: IMMDeviceCollection): HRESULT; stdcall;
108
    function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev: IMMDevice): HRESULT; stdcall;
109
    function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HRESULT; stdcall;
110
    function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): HRESULT; stdcall;
111
    function UnregisterEndpointNotificationCallback(pClient: IMMNotificationClient): HRESULT; stdcall;
112
  end;
113
 
114
procedure MuteAllAudioDevices(bMute: boolean);
115
var
116
  MMDeviceCollection: IMMDeviceCollection;
117
  MMDeviceEnumerator: IMMDeviceEnumerator;
118
  nDevCount: UINT;
119
  dev: IMMdevice;
120
  pEndpointVolume: IAudioEndpointVolume;
121
  iDev: Integer;
122
begin
123
  MMDeviceEnumerator := nil;
124
  OleCheck(CoCreateInstance(CLSID_MMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, MMDeviceEnumerator));
125
 
126
  MMDeviceCollection := nil;
127
  OleCheck(MMDeviceEnumerator.EnumAudioEndpoints(eRender, DEVICE_STATE_ACTIVE, MMDeviceCollection));
128
 
129
  OleCheck(MMDeviceCollection.GetCount(nDevCount));
130
 
131
  for iDev := 0 to nDevCount - 1 do
132
  begin
133
    OleCheck(MMDeviceCollection.item(iDev, dev));
134
    OleCheck(Dev.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, pEndpointVolume));
135
    OleCheck(pEndpointVolume.SetMute(bMute, nil));
136
  end;
137
end;
138
 
139
end.