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 to share