📄 amixer.pas
字号:
then
begin
MCD.cbStruct := SizeOf(TMixerControlDetails);
MCD.dwControlID := Cntrl.dwControlID;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_UNIFORM > 0 then
MCD.cChannels := 1
else
MCD.cChannels := ML.cChannels;
MCD.cMultipleItems := 0;
MCD.cbDetails := SizeOf(Integer);
MCD.paDetails := @Details;
If (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME) AND not VolSet then
begin
Details[0] := LeftVol;
If RightVol = -1 then
Details[1] := LeftVol
else
Details[1] := RightVol;
VolSet := True;
end
else
If (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE) AND not MuteSet then
begin
Details[0] := Mute;
MuteSet := True;
end;
mixerSetControlDetails (FMixerHandle, @MCD, MIXER_GETCONTROLDETAILSF_VALUE);
end;
end;
Inc (A);
end;
If not MuteSet then
begin
If AConnection <> -1 then
begin
Cntrls := MD.Controls;
ML := MD.Data;
If Cntrls <> nil then
begin
A := 0;
while not MuteSet AND (A < Cntrls.Count) do
begin
Cntrl := Cntrls[A];
If (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MIXER) OR
(Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX) then
begin
MCD.cbStruct := SizeOf(TMixerControlDetails);
MCD.dwControlID := Cntrl.dwControlID;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_UNIFORM > 0 then
MCD.cChannels := 1
else
MCD.cChannels := ML.cChannels;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_MULTIPLE = MIXERCONTROL_CONTROLF_MULTIPLE then
MCD.cMultipleItems := Cntrl.cMultipleItems
else
MCD.cMultipleItems := 0;
MCD.cbDetails := 4;
MCD.paDetails := @Details;
MuteSet := True;
mixerGetControlDetails (FMixerHandle, @MCD, MIXER_GETCONTROLDETAILSF_VALUE);
if (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX) then
For B := 0 to Cntrl.cMultipleItems-1 do
Details[B] := 0;
Details[AConnection] := Mute;
mixerSetControlDetails (FMixerHandle, @MCD, MIXER_GETCONTROLDETAILSF_VALUE);
end;
Inc (A);
end;
end;
end;
end;
end;
end;
end;
function TAudioMixer.GetMute(ADestination, AConnection: Integer; var Mute: Boolean):Boolean;
var
MD : TMixerDestination;
MC : TMixerConnection;
mlcMixerLineControlsMute : TMIXERLINECONTROLS;
mcdMixerDataMute : TMIXERCONTROLDETAILS;
pmcMixerControlMute : PMIXERCONTROL;
pmcdsMixerDataUnsignedMute : PMIXERCONTROLDETAILSBOOLEAN;
mlMixerLine : TMixerLine;
Cntrl:PMixerControl;
Cntrls:TMixerControls;
ML:TMixerLine;
A:Integer;
details:array [0..30] of Integer;
begin
Mute := False;
Result := False;
MD := Destinations[ADestination];
if MD <> nil then
begin
if AConnection = -1 then
mlMixerLine := MD.Data
else
begin
MC := MD.Connections[AConnection];
if MC <> nil then
mlMixerLine := MC.Data
else
Exit;
end;
GetMem(pmcMixerControlMute, SizeOf(TMIXERCONTROL));
GetMem(pmcdsMixerDataUnsignedMute, SizeOf(TMIXERCONTROLDETAILSBOOLEAN));
with mlcMixerLineControlsMute do
begin
cbStruct := SizeOf(TMIXERLINECONTROLS);
dwLineID := mlMixerLine.dwLineID;
dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
cControls := 1;
cbmxctrl := SizeOf(TMIXERCONTROL);
pamxctrl := pmcMixerControlMute;
end;
if (mixerGetLineControls(FMixerHandle, @mlcMixerLineControlsMute, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR) then
begin
with mcdMixerDataMute do
begin
cbStruct := SizeOf(TMIXERCONTROLDETAILS);
dwControlID := pmcMixerControlMute^.dwControlID;
cChannels := 1;
cMultipleItems := 0;
cbDetails := SizeOf(TMIXERCONTROLDETAILSBOOLEAN);
paDetails := pmcdsMixerDataUnsignedMute;
end;
if mixerGetControlDetails(FMixerHandle, @mcdMixerDataMute, MIXER_GETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR then
begin
Mute := pmcdsMixerDataUnsignedMute^.fValue = 1;
Result := True;
end;
end
else
begin
If (AConnection <> -1) then
begin
Cntrls := MD.Controls;
ML := MD.Data;
If Cntrls <> nil then
begin
A := 0;
while (Result = False) AND (A < Cntrls.Count) do
begin
Cntrl := Cntrls[A];
If (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MIXER) OR
(Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX) then
begin
mcdMixerDataMute.cbStruct := SizeOf(TMixerControlDetails);
mcdMixerDataMute.dwControlID := Cntrl.dwControlID;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_UNIFORM > 0 then
mcdMixerDataMute.cChannels := 1
else
mcdMixerDataMute.cChannels := ML.cChannels;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_MULTIPLE = MIXERCONTROL_CONTROLF_MULTIPLE then
mcdMixerDataMute.cMultipleItems := Cntrl.cMultipleItems
else
mcdMixerDataMute.cMultipleItems := 0;
mcdMixerDataMute.cbDetails := 4;
mcdMixerDataMute.paDetails := @Details;
mixerGetControlDetails (FMixerHandle, @mcdMixerDataMute, MIXER_GETCONTROLDETAILSF_VALUE);
Result := True;
Mute := Details[AConnection] <> 0;
end;
Inc (A);
end;
end;
end;
end;
FreeMem(pmcdsMixerDataUnsignedMute);
FreeMem(pmcMixerControlMute);
end;
end;
function TAudioMixer.SetMute(ADestination, AConnection: Integer; Mute: Boolean):Boolean;
var
MD : TMixerDestination;
MC : TMixerConnection;
mlcMixerLineControlsMute : TMIXERLINECONTROLS;
mcdMixerDataMute : TMIXERCONTROLDETAILS;
pmcMixerControlMute : PMIXERCONTROL;
pmcdsMixerDataUnsignedMute : PMIXERCONTROLDETAILSBOOLEAN;
mlMixerLine : TMixerLine;
Cntrl:PMixerControl;
Cntrls:TMixerControls;
ML:TMixerLine;
A,B:Integer;
details:array [0..30] of Integer;
begin
MD := Destinations[ADestination];
Result := False;
if MD <> nil then
begin
if AConnection = -1 then
mlMixerLine := MD.Data
else
begin
MC := MD.Connections[AConnection];
if MC <> nil then
mlMixerLine := MC.Data
else
Exit;
end;
GetMem(pmcMixerControlMute, SizeOf(TMIXERCONTROL));
GetMem(pmcdsMixerDataUnsignedMute, SizeOf(TMIXERCONTROLDETAILSBOOLEAN));
with mlcMixerLineControlsMute do
begin
cbStruct := SizeOf(TMIXERLINECONTROLS);
dwLineID := mlMixerLine.dwLineID;
dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
cControls := 0; // 1
cbmxctrl := SizeOf(TMIXERCONTROL);
pamxctrl := pmcMixerControlMute;
end;
if (mixerGetLineControls(FMixerHandle, @mlcMixerLineControlsMute, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR) then
begin
with mcdMixerDataMute do
begin
cbStruct := SizeOf(TMixerControlDetails);
dwControlID := pmcMixerControlMute^.dwControlID;
cChannels := 1;
cMultipleItems := 0;
cbDetails := SizeOf(TMIXERCONTROLDETAILSBOOLEAN);
paDetails := pmcdsMixerDataUnsignedMute;
end;
if Mute then
pmcdsMixerDataUnsignedMute^.fValue := 1
else
pmcdsMixerDataUnsignedMute^.fValue := 0;
if (mixerSetControlDetails(FMixerHandle,@mcdMixerDataMute,MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR) then
Result := True;
end
else
begin
If (AConnection <> -1) then
begin
Cntrls := MD.Controls;
ML := MD.Data;
If Cntrls <> nil then
begin
A := 0;
while (Result = False) AND (A < Cntrls.Count) do
begin
Cntrl := Cntrls[A];
If (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MIXER) OR
(Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX) then
begin
mcdMixerDataMute.cbStruct := SizeOf(TMixerControlDetails);
mcdMixerDataMute.dwControlID := Cntrl.dwControlID;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_UNIFORM > 0 then
mcdMixerDataMute.cChannels := 1
else
mcdMixerDataMute.cChannels := ML.cChannels;
If Cntrl.fdwControl AND MIXERCONTROL_CONTROLF_MULTIPLE = MIXERCONTROL_CONTROLF_MULTIPLE then
mcdMixerDataMute.cMultipleItems := Cntrl.cMultipleItems
else
mcdMixerDataMute.cMultipleItems := 0;
mcdMixerDataMute.cbDetails := 4;
mcdMixerDataMute.paDetails := @Details;
if (mixerGetControlDetails (FMixerHandle, @mcdMixerDataMute, MIXER_GETCONTROLDETAILSF_VALUE) <> MMSYSERR_NOERROR) then
continue;
if (Cntrl.dwControlType = MIXERCONTROL_CONTROLTYPE_MUX) then
For B := 0 to Cntrl.cMultipleItems-1 do
Details[B] := 0;
If Mute then
Details[AConnection] := 1;
if (mixerSetControlDetails (FMixerHandle, @mcdMixerDataMute, MIXER_GETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR) then
Result := True;
end;
Inc (A);
end;
end;
end;
end;
FreeMem(pmcdsMixerDataUnsignedMute);
FreeMem(pmcMixerControlMute);
end;
end;
function TAudioMixer.GetPeak (ADestination, AConnection:Integer; var LeftPeak, RightPeak:Integer): Boolean;
var
MD : TMixerDestination;
MC : TMixerConnection;
mcdMixerDataPeak : TMIXERCONTROLDETAILS;
pmcMixerControlPeak : PMIXERCONTROL;
{ pmcdsMixerDataSignedPeak : PMIXERCONTROLDETAILSSIGNED;}
mlMixerLine : TMixerLine;
A:Integer;
Cntrls:TMixerControls;
Details:Array [1..10] of Integer;
begin
LeftPeak := 0;
RightPeak := 0;
Result := False;
MD := Destinations[ADestination];
if MD <> nil then
begin
if AConnection = -1 then
begin
mlMixerLine := MD.Data;
Cntrls := MD.Controls;
end
else
begin
MC := MD.Connections[AConnection];
if MC <> nil then
begin
mlMixerLine := MC.Data;
Cntrls := MC.Controls;
end
else
Exit;
end;
GetMem(pmcMixerControlPeak, SizeOf(TMIXERCONTROL));
A := 0;
while (A < Cntrls.Count) do
begin
If Cntrls[A].dwControlType AND MIXERCONTROL_CT_CLASS_MASK = MIXERCONTROL_CT_CLASS_METER then
break;
Inc (A);
end;
If A = Cntrls.Count then
Exit;
with mcdMixerDataPeak do
begin
cbStruct := SizeOf(TMIXERCONTROLDETAILS);
dwControlID := Cntrls[A].dwControlID;
cChannels := mlMixerLine.cChannels;
If Cntrls[A].fdwControl AND MIXERCONTROL_CONTROLF_MULTIPLE=MIXERCONTROL_CONTROLF_MULTIPLE then
cMultipleItems:=Cntrls[A].cMultipleItems
else
cMultipleItems:=0;
cbDetails := SizeOf(TMIXERCONTROLDETAILSSIGNED);
paDetails := @Details;
end;
if (mixerGetControlDetails(FMixerHandle,@mcdMixerDataPeak,MIXER_GETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR) then
begin
LeftPeak := Details[1];
if mlMixerLine.cChannels = 2 then
RightPeak := Details[2]
else
RightPeak := LeftPeak;
Result := True;
end;
FreeMem(pmcMixerControlPeak);
end;
end;
procedure Register;
begin
RegisterComponents('Samples', [TAudioMixer]);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -