git: 05929daa646c - main - audio/linux-rl9-alsa-plugins-oss: sync OSS patches with audio/alsa-plugins

From: Dima Panov <fluffy_at_FreeBSD.org>
Date: Mon, 13 Jul 2026 07:55:34 UTC
The branch main has been updated by fluffy:

URL: https://cgit.FreeBSD.org/ports/commit/?id=05929daa646ccc1cf08bbb7000056c4091d9d8d9

commit 05929daa646ccc1cf08bbb7000056c4091d9d8d9
Author:     Alex S <iwtcex@gmail.com>
AuthorDate: 2026-06-30 02:48:21 +0000
Commit:     Dima Panov <fluffy@FreeBSD.org>
CommitDate: 2026-07-13 07:52:54 +0000

    audio/linux-rl9-alsa-plugins-oss: sync OSS patches with audio/alsa-plugins
    
    This seems to work better with SDL 3 apps.
    
    PR:     296738
---
 audio/linux-rl9-alsa-plugins-oss/Makefile          |   4 +-
 .../{patch-oss-ctl_oss.c => patch-oss_ctl__oss.c}  |  33 +-
 .../{patch-oss-pcm_oss.c => patch-oss_pcm__oss.c}  | 519 ++++++++++-----------
 3 files changed, 274 insertions(+), 282 deletions(-)

diff --git a/audio/linux-rl9-alsa-plugins-oss/Makefile b/audio/linux-rl9-alsa-plugins-oss/Makefile
index 7832d6e67343..1fe0858fd522 100644
--- a/audio/linux-rl9-alsa-plugins-oss/Makefile
+++ b/audio/linux-rl9-alsa-plugins-oss/Makefile
@@ -1,7 +1,7 @@
 PORTNAME=	alsa-plugins
 PORTVERSION=	1.2.7.1
 DISTVERSIONSUFFIX=	-1.el9
-PORTREVISION=	5
+PORTREVISION=	6
 CATEGORIES=	audio linux
 MASTER_SITES=	ROCKY_LINUX
 MASTER_SITE_SUBDIR=	${LINUX_DIST_VER}/BaseOS/source/tree/Packages/a/ \
@@ -26,7 +26,7 @@ CONFIG_ARGS=	--disable-static --disable-mix --disable-usbstream \
 		--disable-arcamav --disable-jack --disable-pulseaudio \
 		--disable-samplerate --disable-libav --disable-a52 \
 		--disable-lavrate --disable-speexdsp --with-speex=no
-CPPFLAGS+=	-DFREEBSD_OSS -DFREEBSD_OSS_USE_IO_PTR
+CPPFLAGS+=	-DFREEBSD_OSS
 CFLAGS+=	--sysroot=${LINUXBASE}
 COMPAT32_CFLAGS_amd64=	-m32
 LIBDIR_aarch64=	/usr/lib64
diff --git a/audio/linux-rl9-alsa-plugins-oss/files/patch-oss-ctl_oss.c b/audio/linux-rl9-alsa-plugins-oss/files/patch-oss_ctl__oss.c
similarity index 55%
rename from audio/linux-rl9-alsa-plugins-oss/files/patch-oss-ctl_oss.c
rename to audio/linux-rl9-alsa-plugins-oss/files/patch-oss_ctl__oss.c
index 01a998655fd4..91d285c19e26 100644
--- a/audio/linux-rl9-alsa-plugins-oss/files/patch-oss-ctl_oss.c
+++ b/audio/linux-rl9-alsa-plugins-oss/files/patch-oss_ctl__oss.c
@@ -1,20 +1,41 @@
---- oss/ctl_oss.c.orig	2018-04-03 07:01:38 UTC
+--- oss/ctl_oss.c.orig	2022-01-29 13:06:39 UTC
 +++ oss/ctl_oss.c
-@@ -362,7 +362,9 @@ SND_CTL_PLUGIN_DEFINE_FUNC(oss)
+@@ -26,7 +26,11 @@
+ #include <sys/ioctl.h>
+ #include <alsa/asoundlib.h>
+ #include <alsa/control_external.h>
++#ifdef __linux__
+ #include <linux/soundcard.h>
++#else
++#include <sys/soundcard.h>
++#endif
+ 
+ typedef struct snd_ctl_oss {
+ 	snd_ctl_ext_t ext;
+@@ -52,7 +56,7 @@ static const char *const vol_devices[SOUND_MIXER_NRDEV
+ 	[SOUND_MIXER_CD] =	"CD Playback Volume",
+ 	[SOUND_MIXER_IMIX] =	"Monitor Mix Playback Volume",
+ 	[SOUND_MIXER_ALTPCM] =	"Headphone Playback Volume",
+-	[SOUND_MIXER_RECLEV] =	"Capture Volume",
++	[SOUND_MIXER_RECLEV] =	"Master Capture Volume",
+ 	[SOUND_MIXER_IGAIN] =	"Capture Volume",
+ 	[SOUND_MIXER_OGAIN] =	"Playback Volume",
+ 	[SOUND_MIXER_LINE1] =	"Aux Playback Volume",
+@@ -362,7 +366,9 @@ SND_CTL_PLUGIN_DEFINE_FUNC(oss)
  {
  	snd_config_iterator_t it, next;
  	const char *device = "/dev/mixer";
-+#ifndef FREEBSD_OSS
++#ifndef FREEBSD_OSS // __FreeBSD__
  	struct mixer_info mixinfo;
 +#endif
  	int i, err, val;
  	snd_ctl_oss_t *oss;
  	
-@@ -399,19 +401,29 @@ SND_CTL_PLUGIN_DEFINE_FUNC(oss)
+@@ -399,19 +405,29 @@ SND_CTL_PLUGIN_DEFINE_FUNC(oss)
  		goto error;
  	}
  
-+#ifndef FREEBSD_OSS
++#ifndef FREEBSD_OSS // __FreeBSD__
  	if (ioctl(oss->fd, SOUND_MIXER_INFO, &mixinfo) < 0) {
  		err = -errno;
  		SNDERR("Cannot get mixer info for device %s", device);
@@ -24,7 +45,7 @@
  
  	oss->ext.version = SND_CTL_EXT_VERSION;
  	oss->ext.card_idx = 0; /* FIXME */
-+#ifdef FREEBSD_OSS
++#ifdef FREEBSD_OSS // __FreeBSD__
 +	strncpy(oss->ext.id, "fbsd", sizeof(oss->ext.id) - 1);
 +	strcpy(oss->ext.driver, "FreeBSD/OSS plugin");
 +	strncpy(oss->ext.name, "FreeBSD/OSS", sizeof(oss->ext.name) - 1);
diff --git a/audio/linux-rl9-alsa-plugins-oss/files/patch-oss-pcm_oss.c b/audio/linux-rl9-alsa-plugins-oss/files/patch-oss_pcm__oss.c
similarity index 53%
rename from audio/linux-rl9-alsa-plugins-oss/files/patch-oss-pcm_oss.c
rename to audio/linux-rl9-alsa-plugins-oss/files/patch-oss_pcm__oss.c
index 384dbb865682..49e12e066b9c 100644
--- a/audio/linux-rl9-alsa-plugins-oss/files/patch-oss-pcm_oss.c
+++ b/audio/linux-rl9-alsa-plugins-oss/files/patch-oss_pcm__oss.c
@@ -1,61 +1,60 @@
---- oss/pcm_oss.c.orig	2018-04-03 07:01:38 UTC
+--- oss/pcm_oss.c.orig	2020-02-19 09:35:42 UTC
 +++ oss/pcm_oss.c
-@@ -24,15 +24,48 @@
+@@ -19,21 +19,42 @@
+  */
+ 
+ #include <stdio.h>
++#include <stdbool.h>
+ #include <sys/ioctl.h>
+ #include <alsa/asoundlib.h>
  #include <alsa/pcm_external.h>
++#ifdef __linux__
  #include <linux/soundcard.h>
++#else
++#include <sys/soundcard.h>
++#endif
  
-+#define ARRAY_SIZE(x)	(sizeof(x) / sizeof(*(x)))
-+
-+#ifdef FREEBSD_OSS
-+#define AFMT_S32_LE	0x00001000	/* Little endian signed 32-bit */
-+#define AFMT_S32_BE	0x00002000	/* Big endian signed 32-bit */
-+#define AFMT_U32_LE	0x00004000	/* Little endian unsigned 32-bit */
-+#define AFMT_U32_BE	0x00008000	/* Big endian unsigned 32-bit */
-+#define AFMT_S24_LE	0x00010000	/* Little endian signed 24-bit */
-+#define AFMT_S24_BE	0x00020000	/* Big endian signed 24-bit */
-+#define AFMT_U24_LE	0x00040000	/* Little endian unsigned 24-bit */
-+#define AFMT_U24_BE	0x00080000	/* Big endian unsigned 24-bit */
-+
-+#define FREEBSD_OSS_RATE_MIN	1
-+#define FREEBSD_OSS_RATE_MAX	384000
-+
-+#define FREEBSD_OSS_CHANNELS_MIN	1
-+#define FREEBSD_OSS_CHANNELS_MAX	8
-+
-+#define FREEBSD_OSS_BUFSZ_MAX	131072
-+#define FREEBSD_OSS_BLKCNT_MIN	2
-+#define FREEBSD_OSS_BLKSZ_MIN	16 /* (FREEBSD_OSS_CHANNELS_MAX * 4) */
-+
-+#define FREEBSD_OSS_BUFSZ_MIN	(FREEBSD_OSS_BLKCNT_MIN * FREEBSD_OSS_BLKSZ_MIN)
-+#define FREEBSD_OSS_BLKCNT_MAX	(FREEBSD_OSS_BUFSZ_MAX / FREEBSD_OSS_BUFSZ_MIN)
-+#define FREEBSD_OSS_BLKSZ_MAX	(FREEBSD_OSS_BUFSZ_MAX / FREEBSD_OSS_BLKCNT_MIN)
++#ifndef ARRAY_SIZE
++#define	ARRAY_SIZE(x)	(sizeof(x) / sizeof(*(x)))
 +#endif
++
++#define ALSA_OSS_RATE_MIN	1
++#define ALSA_OSS_RATE_MAX	384000
++
++#define ALSA_OSS_CHANNELS_MIN	1
++#define ALSA_OSS_CHANNELS_MAX	8
++
++#define ALSA_OSS_BUFSZ_MAX	131072
++#define ALSA_OSS_BLKCNT_MIN	2
++#define ALSA_OSS_BLKSZ_MIN	16 /* (ALSA_OSS_CHANNELS_MAX * 4) */
++
++#define ALSA_OSS_BUFSZ_MIN	(ALSA_OSS_BLKCNT_MIN * ALSA_OSS_BLKSZ_MIN)
++#define ALSA_OSS_BLKCNT_MAX	(ALSA_OSS_BUFSZ_MAX / ALSA_OSS_BUFSZ_MIN)
++#define ALSA_OSS_BLKSZ_MAX	(ALSA_OSS_BUFSZ_MAX / ALSA_OSS_BLKCNT_MIN)
 +
  typedef struct snd_pcm_oss {
  	snd_pcm_ioplug_t io;
  	char *device;
  	int fd;
-+#ifdef FREEBSD_OSS
-+	int bufsz, ptr, ptr_align, last_bytes;
-+#else
- 	int fragment_set;
- 	int caps;
-+#endif
+-	int fragment_set;
+-	int caps;
++	int bufsz;
  	int format;
-+#ifndef FREEBSD_OSS
- 	unsigned int period_shift;
- 	unsigned int periods;
-+#endif
- 	unsigned int frame_bytes;
+-	unsigned int period_shift;
+-	unsigned int periods;
+-	unsigned int frame_bytes;
++	int frame_bytes;
++	bool buffer_used;
  } snd_pcm_oss_t;
  
-@@ -49,8 +82,21 @@ static snd_pcm_sframes_t oss_write(snd_pcm_ioplug_t *i
+ static snd_pcm_sframes_t oss_write(snd_pcm_ioplug_t *io,
+@@ -49,8 +70,21 @@ static snd_pcm_sframes_t oss_write(snd_pcm_ioplug_t *i
  	buf = (char *)areas->addr + (areas->first + areas->step * offset) / 8;
  	size *= oss->frame_bytes;
  	result = write(oss->fd, buf, size);
 -	if (result <= 0)
 -		return result;
-+#ifdef FREEBSD_OSS
++#ifdef FREEBSD_OSS // __FreeBSD__
 +	if (result == -1) {
 +		if (errno == EAGAIN)
 +			return 0;
@@ -73,13 +72,13 @@
  	return result / oss->frame_bytes;
  }
  
-@@ -67,14 +113,88 @@ static snd_pcm_sframes_t oss_read(snd_pcm_ioplug_t *io
+@@ -67,37 +101,122 @@ static snd_pcm_sframes_t oss_read(snd_pcm_ioplug_t *io
  	buf = (char *)areas->addr + (areas->first + areas->step * offset) / 8;
  	size *= oss->frame_bytes;
  	result = read(oss->fd, buf, size);
 -	if (result <= 0)
 -		return result;
-+#ifdef FREEBSD_OSS
++#ifdef FREEBSD_OSS // __FreeBSD__
 +	if (result == -1) {
 +		if (errno == EAGAIN)
 +			return 0;
@@ -99,97 +98,103 @@
  
  static snd_pcm_sframes_t oss_pointer(snd_pcm_ioplug_t *io)
  {
-+#ifdef FREEBSD_OSS
  	snd_pcm_oss_t *oss = io->private_data;
-+#ifdef FREEBSD_OSS_USE_IO_PTR
-+	struct count_info ci;
-+#endif
+-	struct count_info info;
+-	int ptr;
++	snd_pcm_sframes_t frames;
 +	audio_buf_info bi;
-+
-+	if (io->state != SND_PCM_STATE_RUNNING)
-+		return 0;
-+
-+	if (io->state == SND_PCM_STATE_XRUN)
+ 
+-	if (ioctl(oss->fd, io->stream == SND_PCM_STREAM_PLAYBACK ?
+-		  SNDCTL_DSP_GETOPTR : SNDCTL_DSP_GETIPTR, &info) < 0) {
+-		fprintf(stderr, "*** OSS: oss_pointer error\n");
++	switch (io->state) {
++	case SND_PCM_STATE_XRUN:
 +		return -EPIPE;
++	case SND_PCM_STATE_RUNNING:
++	case SND_PCM_STATE_DRAINING:
++		break;
++	default:
+ 		return 0;
+ 	}
+-	ptr = snd_pcm_bytes_to_frames(io->pcm, info.ptr);
+-	return ptr;
 +
-+#ifdef FREEBSD_OSS_USE_IO_PTR
-+	if (ioctl(oss->fd, (io->stream == SND_PCM_STREAM_PLAYBACK) ?
-+	    SNDCTL_DSP_GETOPTR : SNDCTL_DSP_GETIPTR, &ci) < 0)
-+		return -EINVAL;
-+
-+	if (ci.ptr == oss->last_bytes &&
-+	    ((ioctl(oss->fd, (io->stream == SND_PCM_STREAM_PLAYBACK) ?
-+	    SNDCTL_DSP_GETOSPACE : SNDCTL_DSP_GETISPACE, &bi) < 0) ||
-+	    bi.bytes == oss->bufsz))
-+		return -EPIPE;
++	if (io->stream == SND_PCM_STREAM_PLAYBACK) {
++		if (ioctl(oss->fd, SNDCTL_DSP_GETOSPACE, &bi) < 0)
++			return -EINVAL;
++	} else {
++		if (ioctl(oss->fd, SNDCTL_DSP_GETISPACE, &bi) < 0)
++			return -EINVAL;
++	}
 +
-+	if (ci.ptr < oss->last_bytes)
-+		oss->ptr += oss->bufsz;
++	/* check for over- and under- run */
++	if (bi.bytes != oss->bufsz) {
++		oss->buffer_used = true;
++	} else {
++		if (oss->buffer_used)
++			return -EPIPE;
++	}
 +
-+	oss->ptr += ci.ptr;
-+	oss->ptr -= oss->last_bytes;
-+	oss->ptr %= oss->ptr_align;
++	frames = bi.bytes / oss->frame_bytes;
 +
-+	oss->last_bytes = ci.ptr;
-+#else	/* !FREEBSD_OSS_USE_IO_PTR */
-+	if (ioctl(oss->fd, (io->stream == SND_PCM_STREAM_PLAYBACK) ?
-+	    SNDCTL_DSP_GETOSPACE : SNDCTL_DSP_GETISPACE, &bi) < 0)
-+		return -EINVAL;
++	/* range check */
++	if (frames < 0)
++		frames = 0;
++	else if (frames > io->buffer_size)
++		frames = io->buffer_size;
 +
-+	if (bi.bytes == oss->bufsz && bi.bytes == oss->last_bytes) {
-+#if 0
-+#ifdef SNDCTL_DSP_GETERROR
-+		audio_errinfo ei;
-+		if (ioctl(oss->fd, SNDCTL_DSP_GETERROR, &ei) < 0 ||
-+		    (io->stream == SND_PCM_STREAM_PLAYBACK &&
-+		    ei.play_underruns != 0) ||
-+		    (io->stream == SND_PCM_STREAM_CAPTURE &&
-+		    ei.rec_overruns != 0))
-+#endif
-+#endif
-+			return -EPIPE;
++	/* set hw_ptr directly */
++	if (io->stream == SND_PCM_STREAM_PLAYBACK) {
++		io->hw_ptr = io->appl_ptr + frames - io->buffer_size;
++	} else {
++		io->hw_ptr = io->appl_ptr + frames;
 +	}
++	return 0;
+ }
+ 
++static int oss_prepare(snd_pcm_ioplug_t *io)
++{
++	snd_pcm_oss_t *oss = io->private_data;
++	snd_pcm_sw_params_t *swparams;
++	snd_pcm_uframes_t min_avail;
++	int tmp;
 +
-+	if (bi.bytes > oss->last_bytes) {
-+		oss->ptr += bi.bytes - oss->last_bytes;
-+		oss->ptr %= oss->ptr_align;
++	snd_pcm_sw_params_alloca(&swparams);
++
++	if (snd_pcm_sw_params_current(io->pcm, swparams) == 0) {
++		snd_pcm_sw_params_get_avail_min(swparams, &min_avail);
++		snd_pcm_sw_params_alloca(&swparams);
++	} else {
++	  	min_avail = io->period_size;
 +	}
 +
-+	oss->last_bytes = bi.bytes;
-+#endif	/* FREEBSD_OSS_USE_IO_PTR */
++	tmp = min_avail * oss->frame_bytes;
++	if (tmp > oss->bufsz)
++		tmp = oss->bufsz;
++	else if (tmp < 1)
++		tmp = 1;
 +
-+	return snd_pcm_bytes_to_frames(io->pcm, oss->ptr);
-+#else
-+	snd_pcm_oss_t *oss = io->private_data;
- 	struct count_info info;
- 	int ptr;
- 
-@@ -85,20 +205,59 @@ static snd_pcm_sframes_t oss_pointer(snd_pcm_ioplug_t 
- 	}
- 	ptr = snd_pcm_bytes_to_frames(io->pcm, info.ptr);
- 	return ptr;
++#ifdef SNDCTL_DSP_LOW_WATER
++	if (ioctl(oss->fd, SNDCTL_DSP_LOW_WATER, &tmp) < 0)
++		return -EINVAL;
 +#endif
- }
- 
++	oss->buffer_used = false;
++
++	return 0;
++}
++
  static int oss_start(snd_pcm_ioplug_t *io)
  {
  	snd_pcm_oss_t *oss = io->private_data;
-+#ifdef FREEBSD_OSS
-+	audio_buf_info bi;
-+#ifdef FREEBSD_OSS_USE_IO_PTR
-+	struct count_info ci;
-+#endif
-+#endif
  	int tmp = io->stream == SND_PCM_STREAM_PLAYBACK ?
  		PCM_ENABLE_OUTPUT : PCM_ENABLE_INPUT;
  
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
-+
  	if (ioctl(oss->fd, SNDCTL_DSP_SETTRIGGER, &tmp) < 0) {
  		fprintf(stderr, "*** OSS: trigger failed\n");
-+#ifdef FREEBSD_OSS
++#ifdef FREEBSD_OSS // __FreeBSD__
 +		return -EINVAL;
 +#else
  		if (io->stream == SND_PCM_STREAM_CAPTURE)
@@ -197,49 +202,24 @@
  			read(oss->fd, &tmp, 0);
 +#endif
  	}
-+
-+#ifdef FREEBSD_OSS
-+	if (ioctl(oss->fd, (io->stream == SND_PCM_STREAM_PLAYBACK) ?
-+	    SNDCTL_DSP_GETOSPACE : SNDCTL_DSP_GETISPACE, &bi) < 0)
-+		return -EINVAL;
-+
-+	if (oss->bufsz != (bi.fragsize * bi.fragstotal)) {
-+		fprintf(stderr, "%s(): WARNING - bufsz changed! %d -> %d\n",
-+		    __func__, oss->bufsz, bi.fragsize * bi.fragstotal);
-+		oss->bufsz = bi.fragsize * bi.fragstotal;
-+	}
-+
-+#ifdef FREEBSD_OSS_USE_IO_PTR
-+	if (ioctl(oss->fd, (io->stream == SND_PCM_STREAM_PLAYBACK) ?
-+	    SNDCTL_DSP_GETOPTR : SNDCTL_DSP_GETIPTR, &ci) < 0)
-+		return -EINVAL;
-+
-+	oss->last_bytes = ci.ptr;
-+#else
-+	oss->last_bytes = bi.bytes;
-+#endif
-+	oss->ptr = 0;
-+#endif
-+
  	return 0;
  }
- 
-@@ -107,6 +266,10 @@ static int oss_stop(snd_pcm_ioplug_t *io)
+@@ -107,6 +226,10 @@ static int oss_stop(snd_pcm_ioplug_t *io)
  	snd_pcm_oss_t *oss = io->private_data;
  	int tmp = 0;
  
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
 +
  	ioctl(oss->fd, SNDCTL_DSP_SETTRIGGER, &tmp);
  	return 0;
  }
-@@ -115,18 +278,46 @@ static int oss_drain(snd_pcm_ioplug_t *io)
+@@ -115,101 +238,164 @@ static int oss_drain(snd_pcm_ioplug_t *io)
  {
  	snd_pcm_oss_t *oss = io->private_data;
  
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
 +
@@ -249,48 +229,43 @@
  	return 0;
  }
  
+-static int oss_prepare(snd_pcm_ioplug_t *io)
 +static int oss_delay(snd_pcm_ioplug_t *io, snd_pcm_sframes_t *delayp)
-+{
-+	snd_pcm_oss_t *oss = io->private_data;
-+	int tmp;
-+
+ {
+ 	snd_pcm_oss_t *oss = io->private_data;
+ 	int tmp;
+ 
+-	ioctl(oss->fd, SNDCTL_DSP_RESET);
 +	if (oss->fd < 0)
 +		return -EBADFD;
-+
+ 
+-	tmp = io->channels;
+-	if (ioctl(oss->fd, SNDCTL_DSP_CHANNELS, &tmp) < 0) {
+-		perror("SNDCTL_DSP_CHANNELS");
+-		return -EINVAL;
 +	if (io->stream == SND_PCM_STREAM_PLAYBACK) {
 +		if (ioctl(oss->fd, SNDCTL_DSP_GETODELAY, &tmp) < 0 || tmp < 0)
 +			tmp = 0;
 +	} else {
 +		tmp = 0;
-+	}
-+	*delayp = snd_pcm_bytes_to_frames(io->pcm, tmp);
+ 	}
+-	tmp = oss->format;
+-	if (ioctl(oss->fd, SNDCTL_DSP_SETFMT, &tmp) < 0) {
+-		perror("SNDCTL_DSP_SETFMT");
+-		return -EINVAL;
+-	}
+-	tmp = io->rate;
+-	if (ioctl(oss->fd, SNDCTL_DSP_SPEED, &tmp) < 0 ||
+-	    tmp > io->rate * 1.01 || tmp < io->rate * 0.99) {
+-		perror("SNDCTL_DSP_SPEED");
+-		return -EINVAL;
+-	}
+-	return 0;
++	*delayp = tmp / oss->frame_bytes;
 +
 +	return (0);
-+}
-+
-+#ifndef FREEBSD_OSS
- static int oss_prepare(snd_pcm_ioplug_t *io)
- {
- 	snd_pcm_oss_t *oss = io->private_data;
- 	int tmp;
- 
--	ioctl(oss->fd, SNDCTL_DSP_RESET);
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
-+	fprintf(stderr, "%s()\n", __func__);
-+#endif
- 
-+	ioctl(oss->fd, SNDCTL_DSP_RESET, NULL);
-+
- 	tmp = io->channels;
- 	if (ioctl(oss->fd, SNDCTL_DSP_CHANNELS, &tmp) < 0) {
- 		perror("SNDCTL_DSP_CHANNELS");
-@@ -145,16 +336,75 @@ static int oss_prepare(snd_pcm_ioplug_t *io)
- 	}
- 	return 0;
  }
-+#endif
  
-+#ifdef FREEBSD_OSS
 +static const struct {
 +	int oss_format;
 +	snd_pcm_format_t alsa_format;
@@ -303,77 +278,76 @@
 +	{ AFMT_S16_BE, SND_PCM_FORMAT_S16_BE  },
 +	{ AFMT_U16_LE, SND_PCM_FORMAT_U16_LE  },
 +	{ AFMT_U16_BE, SND_PCM_FORMAT_U16_BE  },
-+	{ AFMT_S24_LE, SND_PCM_FORMAT_S24_3LE },
-+	{ AFMT_S24_BE, SND_PCM_FORMAT_S24_3BE },
-+	{ AFMT_U24_LE, SND_PCM_FORMAT_U24_3LE },
-+	{ AFMT_U24_BE, SND_PCM_FORMAT_U24_3BE },
-+	{ AFMT_S32_LE, SND_PCM_FORMAT_S32_LE  },
-+	{ AFMT_S32_BE, SND_PCM_FORMAT_S32_BE  },
-+	{ AFMT_U32_LE, SND_PCM_FORMAT_U32_LE  },
-+	{ AFMT_U32_BE, SND_PCM_FORMAT_U32_BE  },
++	// { AFMT_S24_LE, SND_PCM_FORMAT_S24_3LE },
++	// { AFMT_S24_BE, SND_PCM_FORMAT_S24_3BE },
++	// { AFMT_U24_LE, SND_PCM_FORMAT_U24_3LE },
++	// { AFMT_U24_BE, SND_PCM_FORMAT_U24_3BE },
++	// { AFMT_S32_LE, SND_PCM_FORMAT_S32_LE  },
++	// { AFMT_S32_BE, SND_PCM_FORMAT_S32_BE  },
++	// { AFMT_U32_LE, SND_PCM_FORMAT_U32_LE  },
++	// { AFMT_U32_BE, SND_PCM_FORMAT_U32_BE  },
 +	/* Special */
-+	{ AFMT_S24_LE, SND_PCM_FORMAT_S20_3LE },
-+	{ AFMT_S24_BE, SND_PCM_FORMAT_S20_3BE },
-+	{ AFMT_U24_LE, SND_PCM_FORMAT_U20_3LE },
-+	{ AFMT_U24_BE, SND_PCM_FORMAT_U20_3BE },
-+	{ AFMT_S24_LE, SND_PCM_FORMAT_S18_3LE },
-+	{ AFMT_S24_BE, SND_PCM_FORMAT_S18_3BE },
-+	{ AFMT_U24_LE, SND_PCM_FORMAT_U18_3LE },
-+	{ AFMT_U24_BE, SND_PCM_FORMAT_U18_3BE },
-+	{ AFMT_S32_LE, SND_PCM_FORMAT_S24_LE  },
-+	{ AFMT_S32_BE, SND_PCM_FORMAT_S24_BE  },
-+	{ AFMT_U32_LE, SND_PCM_FORMAT_U24_LE  },
-+	{ AFMT_U32_BE, SND_PCM_FORMAT_U24_BE  },
++	// { AFMT_S24_LE, SND_PCM_FORMAT_S20_3LE },
++	// { AFMT_S24_BE, SND_PCM_FORMAT_S20_3BE },
++	// { AFMT_U24_LE, SND_PCM_FORMAT_U20_3LE },
++	// { AFMT_U24_BE, SND_PCM_FORMAT_U20_3BE },
++	// { AFMT_S24_LE, SND_PCM_FORMAT_S18_3LE },
++	// { AFMT_S24_BE, SND_PCM_FORMAT_S18_3BE },
++	// { AFMT_U24_LE, SND_PCM_FORMAT_U18_3LE },
++	// { AFMT_U24_BE, SND_PCM_FORMAT_U18_3BE },
++	// { AFMT_S32_LE, SND_PCM_FORMAT_S24_LE  },
++	// { AFMT_S32_BE, SND_PCM_FORMAT_S24_BE  },
++	// { AFMT_U32_LE, SND_PCM_FORMAT_U24_LE  },
++	// { AFMT_U32_BE, SND_PCM_FORMAT_U24_BE  },
 +};
-+#endif
 +
  static int oss_hw_params(snd_pcm_ioplug_t *io,
  			 snd_pcm_hw_params_t *params ATTRIBUTE_UNUSED)
  {
  	snd_pcm_oss_t *oss = io->private_data;
  	int i, tmp, err;
-+#ifdef FREEBSD_OSS
+-	unsigned int period_bytes;
 +	int blksz_shift, blkcnt;
 +	audio_buf_info bi;
-+#else
- 	unsigned int period_bytes;
-+#endif
  	long oflags, flags;
  
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
 +
  	oss->frame_bytes = (snd_pcm_format_physical_width(io->format) * io->channels) / 8;
-+#ifdef FREEBSD_OSS
-+	oss->ptr_align = io->buffer_size * oss->frame_bytes;
-+
+-	switch (io->format) {
+-	case SND_PCM_FORMAT_U8:
+-		oss->format = AFMT_U8;
+-		break;
+-	case SND_PCM_FORMAT_S16_LE:
+-		oss->format = AFMT_S16_LE;
+-		break;
+-	case SND_PCM_FORMAT_S16_BE:
+-		oss->format = AFMT_S16_BE;
+-		break;
+-	default:
 +	oss->format = 0;
-+	for (i = 0; i < ARRAY_SIZE(oss_formats_tab); i++) {
++	for (i = 0; i != ARRAY_SIZE(oss_formats_tab); i++) {
 +		if (oss_formats_tab[i].alsa_format == io->format) {
 +			oss->format = oss_formats_tab[i].oss_format;
 +			break;
 +		}
 +	}
 +	if (oss->format == 0) {
-+#else
- 	switch (io->format) {
- 	case SND_PCM_FORMAT_U8:
- 		oss->format = AFMT_U8;
-@@ -166,9 +416,93 @@ static int oss_hw_params(snd_pcm_ioplug_t *io,
- 		oss->format = AFMT_S16_BE;
- 		break;
- 	default:
-+#endif
  		fprintf(stderr, "*** OSS: unsupported format %s\n", snd_pcm_format_name(io->format));
  		return -EINVAL;
  	}
-+#ifdef FREEBSD_OSS
+-	period_bytes = io->period_size * oss->frame_bytes;
+-	oss->period_shift = 0;
+-	for (i = 31; i >= 4; i--) {
+-		if (period_bytes & (1U << i)) {
+-			oss->period_shift = i;
 +
 +	ioctl(oss->fd, SNDCTL_DSP_RESET);
 +
-+	/* use a 16ms HW buffer by default */
-+	tmp = ((16 * io->rate) / 1000) * oss->frame_bytes;
++	/* use a 8ms HW buffer by default */
++	tmp = ((8 * io->rate) / 1000) * oss->frame_bytes;
 +
 +	/* round up to nearest power of two */
 +	while (tmp & (tmp - 1))
@@ -382,23 +356,52 @@
 +	/* get logarithmic value */
 +	for (blksz_shift = 0; blksz_shift < 24; blksz_shift++) {
 +		if (tmp == (1 << blksz_shift))
-+			break;
-+	}
+ 			break;
+-		}
+ 	}
+-	if (! oss->period_shift) {
+-		fprintf(stderr, "*** OSS: invalid period size %d\n", (int)io->period_size);
+-		return -EINVAL;
 +
 +	tmp = io->buffer_size * oss->frame_bytes;
 +
 +	/* compute HW buffer big enough to hold SW buffer */
-+	for (blkcnt = FREEBSD_OSS_BLKCNT_MIN; blkcnt != FREEBSD_OSS_BLKCNT_MAX; blkcnt *= 2) {
++	for (blkcnt = ALSA_OSS_BLKCNT_MIN; blkcnt != ALSA_OSS_BLKCNT_MAX; blkcnt *= 2) {
 +		if ((blkcnt << blksz_shift) >= tmp)
 +			break;
-+	}
-+
+ 	}
+-	oss->periods = io->buffer_size / io->period_size;
+ 
+- _retry:
+-	tmp = oss->period_shift | (oss->periods << 16);
 +	tmp = blksz_shift | (blkcnt << 16);
-+	if (ioctl(oss->fd, SNDCTL_DSP_SETFRAGMENT, &tmp) < 0) {
+ 	if (ioctl(oss->fd, SNDCTL_DSP_SETFRAGMENT, &tmp) < 0) {
+-		if (! oss->fragment_set) {
+-			perror("SNDCTL_DSP_SETFRAGMENT");
+-			fprintf(stderr, "*** period shift = %d, periods = %d\n", oss->period_shift, oss->periods);
+-			return -EINVAL;
+-		}
+-		/* OSS has no proper way to reinitialize the fragments */
+-		/* try to reopen the device */
+-		close(oss->fd);
+-		oss->fd = open(oss->device, io->stream == SND_PCM_STREAM_PLAYBACK ?
+-			       O_WRONLY : O_RDONLY);
+-		if (oss->fd < 0) {
+-			err = -errno;
+-			SNDERR("Cannot reopen the device %s", oss->device);
+-			return err;
+-		}
+-		io->poll_fd = oss->fd;
+-		io->poll_events = io->stream == SND_PCM_STREAM_PLAYBACK ?
+-			POLLOUT : POLLIN;
+-		snd_pcm_ioplug_reinit_status(io);
+-		oss->fragment_set = 0;
+-		goto _retry;
 +		perror("SNDCTL_DSP_SETFRAGMENTS");
 +		return -EINVAL;
-+	}
-+
+ 	}
+-	oss->fragment_set = 1;
+ 
 +	tmp = oss->format;
 +	if (ioctl(oss->fd, SNDCTL_DSP_SETFMT, &tmp) < 0 ||
 +	    tmp != oss->format) {
@@ -428,18 +431,7 @@
 +
 +	oss->bufsz = bi.fragsize * bi.fragstotal;
 +
-+#ifdef SNDCTL_DSP_LOW_WATER
-+	tmp = ((io->period_size * oss->frame_bytes) * 3) / 4;
-+	tmp -= tmp % oss->frame_bytes;
-+	if (tmp < oss->frame_bytes)
-+		tmp = oss->frame_bytes;
-+	if (tmp > bi.fragsize)
-+		tmp = bi.fragsize;
-+	if (ioctl(oss->fd, SNDCTL_DSP_LOW_WATER, &tmp) < 0)
-+		perror("SNDCTL_DSP_LOW_WATER");
-+#endif
-+
-+#ifdef FREEBSD_OSS_DEBUG_VERBOSE
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr,
 +	    "\n\n[%lu -> %d] %lu ~ %d -> %d, %lu ~ %d -> %d [d:%ld lw:%d]\n\n",
 +	    io->buffer_size / io->period_size, bi.fragstotal,
@@ -450,19 +442,10 @@
 +	    (long)(io->buffer_size * oss->frame_bytes) -
 +	    oss->bufsz, tmp);
 +#endif
-+#else
- 	period_bytes = io->period_size * oss->frame_bytes;
- 	oss->period_shift = 0;
- 	for (i = 31; i >= 4; i--) {
-@@ -209,6 +543,7 @@ static int oss_hw_params(snd_pcm_ioplug_t *io,
- 		goto _retry;
- 	}
- 	oss->fragment_set = 1;
-+#endif
- 
  	if ((flags = fcntl(oss->fd, F_GETFL)) < 0) {
  		err = -errno;
-@@ -229,16 +564,152 @@ static int oss_hw_params(snd_pcm_ioplug_t *io,
+ 		perror("F_GETFL");
+@@ -229,16 +415,148 @@ static int oss_hw_params(snd_pcm_ioplug_t *io,
  	return 0;
  }
  
@@ -470,7 +453,7 @@
 -
  static int oss_hw_constraint(snd_pcm_oss_t *oss)
  {
-+#ifdef FREEBSD_OSS
++#ifdef FREEBSD_OSS // __FreeBSD__
  	snd_pcm_ioplug_t *io = &oss->io; 
  	static const snd_pcm_access_t access_list[] = {
  		SND_PCM_ACCESS_RW_INTERLEAVED,
@@ -484,13 +467,9 @@
 +#endif
  	unsigned int nformats;
 +	unsigned int format[ARRAY_SIZE(oss_formats_tab)];
-+#if 0
-+	unsigned int nchannels;
-+	unsigned int channel[FREEBSD_OSS_CHANNELS_MAX];
-+#endif
 +	int i, err, tmp;
 +
-+#ifdef FREEBSD_OSS_DEBUG_VERBOSE
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
 +
@@ -539,13 +518,13 @@
 +		return err;
 +#endif
 +	err = snd_pcm_ioplug_set_param_minmax(io, SND_PCM_IOPLUG_HW_CHANNELS,
-+	    FREEBSD_OSS_CHANNELS_MIN, FREEBSD_OSS_CHANNELS_MAX);
++	    ALSA_OSS_CHANNELS_MIN, ALSA_OSS_CHANNELS_MAX);
 +	if (err < 0)
 +		return err;
 +
 +	/* supported rates */
 +	err = snd_pcm_ioplug_set_param_minmax(io, SND_PCM_IOPLUG_HW_RATE,
-+	    FREEBSD_OSS_RATE_MIN, FREEBSD_OSS_RATE_MAX);
++	    ALSA_OSS_RATE_MIN, ALSA_OSS_RATE_MAX);
 +	if (err < 0)
 +		return err;
 +
@@ -558,9 +537,9 @@
 +#ifdef FREEBSD_OSS_BLKCNT_P2
 +	tmp = 0;
 +	for (i = 1; i < 31 && tmp < ARRAY_SIZE(period_list); i++) {
-+		if ((1 << i) > FREEBSD_OSS_BLKCNT_MAX)
++		if ((1 << i) > ALSA_OSS_BLKCNT_MAX)
 +			break;
-+		if ((1 << i) < FREEBSD_OSS_BLKCNT_MIN)
++		if ((1 << i) < ALSA_OSS_BLKCNT_MIN)
 +			continue;
 +		period_list[tmp++] = 1 << i;
 +	}
@@ -572,24 +551,24 @@
 +#endif
 +	/* periods , not strictly ^2 but later on will be refined */
 +		err = snd_pcm_ioplug_set_param_minmax(io,
-+		    SND_PCM_IOPLUG_HW_PERIODS, FREEBSD_OSS_BLKCNT_MIN,
-+		    FREEBSD_OSS_BLKCNT_MAX);
++		    SND_PCM_IOPLUG_HW_PERIODS, ALSA_OSS_BLKCNT_MIN,
++		    ALSA_OSS_BLKCNT_MAX);
 +	if (err < 0)
 +		return err;
 +
 +	/* period size , not strictly ^2 */
 +	err = snd_pcm_ioplug_set_param_minmax(io,
-+	    SND_PCM_IOPLUG_HW_PERIOD_BYTES, FREEBSD_OSS_BLKSZ_MIN,
-+	    FREEBSD_OSS_BLKSZ_MAX);
++	    SND_PCM_IOPLUG_HW_PERIOD_BYTES, ALSA_OSS_BLKSZ_MIN,
++	    ALSA_OSS_BLKSZ_MAX);
 +	if (err < 0)
 +		return err;
 +
 +#ifdef FREEBSD_OSS_BUFSZ_P2
 +	tmp = 0;
 +	for (i = 1; i < 31 && tmp < ARRAY_SIZE(bufsz_list); i++) {
-+		if ((1 << i) > FREEBSD_OSS_BUFSZ_MAX)
++		if ((1 << i) > ALSA_OSS_BUFSZ_MAX)
 +			break;
-+		if ((1 << i) < FREEBSD_OSS_BUFSZ_MIN)
++		if ((1 << i) < ALSA_OSS_BUFSZ_MIN)
 +			continue;
 +		bufsz_list[tmp++] = 1 << i;
 +	}
@@ -601,8 +580,8 @@
 +#endif
 +	/* buffer size , not strictly ^2 */
 +	err = snd_pcm_ioplug_set_param_minmax(io,
-+	    SND_PCM_IOPLUG_HW_BUFFER_BYTES, FREEBSD_OSS_BUFSZ_MIN,
-+	    FREEBSD_OSS_BUFSZ_MAX);
++	    SND_PCM_IOPLUG_HW_BUFFER_BYTES, ALSA_OSS_BUFSZ_MIN,
++	    ALSA_OSS_BUFSZ_MAX);
 +	if (err < 0)
 +		return err;
 +
@@ -617,7 +596,7 @@
  	unsigned int format[5];
  	unsigned int nchannels;
  	unsigned int channel[6];
-@@ -317,6 +788,7 @@ static int oss_hw_constraint(snd_pcm_oss_t *oss)
+@@ -317,6 +635,7 @@ static int oss_hw_constraint(snd_pcm_oss_t *oss)
  		return err;
  
  	return 0;
@@ -625,46 +604,38 @@
  }
  
  
-@@ -324,6 +796,10 @@ static int oss_close(snd_pcm_ioplug_t *io)
+@@ -324,6 +643,10 @@ static int oss_close(snd_pcm_ioplug_t *io)
  {
  	snd_pcm_oss_t *oss = io->private_data;
  
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
 +
  	close(oss->fd);
  	free(oss->device);
  	free(oss);
-@@ -337,8 +813,11 @@ static const snd_pcm_ioplug_callback_t oss_playback_ca
- 	.pointer = oss_pointer,
- 	.close = oss_close,
+@@ -339,6 +662,7 @@ static const snd_pcm_ioplug_callback_t oss_playback_ca
  	.hw_params = oss_hw_params,
-+#ifndef FREEBSD_OSS
  	.prepare = oss_prepare,
-+#endif
  	.drain = oss_drain,
 +	.delay = oss_delay,
  };
  
  static const snd_pcm_ioplug_callback_t oss_capture_callback = {
-@@ -348,8 +827,11 @@ static const snd_pcm_ioplug_callback_t oss_capture_cal
- 	.pointer = oss_pointer,
- 	.close = oss_close,
+@@ -350,6 +674,7 @@ static const snd_pcm_ioplug_callback_t oss_capture_cal
  	.hw_params = oss_hw_params,
-+#ifndef FREEBSD_OSS
  	.prepare = oss_prepare,
-+#endif
  	.drain = oss_drain,
 +	.delay = oss_delay,
  };
  
  
-@@ -360,6 +842,10 @@ SND_PCM_PLUGIN_DEFINE_FUNC(oss)
+@@ -360,6 +685,10 @@ SND_PCM_PLUGIN_DEFINE_FUNC(oss)
  	int err;
  	snd_pcm_oss_t *oss;
  	
-+#if defined(FREEBSD_OSS) && defined(FREEBSD_OSS_DEBUG_VERBOSE)
++#ifdef ALSA_OSS_DEBUG_VERBOSE
 +	fprintf(stderr, "%s()\n", __func__);
 +#endif
 +