wildmidi: cleanup error handler

This commit is contained in:
Wim Taymans 2009-08-31 18:41:59 +02:00
parent dd1b692561
commit d806622622

View file

@ -633,7 +633,7 @@ gst_wildmidi_get_buffer (GstWildmidi * wildmidi)
return gst_wildmidi_clip_buffer (wildmidi, buffer); return gst_wildmidi_clip_buffer (wildmidi, buffer);
} }
static gboolean static GstFlowReturn
gst_wildmidi_parse_song (GstWildmidi * wildmidi) gst_wildmidi_parse_song (GstWildmidi * wildmidi)
{ {
struct _WM_Info *info; struct _WM_Info *info;
@ -652,7 +652,7 @@ gst_wildmidi_parse_song (GstWildmidi * wildmidi)
if (!wildmidi->song) { if (!wildmidi->song) {
GST_ELEMENT_ERROR (wildmidi, STREAM, DECODE, (NULL), GST_ELEMENT_ERROR (wildmidi, STREAM, DECODE, (NULL),
("Unable to parse midi")); ("Unable to parse midi"));
return FALSE; return GST_FLOW_ERROR;
} }
WildMidi_LoadSamples (wildmidi->song); WildMidi_LoadSamples (wildmidi->song);
@ -677,7 +677,7 @@ gst_wildmidi_parse_song (GstWildmidi * wildmidi)
GST_DEBUG_OBJECT (wildmidi, "Parsing song done"); GST_DEBUG_OBJECT (wildmidi, "Parsing song done");
return TRUE; return GST_FLOW_OK;
} }
static GstFlowReturn static GstFlowReturn
@ -783,7 +783,7 @@ gst_wildmidi_loop (GstPad * sinkpad)
} else if (ret != GST_FLOW_OK) { } else if (ret != GST_FLOW_OK) {
GST_ELEMENT_ERROR (wildmidi, STREAM, DECODE, (NULL), GST_ELEMENT_ERROR (wildmidi, STREAM, DECODE, (NULL),
("Unable to load song")); ("Unable to load song"));
goto paused; goto pause;
} else { } else {
GST_DEBUG_OBJECT (wildmidi, "pushing buffer"); GST_DEBUG_OBJECT (wildmidi, "pushing buffer");
gst_adapter_push (wildmidi->adapter, buffer); gst_adapter_push (wildmidi->adapter, buffer);
@ -794,35 +794,45 @@ gst_wildmidi_loop (GstPad * sinkpad)
case GST_WILDMIDI_STATE_PARSE: case GST_WILDMIDI_STATE_PARSE:
{ {
if (!wildmidi->song) { if (!wildmidi->song) {
if (!gst_wildmidi_parse_song (wildmidi)) ret = gst_wildmidi_parse_song (wildmidi);
goto paused; if (ret != GST_FLOW_OK)
goto pause;
} }
wildmidi->state = GST_WILDMIDI_STATE_PLAY; wildmidi->state = GST_WILDMIDI_STATE_PLAY;
break; break;
} }
case GST_WILDMIDI_STATE_PLAY: case GST_WILDMIDI_STATE_PLAY:
ret = gst_wildmidi_do_play (wildmidi); ret = gst_wildmidi_do_play (wildmidi);
if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) if (ret != GST_FLOW_OK)
goto error; goto pause;
break; break;
default: default:
break; break;
} }
return; return;
paused: pause:
{ {
GST_DEBUG_OBJECT (wildmidi, "pausing task"); const gchar *reason = gst_flow_get_name (ret);
gst_pad_pause_task (wildmidi->sinkpad); GstEvent *event;
return;
} GST_DEBUG_OBJECT (wildmidi, "pausing task, reason %s", reason);
error: gst_pad_pause_task (sinkpad);
{ if (GST_FLOW_IS_FATAL (ret) || ret == GST_FLOW_NOT_LINKED) {
GST_ELEMENT_ERROR (wildmidi, STREAM, FAILED, if (ret == GST_FLOW_UNEXPECTED) {
("Internal data stream error"), /* perform EOS logic */
("Streaming stopped, reason %s", gst_flow_get_name (ret))); event = gst_event_new_eos ();
gst_pad_push_event (wildmidi->srcpad, gst_event_new_eos ()); gst_pad_push_event (wildmidi->srcpad, event);
goto paused; } else {
event = gst_event_new_eos ();
/* for fatal errors we post an error message, post the error
* first so the app knows about the error first. */
GST_ELEMENT_ERROR (wildmidi, STREAM, FAILED,
("Internal data flow error."),
("streaming task paused, reason %s (%d)", reason, ret));
gst_pad_push_event (wildmidi->srcpad, event);
}
}
} }
} }