Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

управление громкостью   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.044 c
1-1106793730
Black
2005-01-27 05:42
2005.02.13
шаблоны Word


1-1106746187
Derevyanniy kak Rels
2005-01-26 16:29
2005.02.13
Узнать программно , если такой метод или нет ?


8-1098903047
Alein
2004-10-27 22:50
2005.02.13
Эффект Bevel (как в Photoshope)


1-1106857451
Urvin
2005-01-27 23:24
2005.02.13
Прошу помочь с кодом, перевод типов


6-1100847332
Дмитрий76
2004-11-19 09:55
2005.02.13
Проблемы с функцией NetShareAdd (netapi32.dll)