我想要像vista和xp中的Get/SetMasterVolume那樣以編程方式調整體積?使用mmsystem單元?如何在vista/xp中調整主卷體積
4
A
回答
2
這裏有一個通用的API,用於音頻的實現:MMDevApi
和示例一個按鈕
unit Unit33;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, MMDevApi, ActiveX, StdCtrls;
type
TForm33 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form33: TForm33;
endpointVolume: IAudioEndpointVolume = nil;
implementation
{$R *.dfm}
procedure TForm33.Button1Click(Sender: TObject);
var
VolumeLevel: Single;
begin
if endpointVolume = nil then Exit;
VolumeLevel := 0.50;
endpointVolume.SetMasterVolumeLevelScalar(VolumeLevel, nil);
Caption := Format('%1.8f', [VolumeLevel])
end;
procedure TForm33.FormCreate(Sender: TObject);
var
deviceEnumerator: IMMDeviceEnumerator;
defaultDevice: IMMDevice;
begin
CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_INPROC_SERVER, IID_IMMDeviceEnumerator, deviceEnumerator);
deviceEnumerator.GetDefaultAudioEndpoint(eRender, eConsole, defaultDevice);
defaultDevice.Activate(IID_IAudioEndpointVolume, CLSCTX_INPROC_SERVER, nil, endpointVolume);
end;
end.
2
的Windows XP:
function SetMasterVolume(VolToSet: word; out VolSet: word): MMResult;
var
MixerHandle: HMixer;
Volume: TMixerControlDetails_Unsigned;
MixerLine: TMixerLine;
MixerLineControls: TMixerLineControls;
VolumeCtrl: TMixerControl;
MixerControlDetails: TMixerControlDetails;
begin
// Get mixer handle
Result := mixerOpen(@MixerHandle, 0, 0, 0, 0);
if Result <> MMSYSERR_NOERROR then Exit;
try
// Get master volume line
FillChar(MixerLine, SizeOf(TMixerLine), 0);
MixerLine.cbStruct := SizeOf(TMixerLine);
MixerLine.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
Result := mixerGetLineInfo(MixerHandle, @MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE);
if Result <> MMSYSERR_NOERROR then Exit;
// Get the volume control of the master volume line
FillChar(VolumeCtrl, SizeOf(TMixerControl), 0);
MixerLineControls.cbStruct := SizeOf(TMixerLineControls);
MixerLineControls.dwLineID := MixerLine.dwLineID;
MixerLineControls.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
MixerLineControls.cControls := 1;
MixerLineControls.cbmxctrl := SizeOf(TMixerControl);
MixerLineControls.pamxctrl := @VolumeCtrl;
Result := mixerGetLineControls(MixerHandle,@MixerLineControls,MIXER_GETLINECONTROLSF_ONEBYTYPE);
if Result <> MMSYSERR_NOERROR then Exit;
// Set details (volume) for the volume control of the master volume line
FillChar(MixerControlDetails, SizeOf(TMixerControlDetails), 0);
MixerControlDetails.cbStruct := SizeOf(TMixerControlDetails);
MixerControlDetails.dwControlID := VolumeCtrl.dwControlID;
MixerControlDetails.cChannels := 1;
MixerControlDetails.cMultipleItems := 0;
MixerControlDetails.cbDetails := SizeOf(TMixerControlDetails_Unsigned);
MixerControlDetails.paDetails := @Volume;
Volume.dwValue := VolToSet;
Result := mixerSetControlDetails(MixerHandle, @MixerControlDetails,MIXER_SETCONTROLDETAILSF_VALUE);
finally
mixerClose(MixerHandle);
end;
end;
而請致電:
var y:word;
begin
SetMasterVolume(2000,y);
end;
0
的MMDevApi有一些不正確的聲明。雙參數應該是單一的。布爾參數更適合整數。許多如果不是所有的TGUID參數都應該是PGUID。糾正聲明後,我可以設置靜音和音量。
1
最終代碼是(德爾福7):
unit DevUnit;
interface
uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
const
// TypeLibrary Major and minor versions
CLASS_IMMDeviceEnumerator: TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
IID_IMMDeviceEnumerator: TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
IID_IMMDevice: TGUID = '{D666063F-1587-4E43-81F1-B948E807363F}';
IID_IMMDeviceCollection: TGUID = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
IID_IAudioEndpointVolume: TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
IID_IAudioMeterInformation : TGUID = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
IID_IAudioEndpointVolumeCallback: TGUID = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
DEVICE_STATE_ACTIVE = $00000001;
DEVICE_STATE_UNPLUGGED = $00000002;
DEVICE_STATE_NOTPRESENT = $00000004;
DEVICE_STATEMASK_ALL = $00000007;
type
EDataFlow = TOleEnum;
const
eRender = $00000000;
eCapture = $00000001;
eAll = $00000002;
EDataFlow_enum_count = $00000003;
type
ERole = TOleEnum;
const
eConsole = $00000000;
eMultimedia = $00000001;
eCommunications = $00000002;
ERole_enum_count = $00000003;
type
IAudioEndpointVolumeCallback = interface(IUnknown)
['{657804FA-D6AD-4496-8A60-352752AF4F89}']
end;
IMMAudioEndpointVolume = interface(IUnknown)
['{5CDF2C82-841E-4546-9722-0CF74078229A}']
Function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
Function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
Function GetChannelCount(out PInteger): Integer; stdcall;
Function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID):Integer; stdcall;
Function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID):Integer; stdcall;
Function GetMasterVolumeLevel(out fLevelDB: single):Integer; stdcall;
Function GetMasterVolumeLevelScaler(out fLevel: single):Integer; stdcall;
Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: single; pguidEventContext: PGUID):Integer; stdcall;
Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: single; pguidEventContext: PGUID):Integer; stdcall;
Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: single) : Integer; stdcall;
Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: single) : Integer; stdcall;
Function SetMute(bMute: Boolean ; pguidEventContext: PGUID) :Integer; stdcall;
Function GetMute(out bMute: Boolean) :Integer; stdcall;
Function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
Function VolumeStepUp(pguidEventContext: PGUID) :Integer; stdcall;
Function VolumeStepDown(pguidEventContext: PGUID) :Integer; stdcall;
Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
Function GetVolumeRange(out pflVolumeMindB: single; out pflVolumeMaxdB: single; out pflVolumeIncrementdB: single): Integer; stdcall;
end;
IPropertyStore = interface(IUnknown)
end;
type
IMMDevice = interface(IUnknown)
['{D666063F-1587-4E43-81F1-B948E807363F}']
Function Activate( refId :PGUID;
dwClsCtx: DWORD;
pActivationParams: PInteger ;
out pEndpointVolume: IMMAudioEndpointVolume): 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: EDataFlow; 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;
implementation
end.
相關問題
- 1. 在TensorFlow中卷積整數張量
- 2. 如何在Scilab中執行解卷積
- 3. 如何在CUDA中卷積圖像
- 4. 卷積在Python
- 5. Tensorflow:在卷積
- 6. 轉置卷積(反捲積)算法
- 7. Golang中的卷積
- 8. openstack-cinder,如何調整卷的大小?
- 9. apache2如何調整主機?
- 10. 如何在FormLayoutPanel中調整窗體的大小時調整窗體的大小?
- 11. 如何在Windows XP中獲得主卷?
- 12. 2D自解卷積在MATLAB
- 13. Tensorflow中的Dialated卷積
- 14. C++中的3d卷積
- 15. python中的2D卷積
- 16. 如何在Theano中使卷積中的image_shape動態化
- 17. 如何去卷積2D數據幀?
- 18. 卷積矩陣如何工作?
- 19. 如何確定卷積是否可分?
- 20. 如何矢量化3x3 2D卷積?
- 21. Caffe的卷積真的如何工作?
- 22. 這是在普通卷積神經網絡中進行的基本卷積嗎?
- 23. 爲什麼卷積濾波器在卷積神經網絡中翻轉?
- 24. 調整glRotate,使用點積
- 25. 與caffe解卷積
- 26. Matlab的卷積碼
- 27. 在matlab中查找卷積核
- 28. fft/ifft在Matlab中的解卷積
- 29. 如何在Flash PaperVision3D中調整Collada模型的整體Alpha值?
- 30. 調整大小主窗體調整大小(WPF,C#)
它的工作原理與Vista,但它dosnt在XP工作 – XBasic3000 2010-08-09 08:06:02
對不起,我找不到任何關於XP作品,未經SP3版本;也許http://delphi.about.com/cs/adptips2000/a/bltip0800_4.htm或http://www.torry.net/vcl/sound/mixer/amixer.zip或http://www.area-6 .co.uk/delphihard.htm – 2010-08-11 06:49:03