![]() |
Delphi-Version: 10.4 Sydney
Objektmethode als Objective-C Callback
Hallo!
In den Wrappern für iOS von Delphi habe ich bspw. folgende Deklaration
Code:
Wie kann ich an die Variable inputProc eine Objektfunktion anhängen?
AURenderCallbackStruct = record
inputProc: AURenderCallback; inputProcRefCon: Pointer; end; AURenderCallback = function(param1: Pointer; param2: PAudioUnitRenderActionFlags; param3: PInteger; param4: UInt32; param5: UInt32; param6: PInteger): OSStatus; cdecl; Bisher verwende ich hierfür eine globale Funktion bzw. eine statische Klassenfunktion. Bei letzter verliere ich aber den Zugriff auf die Objektvariablen. Ich möchte es aber gerne über eine Objektfunktion lösen, da ich hier heraus auch noch Events triggern möchte. Ich weiss um den Umstand, dass Delphi bei Objektfunktionen immer implizit self als ersten Parameter mitgibt. Aus diesem Grund funktioniert der direkte Zuweis nicht. Es wäre nett, wenn mir jemand das Erklären und mir eine Lösung aufweisen könnte. Ich stehe momentan komplett auf dem Schlauch! Vielen Dank! |
AW: Objektmethode als Objective-C Callback
Der erste Parameter sieht laut Doku so aus, als ob du dir da einen Zeiger auf selbst definierte Daten hineingeben kannst.
![]() Du musst also weiterhin wie gehabt vorgehen mit statisch oder Klassenfunktion, aber kannst auf deine lebende Instanz casten.
Delphi-Quellcode:
function DeineImplementierungVonAURenderCallback(param1: Pointer; param2: PAudioUnitRenderActionFlags; param3: PInteger; param4: UInt32; param5: UInt32; param6: PInteger): OSStatus; cdecl;
var BeispielNameFürDeineInstanz: TBeispielKlassenName; begin BeispielNameFürDeineInstanz:= TBeispielKlassenName(param1); BeispielNameFürDeineInstanz.DeinMethodenAufruf(); BeispielNameFürDeineInstance.AndererMethodenAufrufMitDenParametern(param2, param3, param4, param5); Result := 0; // oder was auch immer man da als OSStatus zurückgibt. end; |
AW: Objektmethode als Objective-C Callback
Der Vollständigkeit halber:
![]()
Delphi-Quellcode:
Und ich würde an deiner Stelle die Parameter der Callback gemäß der Doku benennen, macht das Leben leichter.
var
BeispielNameFürDeineInstanz: TBeispielKlassenName; begin BeispielNameFürDeineInstanz := TBeispielKlassenName.Create; AudioUnitAddRenderNotify(ZeigerAufAudioUnitVonIrgendwoher, DeineImplementierungVonAURenderCallback, BeispielNameFürDeineInstanz); Also inRefCon, ioActionFlags, inTimeStamp...anstatt param1, param2, param3. |
AW: Objektmethode als Objective-C Callback
Hallo!
Ich stehe das immer noch auf dem Schlauch. Wäre es eventuell Möglich ein komplettes Beispiel anzugeben? Viellicht war der Tag heute auch zu lang! :lol: |
AW: Objektmethode als Objective-C Callback
Zeig mal, was du bisher hast.
|
AW: Objektmethode als Objective-C Callback
|
AW: Objektmethode als Objective-C Callback
Hi!
Ich kann da im Moment nix zeigen, da ich es im Moment so gelöst habe
Code:
Dann hänge ich die Methode an
TMyCallbackClass = class
public class function OutputCallback(inRefCon: Pointer; ioActionFlags: PAudioUnitRenderActionFlags; inTimeStamp: PInteger; inBusNumber, inNumberFrames: UInt32; ioData: PInteger): OSStatus; static; property OnVUMeterEvent: TVUMeterEvent read FVUMeterEvent write FVUMeterEvent; end;
Code:
Das ist ja ein grundsätzliches Problem....
outputcallbackStruct.inputProc := @TMyCallbackClass.OutputCallback;
Wenn ich eine Dll selbst schreibe bzw. dll's verwende kann ich mir einen entsprechenden Wrapper bauen, aber irgendwie fehlt mir hier das verständnis für die Funktion Pointer etc. in Verbindung mit den erzeugten Objective-C-Wrappern? |
AW: Objektmethode als Objective-C Callback
Delphi-Quellcode:
var
KlugerVariablenName: TMyCallbackClass; //für diese Beispielzeilen lokal, ist aber wohl irgendwo eine Membervariable im übergeordneten Kontext sein!? begin KlugerVariablenName := TMyCallbackClass.Create; outputcallbackStruct.inputProc := @TMyCallbackClass.OutputCallback; outputcallbackStruct.inputProcRefCon := KlugerVariablenName // oder @KlugerVariablenName -> Compiler wirds dir sagen end;
Delphi-Quellcode:
class function TMyCallbackClass.OutputCallback(inRefCon: Pointer; ioActionFlags: PAudioUnitRenderActionFlags; inTimeStamp: PInteger; inBusNumber, inNumberFrames: UInt32; ioData: PInteger): OSStatus; var Instance: TMyCallbackClass; begin if inRefCon <> nil then begin Instance := TMyCallbackClass(inRefCon); Instance.RufeVUMeterEventAuf(); // Beispiel! end; end; |
AW: Objektmethode als Objective-C Callback
Hallo!
Leider funktioniert das nicht
Code:
Egal ob man nun 'nil', oder die Referenzvariable übergibt geht er im Anschluss immer in das if
outputcallbackStruct.inputProcRefCon := KlugerVariablenName
Code:
rein.
class function TMyCallbackClass.OutputCallback(inRefCon: Pointer; ioActionFlags: PAudioUnitRenderActionFlags; inTimeStamp: PInteger; inBusNumber, inNumberFrames: UInt32; ioData: PInteger): OSStatus;
var Instance: TMyCallbackClass; begin if inRefCon <> nil then begin Instance := TMyCallbackClass(inRefCon); Instance.RufeVUMeterEventAuf(); // Beispiel! end; end; Da scheint der Pointer nicht richtig gesetzt zu werden, denn auch wenn ich die Referenz übergebe, dann erhalte ich eine Ausnahmeverletzung bei der Abarbeitung des Events, denn der Compiler erkennt die Membervariable 'FVUMeterEvent' als Assigned, obwohl sie nicht Assigned ist
Code:
also an dem Event nichts angehängt wurde.
procedure TMyCallbackClass.RufeVUMeterEventAuf;
begin if Assigned(FVUMeterEvent) then begin FVUMeterEvent; end; end; |
AW: Objektmethode als Objective-C Callback
Was sagt denn der Debugger?
Wie sind die Werte für (ja, ich will Pointer sehen) KlugerVariablenName, outputcallbackStruct.inputProcRefCon, inRefCon, Instance? Oder sind es vielleicht die Daten selbst? Ändert sich der Pointer inRefCon bei jedem Aufruf der Callback? Diese SO-Antwort deutet es an: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz