Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Внизуправление громкостью Найти похожие ветки
← →
pomashok (2004-12-26 14:19) [0]Привет! вот такое дело ... хачу сделать чтоб из своей проги можно было управлять звуком также как в системной программой sndvol32! ? какие будут идеи? (типа ручками некатит!)
← →
Дмитрий В. Белькевич (2004-12-26 14:32) [1]Type TDMCIDevice = (dmciMaster, dmciWave, dmciMIDI, dmciCD);
Function GetVolumeControlID(DEV:TDMCIDevice):Integer;
Function SetVolume(dwVolume:DWORD;DEV:TDMCIDevice):Boolean;
implementation
Function SetVolume;
Var mxcd:TMIXERCONTROLDETAILS;
mxcd_u:MIXERCONTROLDETAILS_UNSIGNED;
mmr:Integer;
ghmx:Integer;
Begin
ghmx:=0;
mxcd.cbStruct := sizeof(mxcd);
mxcd.dwControlID := GetVolumeControlID(DEV);
mxcd.cChannels := 1;
mxcd.cMultipleItems := 0;
mxcd.cbDetails := 4;
mxcd.paDetails := @mxcd_u;
mmr := mixerGetControlDetails(HMIXEROBJ(ghmx), @mxcd, 0);
if (MMSYSERR_NOERROR <> mmr) Then Begin Result:= FALSE; Exit; End;
mxcd_u.dwValue := dwVolume*655;
mmr := mixerSetControlDetails(HMIXEROBJ(ghmx), @mxcd, 0);
if (MMSYSERR_NOERROR <> mmr) Then Begin Result:=FALSE; Exit; End;
Result:=TRUE;
End;
Function GetVolumeControlID;
Var mxl:MIXERLINE;
ghmx:Integer;
mxc:MIXERCONTROL;
mxlc:MIXERLINECONTROLS;
Begin
ghmx:=0;
mxl.cbStruct := sizeof(MIXERLINE);
Case DEV of
dmciMaster: mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
dmciWave : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;
dmciMIDI : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;
dmciCD : mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC;
End;
if (mixerGetLineInfo(HMIXEROBJ(ghmx), @mxl,
MIXER_OBJECTF_HMIXER or MIXER_GETLINEINFOF_COMPONENTTYPE)
<> MMSYSERR_NOERROR) THen Begin Result:=34;Exit;End;
mxlc.cbStruct := sizeof(MIXERLINECONTROLS);
mxlc.dwLineID := mxl.dwLineID;
mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls := 1;
mxlc.cbmxctrl := sizeof(MIXERCONTROL);
mxlc.pamxctrl := @mxc;
if (mixerGetLineControls(HMIXEROBJ(ghmx), @mxlc,
MIXER_OBJECTF_HMIXER or MIXER_GETLINECONTROLSF_ONEBYTYPE)
<> MMSYSERR_NOERROR) Then Begin Result:=34; Exit; End;
Result:=mxc.dwControlID;
End;
(c) Alxx.
← →
Vit@ly © (2004-12-26 14:37) [2]Простой пример (принцип) можно взять здесь:
URL http://my.samara.ru/builder/files/delphi/c_33192/5632.rar
ну а дальше развивать
← →
Дмитрий В. Белькевич (2004-12-26 14:38) [3]Вот еще кусок, я из него, помню, сам дёргнал, когда мне нужно было:
unit svol;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, MMsystem, Buttons;
type
TSetVol = class(TForm)
VolBar: TProgressBar;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
procedure FormCreate(Sender: TObject);
procedure VolBarMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
private
{ Private declarations }
procedure MixCtrlChange(var mess : TMessage); message
MM_MIXM_CONTROL_CHANGE;
public
{ Public declarations }
end;
var
SetVol: TSetVol;
hmix:integer;
mixcaps:TMixerCaps;
volumeID,volmin,volmax:integer;
details:TMixerControlDetails;
mixctrl:TMixerControl;
valdets:TMixerControlDetailsUnsigned;
curvolume:dword;
svEnable : boolean;
implementation
{$R *.DFM}
procedure TSetVol.MixCtrlChange(var mess : TMessage);
begin
if not svEnable then exit;
if SetVol.WindowState=wsMinimized then exit;
details.cbStruct:=sizeof(details);
details.dwControlID:=VolumeID;
details.cChannels:=1;
details.cMultipleItems:=0;
details.cbDetails:=sizeof(valdets);
details.paDetails:=@valdets;
mixerGetControlDetails(hmix,@details,MIXER_GETCONTROLDETAILSF_VALUE);
curvolume:=valdets.dwValue;
SetVol.VolBar.Position:=curvolume;
end;
procedure TSetVol.FormCreate(Sender: TObject);
var
i:integer;
mixline:TMixerLine;
mixlinectrl:TMixerLineControls;
mixctrl:TMixerControl;
begin
inherited;
hVolForm:=Handle;
Left:=80;
Top:=TBHeight+2;
mixerOpen(@hmix,0,Handle,0,MIXER_OBJECTF_MIXER or CALLBACK_WINDOW);
mixerGetDevCaps(0,@mixcaps,sizeof(mixcaps));
for i:=0 to mixcaps.cDestinations-1 do
begin
mixline.dwDestination:=i;
mixline.cbStruct:=sizeof(mixline);
mixerGetLineInfo(hmix,@mixline,MIXER_GETLINEINFOF_DESTINATION);
if mixline.dwComponentType=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS then
break;
end;
if mixline.dwComponentType<>MIXERLINE_COMPONENTTYPE_DST_SPEAKERS then
begin
ShowMessage("Hет миксеpа!!!");
svEnable:=False;
exit;
end
else
svEnable:=true;
mixlinectrl.cbStruct:=sizeof(mixlinectrl);
mixlinectrl.dwControlType:=MIXERCONTROL_CONTROLTYPE_VOLUME;
mixlinectrl.dwLineID:=mixline.dwLineID;
mixlinectrl.cControls:=2;
mixlinectrl.cbmxctrl:=sizeof(mixctrl);
mixctrl.dwControlType:=MIXERCONTROL_CONTROLTYPE_VOLUME;
mixlinectrl.pamxctrl:=@mixctrl;
mixerGetLineControls(hmix,@mixlinectrl,MIXER_GETLINECONTROLSF_ONEBYTYPE);
VolumeID:=mixctrl.dwControlID;
volmin:=mixctrl.Bounds.dwMinimum;
volmax:=mixctrl.Bounds.dwMaximum;
details.cbStruct:=sizeof(details);
details.dwControlID:=VolumeID;
details.cChannels:=1;
details.cMultipleItems:=0;
details.cbDetails:=sizeof(valdets);
details.paDetails:=@valdets;
mixerGetControlDetails(hmix,@details,MIXER_GETCONTROLDETAILSF_VALUE);
curvolume:=valdets.dwValue;
VolBar.Min:=volmin;
VolBar.Max:=volmax;
VolBar.Position:=curvolume;
end;
procedure TSetVol.VolBarMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if not svEnable then exit;
X:=Round(X/VolBar.Width*(VolBar.Max-VolBar.Min)+VolBar.Min);
VolBar.Position:=X;
details.cbStruct:=sizeof(details);
details.dwControlID:=VolumeID;
details.cChannels:=1;
details.cMultipleItems:=0;
details.cbDetails:=sizeof(valdets);
details.paDetails:=@valdets;
if X>4000 then
valdets.dwValue:=VolBar.Position
else
valdets.dwValue:=0;
mixerSetControlDetails(hmix,@details,MIXER_SETCONTROLDETAILSF_VALUE);
end;
procedure TSetVol.FormDestroy(Sender: TObject);
begin
hVolForm:=0;
if not svEnable then exit;
mixerClose(hmix);
inherited;
end;
procedure TSetVol.SpeedButton1Click(Sender: TObject);
begin
if not svEnable then exit;
VolBar.Position:=VolBar.Position-(VolBar.Max-VolBar.Min)div 10;
if VolBar.Position<VolBar.Min then VolBar.Position:=VolBar.Min;
details.cbStruct:=sizeof(details);
details.dwControlID:=VolumeID;
details.cChannels:=1;
details.cMultipleItems:=0;
details.cbDetails:=sizeof(valdets);
details.paDetails:=@valdets;
if VolBar.Position>4000 then
valdets.dwValue:=VolBar.Position
else
valdets.dwValue:=0;
mixerSetControlDetails(hmix,@details,MIXER_SETCONTROLDETAILSF_VALUE);
end;
procedure TSetVol.SpeedButton2Click(Sender: TObject);
begin
if not svEnable then exit;
VolBar.Position:=VolBar.Position+(VolBar.Max-VolBar.Min)div 10;
if VolBar.Position>VolBar.Max then VolBar.Position:=VolBar.Max;
details.cbStruct:=sizeof(details);
details.dwControlID:=VolumeID;
details.cChannels:=1;
details.cMultipleItems:=0;
details.cbDetails:=sizeof(valdets);
details.paDetails:=@valdets;
if VolBar.Position>4000 then
valdets.dwValue:=VolBar.Position
else
valdets.dwValue:=0;
mixerSetControlDetails(hmix,@details,MIXER_SETCONTROLDETAILSF_VALUE);
end;
end.
p.s. а вообще, возьми какую компоненту по управлению виндовым микшером, их есть.
← →
pomashok (2004-12-26 15:11) [4]ОГРОМНОЕ СПАСИБО! чичаз посматрю...
Дмитрий В. Белькевич
p.s. а вообще, возьми какую компоненту по управлению виндовым микшером, их есть.
название не подскажете ?
← →
pomashok (2004-12-26 17:18) [5]Дмитрий В. Белькевич [4] это управляет "Общим" а как управлять "Звук" ? там как бы два движка...
← →
Дмитрий В. Белькевич (2004-12-26 17:32) [6]www.torry.net поиск "mixer" или "audio mixer".
← →
grom (2004-12-26 21:44) [7]http://my.samara.ru/~delphi/xx/33245/
Change Volume
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c