ERLEDIGT
JA
JA
ANTWORTEN
3
3
ZUGRIFFE
1618
1618
EMPFEHLEN
-
Liebes Team,
ich versuche mich seit Tagen daran einer Funktion aus einer C-Bibliothek eine C++ Funktionsreferenz zu übergeben.
Bei der Bibliothek handelt es sich um den Jack-Audio Server. Der Server verbindet einen oder mehrere angemeldete Clients mit der Soundkarte und realisert so die Audio-Ausgabe. Ich selbst möchte für diesen Server einen Client schreiben, also ein Programm, dass Audio ausgibt.
Um die Verbindung zum Server herzustellen, muss man dem Server eine Referenz auf eine Funktion übergeben, die dieser aufruft, wenn mein Programm seine Audio-Daten ausgeben darf. Mein Programm ist also in C++ geschrieben, folglich ist die Funktion, die Callback Funktion werden soll, eine Member Funktion. Normale C Funktionen werden von dem Server akzeptiert. Meine C++ Member Funktion jedoch nicht. Es gibt die folgende Fehlermeldung:
argument of type 'int (Crasynth:
(jack_nframes_type_t)(void*) does not match 'int (*)(jack_nframes_t, void*)'
Ich bin schon ganz schön verzweifelt und googlen hat mir nichts gebracht, außer den Stichworten 'extern' und 'Templates', die ich aber nicht richtig verstehe.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
#include ... #include <jack/jack.h> extern "C" int process (jack_nframes_t nframes, void *arg); using namespace std; class Crasynth{ private:... public: int create_client(...); //Hilfsfunktion zur Initialisierung int process (jack_nframes_t, void*); //Soll Callback werden Crasynth(); ~Crasynth(); }; // Ende der Deklaration von Crasynth //------------------------------------------------------------------------------------------------------------- int Crasynth::process (jack_nframes_t nframes, void *arg){ ... } jack_client_t Crasynth::create_client(...){ ... return jack_client; } // MAIN int main(){ const char *client_name="Crasynth\n"; Crasynth clientObj; //mein Objekt jack_client_t jackClient; //ein Client, den der Server schluckt jackClient= clientObj.createClient(...); jack_set_process_callback(jack_client, process, 0); /* Callback setzen geht nicht, weil C keine Memberfunktionen akzeptiert*/ while(1); }
Ich weiß wirklich nicht, was ich tu soll. Alles in C schreiben wäre eine unschöne Möglichkeit und stellt für mich keinen Ausweg dar. Ich muss C++ lernen!
Ich bin für jeden Hilfsversuch dankbar!
Viele Grüße
Andreas
-
Hallo Andreas,
Klassenmethoden können nur als Callback-Funktionen verwendet werden, wenn sie als "static" deklariert werden. Ansonsten passen die Aufrufkonventionen nicht zusammen.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
05.02.09 15:23 #3
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
So wie es aussieht kannst du ja einen beliebigen Parameter beim registrieren der Callbackfunktion mitgeben.
So könntest du eine Wrapperfunktion schreiben:
GrußCode cpp:1 2 3 4 5 6 7 8 9 10
int Crasynth_process(jack_nframes_t frames, void* data) { Crasynth* obj = reinterpret_cast<Crasynth*>(data); return obj->process(frames); } ... Crasynth clientObj; //mein Objekt // registrieren: jack_set_process_callback(jack_client, &Crasynth_process, &clientObj);
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Danke! Das funktioniert tatsächlich gut. Ich habe die Wrapper Funktion anschließend selbst noch in mein Objekt "integriert". Dazu musste ich sie dann allerdings static machen, was ja nicht störend ist.
Gelöst! und sehr geholfen...
Grüße.
Ähnliche Themen
-
struct in eine Funktion übergeben
Von parotech im Forum C/C++Antworten: 5Letzter Beitrag: 07.01.11, 13:28 -
Javscript funktion als String an eine Javaskript funktion übergeben
Von Mazzok im Forum Javascript & AjaxAntworten: 1Letzter Beitrag: 16.12.08, 08:43 -
Daten aus einer Funktion in eine andere übergeben
Von chofer02 im Forum PHPAntworten: 9Letzter Beitrag: 10.10.06, 19:15 -
Eine Variable von einer Funktion an eine andere übergeben
Von pride im Forum Javascript & AjaxAntworten: 2Letzter Beitrag: 26.08.05, 22:59 -
Funktion eine Variable übergeben?
Von maho15 im Forum Javascript & AjaxAntworten: 5Letzter Beitrag: 14.07.02, 10:55





Zitieren
Login






