Avatar billede Slettet bruger
06. april 2002 - 11:02 Der er 15 kommentarer og
1 løsning

Win 2000

Denne kode virker kun under win 2000, ikke under win 98. Kan man få den til at virke under win 2000? Koden giver udslag i forhold til lyden. Her er koden:


{
  Every line going into and out of the mixer has a number of "controls"
  associated with it. Some of those controls are "meters," which give
  you a real-time value of the sound level on the corresponding line.
  Not all lines have meter controls, and not all sound cards provide
  support for meters.

  Here's some code that will retrieve a handle to the meter attached to
  the WaveOut source of the speaker line, if there is one:
}

uses
  MMSystem;

procedure TForm1.Button1Click(Sender: TObject);
var
  MixerControl: TMixerControl;
  MixerControlDetails: TMixerControlDetails;
  MixerControlDetailsSigned: TMixerControlDetailsSigned;
  Mixer: THandle;
  MixerLine: TMixerLine;
  MixerLineControls: TMixerLineControls;
  PeakMeter: DWORD;
  Rslt: DWORD;
  SourceCount: Cardinal;
  WaveOut: DWORD;
  I: Integer;
  X: Integer;
  Y: Integer;
begin
  Rslt := mixerOpen(@Mixer, 0, 0, 0, 0);
  if Rslt <> 0 then
    raise Exception.CreateFmt('Can''t open mixer (%d)', [Rslt]);
  FillChar(MixerLine, SizeOf(MixerLine), 0);
  MixerLine.cbStruct := SizeOf(MixerLine);
  MixerLine.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
  Rslt := mixerGetLineInfo(Mixer, @MixerLine,
    MIXER_GETLINEINFOF_COMPONENTTYPE);
  if Rslt <> 0 then
    raise Exception.CreateFmt('Can''t find speaker line (%d)', [Rslt]);
  SourceCount := MixerLine.cConnections;
  WaveOut := $FFFFFFFF;
  for I := 0 to SourceCount - 1 do
  begin
    MixerLine.dwSource := I;
    Rslt := mixerGetLineInfo(Mixer, @MixerLine,
      MIXER_GETLINEINFOF_SOURCE);
    if Rslt <> 0 then
      raise Exception.CreateFmt('Can''t get source line (%d)', [Rslt]);
    if MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT then
    begin
      WaveOut := MixerLine.dwLineId;
      Break;
    end;
  end;
  if WaveOut = $FFFFFFFF then
    raise Exception.Create('Can''t find wave out device');
  FillChar(MixerLineControls, SizeOf(MixerLineControls), 0);
  with MixerLineControls do
  begin
    cbStruct := SizeOf(MixerLineControls);
    dwLineId := WaveOut;
    dwControlType := MIXERCONTROL_CONTROLTYPE_PEAKMETER;
    cControls := 1;
    cbmxctrl := SizeOf(TMixerControl);
    pamxctrl := @MixerControl;
  end;
  Rslt := mixerGetLineControls(Mixer, @MixerLineControls,
    MIXER_GETLINECONTROLSF_ONEBYTYPE);
  if Rslt <> 0 then
    raise Exception.CreateFmt('Can''t find peak meter control (%d)',
      [Rslt]);
  PeakMeter := MixerControl.dwControlID;

  // at this point, I have the meter control ID, so I can
  // repeatedly query its value and plot the resulting data
  // on a canvas

  X := 0;
  FillChar(MixerControlDetails, SizeOf(MixerControlDetails), 0);
  with MixerControlDetails do
  begin
    cbStruct := SizeOf(MixerControlDetails);
    dwControlId := PeakMeter;
    cChannels := 1;
    cbDetails := SizeOf(MixerControlDetailsSigned);
    paDetails := @MixerControlDetailsSigned;
  end;
  repeat
    Sleep(10);
    Rslt := mixerGetControlDetails(Mixer, @MixerControlDetails,
      MIXER_GETCONTROLDETAILSF_VALUE);
    if Rslt <> 0 then
      raise Exception.CreateFmt('Can''t get control details (%d)',
        [Rslt]);
    Application.ProcessMessages;
    Inc(X);
    Y := 300 - Round(300 * Abs(MixerControlDetailsSigned.lValue) / 32768);
    with Canvas do
    begin
      MoveTo(X, 0);
      Pen.Color := clBtnFace;
      LineTo(X, 300);
      Pen.Color := clWindowText;
      LineTo(X, Y);
    end;
  until X > 500;

  // don't forget to close the mixer handle when you're done

  Rslt := mixerClose(Mixer);
  if Rslt <> 0 then
    raise Exception.CreateFmt('Can''t close mixer (%d)', [Rslt]);
end;



Kan nogen lave den om, så den virker under Win 2000, eller har nogen en alternativ måde til at få lyden til at give udslag. Det behøver ikke tegnes på formen det kan også bare være i en progressbar, så får han de 200 point.

Med venlig Hilsen

Mikkel

Avatar billede Slettet bruger
06. april 2002 - 11:03 #1
Nå, jo... Fejlen under win 2000 er en exception class:

