5

音を聞くと同時に再生するアプリがあります。デフォルトでは、サウンド出力はイヤホンを経由します。したがって、次のコードを使用して、スピーカーを介してルーティングします。

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

これは正常に機能します。でも今は、ヘッドホンや外部スピーカーを付けた状態で、ヘッドホンから音を流したいと思います。どうすればそれを達成できますか?

また、理想的には、他のすべてのサウンド(つまり、音楽など)は、アプリの起動時にミュートする必要があります。

ありがとう!

4

3 に答える 3

11

これを行うには、オーディオセッションを設定するときにプロパティリスナーを追加する必要があります。

AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, audioSessionPropertyListener, nil);

どこ

void audioSessionPropertyListener(void* inClientData, AudioSessionPropertyID inID,
                                          UInt32 inDataSize, const void* inData) {
          UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

          if (!isHeadsetPluggedIn()) 
            AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride);
        }

BOOL isHeadsetPluggedIn() {
  UInt32 routeSize = sizeof (CFStringRef);
  CFStringRef route;

  OSStatus error = AudioSessionGetProperty (kAudioSessionProperty_AudioRoute,
                                            &routeSize,
                                            &route
                                            );



     if (!error && (route != NULL) && ([(NSString*)route rangeOfString:@"Head"].location != NSNotFound)) {
        NSLog(@"HeadsetPluggedIn");
        return YES;
      }
      NSLog(@"Headset_NOT_PluggedIn");
      return NO;
    }

そのため、ヘッドホンを接続または接続すると、通知が届き、音声出力の方向が変わります。

于 2010-09-09T16:10:49.033 に答える
1

これは迅速で汚い方法であり、私にとってはうまくいくようです:

void sessionPropertyListener(void *                  inClientData,
                             AudioSessionPropertyID  inID,
                             UInt32                  inDataSize,
                             const void *            inData){

  if (inID == kAudioSessionProperty_AudioRouteChange)
  {
    CFStringRef newRoute;
    UInt32 size = sizeof(CFStringRef);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &newRoute);
    if (newRoute)
    {
      CFShow(newRoute);
      if (CFStringCompare(newRoute, CFSTR("ReceiverAndMicrophone"),
                          (UInt32)NULL) == kCFCompareEqualTo)//if receiver, play through speakers
      {
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
                                 sizeof(audioRouteOverride),
                                 &audioRouteOverride);
      }
      else if (CFStringCompare(newRoute, CFSTR("HeadsetInOut"),
                               (UInt32)NULL) == kCFCompareEqualTo)//headset
      {
        UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
        AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,
                                 sizeof(audioRouteOverride),
                                 &audioRouteOverride);
      }
    }
  }
}
于 2012-12-28T01:25:32.937 に答える
0

iOS 7以降で廃止されたAudioSessionSetPropertyでは、AVFoundationAVAudioSessionを使用する必要があります。目的のアクションは、ユーザーアクションがスピーカーを通過するルートをオーバーライドできるようにすることであるため、AVAudioSessionPortOverrideSpeakerとAVAudioSessionCategoryOptionDefaultToSpeakerの違いを検討することができます。

テクニカルブリテンQ&A QA1754によると、「AVAudioSessionCategoryOptionDefaultToSpeakerを使用すると、ユーザージェスチャが尊重されます。たとえば、ヘッドセットを接続すると、ルートがヘッドセットマイク/ヘッドフォンに変更され、ヘッドセットを取り外すと、ルートが組み込みに変更されます。マイク/スピーカー」。

テクニカルブリテンでは、AVAudioSessionPortOverrideSpeakerは、たとえばスピーカーフォンボタンでの使用に適していると説明されていますが、これは元の投稿で求められていたものではないことに注意してください。

https://developer.apple.com/library/ios/qa/qa1754/_index.html

プレーヤーを呼び出す前に、次のように自分の実装が呼び出されます。

NSError *error;
AVAudioSession* audioSession   = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker error:&error];
// handle any error
// initiate the player or recorder
[_player play];

また、この質問は、別の関連する投稿で取り上げられている質問と似ています。

ここで参照されている同じ技術情報によると、「overrideOutputAudioPortの使用を考えてください:スピーカー(AVAudioSessionPortOverrideSpeaker)と通常の出力ルート(AVAudioSessionPortOverrideNone)を切り替えることができるスピーカーフォンボタンを実装するために使用できるものに関して。 「」

スピーカーオーバーライドoverrideOutputPortカテゴリの実装を探している場合は、その投稿を参照してください: AudioSessionSetPropertyを使用せずにオーディオをスピーカーにルーティングするにはどうすればよいですか?

于 2015-10-23T16:52:00.983 に答える