Я пытаюсь использовать MIDIPacketListAdd CoreAudio путем делать это (на макинтош):Правильное использование MIDIPacketListAdd (CoreMIDI)
MIDIPacketListAdd (packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, длина, данные);
Я думал о вызове метода несколько раз перед его отправкой, так что в моем пакетеList будет содержаться 1 пакет. Однако, когда я делаю так, numPackets никогда не увеличивается, и я получаю пакетList-> packet [0] с постоянно растущим пакетом [0] .data.
1) Каков правильный способ использования этого метода? Я рассмотрел несколько примеров, в том числе один из «Learning Core Audio» - все они, кажется, отправляют только один пакет.
2) Есть ли улучшение производительности, если я упаковываю несколько пакетов в 1 пакетный список, отправляя один пакетный список с одним пакетом несколько раз?
Спасибо, оцените любую помощь относительно этого.
Edit для наблюдения: Вот как я инициализировать список пакетов
#define PACKETLIST_SIZE 512
- (void) initPacketList {
if (packetList) {
free(packetList);
packetList = NULL;
}
packetList = (MIDIPacketList *)malloc(PACKETLIST_SIZE * sizeof(char));
currentPacket = MIDIPacketListInit(packetList);
}
- (void) clearPacketList {
packetList->numPackets = 0;
currentPacket = MIDIPacketListInit(packetList);
}
- (void) addPacketToPacketList:(Byte*) data ofLength:(int) len {
NSLog(@"length %d", len);
//NSLog(@"%lld", mach_absolute_time());
currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data);
//if (!currentPacket) exit(1);
}
hi Kurt, я делаю именно это, но мои данные все еще заполняются в одном пакете, когда я проверяю его с помощью отладчика. packetList-> packet [0] -> данные становятся длиннее, когда следующая часть данных должна быть в следующем пакетном пакете [1]. – lppier
Еще один вопрос: если в файле packetList-> packet [0] -> указано 9 байтов, будут ли проигнорированы последние 6 байтов синтезатором/виртуальным инструментом, на который я его отправляю? – lppier
Отладчик вводит вас в заблуждение. «MIDIPacket» представляет собой структуру переменной длины - он имеет 6 байтов заголовка (4 байта 'timeStamp', 2 байта' length'), а затем между 1 и 65535 байтами данных. «MIDIPacketList» - это всего лишь один или несколько «MIDIPackets», хранящихся в памяти. Проблема в том, что вы не можете представить структуры переменной длины в C. Таким образом, вы не можете сказать 'packet [1]', чтобы перейти ко второму пакету - ни компилятор, ни отладчик не будут поступать правильно. Используйте 'MIDIPacketListNext', или посмотрите на необработанную память напрямую. –