"Can't find peak-meter control (1025)"
Avatar billede skov_p Praktikant
06. april 2002 - 11:08 #2
Er jeg fatsvag eller hvad. Jeg kan ikke finde ud af at oprette et spørgamål, hvor gør jeg det henne. Undskyld jeg bruger dit spørgsmål men det er det sidste der er oprettet så jeg tænkte nat jeg kunne få svar her.
Avatar billede Slettet bruger
06. april 2002 - 11:30 #3
Lige under eksperten-logoet er der et menupunkt, der hedder opret spørgsmål.
Avatar billede martinlind Nybegynder
06. april 2002 - 13:04 #4
Det lyder som om du ikke har lydkort i begge maskiner, var det Win2000 eller Win98 der var problemet ??
Avatar billede Slettet bruger
06. april 2002 - 13:41 #5
Der er lydkort i begge maskiner, og det er under win2000 at fejlen dukker op. Hjælp??????
Avatar billede martinlind Nybegynder
06. april 2002 - 14:07 #6
Du skal rette denne line så kører det !!! istedet for MIXER_GETLINECONTROLSF_ONEBYTYPE skal du bruge MIXER_GETLINECONTROLSF_ALL, så kører det, men hvis det SKAL være den parameter du har valgt skal du nok ind og kigge på din MixerLineControls record.

//  Rslt := mixerGetLineControls(Mixer, @MixerLineControls,MIXER_GETLINECONTROLSF_ONEBYTYPE);
  Rslt := mixerGetLineControls(Mixer, @MixerLineControls,MIXER_GETLINECONTROLSF_ALL);

/Martin
Avatar billede martinlind Nybegynder
06. april 2002 - 14:08 #7
brug evt denne kode, så får du en bedre fejl

    case Rslt of
MIXERR_INVALCONTROL  : raise Exception.CreateFmt('The control reference is invalid. (%d)',[Rslt]);
MIXERR_INVALLINE    : raise Exception.CreateFmt('The audio line reference is invalid. (%d)',[Rslt]);
MMSYSERR_BADDEVICEID : raise Exception.CreateFmt('The hmxobj parameter specifies an invalid device identifier. (%d)',[Rslt]);
MMSYSERR_INVALFLAG  : raise Exception.CreateFmt('One or more flags are invalid. (%d)',[Rslt]);
MMSYSERR_INVALHANDLE : raise Exception.CreateFmt('The hmxobj parameter specifies an invalid handle. (%d)',[Rslt]);
MMSYSERR_INVALPARAM    : raise Exception.CreateFmt('One or more parameters are invalid. (%d)',[Rslt]);
MMSYSERR_NODRIVER    : raise Exception.CreateFmt('No mixer device is available for the object specified by hmxobj. (%d)',[Rslt]);
    end;
//  if Rslt <> 0 then
//    raise Exception.CreateFmt('Can''t find peak meter control (%d)',[Rslt]);
Avatar billede Slettet bruger
06. april 2002 - 15:37 #8
Hvis jeg bruger dit svar og ændrer det, bliver der bare tegnet, med canvasen, en helt sort "firkant" lyden giver ikke udslag.

Når jeg så prøver at erstatte det med fejlene, giver den denne fejl:

The control reference is invalid. (1025)

Hvad kan der gøres ved det?
Avatar billede Slettet bruger
06. april 2002 - 15:39 #9
Jeg har i øvrigt fundet koden på:

http://www.swissdelphicenter.ch/torry/showcode.php?id=1086

Hvis det skulle interessere dig.
Avatar billede martinlind Nybegynder
06. april 2002 - 15:39 #10
Jeg tror det er din MixerLineControls record der ikke er sat rigtigt op, ellers har jeg ikke nogle idé.

/Martin
Avatar billede martinlind Nybegynder
06. april 2002 - 15:41 #11
Som han skriver :

{
  Every line going into and out of the mixer has a number of "controls"
  associated with it. Some of those controls are "meters," which give
  you a real-time value of the sound level on the corresponding line.
  Not all lines have meter controls, and not all sound cards provide
  support for meters.

  Here's some code that will retrieve a handle to the meter attached to
  the WaveOut source of the speaker line, if there is one:
}

Not all lines have meter controls, and not all sound cards provide
support for meters. MÅSKE DET ER DER PROBLEMET LIGGER !!!!
Avatar billede Slettet bruger
06. april 2002 - 15:42 #12
Undskyld, jeg er lidt nybegynder indenfor dette område, hvordan kan jeg ændre min MixerLineControls record?
Avatar billede Slettet bruger
06. april 2002 - 15:43 #13
Kan det have nogen betydning at jeg har to lydkort i?
Avatar billede Slettet bruger
06. april 2002 - 15:45 #14
Jeg har prøvet med begge lydkort, og ingen af dem virker. De er begge SoundBlaster. Et gammelt SB 16 og et nyere SB 512. Det kan ikke være rigtigt at ingen af dem virker.
Men har du ellers en anden ide om hvordan jeg kan få udslag fra lyden?
Avatar billede martinlind Nybegynder
06. april 2002 - 15:47 #15
Lyder som om det er koden den er gal med. Har igen ider, søg vidre på nettet
Avatar billede Slettet bruger
15. april 2002 - 19:11 #16
Point til mig selv...
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