Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息

Posted

技术标签:

【中文标题】Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息【英文标题】:Audiokit 4.9.5 crashes in xcode 11.4 + swift 5.2, no useful error message 【发布时间】:2020-04-25 14:16:02 【问题描述】:

导入 AudioKit 并尝试运行一个小示例时,我得到:

Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo=NSLocalizedDescription=Rendering service was interrupted

经过多次测试,我注意到它仅在“预览(右侧边栏)”模式下崩溃,因为它“构建”并在“模拟器”中运行。这是 Xcode 中 preview 功能的限制吗?我不知道,但已向 AudioKit 团队报告 (https://github.com/AudioKit/AudioKit/issues/2034)

考虑到在 (https://audiokit.io/examples/HelloWorld/) 中发布的 hello world,我重新编写了一些不同的内容,以适应最新的(考虑写作时间)Xcode 11.4 和 Swift 5.2:

import SwiftUI
import AudioKit

struct ContentView: View 
    var oscillator = AKOscillator()
    var body: some View 
        VStack 
            Button("Play") 
                self.playSound()
            
        .onAppear 
            do 
                AudioKit.output = self.oscillator
                try AudioKit.start()
             catch 
                print("audiokit init error")
            
        
    

    private func playSound()
        self.oscillator.amplitude = 1
        self.oscillator.frequency = 440
        self.oscillator.start()
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

Podfile 是:

platform :ios, '11.0'

target 'AKHello' do
  use_frameworks!

  # Pods for AKHello
  pod 'AudioKit', '~> 4.9.5'

end

源代码中是否存在一些语法错误,或者有一种方法可以得到更有意义或更有用的错误来解决这个问题? AudioKit 似乎与最新的 Xcode 11.4 兼容,考虑到 github 页面中的发行说明(https://github.com/AudioKit/AudioKit/releases,您可以在其中阅读“此版本主要是通过 CocoaPods 带来与最新 Xcode 版本兼容的新二进制文件”)

因为在 View 中初始化 AudioKit 可能不是一个好习惯(尽管目标只是运行一个简单的 Hello 世界,只是为了确保我将那部分移到 struct 中,但同样的问题发生)

// AudioPlayer.swift

import AudioKit

struct AudioPlayer 
    var oscillator = AKOscillator()
    init() 
        do 
            AudioKit.output = self.oscillator
            try AudioKit.start()
         catch 
            print("audiokit init error")
        
    

    func playSound()
        self.oscillator.amplitude = 1
        self.oscillator.frequency = 440
        self.oscillator.start()
    


// ContentView.swift


import SwiftUI

struct ContentView: View 
    var audioPlayer: AudioPlayer = AudioPlayer()
    var body: some View 
        VStack 
            Button("Play") 
                self.audioPlayer.playSound()
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

还尝试作为可观察对象,在内容视图和场景委托中进行了相应的更改,我在其中传递了音频播放器的新类:

// ContentView.swift

import SwiftUI

struct ContentView: View 
    @ObservedObject var audioPlayer: AudioPlayer

    var body: some View 
        VStack 
            Button("Play") 
                self.audioPlayer.playSound()
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView(audioPlayer: AudioPlayer())
    


// AudioPlayer.swift

import AudioKit
import Combine

class AudioPlayer: ObservableObject 
    let objectWillChange = PassthroughSubject<AudioPlayer, Never>()
    var isPlaying = false 
        didSet 
            objectWillChange.send(self)
        
    
    var oscillator = AKOscillator()

    init() 
        do 
            AudioKit.output = self.oscillator
            try AudioKit.start()
            isPlaying = true
         catch 
            print("audiokit init error")
        
    

    func playSound()
        self.oscillator.amplitude = 1
        self.oscillator.frequency = 440
        self.oscillator.start()
    


// SceneDelegate.swift

import UIKit
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 

        let contentView = ContentView(audioPlayer: AudioPlayer())

        if let windowScene = scene as? UIWindowScene 
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        
    

【问题讨论】:

我能够使用 pod 'AudioKit'、'~> 4.0'、swift 5 和 Xcode 11.3.1 成功运行 @joyson 感谢您的宝贵时间,谢谢!我会看看我是否可以降级,但到目前为止,我会认为 AudioKit 与最新版本不兼容。但不确定这是否正确,因为releases 的详细信息提到了 XCode 11.4。 【参考方案1】:

我不确定这是否是您的全部问题,但不要指望 AudioKit 可以在预览视图中工作。据我所知,这应该只是视觉 SwiftUI 类型的东西。您将 AudioKit 的生命周期与 SwiftUI 绑定的第一种方法非常危险。请记住,SwiftUI 会做它需要做的任何神奇的事情,你不应该相信音频系统可以在其中工作。然后,您将音频播放器的内容移到了自己的类中,但我仍然担心您将生命周期与 SwiftUI 结构过于紧密地联系在一起。我的方法是将音频引擎移动到在 SceneDelegate 中创建的自己的类中,然后在主内容视图的 onAppear 上启动。有关如何设置的示例,请参阅 iOS+Catalyst/Drums/ 的 AudioKit 示例文件夹。

【讨论】:

感谢您抽出宝贵时间,非常感谢!是的,最后一个例子使用了一个应该没问题的可观察对象?该问题仅发生在预览版中,我现在认为除非另有说明,否则预览版可能会有一些限制。 不,我认为即使是您的第二个实现也有问题。真正查看示例以及它如何在 SceneDelegate 中初始化 Conductor。 谢谢!我一定会的!感谢您的帮助:)

以上是关于Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息的主要内容,如果未能解决你的问题,请参考以下文章

Audiokit 4.7 Playgrounds 未编译。错误:无法查找符号:

AudioKit V4.1 和版本 9.3 beta (9Q98q)

AudioKit 请求访问麦克风

Swift:声音输出和麦克风输入 |使用 AudioKit |

在 AudioKit 中过滤音频

Audiokit 似乎只接收前三个 sysex MIDI 消息