Я пытаюсь использовать быстрый API AudioToolbox для воспроизведения аудиофайла. Однако, когда я получаю AudioStreamBasicDescription с помощью AudioFileGetProperty (), приложение вылетает, когда я пытаюсь развернуть значение, говоря: «Неожиданно обнаружено nil при развертывании необязательного значения». Это не имеет смысла, потому что:
1) Статус OSStatus после вызова AudioFileGetProperty () равен нулю. 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(){
}
}