簡體   English   中英

Swift vs Objective C指針操作問題

[英]Swift vs Objective C pointer manipulation issue

我在Objective C中有這個代碼可以正常工作:

list = controller->audioBufferList;
list->mBuffers[0].mDataByteSize = inNumberFrames*kSampleWordSize;
list->mBuffers[1].mDataByteSize = inNumberFrames*kSampleWordSize;

它工作得很棒,它更新了mBuffers [0]和mBuffers [1]的mDataByteSize字段。 我嘗試在Swift中翻譯它但它不起作用:

public var audioBufferList:UnsafeMutableAudioBufferListPointer

在功能上,

let listPtr = controller.audioBufferList.unsafeMutablePointer

let buffers = UnsafeBufferPointer<AudioBuffer>(start: &listPtr.pointee.mBuffers, count: Int(listPtr.pointee.mNumberBuffers))

for var buf in buffers {
    buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
    NSLog("Data byte size \(buf.mDataByteSize)")
}

for buf in buffers {
    NSLog("Data byte size \(buf.mDataByteSize)")
}

mDataByteSize未更新。 NSLog在第二次讀回環時指向原始值,而不是更新的值。 似乎var buf通過制作副本來指代另一個buf。 我如何解決它? 這是一個純粹的Swift語言問題,我無法理解。

編輯:正如馬丁所指出的那樣,我通過修改for循環修復了這個問題

 for i in 0..<Int(listPtr.pointee.mNumberBuffers) {
    buffers[i].mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
}

現在它有效。 但這進一步激起了我對Swift語言的好奇心,它是多么直觀,對使用指針操縱東西的開發人員來說是多么惱人。 為什么以下循環失敗? var緩沖區是否按值復制?

     for buf in buffers {
         var buffer = buf
         buffer.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
     }

要么

    for var buf in buffers {
        buf.mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
    }

編輯2:Hamish的回答引起了對在任何地方使用listPtr的有效性的懷疑。 我在一些調用中使用listPtr,例如:

let status = AudioUnitRender(controller.audioUnit!, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, listPtr)

我現在需要知道我們在哪里可以使用listPtr以及我們不能使用的地方!

致電:

let buffers = UnsafeBufferPointer<AudioBuffer>(start: &listPtr.pointee.mBuffers, count: Int(listPtr.pointee.mNumberBuffers))

&listPtr.pointee.mBuffers生成一個臨時指針,僅在調用UnsafeBufferPointer的初始化程序時有效。 因此,嘗試使用緩沖區指針會導致未定義的行為 (編譯器有望在Swift 5.1中對此類情況發出警告 )。

相反,您可以直接在UnsafeMutableAudioBufferListPointer進行迭代,因為它符合MutableCollection

例如:

for index in audioBufferList.indices {
  audioBufferList[index].mDataByteSize = inNumberFrames * UInt32(sampleWordSize)
  print("Data byte size \(audioBufferList[index].mDataByteSize)")
}

for buffer in audioBufferList {
  print("Data byte size \(buffer.mDataByteSize)")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM