简体   繁体   中英

how do I extract data from void UnsafePointer in Swift?

I have the following code in Objective-C (which uses the Audio Toolbox framework) that I'm 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's 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's a MIDIChannelMessage.

    //case ..., etc.
}

When re-writing it in Swift, I can't figure out how to get data out of the "const void *eventData" part, despite reading the Apple documentation on unsafe pointers (none of their examples seem to relate to extracting data from an unsafe pointer in this manner). This is what I have so far, but I'm lost in terms of what the 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.

As long as you know what kind data you've got holed up in that unsafe pointer, you can always use the various constructors of each variant to cast between the pointers. Your example is trivial to translate if you bear that in mind:

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's a MIDIChannelMessage.

        //case ..., etc.
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM