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);
}
}
}