$OpenBSD: patch-libao2_ao_sun_c,v 1.4 2008/02/08 17:32:41 jakemsr Exp $
--- libao2/ao_sun.c.orig	Sun Oct  7 12:49:27 2007
+++ libao2/ao_sun.c	Mon Feb  4 05:07:06 2008
@@ -102,6 +102,7 @@ static int af2sunfmt(int format)
 // sample counter information
 static int realtime_samplecounter_available(char *dev)
 {
+#ifdef __svr4__
     int fd = -1;
     audio_info_t info;
     int rtsc_ok = RTSC_DISABLED;
@@ -217,6 +218,9 @@ error:
     }
 
     return rtsc_ok;
+#else
+    return RTSC_DISABLED;
+#endif
 }
 
 
@@ -440,7 +444,7 @@ static int control(int cmd,void *arg){
 		else
 		    info.play.balance = (vol->right - vol->left + volume) * AUDIO_RIGHT_BALANCE / (2*volume);
 	    }
-#if !defined (__OpenBSD__) && !defined (__NetBSD__)
+#if !defined (__NetBSD__)
 	    info.output_muted = (volume == 0);
 #endif
 	    ioctl( fd,AUDIO_SETINFO,&info );
@@ -566,11 +570,20 @@ static int init(int rate,int channels,int format,int f
     ao_data.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate;
     ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
 
+#if defined(__OpenBSD__) || defined(__NetBSD__)
     AUDIO_INITINFO(&info);
+    info.blocksize = ao_data.outburst;
+    ioctl (audio_fd, AUDIO_SETINFO, &info);
+#endif
+#ifdef __svr4__
+    AUDIO_INITINFO(&info);
     info.play.samples = 0;
     info.play.eof = 0;
     info.play.error = 0;
     ioctl (audio_fd, AUDIO_SETINFO, &info);
+#else
+    ioctl (audio_fd, AUDIO_FLUSH);
+#endif
 
     queued_bursts = 0;
     queued_samples = 0;
@@ -607,9 +620,11 @@ static void reset(void){
 	 : AUDIO_PRECISION_8);
     info.play.channels = ao_data.channels;
     info.play.sample_rate = ao_data.samplerate;
+#ifdef __svr4__
     info.play.samples = 0;
     info.play.eof = 0;
     info.play.error = 0;
+#endif
     ioctl (audio_fd, AUDIO_SETINFO, &info);
     queued_bursts = 0;
     queued_samples = 0;
@@ -636,7 +651,11 @@ static void audio_resume(void)
 
 // return: how many bytes can be played without blocking
 static int get_space(void){
+#if defined(__OpenBSD__)
+    audio_bufinfo_t ab;
+#else
     audio_info_t info;
+#endif
 
     // check buffer
 #ifdef HAVE_AUDIO_SELECT
@@ -651,14 +670,22 @@ static int get_space(void){
     }
 #endif
 
+#if defined(__OpenBSD__)
+    ioctl(audio_fd, AUDIO_GETPRINFO, &ab);
+    if (ab.hiwat * ab.blksize - ab.seek < ao_data.outburst)
+	return 0;
+    else
+	return ao_data.outburst;
+#else
     ioctl(audio_fd, AUDIO_GETINFO, &info);
-#if !defined (__OpenBSD__) && !defined(__NetBSD__)
+#if !defined(__NetBSD__)
     if (queued_bursts - info.play.eof > 2)
 	return 0;
     return ao_data.outburst;
 #else
     return info.hiwat * info.blocksize - info.play.seek;
 #endif
+#endif  // __OpenBSD__
 
 }
 
@@ -666,6 +693,16 @@ static int get_space(void){
 // it should round it down to outburst*n
 // return: number of bytes played
 static int play(void* data,int len,int flags){
+#ifdef __OpenBSD__
+    if(len==0)
+        return len;
+    if(len>ao_data.outburst || !(flags & AOPLAY_FINAL_CHUNK)) {
+        len/=ao_data.outburst;
+        len*=ao_data.outburst;
+    }
+    len=write(audio_fd,data,len);
+    return len;
+#else
     if (len < ao_data.outburst) return 0;
     len /= ao_data.outburst;
     len *= ao_data.outburst;
@@ -679,16 +716,19 @@ static int play(void* data,int len,int flags){
 	    queued_bursts ++;
     }
     return len;
+#endif
 }
 
 
 // return: delay in seconds between first and last sample in buffer
 static float get_delay(void){
-    audio_info_t info;
-    ioctl(audio_fd, AUDIO_GETINFO, &info);
 #if defined (__OpenBSD__) || defined(__NetBSD__)
-    return (float) info.play.seek/ (float)byte_per_sec ;
+    u_long bytes;
+    ioctl(audio_fd, AUDIO_WSEEK, &bytes);
+    return (float) bytes/ (float)byte_per_sec ;
 #else
+    audio_info_t info;
+    ioctl(audio_fd, AUDIO_GETINFO, &info);
     if (info.play.samples && enable_sample_timing == RTSC_ENABLED)
 	return (float)(queued_samples - info.play.samples) / (float)ao_data.samplerate;
     else
