AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi WaveInOpen - CALLBACK_FUNCTION - Problem
Thema durchsuchen
Ansicht
Themen-Optionen

WaveInOpen - CALLBACK_FUNCTION - Problem

Ein Thema von red · begonnen am 9. Jul 2003 · letzter Beitrag vom 9. Jul 2003
Antwort Antwort
red

Registriert seit: 29. Jun 2003
3 Beiträge
 
Delphi 6 Enterprise
 
#1

WaveInOpen - CALLBACK_FUNCTION - Problem

  Alt 9. Jul 2003, 12:49
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]
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#2

Re: WaveInOpen - CALLBACK_FUNCTION - Problem

  Alt 9. Jul 2003, 13:41
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
Ansonsten habe ich nicht geschaut, ob die Parameter von WaveInProc korrekt sind...
  Mit Zitat antworten Zitat
red

Registriert seit: 29. Jun 2003
3 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: WaveInOpen - CALLBACK_FUNCTION - Problem

  Alt 9. Jul 2003, 14:49
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
a handle to a window .. entfällt auch
wie sieht es aus mit threads bzw einem event handle? (kenn mich mit beidem garnich aus)
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#4

Re: WaveInOpen - CALLBACK_FUNCTION - Problem

  Alt 9. Jul 2003, 15:53
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
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).
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11: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