changeset 1038:b36fb1ae4b53

applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
author arpi_esp
date Tue, 05 Jun 2001 18:40:44 +0000
parents 2767682b85de
children 881b949b6c68
files DOCS/SOLARIS TOOLS/cpuinfo.c aviheader.c cfg-mplayer.h configure dec_audio.c libao2/Makefile libao2/ao_alsa5.c libao2/ao_null.c libao2/ao_oss.c libao2/ao_sdl.c libao2/audio_out.c libao2/audio_out.h libao2/audio_out_internal.h libvo/Makefile libvo/vo_sdl.c libvo/x11_common.c linux/getch2.c loader/stubs.s loader/win32.c mixer.c mixer.h mplayer.c stream.c vcd_read.h vcd_read_fbsd.h version.sh
diffstat 27 files changed, 839 insertions(+), 274 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DOCS/SOLARIS	Tue Jun 05 18:40:44 2001 +0000
@@ -0,0 +1,5 @@
+Notes for Solaris users
+=======================
+
+1. To build the package you will need GNU make (gmake, /opt/sfw/gmake), 
+native Solaris make will not work.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TOOLS/cpuinfo.c	Tue Jun 05 18:40:44 2001 +0000
@@ -0,0 +1,195 @@
+
+#include <stdio.h>
+#include <sys/time.h>
+
+#ifdef M_UNIX
+typedef long long int64_t;
+#define	MISSING_USLEEP
+#else
+#include <inttypes.h>
+#endif
+
+
+typedef struct cpuid_regs {
+	unsigned int eax;
+	unsigned int ebx;
+	unsigned int ecx;
+	unsigned int edx;
+} cpuid_regs_t;
+
+static cpuid_regs_t
+cpuid(int func) {
+	cpuid_regs_t regs;
+#define	CPUID	".byte 0x0f, 0xa2; "
+	asm("movl %4,%%eax; " CPUID
+	    "movl %%eax,%0; movl %%ebx,%1; movl %%ecx,%2; movl %%edx,%3"
+		: "=m" (regs.eax), "=m" (regs.ebx), "=m" (regs.ecx), "=m" (regs.edx)
+		: "g" (func)
+		: "%eax", "%ebx", "%ecx", "%edx");
+	return regs;
+}
+
+
+static int64_t
+rdtsc(void)
+{
+	unsigned int i, j;
+#define	RDTSC	".byte 0x0f, 0x31; "
+	asm(RDTSC : "=a"(i), "=d"(j) : );
+	return ((int64_t)j<<32) + (int64_t)i;
+}
+
+
+static void
+store32(char *d, unsigned int v)
+{
+	d[0] =  v        & 0xff;
+	d[1] = (v >>  8) & 0xff;
+	d[2] = (v >> 16) & 0xff;
+	d[3] = (v >> 24) & 0xff;
+}
+
+
+int
+main(int argc, char **argv)
+{
+	cpuid_regs_t regs, regs_ext;
+	char idstr[13];
+	unsigned max_cpuid;
+	unsigned max_ext_cpuid;
+	unsigned int amd_flags;
+	char *model_name = "Unknown CPU";
+	int i;
+	char processor_name[49];
+
+	regs = cpuid(0);
+	max_cpuid = regs.eax;
+	/* printf("%d CPUID function codes\n", max_cpuid+1); */
+
+	store32(idstr+0, regs.ebx);
+	store32(idstr+4, regs.edx);
+	store32(idstr+8, regs.ecx);
+	idstr[12] = 0;
+	printf("vendor_id\t: %s\n", idstr); 
+
+	if (strcmp(idstr, "GenuineIntel") == 0)
+	    model_name = "Unknown Intel CPU";
+	else if (strcmp(idstr, "AuthenticAMD") == 0)
+	    model_name = "Unknown AMD CPU";
+
+	regs_ext = cpuid((1<<31) + 0);
+	max_ext_cpuid = regs_ext.eax;
+	if (max_ext_cpuid >= (1<<31) + 1) {
+	    regs_ext = cpuid((1<<31) + 1);
+	    amd_flags = regs_ext.edx;
+
+	    if (max_ext_cpuid >= (1<<31) + 4) {
+		for (i = 2; i <= 4; i++) {
+		    regs_ext = cpuid((1<<31) + i);
+		    store32(processor_name + (i-2)*16, regs_ext.eax);
+		    store32(processor_name + (i-2)*16 + 4, regs_ext.ebx);
+		    store32(processor_name + (i-2)*16 + 8, regs_ext.ecx);
+		    store32(processor_name + (i-2)*16 + 12, regs_ext.edx);
+		}
+		processor_name[48] = 0;
+		model_name = processor_name;
+	    }
+	} else {
+	    amd_flags = 0;
+	}
+
+	if (max_cpuid >= 1) {
+		static struct {
+			int bit;
+			char *desc;;
+			char *description;
+		} cap[] = {
+			{ 0,  "fpu",   "Floating-point unit on-chip" },
+			{ 1,  "vme",   "Virtual Mode Enhancements" },
+			{ 2,  "de",    "Debugging Extension" },
+			{ 3,  "pse",   "Page Size Extension" },
+			{ 4,  "tsc",   "Time Stamp Counter" },
+			{ 5,  "msr",   "Pentium Processor MSR" },
+			{ 6,  "pae",   "Physical Address Extension" },
+			{ 7,  "mce",   "Machine Check Exception" },
+			{ 8,  "cx8",   "CMPXCHG8B Instruction Supported" },
+			{ 9,  "apic",  "On-chip CPIC Hardware Enabled" },
+			{ 11, "sep",   "SYSENTER and SYSEXIT" },
+			{ 12, "mtrr",  "Memory Type Range Registers" },
+			{ 13, "pge",   "PTE Global Bit" },
+			{ 14, "mca",   "Machine Check Architecture" },
+			{ 15, "cmov",  "Conditional Move/Compare Instruction" },
+			{ 16, "pat",   "Page Attribute Table" },
+			{ 17, "pse",   "Page Size Extension" },
+			{ 18, "psn",   "Processor Serial Number" },
+			{ 19, "cflsh", "CFLUSH instruction" },
+			{ 21, "ds",    "Debug Store" },
+			{ 22, "acpi",  "Thermal Monitor and Clock Ctrl" },
+			{ 23, "mmx",   "MMX Technology" },
+			{ 24, "fxsr",  "FXSAVE/FXRSTOR" },
+			{ 25, "sse",   "SSE Extensions" },
+			{ 26, "sse2",  "SSE2 Extensions" },
+			{ 27, "ss",    "Self Snoop" },
+			{ 29, "tm",    "Therm. Monitor" },
+			{ -1 }
+		};
+		static struct {
+			int bit;
+			char *desc;;
+			char *description;
+		} cap_amd[] = {
+		    	{ 22, "mmxext","MMX Technology (AMD Extensions)" },
+			{ 30, "3dnowext","3Dnow! Extensions" },
+			{ 31, "3dnow", "3Dnow!" },
+			{ -1 }
+		};
+		int i;
+
+		regs = cpuid(1);
+		printf("cpu family\t: %d\n"
+		       "model\t\t: %d\n"
+		       "stepping\t: %d\n" ,
+			(regs.eax >>  8) & 0xf,
+			(regs.eax >>  4) & 0xf,
+			 regs.eax        & 0xf);
+		
+		printf("flags\t\t:");
+		for (i = 0; cap[i].bit >= 0; i++) {
+			if (regs.edx & (1 << cap[i].bit)) {
+				printf(" %s", cap[i].desc);
+			}
+		}
+		for (i = 0; cap_amd[i].bit >= 0; i++) {
+			if (amd_flags & (1 << cap_amd[i].bit)) {
+				printf(" %s", cap_amd[i].desc);
+			}
+		}
+		printf("\n");
+
+		if (regs.edx & (1 << 4)) {
+			int64_t tsc_start, tsc_end;
+			struct timeval tv_start, tv_end;
+			int usec_delay;
+
+			tsc_start = rdtsc();
+			gettimeofday(&tv_start, NULL);
+#ifdef	MISSING_USLEEP
+			sleep(1);
+#else
+			usleep(100000);
+#endif
+			tsc_end = rdtsc();
+			gettimeofday(&tv_end, NULL);
+
+			usec_delay = 1000000 * (tv_end.tv_sec - tv_start.tv_sec)
+				+ (tv_end.tv_usec - tv_start.tv_usec);
+
+			printf("cpu MHz\t\t: %.3f\n", 
+				(double)(tsc_end-tsc_start) / usec_delay);
+		}
+	}
+
+	printf("model name\t: %s\n", model_name);
+
+	exit(0);
+}
--- a/aviheader.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/aviheader.c	Tue Jun 05 18:40:44 2001 +0000
@@ -111,10 +111,15 @@
         }
       } else
       if(last_fccType==streamtypeAUDIO){
-        sh_audio->wf=calloc((chunksize<sizeof(WAVEFORMATEX))?sizeof(WAVEFORMATEX):chunksize,1);
+	int wf_size = chunksize<sizeof(WAVEFORMATEX)?sizeof(WAVEFORMATEX):chunksize;
+        sh_audio->wf=calloc(wf_size,1);
 //        sh_audio->wf=malloc(chunksize); memset(sh_audio->wf,0,chunksize);
         if(verbose>=1) printf("found 'wf', %d bytes of %d\n",chunksize,sizeof(WAVEFORMATEX));
         stream_read(demuxer->stream,(char*) sh_audio->wf,chunksize);
+	if (sh_audio->wf->cbSize != 0 &&
+	    wf_size < sizeof(WAVEFORMATEX)+sh_audio->wf->cbSize) {
+	    sh_audio->wf=realloc(sh_audio->wf, sizeof(WAVEFORMATEX)+sh_audio->wf->cbSize);
+	}
         chunksize=0;
         if(verbose>=1) print_wave_header(sh_audio->wf);
 //        if(demuxer->audio->id==-1) demuxer->audio->id=stream_id;
--- a/cfg-mplayer.h	Tue Jun 05 16:52:51 2001 +0000
+++ b/cfg-mplayer.h	Tue Jun 05 18:40:44 2001 +0000
@@ -40,10 +40,10 @@
 	{"ao", &audio_driver, CONF_TYPE_STRING, 0, 0, 0},
 	{"dsp", &dsp, CONF_TYPE_STRING, 0, 0, 0},
         {"mixer", &mixer_device, CONF_TYPE_STRING, 0, 0, 0},
+        {"master", &mixer_usemaster, CONF_TYPE_FLAG, 0, 0, 1},
 #ifdef HAVE_X11
 	{"display", &mDisplayName, CONF_TYPE_STRING, 0, 0, 0},
 #endif
-        {"master", &mixer_usemaster, CONF_TYPE_FLAG, 0, 0, 1},
 	{"osdlevel", &osd_level, CONF_TYPE_INT, CONF_RANGE, 0, 2 },
 #ifdef HAVE_LIBCSS
         {"dvdauth", &dvd_auth_device, CONF_TYPE_STRING, 0, 0, 0},
--- a/configure	Tue Jun 05 16:52:51 2001 +0000
+++ b/configure	Tue Jun 05 18:40:44 2001 +0000
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 #
 # MPlayer configurator.   (C) 2000 Pontscho/fresh!mindworkz
@@ -82,6 +82,13 @@
 # --
 
 
+# Check how echo works in this /bin/sh
+case `echo -n` in
+-n)     _echo_n=   _echo_c='\c';;
+*)      _echo_n=-n _echo_c=;;
+esac
+
+
 # LGB: Help moved here.
 
 if [ "$1" = "--help" -o "$1" = "-help" -o "$1" = "-h" ]; then
