MidiReadProc - using srcConnRefCon to listen to only one source

1.2k views Asked by At

I am trying to write a basic app that uses CoreMidi to receive midi events from a specific source. I understand that all midi events that come into a port call the proc that I connected via MidiInputPortCreate(). I also understand that when using MidiPortConnectSource() that you can send an identifier (connRefCon) to help know what the source is. But I'm not sure how to use it.

I figure that within my MidiReadProc that I can use the scrConnRefCon and an if statement to listen to a specific source, but I still dont know what *void I should pass to separate each source. Ideally my ReadProc will look something like this:

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

Any help will be greatly appreciated. GW


After a break I've come back to this project with a fresh perspective. When I call MIDIPortConnectSource and pass a unique connRefCon it's not apparently passing for each endpoint. Here's my code:

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);
}

Then my read proc:

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

I've hooked up two different midi sources and I can find them both just fine. My first code reports that there are two sources and tells me their names. But my read proc says that the sources is always the first source. I've tried three different data types when passing the connRefCon with no luck. I feel that my issue must be with the MIDIPortConnectSource.

Any help or even troubleshooting ideas would be great. I wish that CoreMIDI had functions to query what's connected to ports so I could check that, but alas, there's not.

1

There are 1 answers

0
Raph Levien On

The srcConnRefCon is useful if you've made multiple MIDIPortConnectSource() calls. Most commonly, it's a pointer to an object representing the source, but it could be anything. If you just want to disambiguate multiple sources, you could, say, use a string.

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

Then, in your SourceReadProc, you'd do something like this:

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

Make sure the allocation lifetime of whatever you pass in extends as long as the port is connected - otherwise you'll get a dangling pointer, which can be hell to debug.