Index: head/audio/alsa-plugins/Makefile =================================================================== --- head/audio/alsa-plugins/Makefile (revision 505838) +++ head/audio/alsa-plugins/Makefile (revision 505839) @@ -1,63 +1,64 @@ # Created by: Aragon Gouveia # $FreeBSD$ PORTNAME= alsa-plugins PORTVERSION= 1.1.1 -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= audio MASTER_SITES= ftp://ftp.alsa-project.org/pub/plugins/ \ GENTOO MAINTAINER= jbeich@FreeBSD.org COMMENT= ALSA compatibility library plugins 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 OPTIONS_DEFAULT=BUFSZ_P2 IO_PTR OPTIONS_DEFINE= JACK FFMPEG PULSEAUDIO SAMPLERATE SPEEX OPTIONS_SUB= yes OPTIONS_GROUP= OSS OPTIONS_GROUP_OSS=IO_PTR BLKCNT_P2 BUFSZ_P2 VERBOSE IO_PTR_DESC= Precise playback/recording pointer BLKCNT_P2_DESC= Restrict number of fragments to ^2 aligned BUFSZ_P2_DESC= Restrict buffer size to ^2 aligned VERBOSE_DESC= Print debugging messages IO_PTR_CFLAGS= -DFREEBSD_OSS_USE_IO_PTR BLKCNT_P2_CFLAGS=-DFREEBSD_OSS_BLKCNT_P2 BUFSZ_P2_CFLAGS=-DFREEBSD_OSS_BUFSZ_P2 VERBOSE_CFLAGS= -DFREEBSD_OSS_DEBUG_VERBOSE JACK_LIB_DEPENDS= libjack.so:audio/jack JACK_CONFIGURE_ENABLE= jack JACK_IMPLIES= SAMPLERATE FFMPEG_LIB_DEPENDS= libavcodec.so:multimedia/ffmpeg FFMPEG_CONFIGURE_ENABLE=avcodec PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio PULSEAUDIO_CONFIGURE_ENABLE=pulseaudio SAMPLERATE_LIB_DEPENDS= libsamplerate.so:audio/libsamplerate SAMPLERATE_CONFIGURE_ENABLE=samplerate SPEEX_LIB_DEPENDS= libspeex.so:audio/speex SPEEX_CONFIGURE_ON= --with-speex=lib SPEEX_CONFIGURE_OFF= --without-speex post-patch: .SILENT ${REINPLACE_CMD} -e '/LIBS/s/-ldl//g' \ -e '/lt_cv_dlopen/s/-ldl//g' \ ${WRKSRC}/configure .include Index: head/audio/alsa-plugins/files/patch-oss_pcm__oss.c =================================================================== --- head/audio/alsa-plugins/files/patch-oss_pcm__oss.c (revision 505838) +++ head/audio/alsa-plugins/files/patch-oss_pcm__oss.c (revision 505839) @@ -1,32 +1,155 @@ ---- 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 #include #include +#ifdef __linux__ #include +#else +#include +#endif #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) - ioctl(oss->fd, SNDCTL_DSP_SYNC); + ioctl(oss->fd, SNDCTL_DSP_SYNC, NULL); 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 - ioctl(oss->fd, SNDCTL_DSP_RESET); + ioctl(oss->fd, SNDCTL_DSP_RESET, NULL); 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, + }; + +