@@ -117,8 +124,10 @@
 	--enable-xmmp	        use XMMP audio drivers
 	--enable-lirc	        enable LIRC (remote control) support
 
-        --disable-alsa          disable alsa support [autodetect]
+        --disable-oss           disable OSS sound support [autodetect]
+        --disable-alsa          disable alsa sound support [autodetect]
 	--disable-esd           disable esd sound support [autodetect]
+        --disable-sun           disable Sun sound support [autodetect]
 		
 	--disable-gcc-checking  disable gcc version checking
 
@@ -179,6 +188,7 @@
 # ---  Check for C compiler:
 
 _cc=gcc
+_as=as
 _x11=auto
 
 _x11libdir=
@@ -200,6 +210,9 @@
   --cc=*)
         _cc=`echo $ac_option | cut -d '=' -f 2`
         ;;
+  --as=*)
+        _as=`echo $ac_option | cut -d '=' -f 2`
+        ;;
   --disable-gcc-checking)
         _skip_cc_check=yes
 	;;
@@ -221,13 +234,15 @@
  esac
 done
 
+# ---
+
 # Checking CC version...
 # Q: what's with egcs, pgcc? - Atmos
 # A: same as with agcc! These compilers always were introduced as experimental
 # ones. Now gcc-3.0 should introduce all features of these compilers.
 # Since 3.0 is almost released we don't need to support them. - Nick 05 jun 2001
 if test "$_skip_cc_check" != "yes"; then
-echo -n "Checking version of $_cc ... "
+echo $_echo_n "Checking version of $_cc ... $_echo_c"
 cc_version=`$_cc -v 2>&1 | sed -n 's/^.*version \([aegcygnustp-]*[0-9.]*\).*$/\1/p'`
 case $cc_version in
     '') cc_version="v. ?.??, bad"; cc_verc_fail=yes;;
@@ -236,7 +251,7 @@
     *) cc_version="$cc_version, bad"; cc_verc_fail=yes;;
 esac
 echo "$cc_version"
-if ! test -z "$cc_verc_fail"; then
+if [ ! -z "$cc_verc_fail" ] ; then
 echo "Please downgrade(upgrade) gcc compiler to gcc-2.95.2+ or gcc-3.0+ version"
 exit
 fi
@@ -245,15 +260,26 @@
 fi
 # ---
 
-pname=`cat /proc/cpuinfo | grep 'model name' | cut -d ':' -f 2`
-pparam=`cat /proc/cpuinfo | grep 'features' | cut -d ':' -f 2`
-if [ -z "$pparam" ]; then
-  pparam=`cat /proc/cpuinfo | grep 'flags' | cut -d ':' -f 2`
+
+if [ -r /proc/cpuinfo ]; then
+	# linux with /proc mounted, extract cpu information from it
+	_cpuinfo="cat /proc/cpuinfo"
+else
+	# all other OS try to extract cpu information from a small helper
+	# program TOOLS/cpuinfo instead
+	$_cc -o TOOLS/cpuinfo TOOLS/cpuinfo.c
+	_cpuinfo="TOOLS/cpuinfo"
 fi
-pvendor=`cat /proc/cpuinfo | grep 'vendor_id' | cut -d ':' -f 2  | cut -d ' ' -f 2`
-pfamily=`cat /proc/cpuinfo | grep 'cpu family' | cut -d ':' -f 2 | cut -d ' ' -f 2`
-pmodel=`cat /proc/cpuinfo |grep -v 'model name'| grep "model" | cut -d ':' -f 2 | cut -d ' ' -f 2`
-pstepping=`cat /proc/cpuinfo | grep 'stepping' | cut -d ':' -f 2 | cut -d ' ' -f 2`
+
+pname=`$_cpuinfo | grep 'model name' | cut -d ':' -f 2`
+pparam=`$_cpuinfo | grep 'features' | cut -d ':' -f 2`
+if [ -z "$pparam" ]; then
+  pparam=`$_cpuinfo | grep 'flags' | cut -d ':' -f 2`
+fi
+pvendor=`$_cpuinfo | grep 'vendor_id' | cut -d ':' -f 2  | cut -d ' ' -f 2`
+pfamily=`$_cpuinfo | grep 'cpu family' | cut -d ':' -f 2 | cut -d ' ' -f 2`
+pmodel=`$_cpuinfo | grep -v 'model name' | grep 'model' | cut -d ':' -f 2 | cut -d ' ' -f 2`
+pstepping=`$_cpuinfo | grep 'stepping' | cut -d ':' -f 2 | cut -d ' ' -f 2`
 
 _mmx=no
 _mmx2=no
@@ -276,7 +302,8 @@
 _dga=no
 _dga2=no
 _svga=no
-_fbdev=yes
+_fbdev=no
+[ x`uname -s` = xLinux ] && _fbdev=yes
 _lirc=no
 _css=no
 _dshow=yes
@@ -287,6 +314,7 @@
 
 _gllib=
 _sdllib=
+_sdlcflags=
 _xvlib=
 _x11lib=
 
@@ -448,39 +476,39 @@
 #echo -n "Checking your GCC CPU optimalization abilities: "
 if [ "$proc" = "k7" ]; then
 #	echo -n "trying k7  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=athlon
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=athlon
 fi
 if [ "$proc" = "athlon" ]; then
 #	echo -n "trying athlon  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=k6
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=k6
 fi
 if [ "$proc" = "k6" ]; then
 #	echo -n "trying k6  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=k5
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=k5
 fi
 if [ "$proc" = "k5" ]; then
 #	echo -n "trying k5  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=pentium
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=pentium
 fi
 if [ "$proc" = "i686" ]; then
 #	echo -n "trying i686  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=pentiumpro
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=pentiumpro
 fi
 if [ "$proc" = "pentiumpro" ]; then
 #	echo -n "trying pentiumpro  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=pentium
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=pentium
 fi
 if [ "$proc" = "pentium" ]; then
 #	echo -n "trying pentium  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=i486
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=i486
 fi
 if [ "$proc" = "i486" ]; then
 #	echo -n "trying i486  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=i386
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=i386
 fi
 if [ "$proc" = "i386" ]; then
 #	echo -n "trying i386  "
-	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc &> /dev/null || proc=error
+	$_cc $TMPC -o $TMPO -march=$proc -mcpu=$proc > /dev/null 2>&1 || proc=error
 fi
 if [ "$proc" = "error" ]; then
 	echo
@@ -491,16 +519,17 @@
 #echo "DONE (${proc})."
 
 
-$_cc $TMPC -o $TMPO -lvgagl -lvga &> /dev/null && _svga=yes
+$_cc $TMPC -o $TMPO -lvgagl -lvga > /dev/null 2>&1 && _svga=yes
 
-$_cc $TMPC -o $TMPO -lpthread &> /dev/null || \
+$_cc $TMPC -o $TMPO -lpthread > /dev/null 2>&1 || \
  { echo "Lib pthread not found."; rm -f $TMPC $TMPO $TMPS ; exit 1; }
 
 # Atmosfear: added SDL versioncheck and autodetect; removed warnings.
 _sdl=no
-if $_cc $TMPC -o $TMPO `$_sdlconfig --libs` &> /dev/null ; then
-	if test `$_sdlconfig --version | sed s/[^0-9]//g` -gt 116 ; then
-		if test `$_sdlconfig --version | sed s/[^0-9]//g` -lt 121 ; then
+if $_cc `$_sdlconfig --cflags` $TMPC -o $TMPO `$_sdlconfig --libs` > /dev/null 2>&1 ; then
+	_sdlversion=`$_sdlconfig --version | sed 's/[^0-9]//g'`
+	if test "$_sdlversion" -gt 116 ; then
+		if test "$_sdlversion" -lt 121 ; then
 
 			_sdlbuggy='#define BUGGY_SDL'
 		else	
@@ -514,16 +543,16 @@
 
 # Atmosfear: added libcss autodetect
 _css=no
