$NetBSD$

--- mixer.c.orig	Thu Nov  7 08:00:26 1996
+++ mixer.c
@@ -104,6 +104,14 @@ STATIC ctlinfo_t	ctlsav;		/* Saved state
  ***********************/
 
 
+#ifdef __NetBSD__
+void
+mxchg(int sig)
+{
+	deliverSIGIO();
+}
+#endif
+
 /*
  * do_ioctl
  *	Perform ioctl command.  If file is not yet open or if we
@@ -201,12 +209,18 @@ mx_queryhw(widgets_t *m)
 			ctlinfo.slinfo[i].right = ((level >> 8) & 0xff);
 
 			/* Sanity check */
-			if (ctlinfo.slinfo[i].left > 100)
-				ctlinfo.slinfo[i].left = 100;
+#if defined(__NetBSD__) && \
+    !defined(OPEN_SOUND_SYSTEM) && !defined(UNIX_SOUND_SYSTEM)
+#  define SLIDER_MAX 255
+#else
+#  define SLIDER_MAX 100
+#endif
+			if (ctlinfo.slinfo[i].left > SLIDER_MAX)
+				ctlinfo.slinfo[i].left = SLIDER_MAX;
 			else if (ctlinfo.slinfo[i].left < 0)
 				ctlinfo.slinfo[i].left = 0;
-			if (ctlinfo.slinfo[i].right > 100)
-				ctlinfo.slinfo[i].right = 100;
+			if (ctlinfo.slinfo[i].right > SLIDER_MAX)
+				ctlinfo.slinfo[i].right = SLIDER_MAX;
 			else if (ctlinfo.slinfo[i].right < 0)
 				ctlinfo.slinfo[i].right = 0;
 
@@ -674,18 +688,25 @@ mx_init_drv(void)
 	}
 
 	/* Set maximum number of devices supported */
+#if defined(__NetBSD__) && \
+    !defined(OPEN_SOUND_SYSTEM) && !defined(UNIX_SOUND_SYSTEM)
+	maxdevs = SOUND_MIXER_NRDEVICES;
+#else
 	maxdevs = MAXDEVS_V3;
+#endif
 
 	strcpy(drv_ver, "unknown");
 
 	/* Query sound driver version */
 	if ((fp = fopen("/dev/sndstat", "r")) == NULL) {
 		if (!app_data.demo) {
+#if defined(OPEN_SOUND_SYSTEM) || defined(UNIX_SOUND_SYSTEM)
 			fprintf(errfp, "%s: %s: %s\n",
 				PROGNAME,
 				"Cannot open /dev/sndstat",
 				"assuming pre-3.0 sound driver.");
 			maxdevs = MAXDEVS_V2;
+#endif
 		}
 		return;
 	}
@@ -915,6 +936,7 @@ void
 mx_start(widgets_t *m)
 {
 	char	msg[256];
+	int one = 1;
 
 	if (app_data.autoload != NULL && app_data.autoload[0] != '\0' &&
 	    strcmp(app_data.autoload, "/dev/null") != 0) {
@@ -930,6 +952,16 @@ mx_start(widgets_t *m)
 		}
 	}
 
+#if defined(__NetBSD__)
+	signal(SIGIO, mxchg);
+#if !defined(OPEN_SOUND_SYSTEM) && !defined(UNIX_SOUND_SYSTEM)
+	do_ioctl(FIOASYNC, &one, "FIOASYNC", IOC_DATA_NONE);
+#endif
+#endif
+
+	/* Query hardware mixer settings */
+	mx_queryhw(&widgets);
+
 	/* Update screen controls to match current status */
 	mx_updctl(m);
 }
@@ -1531,6 +1563,22 @@ mx_focuschg(Widget w, XtPointer client_d
 	if (p->reason != XmCR_FOCUS || form == (Widget) NULL)
 		return;
 
+	/* Query hardware mixer settings */
+	mx_queryhw(&widgets);
+
+	/* Update screen controls */
+	mx_updctl(&widgets);
+}
+
+
+/*
+ * mx_change
+ *	Mixer device has changed
+ */
+/*ARGSUSED*/
+void
+mx_change(XtPointer client_data)
+{
 	/* Query hardware mixer settings */
 	mx_queryhw(&widgets);
 
