controlMediaHost function
- ControlMediaHostOptions options
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
.
options
defines 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
type
is'audio'
, disables audio in the local stream and disconnects the audio transport. - If
type
is'video'
, disables video in the local and video streams, and disconnects the video transport. - If
type
is'screenshare'
, stops the screenshare stream and disconnects the screenshare transport. - If
type
is'chat'
, updates the chat state to be inactive. - If
type
is'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
type
is 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');
}
}