-if test -e "/usr/local/lib/libcss.so" ; then
+if test -s "/usr/local/lib/libcss.so" ; then
 	_csslibdir="/usr/local/lib/"
-	if test -e "/usr/local/include/css.h" ; then
+	if test -s "/usr/local/include/css.h" ; then
 		_cssincdir="/usr/local/include"
 		_css=yes
 	fi	
 else
-	if test -e "/usr/lib/libcss.so" ; then
+	if test -s "/usr/lib/libcss.so" ; then
 		_csslibdir="/usr/lib/"
-		if test -e "/usr/include/css.h" ; then
+		if test -s "/usr/include/css.h" ; then
 			_cssincdir="/usr/include/"
 			_css=yes
 		fi	
@@ -531,16 +560,17 @@
 fi
 	
 _termcap=no
-$_cc $TMPC -o $TMPO -ltermcap &> /dev/null && _termcap=yes
+$_cc $TMPC -o $TMPO -ltermcap > /dev/null 2>&1 && _termcap=yes
 
 _png=no
-$_cc $TMPC -o $TMPO -lpng -lz -lm &> /dev/null && _png=yes
+$_cc $TMPC -o $TMPO -lpng -lz -lm > /dev/null 2>&1 && _png=yes
 
 _binutils=no
-as libac3/downmix/downmix_i386.S -o $TMPO &> /dev/null && _binutils=yes
+$_as libac3/downmix/downmix_i386.S -o $TMPO > /dev/null 2>&1 && _binutils=yes
 
 # echo binutils: $_binutils
 
+
 # ----------- Check X11 and related libs (GL, Xxf86vm, Xv, DGA) --------------
 
 # for Solaris:
@@ -549,22 +579,22 @@
 
 if [ $_x11 = auto ]; then
   _x11=no
-  $_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext $_socklib &> /dev/null && _x11=yes
+  $_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext $_socklib > /dev/null 2>&1 && _x11=yes
 fi
 
 if [ $_x11 = yes ]; then
 
-$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lXdpms $_socklib &> /dev/null && _xdpms=yes
-$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lXv $_socklib &> /dev/null && _xv=yes
-$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lXxf86vm $_socklib &> /dev/null && _vm=yes
+$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lXdpms $_socklib > /dev/null 2>&1 && _xdpms=yes
+$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lXv $_socklib > /dev/null 2>&1 && _xv=yes
+$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lXxf86vm $_socklib > /dev/null 2>&1 && _vm=yes
 
-$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lGL $_socklib &> /dev/null && _gl=yes
+$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lGL $_socklib > /dev/null 2>&1 && _gl=yes
 
 cat > $TMPC << EOF
 #include <GL/gl.h>
 int main( void ) { return 0; }
 EOF
-$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lGL $_socklib &> /dev/null || \
+$_cc $TMPC -o $TMPO $_x11libdir -lX11 -lXext -lGL $_socklib > /dev/null 2>&1 || \
  { _gl=no; echo "GL includes not found!";}
 
 cat > $TMPC << EOF
@@ -574,7 +604,7 @@
 int main (void) { return 0;}
 EOF
 
-$_cc $TMPC -o $TMPO -L/usr/X11R6/lib -L/usr/X11/lib -lX11 -lXext -lXxf86dga -lXxf86vm $_socklib &> /dev/null && _dga=yes
+$_cc $TMPC -o $TMPO -L/usr/X11R6/lib -L/usr/X11/lib -lX11 -lXext -lXxf86dga -lXxf86vm $_socklib > /dev/null 2>&1 && _dga=yes
 # Note: the -lXxf86vm library is the VideoMode extension and though it's
 # not needed for DGA, AFAIK every distribution packages together with DGA
 # stuffs named 'X extensions' or something similar. This check can be usefull
@@ -590,12 +620,22 @@
 EOF
 
 _dga2=no
-$_cc $TMPC -o $TMPO -L/usr/X11R6/lib -L/usr/X11/lib -lX11 -lXext -lXxf86dga -lXxf86vm $_socklib &> /dev/null && _dga2=yes
+$_cc $TMPC -o $TMPO -L/usr/X11R6/lib -L/usr/X11/lib -lX11 -lXext -lXxf86dga -lXxf86vm $_socklib > /dev/null 2>&1 && _dga2=yes
 
 fi
 
 rm -f $TMPC $TMPO
 
+
+# ---
+# try to detect type of audio supported on this machine
+
+_oss_audio=no
+[ -c /dev/dsp ] && _oss_audio=yes
+
+_sun_audio=no
+[ -c /dev/audio -a -c /dev/audioctl ] && _sun_audio=yes
+
 # ---
 
 cat > $TMPC << EOF
@@ -606,9 +646,9 @@
 
 _alsaver='not found'
 $_cc -o $TMPO -lasound $TMPC 2> /dev/null || _alsa=no
-[ $_alsa == 'yes' ] && $TMPO && { _alsaver='0.5.x'; }
+[ $_alsa = 'yes' ] && $TMPO && { _alsaver='0.5.x'; }
 
-if [ "$_alsaver" == 'not found' ]; then
+if [ "$_alsaver" = 'not found' ]; then
 cat > $TMPC << EOF
 #include <sys/asoundlib.h>
 #include <sys/soundcard.h>
@@ -617,7 +657,7 @@
 
 _alsaver='not found'
 $_cc -o $TMPO -lasound $TMPC 2> /dev/null || _alsa=no
-[ $_alsa == 'yes' ] && $TMPO && { _alsaver='0.9.x'; }
+[ $_alsa = 'yes' ] && $TMPO && { _alsaver='0.9.x'; }
 fi
 
 # ---
@@ -645,7 +685,7 @@
   	_debug='-g'
 	;;
   --enable-debug=*)
-        _debug=`echo -n '-g'; echo $ac_option | cut -d '=' -f 2`
+        _debug=`echo '-g'; echo $ac_option | cut -d '=' -f 2`
 	;;
   --enable-css)
 	_css=yes
@@ -717,6 +757,12 @@
   --enable-xmmp)
 	_xmmp=yes
 	;;
+  --enable-ossaudio)
+  	_oss_audio=yes
+	;;
+  --enable-sunaudio)
+  	_sun_audio=yes
+	;;
   --enable-lirc)
 	_lirc=yes
 	;;
@@ -807,6 +853,12 @@
   --disable-esd)
         _esd=no
         ;;
+  --disable-ossaudio)
+  	_oss_audio=no
+	;;
+  --disable-sunaudio)
+  	_sun_audio=no
+	;;
   --with-win32libdir=*)
         _win32libdir=`echo $ac_option | cut -d '=' -f 2`
 	_win32libdirnotify=no
@@ -832,21 +884,27 @@
         ;;
   --cc=*)
 	;;
+  --as=*)
+	;;
  esac
 done
 
-# Checking assembler (as) compatibility...
-as_version=`as --version 2>&1 | sed -n 's/^.*assembler \([0-9.]*\).*$/\1/p'`
-echo -n "Checking assembler (as) ... $as_version, "
+# Checking assembler (_as) compatibility...
+as_version=`$_as --version 2>&1 | sed -n 's/^.*assembler \([0-9.]*\).*$/\1/p'`
+echo $_echo_n "Checking assembler (as) ... $as_version, $_echo_c"
 _pref_as_version='2.9.1'
 ### this test disabled, see _binutils test above!  --A'rpi
 # cat > astest.S <<EOF
 # filds -2(%ebp)
 # EOF
-# as astest.S -o astest.o &> /dev/null || as_verc_fail=yes
+# $_as astest.S -o astest.o > /dev/null 2>&1 || as_verc_fail=yes
+
+cat > $TMPS <<EOF
+nop
+EOF
 
 if [ $_mmx = 'yes' ]; then
-cat > $TMPS <<EOF
+cat >> $TMPS <<EOF
 emms
 EOF
 fi
@@ -885,7 +943,7 @@
 #xorpd %xmm0, %xmm0
 #EOF
 #fi
-as $TMPS -o $TMPO &> /dev/null || as_verc_fail=yes
+$_as $TMPS -o $TMPO > /dev/null 2>&1 || as_verc_fail=yes
 rm -f $TMPS $TMPO $TMPC
 
 if test "$as_verc_fail" != "yes"; then
@@ -900,7 +958,7 @@
 _k_verc_problem=no
 system_name=`uname -s 2>&1`
 kernel_version=`uname -r 2>&1`
-echo -n "Checking $system_name kernel version ... "
+echo $_echo_n "Checking $system_name kernel version ... $_echo_c"
 case $kernel_version in
     '') kernel_version="?.??"; _k_verc_fail=yes;;
     [0-1].[0-99].[0-99]|2.[0-3].[0-99])
@@ -909,7 +967,7 @@
 if [ $_k_verc_problem = 'yes' ] && [ $_sse = 'yes' ]; then
 _k_verc_fail=yes
 fi
-if ! test -z "$_k_verc_fail"; then
+if [ ! -z "$_k_verc_fail" ]; then
 echo "$kernel_version, fail"
 echo "WARNING! You want to run mplayer on this system then be prepared for problems"
 else
@@ -946,12 +1004,14 @@
 echo "Checking for Xf86VM ... $_vm"
 echo "Checking for SVGAlib ... $_svga"
 echo "Checking for FBDev ... $_fbdev"
+echo "Checking for OSS Audio ... $_oss_audio"
+echo "Checking for ALSA Audio ... $_alsaver"
+echo "Checking for ESD Audio ... $_esd"
+echo "Checking for Sun Audio ... $_sun_audio"
 echo "Checking for DeCSS support ... $_css"
 echo "Checking for PNG support ... $_png"
 echo "Checking for DirectShow ... $_dshow"
 echo "Checking for fastmemcpy ... $_fastmemcpy"
