【发布时间】:2017-03-01 23:32:28
【问题描述】:
我目前正在阅读 Chris Adamson 的“Learning Core Audio”,并尝试在 Swift 3(而不是 Objective-C)中学习。
第一个代码示例使用AudioTool 来收集有关音频文件的信息。我的 Swift 3 版本如下所示:
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()
一切似乎都很好(所有断言/AudioToolbox-API 调用通过)。现在我问自己如何才能显示存储在outDataPointer 中的数据。
这就是我对这种情况的理解:outDataPointer 持有一个与 UnsafePointer<CFDictionary> 关联类型的可选。我能够验证outDataPointer 不是nil,因此访问关联的值不会使我的程序崩溃。 outDataPointer!.pointee 应该给我CFDictionary 所指向的outDataPointer 后面的关联值。 CFDictionary 可转换为 NSDictionary。
遗憾地转储底层数据打印
- __NSAtom #0
到控制台。完全不是我所期望的(有关音频文件的信息)。如何从我的 outDataPointer 变量中获取这些数据?
【问题讨论】:
标签: ios objective-c swift swift3 core-audio