首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Audiokit 4.9.5在xcode 11.4 + swift 5.2中崩溃,没有有用的错误消息

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

Stack Overflow用户
提问于 2020-04-25 22:16:03
回答 1查看 400关注 0票数 1

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

代码语言:javascript
复制
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,我重写了它,以适应最新的(考虑编写时间)Xcode11.4和Swift 5.2:

代码语言:javascript
复制
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为:

代码语言:javascript
复制
platform :ios, '11.0'

target 'AKHello' do
  use_frameworks!

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

end

源代码中有没有一些语法错误,或者有没有办法获得更有意义或更有用的错误来修复这个问题?考虑到github页面上的发行说明,AudioKit似乎与最新的Xcode11.4兼容(https://github.com/AudioKit/AudioKit/releases,在这里你可以读到“这个版本主要是通过CocoaPods带来与最新的Xcode11.4兼容的新的二进制文件”)

因为在View中初始化AudioKit可能不是一个好的做法(尽管其目标只是运行一个简单的Hello world,只是为了确保我将该部分移动到struct中,但同样的问题也会发生)

代码语言:javascript
复制
// 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()
    }
}

我还尝试作为一个观察者,在内容视图和场景委托中分别进行了更改,其中我为音频播放器传递了新的类:

代码语言:javascript
复制
// 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()
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-04-26 05:07:58

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61427028

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档