2013-04-10 6 views
0

Я пытаюсь использовать 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); 

} 

ответ

4

The answer is in the documentation for MIDIPacketListAdd.

Возвращаемое значение

Возвращает NULL, если не было места в пакете для события; в противном случае возвращает указатель пакета, который должен быть передан как curPacket при последующем вызове этой функции.

Таким образом, вы, вероятно, хотите что-то вроде:

currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data); 

Обязательно проверьте currentPacket после каждого времени NULL.

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

Редактировать: вот что вы делаете неправильно.

packetList = (MIDIPacketList *)malloc(PACKETLIST_SIZE * sizeof(char)); 

sizeof(char) всегда 1 на языке C, по определению. malloc(PACKETLIST_SIZE) - это все, что вам нужно.

currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time, len, data); 

Это дал мне предупреждение компилятора, потому что вы пропускание адреса функций mach_absolute_time, не вызывая функцию. Вы имели в виду:

currentPacket = MIDIPacketListAdd(packetList, PACKETLIST_SIZE, currentPacket, mach_absolute_time(), len, data); 

После того, как я сделал это, я увидел packetList->numPackets рост, как и ожидалось.

Однако, обратите внимание две вещи:

  • Если вы хотите отправить данные MIDI немедленно, просто обеспечить временную метку 0.

  • Если вы вызываете MIDIPacketListAdd с той же отметкой времени, что и предыдущий, то он просто объединяет ваши данные в предыдущий пакет. Вы увидите packetList->numPackets и currentPacket оставайтесь на одном месте, но currentPacket->length увеличится.

Вот почему вы не видели packetList->numPackets увеличение: адрес mach_absolute_time является постоянным, так что ваша «метка времени» было то же самое каждый раз.

+0

hi Kurt, я делаю именно это, но мои данные все еще заполняются в одном пакете, когда я проверяю его с помощью отладчика. packetList-> packet [0] -> данные становятся длиннее, когда следующая часть данных должна быть в следующем пакетном пакете [1]. – lppier

+0

Еще один вопрос: если в файле packetList-> packet [0] -> указано 9 байтов, будут ли проигнорированы последние 6 байтов синтезатором/виртуальным инструментом, на который я его отправляю? – lppier

+0

Отладчик вводит вас в заблуждение. «MIDIPacket» представляет собой структуру переменной длины - он имеет 6 байтов заголовка (4 байта 'timeStamp', 2 байта' length'), а затем между 1 и 65535 байтами данных. «MIDIPacketList» - это всего лишь один или несколько «MIDIPackets», хранящихся в памяти. Проблема в том, что вы не можете представить структуры переменной длины в C. Таким образом, вы не можете сказать 'packet [1]', чтобы перейти ко второму пакету - ни компилятор, ни отладчик не будут поступать правильно. Используйте 'MIDIPacketListNext', или посмотрите на необработанную память напрямую. –