Как изменить уровень громкости микрофона?

uses
 MMSystem;
// Set the volume for the microphone
function SetMicrophoneVolume(bValue: Word): Boolean;
var {0..65535}
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
begin
 // Check if Mixer is available
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
 Exit;
 end;
 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
 mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
 mxl.cbStruct := SizeOf(mxl);
 // get line info
 intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
 if intRet = MMSYSERR_NOERROR then
 begin
 ZeroMemory(@mxlc, SizeOf(mxlc));
 mxlc.cbStruct := SizeOf(mxlc);
 mxlc.dwLineID := mxl.dwLineID;
 mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
 mxlc.cControls := 1;
 mxlc.cbmxctrl := SizeOf(mxc);
 mxlc.pamxctrl := @mxc;
 intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
 if intRet = MMSYSERR_NOERROR then
 begin
 {
 // Microphone Name
 Label1.Caption := mxlc.pamxctrl.szName;
 // Min/Max Volume
 Label2.Caption := IntToStr(mxc.Bounds.dwMinimum) + '->' + IntToStr(mxc.Bounds.dwMaximum);
 }
 ZeroMemory(@mxcd, SizeOf(mxcd));
 mxcd.dwControlID := mxc.dwControlID;
 mxcd.cbStruct := SizeOf(mxcd);
 mxcd.cMultipleItems := 0;
 mxcd.cbDetails := SizeOf(Vol);
 mxcd.paDetails := @vol;
 mxcd.cChannels := 1;
 // vol.dwValue := mxlc.pamxctrl.Bounds.lMinimum; Set min. Volume / Minimum setzen
 // vol.dwValue := mxlc.pamxctrl.Bounds.lMaximum; Set max. Volume / Maximum setzen
 vol.dwValue := bValue;
 intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
 if intRet <> MMSYSERR_NOERROR then
 ShowMessage('SetControlDetails Error');
 end
 else
 ShowMessage('GetLineInfo Error');
 end;
 intRet := mixerClose(hMix);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 SetMicrophoneVolume(30000);
end;
{********************************************************}
// Enable/disable "Mute Microphone Volume"
function SetMicrophoneVolumeMute(bMute: Boolean): Boolean;
var
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
 mcdMute: MIXERCONTROLDETAILS_BOOLEAN;
begin
 // Check if Mixer is available
 // Uberprufen, ob ein Mixer vorhanden ist
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
 Exit;
 end;
 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
 mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
 mxl.cbStruct := SizeOf(mxl);
 // mixerline info
 intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
 if intRet = MMSYSERR_NOERROR then
 begin
 ZeroMemory(@mxlc, SizeOf(mxlc));
 mxlc.cbStruct := SizeOf(mxlc);
 mxlc.dwLineID := mxl.dwLineID;
 mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
 mxlc.cControls := 1;
 mxlc.cbmxctrl := SizeOf(mxc);
 mxlc.pamxctrl := @mxc;
 // Get the mute control
 intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
 if intRet = MMSYSERR_NOERROR then
 begin
 ZeroMemory(@mxcd, SizeOf(mxcd));
 mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);
 mxcd.dwControlID := mxc.dwControlID;
 mxcd.cChannels := 1;
 mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);
 mxcd.paDetails := @mcdMute;
 mcdMute.fValue := Ord(bMute);
 // set, unset mute
 intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
 {
 mixerGetControlDetails(hMix, @mxcd,
 MIXER_GETCONTROLDETAILSF_VALUE);
 Result := Boolean(mcdMute.fValue);
 }
 Result := intRet = MMSYSERR_NOERROR;
 if intRet <> MMSYSERR_NOERROR then
 ShowMessage('SetControlDetails Error');
 end
 else
 ShowMessage('GetLineInfo Error');
 end;
 intRet := mixerClose(hMix);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 SetMicrophoneVolumeMute(False);
end;
{********************************************************}
// Enable/disable "Mute" for several mixer line sources.
uses
 MMSystem;
type
 TMixerLineSourceType = (lsDigital, lsLine, lsMicrophone, lsCompactDisk, lsTelephone,
 lsWaveOut, lsAuxiliary, lsAnalog, lsLast);
function SetMixerLineSourceMute(AMixerLineSourceType: TMixerLineSourceType; bMute: Boolean): Boolean;
var
 hMix: HMIXER;
 mxlc: MIXERLINECONTROLS;
 mxcd: TMIXERCONTROLDETAILS;
 vol: TMIXERCONTROLDETAILS_UNSIGNED;
 mxc: MIXERCONTROL;
 mxl: TMixerLine;
 intRet: Integer;
 nMixerDevs: Integer;
 mcdMute: MIXERCONTROLDETAILS_BOOLEAN;
begin
 Result := False;
 // Check if Mixer is available
 nMixerDevs := mixerGetNumDevs();
 if (nMixerDevs < 1) then
 begin
 Exit;
 end;
 // open the mixer
 intRet := mixerOpen(@hMix, 0, 0, 0, 0);
 if intRet = MMSYSERR_NOERROR then
 begin
 ZeroMemory(@mxl, SizeOf(mxl));
 case AMixerLineSourceType of
 lsDigital: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_DIGITAL;
 lsLine: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_LINE;
 lsMicrophone: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE;
 lsCompactDisk: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;
 lsTelephone: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE;
 lsWaveOut: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
 lsAuxiliary: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY;
 lsAnalog: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_ANALOG;
 lsLast: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_LAST;
 end;
 // mixerline info
 mxl.cbStruct := SizeOf(mxl);
 intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);
 if intRet = MMSYSERR_NOERROR then
 begin
 ZeroMemory(@mxlc, SizeOf(mxlc));
 mxlc.cbStruct := SizeOf(mxlc);
 mxlc.dwLineID := mxl.dwLineID;
 mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
 mxlc.cControls := 1;
 mxlc.cbmxctrl := SizeOf(mxc);
 mxlc.pamxctrl := @mxc;
 // Get the mute control
 intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
 if intRet = MMSYSERR_NOERROR then
 begin
 ZeroMemory(@mxcd, SizeOf(mxcd));
 mxcd.cbStruct := SizeOf(TMIXERCONTROLDETAILS);
 mxcd.dwControlID := mxc.dwControlID;
 mxcd.cChannels := 1;
 mxcd.cbDetails := SizeOf(MIXERCONTROLDETAILS_BOOLEAN);
 mxcd.paDetails := @mcdMute;
 mcdMute.fValue := Ord(bMute);
 // set, unset mute
 intRet := mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE);
 {
 mixerGetControlDetails(hMix, @mxcd, IXER_GETCONTROLDETAILSF_VALUE);
 Result := Boolean(mcdMute.fValue);
 }
 Result := intRet = MMSYSERR_NOERROR;
 if intRet <> MMSYSERR_NOERROR then
 ShowMessage('SetControlDetails Error');
 end
 else
 ShowMessage('GetLineInfo Error');
 end;
 intRet := mixerClose(hMix);
 end;
end;
// Example Call;
procedure TForm1.Button1Click(Sender: TObject);
begin
 SetMixerLineSourceMute(lsLine, True);
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03605
Category:Звук