controlMediaHost function
Controls media actions based on the specified ControlMediaHostOptions.
This function manages media control actions (such as disabling audio, video, or screenshare)
for the host in a meeting or room. It performs actions based on the provided type and
updates the relevant media states through callbacks in ControlMediaHostParameters.
optionsdefines the media action type and the parameters needed for the function:type: Specifies the media type to control, which can be'audio','video','screenshare','chat', or'all'.parameters: Contains the callbacks and media streams to manage each media action, such as disconnecting transports, updating local streams, and stopping screenshare.
Function Actions
- If
typeis'audio', disables audio in the local stream and disconnects the audio transport. - If
typeis'video', disables video in the local and video streams, and disconnects the video transport. - If
typeis'screenshare', stops the screenshare stream and disconnects the screenshare transport. - If
typeis'chat', updates the chat state to be inactive. - If
typeis'all', performs all media actions: disables audio, video, and screenshare, and disconnects each transport.
Example Usage:
final options = ControlMediaHostOptions(
type: 'video',
parameters: ControlMediaHostParameters(
updateAdminRestrictSetting: (value) => print('Admin restriction set to: $value'),
localStream: MediaStream(),
updateLocalStream: (stream) => print('Local stream updated: $stream'),
updateAudioAlreadyOn: (value) => print('Audio already on updated: $value'),
localStreamScreen: MediaStream(),
updateLocalStreamScreen: (stream) => print('Local screen stream updated: $stream'),
localStreamVideo: MediaStream(),
updateLocalStreamVideo: (stream) => print('Local video stream updated: $stream'),
updateScreenAlreadyOn: (value) => print('Screen already on updated: $value'),
updateVideoAlreadyOn: (value) => print('Video already on updated: $value'),
updateChatAlreadyOn: (value) => print('Chat already on updated: $value'),
onScreenChanges: (isOn) async => print('Screen changes: $isOn'),
stopShareScreen: () async => print('Screenshare stopped'),
disconnectSendTransportVideo: () async => print('Video transport disconnected'),
disconnectSendTransportAudio: () async => print('Audio transport disconnected'),
disconnectSendTransportScreen: () async => print('Screen transport disconnected'),
),
);
await controlMediaHost(options);
In this example:
- The
typeis set to'video', so the function disables video in the local stream and disconnects the video transport. - Callbacks are provided for each media action, printing updates to the console as the function progresses through the control actions.
Implementation
Future<void> controlMediaHost(ControlMediaHostOptions options) async {
final params = options.parameters.getUpdatedAllParams();
params.updateAdminRestrictSetting(true);
try {
switch (options.type) {
case 'audio':
params.localStream?.getAudioTracks().first.enabled = false;
params.updateLocalStream(params.localStream);
final optionsDisconnect = DisconnectSendTransportAudioOptions(
parameters: params,
);
await params.disconnectSendTransportAudio(optionsDisconnect);
params.updateAudioAlreadyOn(false);
break;
case 'video':
params.localStream?.getVideoTracks().first.enabled = false;
params.updateLocalStream(params.localStream);
final optionsDisconnect = DisconnectSendTransportVideoOptions(
parameters: params,
);
await params.disconnectSendTransportVideo(optionsDisconnect);
final optionsOnScreen = OnScreenChangesOptions(
changed: true,
parameters: params,
);
await params.onScreenChanges(optionsOnScreen);
params.updateVideoAlreadyOn(false);
params.localStreamVideo?.getVideoTracks().first.enabled = false;
params.updateLocalStreamVideo(params.localStreamVideo);
await params.disconnectSendTransportVideo(optionsDisconnect);
await params.onScreenChanges(optionsOnScreen);
params.updateVideoAlreadyOn(false);
break;
case 'screenshare':
params.localStreamScreen?.getVideoTracks().first.enabled = false;
params.updateLocalStreamScreen(params.localStreamScreen);
final optionsDisconnect = DisconnectSendTransportScreenOptions(
parameters: params,
);
await params.disconnectSendTransportScreen(optionsDisconnect);
final optionsStopShare = StopShareScreenOptions(
parameters: params,
);
await params.stopShareScreen(optionsStopShare);
params.updateScreenAlreadyOn(false);
break;
case 'chat':
params.updateChatAlreadyOn(false);
break;
case 'all':
try {
params.localStream?.getAudioTracks().first.enabled = false;
params.updateLocalStream(params.localStream);
final optionsDisconnect = DisconnectSendTransportAudioOptions(
parameters: params,
);
await params.disconnectSendTransportAudio(optionsDisconnect);
params.updateAudioAlreadyOn(false);
} catch (error) {
if (kDebugMode) print('Error controlling audio: $error');
}
try {
params.localStreamScreen?.getVideoTracks().first.enabled = false;
params.updateLocalStreamScreen(params.localStreamScreen);
final optionsDisconnect = DisconnectSendTransportScreenOptions(
parameters: params,
);
await params.disconnectSendTransportScreen(optionsDisconnect);
final optionsStopShare = StopShareScreenOptions(
parameters: params,
);
await params.stopShareScreen(optionsStopShare);
params.updateScreenAlreadyOn(false);
} catch (error) {
if (kDebugMode) print('Error controlling screenshare: $error');
}
try {
params.localStream?.getVideoTracks().first.enabled = false;
params.updateLocalStream(params.localStream);
final optionsDisconnect = DisconnectSendTransportVideoOptions(
parameters: params,
);
await params.disconnectSendTransportVideo(optionsDisconnect);
final optionsOnScreen = OnScreenChangesOptions(
changed: true,
parameters: params,
);
await params.onScreenChanges(optionsOnScreen);
params.updateVideoAlreadyOn(false);
params.localStreamVideo?.getVideoTracks().first.enabled = false;
params.updateLocalStreamVideo(params.localStreamVideo);
await params.disconnectSendTransportVideo(optionsDisconnect);
await params.onScreenChanges(optionsOnScreen);
params.updateVideoAlreadyOn(false);
} catch (error) {
if (kDebugMode) print('Error controlling video: $error');
}
break;
default:
throw ArgumentError('Invalid media control type');
}
} catch (error) {
if (kDebugMode) print('Error in controlMediaHost: $error');
}
}