Pregunta

Tengo este código en un .mm

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

que va con esta línea

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

y luego el MyMIDINotifyProc se llama a partir de CoreMIDI.

Sin cambiar la extensión del archivo a .m, que se tradujo en una firma Obj-C:

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

que compila, pero no tengo idea de qué hacer con la línea MIDIClientCreate. Como es, produce "MyMIDINotifyProc" was not declared in this scope. Se supone que debe ser de tipo void * ... Y los documentos son 100% claro que es A refCon passed back to notifyRefCon ( enlace ).

Es esto un problema solucionable en Obj-C sola? Me imagino que tendría que traducir el material C ++ a C, en cuyo caso me acaba de dejarlo solo.

¿Fue útil?

Solución

MIDIClientCreate espera una función ordinaria C como su devolución de llamada. No se puede pasar que un método de Objective-C, porque la convención de llamada es diferente (en términos de C, los dos primeros parámetros a un método de Objective-C son self y _cmd - el selector - que no estará allí para una función de C ordinaria ).

La forma usual de evitar esto es crear una función de C que actúa como una cuña y explícitamente pasar auto como un parámetro. La función de cuña a continuación, envía inmediatamente el mensaje objetivo-C. No estoy familiarizado con esta biblioteca, pero parece que es un parámetro refCon diseñado precisamente para este tipo de cosas. Así que en su archivo .m necesita una función como esta.

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

También es necesario un método de hacer las cosas reales:

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

Y se llama a MIDIClientCreate exactamente como lo hacían en un principio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top