【问题标题】:Allocate an AudioBufferList with two buffers for stereo audio stream为立体声音频流分配带有两个缓冲区的 AudioBufferList
【发布时间】:2018-03-03 18:14:31
【问题描述】:

我在 C 中有以下代码,它分配了具有适当长度的 AudioBufferList。

  UInt32 bufferSizeBytes = bufferSizeFrames * sizeof(Float32);
  propertySize = offsetof(AudioBufferList, mBuffers[0]) + (sizeof(AudioBuffer) * mRecordSBD.mChannelsPerFrame);

  mBufferList = (AudioBufferList *) malloc(propertySize);
  mBufferList->mNumberBuffers = mRecordSBD.mChannelsPerFrame;
  for(UInt32 i = 0; i < mBufferList->mNumberBuffers; ++i)
  {
    mBufferList->mBuffers[i].mNumberChannels = 1;
    mBufferList->mBuffers[i].mDataByteSize = bufferSizeBytes;
    mBufferList->mBuffers[i].mData = malloc(bufferSizeBytes);
  }

大多数时候,mChannelsPerFrame 是 2,所以上面的代码创建了两个缓冲区,每个通道一个。每个缓冲区都有一个保留的内存价值bufferSizeBytes

如何在 Swift 中复制相同的行为?

【问题讨论】:

    标签: swift core-audio audiobufferlist


    【解决方案1】:

    不幸的是,在 Swift 中,一个 C 数组被视为一个元组,因此 AudioBufferList.mBuffers 被导入一个带有单个 AudioBuffer 的元组。 C 允许您通过使用指针数学(或本例中的数组下标)访问相邻内存以创建可变长度结构,而 Swift 不会。

    AudioBufferList 只是普通的并不能很好地转换为 Swift。 Apple 已经通过一些辅助函数和类型缓解了这个问题。他们创建了一个静态 allocate 函数,该函数返回一个 UnsafeMutableAudioBufferListPointer,这是一种特殊类型,其中下标返回音频缓冲区。

    let bufferSizeBytes = MemoryLayout<Float>.size * 1234
    
    var bufferlist = AudioBufferList.allocate(maximumBuffers: 2)
    bufferlist[0] = AudioBuffer(mNumberChannels: 1,
                                mDataByteSize: UInt32(bufferSizeBytes),
                                mData: malloc(bufferSizeBytes))
    bufferlist[1] = AudioBuffer(mNumberChannels: 1,
                                mDataByteSize: UInt32(bufferSizeBytes),
                                mData: malloc(bufferSizeBytes))
    
    // Free your buffers and the pointer when you're done.
    for buffer in bufferlist {
        free(buffer.mData)
    }
    free(&bufferlist)
    

    【讨论】:

    • 谢谢你,这极大地改善了我的生活!
    【解决方案2】:

    您可以使用 Core Audio API 为 2 个交错流创建一个带有 2 个缓冲区的 AudioBufferList:

    import AudioUnit
    import AVFoundation
    
    var myBufferList = AudioBufferList(
                  mNumberBuffers: 2,
                  mBuffers: AudioBuffer(
                      mNumberChannels: UInt32(2),
                      mDataByteSize: myBufferSizeBytes,
                      mData: nil) )
    

    【讨论】:

      猜你喜欢
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2014-08-01
      • 2014-04-03
      • 2011-06-01
      相关资源
      最近更新 更多