Ich lese derzeit Chris Adamson "Learning Core Audio" und versuchen zu folgen in Swift 3 (anstelle von Objective-C).Swift 3 - Arbeiten mit UnsafePointer <CFDictionary>?
Das erste Codebeispiel macht Gebrauch von AudioTool
Informationen über eine Audio-Datei zu sammeln. Meine Swift 3-Version sieht wie folgt aus:
import Foundation
import AudioToolbox
func main() {
let arguments = CommandLine.arguments
guard arguments.count > 1 else {
print("Usage: CAMetaData /full/path/to/audiofile")
return
}
// Get filepath out of cmd-arguments
let audiofilePath = NSString(string: arguments[1]).expandingTildeInPath
// Load audio file into appropriate data structure
let audioURL = NSURL(fileURLWithPath: audiofilePath)
var audiofile: AudioFileID? = nil
var possibleError = noErr
possibleError = AudioFileOpenURL(audioURL, AudioFilePermissions.readPermission, 0, &audiofile)
assert(possibleError == noErr)
// Get size of metadata dictionary
var outDataSize: UInt32 = 0
possibleError = AudioFileGetPropertyInfo(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, nil)
assert(possibleError == noErr)
// Get metadata
var outDataPointer: UnsafePointer<CFDictionary>? = nil
possibleError = AudioFileGetProperty(audiofile!, kAudioFilePropertyInfoDictionary, &outDataSize, &outDataPointer)
assert(possibleError == noErr)
// How to use this outDataPointer?
let outData = outDataPointer!.pointee as NSDictionary
dump(outData)
// No CFRelease necessary - Swift takes care of that
// Close connection to audiofile
possibleError = AudioFileClose(audiofile!)
assert(possibleError == noErr)
}
main()
Alles scheint groß (alle Behauptungen/AudioToolbox
-API Anruf Pass) zu arbeiten. Jetzt frage ich mich, wie ich die in der outDataPointer
gespeicherten Daten anzeigen kann.
Das ist, wie ich die Situation verstehe: outDataPointer
hält ein optional mit zugehörigem Typ UnsafePointer<CFDictionary>
. Ich bin in der Lage zu überprüfen, ob outDataPointer
nicht nil
daher den zugehörigen Wertes Zugriff nicht mein Programm zum Absturz bringen. outDataPointer!.pointee
soll mir gibt die CFDictionary
auf dem durch den zugehörigen Wert hinter outDataPointer
. CFDictionary
ist gießbar zu NSDictionary
.
Dumping Leider die darunter liegenden Daten drucken
- __NSAtom # 0
an die Konsole. Ziemlich nicht was ich erwartet hatte (Informationen über die Audiodatei). Wie kann ich diese Daten aus meiner Variablen outDataPointer
erhalten?
Vielen Dank für die ausführliche Antwort! Das hat mir definitiv die Dinge aufgeräumt. Ich bin mir nicht einmal sicher, wie ich 'UnsafePointer' an erster Stelle verwendet habe. Alles funktioniert jetzt wie erwartet. –
Herickson
@NobodyNada, was ist der Grund für die Verwendung von 'CFDictionary', wenn wir' NSDictionary' direkt in 'AudioFileGetProperty' verwenden können? Und gibt es eine Möglichkeit, Swift Dictionary zu verwenden? (Ich versuchte [String: Any] und es war nicht mit Schlüssel/Werten gefüllt ...) Danke –