chiark / gitweb /
Rearrange crazy control.c logic. No longer are there two widgets per
[disorder] / disobedience / disobedience.c
index 0b3408b897d75a638b6fc7954a2e620fe7c72b74..6ee4803def54105d99108cc57d3a2751fa7c965d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * This file is part of DisOrder.
- * Copyright (C) 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2006, 2007, 2008 Richard Kettlewell
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -23,6 +23,7 @@
 
 #include "disobedience.h"
 #include "mixer.h"
+#include "version.h"
 
 #include <getopt.h>
 #include <locale.h>
@@ -311,19 +312,22 @@ static gboolean periodic_fast(gpointer attribute((unused)) data) {
   }
   last = now;
 #endif
-  if(rtp_supported) {
+  if(rtp_supported && mixer_supported(DEFAULT_BACKEND)) {
     int nl, nr;
-    if(!mixer_control(&nl, &nr, 0) && (nl != volume_l || nr != volume_r)) {
+    if(!mixer_control(DEFAULT_BACKEND, &nl, &nr, 0)
+       && (nl != volume_l || nr != volume_r)) {
       volume_l = nl;
       volume_r = nr;
-      volume_update();
+      event_raise("volume-changed", 0);
     }
   }
   return TRUE;
 }
 
 /** @brief Called when a NOP completes */
-static void nop_completed(void attribute((unused)) *v) {
+static void nop_completed(void attribute((unused)) *v,
+                          const char attribute((unused)) *error) {
+  /* TODO report the error somewhere */
   nop_in_flight = 0;
 }
 
@@ -338,41 +342,42 @@ static gboolean maybe_send_nop(gpointer attribute((unused)) data) {
     disorder_eclient_nop(client, nop_completed, 0);
   }
   if(rtp_supported) {
-    const int old_state = rtp_is_running;
+    const int rtp_was_running = rtp_is_running;
     rtp_is_running = rtp_running();
-    if(old_state != rtp_is_running)
-      control_monitor(0);
+    if(rtp_was_running != rtp_is_running)
+      event_raise("rtp-changed", 0);
   }
   return TRUE;                          /* keep call me please */
 }
 
 /** @brief Called when a rtp-address command succeeds */
 static void got_rtp_address(void attribute((unused)) *v,
+                            const char *error,
                             int attribute((unused)) nvec,
                             char attribute((unused)) **vec) {
-  rtp_address_in_flight = 0;
-  rtp_supported = 1;
-  rtp_is_running = rtp_running();
-  control_monitor(0);
-}
+  const int rtp_was_supported = rtp_supported;
+  const int rtp_was_running = rtp_is_running;
 
-/** @brief Called when a rtp-address command fails */
-static void no_rtp_address(struct callbackdata attribute((unused)) *cbd,
-                           int attribute((unused)) code,
-                           const char attribute((unused)) *msg) {
+  ++suppress_actions;
   rtp_address_in_flight = 0;
-  rtp_supported = 0;
-  rtp_is_running = 0;
-  control_monitor(0);
+  if(error) {
+    /* An error just means that we're not using network play */
+    rtp_supported = 0;
+    rtp_is_running = 0;
+  } else {
+    rtp_supported = 1;
+    rtp_is_running = rtp_running();
+  }
+  if(rtp_supported != rtp_was_supported
+     || rtp_is_running != rtp_was_running)
+    event_raise("rtp-changed", 0);
+  --suppress_actions;
 }
 
 /** @brief Called to check whether RTP play is available */
 static void check_rtp_address(void) {
-  if(!rtp_address_in_flight) {
-    struct callbackdata *const cbd = xmalloc(sizeof *cbd);
-    cbd->onerror = no_rtp_address;
-    disorder_eclient_rtp_address(client, got_rtp_address, cbd);
-  }
+  if(!rtp_address_in_flight)
+    disorder_eclient_rtp_address(client, got_rtp_address, NULL);
 }
 
 /* main -------------------------------------------------------------------- */
@@ -403,13 +408,6 @@ static void help(void) {
   exit(0);
 }
 
-/* display version number and terminate */
-static void version(void) {
-  xprintf("disorder version %s\n", disorder_version_string);
-  xfclose(stdout);
-  exit(0);
-}
-
 /* reset state */
 void reset(void) {
   struct reset_callback_node *r;
@@ -435,6 +433,7 @@ void register_reset(reset_callback *callback) {
 
 int main(int argc, char **argv) {
   int n;
+  gboolean gtkok;
 
   mem_init();
   /* garbage-collect PCRE's memory */
@@ -445,17 +444,19 @@ int main(int argc, char **argv) {
   g_mem_set_vtable((GMemVTable *)&glib_memvtable);
 #endif
   if(!setlocale(LC_CTYPE, "")) fatal(errno, "error calling setlocale");
-  gtk_init(&argc, &argv);
+  gtkok = gtk_init_check(&argc, &argv);
   while((n = getopt_long(argc, argv, "hVc:dtHC", options, 0)) >= 0) {
     switch(n) {
     case 'h': help();
-    case 'V': version();
+    case 'V': version("disobedience");
     case 'c': configfile = optarg; break;
     case 'd': debugging = 1; break;
     case 't': goesupto = 11; break;
     default: fatal(0, "invalid option");
     }
   }
+  if(!gtkok)
+    fatal(0, "failed to initialize GTK+");
   signal(SIGPIPE, SIG_IGN);
   init_styles();
   load_settings();
@@ -478,7 +479,7 @@ int main(int argc, char **argv) {
   gtk_widget_show_all(toplevel);
   /* issue a NOP every so often */
   g_timeout_add_full(G_PRIORITY_LOW,
-                     1000/*interval, ms*/,
+                     2000/*interval, ms*/,
                      maybe_send_nop,
                      0/*data*/,
                      0/*notify*/);
@@ -487,6 +488,10 @@ int main(int argc, char **argv) {
   disorder_eclient_log(logclient, &log_callbacks, 0);
   /* See if RTP play supported */
   check_rtp_address();
+  suppress_actions = 0;
+  /* If no password is set yet pop up a login box */
+  if(!config->password)
+    login_box();
   D(("enter main loop"));
   MTAG("misc");
   g_main_loop_run(mainloop);