gpt4 book ai didi

swift - 将 magicCookie 从音频文件复制到音频队列失败

转载 作者:行者123 更新时间:2023-11-30 10:30:02 25 4
gpt4 key购买 nike

我可能是第 1000 个在 Adamson/Avila 的名著《学习 Core Audio》的帮助下尝试学习 CoreAudio 的人。可能是第 1000 个人努力将原始代码示例转换为现代 Swift。

我从书中第 5 章(使用 AudioQueueService 播放文件)中得到了示例,但每当我尝试以使用 magicCookie 的格式播放文件时,代码就会崩溃。

我将代码缩减为仅重现错误所需的代码:

import AudioToolbox

// user data struct needed for the callback

struct MyPlayer {
var playbackFile: AudioFileID?
}

// callback stub

func myAQOutputCallback(inUserData: UnsafeMutableRawPointer?, inQueue: AudioQueueRef, inCompleteAQBuffer: AudioQueueBufferRef) {

}

func copyEncoderCookieToQueue(_ file: AudioFileID, _ queue: AudioQueueRef) {

var propertySize: UInt32 = 0
let result: OSStatus = AudioFileGetPropertyInfo(file, kAudioFilePropertyMagicCookieData, &propertySize, nil)

if result == noErr && propertySize > 0 {

var magicCookie = UnsafeMutableRawPointer.allocate(byteCount:Int(propertySize), alignment: Int(propertySize))

var error = AudioFileGetProperty(file, kAudioFilePropertyMagicCookieData, &propertySize, &magicCookie)

// up to this point everything works as expected

error = AudioQueueSetProperty(queue, kAudioQueueProperty_MagicCookie, magicCookie, propertySize)
magicCookie.deallocate()
}
}

func main() {

let kPlaybacklFileLocation = "/Users/\(NSUserName())/Desktop/70s Ballad Drums 01.caf"
var player = MyPlayer()

let myFileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, kPlaybacklFileLocation as CFString, .cfurlposixPathStyle, false)
var error = AudioFileOpenURL(myFileURL!, .readPermission, 0, &player.playbackFile)

var dataFormat = AudioStreamBasicDescription()
var propSize = UInt32(MemoryLayout.size(ofValue: dataFormat))
error = AudioFileGetProperty(player.playbackFile!, kAudioFilePropertyDataFormat, &propSize, &dataFormat)

var queue: AudioQueueRef?
error = AudioQueueNewOutput(&dataFormat, myAQOutputCallback, &player, nil, nil, 0, &queue)

copyEncoderCookieToQueue(player.playbackFile!, queue!)
}

main()

要测试它,您可以将 GarageBand 附带的 Apple AppleLoop 文件之一放到桌面上。 MagicCookie 似乎正确提取,但尝试将其写入 AudioQueue 会导致错误 EXC_BAD_ACCESS,我了解到这意味着某些东西正在尝试访问已发布的对象,但据我所知,所有参数应该仍然有效。

我不知道如何进一步调查导致问题的原因。

最佳答案

在音频队列永久关闭后的许多(200?)毫秒之前,尽量不要释放 magic cookie 存储。队列可以调用一个异步线程,该线程使用知道何时的 cookie。

关于swift - 将 magicCookie 从音频文件复制到音频队列失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59339855/

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