插入蓝牙耳机时 AVAudioEngine 使用错误的格式
AVAudioEngine uses wrong format when bluetooth headset plugged in
我有一副带麦克风输入的蓝牙耳机。不使用麦克风,但使用时,输入和输出都强制为 8000kHz。
我的 AVAudioEngine 实例以 8000kHz 模式连接耳机,除非我进入系统设置并指定我不想使用耳机进行输入(每次连接耳机时都必须这样做)。
我注意到其他应用程序可以毫无问题地以预期的 44100kHz 播放。我的 AVAudioEngine 图中没有输入节点。
如何让 AVAudioEngine 更喜欢以合理的采样率连接?
赏金失败后,我写信给 Apple DTS,得到了很好的回应(包括下面我从 Objective-C 翻译的代码示例)。
以下函数将以仅输出模式连接到默认音频设备,而不是默认行为的 inout/output 模式。记得在引擎启动前调用!
func setOutputDeviceFor(_ engine: AVAudioEngine) -> Bool {
var addr = AudioObjectPropertyAddress(
mSelector: kAudioHardwarePropertyDefaultOutputDevice,
mScope: kAudioObjectPropertyScopeGlobal,
mElement: kAudioObjectPropertyElementMaster)
var deviceID: AudioObjectID = 0
var size = UInt32(MemoryLayout.size(ofValue: deviceID))
let err = AudioObjectGetPropertyData(
AudioObjectID(kAudioObjectSystemObject),
&addr,
0,
nil,
&size,
&deviceID)
if (noErr == err && kAudioDeviceUnknown != deviceID) {
do {
try engine.outputNode.auAudioUnit.setDeviceID(deviceID)
} catch {
print(error)
return false
}
return true
} else {
print("ERROR: couldn't get default output device, ID = \(deviceID), err = \(err)")
return false
}
}
我有一副带麦克风输入的蓝牙耳机。不使用麦克风,但使用时,输入和输出都强制为 8000kHz。
我的 AVAudioEngine 实例以 8000kHz 模式连接耳机,除非我进入系统设置并指定我不想使用耳机进行输入(每次连接耳机时都必须这样做)。
我注意到其他应用程序可以毫无问题地以预期的 44100kHz 播放。我的 AVAudioEngine 图中没有输入节点。
如何让 AVAudioEngine 更喜欢以合理的采样率连接?
赏金失败后,我写信给 Apple DTS,得到了很好的回应(包括下面我从 Objective-C 翻译的代码示例)。
以下函数将以仅输出模式连接到默认音频设备,而不是默认行为的 inout/output 模式。记得在引擎启动前调用!
func setOutputDeviceFor(_ engine: AVAudioEngine) -> Bool {
var addr = AudioObjectPropertyAddress(
mSelector: kAudioHardwarePropertyDefaultOutputDevice,
mScope: kAudioObjectPropertyScopeGlobal,
mElement: kAudioObjectPropertyElementMaster)
var deviceID: AudioObjectID = 0
var size = UInt32(MemoryLayout.size(ofValue: deviceID))
let err = AudioObjectGetPropertyData(
AudioObjectID(kAudioObjectSystemObject),
&addr,
0,
nil,
&size,
&deviceID)
if (noErr == err && kAudioDeviceUnknown != deviceID) {
do {
try engine.outputNode.auAudioUnit.setDeviceID(deviceID)
} catch {
print(error)
return false
}
return true
} else {
print("ERROR: couldn't get default output device, ID = \(deviceID), err = \(err)")
return false
}
}