Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi WaveInOpen - CALLBACK_FUNCTION - Problem (https://www.delphipraxis.net/6391-waveinopen-callback_function-problem.html)

red 9. Jul 2003 11:49


WaveInOpen - CALLBACK_FUNCTION - Problem
 
Also ich habe folgendes:

Delphi-Quellcode:
  TSpeak = class(TObject)
  private
    procedure waveInProc(SomeWaveIn: HWaveIn; uMsg: UINT; dwInstance: DWORD; dwParam1, dwParam2: DWORD); stdcall;
  public
    WaveIn: hWaveIn;
    constructor create;
    destructor free;
  end;

//ganz normale klasse halt

var
  Speak1: TSpeak;

implementation

{$R *.dfm}

//normal stuff

constructor TSpeak.create;
var header: TWaveFormatEx;
begin
  inherited;
  WaveIn := 0;
  with header do
  begin
    wFormatTag := WAVE_FORMAT_PCM;
    nChannels := 1;
    nSamplesPerSec := 11050;
    wBitsPerSample := 8;
    nBlockAlign := 1;
    nAvgBytesPerSec := 11050;
    cbSize := 0;
  end;

  WaveInOpen(@WaveIn, WAVE_MAPPER, @header, DWORD(@Tspeak.WaveInProc), 1234567, CALLBACK_FUNCTION);

  // hier sind dann noch andere "befehle" .. die werden allerdings aufgrund einer exception nicht ausgeführt :( .. und sind somit für mein problem uninterresant

end;


procedure TSpeak.waveInProc(SomeWaveIn: HWaveIn; uMsg: UINT; dwInstance: DWORD; dwParam1, dwParam2: DWORD); stdcall;
begin
 // bisher ne leer procedure .. nur für den compiler
end;

//destructor auch uninterresant
wenn ich nun Speak1 := TSpeak.create; aufrufe bekomm ich eine exception in der form: "Access violation at address 00138000. Write of address 00000001"

In einem andere project wo ich mit CALLBACK_WINDOW anstelle von CALLBACK_FUNCTION arbeite tritt diese exception nicht auf .. daher liegt der Verdacht nahe das es an WaveInOpen liegt

hilfe :/

bye frank

[edit=Daniel B]Delphi-Tags eingefügt. Mfg, Daniel B[/edit]

tommie-lie 9. Jul 2003 12:41

Re: WaveInOpen - CALLBACK_FUNCTION - Problem
 
Zitat:

Zitat von red
Code:
  WaveInOpen(@WaveIn, WAVE_MAPPER, @header, DWORD(@Tspeak.WaveInProc), 1234567, CALLBACK_FUNCTION);
wenn ich nun Speak1 := TSpeak.create; aufrufe bekomm ich eine exception in der form: "Access violation at address 00138000. Write of address 00000001"

In einem andere project wo ich mit CALLBACK_WINDOW anstelle von CALLBACK_FUNCTION arbeite tritt diese exception nicht auf .. daher liegt der Verdacht nahe das es an WaveInOpen liegt

Hmm, war es ncihtmal so, daß die Funktion nicht in einem Objekt liegen darf, in diesem Fall also nicht innerhalb der Klasse TSpeak?
Deklarier' mal die WaveInProc außerhalb der Klasse in der Unit und probier's dann mal.
Wenn's klappt, liegt's daran wie Klassen intern verwaltet werden, nämlich selbst als Pointer, wenn nicht, liegt's an was anderem :mrgreen:
Ansonsten habe ich nicht geschaut, ob die Parameter von WaveInProc korrekt sind...

red 9. Jul 2003 13:49

Re: WaveInOpen - CALLBACK_FUNCTION - Problem
 
whoha vielen dank jetzt gehts

wäre natürlich schöner wenn die function im object liegen könnte .. aber naja

gibt es ne möglichkeit die Callback-Routine "ins Object zu legen"
Ich mein für den dwCallback Parameter in WaveInOpen steht in der hilfe:

Address of a fixed callback function, an event handle, a handle to a window, or the identifier of a thread

Address of a fixed callback function .. entfällt ja nun :D
a handle to a window .. entfällt auch
wie sieht es aus mit threads bzw einem event handle? (kenn mich mit beidem garnich aus)

tommie-lie 9. Jul 2003 14:53

Re: WaveInOpen - CALLBACK_FUNCTION - Problem
 
Zitat:

Zitat von red
gibt es ne möglichkeit die Callback-Routine "ins Object zu legen"

Das habe ich schon mit der ThreadProc probiert, die ich in einem Objekt haben wollte, und habe es nicht hingekriegt.
Windows erwartet "echte" Funktionen als Parameter, da Objekte aber intern Pointer sind, haben sie keine echten Adressen für ihre Methoden, den Windows benutzen könnte.
Daher schlägt normalerweise schon der Versuch fehl, einen Pointer auf eine Methode (Funktion oder Prozedur in Objekt) zu benutzen. (Fehlermeldung: "Variable required")

Zitat:

Address of a fixed callback function .. entfällt ja nun :D
a handle to a window .. entfällt auch
wie sieht es aus mit threads bzw einem event handle? (kenn mich mit beidem garnich aus)
Also bei einem Thread werden an das Handle des Threads die Nachrichten MM_WIM_OPEN, MM_WIM_CLOSE, und MM_WIM_DATA geschickt, die du mit GetMessage
selbst abfangen musst (wie in einem nonVCL-Programm), solange der Thread läuft. Ich weiß nicht genau, was du in deiner WaveInProc machen würdest, wenn sie funktionieren würde, aber mit Hilfe von InterlockedExchange, CriticalSections und Pointern wäre das sicherlich eine brauchbare Alternative.
Bei einem Event Handle handelt es sich um ein Windows-Event, das zwei Stati hat, entweder "signaled" oder "nonsignaled". Das ganze arbeitet auf Thread-Ebene und dient dazu, einen Thread für eine unbestimmte Zeit auf "Idle" zu zu setzen und automatisch wieder zu wecken. Die Funktion dazu lautet "WaitForSingleObject" und nimmt u.A. ein Event als Parameter auf. Die Funktion ist vom Ergebnis ähnlich wie Sleep(), nur daß auf dieses Event gewartet wird, daß von einem anderen Thread auf "signaled" gesetzt wird. Wie damit irgendwelche Parameter übergeben werden sollen, weiß ich nicht (davon steht auch nix im PSDK).


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz