MidiReadProc - 使用srcConnRefCon仅侦听一个源

时间:2012-01-29 06:03:41

标签: coremidi

我正在尝试编写一个使用CoreMidi从特定来源接收midi事件的基本应用程序。我知道进入端口的所有midi事件都会调用我通过MidiInputPortCreate()连接的proc。我也明白,当使用MidiPortConnectSource()时,你可以发送一个标识符(connRefCon)来帮助知道源是什么。但我不确定如何使用它。

我认为在我的MidiReadProc中我可以使用scrConnRefCon和一个if语句来监听特定的源,但我仍然不知道我应该传递什么* void以分隔每个源。理想情况下,我的ReadProc看起来像这样:

void SourceReadProc (const MIDIPacketList   *pktlist,
                     void                   *readProcRefCon,
                     void                   *srcConnRefCon)
{
     if (srcConnRefCon == mySourceChoice) {
          // pass the pktlist to do something
     }
};

任何帮助将不胜感激。 GW


休息一下后,我以全新的视角回到这个项目。当我调用MIDIPortConnectSource并传递一个唯一的connRefCon时,它显然没有为每个端点传递。这是我的代码:

ItemCount count = MIDIGetNumberOfSources();
for (Itemcount i=0; i<count; i++) {
    MIDIEndpointRef endpoint = MIDIGetSource(i);
    MIDIObjectGetStringProperty(endpoint,kMIDIPropertyName, &midiEndpointSourceName);
    NSLog(@"Source %lu: %@", i, midiEndpointSourceName);

    MIDIPortConnectSource(midiSourcePort, endpoint, (void*)&i);
}

然后我读了proc:

void SourceReadProc (const MIDIPacketList   *pktlist,
                     void                   *readProcRefCon,
                     void                   *srcConnRefCon)
{
ItemCount *source = (ItemCount*) srcConnRefCon;
NSLog(@"source: %lu", *source);
}

我已经连接了两个不同的midi源,我发现它们都很好。我的第一个代码报告说有两个来源并告诉我他们的名字。但我的阅读程序说,来源始终是第一来源。我在传递connRefCon时尝试了三种不同的数据类型,但没有运气。我觉得我的问题必须是MIDIPortConnectSource。

任何帮助甚至是故障排除的想法都会很棒。我希望CoreMIDI具有查询连接到端口的功能,以便我可以检查,但唉,没有。

1 个答案:

答案 0 :(得分:2)

如果您进行了多次MIDIPortConnectSource()调用,则srcConnRefCon非常有用。最常见的是,它是指向表示源的对象的指针,但它可以是任何东西。如果您只是想消除多个来源的歧义,那么您可以使用字符串。

MIDIPortConnectSource(port, endpoint1, (void *)"endpoint1");
MIDIPortConnectSource(port, endpoint2, (void *)"endpoint2");

然后,在你的SourceReadProc中,你会做这样的事情:

char *source = (char *)srcConnRefCon;
if (!strcmp(source, "endpoint1")) {
    // Process packets from source 1
}

确保只要端口连接,传入的任何内容的分配生命周期都会延长 - 否则你将得到一个悬空指针,这可能是调试的地狱。