0

我在 .mm 中有此代码

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

这条线

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

然后从 CoreMIDI 调用 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,在这种情况下我就别管它了。

4

1 回答 1

3

MIDIClientCreate期望一个普通的 C 函数作为它的回调。您不能将 Objective-C 方法传递给它,因为调用约定不同(在 C 术语中,Objective-C 方法的前两个参数是self_cmd- 选择器 - 对于普通的 C 函数将不存在)。

解决这个问题的常用方法是创建一个充当 shim 的 C 函数并显式地将 self 作为参数传递。然后 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 就像你最初做的那样。

于 2010-12-12T19:11:43.287 回答