AudioKit v5输出问题,使用AudioSession defaultToSpeaker时没有声音

AudioKit v5输出问题,使用AudioSession defaultToSpeaker时没有声音,ios,swift,audiokit,Ios,Swift,Audiokit,编辑2:好的,我错过了一些重要的东西,但我仍然有一个问题。声音之所以柔和,我必须放大,是因为它来自听筒,而不是扬声器。当我将.defaultToSpeaker选项添加到setCategory时,我根本听不到声音 所以,这才是真正的问题,当我将category设置为.playbackAndRecord并将选项设置为.defaultToSpeaker时,为什么我在真正的手机上根本听不到声音?除了没有声音,我也没有收到麦克风的输入。在模拟器中声音很好 编辑3:我开始观察路由更改,当包含.default

编辑2:好的,我错过了一些重要的东西,但我仍然有一个问题。声音之所以柔和,我必须放大,是因为它来自听筒,而不是扬声器。当我将.defaultToSpeaker选项添加到setCategory时,我根本听不到声音

所以,这才是真正的问题,当我将category设置为.playbackAndRecord并将选项设置为.defaultToSpeaker时,为什么我在真正的手机上根本听不到声音?除了没有声音,我也没有收到麦克风的输入。在模拟器中声音很好

编辑3:我开始观察路由更改,当包含.defaultToSpeaker选项时,我的代码会报告以下内容

2020-12-26 12:17:56.212366-0700 SST[13807:3950195] Current route:

2020-12-26 12:17:56.213275-0700 SST[13807:3950195] <AVAudioSessionRouteDescription: 0x2816af8e0, 
inputs = (
    "<AVAudioSessionPortDescription: 0x2816af900, type = MicrophoneBuiltIn; name = iPhone Microphone; UID = Built-In Microphone; selectedDataSource = Bottom>"
); 
outputs = (
    "<AVAudioSessionPortDescription: 0x2816af990, type = Speaker; name = Speaker; UID = Speaker; selectedDataSource = (null)>"
)>
输出设置为扬声器。selectedDataSource为null是否重要?在.defaultToSpeaker选项被添加之前,此报告的输出设置为Receiver,并且selectedDataSource=null,因此我猜不会

编辑:我添加了设置音频会话类别的代码。新代码如下所示。到目前为止,它似乎没有任何效果。如果我把它放进去或注释掉,我看不出有什么区别。为了简单起见,我在这里删除了修改麦克风模式的代码。这也没有明显的效果。也许这是意料之中的事

除了下面的症状外,如果我使用设置/蓝牙选择AirPods,那么即使在我移除AirPods之后,我也不会从应用程序中获得任何输出

我错过了什么

/编辑

在模拟器上运行良好后,我开始在我的11 Pro Max上调试。在曼陀林弦上弹奏音符时,11 Pro Max或8模拟器发出的声音响亮而清晰。在真正的手机上,声音几乎听不见,而且只来自扬声器。它不会连接到连接的音频扬声器,无论是HomePod还是AirPod。这是v5错误吗?我需要对输出做些什么吗

第二个不太重要的问题是,当我实例化这个对象时,MandolinString会在我不调用任何东西的情况下触发。延迟后,额外的音量控制器和增益从0重置为1会抑制此声音

private let engine    = AudioEngine()
    private let mic       : AudioEngine.InputNode
    private let micAmp    : Fader
    private let mixer1    : Mixer
    private let mixer2    : Mixer
    private let silence   : Fader
    private let stringAmp : Fader
    private var pitchTap  : PitchTap
    
    private var tockAmp   : Fader
    private var metro     = Timer()
    
    private let sampler   = MIDISampler(name: "click")

    private let startTime = NSDate.timeIntervalSinceReferenceDate
    private var ampThreshold: AUValue = 0.12
    private var ampJumpSize: AUValue = 0.05

    private var samplePause = 0
    private var trackingNotStarted = true
    private var tracking = false
    private var ampPrev: AUValue = 0.0
    private var freqArray: [AUValue] = []
    
    init() {
        
        // Set up mic input and pitchtap
        mic = engine.input!
        micAmp = Fader(mic, gain: 1.0)
        mixer1 = Mixer(micAmp)
        silence = Fader(mixer1, gain: 0)
        mixer2 = Mixer(silence)
        pitchTap = PitchTap(mixer1, handler: {_ , _ in })
        
        // All sound is fed into mixer2
        // Mic input is faded to zero
        
        // Now add String sound to Mixer2 with a Fader
        pluckedString = MandolinString()
        stringAmp = Fader(pluckedString, gain: 4.0)
        mixer2.addInput(stringAmp)
        
        // Create a sound for the metronome (tock), add as input to mixer2
        try! sampler.loadWav("Click")
        tockAmp = Fader(sampler, gain: 1.0)
        mixer2.addInput(tockAmp)

        engine.output = mixer2

        self.pitchTap = PitchTap(micAmp,
                                 handler:
        { freq, amp in
            if (self.samplePause <= 0 && self.tracking) {
                self.samplePause = 0
                self.sample(freq: freq[0], amp: amp[0])
            }
        })
        
        do {
            //try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.measurement)
            try audioSession.setCategory(AVAudioSession.Category.playAndRecord)
            //, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
            try audioSession.setActive(true)
        } catch let error as NSError {
            print("Unable to create AudioSession: \(error.localizedDescription)")
        }
        
        do {
            try engine.start()
            akStartSucceeded = true
        } catch {
            akStartSucceeded = false
        }
    } // init

XCode 12,iOS 14,SPM。一切都是最新的

很可能这本身不是音频套件问题,它与音频会话有关,您可能需要在设备上将其设置为DefaultToSpeaker。与版本4相比,AudioKit 5的自动会话管理更少,它选择了更少的假设并让开发人员拥有控制权。

答案确实是为音频会话添加代码。然而,它并没有工作在我第一次把它。只有当我把它放到应用程序delegate didFInishLauchWithOptions中时,它才对我有效。我在AudioKit食谱中找到了这个。这项工作:

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        #if os(iOS)
            self.audioSetup()
        #endif

        return true
    }

    #if os(iOS)
    func audioSetup() {
        let session = AVAudioSession.sharedInstance()
        
        do {
            Settings.bufferLength = .short
            try session.setPreferredIOBufferDuration(Settings.bufferLength.duration)
            try session.setCategory(.playAndRecord,
                                                            options: [.defaultToSpeaker, .mixWithOthers])
            try session.setActive(true)
        } catch let err {
            print(err)
        }
    
        // Other AudioSession stuff here
        
        do {
            try session.setActive(true)
        } catch let err {
            print(err)
        }
    }
    #endif

}

我添加了一个音频会话,但没有找到一种方法来改善这种情况。我尝试了类别选项DefaultToSpeaker,结果根本没有声音输出。尝试不同的话筒选项和拾音方向会对音轨产生一些变化。使用GTE模式测量大大减少了我从tap获得的样本数量,这显然适得其反。我用添加的AVAudioSession代码编辑了上面的代码。请帮助。当我包括DefaultToSpeaker选项时,我没有听到任何声音。只有Play和Record类别,我至少能听到声音。