GemCameraPlayerController constructor
- required DataSource dataSource,
- CameraConfiguration? configurationOverride,
Creates a camera player controller from a data source.
Initializes the controller with loading status and validates that the dataSource
supports camera data (sets error status if not). Automatically registers a
DataSourceListener to receive camera frames and playback status changes.
Updates status to ended if playback is already stopped.
Parameters
dataSource: The DataSource providing camera frame data (must support DataType.camera)configurationOverride: Optional CameraConfiguration to override frame width/height
Implementation
GemCameraPlayerController({
required DataSource dataSource,
this.configurationOverride,
}) : super(
GemCameraPlayerValue(
dataSource: dataSource,
status: GemCameraPlayerStatus.loading,
),
) {
if (!dataSource.isDataTypeAvailable(DataType.camera)) {
value = value.copyWith(status: GemCameraPlayerStatus.error);
}
final DataSourceListener listener = DataSourceListener(
onNewData: (SenseData data) {
if (_isDisposed) {
return;
}
if (data is! CameraImpl) {
return;
}
final GemCameraPlayerStatus status = value.status;
if (status == GemCameraPlayerStatus.loading ||
status == GemCameraPlayerStatus.playing ||
status == GemCameraPlayerStatus.ended) {
value = value.copyWith(
camera: data,
status: GemCameraPlayerStatus.playing,
);
}
},
onPlayingStatusChanged: (DataType dataType, PlayingStatus status) {
if (_isDisposed) {
return;
}
if (dataType == DataType.camera && status == PlayingStatus.stopped) {
value = value.copyWith(status: GemCameraPlayerStatus.ended);
}
},
);
final Playback? playback = dataSource.playback;
if (playback != null && playback.state == PlayingStatus.stopped) {
value = value.copyWith(status: GemCameraPlayerStatus.ended);
}
dataSource.addListener(listener: listener, dataType: DataType.camera);
value = value.copyWith(listener: listener);
}