web-dev-qa-db-ja.com

AudioSessionSetPropertyを使用せずにスピーカーにオーディオをルーティングするにはどうすればよいですか?

AudioSessionSetPropertydeprecatedになる可能性があるため、他の手段を使用してspeakerにオーディオをルーティングする方法のコード例を見つけようとしています。

以前は次のことを行いました。

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

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

同じ結果を取得しようとしていますが、without callからAudioSessionSetPropertyへ。

36
Jim Hankins

IOSの各リリースでは、より多くのaudioSessionプロパティがAVFoundationに移行されるため、利用可能な場合は優先してそれらを使用する必要があります。

IOS 6以降kAudioSessionProperty_OverrideAudioRouteは、メソッドによってAVAudioSessionで表されます

- (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");
    }

}

[〜#〜] update [〜#〜]

IOS 7.0以降、オーディオセッションサービスC APIは完全に廃止され、AVAudioSessionが採用されました。

更新2

- (BOOL)overrideOutputAudioPort:error:  

プロパティではなくメソッドであり、基礎となるwrite-only UInt32値を設定します。現在の値を取得することはできません。また、メソッドを一時的な状態の設定として扱う必要があります。オーディオルートが変更または中断された場合、プロパティはデフォルト(AVAudioSessionPortOverrideNone)にリセットされます。 AVAudioSessionDelegate経由で中断通知を受け取ることができます。

58
foundry
NSError *error;
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
                                                   error:&error];    
if(error)
{ 
    NSLog(@"Error: AudioSession cannot use speakers");
}
7
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領域に貼り付けます

1
Mirac Bektas

Foundryのソリューションと this blog Mario Dianaにより、iOS 7で非推奨になったオーディオセッションのセットアップコードをアップグレードすることもできました。私の古いコードは AudioBufferPlayerMatthijs Hollemans 。 AVFoundation.frameworkを必ず追加してください。

0
Greg