chiark / gitweb /
Rearrange crazy control.c logic. No longer are there two widgets per
[disorder] / disobedience / disobedience.c
index 42eb190cf8b4c715fd704d2b60830c02aa141a8e..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
@@ -312,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;
 }
 
@@ -339,45 +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) {
-  ++suppress_actions;
-  rtp_address_in_flight = 0;
-  rtp_supported = 1;
-  rtp_is_running = rtp_running();
-  control_monitor(0);
-  --suppress_actions;
-}
+  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 -------------------------------------------------------------------- */