Ora ci sono le notifiche, anche se sarebbe ancora da rifinire.

Leonardo Robol [2011-05-07 13:32]
Ora ci sono le notifiche, anche se sarebbe ancora da rifinire.
Filename
Makefile
robolmute.c
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..73f8d02
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,6 @@
+LDFLAGS=$(shell pkg-config --libs glib-2.0 gdk-2.0)
+CFLAGS=$(shell pkg-config --cflags glib-2.0 gdk-2.0)
+LDFLAGS+= -lpulse -lnotify
+
+robolmute: robolmute.c
+	cc -o robolmute $(CFLAGS) $(LDFLAGS) robolmute.c
diff --git a/robolmute.c b/robolmute.c
index 12088d6..41c4078 100644
--- a/robolmute.c
+++ b/robolmute.c
@@ -1,14 +1,29 @@
 #include <stdlib.h>
-#include <pulse/pulseaudio.h>
 #include <stdio.h>
+#include <string.h>
+#include <pulse/pulseaudio.h>
+#include <libnotify/notify.h>

+/* Global variable to keep track of the main pulse audio loop */
 pa_mainloop* mainloop;
-pa_operation* operation;
-

 void
-success_callback(pa_context *c, int success, void* userdata)
+success_callback(pa_context *c, int success, char* new_output)
 {
+  /* Notify to the user that the switch was successful */
+  GError* error = NULL;
+  char body[255];
+  if (strlen(new_output) < 200)
+    sprintf(body, "New active output: %s", new_output);
+  else
+    strncpy(body, new_output, 255);
+  NotifyNotification *notification = notify_notification_new ("Audio switched",
+							      body,
+							      "gnome-mixer");
+  notify_notification_show (notification,
+			    &error);
+
+  /* Exit the pulseaudio mainloop */
   pa_mainloop_quit(mainloop, success);
 }

@@ -18,23 +33,15 @@ toggle_mute(pa_context *c, pa_sink_info *i, void* user_data)
 {
   int j;
   if (i) {
-    printf("Name: %s\n", i->name);
-    if (i->active_port)
-      printf("Active port: %s\n", i->active_port->description);
-    printf("Available ports:\n");
-    for(j = 0; j < i->n_ports; j++) {
-      printf("  - %s: %s\n", i->ports[j]->name,
-	     i->ports[j]->description);
-    }
-
-    /* Cycle through available active ports */
+    /* Cycle through available active ports. This should
+     * rotate between headphones and/or analog output. */
     for(j = 0; j < i->n_ports; j++) {
       if (i->active_port == i->ports[j]) {
 	pa_context_set_sink_port_by_index(c,
 					  i->index,
 					  i->ports[(j + 1) % i->n_ports]->name,
 					  (pa_context_success_cb_t) success_callback,
-					  NULL);
+					  (char*) i->ports[(j+1) % i->n_ports]->description);
       }
     }
   }
@@ -45,9 +52,9 @@ void
 context_connected_cb(pa_context *c, void* user_data)
 {
   if (pa_context_get_state(c) == PA_CONTEXT_READY) {
-    operation = pa_context_get_sink_info_list(c,
-					      (pa_sink_info_cb_t) toggle_mute,
-					      NULL);
+    pa_context_get_sink_info_list(c,
+				  (pa_sink_info_cb_t) toggle_mute,
+				  NULL);
   }
 }

@@ -62,6 +69,8 @@ main()
   int retval;
   pa_proplist *proplist;

+  notify_init ("AudioSwitch");
+
   proplist = pa_proplist_new();
   pa_proplist_sets(proplist, PA_PROP_DEVICE_API, "alsa");
   c = pa_context_new_with_proplist(api, "RobolMute",
@@ -75,5 +84,5 @@ main()

   /* Loop :) */
   pa_mainloop_run(mainloop, &retval);
-  return 0;
+  return retval;
 }
ViewGit