-echo "Checking for alsa ... $_alsaver"
-echo "Checking for esd ... $_esd"
 # write conf files.
 
 if [ $_gl = yes ]; then
@@ -1006,6 +1066,7 @@
 
 if [ $_sdl = yes ]; then
   _sdllib=`$_sdlconfig --libs` 
+  _sdlcflags=`$_sdlconfig --cflags` 
 fi
 
 if [ $_dga = yes ]; then
@@ -1051,18 +1112,32 @@
 
 _alsa5='#undef HAVE_ALSA5'
 _alsa9='#undef HAVE_ALSA9'
-if [ $_alsa == 'yes' ]; then
- [ $_alsaver == '0.5.x' ] && { _aosrc="$_aosrc ao_alsa5.c"; _alsa5='#define HAVE_ALSA5'; _alsalib='-lasound'; }
- # [ $_alsaver == '0.9.x' ] && { _aosrc="$_aosrc ao_alsa9.c"; _alsa9='#define HAVE_ALSA9'; _alsalib='-lasound'; }
+if [ $_alsa = 'yes' ]; then
+ [ $_alsaver = '0.5.x' ] && { _aosrc="$_aosrc ao_alsa5.c"; _alsa5='#define HAVE_ALSA5'; _alsalib='-lasound'; }
+ # [ $_alsaver = '0.9.x' ] && { _aosrc="$_aosrc ao_alsa9.c"; _alsa9='#define HAVE_ALSA9'; _alsalib='-lasound'; }
 fi
   
 _esdd='#undef HAVE_ESD'
-#if [ $_esd == 'yes' ]; then
+#if [ $_esd = 'yes' ]; then
 # _esdd='#define HAVE_ESD'
 # _aosrc="$_aosrc ao_esd.c"
 # _esdlib='-lesd'
 #fi
 
+if [ "$_oss_audio" = "yes" ]; then
+ _ossaudio='#define USE_OSS_AUDIO'
+ _aosrc="$_aosrc ao_oss.c"
+else
+ _ossaudio='#undef USE_OSS_AUDIO'
+fi
+
+if [ "$_sun_audio" = "yes" ]; then
+ _sunaudio='#define USE_SUN_AUDIO'
+ _aosrc="$_aosrc ao_sun.c"
+else
+ _sunaudio='#undef USE_SUN_AUDIO'
+fi
+
 # Checking for CFLAGS
 if [ "$_profile" != "" ] || [ "$_debug" != "" ]; then
  CFLAGS="-O2 -march=$proc -mcpu=$proc $_debug $_profile"
@@ -1089,6 +1164,8 @@
 LIRC_LIBS = $_lirclibs
 CSS_LIB = $_csslib
 CSS_INC = $_cssinc
+SDL_LIB = $_sdllib
+SDL_INC = $_sdlcflags
 WIN32_PATH=-DWIN32_PATH=\"$_win32libdir\"
 DS_DEP = $_dshowdep
 DS_LIB = $_dshowlib
@@ -1288,6 +1365,10 @@
    You can still change it runtime using -afm 1 (mpg123) or -afm 4 (l3codeca)*/
 $_mpg123
 
+/* AUDIO Support */
+$_ossaudio
+$_sunaudio
+
 /* XMMP support: (test code) */
 $_xmmpaudio
 #define LIBDIR "/usr/local/lib"
--- a/dec_audio.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/dec_audio.c	Tue Jun 05 18:40:44 2001 +0000
@@ -2,19 +2,21 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#ifdef __sun
+#include "config.h"
+
+#ifdef	USE_OSS_AUDIO
+#include <sys/soundcard.h>
+#endif
+#ifdef	USE_SUN_AUDIO
+#include <sys/types.h>
 #include <sys/audioio.h>
 #define AFMT_MU_LAW     AUDIO_ENCODING_ULAW
 #define AFMT_A_LAW      AUDIO_ENCODING_ALAW
 #define AFMT_S16_LE     AUDIO_ENCODING_LINEAR
 #define AFMT_IMA_ADPCM  AUDIO_ENCODING_DVI
 #define AFMT_U8         AUDIO_ENCODING_LINEAR8
-#else
-#include <sys/soundcard.h>
 #endif
 
-#include "config.h"
-
 extern int verbose; // defined in mplayer.c
 
 #ifdef USE_FAKE_MONO
@@ -40,6 +42,7 @@
 
 #include "loader/DirectShow/DS_AudioDec.h"
 
+
 static sh_audio_t* ac3_audio_sh=NULL;
 
 // AC3 decoder buffer callback:
@@ -169,8 +172,10 @@
     switch(sh_audio->format){ // hardware formats:
     case 0x6:  sh_audio->sample_format=AFMT_A_LAW;break;
     case 0x7:  sh_audio->sample_format=AFMT_MU_LAW;break;
+#if !defined(__NetBSD__)
     case 0x11: sh_audio->sample_format=AFMT_IMA_ADPCM;break;
-#ifndef __sun
+#endif
+#if !defined(__sun) && !defined(__NetBSD__)
     case 0x50: sh_audio->sample_format=AFMT_MPEG;break;
 #endif
 //    case 0x2000: sh_audio->sample_format=AFMT_AC3;
--- a/libao2/Makefile	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/Makefile	Tue Jun 05 18:40:44 2001 +0000
@@ -4,10 +4,10 @@
 LIBNAME = libao2.a
 
 # TODO: moveout ao_sdl.c so it's only used when SDL is detected
-SRCS=audio_out.c ao_oss.c ao_null.c $(OPTIONAL_SRCS)
+SRCS=audio_out.c ao_null.c $(OPTIONAL_SRCS)
 OBJS=$(SRCS:.c=.o)
 
-CFLAGS  = $(OPTFLAGS) -I. -I..
+CFLAGS  = $(OPTFLAGS) -I. -I.. $(SDL_INC)
 # -I/usr/X11R6/include/
 
 .SUFFIXES: .c .o
--- a/libao2/ao_alsa5.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/ao_alsa5.c	Tue Jun 05 18:40:44 2001 +0000
@@ -265,6 +265,18 @@
     }
 }
 
+/* stop playing, keep buffers (for pause) */
+static void audio_pause()
+{
+    /* for now, just call reset(); */
+    reset();
+}
+
+/* resume playing, after audio_pause() */
+static void audio_resume()
+{
+}
+
 /*
     plays 'len' bytes of 'data'
     returns: number of bytes played
--- a/libao2/ao_null.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/ao_null.c	Tue Jun 05 18:40:44 2001 +0000
@@ -46,6 +46,18 @@
 
 }
 
+// stop playing, keep buffers (for pause)
+static void audio_pause()
+{
+    // for now, just call reset();
+    reset();
+}
+
+// resume playing, after audio_pause()
+static void audio_resume()
+{
+}
+
 // return: how many bytes can be played without blocking
 static int get_space(){
 
--- a/libao2/ao_oss.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/ao_oss.c	Tue Jun 05 18:40:44 2001 +0000
@@ -7,11 +7,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#ifdef __sun
-#include <sys/audioio.h>
-#else
 #include <sys/soundcard.h>
-#endif
 
 #include "../config.h"
 
@@ -36,13 +32,8 @@
 // ao_outburst
 // ao_buffersize
 
-#ifdef __sun
-static char *dsp="/dev/audio";
-static int queued_bursts = 0;
-#else
 static char *dsp="/dev/dsp";
 static audio_buf_info zz;
-#endif
 static int audio_fd=-1;
 
 // to set/get/query special features/parameters
@@ -69,22 +60,6 @@
     return 0;
   }
 
-#ifdef __sun
-  {
-    audio_info_t info;
-    ioctl(audio_fd, AUDIO_GETINFO, &info);
-    ioctl(audio_fd, AUDIO_DRAIN, 0);
-    info.play.encoding = ao_format = format;
-    info.play.precision = (format==AUDIO_ENCODING_LINEAR? AUDIO_PRECISION_16:AUDIO_PRECISION_8);
-    info.play.channels = ao_channels = channels;
-    --ao_channels;
-    info.play.sample_rate = ao_samplerate = rate;
-    if(ioctl (audio_fd, AUDIO_SETINFO, &info)<0)
-      printf("audio_setup: your card doesn't support %d Hz samplerate\n",rate);
-    ao_outburst=8192;
-    queued_bursts = 0;
-  }
-#else
   ao_format=format;
   ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_format);
   printf("audio_setup: sample format: 0x%X  (requested: 0x%X)\n",ao_format,format);
@@ -112,7 +87,6 @@
       if(ao_buffersize==-1) ao_buffersize=zz.bytes;
       ao_outburst=zz.fragsize;
   }
-#endif
 
   if(ao_buffersize==-1){
     // Measuring buffer size:
@@ -135,9 +109,6 @@
           printf("Recompile mplayer with #undef HAVE_AUDIO_SELECT in config.h !\n\n");
         return 0;
     }
-#ifdef __sun
-    ioctl(audio_fd, AUDIO_DRAIN, 0);
-#endif
 #endif
   }
 
@@ -161,26 +132,25 @@
 	return;
     }
 
-#ifdef __sun
-  {
-    audio_info_t info;
-    ioctl(audio_fd, AUDIO_GETINFO, &info);
-    ioctl(audio_fd, AUDIO_DRAIN, 0);
-    info.play.encoding = ao_format;
-    info.play.precision = (ao_format==AUDIO_ENCODING_LINEAR? AUDIO_PRECISION_16:AUDIO_PRECISION_8);
-    info.play.channels = ao_channels+1;
-    info.play.sample_rate = ao_samplerate;
-    ioctl (audio_fd, AUDIO_SETINFO, &info);
-    queued_bursts = 0;
-  }
-#else
   ioctl (audio_fd, SNDCTL_DSP_SETFMT, &ao_format);
   ioctl (audio_fd, SNDCTL_DSP_STEREO, &ao_channels);
   ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_samplerate);
-#endif
 
 }
 
+// stop playing, keep buffers (for pause)
+static void audio_pause()
+{
+    // for now, just call reset();
+    reset();
+}
+
+// resume playing, after audio_pause()
+static void audio_resume()
+{
+}
+
+
 // return: how many bytes can be played without blocking
 static int get_space(){
   int playsize=ao_outburst;
@@ -204,14 +174,6 @@
     }
 #endif
 
-#ifdef __sun
-  {
-    audio_info_t info;
-    ioctl(audio_fd, AUDIO_GETINFO, &info);
-    if(queued_bursts - info.play.eof > 2)
-      return 0;
-  }
-#endif
   return ao_outburst;
 }
 
@@ -221,12 +183,6 @@
 static int play(void* data,int len,int flags){
     len/=ao_outburst;
     len=write(audio_fd,data,len*ao_outburst);
-#ifdef __sun
-    if(len>0) {
-      queued_bursts ++;
-      write(audio_fd,data,0);
-    }
-#endif
     return len;
 }
 
@@ -234,14 +190,6 @@
 
 // return: how many unplayed bytes are in the buffer
 static int get_delay(){
-#ifdef __sun
- {
-   int q;
-    audio_info_t info;
-    ioctl(audio_fd, AUDIO_GETINFO, &info);
-    return (queued_bursts - info.play.eof) * ao_outburst;
- }
-#else
   if(audio_delay_method==2){
       // 
       int r=0;
@@ -256,6 +204,5 @@
       audio_delay_method=0; // fallback if not supported
   }
   return ao_buffersize;
-#endif
 }
 
--- a/libao2/ao_sdl.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/ao_sdl.c	Tue Jun 05 18:40:44 2001 +0000
@@ -11,6 +11,7 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 
 #include "audio_out.h"
 #include "audio_out_internal.h"
@@ -57,6 +58,7 @@
 static int full_buffers=0;
 static int buffered_bytes=0;
 
+
 static int write_buffer(unsigned char* data,int len){
   int len2=0;
   int x;
@@ -105,6 +107,23 @@
 #include <SDL/SDL.h>
 #endif
 
+#if	defined(sun) && defined(__svr4__)
+/* setenv is missing on solaris */
+static void setenv(const char *name, const char *val, int _xx)
+{
+  int len  = strlen(name) + strlen(val) + 2;
+  char *env = malloc(len);
+
+  if (env != NULL) {
+    strcpy(env, name);
+    strcat(env, "=");
+    strcat(env, val);
+    putenv(env);
+  }
+}
+#endif
+
+
 // to set/get/query special features/parameters
 static int control(int cmd,int arg){
     return -1;
@@ -196,6 +215,19 @@
 
 }
 
