gpt4 book ai didi

swift - 调用 AudioObjectGetPropertyData 之前的 UnsafeMutableAudioBufferListPointer 分配

转载 作者:行者123 更新时间:2023-12-04 10:22:24 32 4
gpt4 key购买 nike

我一直在尝试通过 swift 使用 Apple 的 CoreAudio。我找到了许多关于如何枚举设备上的流和 channel 的示例。但是,在调用 UnsafeMutablePointer<AudioBufferList>.allocate() 时,它们似乎都使用了不正确的大小.

他们首先请求属性数据大小,返回字节数。然后他们使用这个字节数来分配一个(不安全的)AudioBufferList该大小(使用字节数作为列表的大小!)。

请看下面我的评论:

var address = AudioObjectPropertyAddress(
mSelector:AudioObjectPropertySelector(kAudioDevicePropertyStreamConfiguration),
mScope:AudioObjectPropertyScope(kAudioDevicePropertyScopeInput),
mElement:0)

var propsize = UInt32(0);
var result:OSStatus = AudioObjectGetPropertyDataSize(self.id, &address, 0, nil, &propsize);
if (result != 0) {
return false;
}

// ABOVE: propsize is set to number of bytes that property data contains, typical number are 8 (no streams), 24 (1 stream, 2 interleaved channels)
// BELOW: propsize is used for AudioBufferList capacity (in number of buffers!)

let bufferList = UnsafeMutablePointer<AudioBufferList>.allocate(capacity:Int(propsize))
result = AudioObjectGetPropertyData(self.id, &address, 0, nil, &propsize, bufferList);
if (result != 0) {
return false
}

let buffers = UnsafeMutableAudioBufferListPointer(bufferList)
for bufferNum in 0..<buffers.count {
if buffers[bufferNum].mNumberChannels > 0 {
return true
}
}

这一直有效,因为它分配的内存比 UnsafeMutablePointer<AudioBufferList> 需要的多得多。 ,但这显然是错误的。

我一直在寻找一种正确分配 UnsafeMutablePointer<AudioBufferList> 的方法来自 AudioObjectGetPropertyDataSize() 返回的字节数,但我一整天都找不到任何东西。请帮助 ;)

最佳答案

正确分配 UnsafeMutablePointer<AudioBufferList>来自 AudioObjectGetPropertyDataSize() 返回的字节数

你不应该分配 UnsafeMutablePointer<AudioBufferList> , 但分配确切大小的原始字节并将其转换为 UnsafeMutablePointer<AudioBufferList> .

像这样的东西:

        let propData = UnsafeMutableRawPointer.allocate(byteCount: Int(propsize), alignment: MemoryLayout<AudioBufferList>.alignment)
result = AudioObjectGetPropertyData(self.id, &address, 0, nil, &propsize, propData);
if (result != 0) {
return false
}
let bufferList = propData.assumingMemoryBound(to: AudioBufferList.self)

关于swift - 调用 AudioObjectGetPropertyData 之前的 UnsafeMutableAudioBufferListPointer 分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60792144/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com