Необязательное значение nil найдено после использования AudioFileGetProperty () с kAudioFilePropertyDataFormat

Я пытаюсь использовать быстрый 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(){

    }
}

person dmann200    schedule 16.08.2018    source источник


Ответы (1)


Итак, я понял, что неправильно использовал комбинацию указателей и необязательных значений. Поскольку mDataFormat сам по себе является необязательным:

var mDataFormat: AudioStreamBasicDescription?

передача ссылки на него не имела особого смысла, т.е. & mDataFormat.

Поэтому я изменил эту переменную, чтобы сделать ее необязательной:

var mDataFormat: AudioStreamBasicDescription = AudioStreamBasicDescription ()

Таким образом, для него была выделена память, а также адрес, и теперь имело смысл сделать что-то вроде этого:

& aqData.mDataFormat

var propertyStatus = AudioFileGetProperty (aqData.mAudioFile !, kAudioFilePropertyDataFormat, & dataFormatSize и aqData.mDataFormat)

В любом случае я все еще изучаю, как комбинировать опции с указателями, поэтому любая дополнительная обратная связь, которую вы можете мне дать, поможет.

person dmann200    schedule 18.08.2018