+// stop playing, keep buffers (for pause)
+static void audio_pause()
+{
+    // for now, just call reset();
+    reset();
+}
+
+// resume playing, after audio_pause()
+static void audio_resume()
+{
+}
+
+
 // return: how many bytes can be played without blocking
 static int get_space(){
     return (NUM_BUFS-full_buffers)*BUFFSIZE - buf_write_pos;
--- a/libao2/audio_out.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/audio_out.c	Tue Jun 05 18:40:44 2001 +0000
@@ -5,7 +5,30 @@
 
 #include "audio_out.h"
 
+#ifdef	USE_OSS_AUDIO
 #include <sys/soundcard.h> /* AFMT_* */
+#endif
+
+
+#ifndef	AFMT_U8
+#       define AFMT_MU_LAW              0x00000001
+#       define AFMT_A_LAW               0x00000002
+#       define AFMT_IMA_ADPCM           0x00000004
+#       define AFMT_U8                  0x00000008
+#       define AFMT_S16_LE              0x00000010      /* Little endian signed
+16*/
+#       define AFMT_S16_BE              0x00000020      /* Big endian signed 16
+*/
+#       define AFMT_S8                  0x00000040
+#       define AFMT_U16_LE              0x00000080      /* Little endian U16 */
+#       define AFMT_U16_BE              0x00000100      /* Big endian U16 */
+#       define AFMT_MPEG                0x00000200      /* MPEG (2) audio */
+
+/* 32 bit formats (MSB aligned) formats */
+#       define AFMT_S32_LE              0x00001000
+#       define AFMT_S32_BE              0x00002000
+#endif
+
 
 // there are some globals:
 int ao_samplerate=0;
@@ -15,7 +38,9 @@
 int ao_outburst=OUTBURST; // config.h default
 int ao_buffersize=-1;
 
+#ifdef USE_OSS_AUDIO
 extern ao_functions_t audio_out_oss;
+#endif
 //extern ao_functions_t audio_out_ossold;
 extern ao_functions_t audio_out_null;
 #ifdef HAVE_ALSA5
@@ -32,10 +57,15 @@
 #ifdef HAVE_SDL
 extern ao_functions_t audio_out_sdl;
 #endif
+#ifdef USE_SUN_AUDIO
+extern ao_functions_t audio_out_sun;
+#endif
 
 ao_functions_t* audio_out_drivers[] =
 {
+#ifdef USE_OSS_AUDIO
         &audio_out_oss,
+#endif
         &audio_out_null,
 #ifdef HAVE_ALSA5
 	&audio_out_alsa5,
@@ -51,6 +81,9 @@
 #ifdef HAVE_SDL
         &audio_out_sdl,
 #endif
+#ifdef USE_SUN_AUDIO
+        &audio_out_sun,
+#endif
 	NULL
 };
 
--- a/libao2/audio_out.h	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/audio_out.h	Tue Jun 05 18:40:44 2001 +0000
@@ -43,6 +43,14 @@
          */
         int (*get_delay)();
 
+        /*
+         */
+        void (*pause)();
+
+        /*
+         */
+        void (*resume)();
+
 } ao_functions_t;
 
 // NULL terminated array of all drivers
--- a/libao2/audio_out_internal.h	Tue Jun 05 16:52:51 2001 +0000
+++ b/libao2/audio_out_internal.h	Tue Jun 05 18:40:44 2001 +0000
@@ -8,6 +8,8 @@
 static int get_space();
 static int play(void* data,int len,int flags);
 static int get_delay();
+static void audio_pause();
+static void audio_resume();
 
 #define LIBAO_EXTERN(x) ao_functions_t audio_out_##x =\
 {\
@@ -18,6 +20,8 @@
 	reset,\
 	get_space,\
 	play,\
-	get_delay\
+	get_delay,\
+	audio_pause,\
+	audio_resume\
 };
 
--- a/libvo/Makefile	Tue Jun 05 16:52:51 2001 +0000
+++ b/libvo/Makefile	Tue Jun 05 18:40:44 2001 +0000
@@ -6,7 +6,7 @@
 SRCS=aclib.c osd.c font_load.c rgb15to16mmx.c yuv2rgb_mmx.c yuv2rgb.c video_out.c vo_null.c vo_pgm.c vo_md5.c vo_odivx.c x11_common.c $(OPTIONAL_SRCS)
 OBJS=$(SRCS:.c=.o)
 
-CFLAGS  = $(OPTFLAGS) -I. -I.. -DMPG12PLAY
+CFLAGS  = $(OPTFLAGS) -I. -I.. -DMPG12PLAY $(SDL_INC)
 # -I/usr/X11R6/include/
 
 .SUFFIXES: .c .o
--- a/libvo/vo_sdl.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libvo/vo_sdl.c	Tue Jun 05 18:40:44 2001 +0000
@@ -136,12 +136,31 @@
 	""
 };
 
+
 #ifdef __FreeBSD__
 #include <SDL11/SDL.h>
 #else
 #include <SDL/SDL.h>
 #endif
 
+
+#if	defined(sun) && defined(__svr4__)
+/* setenv is missing on solaris */
+static void setenv(const char *name, const char *val, int _xx)
+{
+    int len  = strlen(name) + strlen(val) + 2;
+    char *env = malloc(len);
+
+    if (env != NULL) {
+	strcpy(env, name);
+	strcat(env, "=");
+	strcat(env, val);
+	putenv(env);
+    }
+}
+#endif
+
+
 #define FS 0x01
 #define VM 0x02
 #define ZOOM 0x04
--- a/libvo/x11_common.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/libvo/x11_common.c	Tue Jun 05 18:40:44 2001 +0000
@@ -176,7 +176,7 @@
  XEvent         Event;
  char           buf[100];
  KeySym         keySym;
- XComposeStatus stat;
+ static XComposeStatus stat;
 // unsigned long  vo_KeyTable[512];
 
 #ifdef HAVE_GUI
--- a/linux/getch2.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/linux/getch2.c	Tue Jun 05 18:40:44 2001 +0000
@@ -201,27 +201,33 @@
 
 void getch2_enable(){
 struct termios tio_new;
-#ifdef __FreeBSD__
-    ioctl(0,TIOCGETA,&tio_orig); /*  tcgetattr(0,&tio_orig); */
+#if defined(__NetBSD__) || defined(__svr4__)
+    tcgetattr(0,&tio_orig);
+#elif defined(__FreeBSD__)
+    ioctl(0,TIOCGETA,&tio_orig);
 #else
-    ioctl(0,TCGETS,&tio_orig); /*  tcgetattr(0,&tio_orig); */
+    ioctl(0,TCGETS,&tio_orig);
 #endif
     tio_new=tio_orig;
     tio_new.c_lflag &= ~(ICANON|ECHO); /* Clear ICANON and ECHO. */
     tio_new.c_cc[VMIN] = 1;
     tio_new.c_cc[VTIME] = 0;
-#ifdef __FreeBSD__
-    ioctl(0,TIOCSETA,&tio_new); /*   tcsetattr(0,TCSANOW,&tio_new); */
+#if defined(__NetBSD__) || defined(__svr4__)
+    tcsetattr(0,TCSANOW,&tio_new);
+#elif defined(__FreeBSD__)
+    ioctl(0,TIOCSETA,&tio_new);
 #else
-    ioctl(0,TCSETS,&tio_new); /*   tcsetattr(0,TCSANOW,&tio_new); */
+    ioctl(0,TCSETS,&tio_new);
 #endif
 }
 
 void getch2_disable(){
-#ifdef __FreeBSD__
-    ioctl(0,TIOCSETA,&tio_orig); /*   tcsetattr(0,TCSANOW,&tio_orig); */
+#if defined(__NetBSD__) || defined(__svr4__)
+    tcsetattr(0,TCSANOW,&tio_orig);
+#elif defined(__FreeBSD__)
+    ioctl(0,TIOCSETA,&tio_orig);
 #else
-    ioctl(0,TCSETS,&tio_orig); /*   tcsetattr(0,TCSANOW,&tio_orig); */
+    ioctl(0,TCSETS,&tio_orig);
 #endif
 }
 
