2016-08-19 5 views
0

до Xcode 8 бета-5, я мог бы получить доступ к информации о событиях в MusicEventIterator, используя что-то вроде:MusicEventIteratorGetEventInfo в Xcode 8 бета 6

var type: MusicEventType = 0 
var stamp: MusicTimeStamp = 0 
var data: UnsafePointer<()>? = nil 
var size: UInt32 = 0 

while(hasCurrentEvent != false) { 
     MusicEventIteratorGetEventInfo(iterator!, &stamp, &type, 
     &data, &size) 
    // do stuff with stamp, type, data... 
} 

мне удалось получить некоторую помощь на Dev сайте компании Apple по работе с «данными», но получение данных в первую очередь также нарушено. Я получаю предупреждение об использовании «UnsafeRawPointer» в объявлении «данных» и ошибке о невозможности использования данных в качестве аргумента inout при вызове MusicEventIteratorGetEventInfo() ... Хотя я знаю, что они делают вещи более детерминированным и перспективным (т. е. для компилятора), невероятно сложно сменить материал C-interop каждые несколько месяцев. Мой MIDI файл кода парсер уже изменился в 3 раза ...

Для справки, MusicEventIteratorGetEventInfo имеет подпись:

func MusicEventIteratorGetEventInfo(_ inIterator: MusicEventIterator, 
_ outTimeStamp: UnsafeMutablePointer<MusicTimeStamp>, 
_ outEventType: UnsafeMutablePointer<MusicEventType>, 
_ outEventData: UnsafeMutablePointer<UnsafePointer<Void>>, 
_ outEventDataSize: UnsafeMutablePointer<UInt32>) -> OSStatus 

Любая помощь с благодарностью.

+0

дальше, глядя на https://github.com/apple/swift-evolution/blob/master/proposals/0107-unsaferawpointer.md, это даже не ясно для меня как «pointee» в UnsafeMutablePointer > должен быть представлен .... – mrwheet

ответ

1

latest reference of MusicEventIteratorGetEventInfo показывает это:

Декларация

func MusicEventIteratorGetEventInfo(_ inIterator: MusicEventIterator, 
            _ outTimeStamp: UnsafeMutablePointer<MusicTimeStamp>, 
            _ outEventType: UnsafeMutablePointer<MusicEventType>, 
            _ outEventData: UnsafeMutablePointer<UnsafeRawPointer?>, 
            _ outEventDataSize: UnsafeMutablePointer<UInt32>) -> OSStatus 

Третий параметр outEventData имеет тип UnsafeMutablePointer<UnsafeRawPointer?>. Как правило, когда API заявляет UnsafeMutablePointer<T>, вы объявляете переменную типа T и передаете ее как аргумент inout.

Таким образом, это должно работать:

var type: MusicEventType = 0 
var stamp: MusicTimeStamp = 0 
var data: UnsafeRawPointer? = nil //<- Declare a variable of type `UnsafeRawPointer?`. 
var size: UInt32 = 0 

while hasCurrentEvent != false { 
    MusicEventIteratorGetEventInfo(iterator!, &stamp, &type, 
            &data, &size) //<- Pass it as an inout argument. 
    // do stuff with stamp, type, data... 
} 
+0

Да, это действительно работает, и это, безусловно, кажется более простым (я в шоке, я никогда не пробовал!). Но тогда это просто подталкивает проблемы дальше в коде. Там, где я пытаюсь прочитать «данные», теперь нарушена. Я использую: 'let exTempo = data.pointee? .bindMemory (to: ExtendedTempoEvent.self, емкость: MemoryLayout .size)', которая жалуется, что данные не имеют указателя. – mrwheet

+1

@mrwheet, используйте 'let exTempo = data? .bindMemory (to: ExtendedTempoEvent.self, емкость: 1)'. Вам лучше задать другой вопрос, включая код. – OOPer

+0

Нет, не беспокойтесь; удаление pointee из моего кода работает, как ожидалось. Имеют смысл, так как использование UnsafeRawPointer напрямую (для получения «данных») оставляет лишний слой ссылок (следовательно, нет необходимости в указателе!). Благодарю. – mrwheet

0

В случае, если кто-то имеет такую ​​же проблему, это похоже на работу:

// Somewhere to put the raw midi data 
var type: MusicEventType = 0 
var stamp: MusicTimeStamp = -1 
let data: UnsafeMutablePointer<UnsafeRawPointer?> = UnsafeMutablePointer<UnsafeRawPointer?>.allocate(capacity: MemoryLayout<MusicEventType>.size) 

var size: UInt32 = 0 
var tsChangeStamp: MusicTimeStamp = 0 

while(hasCurrentEvent != false) { 
     MusicEventIteratorGetEventInfo(iterator!, &stamp, &type, data, &size) 
    // do stuff... 
} 
Смежные вопросы