Question

J'ai ce code dans un .mm

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

qui va de pair avec cette ligne

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

et puis le MyMIDINotifyProc est appelé à partir CoreMIDI.

Sans changer l'extension du fichier .m, je traduit à une signature Obj-C:

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

qui compile, mais je ne sais pas quoi faire avec la ligne de MIDIClientCreate. Comme il est, il produit "MyMIDINotifyProc" was not declared in this scope. Il est censé être de type void * ... Et les docs sont 100% clair que c'est A refCon passed back to notifyRefCon ( lien ).

Est-ce résoluble problème dans Obj-C seul? Je suppose que je dois traduire le C ++ choses à C, dans ce cas, je voudrais juste le laisser seul.

Était-ce utile?

La solution

MIDIClientCreate attend une fonction ordinaire de C comme rappel. Vous ne pouvez pas le passer d'une méthode Objective-C, car la convention d'appel est différent (en C, les deux premiers paramètres à une méthode Objective-C sont self et _cmd - le sélecteur - qui ne sera pas là pour une fonction ordinaire C ).

La manière habituelle autour est de créer une fonction C qui agit comme une cale et de transmettre explicitement l'auto comme paramètre. La fonction de calage puis envoie immédiatement le message Objective-C. Je ne suis pas au courant de cette bibliothèque, mais il semble que refCon est un paramètre conçu pour exactement ce genre de chose. Donc, dans votre fichier .m vous avez besoin d'une fonction comme celui-ci.

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

Il faut aussi une méthode pour faire les choses réelles:

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

Et vous appelez MIDIClientCreate exactement comme vous le faisiez à l'origine.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top