Index: webrtc/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.m |
diff --git a/webrtc/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.m b/webrtc/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.m |
new file mode 100644 |
index 0000000000000000000000000000000000000000..64801bde67810eb89a85c671a3f1506f1e714a2d |
--- /dev/null |
+++ b/webrtc/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.m |
@@ -0,0 +1,115 @@ |
+/* |
+ * Copyright 2016 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 "webrtc/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.h" |
+ |
+#import "webrtc/modules/audio_device/ios/objc/RTCAudioSession.h" |
+ |
+// Try to use mono to save resources. Also avoids channel format conversion |
+// in the I/O audio unit. Initial tests have shown that it is possible to use |
+// mono natively for built-in microphones and for BT headsets but not for |
+// wired headsets. Wired headsets only support stereo as native channel format |
+// but it is a low cost operation to do a format conversion to mono in the |
+// audio unit. Hence, we will not hit a RTC_CHECK in |
+// VerifyAudioParametersForActiveAudioSession() for a mismatch between the |
+// preferred number of channels and the actual number of channels. |
+const int kRTCAudioSessionPreferredNumberOfChannels = 1; |
+ |
+// Preferred hardware sample rate (unit is in Hertz). The client sample rate |
+// will be set to this value as well to avoid resampling the the audio unit's |
+// format converter. Note that, some devices, e.g. BT headsets, only supports |
+// 8000Hz as native sample rate. |
+const double kRTCAudioSessionHighPerformanceSampleRate = 48000.0; |
+ |
+// A lower sample rate will be used for devices with only one core |
+// (e.g. iPhone 4). The goal is to reduce the CPU load of the application. |
+const double kRTCAudioSessionLowComplexitySampleRate = 16000.0; |
+ |
+// Use a hardware I/O buffer size (unit is in seconds) that matches the 10ms |
+// size used by WebRTC. The exact actual size will differ between devices. |
+// Example: using 48kHz on iPhone 6 results in a native buffer size of |
+// ~10.6667ms or 512 audio frames per buffer. The FineAudioBuffer instance will |
+// take care of any buffering required to convert between native buffers and |
+// buffers used by WebRTC. It is beneficial for the performance if the native |
+// size is as close to 10ms as possible since it results in "clean" callback |
+// sequence without bursts of callbacks back to back. |
+const double kRTCAudioSessionHighPerformanceIOBufferDuration = 0.01; |
+ |
+// Use a larger buffer size on devices with only one core (e.g. iPhone 4). |
+// It will result in a lower CPU consumption at the cost of a larger latency. |
+// The size of 60ms is based on instrumentation that shows a significant |
+// reduction in CPU load compared with 10ms on low-end devices. |
+// TODO(henrika): monitor this size and determine if it should be modified. |
+const double kRTCAudioSessionLowComplexityIOBufferDuration = 0.06; |
+ |
+@implementation RTCAudioSessionConfiguration |
+ |
+@synthesize category = _category; |
+@synthesize categoryOptions = _categoryOptions; |
+@synthesize mode = _mode; |
+@synthesize sampleRate = _sampleRate; |
+@synthesize ioBufferDuration = _ioBufferDuration; |
+@synthesize inputNumberOfChannels = _inputNumberOfChannels; |
+@synthesize outputNumberOfChannels = _outputNumberOfChannels; |
+ |
+- (instancetype)init { |
+ if (self = [super init]) { |
+ // Use a category which supports simultaneous recording and playback. |
+ // By default, using this category implies that our app’s audio is |
+ // nonmixable, hence activating the session will interrupt any other |
+ // audio sessions which are also nonmixable. |
+ _category = AVAudioSessionCategoryPlayAndRecord; |
+ _categoryOptions = AVAudioSessionCategoryOptionAllowBluetooth; |
+ |
+ // Specify mode for two-way voice communication (e.g. VoIP). |
+ _mode = AVAudioSessionModeVoiceChat; |
+ |
+ // Set the session's sample rate or the hardware sample rate. |
+ // It is essential that we use the same sample rate as stream format |
+ // to ensure that the I/O unit does not have to do sample rate conversion. |
+ // Set the preferred audio I/O buffer duration, in seconds. |
+ NSUInteger processorCount = [NSProcessInfo processInfo].processorCount; |
+ // Use best sample rate and buffer duration if the CPU has more than one |
+ // core. |
+ if (processorCount > 1) { |
+ _sampleRate = kRTCAudioSessionHighPerformanceSampleRate; |
+ _ioBufferDuration = kRTCAudioSessionHighPerformanceIOBufferDuration; |
+ } else { |
+ _sampleRate = kRTCAudioSessionLowComplexitySampleRate; |
+ _ioBufferDuration = kRTCAudioSessionLowComplexityIOBufferDuration; |
+ } |
+ |
+ // We try to use mono in both directions to save resources and format |
+ // conversions in the audio unit. Some devices does only support stereo; |
+ // e.g. wired headset on iPhone 6. |
+ // TODO(henrika): add support for stereo if needed. |
+ _inputNumberOfChannels = kRTCAudioSessionPreferredNumberOfChannels; |
+ _outputNumberOfChannels = kRTCAudioSessionPreferredNumberOfChannels; |
+ } |
+ return self; |
+} |
+ |
++ (instancetype)currentConfiguration { |
+ RTCAudioSession *session = [RTCAudioSession sharedInstance]; |
+ RTCAudioSessionConfiguration *config = |
+ [[RTCAudioSessionConfiguration alloc] init]; |
+ config.mode = session.mode; |
+ config.sampleRate = session.sampleRate; |
+ config.ioBufferDuration = session.IOBufferDuration; |
+ config.inputNumberOfChannels = session.inputNumberOfChannels; |
+ config.outputNumberOfChannels = session.outputNumberOfChannels; |
+ return config; |
+} |
+ |
++ (instancetype)webRTCConfiguration { |
+ return [[self alloc] init]; |
+} |
+ |
+@end |