操纵声卡
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.