Domanda

Ho questo codice in un .mm

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

che va con questa linea

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

e poi il MyMIDINotifyProc viene chiamato da CoreMIDI.

Senza cambiare l'estensione del file a .m, ho tradotto in una firma Obj-C:

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

che compila, ma poi non ho idea di cosa fare con la linea MIDIClientCreate. Come è, produce "MyMIDINotifyProc" was not declared in this scope. Si suppone che sia di tipo void * ... E i documenti sono chiari al 100% che si tratta di A refCon passed back to notifyRefCon ( link ).

E 'questo problema risolvibile nel solo Obj-C? Immagino che avrei dovuto tradurre il roba C ++ a C, nel qual caso vorrei solo lasciarlo solo.

È stato utile?

Soluzione

MIDIClientCreate si aspetta una funzione C ordinario come la sua callback. Non è possibile passare è un metodo di Objective-C, perché la convenzione di chiamata è diversa (in termini di C, i primi due parametri a un metodo di Objective-C sono self e _cmd - il selettore - che non sarà lì per una funzione ordinaria C ).

Il solito modo per aggirare questo è di creare una funzione C che agisce come uno spessore ed esplicitamente passare sé come parametro. La funzione di spessore quindi invia immediatamente il messaggio Objective-C. Non ho familiarità con questa libreria, ma sembra refCon è un parametro progettata esattamente per questo genere di cose. Quindi, nel file .m hai bisogno di una funzione come questa.

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

È inoltre necessario un metodo per fare la roba reale:

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

E si chiama MIDIClientCreate esattamente come facevi in ??origine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top