--- wmtune.c.orig	Sun Jun 28 05:00:10 1998
+++ wmtune.c	Tue Jun 30 20:50:24 1998
@@ -39,6 +39,11 @@
 #include <unistd.h>
 #include <fcntl.h>
 
+/* Kernel driver support */
+#include <linux/types.h>
+#include <linux/videodev.h>
+#include <linux/ioctl.h>
+
 #include <X11/xpm.h>
 
 #include <time.h>
@@ -96,6 +101,10 @@
 	int radio_status=OFF;
 	int alarm_state=0;
 
+/* Kernel support */
+
+int volume = 5;
+
 struct { double freq; } *presets;
 
 // Functions
@@ -146,7 +155,7 @@
 		}
 	}
 
-	CheckIOPerms();
+	/*	CheckIOPerms();            Kernel driver support */
 
 	if (cmdline_preset == ON)
 	{
@@ -201,7 +210,7 @@
 				#if (defined FreeBSD || defined NetBSD || defined OpenBSD)
 				close(fpiopl);
 				#else
-				ioperm(rport,2,0);
+/*				ioperm(rport,2,0); */
 				#endif
 				exit(0);
 			break;
@@ -457,8 +466,17 @@
 
 void FastFreqUpdate(void)
 {
-	RadioOut(FCODE(freqf),16);
+  /*	RadioOut(FCODE(freqf),16);
 	RadioOut(0xa0,8);
+  */
+
+    struct video_tuner v;
+    int fd = open ("/dev/radio", O_RDONLY);
+    unsigned long xl_freq = (unsigned long)(freqf*1000*.016+0.5);
+    v.tuner = 0;
+    ioctl (fd, VIDIOCSFREQ, &xl_freq);
+    ioctl (fd, VIDIOCGTUNER, &v);
+    close (fd);
 }
 
 void DrawDigitalTime(int hr, int min) 
@@ -645,7 +663,7 @@
 		exit(1);
 	}
 	#else
-	if (ioperm(rport,2,1) < 0)
+	if (/*ioperm(rport,2,1) < 0*/ 0)
 	{
 		fprintf(stderr, "Failed to gain IO privledges.  Am I setuid root?\n");
 		exit(1);
@@ -714,8 +732,16 @@
 
 void RadioOff(void)
 {
-	OUTB(0,rport);
-	OUTB(0xc0,rport);
+    /*	OUTB(0,rport);
+	OUTB(0xc0,rport); */
+
+    struct video_audio va;
+    int fd = open ("/dev/radio", O_RDONLY);
+    va.flags = VIDEO_AUDIO_MUTE;
+    va.audio = 0;
+    ioctl (fd, VIDIOCSAUDIO, &va);
+    close (fd);
+    
 	radio_status = OFF;	
 	copyXPMArea(76, 40, 51, 13, 6, 7); 
 	copyXPMArea(115, 55, 11, 7, 45, 22);
@@ -726,12 +752,21 @@
 
 void TuneRadio(void)
 {
-	RadioOut(FCODE(freqf),16);
+    /*	RadioOut(FCODE(freqf),16);
 	RadioOut(0xa0,8);
 	usleep(1000);
 	OUTB(0,rport);
 	usleep(50000);
-	OUTB(0xc8,rport);
+	OUTB(0xc8,rport); */
+
+    struct video_tuner v;
+    int fd = open ("/dev/radio", O_RDONLY);
+    unsigned long xl_freq = (unsigned long)(freqf*1000*.016+0.5);
+    v.tuner = 0;
+    ioctl (fd, VIDIOCSFREQ, &xl_freq);
+    ioctl (fd, VIDIOCGTUNER, &v);
+    close (fd);
+
 }
 
 void RadioOut(int v,int n)
@@ -878,16 +913,36 @@
 
 void VolumeUp(void)
 {
-	OUTB(0x88,rport);
+    /*	OUTB(0x88,rport);
 	usleep(200000);
-	OUTB(0xc8,rport);
+	OUTB(0xc8,rport); */
+
+    if (volume < 10) {
+	struct video_audio va;
+	int fd = open ("/dev/radio", O_RDONLY);
+	va.flags = VIDEO_AUDIO_VOLUME;
+	va.audio = 0;
+	va.volume = (++volume) * (65535/10);
+	ioctl (fd, VIDIOCSAUDIO, &va);
+	close (fd);
+    }
 }
 
 void VolumeDown(void)
 {
-	OUTB(0x48,rport);
+    /*	OUTB(0x48,rport);
 	usleep(200000);
-	OUTB(0xc8,rport);
+	OUTB(0xc8,rport); */
+
+    if (volume > 0) {
+	struct video_audio va;
+	int fd = open ("/dev/radio", O_RDONLY);
+	va.flags = VIDEO_AUDIO_VOLUME;
+	va.audio = 0;
+	va.volume = (--volume) * (65535/10);
+	ioctl (fd, VIDIOCSAUDIO, &va);
+	close (fd);
+    }
 }
 
 void TuneUp(void)
@@ -951,7 +1006,7 @@
 
 int TestTune(void)
 {
-	int res;
+    /*	int res;
 
 	OUTB(0xf8,rport);
 	usleep(150000);
@@ -965,6 +1020,13 @@
 		return 2;				// POSSIBLY MONO :) 	(2)
 	}
 	return 0;					// POSSIBLE SIGNAL LOSS (0)
+    */
+	struct video_tuner v;
+	int fd = open ("/dev/radio", O_RDONLY);
+	v.tuner = 0;
+	ioctl (fd, VIDIOCGTUNER, &v);
+	close (fd);
+	return (v.signal != 0)?1:0;
 }
 
 int ParseRCFile(char *filename)
@@ -1025,3 +1087,15 @@
 	fclose(fp);
 	return 0;
 }
+
+
+
+
+
+
+
+
+
+
+
+