--- a/loader/stubs.s	Tue Jun 05 16:52:51 2001 +0000
+++ b/loader/stubs.s	Tue Jun 05 18:40:44 2001 +0000
@@ -1,13 +1,7 @@
-	.file	"stubs.c"
-	.version  "01.01"
-gcc2_compiled.:
-.section	.rodata
-.LC0:
-	.string	"Called unk_%s\n"
-.data
+	.data
+.LC0:	.string	"Called unk_%s\n"
 	.align 4
 .globl unk_exp1
-	.type	 unk_exp1,@function
 unk_exp1:
 	pushl %ebp
 	movl %esp,%ebp
@@ -26,11 +20,5 @@
 	call printf
 	addl $8,%esp
 	xorl %eax,%eax
-	jmp .L1
-	.align 4
-.L1:
 	leave
 	ret
-.Lfe1:
-	.size	 unk_exp1,.Lfe1-unk_exp1
-	.ident	"GCC: (GNU) egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)"
--- a/loader/win32.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/loader/win32.c	Tue Jun 05 18:40:44 2001 +0000
@@ -702,12 +702,29 @@
 	cachedsi.wProcessorLevel		= 5; /* pentium */
 	cachedsi.wProcessorRevision		= 0x0101;
 	
-#if defined(__FreeBSD__) || defined(__NetBSD__)
-        cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
-        cachedsi.wProcessorLevel= 5;
-	PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__svr4__)
 	do_cpuid(regs);
-	if (regs[3] & 0x00800000)
+	switch ((regs[0] >> 8) & 0xf) {			// cpu family
+	case 3: cachedsi.dwProcessorType = PROCESSOR_INTEL_386;
+		cachedsi.wProcessorLevel= 3;
+		break;
+	case 4: cachedsi.dwProcessorType = PROCESSOR_INTEL_486;
+		cachedsi.wProcessorLevel= 4;
+		break;
+	case 5: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		cachedsi.wProcessorLevel= 5;
+		break;
+	case 6: cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		cachedsi.wProcessorLevel= 5;
+		break;
+	default:cachedsi.dwProcessorType = PROCESSOR_INTEL_PENTIUM;
+		cachedsi.wProcessorLevel= 5;
+		break;
+	}
+	cachedsi.wProcessorRevision = regs[0] & 0xf;	// stepping
+	if (regs[3] & (1 <<  8))
+	  PF[PF_COMPARE_EXCHANGE_DOUBLE] = TRUE;
+	if (regs[3] & (1 << 23))
           PF[PF_MMX_INSTRUCTIONS_AVAILABLE] = TRUE;
         cachedsi.dwNumberOfProcessors=1;
 #else
--- a/mixer.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/mixer.c	Tue Jun 05 18:40:44 2001 +0000
@@ -1,36 +1,34 @@
 
 #include <string.h>
 #include <sys/ioctl.h>
-#ifdef __sun
-#include <sys/audioio.h>
-#else
-#include <sys/soundcard.h>
-#endif
 #include <fcntl.h>
 #include <stdio.h>
 #include <unistd.h>
 
+#include "config.h"
+
+#ifdef USE_OSS_AUDIO
+#include <sys/soundcard.h>
+#endif
+
+#ifdef USE_SUN_AUDIO
+#include <sys/audioio.h>
+#endif
+
 #include "mixer.h"
 
-#ifdef __sun
-char * mixer_device="/dev/audioctl";
-#else
-char * mixer_device="/dev/mixer";
-#endif
+#if	defined(USE_OSS_AUDIO)
+
+char * mixer_device=DEV_MIXER;
 int    mixer_usemaster=0;
 
-void mixer_getvolume( int *l,int *r )
+void mixer_getvolume( float *l,float *r )
 {
  int fd,v,cmd,devs;
 
  fd=open( mixer_device,O_RDONLY );
  if ( fd != -1 )
   {
-#ifdef __sun
-   audio_info_t info;
-   ioctl( fd,AUDIO_GETINFO,&info );
-   *r=*l=(info.play.gain * 100 + (AUDIO_MAX_GAIN-1))/AUDIO_MAX_GAIN;
-#else
    ioctl( fd,SOUND_MIXER_READ_DEVMASK,&devs );
    if ( ( devs & SOUND_MASK_PCM ) && ( mixer_usemaster==0 ) ) cmd=SOUND_MIXER_READ_PCM;
      else
@@ -43,24 +41,17 @@
    ioctl( fd,cmd,&v );
    *r=( v & 0xFF00 ) >> 8;
    *l=( v & 0x00FF );
-#endif
    close( fd );
   }
 }
 
-void mixer_setvolume( int l,int r )
+void mixer_setvolume( float l,float r )
 {
  int fd,v,cmd,devs;
 
  fd=open( mixer_device,O_RDONLY );
  if ( fd != -1 )
   {
-#ifdef __sun
-   audio_info_t info;
-   ioctl( fd,AUDIO_GETINFO,&info );
-   info.play.gain = ((l+r)*AUDIO_MAX_GAIN+199)/200;
-   ioctl( fd,AUDIO_SETINFO,&info );
-#else
    ioctl( fd,SOUND_MIXER_READ_DEVMASK,&devs );
    if ( ( devs & SOUND_MASK_PCM ) && ( mixer_usemaster==0 ) ) cmd=SOUND_MIXER_WRITE_PCM;
      else
@@ -70,33 +61,74 @@
             close( fd );
             return;
            }
-   v=( r << 8 ) | l;
+   v=( (int)r << 8 ) | (int)l;
    ioctl( fd,cmd,&v );
-#endif
+   close( fd );
+  }
+}
+#elif	defined(USE_SUN_AUDIO)
+
+char * mixer_device="/dev/audioctl";
+int    mixer_usemaster=0;
+
+void mixer_getvolume( float *l,float *r )
+{
+ int fd,v,cmd,devs;
+
+ fd=open( mixer_device,O_RDONLY );
+ if ( fd != -1 )
+  {
+   struct audio_info info;
+
+   ioctl( fd,AUDIO_GETINFO,&info);
+   *r=info.play.gain * 100. / AUDIO_MAX_GAIN;
+   *l=info.play.gain * 100. / AUDIO_MAX_GAIN;
    close( fd );
   }
 }
 
-int mixer_l=0; int mixer_r=0;
+void mixer_setvolume( float l,float r )
+{
+ int fd,v,cmd,devs;
+
+ fd=open( mixer_device,O_RDONLY );
+ if ( fd != -1 )
+  {
+   struct audio_info info;
+   AUDIO_INITINFO(&info);
+   info.play.gain = (r+l) * AUDIO_MAX_GAIN / 100 / 2;
+   ioctl( fd,AUDIO_SETINFO,&info );
+   close( fd );
+  }
+}
+#endif
+
 
 void mixer_incvolume( void )
 {
+ float mixer_l, mixer_r;
  mixer_getvolume( &mixer_l,&mixer_r );
- if ( mixer_l < 100 ) mixer_l++;
- if ( mixer_r < 100 ) mixer_r++;
+ mixer_l++;
+ if ( mixer_l > 100 ) mixer_l = 100;
+ mixer_r++;
+ if ( mixer_r > 100 ) mixer_r = 100;
  mixer_setvolume( mixer_l,mixer_r );
 }
 
 void mixer_decvolume( void )
 {
+ float mixer_l, mixer_r;
  mixer_getvolume( &mixer_l,&mixer_r );
- if ( mixer_l > 0 ) mixer_l--;
- if ( mixer_r > 0 ) mixer_r--;
+ mixer_l--;
+ if ( mixer_l < 0 ) mixer_l = 0;
+ mixer_r--;
+ if ( mixer_r < 0 ) mixer_r = 0;
  mixer_setvolume( mixer_l,mixer_r );
 }
 
-int mixer_getbothvolume( void )
+float mixer_getbothvolume( void )
 {
+ float mixer_l, mixer_r;
  mixer_getvolume( &mixer_l,&mixer_r );
  return ( mixer_l + mixer_r ) / 2;
 }
--- a/mixer.h	Tue Jun 05 16:52:51 2001 +0000
+++ b/mixer.h	Tue Jun 05 18:40:44 2001 +0000
@@ -7,13 +7,13 @@
 extern int    mixer_usemaster;
 extern char * mixer_device;
 
-extern void mixer_getvolume( int *l,int *r );
-extern void mixer_setvolume( int l,int r );
+extern void mixer_getvolume( float *l,float *r );
+extern void mixer_setvolume( float l,float r );
 extern void mixer_incvolume( void );
 extern void mixer_decvolume( void );
-extern int  mixer_getbothvolume( void );
+extern float mixer_getbothvolume( void );
 
 //extern void mixer_setbothvolume( int v );
 #define mixer_setbothvolume( v ) mixer_setvolume( v,v )
 
