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

Jim*_*ins 37 objective-c ios avaudiosession

作为AudioSessionSetProperty有可能成为deprecated,我想找到的代码示例如何路由音频到speaker使用其他手段.

以前我做过以下事情:

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

    AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideAudioRoute,
                         sizeof (audioRouteOverride),
                         &audioRouteOverride
                         );
}
Run Code Online (Sandbox Code Playgroud)

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

fou*_*dry 59

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

由于iOS 6 kAudioSessionProperty_OverrideAudioRoute在AVAudioSession中由方法表示

- (BOOL)overrideOutputAudioPort:error:
Run Code Online (Sandbox Code Playgroud)

可用值为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");
    }

}
Run Code Online (Sandbox Code Playgroud)

UPDATE

自iOS 7.0起,Audio Session Services C API现已完全弃用,转而支持AVAudioSession.

更新2

- (BOOL)overrideOutputAudioPort:error:  
Run Code Online (Sandbox Code Playgroud)

是一个方法,而不是属性,它设置一个基础的只写 UInt32值.您无法获取当前值,您应该将该方法视为设置临时状态.如果音频路由更改或中断,则属性将重置为其默认值(AVAudioSessionPortOverrideNone).您可以通过获取中断通知AVAudioSessionDelegate.


Yun*_*hel 7

NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                                                   error:&error];    
if(error)
{ 
    NSLog(@"Error: AudioSession cannot use speakers");
}
Run Code Online (Sandbox Code Playgroud)