如何在不使用AudioSessionSetProperty的情况下将音频路由到扬声器?

时间:2013-09-14 22:45:59

标签: ios objective-c avaudiosession

由于AudioSessionSetProperty可能会deprecated,我正在尝试找到如何使用其他方式将音频路由到speaker的代码示例。

之前我做过以下事情:

-(void)setSpeakerEnabled
{
    debugLog(@"%s",__FUNCTION__);
    UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

    AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideAudioRoute,
                         sizeof (audioRouteOverride),
                         &audioRouteOverride
                         );
}

尝试获得相同的结果,但without callAudioSessionSetProperty

4 个答案:

答案 0 :(得分:58)

在iOS的每个版本中,更多的audioSession属性都会迁移到AVFoundation,因此您应该在可用时优先使用这些属性。

由于iOS 6 kAudioSessionProperty_OverrideAudioRoute通过方法

在AVAudioSession中表示
- (BOOL)overrideOutputAudioPort:error:

可用值为AVAudioSessionPortOverrideNoneAVAudioSessionPortOverrideSpeaker

以下是完全通过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区域