Avatar billede slowaterz Nybegynder
19. november 2001 - 16:51 Der er 12 kommentarer og
1 løsning

Styring af lydniveau fra et Delphi program

Jeg vil gerne stille lydstyrken fra mit program i stedet for fra Windows\' sndvol32.
Jeg har fundet frem til WaveOutOpen, WaveOutGetVolume og WaveOutSetVolume, men har haft meget besvær med at få dem til at virke.
Findes der en nemmere måde ? Hvis nogen har eksempler, vil jeg påskønne det meget.
Jeg vil gerne kunne sætte både wave out niveau og den overordnede lydstyrke.
Avatar billede stoney Nybegynder
19. november 2001 - 17:14 #1
Avatar billede zerohero Nybegynder
19. november 2001 - 17:51 #2
Jeg har nogle komponenter med open-source som du med garanti kan drage nytte af...
Avatar billede zerohero Nybegynder
19. november 2001 - 17:55 #3
forresten: speedy fik dem af mig i sin tid og uploadede dem på hand hjemmeside her den direkte link

http://www.espeedy.dk/eksperten/wav.zip

ZeroHero
Avatar billede slowaterz Nybegynder
20. november 2001 - 10:17 #4
Lige en ting til : hvis \"Mute\" er slået til nytter det ikke meget at pille ved lydstyrken. Kan man slå \"Mute\" til og fra (eller kontrollere, om den er slået til) i Delphi ?

stoney <<< jeg kan ikke rigtigt få den til at virke - auxGetNumDevs returnerer 0 - så jeg kan ikke bruge auxSetVolume til noget

zerohero <<< jeg vil så vidt muligt benytte Delphis indbyggede komponenter eller Windows API kald.
Avatar billede stoney Nybegynder
20. november 2001 - 13:03 #5
slowaterz>>

Jeg har lavet et meget simpelt program hvor du kan skrue op og ned for venstre og/eller højre højttaler via edit felter (du må selv fedte rundt med evt. trackbars), samt slå mute til og fra.

uses mmsystem

edit1 = lydstyrke venstre højttaler værdi 50000
edit2 = lydstyrke højre højttaler  værdi 50000
checkbox1 = mute fra/til

function GetMasterMute(
  Mixer: hMixerObj;
  var Control: TMixerControl): MMResult;
  // Returns True on success
var
  Line: TMixerLine;
  Controls: TMixerLineControls;
begin
  ZeroMemory(@Line, SizeOf(Line));
  Line.cbStruct := SizeOf(Line);
  Line.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  Result := mixerGetLineInfo(Mixer, @Line,
    MIXER_GETLINEINFOF_COMPONENTTYPE);
  if Result = MMSYSERR_NOERROR then
  begin
    ZeroMemory(@Controls, SizeOf(Controls));
    Controls.cbStruct := SizeOf(Controls);
    Controls.dwLineID := Line.dwLineID;
    Controls.cControls := 1;
    Controls.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE;
    Controls.cbmxctrl := SizeOf(Control);
    Controls.pamxctrl := @Control;
    Result := mixerGetLineControls(Mixer, @Controls,
      MIXER_GETLINECONTROLSF_ONEBYTYPE);
  end;
end;




function GetWaveVolume: DWord;
var
Woc : TWAVEOUTCAPS;
Volume : DWord;
begin
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
begin
WaveOutGetVolume(WAVE_MAPPER, @Volume);
Result := Volume;
end;
end;

procedure SetWaveVolume(const AVolume: DWord);
var
Woc : TWAVEOUTCAPS;
begin
if WaveOutGetDevCaps(WAVE_MAPPER, @Woc, sizeof(Woc)) =
MMSYSERR_NOERROR then
if Woc.dwSupport and WAVECAPS_VOLUME = WAVECAPS_VOLUME then
WaveOutSetVolume(WAVE_MAPPER, AVolume);
end;



procedure TForm1.Button1Click(Sender: TObject);
var
LeftVolume: Word;
RightVolume: Word;
begin
LeftVolume := StrToInt(Edit1.Text);
RightVolume := StrToInt(Edit2.Text);
SetWaveVolume(MakeLong(LeftVolume, RightVolume));
end;






procedure SetMasterMuteValue(
  Mixer: hMixerObj;
  Value: Boolean);
var
  MasterMute: TMixerControl;
  Details: TMixerControlDetails;
  BoolDetails: TMixerControlDetailsBoolean;
  Code: MMResult;
begin
  Code := GetMasterMute(0, MasterMute);
  if Code = MMSYSERR_NOERROR then
  begin
    with Details do
    begin
      cbStruct := SizeOf(Details);
      dwControlID := MasterMute.dwControlID;
      cChannels := 1;
      cMultipleItems := 0;
      cbDetails := SizeOf(BoolDetails);
      paDetails := @BoolDetails;
    end;
    LongBool(BoolDetails.fValue) := Value;
    Code := mixerSetControlDetails(0, @Details,
MIXER_SETCONTROLDETAILSF_VALUE);
  end;
  if Code <> MMSYSERR_NOERROR then
    raise Exception.CreateFmt(\'SetMasterMuteValue failure, \'+
      \'multimedia system error #%d\', [Code]);
end;


procedure TForm1.CheckBox1Click(Sender: TObject);
begin
SetMasterMuteValue(0, CheckBox1.Checked);
end;

Stoney
Avatar billede zerohero Nybegynder
20. november 2001 - 13:23 #6
Sagde jeg ikke at det var OPEN SOURCE komponenter... det vil sige du kan gå ind og lure teknikkerne (api-kald osv.) af i kilde koden...

(er du dum eller hvad? *G*)

ZeroHero
Avatar billede slowaterz Nybegynder
20. november 2001 - 13:27 #7
zerohero <<< jeg har skal forsøgt at hente source koden, men jeg får at vide, at der er fejl i zip filen

så dum er jeg heller ikke ... *gg*
Avatar billede stoney Nybegynder
20. november 2001 - 13:56 #8
slowaterz>>

kan du få det til at virke

Stoney
Avatar billede slowaterz Nybegynder
20. november 2001 - 14:28 #9
stoney <<< jep, det ser ud til virke. Jeg skal lige have tygget koden igennem, så jeg også kan slå \"Mute\" fra på waveOut ... og justere master lydstyrken ...
Avatar billede slowaterz Nybegynder
21. november 2001 - 08:43 #10
stoney <<< I need help. jeg kan styre master \"Mute\" og wave lydstyrke, men ikke master lydstyrke eller wave \"Mute\". jeg har prøvet at kigge på mixerGetLineControls og mixerGetLineInfo til at styre wave \"Mute\", men har ikke kunnet få det til at virke ...
Avatar billede stoney Nybegynder
21. november 2001 - 11:36 #11
slowaterz>>


Jeg vender tilbage i aften.
Jeg har rocker travlt lige nu.

Stoney
Avatar billede aasuper Nybegynder
28. april 2002 - 14:32 #12
Slowaterz>>

Fik du nogensinde fundet frem til en kode, der kunne ændre master-lydstyrken?

>>AASuper
Avatar billede aasuper Nybegynder
28. april 2002 - 17:09 #13
Glemt det - jeg har selv fundet ud af det!

>>AASuper
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester