2012-01-29 75 views
0

我正在嘗試編寫一個使用CoreMidi從特定源接收MIDI事件的基本應用程序。我明白所有進入端口的midi事件都會調用通過MidiInputPortCreate()連接的proc。我也明白,使用MidiPortConnectSource()時,你可以發送一個標識符(connRefCon)來幫助知道源是什麼。但我不確定如何使用它。MidiReadProc - 使用srcConnRefCon僅偵聽一個源

我認爲,在我的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具有查詢連接到端口的功能,以便我可以檢查,但可惜的是,沒有。

回答

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 
} 

確保你傳遞任何的分配終生只要端口連接擴展 - 否則你」會得到一個懸掛的指針,這可能是地獄調試。