MidiReadProc - использование srcConnRefCon для прослушивания только одного источника - PullRequest
0 голосов
/ 29 января 2012

Я пытаюсь написать основное приложение, которое использует CoreMidi для получения событий midi из определенного источника.Я понимаю, что все события midi, которые приходят в порт, вызывают процесс, который я подключил через MidiInputPortCreate ().Я также понимаю, что при использовании 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);
}

Затем моя процедура чтения:

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

Я подключил два разных миди-источника и могу найти их оба просто отлично.Мой первый код сообщает, что есть два источника и сообщает мне их имена.Но мой читательский процесс говорит, что источники - это всегда первый источник.Я пробовал три разных типа данных при передаче connRefCon без удачи.Я чувствую, что моя проблема должна быть с MIDIPortConnectSource.

Любая помощь или даже идеи по устранению неполадок были бы великолепны.Мне бы хотелось, чтобы в CoreMIDI были функции для запроса того, что подключено к портам, чтобы я мог это проверить, но, увы, нет.

1 Ответ

2 голосов
/ 05 февраля 2012

srcConnRefCon полезен, если вы сделали несколько вызовов MIDIPortConnectSource ().Чаще всего это указатель на объект, представляющий источник, но это может быть что угодно.Если вы просто хотите устранить неоднозначность нескольких источников, вы можете, скажем, использовать строку.

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

Затем в вашем SourceReadProc вы сделаете что-то вроде этого:Удостоверьтесь, что время выделения того, что вы передаете, увеличивается до тех пор, пока порт подключен, иначе вы получите свисающий указатель, который может быть адским для отладки.

...