【问题标题】:Optional value nil found after using AudioFileGetProperty() with kAudioFilePropertyDataFormat将 AudioFileGetProperty() 与 kAudioFilePropertyDataFormat 一起使用后发现可选值 nil
【发布时间】: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


    【解决方案1】:

    所以我发现我错误地使用了指针和可选值的组合。因为 mDataFormat 本身就是一个可选的:

    var mDataFormat:AudioStreamBasicDescription?

    传递对它的引用没有多大意义,即 &mDataFormat。

    因此我更改了此变量以使其成为非可选:

    var mDataFormat:AudioStreamBasicDescription = AudioStreamBasicDescription()

    这样,分配给它的内存和地址,现在做这样的事情是有意义的:

    &aqData.mDataFormat

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

    无论如何,我仍在学习如何将选项与指针结合起来,因此您可以给我的任何其他反馈都会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多