$NetBSD: patch-ac,v 1.1.1.1 2001/02/10 14:18:35 hubertf Exp $

--- cmp3volume.c.orig	Fri Feb  9 15:54:18 2001
+++ cmp3volume.c	Fri Feb  9 23:45:24 2001
@@ -3,7 +3,11 @@
 */    
 
 #include "cmp3funcs.h"
-#include<sys/soundcard.h>
+#if defined(__NetBSD__)
+#include <sys/audioio.h>
+#else
+#include <sys/soundcard.h>
+#endif
 
 static int mixernum,                    /* ID number for the mixer */
            vol;                         /* Current volume level */
@@ -12,6 +16,63 @@
  *  Initialize volume control
  *  Returns: nothing
  ****************************************************************************/
+#if defined(__NetBSD__)
+
+int device_id;
+mixer_ctrl_t *m, *values;
+
+extern void initvol()
+{
+    int i, ndev;
+    char *mixer_device;
+    mixer_devinfo_t dinfo, *infos;
+
+    mixer_device = getenv("MIXERDEVICE");
+    if (mixer_device == NULL)
+        mixer_device = "/dev/mixer0";
+
+    if ((mixernum=open(mixer_device, O_RDWR)) < 0) {
+        fprintf(stderr, "open mixer device: %s", strerror(errno));
+        enditall(SIGSEGV);
+    }
+
+    for (ndev = 0; ; ndev++) {
+        dinfo.index = ndev;
+        if (ioctl(mixernum, AUDIO_MIXER_DEVINFO, &dinfo) < 0)
+            break;
+    }
+    infos = calloc(ndev, sizeof *infos);
+    values = calloc(ndev, sizeof *values);
+
+    for (i = 0; i < ndev; i++) {
+        infos[i].index = i;
+        ioctl(mixernum, AUDIO_MIXER_DEVINFO, &infos[i]);
+    }
+
+    for (i = 0; i < ndev; i++) {
+        if (infos[i].type == AUDIO_MIXER_VALUE) {
+            values[i].dev = i;
+            values[i].type = infos[i].type;
+        }
+        if (strcmp(infos[i].label.name, AudioNdac) == 0) {
+            device_id = i;
+            break;
+        }
+    }
+
+    values[device_id].un.value.num_channels = 2;
+
+    m = &values[device_id];
+    ioctl(mixernum, AUDIO_MIXER_READ, m);
+    vol = m->un.value.level[0] * 100 / AUDIO_MAX_GAIN;
+    mvprintw(3,COLS/2-1,"-");
+    mvprintw(LINES-7,COLS/2-1,"-");
+    mvprintw((LINES-8)-(vol*(LINES-12)/100),COLS/2-1,"*");
+    return;
+}
+
+#else
+
 extern void initvol()
 {
     if ((mixernum=open("/dev/mixer", O_RDWR)) < 0) {
@@ -26,6 +87,8 @@
     return;
 }
 
+#endif
+
 extern void endvol()
 {
     close(mixernum);
@@ -57,6 +120,23 @@
  *  Although I hate users in general, we should probably do it.
  *  Returns: nothing
  ****************************************************************************/
+#if defined(__NetBSD__)
+
+extern void volup()
+{
+    mvprintw((LINES-8)-(vol*(LINES-12)/100),COLS/2-1," ");
+    vol += 3;
+    if (vol > 100)
+        vol = 100;
+    m = &values[device_id];
+    ioctl(mixernum, AUDIO_MIXER_WRITE, m);
+    m->un.value.level[0] = m->un.value.level[1] = vol * AUDIO_MAX_GAIN / 100;
+    mvprintw((LINES-8)-(vol*(LINES-12)/100), COLS/2-1, "*");
+    return;
+}
+
+#else
+
 extern void volup()
 {
     int i;
@@ -71,10 +151,29 @@
     return;
 }
 
+#endif
+
 /****************************************************************************
  *  It's too loud junior, turn it down!
  *  Returns: nothing
  ****************************************************************************/
+#if defined(__NetBSD__)
+
+extern void voldown()
+{
+    mvprintw((LINES-8)-(vol*(LINES-12)/100),COLS/2-1," ");
+    vol -= 3;
+    if (vol < 0)
+        vol = 0;
+    m = &values[device_id];
+    ioctl(mixernum, AUDIO_MIXER_WRITE, m);
+    m->un.value.level[0] = m->un.value.level[1] = vol * AUDIO_MAX_GAIN / 100;
+    mvprintw((LINES-8)-(vol*(LINES-12)/100), COLS/2-1, "*");
+    return;
+}
+
+#else
+
 extern void voldown()
 {
     int i;
@@ -89,4 +188,6 @@
     return;
 }
 
+#endif
+
 /* EOF */
\ No newline at end of file
