| /* |
| * Copyright 2018 The WebRTC Project Authors. All rights reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #import "RTCNativeAudioSessionDelegateAdapter.h" |
| |
| #include "sdk/objc/native/src/audio/audio_session_observer.h" |
| |
| #import "base/RTCLogging.h" |
| |
| @implementation RTCNativeAudioSessionDelegateAdapter { |
| webrtc::AudioSessionObserver *_observer; |
| } |
| |
| - (instancetype)initWithObserver:(webrtc::AudioSessionObserver *)observer { |
| RTC_DCHECK(observer); |
| self = [super init]; |
| if (self) { |
| _observer = observer; |
| } |
| return self; |
| } |
| |
| #pragma mark - RTC_OBJC_TYPE(RTCAudioSessionDelegate) |
| |
| - (void)audioSessionDidBeginInterruption:(RTC_OBJC_TYPE(RTCAudioSession) *)session { |
| _observer->OnInterruptionBegin(); |
| } |
| |
| - (void)audioSessionDidEndInterruption:(RTC_OBJC_TYPE(RTCAudioSession) *)session |
| shouldResumeSession:(BOOL)shouldResumeSession { |
| _observer->OnInterruptionEnd(); |
| } |
| |
| - (void)audioSessionDidChangeRoute:(RTC_OBJC_TYPE(RTCAudioSession) *)session |
| reason:(AVAudioSessionRouteChangeReason)reason |
| previousRoute:(AVAudioSessionRouteDescription *)previousRoute { |
| switch (reason) { |
| case AVAudioSessionRouteChangeReasonUnknown: |
| case AVAudioSessionRouteChangeReasonNewDeviceAvailable: |
| case AVAudioSessionRouteChangeReasonOldDeviceUnavailable: |
| case AVAudioSessionRouteChangeReasonCategoryChange: |
| // It turns out that we see a category change (at least in iOS 9.2) |
| // when making a switch from a BT device to e.g. Speaker using the |
| // iOS Control Center and that we therefore must check if the sample |
| // rate has changed. And if so is the case, restart the audio unit. |
| case AVAudioSessionRouteChangeReasonOverride: |
| case AVAudioSessionRouteChangeReasonWakeFromSleep: |
| case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory: |
| _observer->OnValidRouteChange(); |
| break; |
| case AVAudioSessionRouteChangeReasonRouteConfigurationChange: |
| // The set of input and output ports has not changed, but their |
| // configuration has, e.g., a port’s selected data source has |
| // changed. Ignore this type of route change since we are focusing |
| // on detecting headset changes. |
| RTCLog(@"Ignoring RouteConfigurationChange"); |
| break; |
| } |
| } |
| |
| - (void)audioSessionMediaServerTerminated:(RTC_OBJC_TYPE(RTCAudioSession) *)session { |
| } |
| |
| - (void)audioSessionMediaServerReset:(RTC_OBJC_TYPE(RTCAudioSession) *)session { |
| } |
| |
| - (void)audioSession:(RTC_OBJC_TYPE(RTCAudioSession) *)session |
| didChangeCanPlayOrRecord:(BOOL)canPlayOrRecord { |
| _observer->OnCanPlayOrRecordChange(canPlayOrRecord); |
| } |
| |
| - (void)audioSessionDidStartPlayOrRecord:(RTC_OBJC_TYPE(RTCAudioSession) *)session { |
| } |
| |
| - (void)audioSessionDidStopPlayOrRecord:(RTC_OBJC_TYPE(RTCAudioSession) *)session { |
| } |
| |
| - (void)audioSession:(RTC_OBJC_TYPE(RTCAudioSession) *)audioSession |
| didChangeOutputVolume:(float)outputVolume { |
| _observer->OnChangedOutputVolume(); |
| } |
| |
| @end |