4

AudioServicesPlaySystemSound の使用に問題があります。出力がスピーカーを通過する場合、物事はうまく機能します。ただし、ユーザーがヘッドフォンを接続すると、出力はありません。ある種のリスナーを設定して、オーディオがプラグインされたときにヘッドフォンを介して自動的にルーティングされ、そうでない場合はスピーカーを介してルーティングされる簡単な方法はありますか?

次の方法を使用して、短く単純な AIF サウンド サンプルを再生しています。

-(void)playAif:(NSString *)filename {
    SystemSoundID soundID;
    NSString *path = [[NSBundle mainBundle]
       pathForResource:filename ofType:@"aif"];    

    if (path) { // test for path, to guard against crashes

    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
    AudioServicesPlaySystemSound (soundID);

        }
   }

私は何かが欠けているに違いないことを知っています。これを行うためのセットアップが少しあります。何か案は?

4

1 に答える 1

4

docs の関連部分を教えてくれた @Till に感謝します。この問題を抱えている他の人にとって、解決策は、セッション カテゴリを明示的に設定することです。私の場合は環境音に設定します。このコードは、アップルのドキュメントから切り取ったものです:

    UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;    // 1

    AudioSessionSetProperty (
                             kAudioSessionProperty_AudioCategory,                        // 2
                             sizeof (sessionCategory),                                   // 3
                             &sessionCategory                                            // 4
                             );

したがって、オーディオを再生するための私の方法は次のようになります。

    -(void)playAif:(NSString *)filename {
    //  NSLog(@"play: %@", filename);

        SystemSoundID soundID;
        NSString *path = [[NSBundle mainBundle]
                          pathForResource:filename ofType:@"aif"];    


        if (path) { // test for path, to guard against crashes

            UInt32 sessionCategory = kAudioSessionCategory_AmbientSound;    // 1

            AudioSessionSetProperty (
                                     kAudioSessionProperty_AudioCategory,                        // 2
                                     sizeof (sessionCategory),                                   // 3
                                     &sessionCategory                                            // 4
                                     );

            AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
            AudioServicesPlaySystemSound (soundID);

        }
    }

これは私の問題を簡単に解決します!唯一の懸念は、サウンドを再生するたびに明示的に設定するのは過剰かもしれないということです。それを設定して忘れるより良い安全な方法を知っている人はいますか?そうでなければ、これはうまく機能します。

于 2011-01-16T18:10:07.373 に答える