Как узнать конец цикла в midi callback

У меня есть цикл MIDI-файлов (с MusicPlayer ) и последующая процедура обратного вызова

 static void MyMIDIReadProc(const MIDIPacketList *pktlist, void *refCon, void *connRefCon) { AudioUnit *player = (AudioUnit*) refCon; const MIDIPacket *packet = &pktlist->packet[0]; for (int i=0; i < pktlist->numPackets; i++) { Byte midiStatus = packet->data[0]; Byte midiCommand = midiStatus >> 4; NSMutableString *hex = [NSMutableString stringWithCapacity:10]; for (int i=0; i < 10; i++) { [hex appendFormat:@"%02x ", packet->data[i]]; } NSLog(hex); if (midiCommand == 0x09) { Byte note = packet->data[1] & 0x7F; Byte velocity = packet->data[2] & 0x7F; OSStatus result = noErr; result = MusicDeviceMIDIEvent (player, midiStatus, note, velocity, 0); } packet = MIDIPacketNext(packet); } } 

NSLog(hex) будет показывать только пакеты, начинающиеся с 90 (примечание), b0 (контроллер), e0 (Pitch Bend) или c0 (Program Change). Таким образом, функции обратного вызова не получают маркер конца трека – FF 2F 00 – вообще, или я что-то здесь не вижу? Я хочу получать уведомления каждый раз, когда цикл начинается.

Вот как я регистрирую обратный вызов:

 MIDIClientRef virtualMidi; result = MIDIClientCreate(CFSTR("Virtual Client"), MyMIDINotifyProc, NULL, &virtualMidi); NSAssert( result == noErr, @"MIDIClientCreate failed. Error code: %d '%.4s'", (int) result, (const char *)&result); // Create an endpoint MIDIEndpointRef virtualEndpoint; result = MIDIDestinationCreate(virtualMidi, @"Virtual Destination", MyMIDIReadProc, self.samplerUnit, &virtualEndpoint); NSAssert( result == noErr, @"MIDIDestinationCreate failed. Error code: %d '%.4s'", (int) result, (const char *)&result); MusicSequenceSetMIDIEndpoint(s, virtualEndpoint); 

Маркер конца трека – это Midi Meta Message, которое никогда не отправляется на MIDI-устройства; он просто существует в MIDI-файлах.

Обновлено:

Вы можете использовать событие пользователя, чтобы получать уведомление, когда дорожка зациклирована.

Добавить обратный вызов для пользовательского события:

 static void sequenceUserCallback(void *inClientData, MusicSequence inSequence, MusicTrack inTrack, MusicTimeStamp inEventTime, const MusicEventUserData *inEventData, MusicTimeStamp inStartSliceBeat, MusicTimeStamp inEndSliceBeat) { NSLog(@"track was looped"); } 

и создайте пользовательское событие следующим образом:

 static MusicEventUserData userData = {1, 0x01 /* anything you want*/ }; MusicTrack musicTrack; MusicSequenceGetIndTrack(sequence, 0 /* your track index of interest */, &musicTrack); /* timestamp 0 should be fine if you always loop from the beginning; alternatively add the event at end of track */ MusicTrackNewUserEvent(musicTrack, 0 /* timestamp */ , &userData); 
  • Количество строк в UILabel
  • Где тип проекта «Просмотр на основе приложения», в Xcode 4?
  • Параметры тела HttpRequest в iOS
  • (xcode) Arc Semantic issue - методы init должны возвращать тип, относящийся к типу приемника
  • Xcode 6 - iOS8 - Автоматическая компоновка, как правильно установить приоритеты ограничений
  • NSBatchUpdateRequest вызывает ошибку в Swift
  • Как использовать веб-безопасные цвета в Xcode
  • Как сохранить возвращаемый поплавок из NSUserDefaults
  • Неверный размер представления после обновления до XCode 8
  • Почему я не могу использовать свойство «сохранить» при использовании XCode?
  • Xcode iOS добавляет раздел и строку только в этом разделе
  • Давайте будем гением компьютера.