Главная страница
    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.064 c
1-1106729873
NightStranger
2005-01-26 11:57
2005.02.13
Окно запроса


1-1107030167
ASDASD
2005-01-29 23:22
2005.02.13
Два вопроса: Общие точки и Работа Chart


3-1105685586
Orc
2005-01-14 09:53
2005.02.13
Проблема с select из dbf


1-1107173185
Qweatre
2005-01-31 15:06
2005.02.13
hmemcpy


1-1107087746
rolex
2005-01-30 15:22
2005.02.13
Как получить размер папки?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский