How can I extract data from a void UnsafePointer in Swift?

I have the following code in Objective-C (which uses the Audio Toolbox framework) that I am trying to convert to Swift:

MusicTimeStamp timeStamp;
MusicEventType eventType;
const void *eventData;
UInt32 eventDataSize;

//MusicEventIteratorGetEventInfo is declared in Audio Toolbox framework as this:
//OSStatus MusicEventIteratorGetEventInfo ( MusicEventIterator inIterator, MusicTimeStamp *outTimeStamp, MusicEventType *outEventType, const void **outEventData, UInt32 *outEventDataSize );

MusicEventIteratorGetEventInfo(anIterator, &timeStamp, &eventType, &eventData, &eventDataSize);

switch (eventType){
    case kMusicEventType_MIDINoteMessage:
        //extract info from eventData assuming it a MIDINoteMessage.
        UInt8 channel = ((MIDINoteMessage *) eventData)->channel
        UInt8 note = ((MIDINoteMessage *) eventData)->note
        UInt8 velocity = ((MIDINoteMessage *) eventData)->velocity
        Float32 duration = ((MIDINoteMessage *) eventData)->duration

    case kMusicEventType_MIDIChannelMessage:
        //extract info from eventData assuming it a MIDIChannelMessage.

    //case ..., etc.
}

      

On rewriting in Swift, I can't figure out how to get data from the "const void * eventData" part despite reading Apple's documentation on unsafe pointers (none of their examples seem to be about fetching data from an unsafe pointer this way) ... This is what I have so far, but I am lost in terms of what a switch statement should be:

var timeStamp: MusicTimeStamp = 0
var eventType: MusicEventType = 0
var eventData: UnsafeMutablePointer<UnsafePointer<Void>> = nil
var eventDataSize: UInt32 = 0

MusicEventIteratorGetEventInfo(iterator, &timeStamp, &eventType, eventData, &eventDataSize)

//what would simplest equivalent switch statement be?

      

Any help would be appreciated - thanks.

+3


source to share


1 answer


As long as you know what data you hooked into that unsafe pointer, you can always use the different constructors of each variant to translate between pointers. Your example is trivial to translate if you remember:



import AudioToolbox

var timeStamp : MusicTimeStamp = 0
var eventType : MusicEventType = 0
var eventData : UnsafePointer<Void> = nil
var eventDataSize : UInt32 = 0;

MusicEventIteratorGetEventInfo(anIterator, &timeStamp, &eventType, &eventData, &eventDataSize);

switch (eventType){
    case kMusicEventType_MIDINoteMessage:
        let data = UnsafePointer<MIDINoteMessage>(eventData)
        let channel = data.memory.channel
        let note = data.memory.note
        let velocity = data.memory.velocity
        let duration = data.memory.duration

    case kMusicEventType_MIDIChannelMessage:
        //extract info from eventData assuming it a MIDIChannelMessage.

        //case ..., etc.
}

      

+4


source







All Articles