[英]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.