Add SIGUSR1/SIGUSR2 as play/stop signals. Also add these to the documentation. Fixes...
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>
Tue, 19 Aug 2003 05:43:55 +0000 (05:43 +0000)
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>
Tue, 19 Aug 2003 05:43:55 +0000 (05:43 +0000)
Original commit message from CVS:
Add SIGUSR1/SIGUSR2 as play/stop signals. Also add these to the documentation. Fixes #120065

tools/gst-launch.1.in
tools/gst-launch.c

index ab30320..4449b2d 100644 (file)
@@ -192,6 +192,15 @@ Ranges are in this format:  [ PROPERTY, PROPERTY ]
 .br
 Lists use this format:      ( PROPERTY \fI[, PROPERTY ...]\fR )
 
+.SH "PIPELINE CONTROL"
+
+A pipeline can be controlled by signals. SIGUSR2 will stop the pipeline
+(GST_STATE_NULL); SIGUSR1 will put it back to play (GST_STATE_PLAYING).
+By default, the pipeline will start in the playing state.
+.br
+There are currently no signals defined to go into the ready or pause
+(GST_STATE_READY and GST_STATE_PAUSED) state explicitely.
+
 .SH "PIPELINE EXAMPLES"
 
 The examples below assume that you have the correct plug-ins available.
index 41a6189..104199b 100644 (file)
@@ -133,14 +133,16 @@ fault_handler_sighandler (int signum)
 {
   fault_restore ();
 
-  if (signum == SIGSEGV) {
-    g_print ("Caught SIGSEGV\n");
-  }
-  else if (signum == SIGQUIT){
-    g_print ("Caught SIGQUIT\n");
-  }
-  else {
-    g_print ("signo:  %d\n", signum);
+  switch (signum) {
+    case SIGSEGV:
+      g_print ("Caught SIGSEGV\n");
+      break;
+    case SIGQUIT:
+      g_print ("Caught SIGQUIT\n");
+      break;
+    default:
+      g_print ("signo:  %d\n", signum);
+      break;
   }
 
   fault_spin();
@@ -153,16 +155,18 @@ fault_handler_sigaction (int signum, siginfo_t *si, void *misc)
 {
   fault_restore ();
 
-  if (si->si_signo == SIGSEGV) {
-    g_print ("Caught SIGSEGV accessing address %p\n", si->si_addr);
-  }
-  else if (si->si_signo == SIGQUIT){
-    g_print ("Caught SIGQUIT\n");
-  }
-  else {
-    g_print ("signo:  %d\n", si->si_signo);
-    g_print ("errno:  %d\n", si->si_errno);
-    g_print ("code:   %d\n", si->si_code);
+  switch (si->si_signo) {
+    case SIGSEGV:
+      g_print ("Caught SIGSEGV accessing address %p\n", si->si_addr);
+      break;
+    case SIGQUIT:
+      g_print ("Caught SIGQUIT\n");
+      break;
+    default:
+      g_print ("signo:  %d\n", si->si_signo);
+      g_print ("errno:  %d\n", si->si_errno);
+      g_print ("code:   %d\n", si->si_code);
+      break;
   }
 
   fault_spin();
@@ -194,8 +198,8 @@ fault_restore (void)
   memset (&action, 0, sizeof (action));
   action.sa_handler = SIG_DFL;
 
-  sigaction(SIGSEGV, &action, NULL);
-  sigaction(SIGQUIT, &action, NULL);
+  sigaction (SIGSEGV, &action, NULL);
+  sigaction (SIGQUIT, &action, NULL);
 }
 
 static void 
@@ -245,7 +249,33 @@ sigint_restore (void)
   memset (&action, 0, sizeof (action));
   action.sa_handler = SIG_DFL;
 
-  sigaction(SIGINT, &action, NULL);
+  sigaction (SIGINT, &action, NULL);
+}
+
+static void
+play_handler (int signum)
+{
+  switch (signum) {
+    case SIGUSR1:
+      g_print ("Caught SIGUSR1 - Play request\n");
+      gst_element_set_state (pipeline, GST_STATE_PLAYING);
+      break;
+    case SIGUSR2:
+      g_print ("Caught SIGUSR2 - Stop request\n");
+      gst_element_set_state (pipeline, GST_STATE_NULL);
+      break;
+  }
+}
+
+static void
+play_signal_setup(void)
+{
+  struct sigaction action;
+
+  memset (&action, 0, sizeof (action));
+  action.sa_handler = play_handler;
+  sigaction (SIGUSR1, &action, NULL);
+  sigaction (SIGUSR2, &action, NULL);
 }
 
 int
@@ -308,6 +338,7 @@ main(int argc, char *argv[])
     fault_setup();
 
   sigint_setup();
+  play_signal_setup();
   
   if (trace) {
     if (!gst_alloc_trace_available()) {