06. april 2002 - 11:02Der 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.
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.
Synes godt om
Slettet bruger
06. april 2002 - 11:30#3
Lige under eksperten-logoet er der et menupunkt, der hedder opret spørgsmål.
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.
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]);
Synes godt om
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:
{ 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 !!!!
Synes godt om
Slettet bruger
06. april 2002 - 15:42#12
Undskyld, jeg er lidt nybegynder indenfor dette område, hvordan kan jeg ændre min MixerLineControls record?
Synes godt om
Slettet bruger
06. april 2002 - 15:43#13
Kan det have nogen betydning at jeg har to lydkort i?
Synes godt om
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?
Lyder som om det er koden den er gal med. Har igen ider, søg vidre på nettet
Synes godt om
Slettet bruger
15. april 2002 - 19:11#16
Point til mig selv...
Synes godt om
Ny brugerNybegynder
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.