【发布时间】:2018-08-16 22:54:14
【问题描述】:
我正在尝试使用 swift AudioToolbox API 来播放音频文件。但是,当我使用 AudioFileGetProperty() 获取 AudioStreamBasicDescription 时,当我尝试解包该值时应用程序崩溃,并说“解包可选值时意外发现 nil”。这是没有意义的,因为:
1) 我调用 AudioFileGetProperty() 后的 OSStatus 为零。 2)我可以在控制台中看到该值最初为“nil”,但在调用 AudioFileGetProperty() 后它变为“Some”并突然填充了值。
也许我错误地使用了指针?我是否错误地使用了选项?
func playAudioFileWithToolbox(){
var aqData = AQPlayerState()
let url2 = bundle.path(forResource: "dave_speaking", ofType: "m4a")!
var filePathArray = Array(url2.utf8)
let audioFileUrl = CFURLCreateFromFileSystemRepresentation(nil, &filePathArray, filePathArray.count, false)
//Problem: how do we pass aqData.mAudioFile? Initially it is nil
//We are supposed to pass by reference
let status = AudioFileOpenURL(audioFileUrl!, permissions, 0, &(aqData.mAudioFile))
var dataFormatSize:UInt32 = UInt32(MemoryLayout<AudioStreamBasicDescription>.size)
//Here I populate aqData.mDataFormat
var propertyStatus = AudioFileGetProperty(aqData.mAudioFile!, kAudioFilePropertyDataFormat, &dataFormatSize, &(aqData.mDataFormat))
//Next line crashes saying that it is unwrapping an optional value
var audioStreamDescription = aqData.mDataFormat!
}
struct AQPlayerState{
var mDataFormat:AudioStreamBasicDescription?
var mQueue:AudioQueueRef?
var mBuffers:AudioQueueBufferRef?
var mAudioFile: AudioFileID?
var bufferByteSize:UInt32 = 0
var mCurrentPacket:Int64 = 0
var mNumPacketsToRead:UInt32 = 0
var mPacketDescs : UnsafeMutablePointer<AudioStreamPacketDescription>?
var mIsRunning : Bool = false
init(){
}
}
【问题讨论】:
标签: swift pointers audio optional audiotoolbox