fix state machine if camera connection is lost during screensaver, allow screensaver playback on background click in STATE NONE

This commit is contained in:
Andreas Frisch 2016-05-25 13:58:32 +02:00
parent d3273796b1
commit 739282afbd
2 changed files with 15 additions and 11 deletions

View file

@ -522,13 +522,6 @@ static void photo_booth_capture_thread_func (PhotoBooth *pb)
} }
timeout = 5000; timeout = 5000;
} }
else if (state == CAPTURE_UNPAUSE && !pb->cam_info)
{
if (photo_booth_cam_init (&pb->cam_info))
state = CAPTURE_VIDEO;
else
state = CAPTURE_INIT;
}
else if (state == CAPTURE_PAUSED) else if (state == CAPTURE_PAUSED)
timeout = 1000; timeout = 1000;
else else
@ -617,7 +610,7 @@ static void photo_booth_capture_thread_func (PhotoBooth *pb)
break; break;
case CONTROL_UNPAUSE: case CONTROL_UNPAUSE:
GST_DEBUG_OBJECT (pb, "CONTROL_UNPAUSE!"); GST_DEBUG_OBJECT (pb, "CONTROL_UNPAUSE!");
state = CAPTURE_UNPAUSE; state = CAPTURE_INIT;
break; break;
case CONTROL_VIDEO: case CONTROL_VIDEO:
GST_DEBUG_OBJECT (pb, "CONTROL_VIDEO"); GST_DEBUG_OBJECT (pb, "CONTROL_VIDEO");
@ -1009,6 +1002,14 @@ static gboolean photo_booth_screensaver (PhotoBooth *pb)
gst_object_unref (pad); gst_object_unref (pad);
gst_element_unlink (pb->video_bin, pb->video_sink); gst_element_unlink (pb->video_bin, pb->video_sink);
} }
if (priv->sink_block_id)
{
pad = gst_element_get_static_pad (pb->video_sink, "sink");
GST_DEBUG_OBJECT (pad, "showing screensaver! unblock video_sink...");
gst_pad_remove_probe (pad, priv->sink_block_id);
gst_object_unref (pad);
gst_element_set_state (pb->video_sink, GST_STATE_PLAYING);
}
SEND_COMMAND (pb, CONTROL_PAUSE); SEND_COMMAND (pb, CONTROL_PAUSE);
@ -1033,6 +1034,7 @@ static gboolean photo_booth_screensaver (PhotoBooth *pb)
static gboolean photo_booth_screensaver_stop (PhotoBooth *pb) static gboolean photo_booth_screensaver_stop (PhotoBooth *pb)
{ {
PhotoBoothPrivate *priv = photo_booth_get_instance_private (pb); PhotoBoothPrivate *priv = photo_booth_get_instance_private (pb);
photo_booth_change_state (pb, PB_STATE_NONE);
GstPad *pad; GstPad *pad;
pad = gst_element_get_static_pad (pb->video_sink, "sink"); pad = gst_element_get_static_pad (pb->video_sink, "sink");
@ -1048,7 +1050,6 @@ static gboolean photo_booth_screensaver_stop (PhotoBooth *pb)
gst_object_unref (pb->video_sink); gst_object_unref (pb->video_sink);
SEND_COMMAND (pb, CONTROL_UNPAUSE); SEND_COMMAND (pb, CONTROL_UNPAUSE);
photo_booth_preview (pb);
return FALSE; return FALSE;
} }
@ -1082,7 +1083,6 @@ void photo_booth_background_clicked (GtkWidget *widget, GdkEventButton *event, P
{ {
gtk_widget_hide (GTK_WIDGET (priv->win->button_yes)); gtk_widget_hide (GTK_WIDGET (priv->win->button_yes));
SEND_COMMAND (pb, CONTROL_UNPAUSE); SEND_COMMAND (pb, CONTROL_UNPAUSE);
photo_booth_preview (pb);
break; break;
} }
case PB_STATE_SCREENSAVER: case PB_STATE_SCREENSAVER:
@ -1090,6 +1090,11 @@ void photo_booth_background_clicked (GtkWidget *widget, GdkEventButton *event, P
photo_booth_screensaver_stop (pb); photo_booth_screensaver_stop (pb);
break; break;
} }
case PB_STATE_NONE:
{
photo_booth_screensaver (pb);
break;
}
default: default:
break; break;
} }

View file

@ -68,7 +68,6 @@ typedef enum
CAPTURE_PRETRIGGER, CAPTURE_PRETRIGGER,
CAPTURE_PHOTO, CAPTURE_PHOTO,
CAPTURE_PAUSED, CAPTURE_PAUSED,
CAPTURE_UNPAUSE,
CAPTURE_FAILED, CAPTURE_FAILED,
CAPTURE_QUIT, CAPTURE_QUIT,
} PhotoboothCaptureThreadState; } PhotoboothCaptureThreadState;