screencastService: Handle more gstreamer errors

Gstreamer can produce various errors, we shouldn't pretend those don't
exist and go on as usual when one happens. Instead, when an error
happens, tear down the pipeline, set our PipelineState to the new ERROR
state and bail out with a proper error message.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2197>
This commit is contained in:
Jonas Dreßler 2022-01-29 00:40:24 +01:00
parent cbfbdc4be5
commit 42af7e53a2

View File

@ -231,12 +231,26 @@ var Recorder = class {
_onBusMessage(bus, message, _) {
switch (message.type) {
case Gst.MessageType.EOS:
this._teardownPipeline();
switch (this._pipelineState) {
case PipelineState.STOPPED:
case PipelineState.ERROR:
// In these cases there should be no pipeline, so should never happen
break;
case PipelineState.PLAYING:
this._addRecentItem();
this._handleFatalPipelineError('Unexpected EOS message');
break;
case PipelineState.INIT:
this._handleFatalPipelineError(
'Unexpected EOS message while in state INIT');
break;
case PipelineState.FLUSHING:
this._addRecentItem();
this._teardownPipeline();
this._unwatchSender();
this._stopSession();
@ -248,6 +262,28 @@ var Recorder = class {
}
break;
case Gst.MessageType.ERROR:
switch (this._pipelineState) {
case PipelineState.STOPPED:
case PipelineState.ERROR:
// In these cases there should be no pipeline, so should never happen
break;
case PipelineState.INIT:
case PipelineState.PLAYING:
case PipelineState.FLUSHING:
// Everything else we can't handle, so error out
this._handleFatalPipelineError(
`GStreamer error while in state ${this._pipelineState}: ${message.parse_error()[0].message}`);
break;
default:
break;
}
break;
default:
break;
}