2010-12-12 5 views
0

У меня есть этот код в .mmПеревести на Objective-C от Objective-C++

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

, который идет с этой линией

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

и затем MyMIDINotifyProc вызывается из CoreMIDI.

без изменения расширения файла .m, я перевел на подпись Obj-C:

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

который компилирует, но я понятия не имею, что делать с MIDIClientCreate линии. Как есть, он производит "MyMIDINotifyProc" was not declared in this scope. Он должен быть типа void * ... И документы на 100% понятны, что это A refCon passed back to notifyRefCon (link).

Является ли эта проблема разрешимой только в Obj-C? Я предполагаю, что мне пришлось бы перевести материал C++ на C, и в этом случае я бы просто оставил его в покое.

ответ

3

MIDIClientCreate ожидает, что обычная функция C станет ее обратным вызовом. Вы не можете передать ему метод Objective-C, потому что соглашение о вызове отличается (в терминах C первые два параметра для метода Objective-C: self и _cmd - селектор, который не будет использоваться для обычной функции C).

Обычный способ заключается в создании функции C, которая действует как прокладка и явно передает значение self в качестве параметра. Затем функция прокладки немедленно отправляет сообщение цели-С. Я не знаком с этой библиотекой, но похоже, что refCon - это параметр, предназначенный именно для такого рода вещей. Поэтому в вашем файле .m вам понадобится такая функция.

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

Вы также нужен метод, чтобы сделать фактический материал:

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

И вы называете MIDIClientCreate именно так, как вы делали первоначально.

+0

Спасибо, +1, и я приму этот ответ, как только я его перевариваю (или как только XCode делает;)). –