我在.mm中有此代码

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 (关联).

这个问题仅在OBJ-C中可以解决吗?我想我必须将C ++的内容转换为C,在这种情况下,我只会不理会它。

有帮助吗?

解决方案

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

围绕此的通常方法是创建一个C函数,该C函数充当垫片,并明确地将自我作为参数传递。然后,垫片功能立即发送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