AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Objektmethode als Objective-C Callback

Ein Thema von LairdTurner · begonnen am 30. Apr 2021 · letzter Beitrag vom 3. Mai 2021
Antwort Antwort
LairdTurner

Registriert seit: 25. Aug 2015
5 Beiträge
 
#1

Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 17:11
Delphi-Version: 10.4 Sydney
Hallo!

In den Wrappern für iOS von Delphi habe ich bspw. folgende Deklaration
Code:
AURenderCallbackStruct = record
    inputProc: AURenderCallback;
    inputProcRefCon: Pointer;
  end;
AURenderCallback = function(param1: Pointer; param2: PAudioUnitRenderActionFlags; param3: PInteger; param4: UInt32; param5: UInt32; param6: PInteger): OSStatus; cdecl;
Wie kann ich an die Variable inputProc eine Objektfunktion anhängen?
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!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 17:37
Der erste Parameter sieht laut Doku so aus, als ob du dir da einen Zeiger auf selbst definierte Daten hineingeben kannst.
https://developer.apple.com/document...rendercallback

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;

Geändert von TiGü (30. Apr 2021 um 17:48 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 17:47
Der Vollständigkeit halber:
https://developer.apple.com/document...ddrendernotify

Delphi-Quellcode:
var
  BeispielNameFürDeineInstanz: TBeispielKlassenName;

begin
  BeispielNameFürDeineInstanz := TBeispielKlassenName.Create;
  AudioUnitAddRenderNotify(ZeigerAufAudioUnitVonIrgendwoher, DeineImplementierungVonAURenderCallback, BeispielNameFürDeineInstanz);
Und ich würde an deiner Stelle die Parameter der Callback gemäß der Doku benennen, macht das Leben leichter.
Also inRefCon, ioActionFlags, inTimeStamp...anstatt param1, param2, param3.
  Mit Zitat antworten Zitat
LairdTurner

Registriert seit: 25. Aug 2015
5 Beiträge
 
#4

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 17:52
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!
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 17:55
Zeig mal, was du bisher hast.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 17:59
Schaue dir auch dieses Swift-Beispiel an:
https://stackoverflow.com/a/41388782
  Mit Zitat antworten Zitat
LairdTurner

Registriert seit: 25. Aug 2015
5 Beiträge
 
#7

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 18:04
Hi!

Ich kann da im Moment nix zeigen, da ich es im Moment so gelöst habe
Code:
  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;
Dann hänge ich die Methode an
Code:
outputcallbackStruct.inputProc := @TMyCallbackClass.OutputCallback;
Das ist ja ein grundsätzliches Problem....
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Objektmethode als Objective-C Callback

  Alt 30. Apr 2021, 18:18
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;
  Mit Zitat antworten Zitat
LairdTurner

Registriert seit: 25. Aug 2015
5 Beiträge
 
#9

AW: Objektmethode als Objective-C Callback

  Alt 1. Mai 2021, 10:30
Hallo!

Leider funktioniert das nicht
Code:
outputcallbackStruct.inputProcRefCon := KlugerVariablenName
Egal ob man nun 'nil', oder die Referenzvariable übergibt geht er im Anschluss immer in das if

Code:
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;
rein.

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:
procedure TMyCallbackClass.RufeVUMeterEventAuf;
begin
  if Assigned(FVUMeterEvent) then
  begin
    FVUMeterEvent;
  end;
end;
also an dem Event nichts angehängt wurde.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Objektmethode als Objective-C Callback

  Alt 3. Mai 2021, 12:47
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: https://stackoverflow.com/a/61213737
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:21 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