*** soundbyte.c.orig	Fri Jan 15 23:13:23 1999
--- soundbyte.c	Fri Jan 15 23:17:36 1999
***************
*** 33,39 ****
  #else /* FreeBSD / Linux */
  #ifdef LINUX
  #include <linux/soundcard.h>
! #else
  #include <machine/soundcard.h>
  #endif
  #define AUDIO_MIN_GAIN 0
--- 33,41 ----
  #else /* FreeBSD / Linux */
  #ifdef LINUX
  #include <linux/soundcard.h>
! #elif __OpenBSD__
! #include <soundcard.h>
! #else 
  #include <machine/soundcard.h>
  #endif
  #define AUDIO_MIN_GAIN 0
***************
*** 62,67 ****
--- 64,77 ----
  
  #define MAX_GAIN	100
  
+ void soundplayvol();
+ 
+ #ifndef sun
+ #ifdef  HALF_DUPLEX
+ static int oldvol = -1;
+ #endif
+ #endif
+ 
  struct sound_buf {
      struct sound_buf *snext;	      /* Next sound buffer */
      int sblen;			      /* Length of this sound buffer */
***************
*** 157,162 ****
--- 167,187 ----
  	    }
  	    ioctl(Audio_fd, AUDIO_SETINFO, &Audio_info);
  #endif
+ #ifndef sun
+ #ifdef  HALF_DUPLEX
+           if (iomode == O_RDONLY) {
+               if (oldvol == -1)
+                   oldvol = soundgetvol();
+               soundplayvol(0);
+           } else if (   iomode == O_WRONLY
+                      && oldvol != -1
+                     ) {
+               if (soundgetvol() == 0)
+                   soundplayvol(oldvol);
+               oldvol = -1;
+           }
+ #endif
+ #endif
  	    return TRUE;
  	}
  	if (errno != EINTR) {
***************
*** 172,177 ****
--- 197,211 ----
  void soundterm()
  {
  	if (audiof >= 0) {
+ #ifndef sun
+ #ifdef  HALF_DUPLEX
+           if (oldvol != -1) {
+               if (soundgetvol() == 0)
+                   soundplayvol(oldvol);
+               oldvol = -1;    
+           }  
+ #endif
+ #endif
  	    if (close(audiof) < 0) {
                  perror("closing audio device");
  	    }
***************
*** 222,231 ****
  
     arg	 = (value << 8) | value;
  
!    if (ioctl(Audio_fd, MIXER_WRITE(SOUND_MIXER_PCM), &arg) < 0)
!         perror("SOUND_MIXER_PCM");
  #endif
  }
  
  /*  SOUNDRECGAIN  --  Set recording gain from 0 (minimum) to 100 (maximum).  */
  
--- 256,285 ----
  
     arg	 = (value << 8) | value;
  
!    if (ioctl(Audio_fd, SOUND_MIXER_WRITE_PCM, &arg) < 0)
!         perror("SOUND_MIXER_WRITE_PCM");
  #endif
  }
+ 
+ #ifndef sun
+ #ifdef  HALF_DUPLEX
+ 
+ /*  SOUNDGETVOL -- Get current playback volume. */
+ 
+ int soundgetvol()
+ {
+    int arg, v1, v2;
+ 
+    if (ioctl(Audio_fd, SOUND_MIXER_READ_PCM, &arg) < 0) {
+       perror("SOUND_MIXER_READ_PCM");
+       return -1;
+    }
+    v1 = arg & 0xFF;
+    v2 = (arg >> 8) & 0xFF;
+    return (v1 > v2) ? v1 : v2;
+ }
+ #endif
+ #endif
  
  /*  SOUNDRECGAIN  --  Set recording gain from 0 (minimum) to 100 (maximum).  */
  