-#endif
\ No newline at end of file
+#endif
--- a/mplayer.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/mplayer.c	Tue Jun 05 18:40:44 2001 +0000
@@ -16,15 +16,22 @@
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#ifdef __sun
-#include <sys/audioio.h>
-#else
-#include <sys/soundcard.h>
-#endif
 
 #include "version.h"
 #include "config.h"
 
+#if defined(USE_OSS_AUDIO)
+#include <sys/soundcard.h>
+#elif defined(USE_SUN_AUDIO)
+#endif
+
+#if	defined(sun)
+#define	DEFAULT_CDROM_DEVICE	"/vol/dev/aliases/cdrom0"
+#else
+#define	DEFAULT_CDROM_DEVICE	"/dev/cdrom"
+#endif
+
+
 #ifndef MAX_OUTBURST
 #error "============================================="
 #error "Please re-run ./configure and then try again!"
@@ -65,6 +72,10 @@
 
 //extern int vo_screenwidth;
 
+int audio_fd=-1;
+
+extern int vo_screenwidth;
+
 extern char* win32_codec_name;  // must be set before calling DrvOpen() !!!
 
 extern int errno;
@@ -86,6 +97,7 @@
 static URL_t* url;
 #endif
 
+
 #define DEBUG if(0)
 #ifdef HAVE_GUI
  int nogui=1;
@@ -97,6 +109,19 @@
 static subtitle* subtitles=NULL;
 void find_sub(subtitle* subtitles,int key);
 
+static int
+usec_sleep(int usec_delay)
+{
+#if	1
+    struct timespec ts;
+    ts.tv_sec  =  usec_delay / 1000000;
+    ts.tv_nsec = (usec_delay % 1000000) * 1000;
+    return nanosleep(&ts, NULL);
+#else
+    return usleep(usec_delay);
+#endif
+}
+
 //**************************************************************************//
 //             Config file
 //**************************************************************************//
@@ -269,7 +294,7 @@
 
 #ifdef HAVE_GUI
  #include "../Gui/mplayer/psignal.h"
- #define GUI_MSG(x) if ( !nogui ) { mplSendMessage( x ); usleep( 10000 ); }
+ #define GUI_MSG(x) if ( !nogui ) { mplSendMessage( x ); usec_sleep( 10000 ); }
 #else
  #define GUI_MSG(x)
 #endif
@@ -297,6 +322,8 @@
   #endif
      getch2_disable();
   video_out->uninit();
+  audio_out->reset();
+  audio_out->uninit();
   if(encode_name) avi_fixate();
 #ifdef HAVE_LIRC
   #ifdef HAVE_GUI
@@ -403,6 +430,8 @@
 
 char *dsp=NULL;
 
+float rel_seek_secs=0;
+
 #include "mixer.h"
 #include "cfg-mplayer.h"
 
@@ -505,11 +534,7 @@
 #endif
 
 if(!filename){
-#ifdef __sun
-  if(vcd_track) filename="/vol/dev/aliases/cdrom0"; 
-#else
-  if(vcd_track) filename="/dev/cdrom"; 
-#endif
+  if(vcd_track) filename=DEFAULT_CDROM_DEVICE;
   else {
     printf("%s",help_text); exit(0);
   }
@@ -642,6 +667,7 @@
   }
   if (dvd_auth_device) {
     if (dvd_auth(dvd_auth_device,f)) {
+//    if (dvd_auth(dvd_auth_device,filename)) {
         GUI_MSG( mplErrorDVDAuth )
         exit(0);
       } 
@@ -1073,7 +1099,7 @@
       {
        mplShMem->items.videodata.format=sh_video->format;
        mplSendMessage( mplCantFindCodecForVideoFormat );
-       usleep( 10000 );
+       usec_sleep( 10000 );
       }
     #endif
     exit(1);
@@ -1137,7 +1163,7 @@
           {
            strcpy(  mplShMem->items.videodata.codecdll,sh_video->codec->dll );
            mplSendMessage( mplDSCodecNotFound );
-           usleep( 10000 );
+           usec_sleep( 10000 );
           }
         #endif
         exit(1);
@@ -1508,11 +1534,11 @@
       time_frame=0;
     } else {
         while(time_frame>0.022){
-            usleep(time_frame-0.022);
+            usec_sleep(time_frame-0.022);
             time_frame-=GetRelativeTime();
         }
         while(time_frame>0.007){
-            usleep(0);
+            usec_sleep(1000);	// sleeps 1 clock tick (10ms)!
             time_frame-=GetRelativeTime();
         }
     }
@@ -1744,7 +1770,14 @@
           if(verbose>1)printf("delay=%d\n",delay);
           time_frame=v_frame;
           time_frame-=a_frame-(float)delay/(float)sh_audio->o_bps;
-	  if(time_frame>-2*frame_time) drop_frame=0; // stop dropping frames
+	  if(time_frame>-2*frame_time) {
+	    drop_frame=0; // stop dropping frames
+	    if (verbose>0) printf("\nstop frame drop %.2f\n", time_frame);
+	  }else{
+	    ++drop_frame_cnt;
+	    if (verbose > 0 && drop_frame_cnt%10 == 0)
+	      printf("\nstill dropping, %.2f\n", time_frame);
+	  }
       }
 
     } else {
@@ -1762,6 +1795,7 @@
 	  if(time_frame<-2*frame_time){
 	      drop_frame=frame_dropping; // tricky!
 	      ++drop_frame_cnt;
+	      if (verbose>0) printf("\nframe drop %d, %.2f\n", drop_frame, time_frame);
 	  }
       } else {
           if(time_frame<-3*frame_time || time_frame>3*frame_time) time_frame=0;
@@ -1771,15 +1805,15 @@
       
       while(time_frame>0.005){
           if(time_frame<=0.020)
-             usleep(0); // sleep 10ms
+             usec_sleep(10000); // sleeps 1 clock tick (10ms)!
           else
-             usleep(1000000*(time_frame-0.002));
+             usec_sleep(1000000*(time_frame-0.002));
           time_frame-=GetRelativeTime();
       }
 
         current_module="flip_page";
         video_out->flip_page();
-//        usleep(50000); // test only!
+//        usec_sleep(50000); // test only!
 
     }
 
@@ -1845,7 +1879,7 @@
         else
           max_pts_correction=sh_video->frametime*0.10; // +-10% of time
         a_frame+=x; c_total+=x;
-        printf(" ct:%7.3f  %3d  %2d%% %2d%% %3.1f%% %d\r",c_total,
+        printf(" ct:%7.3f  %3d  %2d%% %2d%% %4.1f%% %d\r",c_total,
         (int)num_frames,
         (v_frame>0.5)?(int)(100.0*video_time_usage/(double)v_frame):0,
         (v_frame>0.5)?(int)(100.0*vout_time_usage/(double)v_frame):0,
@@ -1886,7 +1920,7 @@
 
   if(osd_function==OSD_PAUSE){
       printf("\n------ PAUSED -------\r");fflush(stdout);
-      audio_out->reset(); // stop audio
+      audio_out->pause();	// pause audio, keep data if possible
 #ifdef HAVE_GUI
       if ( nogui )
         {
@@ -1897,12 +1931,13 @@
 #endif
              (!f || getch2(20)<=0) && mplayer_get_key()<=0){
 	     video_out->check_events();
-             if(!f) usleep(1000); // do not eat the CPU
+             if(!f) usec_sleep(1000); // do not eat the CPU
          }
          osd_function=OSD_PLAY;
 #ifdef HAVE_GUI
-        } else while( osd_function != OSD_PLAY ) usleep( 1000 );
+        } else while( osd_function != OSD_PLAY ) usec_sleep( 1000 );
 #endif
+      audio_out->resume();	// resume audio
   }
 
 
@@ -1967,14 +2002,14 @@
       break;
     case '*':
     case '/': {
-        int mixer_l=0; int mixer_r=0;
+        float mixer_l, mixer_r;
         mixer_getvolume( &mixer_l,&mixer_r );
         if(c=='*'){
-            if ( mixer_l < 100 ) mixer_l++;
-            if ( mixer_r < 100 ) mixer_r++;
+            mixer_l++; if ( mixer_l > 100 ) mixer_l = 100;
+            mixer_r++; if ( mixer_r > 100 ) mixer_r = 100;
         } else {
-            if ( mixer_l > 0 ) mixer_l--;
-            if ( mixer_r > 0 ) mixer_r--;
+            mixer_l--; if ( mixer_l < 0 ) mixer_l = 0;
+            mixer_r--; if ( mixer_r < 0 ) mixer_r = 0;
         }
         mixer_setvolume( mixer_l,mixer_r );
 
@@ -2258,7 +2293,7 @@
 
         current_module=NULL;
 
-        audio_out->reset(); // stop audio
+        audio_out->reset(); // stop audio, throwing away buffered data
 
         c_total=0; // kell ez?
         printf("A:%6.1f  V:%6.1f  A-V:%7.3f",d_audio->pts,d_video->pts,0.0f);
--- a/stream.c	Tue Jun 05 16:52:51 2001 +0000
+++ b/stream.c	Tue Jun 05 18:40:44 2001 +0000
@@ -5,21 +5,6 @@
 #include <sys/ioctl.h>
 #include <unistd.h>
 
-//#include <sys/types.h>
-//#include <sys/stat.h>
-//#include <fcntl.h>
-
-#ifdef __FreeBSD__
-#include <sys/cdio.h>
-#include <sys/cdrio.h>
-#else
-#ifdef __sun
-#include <sys/cdio.h>
-#else
-#include <linux/cdrom.h>
-#endif
-#endif
-
 #include "stream.h"
 
 extern int verbose; // defined in mplayer.c
--- a/vcd_read.h	Tue Jun 05 16:52:51 2001 +0000
+++ b/vcd_read.h	Tue Jun 05 18:40:44 2001 +0000
@@ -1,4 +1,14 @@
 //=================== VideoCD ==========================
+#if	defined(linux) || defined(sun)
+
+#if	defined(linux)
+#include <linux/cdrom.h>
+#elif	defined(sun)
+#include <sys/cdio.h>
+static int sun_vcd_read(int, int*);
+#endif
+
+
 static struct cdrom_tocentry vcd_entry;
 
 static inline void vcd_set_msf(unsigned int sect){
@@ -65,34 +75,128 @@
     }
 }
 
