由于AudioSessionSetProperty
可能会deprecated
,我正在尝试找到如何使用其他方式将音频路由到speaker
的代码示例。
之前我做过以下事情:
-(void)setSpeakerEnabled
{
debugLog(@"%s",__FUNCTION__);
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute,
sizeof (audioRouteOverride),
&audioRouteOverride
);
}
尝试获得相同的结果,但without call
到AudioSessionSetProperty
。
答案 0 :(得分:58)
在iOS的每个版本中,更多的audioSession属性都会迁移到AVFoundation,因此您应该在可用时优先使用这些属性。
由于iOS 6 kAudioSessionProperty_OverrideAudioRoute
通过方法
- (BOOL)overrideOutputAudioPort:error:
可用值为AVAudioSessionPortOverrideNone
和AVAudioSessionPortOverrideSpeaker
以下是完全通过AVFoundation配置的示例音频会话:
- (void)configureAVAudioSession
{
// Get your app's audioSession singleton object
AVAudioSession *session = [AVAudioSession sharedInstance];
// Error handling
BOOL success;
NSError *error;
// set the audioSession category.
// Needs to be Record or PlayAndRecord to use audioRouteOverride:
success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
error:&error];
if (!success) {
NSLog(@"AVAudioSession error setting category:%@",error);
}
// Set the audioSession override
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&error];
if (!success) {
NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
}
// Activate the audio session
success = [session setActive:YES error:&error];
if (!success) {
NSLog(@"AVAudioSession error activating: %@",error);
}
else {
NSLog(@"AudioSession active");
}
}
更新
自iOS 7.0起,音频会话服务C API现已完全弃用,转而支持AVAudioSession。
更新2
- (BOOL)overrideOutputAudioPort:error:
是一个方法,而不是属性,它设置了基础只写 UInt32值。您无法获取当前值,您应该将该方法视为设置临时状态。如果音频路由更改或中断,则属性将重置为其默认值(AVAudioSessionPortOverrideNone
)。您可以通过AVAudioSessionDelegate
获取中断通知。
答案 1 :(得分:6)
NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&error];
if(error)
{
NSLog(@"Error: AudioSession cannot use speakers");
}
答案 2 :(得分:0)
Foundry的解决方案与Mario Diana的this blog一起允许我升级iOS 7中不推荐使用的音频会话设置代码。我的旧代码基于 AudioBufferPlayer by Matthijs Hollemans。 请记住添加AVFoundation.framework。
答案 3 :(得分:0)
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSession.Category.playAndRecord, mode: .spokenAudio, options: .defaultToSpeaker)
try audioSession.setActive(true, options: .notifyOthersOnDeactivation)
} catch {
print("error.")
}
///将此代码粘贴到您的viewLoad区域