2012-01-29 2 views
0

CoreMidi를 사용하여 특정 소스의 MIDI 이벤트를 수신하는 기본 응용 프로그램을 작성하려고합니다. 포트로 들어오는 모든 미디 이벤트가 MidiInputPortCreate()를 통해 연결된 proc을 호출하는 것을 이해합니다. 또한 MidiPortConnectSource()를 사용할 때 소스가 무엇인지 알 수 있도록 식별자 (connRefCon)를 보낼 수 있음을 이해합니다. 하지만 어떻게 사용하는지 모르겠습니다.MidiReadProc - srcConnRefCon을 사용하여 하나의 소스 만 듣기

내 MidiReadProc 내에서 scrConnRefCon 및 if 문을 사용하여 특정 소스를 수신 할 수 있다고 추측하지만, 각 소스를 구분하기 위해 전달해야하는 무언가는 아직도 모르겠다. 이상적으로 내 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); 
} 

여기 내 코드입니다. 첫 번째 코드는 두 개의 소스가 있으며 그 이름을 알려줍니다. 그러나 필자의 read proc은 소스가 항상 첫 번째 소스라고 말합니다. 운이없는 connRefCon을 전달할 때 세 가지 데이터 유형을 시도했습니다. 내 문제는 MIDIPortConnectSource에 있어야한다고 생각합니다.

어떤 도움이나 문제 해결 아이디어가 좋을 것입니다. CoreMIDI에는 포트에 연결된 항목을 쿼리 할 수있는 기능이있어서 그걸 확인할 수 있었으면 좋겠어. 근데, 아아, 그렇지 않아.

답변

2

srcConnRefCon은 여러 MIDIPortConnectSource() 호출을 한 경우 유용합니다. 가장 일반적으로 소스를 나타내는 객체에 대한 포인터이지만 아무 것도 될 수 있습니다. 여러 소스를 모호하게하려는 경우 문자열을 사용할 수 있습니다. - 그렇지 않으면 '

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

확실히 당신이 통과 어떤의 할당 수명이 오래 포트가 연결되어 확장 확인 :

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

그런 다음 SourceReadProc에, 당신은 이런 식으로 뭔가를 할 것 매달려있는 포인터가 생겨서 디버깅을 할 수 있습니다.