Index: head/audio/oss/Makefile =================================================================== --- head/audio/oss/Makefile (revision 523347) +++ head/audio/oss/Makefile (revision 523348) @@ -1,122 +1,116 @@ # Created by: Edward Tomasz Napierala # $FreeBSD$ PORTNAME= oss DISTVERSION= 4.2-build2019 -PORTREVISION= 1 +PORTREVISION= 2 CATEGORIES= audio MASTER_SITES= http://www.opensound.com/developer/sources/stable/bsd/ DISTNAME= ${PORTNAME}-v${DISTVERSION}-src-bsd MAINTAINER= crees@FreeBSD.org COMMENT= Open Sound System from 4Front Technologies LICENSE= BSD2CLAUSE ONLY_FOR_ARCHS= amd64 i386 BUILD_DEPENDS= gawk:lang/gawk LIB_DEPENDS= libfontconfig.so:x11-fonts/fontconfig \ libfreetype.so:print/freetype2 USES= gnome tar:bzip2 kmod pkgconfig USE_GNOME= gtk20 cairo gdkpixbuf2 USE_RC_SUBR= oss - -.include - -.if ${OSVERSION} > 1300067 -BROKEN= Still uses removed timeout interface and needs updating -.endif HAS_CONFIGURE= yes CONFIGURE_OUTSOURCE= yes CONFIGURE_ENV= HOSTCC="${CC}" ALL_TARGET= all install SUB_FILES= pkg-install pkg-deinstall LLD_UNSAFE= yes KMODDIR= ${PREFIX}/lib/oss/modules OSS_CONF_FILES= oss_audigyls oss_audioloop oss_cs461x oss_emu10k1x \ oss_envy24 oss_envy24ht oss_fmedia oss_hdaudio \ oss_ich oss_imux oss_madi oss_midiloop oss_sblive \ oss_sbpci oss_sbxfi oss_trident oss_usb oss_userdev \ oss_ymf7xx osscore PROTO_DIR= ${INSTALL_WRKSRC}/prototype PROTO_ETCDIR= ${PROTO_DIR}/etc PROTO_BINDIR= ${PROTO_DIR}/usr/bin PROTO_SBINDIR= ${PROTO_DIR}/usr/sbin PROTO_MANDIR= ${PROTO_DIR}/usr/share/man PROTO_OSSLIBDIR=${PROTO_DIR}${PREFIX}/lib/oss OPTIONS_DEFINE= VORBIS OPTIONS_DEFAULT=VORBIS VORBIS_LIB_DEPENDS= libvorbisfile.so:audio/libvorbis VORBIS_CONFIGURE_ENV= OGG_SUPPORT=YES pre-patch: ${FIND} ${PATCH_WRKSRC} -name '*.man' -or \ \( -name '*.[ch]' \! -name ossmkdep.c \) | \ ${XARGS} ${REINPLACE_CMD} -e 's|/usr/|${PREFIX}/|g' \ -e 's|/etc/oss|${PREFIX}/etc/oss|g' post-patch: ${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \ ${PATCH_WRKSRC}/setup/srcconf.c ${FIND} ${PATCH_WRKSRC} -name configure -or \ -name make.local -or -name soundoff -or -name soundon | \ ${XARGS} ${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' pre-build: ${MAKE_CMD} -C ${BUILD_WRKSRC}/kernel/OS/FreeBSD \ -f /usr/share/mk/bsd.kmod.mk \ KMOD=osscore SRCS=os_freebsd.c \ device_if.h bus_if.h pci_if.h do-install: ${INSTALL_PROGRAM} ${PROTO_BINDIR}/* ${STAGEDIR}${PREFIX}/bin/ # @${ECHO_CMD} "OSSLIBDIR=${PREFIX}/lib/oss" > ${PROTO_ETCDIR}/oss.conf ${INSTALL_DATA} ${PROTO_ETCDIR}/oss.conf ${STAGEDIR}${PREFIX}/etc/ -@${MKDIR} ${STAGEDIR}${PREFIX}/lib/oss 2>/dev/null ${INSTALL_DATA} ${PROTO_OSSLIBDIR}/soundon.user \ ${STAGEDIR}${PREFIX}/lib/oss/soundon.user.sample ${INSTALL_DATA} ${PROTO_OSSLIBDIR}/sysfiles.list \ ${STAGEDIR}${PREFIX}/lib/oss/ ${INSTALL_DATA} ${PROTO_OSSLIBDIR}/version.dat \ ${STAGEDIR}${PREFIX}/lib/oss/ -@${MKDIR} ${STAGEDIR}${PREFIX}/lib/oss/conf 2>/dev/null .for CONF_FILE in ${OSS_CONF_FILES} ${INSTALL_DATA} ${PROTO_OSSLIBDIR}/conf/${CONF_FILE}.conf \ ${STAGEDIR}${PREFIX}/lib/oss/conf/${CONF_FILE}.conf.sample .endfor -@${MKDIR} ${STAGEDIR}${PREFIX}/lib/oss/etc 2>/dev/null ${INSTALL_DATA} ${PROTO_OSSLIBDIR}/etc/devices.list \ ${STAGEDIR}${PREFIX}/lib/oss/etc/ -@${MKDIR} ${STAGEDIR}${PREFIX}/lib/oss/include/sys 2>/dev/null ${INSTALL_DATA} ${PROTO_OSSLIBDIR}/include/sys/soundcard.h \ ${STAGEDIR}${PREFIX}/lib/oss/include/sys/ ${INSTALL_KLD} ${PROTO_OSSLIBDIR}/modules/*.ko ${STAGEDIR}${KMODDIR} ${INSTALL_MAN} ${PROTO_MANDIR}/man1/*.1.gz \ ${STAGEDIR}${PREFIX}/man/man1/ ${INSTALL_MAN} ${PROTO_MANDIR}/man7/*.7.gz \ ${STAGEDIR}${PREFIX}/man/man7/ ${INSTALL_MAN} ${PROTO_MANDIR}/man8/*.8.gz \ ${STAGEDIR}${PREFIX}/man/man8/ ${INSTALL_PROGRAM} ${PROTO_SBINDIR}/ossdetect \ ${STAGEDIR}${PREFIX}/sbin/ ${INSTALL_PROGRAM} ${PROTO_SBINDIR}/ossdevlinks \ ${STAGEDIR}${PREFIX}/sbin/ ${INSTALL_PROGRAM} ${PROTO_SBINDIR}/savemixer \ ${STAGEDIR}${PREFIX}/sbin/ ${INSTALL_SCRIPT} ${PROTO_SBINDIR}/soundoff \ ${STAGEDIR}${PREFIX}/sbin/ ${INSTALL_SCRIPT} ${PROTO_SBINDIR}/soundon \ ${STAGEDIR}${PREFIX}/sbin/ ${INSTALL_PROGRAM} ${PROTO_SBINDIR}/vmixctl \ ${STAGEDIR}${PREFIX}/sbin/ .include Index: head/audio/oss/files/patch-kernel_OS_FreeBSD_os__freebsd.c =================================================================== --- head/audio/oss/files/patch-kernel_OS_FreeBSD_os__freebsd.c (revision 523347) +++ head/audio/oss/files/patch-kernel_OS_FreeBSD_os__freebsd.c (revision 523348) @@ -1,36 +1,124 @@ ---- kernel/OS/FreeBSD/os_freebsd.c.orig 2019-03-06 07:52:21 UTC +--- kernel/OS/FreeBSD/os_freebsd.c.orig 2020-01-07 14:59:06 UTC +++ kernel/OS/FreeBSD/os_freebsd.c -@@ -15,6 +15,9 @@ - #include "oss_config.h" - #include "midi_core.h" - #include -+#include -+#include -+#include - #include - #include - #include -@@ -25,6 +28,7 @@ - #include - #include - #include -+#include +@@ -473,7 +473,7 @@ typedef struct tmout_desc + void (*func) (void *); + void *arg; - /* Function prototypes */ - static d_open_t oss_open; -@@ -920,15 +924,9 @@ oss_poll (struct cdev *bsd_dev, int events, struct thr - return ev.revents; +- struct callout_handle timer; ++ struct callout timer; + } tmout_desc_t; + + static volatile int next_id = 0; +@@ -483,12 +483,17 @@ tmout_desc_t tmouts[MAX_TMOUTS] = { {0} }; + + int timeout_random = 0x12123400; + ++static struct mtx oss_timeout_mutex; ++ + void + oss_timer_callback (void *arg) + { + int ix; ++ void (*func) (void *); + tmout_desc_t *tmout = arg; + ++ /* oss_timeout_mutex locked by callout */ ++ + timeout_random++; + + if (!tmout->active) +@@ -498,7 +503,10 @@ oss_timer_callback (void *arg) + tmout->active = 0; + tmout->timestamp = 0; + +- tmout->func (arg); ++ func = tmout->func; ++ mtx_unlock(&oss_timeout_mutex); ++ ++ func (arg); } --#if defined(D_VERSION_03) && (D_VERSION == D_VERSION_03) - static int - oss_mmap (struct cdev *bsd_dev, vm_ooffset_t offset, vm_paddr_t * paddr, - int nprot, vm_memattr_t *memattr) --#else --static int --oss_mmap (struct cdev *bsd_dev, vm_offset_t offset, vm_paddr_t * paddr, -- int nprot) --#endif + timeout_id_t +@@ -507,6 +515,8 @@ oss_timeout (void (*func) (void *), void *arg, unsigne + tmout_desc_t *tmout = NULL; + int id, n; + ++ mtx_lock(&oss_timeout_mutex); ++ + timeout_random++; + + n = 0; +@@ -527,6 +537,7 @@ oss_timeout (void (*func) (void *), void *arg, unsigne + + if (id == -1) /* No timer slots available */ + { ++ mtx_unlock(&oss_timeout_mutex); + cmn_err (CE_CONT, "Timeout table full\n"); + return 0; + } +@@ -535,8 +546,10 @@ oss_timeout (void (*func) (void *), void *arg, unsigne + tmout->arg = arg; + tmout->timestamp = id | (timeout_random & ~0xff); + +- tmout->timer = timeout (oss_timer_callback, tmout, ticks); ++ callout_reset(&tmout->timer, ticks, oss_timer_callback, tmout); + ++ mtx_unlock(&oss_timeout_mutex); ++ + return id | (timeout_random & ~0xff); + } + +@@ -550,15 +563,19 @@ oss_untimeout (timeout_id_t id) + if (ix < 0 || ix >= MAX_TMOUTS) + return; + ++ mtx_lock(&oss_timeout_mutex); ++ + timeout_random++; + tmout = &tmouts[ix]; + + if (tmout->timestamp != id) /* Expired timer */ + return; + if (tmout->active) +- untimeout (oss_timer_callback, tmout, tmout->timer); ++ callout_stop(&tmout->timer); + tmout->active = 0; + tmout->timestamp = 0; ++ ++ mtx_unlock(&oss_timeout_mutex); + } + + int +@@ -618,6 +635,7 @@ oss_get_walltime (void) + int + soundcard_attach (void) { - int retval; - int dev; ++ int i; + oss_device_t *osdev; + + if (module_lookupbyname("sound") != NULL) +@@ -649,6 +667,12 @@ soundcard_attach (void) + + oss_common_init (osdev); + ++ mtx_init(&oss_timeout_mutex, "OSS timeout", NULL, MTX_DEF); ++ ++ for (i = 0; i < MAX_TMOUTS; ++i) ++ callout_init_mtx(&tmouts[i].timer, &oss_timeout_mutex, ++ CALLOUT_RETURNUNLOCKED); ++ + return 0; + } + +@@ -659,6 +683,11 @@ soundcard_detach (void) + + if (refcount > 0 || open_devices > 0) + return EBUSY; ++ ++ for (i = 0; i < MAX_TMOUTS; ++i) ++ callout_drain(&tmouts[i].timer); ++ ++ mtx_destroy(&oss_timeout_mutex); + + oss_unload_drivers (); +