8000 Add method for setting torch state · model-lib/flutter-webrtc@5fea834 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5fea834

Browse files
committed
Add method for setting torch state
1 parent 41f7ab2 commit 5fea834

File tree

4 files changed

+56
-0
lines changed

4 files changed

+56
-0
lines changed

ios/Classes/FlutterRTCMediaStream.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111

1212
-(void)getSources:(FlutterResult)result;
1313

14+
-(void)mediaStreamTrackSetTorch:(RTCMediaStreamTrack *)track
15+
torch:(BOOL) torch
16+
result:(FlutterResult) result;
17+
1418
-(void)mediaStreamTrackSwitchCamera:(RTCMediaStreamTrack *)track
1519
result:(FlutterResult) result;
1620

ios/Classes/FlutterRTCMediaStream.m

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,37 @@ -(void)mediaStreamTrackSetEnabled:(RTCMediaStreamTrack *)track : (BOOL)enabled
474474
}
475475
}
476476

477+
-(void)mediaStreamTrackSetTorch:(RTCMediaStreamTrack *)track torch:(BOOL)torch result:(FlutterResult)result
478+
{
479+
if (!self.videoCapturer) {
480+
NSLog(@"Video capturer is null. Can't set torch");
481+
return;
482+
}
483+
if (self.videoCapturer.captureSession.inputs.count == 0) {
484+
NSLog(@"Video capturer is missing an input. Can't set torch");
485+
return;
486+
}
487+
488+
AVCaptureDeviceInput *deviceInput = [self.videoCapturer.captureSession.inputs objectAtIndex:0];
489+
AVCaptureDevice *device = deviceInput.device;
490+
491+
if (![device isTorchModeSupported:AVCaptureTorchModeOn]) {
492+
NSLog(@"Current capture device does not support torch. Can't set torch");
493+
return;
494+
}
495+
496+
NSError *error;
497+
if ([device lockForConfiguration:&error] == NO) {
498+
NSLog(@"Failed to aquire configuration lock. %@", error.localizedDescription);
499+
return;
500+
}
501+
502+
device.torchMode = torch ? AVCaptureTorchModeOn : AVCaptureTorchModeOff;
503+
[device unlockForConfiguration];
504+
505+
result(nil);
506+
}
507+
477508
-(void)mediaStreamTrackSwitchCamera:(RTCMediaStreamTrack *)track result:(FlutterResult)result
478509
{
479510
if (!self.videoCapturer) {

ios/Classes/FlutterWebRTCPlugin.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,21 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
353353
[self setStreamId:streamId view:render];
354354
}
355355
result(nil);
356+
}else if ([@"mediaStreamTrackSetTorch" isEqualToString:call.method]) {
357+
NSDictionary* argsMap = call.arguments;
358+
NSString* trackId = argsMap[@"trackId"];
359+
BOOL torch = [argsMap[@"torch"] boolValue];
360+
RTCMediaStreamTrack *track = self.localTracks[trackId];
361+
if (track != nil && [track isKindOfClass:[RTCVideoTrack class]]) {
362+
RTCVideoTrack *videoTrack = (RTCVideoTrack *)track;
363+
[self mediaStreamTrackSetTorch:videoTrack torch:torch result:result];
364+
} else {
365+
if (track == nil) {
366+
result([FlutterError errorWithCode:@"Track is nil" message:nil details:nil]);
367+
} else {
368+
result([FlutterError errorWithCode:[@"Track is class of " stringByAppendingString:[[track class] description]] message:nil details:nil]);
369+
}
370+
}
356371
}else if ([@"mediaStreamTrackSwitchCamera" isEqualToString:call.method]){
357372
NSDictionary* argsMap = call.arguments;
358373
NSString* trackId = argsMap[@"trackId"];

lib/media_stream_track.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ class MediaStreamTrack {
2323
String get kind => _kind;
2424
String get id => _trackId;
2525

26+
Future<void> setTorch(bool torch) =>
27+
_channel.invokeMethod(
28+
'mediaStreamTrackSetTorch',
29+
<String, dynamic>{'trackId': _trackId, 'torch': torch},
30+
);
31+
2632
///Future contains isFrontCamera
2733
///Throws error if switching camera failed
2834
Future<bool> switchCamera() =>

0 commit comments

Comments
 (0)
0