$OpenBSD: patch-sound_cc,v 1.3 2010/05/22 13:43:24 espie Exp $
--- sound.cc.orig	Thu Jun  8 07:41:06 2000
+++ sound.cc	Sat May 22 15:26:39 2010
@@ -34,16 +34,22 @@
 #include <fcntl.h>
 #include <unistd.h>
 #include <signal.h>
-#ifndef __FreeBSD__
-#include <linux/soundcard.h>
-#include <linux/cdrom.h>
-//#include <linux/ucdrom.h>
-#else
+#ifdef __OpenBSD__
+#include <soundcard.h>
+#include <sys/cdio.h>
+#define CDROM_LEADOUT 0xAA
+#define CD_FRAMES 75 /* frames per second */
+#define CDROM_DATA_TRACK 0x4
+#elif __FreeBSD__
 #include <machine/soundcard.h>
 #include <sys/cdio.h>
 #define CDROM_LEADOUT 0xAA
 #define CD_FRAMES 75 /* frames per second */
 #define CDROM_DATA_TRACK 0x4
+#else
+#include <linux/soundcard.h>
+#include <linux/cdrom.h>
+//#include <linux/ucdrom.h>
 #endif
 #include <time.h>
 
@@ -87,7 +93,7 @@ void getTrackInfo(void) {
   trackFrame = 0;
   trackCount  = 0;
 
-#ifndef __FreeBSD__
+#if defined(__linux__)
   cdrom_tochdr cdTochdr;
   if (-1 == ioctl(cdDevice, CDROMREADTOCHDR, &cdTochdr))
 #else
@@ -95,7 +101,7 @@ void getTrackInfo(void) {
   if (-1 == ioctl(cdDevice, CDIOREADTOCHEADER, (char *)&cdTochdr))
 #endif
      return;
-#ifndef __FreeBSD__
+#if defined(__linux__)
   trackCount = cdTochdr.cdth_trk1;
 #else
   trackCount = cdTochdr.ending_track - cdTochdr.starting_track + 1;
@@ -104,7 +110,7 @@ void getTrackInfo(void) {
   int i;
   trackFrame = new int[trackCount+1];
   for(i=trackCount;i>=0;i--) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
     cdrom_tocentry cdTocentry;
     cdTocentry.cdte_format = CDROM_MSF;
     cdTocentry.cdte_track  = (i == trackCount ? CDROM_LEADOUT : i+1);
@@ -120,7 +126,7 @@ void getTrackInfo(void) {
     //Bug fix: thanks to Ben Gertzfield  (9/7/98)
     //Leadout track is sometimes reported as data.
     //Added check for this.
-#ifndef __FreeBSD__
+#if defined(__linux__)
     if (-1 == ioctl(cdDevice, CDROMREADTOCENTRY, & cdTocentry) ||
         (i != trackCount && (cdTocentry.cdte_ctrl & CDROM_DATA_TRACK)))
       trackFrame[i] = (i==trackCount?0:trackFrame[i+1]);
@@ -153,7 +159,7 @@ int cdGetTrackFrame(int track) {
 }
 
 void cdPlay(int frame, int endFrame) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
   cdrom_msf msf;
 #else
   struct ioc_play_msf msf;
@@ -168,7 +174,7 @@ void cdPlay(int frame, int endFrame) {
   // (Sybren Stuvel)
   cdStop();
   
-#ifndef __FreeBSD__
+#if defined(__linux__)
   msf.cdmsf_min0 = frame / (60*CD_FRAMES);
   msf.cdmsf_sec0 = frame / CD_FRAMES % 60;
   msf.cdmsf_frame0 = frame % CD_FRAMES;
@@ -181,7 +187,7 @@ void cdPlay(int frame, int endFrame) {
   //Bug fix: thanks to Martin Mitchell
   //An out by one error that affects some CD players. 
   //Have to use endFrame-1 rather than endFrame (9/7/98)
-#ifndef __FreeBSD__
+#if defined(__linux__)
   msf.cdmsf_min1 = (endFrame-1) / (60*CD_FRAMES);
   msf.cdmsf_sec1 = (endFrame-1) / CD_FRAMES % 60;
   msf.cdmsf_frame1 = (endFrame-1) % CD_FRAMES;
@@ -195,7 +201,7 @@ void cdPlay(int frame, int endFrame) {
 }
 
 void cdGetStatus(int &track, int &frames, SymbolID &state) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
   cdrom_subchnl subchnl;
   subchnl.cdsc_format = CDROM_MSF;
   if (-1 == ioctl(cdDevice, CDROMSUBCHNL, &subchnl)) {
@@ -215,7 +221,7 @@ void cdGetStatus(int &track, int &frames, SymbolID &st
     state = (state == Open ? Open : NoCD); /* ? */
     return;
   }
-#ifndef __FreeBSD__
+#if defined(__linux__)
   track = subchnl.cdsc_trk;
   frames  = subchnl.cdsc_reladdr.msf.minute*60*CD_FRAMES+
             subchnl.cdsc_reladdr.msf.second*CD_FRAMES+
@@ -228,7 +234,7 @@ void cdGetStatus(int &track, int &frames, SymbolID &st
 #endif
   
   SymbolID oldState = state;
-#ifndef __FreeBSD__
+#if defined(__linux__)
   switch(subchnl.cdsc_audiostatus) {
     case CDROM_AUDIO_PAUSED    : state = Pause; break;
     case CDROM_AUDIO_PLAY      : state = Play; break;
@@ -259,38 +265,38 @@ void cdGetStatus(int &track, int &frames, SymbolID &st
 
 void cdStop(void) {
   //attemptNoDie(ioctl(cdDevice, CDROMSTOP),"stopping CD");
-#ifndef __FreeBSD__
+#if defined(__linux__)
   ioctl(cdDevice, CDROMSTOP);
-#else
-  ioctl(cdDevice, CDIOCSTOP);
+#elif defined(__OpenBSD__) || defined(__FreeBSD__)
+  ioctl(cdDevice, CDIOCSTOP, NULL);
 #endif
 }
 void cdPause(void) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
   attemptNoDie(ioctl(cdDevice, CDROMPAUSE),"pausing CD",true);
-#else
-  attemptNoDie(ioctl(cdDevice, CDIOCPAUSE),"pausing CD",true);
+#elif defined(__OpenBSD__) || defined(__FreeBSD__)
+  attemptNoDie(ioctl(cdDevice, CDIOCPAUSE, NULL),"pausing CD",true);
 #endif
 }
 void cdResume(void) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
   attemptNoDie(ioctl(cdDevice, CDROMRESUME),"resuming CD",true);
-#else
-  attemptNoDie(ioctl(cdDevice, CDIOCRESUME),"resuming CD",true);
+#elif defined(__OpenBSD__) || defined(__FreeBSD__)
+  attemptNoDie(ioctl(cdDevice, CDIOCRESUME, NULL),"resuming CD",true);
 #endif
 }
 void cdEject(void) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
   attemptNoDie(ioctl(cdDevice, CDROMEJECT),"ejecting CD",true);
-#else
-  attemptNoDie(ioctl(cdDevice, CDIOCEJECT),"ejecting CD",true);
+#elif defined(__OpenBSD__) || defined(__FreeBSD__)
+  attemptNoDie(ioctl(cdDevice, CDIOCEJECT, NULL),"ejecting CD",true);
 #endif
 }
 void cdCloseTray(void) {
-#ifndef __FreeBSD__
+#if defined(__linux__)
   attemptNoDie(ioctl(cdDevice, CDROMCLOSETRAY),"ejecting CD",true);
-#else
-  attemptNoDie(ioctl(cdDevice, CDIOCCLOSE),"ejecting CD",true);
+#elif defined(__OpenBSD__) || defined(__FreeBSD__)
+  attemptNoDie(ioctl(cdDevice, CDIOCCLOSE, NULL),"ejecting CD",true);
 #endif
 }
 
@@ -379,7 +385,7 @@ void openSound(SoundSource source, int inFrequency, ch
   
     int format, stereo, fragment, fqc;
   
-#ifdef __FreeBSD__
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
     attempt(device = open(dspName,O_WRONLY),"opening dsp device",true);
     format = SOUNDFORMAT;
     attempt(ioctl(device,SNDCTL_DSP_SETFMT,&format),"setting format",true);
@@ -408,7 +414,7 @@ void openSound(SoundSource source, int inFrequency, ch
     //Was 0x00010000 + m; 
   
     attemptNoDie(ioctl(device,SNDCTL_DSP_SETFRAGMENT,&fragment),"setting fragment",true);
-#ifndef __FreeBSD__
+#if !defined(__FreeBSD__) || !defined(__OpenBSD__)
     attempt(ioctl(device,SNDCTL_DSP_SETFMT,&format),"setting format",true);
     if (format != SOUNDFORMAT) error("setting format (2)");
 #endif
@@ -422,8 +428,12 @@ void openSound(SoundSource source, int inFrequency, ch
       close(0);
     }
   }
-     
-  data = new short[NumSamples*2];  
+#if defined(__FreeBSD__) || defined(__OpenBSD__)
+	data = new u_short[NumSamples*2];
+#else
+  data = new short[NumSamples*2];
+#endif
+
   memset((char*)data,0,NumSamples*4);
 }
 
