OSX Core MIDI- вызов MIDIPacketListAdd из NSTimer

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

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

Я очень озадачен. Какие-либо предложения?

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

1 ответ

Ваше описание точно так же, как я отправляю свои 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);
        }
    }
}
Другие вопросы по тегам