在macOS的Swift 5中声明ExtAudioFileRef的正确方法

问题描述

我一直在研究音频应用程序,可以在ExtAudioFile中找到特定点,并将代表特定播放长度(时间)的特定数量的帧加载到AVAudioPCMBuffer中并开始播放。如果用户在播放该音频片段时选中了一个复选框,则缓冲区将被馈送音频文件的其余内容,以便播放到最后。

但是,我遇到了一个障碍。我发现了加载这些资源的较旧的代码示例。他们以这种方式宣布对我而言,呼叫在Swift 5中不起作用。我遇到错误。具体来说:

import Cocoa
import AVFoundation
import AudioToolBox

do {
   var err:Osstatus = noErr
   let url = URL(fileURLWithPath: "./audio files/myAudioFile.mp3")
   let track = try AVAudioFile(forReading: url)
   var trackRef = ExtAudioFileRef?
   err = try ExtAudioFileOpenURL(url as CFURL,trackRef)
} catch {
   print(error)
}

我遇到的第一个错误是关于trackRef。编辑器将此行标记为“类型名称后的预期成员名称或构造函数调用”。但是我所遵循的示例仅声明了上面代码中所示的属性

下一行err = try ExtAudioFileOpenURL(orl as CFURL,trackRef)出现错误“无法将类型'ExtAudioFileRef?.Type'(aka'Optional.Type')的值转换为预期的参数类型'UnsafeMutablePointer ''(aka'UnsafeMutablePointer ')。”

编辑器建议我将trackRef声明更改为ver trackRef = ExtAudioFileRef?()var trackRef = ExtAudioFileRef?.self,但这些都没有帮助,因为如果我尝试使用第一个建议,则会得到“ 无法为类型调用初始化程序” “ ExtAudioFileRef?”没有参数”和显示 1。”的灰色注释。“ ExtAudioFileRef?”的重载存在以下部分匹配的参数列表:(包装),(来自:解码器),(nilLiteral:())。“但是err = ExtAudioFileOpenURL(url as CFURL,trackRef)错误消失了。如果我尝试使用第二个建议let trackRef = ExtAudioFileRef?.self,则该行没有错误,但是在err = ExtAudioFileOpenURL(url as CFURL,trackRef)行中却出现错误显示为“ 无法转换类型'ExtAudioFileRef?.Type的值”。 '(又名“ Optional.Type”)设置为预期的参数类型“ UnsafeMutablePointer ”(又名“ UnsafeMutablePointer ')

由于我不了解UnsafeMutablePointer是什么,所以我不太了解这些错误的含义。我只是按照示例代码来尝试实现我想做的事情。不幸的是,我无法在Swift中获得任何音频工具来完成我想做的事情,这对我来说是下一个难题。

感谢您的帮助。

解决方法

我终于在后来的Swift中找到了一些使用它的最新代码。

我不需要初始化trackRef属性,这是导致错误出现在声明中的原因。我也不需要try方法。

这是声明它的正确方法:

var trackRef: ExtAudioFileRef?
err = ExtAudioFileOpenURL(url as CFURL,&trackRef)

现在下一个兔子洞...