delphi - How to check if the system master volume is mute or unmute? -
i'm using code mute/unmute system master volume:
const appcommand_volume_mute = $80000; wm_appcommand = $319; procedure tform1.button1click(sender: tobject); begin // toggle mute/unmute sendmessagew(handle, wm_appcommand, handle, appcommand_volume_mute); end;
(got code https://stackoverflow.com/a/154128/1140885)
it works fine on xp (didn't test on win7 yet).
need method check (get) current "mute" state? mute or not.
ideas?
update: xp ended using code here: how master volume in windows xp? (thanks @sertac akyuz)
i had change single line:
mxlc.dwcontroltype := mixercontrol_controltype_volume;
to:
mxlc.dwcontroltype := mixercontrol_controltype_mute;
return value either 0 (not mute) or 1 (mute).
starting windows vista must use core audio sdk
control windows audio. check if master volume muted must use iaudioendpointvolume.getmute
method.
try sample code
{$apptype console} uses sysutils, windows, activex, comobj; const class_immdeviceenumerator : tguid = '{bcde0395-e52f-467c-8e3d-c4579291692e}'; iid_immdeviceenumerator : tguid = '{a95664d2-9614-4f35-a746-de8db63617e6}'; iid_iaudioendpointvolume : tguid = '{5cdf2c82-841e-4546-9722-0cf74078229a}'; type iaudioendpointvolumecallback = interface(iunknown) ['{657804fa-d6ad-4496-8a60-352752af4f89}'] end; iaudioendpointvolume = interface(iunknown) ['{5cdf2c82-841e-4546-9722-0cf74078229a}'] function registercontrolchangenotify(audioendptvol: iaudioendpointvolumecallback): hresult; stdcall; function unregistercontrolchangenotify(audioendptvol: iaudioendpointvolumecallback): hresult; stdcall; function getchannelcount(out pinteger): hresult; stdcall; function setmastervolumelevel(fleveldb: single; pguideventcontext: pguid): hresult; stdcall; function setmastervolumelevelscalar(fleveldb: single; pguideventcontext: pguid): hresult; stdcall; function getmastervolumelevel(out fleveldb: single): hresult; stdcall; function getmastervolumelevelscaler(out fleveldb: single): hresult; stdcall; function setchannelvolumelevel(nchannel: integer; fleveldb: double; pguideventcontext: pguid): hresult; stdcall; function setchannelvolumelevelscalar(nchannel: integer; fleveldb: double; pguideventcontext: pguid): hresult; stdcall; function getchannelvolumelevel(nchannel: integer; out fleveldb: double): hresult; stdcall; function getchannelvolumelevelscalar(nchannel: integer; out flevel: double): hresult; stdcall; function setmute(bmute: boolean; pguideventcontext: pguid): hresult; stdcall; function getmute(out bmute: boolean): hresult; stdcall; function getvolumestepinfo(pnstep: integer; out pnstepcount: integer): hresult; stdcall; function volumestepup(pguideventcontext: pguid): hresult; stdcall; function volumestepdown(pguideventcontext: pguid): hresult; stdcall; function queryhardwaresupport(out pdwhardwaresupportmask): hresult; stdcall; function getvolumerange(out pflvolumemindb: double; out pflvolumemaxdb: double; out pflvolumeincrementdb: double): hresult; stdcall; end; iaudiometerinformation = interface(iunknown) ['{c02216f6-8c67-4b5b-9d00-d008e73e0064}'] end; ipropertystore = interface(iunknown) end; immdevice = interface(iunknown) ['{d666063f-1587-4e43-81f1-b948e807363f}'] function activate(const refid: tguid; dwclsctx: dword; pactivationparams: pinteger; out pendpointvolume: iaudioendpointvolume): hresult; stdcall; function openpropertystore(stgmaccess: dword; out ppproperties: ipropertystore): hresult; stdcall; function getid(out ppstrid: plpwstr): hresult; stdcall; function getstate(out state: integer): hresult; stdcall; end; immdevicecollection = interface(iunknown) ['{0bd7a1be-7a1a-44db-8397-cc5392387b5e}'] end; immnotificationclient = interface(iunknown) ['{7991eec9-7e89-4d85-8390-6c703cec60c0}'] end; immdeviceenumerator = interface(iunknown) ['{a95664d2-9614-4f35-a746-de8db63617e6}'] function enumaudioendpoints(dataflow: toleenum; devicestate: sysuint; devcollection: immdevicecollection): hresult; stdcall; function getdefaultaudioendpoint(edf: sysuint; er: sysuint; out dev :immdevice ): hresult; stdcall; function getdevice(pwstrid: pointer; out dev: immdevice): hresult; stdcall; function registerendpointnotificationcallback(pclient: immnotificationclient): hresult; stdcall; end; function ismastervolumemute : boolean; var pendpointvolume: iaudioendpointvolume; ldeviceenumerator: immdeviceenumerator; dev: immdevice; bmute: boolean; begin if not succeeded(cocreateinstance(class_immdeviceenumerator, nil, clsctx_inproc_server, iid_immdeviceenumerator, ldeviceenumerator)) raiselastoserror; if not succeeded(ldeviceenumerator.getdefaultaudioendpoint($00000000, $00000000, dev)) raiselastoserror; if not succeeded( dev.activate(iid_iaudioendpointvolume, clsctx_inproc_server, nil, pendpointvolume)) raiselastoserror; if not succeeded(pendpointvolume.getmute(bmute)) raiselastoserror else result:=bmute; end; begin try coinitialize(nil); try writeln(format('master volume mute ? : %s',[booltostr(ismastervolumemute, true)])); couninitialize; end; except on e:exception writeln(e.classname, ':', e.message); end; writeln('press enter exit'); readln; end.
Comments
Post a Comment