Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: webrtc/examples/objc/AppRTCDemo/ios/ARDMainView.m

Issue 1710053004: Add looping sound button to AppRTCDemo (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Back to rtc_base Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/examples/objc/AppRTCDemo/ios/resources/mozart.mp3 » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #import "ARDMainView.h" 11 #import "ARDMainView.h"
12 12
13 #import <AVFoundation/AVFoundation.h>
14
13 #import "UIImage+ARDUtilities.h" 15 #import "UIImage+ARDUtilities.h"
14 16
15 // TODO(tkchin): retrieve status bar height dynamically. 17 // TODO(tkchin): retrieve status bar height dynamically.
16 static CGFloat const kStatusBarHeight = 20; 18 static CGFloat const kStatusBarHeight = 20;
17 19
18 static CGFloat const kRoomTextButtonSize = 40; 20 static CGFloat const kRoomTextButtonSize = 40;
19 static CGFloat const kRoomTextFieldHeight = 40; 21 static CGFloat const kRoomTextFieldHeight = 40;
20 static CGFloat const kRoomTextFieldMargin = 8; 22 static CGFloat const kRoomTextFieldMargin = 8;
21 static CGFloat const kCallControlMargin = 8; 23 static CGFloat const kCallControlMargin = 8;
22 static CGFloat const kAppLabelHeight = 20; 24 static CGFloat const kAppLabelHeight = 20;
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 118
117 @implementation ARDMainView { 119 @implementation ARDMainView {
118 UILabel *_appLabel; 120 UILabel *_appLabel;
119 ARDRoomTextField *_roomText; 121 ARDRoomTextField *_roomText;
120 UILabel *_callOptionsLabel; 122 UILabel *_callOptionsLabel;
121 UISwitch *_audioOnlySwitch; 123 UISwitch *_audioOnlySwitch;
122 UILabel *_audioOnlyLabel; 124 UILabel *_audioOnlyLabel;
123 UISwitch *_loopbackSwitch; 125 UISwitch *_loopbackSwitch;
124 UILabel *_loopbackLabel; 126 UILabel *_loopbackLabel;
125 UIButton *_startCallButton; 127 UIButton *_startCallButton;
128 UIButton *_audioLoopButton;
129 AVAudioPlayer *_audioPlayer;
126 } 130 }
127 131
128 @synthesize delegate = _delegate; 132 @synthesize delegate = _delegate;
129 133
130 - (instancetype)initWithFrame:(CGRect)frame { 134 - (instancetype)initWithFrame:(CGRect)frame {
131 if (self = [super initWithFrame:frame]) { 135 if (self = [super initWithFrame:frame]) {
136 NSString *audioFilePath =
137 [[NSBundle mainBundle] pathForResource:@"mozart" ofType:@"mp3"];
138 NSURL *audioFileURL = [NSURL URLWithString:audioFilePath];
139 _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL
140 error:nil];
141 _audioPlayer.numberOfLoops = -1;
142 _audioPlayer.volume = 1.0;
143 [_audioPlayer prepareToPlay];
144
132 _appLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 145 _appLabel = [[UILabel alloc] initWithFrame:CGRectZero];
133 _appLabel.text = @"AppRTCDemo"; 146 _appLabel.text = @"AppRTCDemo";
134 _appLabel.font = [UIFont fontWithName:@"Roboto" size:34]; 147 _appLabel.font = [UIFont fontWithName:@"Roboto" size:34];
135 _appLabel.textColor = [UIColor colorWithWhite:0 alpha:.2]; 148 _appLabel.textColor = [UIColor colorWithWhite:0 alpha:.2];
136 [_appLabel sizeToFit]; 149 [_appLabel sizeToFit];
137 [self addSubview:_appLabel]; 150 [self addSubview:_appLabel];
138 151
139 _roomText = [[ARDRoomTextField alloc] initWithFrame:CGRectZero]; 152 _roomText = [[ARDRoomTextField alloc] initWithFrame:CGRectZero];
140 [self addSubview:_roomText]; 153 [self addSubview:_roomText];
141 154
(...skipping 22 matching lines...) Expand all
164 [_loopbackSwitch sizeToFit]; 177 [_loopbackSwitch sizeToFit];
165 [self addSubview:_loopbackSwitch]; 178 [self addSubview:_loopbackSwitch];
166 179
167 _loopbackLabel = [[UILabel alloc] initWithFrame:CGRectZero]; 180 _loopbackLabel = [[UILabel alloc] initWithFrame:CGRectZero];
168 _loopbackLabel.text = @"Loopback mode"; 181 _loopbackLabel.text = @"Loopback mode";
169 _loopbackLabel.font = controlFont; 182 _loopbackLabel.font = controlFont;
170 _loopbackLabel.textColor = controlFontColor; 183 _loopbackLabel.textColor = controlFontColor;
171 [_loopbackLabel sizeToFit]; 184 [_loopbackLabel sizeToFit];
172 [self addSubview:_loopbackLabel]; 185 [self addSubview:_loopbackLabel];
173 186
174 _startCallButton = [[UIButton alloc] initWithFrame:CGRectZero];
175
176 _startCallButton = [UIButton buttonWithType:UIButtonTypeSystem]; 187 _startCallButton = [UIButton buttonWithType:UIButtonTypeSystem];
177 _startCallButton.backgroundColor = [UIColor blueColor]; 188 _startCallButton.backgroundColor = [UIColor blueColor];
178 _startCallButton.layer.cornerRadius = 10; 189 _startCallButton.layer.cornerRadius = 10;
179 _startCallButton.clipsToBounds = YES; 190 _startCallButton.clipsToBounds = YES;
180 _startCallButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10); 191 _startCallButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10);
181 [_startCallButton setTitle:@"Start call" 192 [_startCallButton setTitle:@"Start call"
182 forState:UIControlStateNormal]; 193 forState:UIControlStateNormal];
183 _startCallButton.titleLabel.font = controlFont; 194 _startCallButton.titleLabel.font = controlFont;
184 [_startCallButton setTitleColor:[UIColor whiteColor] 195 [_startCallButton setTitleColor:[UIColor whiteColor]
185 forState:UIControlStateNormal]; 196 forState:UIControlStateNormal];
186 [_startCallButton setTitleColor:[UIColor lightGrayColor] 197 [_startCallButton setTitleColor:[UIColor lightGrayColor]
187 forState:UIControlStateSelected]; 198 forState:UIControlStateSelected];
188 [_startCallButton sizeToFit]; 199 [_startCallButton sizeToFit];
189 [_startCallButton addTarget:self 200 [_startCallButton addTarget:self
190 action:@selector(onStartCall:) 201 action:@selector(onStartCall:)
191 forControlEvents:UIControlEventTouchUpInside]; 202 forControlEvents:UIControlEventTouchUpInside];
192 [self addSubview:_startCallButton]; 203 [self addSubview:_startCallButton];
193 204
205 // Used to test what happens to sounds when calls are in progress.
206 _audioLoopButton = [UIButton buttonWithType:UIButtonTypeSystem];
207 _audioLoopButton.layer.cornerRadius = 10;
208 _audioLoopButton.clipsToBounds = YES;
209 _audioLoopButton.contentEdgeInsets = UIEdgeInsetsMake(5, 10, 5, 10);
210 _audioLoopButton.titleLabel.font = controlFont;
211 [_audioLoopButton setTitleColor:[UIColor whiteColor]
212 forState:UIControlStateNormal];
213 [_audioLoopButton setTitleColor:[UIColor lightGrayColor]
214 forState:UIControlStateSelected];
215 [self updateAudioLoopButton];
216 [_audioLoopButton addTarget:self
217 action:@selector(onToggleAudioLoop:)
218 forControlEvents:UIControlEventTouchUpInside];
219 [self addSubview:_audioLoopButton];
220
194 self.backgroundColor = [UIColor whiteColor]; 221 self.backgroundColor = [UIColor whiteColor];
195 } 222 }
196 return self; 223 return self;
197 } 224 }
198 225
199 - (void)layoutSubviews { 226 - (void)layoutSubviews {
200 CGRect bounds = self.bounds; 227 CGRect bounds = self.bounds;
201 CGFloat roomTextWidth = bounds.size.width - 2 * kRoomTextFieldMargin; 228 CGFloat roomTextWidth = bounds.size.width - 2 * kRoomTextFieldMargin;
202 CGFloat roomTextHeight = [_roomText sizeThatFits:bounds.size].height; 229 CGFloat roomTextHeight = [_roomText sizeThatFits:bounds.size].height;
203 _roomText.frame = CGRectMake(kRoomTextFieldMargin, 230 _roomText.frame = CGRectMake(kRoomTextFieldMargin,
(...skipping 26 matching lines...) Expand all
230 CGRect loopbackModeRect = CGRectMake(kCallControlMargin * 3, 257 CGRect loopbackModeRect = CGRectMake(kCallControlMargin * 3,
231 loopbackModeTop, 258 loopbackModeTop,
232 _loopbackSwitch.frame.size.width, 259 _loopbackSwitch.frame.size.width,
233 _loopbackSwitch.frame.size.height); 260 _loopbackSwitch.frame.size.height);
234 _loopbackSwitch.frame = loopbackModeRect; 261 _loopbackSwitch.frame = loopbackModeRect;
235 CGFloat loopbackModeLabelCenterX = CGRectGetMaxX(loopbackModeRect) + 262 CGFloat loopbackModeLabelCenterX = CGRectGetMaxX(loopbackModeRect) +
236 kCallControlMargin + _loopbackLabel.frame.size.width / 2; 263 kCallControlMargin + _loopbackLabel.frame.size.width / 2;
237 _loopbackLabel.center = CGPointMake(loopbackModeLabelCenterX, 264 _loopbackLabel.center = CGPointMake(loopbackModeLabelCenterX,
238 CGRectGetMidY(loopbackModeRect)); 265 CGRectGetMidY(loopbackModeRect));
239 266
267 CGFloat audioLoopTop =
268 CGRectGetMaxY(loopbackModeRect) + kCallControlMargin * 3;
269 _audioLoopButton.frame = CGRectMake(kCallControlMargin,
270 audioLoopTop,
271 _audioLoopButton.frame.size.width,
272 _audioLoopButton.frame.size.height);
273
240 CGFloat startCallTop = 274 CGFloat startCallTop =
241 CGRectGetMaxY(loopbackModeRect) + kCallControlMargin * 3; 275 CGRectGetMaxY(_audioLoopButton.frame) + kCallControlMargin * 3;
242 _startCallButton.frame = CGRectMake(kCallControlMargin, 276 _startCallButton.frame = CGRectMake(kCallControlMargin,
243 startCallTop, 277 startCallTop,
244 _startCallButton.frame.size.width, 278 _startCallButton.frame.size.width,
245 _startCallButton.frame.size.height); 279 _startCallButton.frame.size.height);
246 } 280 }
247 281
248 #pragma mark - Private 282 #pragma mark - Private
249 283
284 - (void)updateAudioLoopButton {
285 if (_audioPlayer.playing) {
286 _audioLoopButton.backgroundColor = [UIColor redColor];
287 [_audioLoopButton setTitle:@"Stop sound"
288 forState:UIControlStateNormal];
289 [_audioLoopButton sizeToFit];
290 } else {
291 _audioLoopButton.backgroundColor = [UIColor greenColor];
292 [_audioLoopButton setTitle:@"Play sound"
293 forState:UIControlStateNormal];
294 [_audioLoopButton sizeToFit];
295 }
296 }
297
298 - (void)onToggleAudioLoop:(id)sender {
299 if (_audioPlayer.playing) {
300 [_audioPlayer stop];
301 } else {
302 [_audioPlayer play];
303 }
304 [self updateAudioLoopButton];
305 }
306
250 - (void)onStartCall:(id)sender { 307 - (void)onStartCall:(id)sender {
251 NSString *room = _roomText.roomText; 308 NSString *room = _roomText.roomText;
252 // If this is a loopback call, allow a generated room name. 309 // If this is a loopback call, allow a generated room name.
253 if (!room.length && _loopbackSwitch.isOn) { 310 if (!room.length && _loopbackSwitch.isOn) {
254 room = [[NSUUID UUID] UUIDString]; 311 room = [[NSUUID UUID] UUIDString];
255 } 312 }
256 room = [room stringByReplacingOccurrencesOfString:@"-" withString:@""]; 313 room = [room stringByReplacingOccurrencesOfString:@"-" withString:@""];
257 [_delegate mainView:self 314 [_delegate mainView:self
258 didInputRoom:room 315 didInputRoom:room
259 isLoopback:_loopbackSwitch.isOn 316 isLoopback:_loopbackSwitch.isOn
260 isAudioOnly:_audioOnlySwitch.isOn]; 317 isAudioOnly:_audioOnlySwitch.isOn];
261 } 318 }
262 319
263 @end 320 @end
OLDNEW
« no previous file with comments | « no previous file | webrtc/examples/objc/AppRTCDemo/ios/resources/mozart.mp3 » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698