From 2dd264d5334366f42b66e1f9e7f5ab247fdbf886 Mon Sep 17 00:00:00 2001 From: "Joshua M. Doe" Date: Mon, 16 Jul 2012 01:12:44 -0400 Subject: [PATCH] niimaqsrc: cleanup after stopping, and better error handling --- sys/niimaq/gstniimaq.c | 68 ++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/sys/niimaq/gstniimaq.c b/sys/niimaq/gstniimaq.c index 40193bb..bd9a7c9 100644 --- a/sys/niimaq/gstniimaq.c +++ b/sys/niimaq/gstniimaq.c @@ -99,7 +99,7 @@ static GstFlowReturn gst_niimaqsrc_create (GstPushSrc * psrc, /* GstNiImaq methods */ static GstCaps *gst_niimaqsrc_get_cam_caps (GstNiImaqSrc * src); -static void gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc); +static gboolean gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc); uInt32 gst_niimaqsrc_report_imaq_error (uInt32 code) @@ -1033,53 +1033,61 @@ gst_niimaqsrc_stop (GstBaseSrc * src) { GstNiImaqSrc *niimaqsrc = GST_NIIMAQSRC (src); Int32 rval; + gboolean result = TRUE; /* stop IMAQ session */ if (niimaqsrc->session_started) { rval = imgSessionStopAcquisition (niimaqsrc->sid); - if (rval) { + if (rval != IMG_ERR_GOOD) { gst_niimaqsrc_report_imaq_error (rval); GST_ELEMENT_ERROR (niimaqsrc, RESOURCE, FAILED, ("Unable to stop acquisition"), ("Unable to stop acquisition")); + result = FALSE; } niimaqsrc->session_started = FALSE; GST_DEBUG_OBJECT (niimaqsrc, "Acquisition stopped"); } - gst_niimaqsrc_close_interface (niimaqsrc); + result &= gst_niimaqsrc_close_interface (niimaqsrc); - return TRUE; + gst_niimaqsrc_reset (niimaqsrc); + + return result; } static gboolean gst_niimaqsrc_query (GstBaseSrc * src, GstQuery * query) { GstNiImaqSrc *niimaqsrc = GST_NIIMAQSRC (src); + gboolean res; switch (GST_QUERY_TYPE (query)) { case GST_QUERY_LATENCY:{ - GstClockTime min_latency, max_latency; - if (!niimaqsrc->session_started) { GST_WARNING_OBJECT (niimaqsrc, "Can't give latency since device isn't open!"); - return FALSE; + res = FALSE; + } else { + GstClockTime min_latency, max_latency; + /* TODO: this is a ballpark figure, estimate from FVAL times */ + min_latency = 33 * GST_MSECOND; + max_latency = 33 * GST_MSECOND * niimaqsrc->bufsize; + + GST_DEBUG_OBJECT (niimaqsrc, + "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + gst_query_set_latency (query, TRUE, min_latency, max_latency); + + res = TRUE; } - - /* TODO: this is a ballpark figure, estimate from FVAL times */ - min_latency = 33 * GST_MSECOND; - max_latency = 33 * GST_MSECOND * niimaqsrc->bufsize; - - GST_DEBUG_OBJECT (niimaqsrc, - "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, - GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); - - gst_query_set_latency (query, TRUE, min_latency, max_latency); - - return TRUE; } + default: + res = FALSE; + break; } - /*FIXME: return what value? */ + + return res; } /** @@ -1089,24 +1097,34 @@ gst_niimaqsrc_query (GstBaseSrc * src, GstQuery * query) * Close IMAQ session and interface * */ -static void +static gboolean gst_niimaqsrc_close_interface (GstNiImaqSrc * niimaqsrc) { Int32 rval; + gboolean result = TRUE; /* close IMAQ session and interface */ if (niimaqsrc->sid) { rval = imgClose (niimaqsrc->sid, TRUE); - gst_niimaqsrc_report_imaq_error (rval); + if (rval != IMG_ERR_GOOD) { + gst_niimaqsrc_report_imaq_error (rval); + result = FALSE; + } else + GST_LOG_OBJECT (niimaqsrc, "IMAQ session closed"); niimaqsrc->sid = 0; - GST_LOG_OBJECT (niimaqsrc, "IMAQ session closed"); } if (niimaqsrc->iid) { rval = imgClose (niimaqsrc->iid, TRUE); - gst_niimaqsrc_report_imaq_error (rval); + if (rval != IMG_ERR_GOOD) { + gst_niimaqsrc_report_imaq_error (rval); + result = FALSE; + } else { + GST_LOG_OBJECT (niimaqsrc, "IMAQ interface closed"); + } niimaqsrc->iid = 0; - GST_LOG_OBJECT (niimaqsrc, "IMAQ interface closed"); } + + return result; } /**