![](/img/trans.png)
[英]Issues with UnsafePointer<DSPComplex> while converting aurioTouch to Swift 3
[英]Converting a Swift UnsafePointer<AudioStreamBasicDescription> to a Dictionary?
我想知道如何從UnsafePointer<AudioStreamBasicDescription>
創建[String:AnyObject]
的字典
我想我不明白如何在Swift
使用UnsafePointer<T>
。 這就是我的出發地AVAudioFile
類具有fileFormat
屬性,該屬性具有AVAudioFormat
類型。 AVAudioFormat
具有streamDescription
屬性,該屬性返回UnsafePointer<AudioStreamBasicDescription>
作為只讀屬性。
我想看看此結構中的值是什么,並將其轉換為Dictionary似乎是合理的目標。 實際上, AVAudioFormat
類上似乎已經存在執行此操作的“設置”屬性,但我有興趣了解“正確的方法”以訪問自己存儲在UnsafePointer
的值。
從文檔“ Discussion: Returns the AudioStreamBasicDescription (ASBD) struct, for use with lower-level audio APIs
https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioFormat_Class/index.html
檢查結構是否不為零后,有沒有辦法進行不安全的轉換? 我會在這里使用unsafeBitCast嗎? 我很猶豫地跳入這個話題,因為我已經知道這是“極其危險的” ...
我意識到我可以通過以下方式訪問基礎內存:
let audioFileURL:NSURL = NSBundle.mainBundle().URLForResource("FILENAME", with Extension: "mp3")
var file:AVAudioFile?
do {
file = try AVAudioFile(forReading: audioFileURL)
guard let file = file else {
fatalError("file must not be nil")
}
}catch {
print(error)
}
let format = file.processingFormat
let asbd:AudioStreamBasicDescription = format.streamDescription.memory
那很危險嗎,在創建asbd常量后我是否需要出於某種原因進行釋放?
我嘗試按照http://sitepoint.com/using-legacy-c-apis-swift上的帖子進行操作,但我只是聽不懂...在此處尋找最佳做法的任何指導。
做更多的研究,似乎有可能使用基於本文的反射來創建字典: http : //freecake.angelodipaolo.org/simple-reflection-in-swift/
這是我到目前為止的內容:
let asbdMirror = reflect(asbd)
var asbdDict = [String: Any]()
for i in 0..<asbdMirror.count {
let (propertyName, childMirror) = asbdMirror[i]
asbdDict[propertyName] = childMirror.value
}
任何理由這是一個壞主意嗎?
您可以正確執行所有操作,可以使用asbd.mSampleRate
等訪問描述中的所有值。 將其轉換為字典是沒有意義的,因為那不是它,沒有值的鍵。
除非您自己分配一個指針(使用malloc
或alloc
),否則在使用此類指針時也不必釋放任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.