Avatar billede Slettet bruger
28. maj 2002 - 18:55 Der er 8 kommentarer og
1 løsning

Peak meter

Hej

Jeg fandt en kode til et peak meter, men det virker ikke rigtigt der står "can't find peak meter control (1025).
koden ser sådan ud:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, MMSystem, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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;

end.
Avatar billede Slettet bruger
28. maj 2002 - 20:44 #1
er der ikke nogen der vil hjælpe mig
Avatar billede funkeychicken Nybegynder
28. maj 2002 - 20:45 #2
hvad er et peakmeter...
Avatar billede hermandsen Juniormester
29. maj 2002 - 02:03 #3
Det ville jeg egentlig også gerne vide...
Avatar billede hreiff Nybegynder
29. maj 2002 - 16:50 #4
Her genereres din fejl.
Prøv at se om du kan finde ud af hvad Rslt = 1025 betyder.

Rslt := mixerGetLineControls(Mixer, @MixerLineControls,
    MIXER_GETLINECONTROLSF_ONEBYTYPE);
if Rslt <> 0 then
  raise Exception.CreateFmt('Can''t find peak meter control (%d)',
      [Rslt]);

Et peak meter må her angive input niveauet på mixeren.
Avatar billede Slettet bruger
29. maj 2002 - 17:18 #5
hvad betyder "raise"
Avatar billede hermandsen Juniormester
29. maj 2002 - 19:52 #6
"raise" er et reserveret ord som sender besked om en fejl... Slå det op i hjælpen...
Avatar billede hreiff Nybegynder
30. maj 2002 - 13:44 #7
Det der foregår er at mixerGetLineControls ikke returnerer 0 (som den skal hvis det går godt), og derfor genereres en fejl. Du får 1025, og tallet kan måske sige noget om hvad der går galt
Avatar billede Slettet bruger
09. juni 2002 - 15:56 #8
Det kan jeg sq ikke selv finde ud af, jeg lukker.
Avatar billede Slettet bruger
09. juni 2002 - 15:56 #9
Svar
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