Вопрос

У меня есть этот код в .mm

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

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

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

И тогда MyMidinotifyProc вызывается из Кориди.

Не изменяя расширение файла на .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 (связь).

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

Это было полезно?

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top