Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.033 c
1-1107106333
Dmitry_04
2005-01-30 20:32
2005.02.13
Определение Form.Width и Form.Height


6-1101727851
Jay
2004-11-29 14:30
2005.02.13
Использование ресурсов другой машины


1-1106817408
Fanny
2005-01-27 12:16
2005.02.13
Свойство Мультиязыковый у EXE-файла


14-1106458331
guest_Dmitry
2005-01-23 08:32
2005.02.13
Вопрос по AdvStringGrid


1-1106829452
Ega23
2005-01-27 15:37
2005.02.13
Слышал, что *.dfm можно как бинарник сохранить.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский