summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--audio/alsa-plugins/Makefile5
-rw-r--r--audio/alsa-plugins/files/patch-oss_pcm__oss.c129
2 files changed, 129 insertions, 5 deletions
diff --git a/audio/alsa-plugins/Makefile b/audio/alsa-plugins/Makefile
index ae38c762efe2..efc255f9bf1e 100644
--- a/audio/alsa-plugins/Makefile
+++ b/audio/alsa-plugins/Makefile
@@ -3,7 +3,7 @@
PORTNAME= alsa-plugins
PORTVERSION= 1.1.1
-PORTREVISION= 4
+PORTREVISION= 5
CATEGORIES= audio
MASTER_SITES= ftp://ftp.alsa-project.org/pub/plugins/ \
GENTOO
@@ -15,8 +15,9 @@ LICENSE= LGPL21+
LIB_DEPENDS= libasound.so:audio/alsa-lib
-GNU_CONFIGURE= yes
USES= alias libtool:keepla localbase pkgconfig tar:bzip2
+
+GNU_CONFIGURE= yes
EXTRA_PATCHES+= ${FILESDIR}/alsa-plugins.patch
INSTALL_TARGET= install-strip
CPPFLAGS+= -I${.CURDIR}/../alsa-lib/files
diff --git a/audio/alsa-plugins/files/patch-oss_pcm__oss.c b/audio/alsa-plugins/files/patch-oss_pcm__oss.c
index 79966ae29fb8..ab9d39d01951 100644
--- a/audio/alsa-plugins/files/patch-oss_pcm__oss.c
+++ b/audio/alsa-plugins/files/patch-oss_pcm__oss.c
@@ -1,4 +1,4 @@
---- oss/pcm_oss.c.orig 2016-07-26 13:27:23 UTC
+--- oss/pcm_oss.c.orig 2019-07-04 14:37:07 UTC
+++ oss/pcm_oss.c
@@ -22,7 +22,11 @@
#include <sys/ioctl.h>
@@ -12,7 +12,55 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(*(x)))
-@@ -258,7 +262,7 @@ static int oss_drain(snd_pcm_ioplug_t *i
+@@ -74,11 +78,19 @@ static snd_pcm_sframes_t oss_write(snd_p
+ size *= oss->frame_bytes;
+ result = write(oss->fd, buf, size);
+ #ifdef __FreeBSD__
+- if (result == -1)
+- return -errno;
++ if (result == -1) {
++ if (errno == EAGAIN)
++ return 0;
++ else
++ return -errno;
++ }
+ #else
+- if (result <= 0)
+- return result;
++ if (result <= 0) {
++ if (result == -EAGAIN)
++ return 0;
++ else
++ return result;
++ }
+ #endif
+ return result / oss->frame_bytes;
+ }
+@@ -97,11 +109,19 @@ static snd_pcm_sframes_t oss_read(snd_pc
+ size *= oss->frame_bytes;
+ result = read(oss->fd, buf, size);
+ #ifdef __FreeBSD__
+- if (result == -1)
+- return -errno;
++ if (result == -1) {
++ if (errno == EAGAIN)
++ return 0;
++ else
++ return -errno;
++ }
+ #else
+- if (result <= 0)
+- return result;
++ if (result <= 0) {
++ if (result == -EAGAIN)
++ return 0;
++ else
++ return result;
++ }
+ #endif
+ return result / oss->frame_bytes;
+ }
+@@ -258,10 +278,29 @@ static int oss_drain(snd_pcm_ioplug_t *i
#endif
if (io->stream == SND_PCM_STREAM_PLAYBACK)
@@ -21,7 +69,29 @@
return 0;
}
-@@ -272,7 +276,7 @@ static int oss_prepare(snd_pcm_ioplug_t
++static int oss_delay(snd_pcm_ioplug_t *io, snd_pcm_sframes_t *delayp)
++{
++ snd_pcm_oss_t *oss = io->private_data;
++ int tmp;
++
++ if (oss->fd < 0)
++ return -EBADFD;
++
++ 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);
++
++ return (0);
++}
++
+ #ifndef __FreeBSD__
+ static int oss_prepare(snd_pcm_ioplug_t *io)
+ {
+@@ -272,7 +311,7 @@ static int oss_prepare(snd_pcm_ioplug_t
fprintf(stderr, "%s()\n", __func__);
#endif
@@ -30,3 +100,56 @@
tmp = io->channels;
if (ioctl(oss->fd, SNDCTL_DSP_CHANNELS, &tmp) < 0) {
+@@ -380,20 +419,26 @@ static int oss_hw_params(snd_pcm_ioplug_
+
+ ioctl(oss->fd, SNDCTL_DSP_RESET);
+
+-#define blksz_aligned() ((1 << blksz_shift) - \
+- ((1 << blksz_shift) % oss->frame_bytes))
+- blksz_shift = 16;
+- tmp = io->period_size * oss->frame_bytes;
++ /* use a 16ms HW buffer by default */
++ tmp = ((16 * io->rate) / 1000) * oss->frame_bytes;
+
+- while (blksz_shift > 4 && blksz_aligned() > tmp)
+- blksz_shift--;
++ /* round up to nearest power of two */
++ while (tmp & (tmp - 1))
++ tmp += tmp & ~(tmp - 1);
++
++ /* get logarithmic value */
++ for (blksz_shift = 0; blksz_shift < 24; blksz_shift++) {
++ if (tmp == (1 << blksz_shift))
++ break;
++ }
+
+- blkcnt = 2;
+ tmp = io->buffer_size * oss->frame_bytes;
+
+- while (blkcnt < 4096 && (blksz_aligned() * blkcnt) < tmp &&
+- ((1 << blksz_shift) * blkcnt) < 131072)
+- blkcnt <<= 1;
++ /* compute HW buffer big enough to hold SW buffer */
++ for (blkcnt = FREEBSD_OSS_BLKCNT_MIN; blkcnt != FREEBSD_OSS_BLKCNT_MAX; blkcnt *= 2) {
++ if ((blkcnt << blksz_shift) >= tmp)
++ break;
++ }
+
+ tmp = blksz_shift | (blkcnt << 16);
+ if (ioctl(oss->fd, SNDCTL_DSP_SETFRAGMENT, &tmp) < 0) {
+@@ -767,6 +812,7 @@ static const snd_pcm_ioplug_callback_t o
+ .prepare = oss_prepare,
+ #endif
+ .drain = oss_drain,
++ .delay = oss_delay,
+ };
+
+ static const snd_pcm_ioplug_callback_t oss_capture_callback = {
+@@ -780,6 +826,7 @@ static const snd_pcm_ioplug_callback_t o
+ .prepare = oss_prepare,
+ #endif
+ .drain = oss_drain,
++ .delay = oss_delay,
+ };
+
+