OSX Core MIDI - вызов MIDIPacketListAdd из NSTimer - PullRequest
0 голосов
/ 06 октября 2011

Я отправляю строку MIDI-пакетов, используя MIDIPacketListAdd.Я хочу динамически изменять пакеты во время воспроизведения, поэтому я использую NSTimer для добавления каждого пакета до запланированного времени, когда пакет должен выйти.

Код работает отлично, адрес текущего пакета обновляетсяправильно, я проверил, что все данные верны.Однако MIDI-данные не отправляются при вызове MIDIPacketListAdd из таймера.Я добавляю первые два пакета перед запуском таймера, чтобы убедиться, что пакеты отправляются в MIDIPacketListAdd, прежде чем их нужно будет воспроизвести.

Я очень озадачен.Есть предложения?

Спасибо, Том Джеффрис

1 Ответ

3 голосов
/ 17 октября 2011

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

Кроме того, для тестирования попробуйте установить нулевые метки времени, просто чтобы убедиться, что вы можете отправлять MIDI после того, какчто вы можете вернуть свои временные метки обратно для их отдельной отладки.

Вместо источника, вот простой метод, который отправляет MIDI, и я вызываю его из NSTimer, и он основан на некоторых примерах Apple ионо работает.Обратите внимание, что «outputPort» - это то, что вы должны были создать где-то перед тем, как пытаться отправить MIDI вместе с вашим клиентом ref (я предполагаю, что вы это сделали)

OSStatus s;
MIDIClientRef client;
MIDIPortRef outputPort;
s = MIDIClientCreate((CFStringRef)@"My Test MIDI Client", MyMIDINotifyProc, self, &client);
s = MIDIOutputPortCreate(client, (CFStringRef)@"My Test MIDI Output Port", &outputPort);

как только вы это сделаете, вы можете отправить MIDI

- (void) MySendMidi:(const UInt8*)data size:(UInt32)bsize
{
    NSLog(@"%s(%u bytes to core MIDI)", __func__, unsigned(bsize));
    assert(bsize < 65536);

    Byte packetBuffer[bsize+100];
    MIDIPacketList *packetList = (MIDIPacketList*)packetBuffer;
    MIDIPacket     *packet     = MIDIPacketListInit(packetList);

    packet = MIDIPacketListAdd(packetList, sizeof(packetBuffer), packet, 0, bsize, data);

    // Send it to every destination in the system...
    for (ItemCount index = 0; index < MIDIGetNumberOfDestinations(); ++index)
    {
        MIDIEndpointRef outputEndpoint = MIDIGetDestination(index);
        if (outputEndpoint)
        {
            // Send it
            OSStatus s = MIDISend(outputPort, outputEndpoint, packetList);
        }
    }
}
...