From ab1293ad76cea8bb3cbed68ae57b1fc32e7ea4bc Mon Sep 17 00:00:00 2001 From: tkchin Date: Tue, 30 Aug 2016 12:35:05 -0700 Subject: [PATCH] Update iOS AppRTCDemo to use level controller. NOTRY=True BUG= Review-Url: https://codereview.webrtc.org/2294913003 Cr-Commit-Position: refs/heads/master@{#13977} --- .../objc/AppRTCDemo/ARDAppClient+Internal.h | 1 + .../examples/objc/AppRTCDemo/ARDAppClient.h | 5 +++- .../examples/objc/AppRTCDemo/ARDAppClient.m | 20 ++++++++++++-- .../objc/AppRTCDemo/ios/ARDMainView.h | 11 ++++---- .../objc/AppRTCDemo/ios/ARDMainView.m | 27 ++++++++++++++++++- .../AppRTCDemo/ios/ARDMainViewController.m | 12 +++++---- .../ios/ARDVideoCallViewController.h | 1 + .../ios/ARDVideoCallViewController.m | 4 ++- .../AppRTCDemo/mac/APPRTCViewController.m | 6 ++++- .../objc/AppRTCDemo/tests/ARDAppClientTest.mm | 12 +++++++-- .../Framework/Classes/RTCMediaConstraints.mm | 7 +++++ .../Headers/WebRTC/RTCMediaConstraints.h | 4 +++ 12 files changed, 92 insertions(+), 18 deletions(-) diff --git a/webrtc/examples/objc/AppRTCDemo/ARDAppClient+Internal.h b/webrtc/examples/objc/AppRTCDemo/ARDAppClient+Internal.h index cdcac966ae..4a69899364 100644 --- a/webrtc/examples/objc/AppRTCDemo/ARDAppClient+Internal.h +++ b/webrtc/examples/objc/AppRTCDemo/ARDAppClient+Internal.h @@ -45,6 +45,7 @@ @property(nonatomic, readonly) BOOL isAudioOnly; @property(nonatomic, readonly) BOOL shouldMakeAecDump; @property(nonatomic, assign) BOOL isAecDumpActive; +@property(nonatomic, readonly) BOOL shouldUseLevelControl; @property(nonatomic, strong) RTCMediaConstraints *defaultPeerConnectionConstraints; diff --git a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.h b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.h index 95e20d46a9..2186abe693 100644 --- a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.h +++ b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.h @@ -65,10 +65,13 @@ typedef NS_ENUM(NSInteger, ARDAppClientState) { // If |isLoopback| is true, the call will connect to itself. // If |isAudioOnly| is true, video will be disabled for the call. // If |shouldMakeAecDump| is true, an aecdump will be created for the call. +// If |shouldUseLevelControl| is true, the level controller will be used +// in the call. - (void)connectToRoomWithId:(NSString *)roomId isLoopback:(BOOL)isLoopback isAudioOnly:(BOOL)isAudioOnly - shouldMakeAecDump:(BOOL)shouldMakeAecDump; + shouldMakeAecDump:(BOOL)shouldMakeAecDump + shouldUseLevelControl:(BOOL)shouldUseLevelControl; // Disconnects from the AppRTC servers and any connected clients. - (void)disconnect; diff --git a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m index a9dd8b15fb..ea86c5ed48 100644 --- a/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m +++ b/webrtc/examples/objc/AppRTCDemo/ARDAppClient.m @@ -131,6 +131,7 @@ static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6; // 5 MB. @synthesize isAudioOnly = _isAudioOnly; @synthesize shouldMakeAecDump = _shouldMakeAecDump; @synthesize isAecDumpActive = _isAecDumpActive; +@synthesize shouldUseLevelControl = _shouldUseLevelControl; - (instancetype)init { if (self = [super init]) { @@ -223,12 +224,14 @@ static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6; // 5 MB. - (void)connectToRoomWithId:(NSString *)roomId isLoopback:(BOOL)isLoopback isAudioOnly:(BOOL)isAudioOnly - shouldMakeAecDump:(BOOL)shouldMakeAecDump { + shouldMakeAecDump:(BOOL)shouldMakeAecDump + shouldUseLevelControl:(BOOL)shouldUseLevelControl { NSParameterAssert(roomId.length); NSParameterAssert(_state == kARDAppClientStateDisconnected); _isLoopback = isLoopback; _isAudioOnly = isAudioOnly; _shouldMakeAecDump = shouldMakeAecDump; + _shouldUseLevelControl = shouldUseLevelControl; self.state = kARDAppClientStateConnecting; #if defined(WEBRTC_IOS) @@ -689,10 +692,13 @@ static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6; // 5 MB. } - (RTCRtpSender *)createAudioSender { + RTCMediaConstraints *constraints = [self defaultMediaAudioConstraints]; + RTCAudioSource *source = [_factory audioSourceWithConstraints:constraints]; + RTCAudioTrack *track = [_factory audioTrackWithSource:source + trackId:kARDAudioTrackId]; RTCRtpSender *sender = [_peerConnection senderWithKind:kRTCMediaStreamTrackKindAudio streamId:kARDMediaStreamId]; - RTCAudioTrack *track = [_factory audioTrackWithTrackId:kARDAudioTrackId]; sender.track = track; return sender; } @@ -744,6 +750,16 @@ static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6; // 5 MB. #pragma mark - Defaults + - (RTCMediaConstraints *)defaultMediaAudioConstraints { + NSString *valueLevelControl = _shouldUseLevelControl ? + kRTCMediaConstraintsValueTrue : kRTCMediaConstraintsValueFalse; + NSDictionary *mandatoryConstraints = @{ kRTCMediaConstraintsLevelControl : valueLevelControl }; + RTCMediaConstraints* constraints = + [[RTCMediaConstraints alloc] initWithMandatoryConstraints:mandatoryConstraints + optionalConstraints:nil]; + return constraints; +} + - (RTCMediaConstraints *)defaultMediaStreamConstraints { RTCMediaConstraints* constraints = [[RTCMediaConstraints alloc] diff --git a/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.h b/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.h index e9f4991d7c..81f9d007f6 100644 --- a/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.h +++ b/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.h @@ -15,11 +15,12 @@ @protocol ARDMainViewDelegate - (void)mainView:(ARDMainView *)mainView - didInputRoom:(NSString *)room - isLoopback:(BOOL)isLoopback - isAudioOnly:(BOOL)isAudioOnly - shouldMakeAecDump:(BOOL)shouldMakeAecDump - useManualAudio:(BOOL)useManualAudio; + didInputRoom:(NSString *)room + isLoopback:(BOOL)isLoopback + isAudioOnly:(BOOL)isAudioOnly + shouldMakeAecDump:(BOOL)shouldMakeAecDump + shouldUseLevelControl:(BOOL)shouldUseLevelControl + useManualAudio:(BOOL)useManualAudio; - (void)mainViewDidToggleAudioLoop:(ARDMainView *)mainView; diff --git a/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.m b/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.m index 59b428a303..d9522045ae 100644 --- a/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.m +++ b/webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.m @@ -121,6 +121,8 @@ static CGFloat const kCallControlMargin = 8; UILabel *_audioOnlyLabel; UISwitch *_aecdumpSwitch; UILabel *_aecdumpLabel; + UISwitch *_levelControlSwitch; + UILabel *_levelControlLabel; UISwitch *_loopbackSwitch; UILabel *_loopbackLabel; UISwitch *_useManualAudioSwitch; @@ -187,6 +189,17 @@ static CGFloat const kCallControlMargin = 8; [_aecdumpLabel sizeToFit]; [self addSubview:_aecdumpLabel]; + _levelControlSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; + [_levelControlSwitch sizeToFit]; + [self addSubview:_levelControlSwitch]; + + _levelControlLabel = [[UILabel alloc] initWithFrame:CGRectZero]; + _levelControlLabel.text = @"Use level controller"; + _levelControlLabel.font = controlFont; + _levelControlLabel.textColor = controlFontColor; + [_levelControlLabel sizeToFit]; + [self addSubview:_levelControlLabel]; + _useManualAudioSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; [_useManualAudioSwitch sizeToFit]; _useManualAudioSwitch.on = YES; @@ -299,9 +312,20 @@ static CGFloat const kCallControlMargin = 8; _aecdumpLabel.center = CGPointMake(aecdumpModeLabelCenterX, CGRectGetMidY(aecdumpModeRect)); + CGFloat levelControlModeTop = + CGRectGetMaxY(_aecdumpSwitch.frame) + kCallControlMargin; + CGRect levelControlModeRect = CGRectMake(kCallControlMargin * 3, + levelControlModeTop, + _levelControlSwitch.frame.size.width, + _levelControlSwitch.frame.size.height); + _levelControlSwitch.frame = levelControlModeRect; + CGFloat levelControlModeLabelCenterX = CGRectGetMaxX(levelControlModeRect) + + kCallControlMargin + _levelControlLabel.frame.size.width / 2; + _levelControlLabel.center = CGPointMake(levelControlModeLabelCenterX, + CGRectGetMidY(levelControlModeRect)); CGFloat useManualAudioTop = - CGRectGetMaxY(_aecdumpSwitch.frame) + kCallControlMargin; + CGRectGetMaxY(_levelControlSwitch.frame) + kCallControlMargin; CGRect useManualAudioRect = CGRectMake(kCallControlMargin * 3, useManualAudioTop, @@ -361,6 +385,7 @@ static CGFloat const kCallControlMargin = 8; isLoopback:_loopbackSwitch.isOn isAudioOnly:_audioOnlySwitch.isOn shouldMakeAecDump:_aecdumpSwitch.isOn + shouldUseLevelControl:_levelControlSwitch.isOn useManualAudio:_useManualAudioSwitch.isOn]; } diff --git a/webrtc/examples/objc/AppRTCDemo/ios/ARDMainViewController.m b/webrtc/examples/objc/AppRTCDemo/ios/ARDMainViewController.m index 21f00cb4c0..e392168dee 100644 --- a/webrtc/examples/objc/AppRTCDemo/ios/ARDMainViewController.m +++ b/webrtc/examples/objc/AppRTCDemo/ios/ARDMainViewController.m @@ -54,11 +54,12 @@ #pragma mark - ARDMainViewDelegate - (void)mainView:(ARDMainView *)mainView - didInputRoom:(NSString *)room - isLoopback:(BOOL)isLoopback - isAudioOnly:(BOOL)isAudioOnly - shouldMakeAecDump:(BOOL)shouldMakeAecDump - useManualAudio:(BOOL)useManualAudio { + didInputRoom:(NSString *)room + isLoopback:(BOOL)isLoopback + isAudioOnly:(BOOL)isAudioOnly + shouldMakeAecDump:(BOOL)shouldMakeAecDump + shouldUseLevelControl:(BOOL)shouldUseLevelControl + useManualAudio:(BOOL)useManualAudio { if (!room.length) { [self showAlertWithMessage:@"Missing room name."]; return; @@ -98,6 +99,7 @@ isLoopback:isLoopback isAudioOnly:isAudioOnly shouldMakeAecDump:shouldMakeAecDump + shouldUseLevelControl:shouldUseLevelControl delegate:self]; videoCallViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; diff --git a/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.h b/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.h index ffffd12ce8..3ca2dc2e9a 100644 --- a/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.h +++ b/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.h @@ -25,6 +25,7 @@ isLoopback:(BOOL)isLoopback isAudioOnly:(BOOL)isAudioOnly shouldMakeAecDump:(BOOL)shouldMakeAecDump + shouldUseLevelControl:(BOOL)shouldUseLevelControl delegate:(id)delegate; @end diff --git a/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.m b/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.m index bb49ca4a36..aa9ea2113d 100644 --- a/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.m +++ b/webrtc/examples/objc/AppRTCDemo/ios/ARDVideoCallViewController.m @@ -40,6 +40,7 @@ isLoopback:(BOOL)isLoopback isAudioOnly:(BOOL)isAudioOnly shouldMakeAecDump:(BOOL)shouldMakeAecDump + shouldUseLevelControl:(BOOL)shouldUseLevelControl delegate:(id)delegate { if (self = [super init]) { _delegate = delegate; @@ -47,7 +48,8 @@ [_client connectToRoomWithId:room isLoopback:isLoopback isAudioOnly:isAudioOnly - shouldMakeAecDump:shouldMakeAecDump]; + shouldMakeAecDump:shouldMakeAecDump + shouldUseLevelControl:shouldUseLevelControl]; } return self; } diff --git a/webrtc/examples/objc/AppRTCDemo/mac/APPRTCViewController.m b/webrtc/examples/objc/AppRTCDemo/mac/APPRTCViewController.m index 0f4a54e88e..0f5bc386d7 100644 --- a/webrtc/examples/objc/AppRTCDemo/mac/APPRTCViewController.m +++ b/webrtc/examples/objc/AppRTCDemo/mac/APPRTCViewController.m @@ -284,7 +284,11 @@ static NSUInteger const kLogViewHeight = 280; didEnterRoomId:(NSString*)roomId { [_client disconnect]; ARDAppClient *client = [[ARDAppClient alloc] initWithDelegate:self]; - [client connectToRoomWithId:roomId isLoopback:NO isAudioOnly:NO shouldMakeAecDump:NO]; + [client connectToRoomWithId:roomId + isLoopback:NO + isAudioOnly:NO + shouldMakeAecDump:NO + shouldUseLevelControl:NO]; _client = client; } diff --git a/webrtc/examples/objc/AppRTCDemo/tests/ARDAppClientTest.mm b/webrtc/examples/objc/AppRTCDemo/tests/ARDAppClientTest.mm index 355031e398..c1fc08ca8e 100644 --- a/webrtc/examples/objc/AppRTCDemo/tests/ARDAppClientTest.mm +++ b/webrtc/examples/objc/AppRTCDemo/tests/ARDAppClientTest.mm @@ -283,8 +283,16 @@ weakAnswerer = answerer; // Kick off connection. - [caller connectToRoomWithId:roomId isLoopback:NO isAudioOnly:NO shouldMakeAecDump:NO]; - [answerer connectToRoomWithId:roomId isLoopback:NO isAudioOnly:NO shouldMakeAecDump:NO]; + [caller connectToRoomWithId:roomId + isLoopback:NO + isAudioOnly:NO + shouldMakeAecDump:NO + shouldUseLevelControl:NO]; + [answerer connectToRoomWithId:roomId + isLoopback:NO + isAudioOnly:NO + shouldMakeAecDump:NO + shouldUseLevelControl:NO]; [self waitForExpectationsWithTimeout:20 handler:^(NSError *error) { if (error) { NSLog(@"Expectations error: %@", error); diff --git a/webrtc/sdk/objc/Framework/Classes/RTCMediaConstraints.mm b/webrtc/sdk/objc/Framework/Classes/RTCMediaConstraints.mm index f0f3c860b2..0a61f99e9e 100644 --- a/webrtc/sdk/objc/Framework/Classes/RTCMediaConstraints.mm +++ b/webrtc/sdk/objc/Framework/Classes/RTCMediaConstraints.mm @@ -30,6 +30,13 @@ NSString * const kRTCMediaConstraintsMinFrameRate = @(webrtc::MediaConstraintsInterface::kMinFrameRate); NSString * const kRTCMediaConstraintsMaxFrameRate = @(webrtc::MediaConstraintsInterface::kMaxFrameRate); +NSString * const kRTCMediaConstraintsLevelControl = + @(webrtc::MediaConstraintsInterface::kLevelControl); + +NSString * const kRTCMediaConstraintsValueTrue = + @(webrtc::MediaConstraintsInterface::kValueTrue); +NSString * const kRTCMediaConstraintsValueFalse = + @(webrtc::MediaConstraintsInterface::kValueFalse); namespace webrtc { diff --git a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h index 132e3f833b..b58fa3e74c 100644 --- a/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h +++ b/webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h @@ -22,6 +22,10 @@ RTC_EXTERN NSString * const kRTCMediaConstraintsMaxHeight; RTC_EXTERN NSString * const kRTCMediaConstraintsMinHeight; RTC_EXTERN NSString * const kRTCMediaConstraintsMaxFrameRate; RTC_EXTERN NSString * const kRTCMediaConstraintsMinFrameRate; +RTC_EXTERN NSString * const kRTCMediaConstraintsLevelControl; + +RTC_EXTERN NSString * const kRTCMediaConstraintsValueTrue; +RTC_EXTERN NSString * const kRTCMediaConstraintsValueFalse; RTC_EXPORT @interface RTCMediaConstraints : NSObject