+
 static char vcd_buf[VCD_SECTOR_SIZE];
 
 static int vcd_read(int fd,char *mem){
-#ifdef __sun
-      struct cdrom_cdxa xa;
-      xa.cdxa_addr = vcd_get_msf();
-      xa.cdxa_length = CDROM_BLK_2352;
-      xa.cdxa_data = vcd_buf;
-      xa.cdxa_format = CDROM_XA_SECTOR_DATA;
-      if(ioctl(fd,CDROMCDXA,&xa)==-1) return 0; // EOF?
-#else
-      memcpy(vcd_buf,&vcd_entry.cdte_addr.msf,sizeof(struct cdrom_msf));
-      if(ioctl(fd,CDROMREADRAW,vcd_buf)==-1) return 0; // EOF?
+#if	defined(linux)
+  memcpy(vcd_buf,&vcd_entry.cdte_addr.msf,sizeof(struct cdrom_msf));
+  if(ioctl(fd,CDROMREADRAW,vcd_buf)==-1) return 0; // EOF?
+  memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA);
+#elif	defined(sun)
+  {
+    int offset;
+    if (sun_vcd_read(fd, &offset) <= 0) return 0;
+    memcpy(mem,&vcd_buf[offset],VCD_SECTOR_DATA);
+  }
 #endif
 
-      vcd_entry.cdte_addr.msf.frame++;
-      if (vcd_entry.cdte_addr.msf.frame==75){
-        vcd_entry.cdte_addr.msf.frame=0;
-        vcd_entry.cdte_addr.msf.second++;
-        if (vcd_entry.cdte_addr.msf.second==60){
-          vcd_entry.cdte_addr.msf.second=0;
-          vcd_entry.cdte_addr.msf.minute++;
-        }
-      }
+  vcd_entry.cdte_addr.msf.frame++;
+  if (vcd_entry.cdte_addr.msf.frame==75){
+    vcd_entry.cdte_addr.msf.frame=0;
+    vcd_entry.cdte_addr.msf.second++;
+    if (vcd_entry.cdte_addr.msf.second==60){
+      vcd_entry.cdte_addr.msf.second=0;
+      vcd_entry.cdte_addr.msf.minute++;
+    }
+  }
+    
+  return VCD_SECTOR_DATA;
+}
+
+
+#ifdef	sun
+#include <sys/scsi/generic/commands.h>
+#include <sys/scsi/impl/uscsi.h>
+
+#define	SUN_XAREAD	1	/*fails on atapi drives*/
+#define	SUN_MODE2READ	2	/*fails on atapi drives*/
+#define	SUN_SCSIREAD	3
+#define	SUN_VCDREAD	SUN_SCSIREAD
+
+static int sun_vcd_read(int fd, int *offset)
+{
+#if SUN_VCDREAD == SUN_XAREAD
+  struct cdrom_cdxa cdxa;
+  cdxa.cdxa_addr = vcd_get_msf();
+  cdxa.cdxa_length = 1;
+  cdxa.cdxa_data = vcd_buf;
+  cdxa.cdxa_format = CDROM_XA_SECTOR_DATA;
+  
+  if(ioctl(fd,CDROMCDXA,&cdxa)==-1) {
+    perror("CDROMCDXA");
+    return 0;
+  }
+  *offset = 0;
+#elif SUN_VCDREAD == SUN_MODE2READ
+  struct cdrom_read cdread;
+  cdread.cdread_lba = 4*vcd_get_msf();
+  cdread.cdread_bufaddr = vcd_buf;
+  cdread.cdread_buflen = 2336;
 
-      memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA);
-      return VCD_SECTOR_DATA;
+  if(ioctl(fd,CDROMREADMODE2,&cdread)==-1) {
+    perror("CDROMREADMODE2");
+    return 0;
+  }
+  *offset = 8;
+#elif SUN_VCDREAD == SUN_SCSIREAD
+  struct uscsi_cmd sc;
+  union scsi_cdb cdb;
+  int lba = vcd_get_msf();
+  int blocks = 1;
+  int sector_type;
+  int sync, header_code, user_data, edc_ecc, error_field;
+  int sub_channel;
+
+  /* sector_type = 3;	/* mode2 */
+  sector_type = 5;	/* mode2/form2 */
+  sync = 0;
+  header_code = 0;
+  user_data = 1;
+  edc_ecc = 0;
+  error_field = 0;
+  sub_channel = 0;
+
+  memset(&cdb, 0, sizeof(cdb));
+  memset(&sc, 0, sizeof(sc));
+  cdb.scc_cmd = 0xBE;
+  cdb.cdb_opaque[1] = (sector_type) << 2;
+  cdb.cdb_opaque[2] = (lba >> 24) & 0xff;
+  cdb.cdb_opaque[3] = (lba >> 16) & 0xff;
+  cdb.cdb_opaque[4] = (lba >>  8) & 0xff;
+  cdb.cdb_opaque[5] =  lba & 0xff;
+  cdb.cdb_opaque[6] = (blocks >> 16) & 0xff;
+  cdb.cdb_opaque[7] = (blocks >>  8) & 0xff;
+  cdb.cdb_opaque[8] =  blocks & 0xff;
+  cdb.cdb_opaque[9] = (sync << 7) |
+		      (header_code << 5) |
+		      (user_data << 4) |
+		      (edc_ecc << 3) |
+		      (error_field << 1);
+  cdb.cdb_opaque[10] = sub_channel;
+
+  sc.uscsi_cdb = &cdb;
+  sc.uscsi_cdblen = 12;
+  sc.uscsi_bufaddr = vcd_buf;
+  sc.uscsi_buflen = 2336;
+  sc.uscsi_flags = USCSI_ISOLATE | USCSI_READ;
+  sc.uscsi_timeout = 20;
+  if (ioctl(fd, USCSICMD, &sc)) {
+      perror("USCSICMD: READ CD");
+      return -1;
+  }
+  if (sc.uscsi_status) {
+      fprintf(stderr, "scsi command failed with status %d\n", sc.uscsi_status);
+      return -1;
+  }
+  *offset = 0;
+  return 1;
+#else
+#error SUN_VCDREAD
+#endif
 }
+#endif	/*sun*/
+
 
 //================== VCD CACHE =======================
 #ifdef VCD_CACHE
@@ -115,8 +219,9 @@
 }
 
 int vcd_cache_read(int fd,char* mem){
-int i;
-char* vcd_buf;
+  int i;
+  char* vcd_buf;
+
   for(i=0;i<vcd_cache_size;i++)
     if(vcd_cache_sectors[i]==vcd_cache_current){
       // found in the cache! :)
@@ -131,11 +236,43 @@
   ++vcd_cache_index;if(vcd_cache_index>=vcd_cache_size)vcd_cache_index=0;
   // read data!
   vcd_set_msf(vcd_cache_current);
+#if	defined(linux)
   memcpy(vcd_buf,&vcd_entry.cdte_addr.msf,sizeof(struct cdrom_msf));
   if(ioctl(fd,CDROMREADRAW,vcd_buf)==-1) return 0; // EOF?
+  memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA);
+#elif	defined(sun)
+  {
+    int offset;
+    if (sun_vcd_read(fd, &offset) <= 0) return 0;
+    memcpy(mem,&vcd_buf[offset],VCD_SECTOR_DATA);
+  }
+#endif
   ++vcd_cache_current;
-  memcpy(mem,&vcd_buf[VCD_SECTOR_OFFS],VCD_SECTOR_DATA);
   return VCD_SECTOR_DATA;
 }
+#endif
 
-#endif
+#else /* linux || sun */
+
+int vcd_seek_to_track(int fd,int track)
+{
+  return -1;
+}
+
+int vcd_get_track_end(int fd,int track)
+{
+  return -1;
+}
+
+void vcd_read_toc(int fd)
+{
+}
+
+static char vcd_buf[VCD_SECTOR_SIZE];
+
+static int vcd_read(int fd,char *mem)
+{
+  return -1;
+}
+
+#endif /* !linux && !sun */
--- a/vcd_read_fbsd.h	Tue Jun 05 16:52:51 2001 +0000
+++ b/vcd_read_fbsd.h	Tue Jun 05 18:40:44 2001 +0000
@@ -1,3 +1,6 @@
+#include <sys/cdio.h>
+#include <sys/cdrio.h>
+
 //=================== VideoCD ==========================
 #define	CDROM_LEADOUT	0xAA
 
--- a/version.sh	Tue Jun 05 16:52:51 2001 +0000
+++ b/version.sh	Tue Jun 05 18:40:44 2001 +0000
@@ -1,4 +1,8 @@
 #!/bin/sh
 
-echo "#define VERSION \"0.17cvs-"`date -r CVS/Entries +%y%m%d-%H:%M`"\"" >version.h
-
+last_cvs_update=`date -r CVS/Entries +%y%m%d-%H:%M 2>/dev/null`
+if [ $? -ne 0 ]; then
+	# probably no gnu date installed(?), use current date
+	last_cvs_update=`date +%y%m%d-%H:%M`
+fi
+echo "#define VERSION \"0.17cvs-${last_cvs_update}\"" >version.h