]> git.sur5r.net Git - i3/i3status/blobdiff - src/print_volume.c
Update wrt. recent OpenBSD changes.
[i3/i3status] / src / print_volume.c
index c13cb1761f4a206e9d2c999cef6c888c9563e153..7b38e6343fdf35a0cbe741dfbee5b562955bda91 100644 (file)
@@ -3,6 +3,8 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <yajl/yajl_gen.h>
+#include <yajl/yajl_version.h>
 
 #ifdef LINUX
 #include <alsa/asoundlib.h>
 #include <sys/soundcard.h>
 #endif
 
+#ifdef __OpenBSD__
+#include <fcntl.h>
+#include <unistd.h>
+#include <soundcard.h>
+#endif
+
 #include "i3status.h"
 #include "queue.h"
 
@@ -41,8 +49,16 @@ static void free_hdl(struct mixer_hdl *hdl) {
 }
 #endif
 
-void print_volume(const char *fmt, const char *device, const char *mixer, int mixer_idx) {
-/* Printing volume only works with ALSA at the moment */
+void print_volume(yajl_gen json_gen, char *buffer, const char *fmt, const char *device, const char *mixer, int mixer_idx) {
+        char *outwalk = buffer;
+
+        /* Printing volume only works with ALSA at the moment */
+        if (output_format == O_I3BAR) {
+                char *instance;
+                asprintf(&instance, "%s.%s.%d", device, mixer, mixer_idx);
+                INSTANCE(instance);
+                free(instance);
+        }
 #ifdef LINUX
        /* Check if we already opened the mixer and get the handle
         * from cache if so */
@@ -147,16 +163,16 @@ void print_volume(const char *fmt, const char *device, const char *mixer, int mi
        const char *walk = fmt;
        for (; *walk != '\0'; walk++) {
                if (*walk != '%') {
-                       putchar(*walk);
+                        *(outwalk++) = *walk;
                        continue;
                }
                if (BEGINS_WITH(walk+1, "volume")) {
-                       printf("%d%%", avg);
+                       outwalk += sprintf(outwalk, "%d%%", avg);
                        walk += strlen("volume");
                }
        }
 #endif
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
         char mixerpath[] = "/dev/mixer";
         int mixfd, vol, devmask = 0;
 
@@ -170,14 +186,17 @@ void print_volume(const char *fmt, const char *device, const char *mixer, int mi
         const char *walk = fmt;
         for (; *walk != '\0'; walk++) {
                 if (*walk != '%') {
-                        putchar(*walk);
+                        *(outwalk++) = *walk;
                         continue;
                 }
                 if (BEGINS_WITH(walk+1, "volume")) {
-                        printf("%d%%", vol & 0x7f);
+                        outwalk += sprintf(outwalk, "%d%%", vol & 0x7f);
                         walk += strlen("volume");
                 }
         }
         close(mixfd);
 #endif
+
+        *outwalk = '\0';
+        OUTPUT_FULL_TEXT(buffer);
 }