8000 Merge pull request #129 from LinusU/torch · radiocom/flutter-webrtc@93477f1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 93477f1

Browse files
authored
Merge pull request flutter-webrtc#129 from LinusU/torch
Add method for setting torch state
2 parents 41f7ab2 + 66f91b4 commit 93477f1

File tree

4 files changed

+96
-0
lines changed

4 files changed

+96
-0
lines changed

ios/Classes/FlutterRTCMediaStream.h

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

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

14+
-(void)mediaStreamTrackHasTorch:(RTCMediaStreamTrack *)track
15+
result:(FlutterResult) result;
16+
17+
-(void)mediaStreamTrackSetTorch:(RTCMediaStreamTrack *)track
18+
torch:(BOOL) torch
19+
result:(FlutterResult) result;
20+
1421
-(void)mediaStreamTrackSwitchCamera:(RTCMediaStreamTrack *)track
1522
result:(FlutterResult) result;
1623

ios/Classes/FlutterRTCMediaStream.m

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

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

ios/Classes/FlutterWebRTCPlugin.m

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,35 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult) result
353353
[self setStreamId:streamId view:render];
354354
}
355355
result(nil);
356+
}else if ([@"mediaStreamTrackHasTorch" isEqualToString:call.method]) {
357+
NSDictionary* argsMap = call.arguments;
358+
NSString* trackId = argsMap[@"tra 8000 ckId"];
359+
RTCMediaStreamTrack *track = self.localTracks[trackId];
360+
if (track != nil && [track isKindOfClass:[RTCVideoTrack class]]) {
361+
RTCVideoTrack *videoTrack = (RTCVideoTrack *)track;
362+
[self mediaStreamTrackHasTorch:videoTrack result:result];
363+
} else {
364+
if (track == nil) {
365+
result([FlutterError errorWithCode:@"Track is nil" message:nil details:nil]);
366+
} else {
367+
result([FlutterError errorWithCode:[@"Track is class of " stringByAppendingString:[[track class] description]] message:nil details:nil]);
368+
}
369+
}
370+
}else if ([@"mediaStreamTrackSetTorch" isEqualToString:call.method]) {
371+
NSDictionary* argsMap = call.arguments;
372+
NSString* trackId = argsMap[@"trackId"];
373+
BOOL torch = [argsMap[@"torch"] boolValue];
374+
RTCMediaStreamTrack *track = self.localTracks[trackId];
375+
if (track != nil && [track isKindOfClass:[RTCVideoTrack class]]) {
376+
RTCVideoTrack *videoTrack = (RTCVideoTrack *)track;
377+
[self mediaStreamTrackSetTorch:videoTrack torch:torch result:result];
378+
} else {
379+
if (track == nil) {
380+
result([FlutterError errorWithCode:@"Track is nil" message:nil details:nil]);
381+
} else {
382+
result([FlutterError errorWithCode:[@"Track is class of " stringByAppendingString:[[track class] description]] message:nil details:nil]);
383+
}
384+
}
356385
}else if ([@"mediaStreamTrackSwitchCamera" isEqualToString:call.method]){
357386
NSDictionary* argsMap = call.arguments;
358387
NSString* trackId = argsMap[@"trackId"];

lib/media_stream_track.dart

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

26+
Future<bool> hasTorch() =>
27+
_channel.invokeMethod(
28+
'mediaStreamTrackHasTorch',
29+
<String, dynamic>{'trackId': _trackId},
30+
);
31+
32+
Future<void> setTorch(bool torch) =>
33+
_channel.invokeMethod(
34+
'mediaStreamTrackSetTorch',
35+
<String, dynamic>{'trackId': _trackId, 'torch': torch},
36+
);
37+
2638
///Future contains isFrontCamera
2739
///Throws error if switching camera failed
2840
Future<bool> switchCamera() =>

0 commit comments

Comments
 (0)
0