unit 操纵声卡;
interface
uses Windows, Dialogs, MMSystem;
Type
TDeviceName = (Master, Microphone, WaveOut, Synth);// - 获取音量
function GetVolume(DN: TDeviceName): Word;// - 设置音量procedure SetVolume(DN: TDeviceName; Value: Word);// - 获取静音function GetVolumeMute(DN: TDeviceName): Boolean;// - 设置静音procedure SetVolumeMute(DN: TDeviceName; Value: Boolean);implementation
// - 初始化 TMixerLine
function Initial_mxl(DN: TDeviceName): TMixerLine;begin with Result do begin case DN of Master: dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; Microphone: dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; WaveOut: dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; Synth: dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; end; cbStruct := SizeOf(TMixerLine); end;end;// - 初始化 MIXERLINECONTROLS
function Initial_mxlc(mxl: TMixerLine; var mxc: MixerControlW; dwCType: DWORD) : MIXERLINECONTROLS;begin FillChar(Result, SizeOf(Result), 0); with Result do begin cbStruct := SizeOf(Result); dwLineID := mxl.dwLineID; dwControlType := dwCType; cControls := 1; cbmxctrl := SizeOf(mxc); pamxctrl := @mxc; end;end;// - 初始化 TMIXERCONTROLDETAILS
function Initial_mxcd(mxc: MIXERCONTROL; var vol: DWORD): TMIXERCONTROLDETAILS;begin FillChar(Result, SizeOf(Result), 0); with Result do begin cbDetails := SizeOf(DWORD); cChannels := 1; cbStruct := SizeOf(Result); cMultipleItems := 0; dwControlID := mxc.dwControlID; paDetails := @vol; end;end;// - 获取音量
function GetVolume(DN: TDeviceName): Word;var hMix: HMIXER; mxl: TMixerLine; mxlc: MIXERLINECONTROLS; mxc: MIXERCONTROL; mxcd: TMIXERCONTROLDETAILS; vol: TMIXERCONTROLDETAILS_UNSIGNED;begin Result := 0; // - 混频器存在且打开成功 if (mixerGetNumDevs > 0) and (mixerOpen(@hMix, 0, 0, 0, 0) = MMSYSERR_NOERROR) then try mxl := Initial_mxl(DN); // - 检取混频器有关特有线路的信息 if mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then begin mxlc := Initial_mxlc(mxl, mxc, MIXERCONTROL_CONTROLTYPE_VOLUME); // - 获得与音频线路相关控制的通用信息 if mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then begin mxcd := Initial_mxcd(mxc, DWORD(vol)); Result := vol.dwValue; // - 获得与某音频线路相关的一个控制的属性 if mixerGetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR then ShowMessage('GetControlDetails Error'); end else ShowMessage('GetLineInfo Error'); end; finally // - 关闭指定的混频器 mixerClose(hMix); end;end;// - 设置音量
procedure SetVolume(DN: TDeviceName; Value: Word);var hMix: HMIXER; mxl: TMixerLine; mxlc: MIXERLINECONTROLS; mxc: MIXERCONTROL; mxcd: TMIXERCONTROLDETAILS; vol: TMIXERCONTROLDETAILS_UNSIGNED;begin // - 混频器存在且打开成功 if (mixerGetNumDevs > 0) and (mixerOpen(@hMix, 0, 0, 0, 0) = MMSYSERR_NOERROR) then try mxl := Initial_mxl(DN); // - 检取混频器有关特有线路的信息 if mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then begin mxlc := Initial_mxlc(mxl, mxc, MIXERCONTROL_CONTROLTYPE_VOLUME); // - 获得与音频线路相关控制的通用信息 if mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then begin mxcd := Initial_mxcd(mxc, DWORD(vol)); vol.dwValue := Value; // - 设置指定控制的属性 if mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR then ShowMessage('SetControlDetails Error'); end else ShowMessage('GetLineInfo Error'); end;finally
// - 关闭指定的混频器 mixerClose(hMix); end;end;// - 获取静音
function GetVolumeMute(DN: TDeviceName): Boolean;var hMix: HMIXER; mxl: TMixerLine; mxlc: MIXERLINECONTROLS; mxc: MIXERCONTROL; mxcd: TMIXERCONTROLDETAILS; mcdMute: MIXERCONTROLDETAILS_BOOLEAN;begin Result := False; // - 混频器存在且打开成功 if (mixerGetNumDevs > 0) and (mixerOpen(@hMix, 0, 0, 0, 0) = MMSYSERR_NOERROR) then try mxl := Initial_mxl(DN); // - 检取混频器有关特有线路的信息 if mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then begin mxlc := Initial_mxlc(mxl, mxc, MIXERCONTROL_CONTROLTYPE_MUTE); // - 获得与音频线路相关控制的通用信息 if mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then begin mxcd := Initial_mxcd(mxc, DWORD(mcdMute)); // - 获得与某音频线路相关的一个控制的属性 if mixerGetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR then ShowMessage('SetControlDetails Error'); Result := (mcdMute.fValue <> 0); end else ShowMessage('GetLineInfo Error'); end; finally // - 关闭指定的混频器 mixerClose(hMix); end;end;// - 设置静音
procedure SetVolumeMute(DN: TDeviceName; Value: Boolean);var hMix: HMIXER; mxl: TMixerLine; mxlc: MIXERLINECONTROLS; mxc: MIXERCONTROL; mxcd: TMIXERCONTROLDETAILS; mcdMute: MIXERCONTROLDETAILS_BOOLEAN;begin // - 混频器存在且打开成功 if (mixerGetNumDevs > 0) and (mixerOpen(@hMix, 0, 0, 0, 0) = MMSYSERR_NOERROR) then try mxl := Initial_mxl(DN); // - 检取混频器有关特有线路的信息 if mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then begin mxlc := Initial_mxlc(mxl, mxc, MIXERCONTROL_CONTROLTYPE_MUTE); // - 获得与音频线路相关控制的通用信息 if mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then begin mxcd := Initial_mxcd(mxc, DWORD(mcdMute)); mcdMute.fValue := Ord(Value); // - 设置指定控制的属性 if mixerSetControlDetails(hMix, @mxcd, MIXER_SETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR then ShowMessage('SetControlDetails Error'); end else ShowMessage('GetLineInfo Error'); end; finally // - 关闭指定的混频器 mixerClose(hMix); end;end;end.