簡體   English   中英

AudioKit v5 輸出問題,使用 AVAudioSession defaultToSpeaker 時沒有聲音

[英]AudioKit v5 output problems, no sound when AVAudioSession defaultToSpeaker is used

編輯#2:好的,我在這里錯過了一些大事,但我仍然有問題。 聲音柔和而我必須放大它的原因是它來自聽筒,而不是揚聲器。 當我將選項 .defaultToSpeaker 添加到 setCategory 時,我根本沒有聲音。

所以,這才是真正的問題,當我將類別設置為 .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 為(空)是否重要? 在添加 .defaultToSpeaker 選項之前,此報告的輸出設置為 Receiver,也帶有 selectedDataSource = (null),所以我猜不是。

編輯:我添加了設置音頻會話類別的代碼。 新代碼如下所示。 到目前為止,它似乎沒有任何效果。 如果我將其保留或注釋掉,我看不出任何區別。 我也有修改麥克風模式的代碼(為了簡單起見,我在這里刪除了)。 這也沒有明顯的影響。 也許,這是意料之中的?

除了以下症狀外,如果我使用“設置”/“藍牙”來選擇 AirPods,那么即使我刪除了 AirPods,應用程序也沒有任何輸出。

我在這里缺少什么?

/編輯

在模擬器上運行良好后,我開始在我的 11 Pro Max 上進行調試。 在 MandolinString 上演奏音符時,來自(11 Pro Max 或 8)模擬器的聲音響亮而清晰。 在真正的手機上,聲音幾乎聽不見,並且僅來自揚聲器。 它不會連接到附帶的音頻揚聲器,無論是 HomePod 還是 AirPods。 這是 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。 一切都是最新的

這很可能不是 AudioKit 本身的問題,它與 AVAudioSession 有關,您可能需要在設備上將其設置為 DefaultToSpeaker。 與版本 4 相比,AudioKit 5 的自動會話管理更少,選擇做出更少的假設並讓開發人員擁有控制權。

答案確實是為 AVAudioSession 添加代碼。 但是,它在我第一次放置的地方不起作用。 當我把它放在 App 委托 didFINishLauchWithOptions 中時,它只對我有用。 我在 AudioKit Cookbook 中找到了這個。 這有效:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM