Frage

Ich habe diesen Code in einem .mm

void MyMIDINotifyProc(const MIDINotification *message, void *refCon);

, die mit dieser Zeile

geht

MIDIClientCreate((CFStringRef)@"MidiMonitor MIDI Client", MyMIDINotifyProc, self, &client);

und dann die MyMIDINotifyProc von Coremidi aufgerufen wird.

Ohne die Dateierweiterung .m zu ändern, übersetzte ich auf einen Obj-C Signatur:

@interface MidiInput (Private) 
    -(void) MyMIDINotifyProc:(const MIDINotification *)message reference:(void *)refCon;
@end

, die kompiliert, aber dann habe ich keine Ahnung, was mit der MIDIClientCreate Linie zu tun. Wie produziert es "MyMIDINotifyProc" was not declared in this scope. Es sollte vom Typ void * sein ... Und die docs sind zu 100% klar, dass es der A refCon passed back to notifyRefCon ( link ).

Ist das Problem lösbar in Obj-C allein? Ich stelle mir vor ich hätte zu den C ++ Sachen C zu übersetzen, wobei in diesem Fall würde ich es einfach in Ruhe lassen.

War es hilfreich?

Lösung

MIDIClientCreate erwartet eine normale C-Funktion als Callback. Sie können es nicht eine Objective-C-Methode übergeben, weil die Aufrufkonvention unterscheidet (in C ausgedrückt, die ersten beiden Parameter zu einer Objective-C-Methode sind self und _cmd - der Wähler - was es nicht für eine gewöhnliche C-Funktion sein wird, ).

Der üblicher Weg, um dies ist eine C-Funktion zu erstellen, die als Shim wirkt und selbst explizit als Parameter übergeben. Die Shim-Funktion sendet dann sofort die Objective-C-Nachricht. Ich bin mit dieser Bibliothek nicht vertraut, aber es sieht aus wie refCon ein Parameter für genau diese Art der Sache entworfen ist. Also in Ihrer .m Datei benötigen Sie eine Funktion wie diese.

static void MyMIDINotifyProc(const MIDINotification *message, void *refCon)
{
    [(id) refCon MIDINotify: message];
}

Sie müssen auch eine Methode, um die tatsächlichen Dinge zu tun:

-(void) MIDINotify: (const MIDINotification*) message
{
    // do stuff
}

Und Sie nennen MIDIClientCreate genau so, wie Sie wurden ursprünglich zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top