diff --git a/audio/pulseaudio/Makefile b/audio/pulseaudio/Makefile index d88ae8c9776d..3b7f58dd198d 100644 --- a/audio/pulseaudio/Makefile +++ b/audio/pulseaudio/Makefile @@ -1,130 +1,130 @@ # Created by: Joe Marcus Clarke # # !!!NOTE!!! Any PORTVERSION update to this port must be accompanied by # PORTREVISION bumps of depending ports. PORTNAME= pulseaudio DISTVERSION= 14.2 -PORTREVISION= 3 +PORTREVISION= 4 CATEGORIES= audio MASTER_SITES= https://freedesktop.org/software/pulseaudio/releases/ MAINTAINER= desktop@FreeBSD.org COMMENT= Sound server for UNIX LICENSE= LGPL21 LICENSE_FILE= ${WRKSRC}/LGPL BUILD_DEPENDS= p5-XML-Parser>=0:textproc/p5-XML-Parser LIB_DEPENDS= libsndfile.so:audio/libsndfile \ libfftw3.so:math/fftw3 \ libfftw3f.so:math/fftw3-float \ libdbus-1.so:devel/dbus \ libltdl.so:devel/libltdl \ libck-connector.so:sysutils/consolekit2 USES= compiler:c11 cpe gettext gmake gnome iconv libtool:build localbase:ldflags \ pathfix pkgconfig python:run shebangfix ssl tar:xz USE_GNOME= glib20 USE_LDCONFIG= yes GNU_CONFIGURE= yes CONFIGURE_ENV= PTHREAD_LIBS="-lpthread" \ OPENSSL_CFLAGS="-I${OPENSSLINC}" \ OPENSSL_LIBS="-L${OPENSSLLIB} -lcrypto -lssl" \ LIBS="-lm -lintl" \ ac_cv_header_linux_input_h="" INSTALL_TARGET= install-strip SHEBANG_FILES= shell-completion/bash/pulseaudio \ src/utils/pa-info \ src/utils/qpaeq bash_CMD= ${SETENV} bash SUB_FILES= pkg-message CONFIGURE_ARGS= --localstatedir=/var \ --without-caps \ --disable-esound \ --disable-udev \ --disable-gtk3 \ --disable-systemd-daemon \ --disable-systemd-journal \ --disable-systemd-login \ --disable-neon-opt \ --disable-lirc # untested USERS= pulse GROUPS= pulse pulse-access pulse-rt OPTIONS_SUB= yes OPTIONS_DEFINE= AVAHI GCONF GSETTINGS SIMD TEST X11 OPTIONS_DEFAULT=AVAHI SIMD SIMPLE SOXR SPEEX WEBRTC_AEC X11 AVAHI_CONFIGURE_ENABLE= avahi AVAHI_LIB_DEPENDS= libavahi-client.so:net/avahi-app GCONF_CONFIGURE_ENABLE= gconf GCONF_USE= GNOME=gconf2 GSETTINGS_DESC= GSettings configuration backend support GSETTINGS_CONFIGURE_ENABLE= gsettings GSETTINGS_VARS= GLIB_SCHEMAS=org.freedesktop.pulseaudio.gschema.xml SIMD_CONFIGURE_ENABLE= orc SIMD_LIB_DEPENDS= liborc-0.4.so:devel/orc TEST_TEST_TARGET= check TEST_CONFIGURE_ENABLE= tests default-build-tests TEST_BUILD_DEPENDS= check>0:devel/check X11_CONFIGURE_ENABLE= x11 X11_USES= xorg X11_USE= XORG=ice,sm,x11,xcb,xtst OPTIONS_GROUP= AUDIO OPTIONS_GROUP_AUDIO= ALSA JACK SOXR SPEEX WEBRTC_AEC AUDIO_DESC= Audio support ALSA_CONFIGURE_ENABLE= alsa ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib JACK_CONFIGURE_ENABLE= jack JACK_LIB_DEPENDS= libjack.so:audio/jack SOXR_CONFIGURE_WITH= soxr SOXR_LIB_DEPENDS= libsoxr.so:audio/libsoxr SPEEX_DESC= Speex resampler and AEC support SPEEX_CONFIGURE_WITH= speex SPEEX_LIB_DEPENDS= libspeexdsp.so:audio/speexdsp WEBRTC_AEC_DESC= WebRTC-based echo canceller WEBRTC_AEC_LIB_DEPENDS= libwebrtc_audio_processing.so:audio/webrtc-audio-processing0 WEBRTC_AEC_CONFIGURE_ENABLE= webrtc-aec OPTIONS_SINGLE= DATABASE OPTIONS_SINGLE_DATABASE= TDB GDBM SIMPLE DATABASE_DESC= Database support GDBM_DESC= GNU database manager support GDBM_CONFIGURE_ON= --with-database=gdbm GDBM_LIB_DEPENDS= libgdbm.so:databases/gdbm SIMPLE_DESC= Simple database support SIMPLE_CONFIGURE_ON= --with-database=simple TDB_DESC= Trivial database support TDB_CONFIGURE_ON= --with-database=tdb TDB_LIB_DEPENDS= libtdb.so:databases/tdb PULSE_VERSION= ${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/} PLIST_SUB= PULSE_VERSION=${PULSE_VERSION} post-patch: @${REINPLACE_CMD} -e 's|/usr/share|${LOCALBASE}/share|g' \ ${WRKSRC}/src/daemon/default.pa.in @${REINPLACE_CMD} -e 's|/etc|${PREFIX}/etc|g' \ -e 's|--directory|-d|g' \ ${WRKSRC}/src/utils/pa-info @${REINPLACE_CMD} -e 's|-Wmissing-include-dirs||g' \ ${WRKSRC}/configure pre-install-TEST-on: do-test post-install: @${MKDIR} ${STAGEDIR}${PREFIX}/etc/pulse .for ii in default.pa daemon.conf client.conf system.pa ${INSTALL_DATA} ${WRKSRC}/src/${ii} \ ${STAGEDIR}${PREFIX}/etc/pulse/${ii}.sample .endfor # Delete ${STAGEDIR}${PREFIX}/libexec/pulse directory, if it's empty @(cd ${STAGEDIR}${PREFIX}/libexec && \ ${FIND} * -maxdepth 0 -type d -empty -name pulse -delete) .include diff --git a/audio/pulseaudio/files/patch-src_modules_oss_module-oss.c b/audio/pulseaudio/files/patch-src_modules_oss_module-oss.c index f7a54f7cc1f0..b077752ac2e2 100644 --- a/audio/pulseaudio/files/patch-src_modules_oss_module-oss.c +++ b/audio/pulseaudio/files/patch-src_modules_oss_module-oss.c @@ -1,17 +1,269 @@ ---- src/modules/oss/module-oss.c.orig 2018-05-07 14:30:52 UTC +--- src/modules/oss/module-oss.c.orig 2021-01-16 17:26:36 UTC +++ src/modules/oss/module-oss.c -@@ -1235,10 +1235,14 @@ int pa__init(pa_module*m) { +@@ -121,9 +121,6 @@ struct userdata { + int fd; + int mode; + +- int mixer_fd; +- int mixer_devmask; +- + int nfrags, frag_size, orig_frag_size; + + bool use_mmap; +@@ -817,76 +814,146 @@ static int source_set_state_in_io_thread_cb(pa_source + return 0; + } + ++static int open_mixer(struct userdata *u, int *p_devmask) { ++ int mixer_fd; ++ ++ mixer_fd = pa_oss_open_mixer_for_device(u->device_name); ++ if (mixer_fd < 0) ++ return (mixer_fd); ++ ++ if (ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, p_devmask) < 0) { ++ pa_log_warn("SOUND_MIXER_READ_DEVMASK failed: %s", pa_cstrerror(errno)); ++ pa_close(mixer_fd); ++ return (-1); ++ } ++ return (mixer_fd); ++} ++ ++static void oss_get_dummy_volume(const pa_sample_spec *ss, pa_cvolume *volume) { ++ char cv[PA_CVOLUME_SNPRINT_VERBOSE_MAX]; ++ unsigned vol; ++ ++ pa_assert(ss); ++ pa_assert(volume); ++ ++ vol = 100 | (100 << 8); ++ ++ pa_cvolume_reset(volume, ss->channels); ++ ++ volume->values[0] = PA_CLAMP_VOLUME(((vol & 0xFF) * PA_VOLUME_NORM) / 100); ++ ++ if (volume->channels >= 2) ++ volume->values[1] = PA_CLAMP_VOLUME((((vol >> 8) & 0xFF) * PA_VOLUME_NORM) / 100); ++ ++ pa_log_debug("Read dummy settings: %s", pa_cvolume_snprint_verbose(cv, sizeof(cv), volume, NULL, false)); ++} ++ + static void sink_get_volume(pa_sink *s) { + struct userdata *u; + ++ int mixer_fd; ++ int mixer_devmask; ++ + pa_assert_se(u = s->userdata); + +- pa_assert(u->mixer_devmask & (SOUND_MASK_VOLUME|SOUND_MASK_PCM)); ++ mixer_fd = open_mixer(u, &mixer_devmask); ++ if (mixer_fd < 0) { ++ oss_get_dummy_volume(&s->sample_spec, &s->real_volume); ++ return; ++ } + +- if (u->mixer_devmask & SOUND_MASK_VOLUME) +- if (pa_oss_get_volume(u->mixer_fd, SOUND_MIXER_READ_VOLUME, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_VOLUME) ++ if (pa_oss_get_volume(mixer_fd, SOUND_MIXER_READ_VOLUME, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + +- if (u->mixer_devmask & SOUND_MASK_PCM) +- if (pa_oss_get_volume(u->mixer_fd, SOUND_MIXER_READ_PCM, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_PCM) ++ if (pa_oss_get_volume(mixer_fd, SOUND_MIXER_READ_PCM, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + ++ oss_get_dummy_volume(&s->sample_spec, &s->real_volume); ++ + pa_log_info("Device doesn't support reading mixer settings: %s", pa_cstrerror(errno)); ++done: ++ pa_close(mixer_fd); + } + + static void sink_set_volume(pa_sink *s) { + struct userdata *u; + ++ int mixer_fd; ++ int mixer_devmask; ++ + pa_assert_se(u = s->userdata); + +- pa_assert(u->mixer_devmask & (SOUND_MASK_VOLUME|SOUND_MASK_PCM)); ++ mixer_fd = open_mixer(u, &mixer_devmask); ++ if (mixer_fd < 0) ++ return; + +- if (u->mixer_devmask & SOUND_MASK_VOLUME) +- if (pa_oss_set_volume(u->mixer_fd, SOUND_MIXER_WRITE_VOLUME, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_VOLUME) ++ if (pa_oss_set_volume(mixer_fd, SOUND_MIXER_WRITE_VOLUME, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + +- if (u->mixer_devmask & SOUND_MASK_PCM) +- if (pa_oss_get_volume(u->mixer_fd, SOUND_MIXER_WRITE_PCM, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_PCM) ++ if (pa_oss_set_volume(mixer_fd, SOUND_MIXER_WRITE_PCM, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + + pa_log_info("Device doesn't support writing mixer settings: %s", pa_cstrerror(errno)); ++done: ++ pa_close(mixer_fd); + } + + static void source_get_volume(pa_source *s) { + struct userdata *u; + ++ int mixer_fd; ++ int mixer_devmask; ++ + pa_assert_se(u = s->userdata); + +- pa_assert(u->mixer_devmask & (SOUND_MASK_IGAIN|SOUND_MASK_RECLEV)); ++ mixer_fd = open_mixer(u, &mixer_devmask); ++ if (mixer_fd < 0) { ++ oss_get_dummy_volume(&s->sample_spec, &s->real_volume); ++ return; ++ } + +- if (u->mixer_devmask & SOUND_MASK_IGAIN) +- if (pa_oss_get_volume(u->mixer_fd, SOUND_MIXER_READ_IGAIN, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_IGAIN) ++ if (pa_oss_get_volume(mixer_fd, SOUND_MIXER_READ_IGAIN, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + +- if (u->mixer_devmask & SOUND_MASK_RECLEV) +- if (pa_oss_get_volume(u->mixer_fd, SOUND_MIXER_READ_RECLEV, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_RECLEV) ++ if (pa_oss_get_volume(mixer_fd, SOUND_MIXER_READ_RECLEV, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + ++ oss_get_dummy_volume(&s->sample_spec, &s->real_volume); ++ + pa_log_info("Device doesn't support reading mixer settings: %s", pa_cstrerror(errno)); ++done: ++ pa_close(mixer_fd); + } + + static void source_set_volume(pa_source *s) { + struct userdata *u; + ++ int mixer_fd; ++ int mixer_devmask; ++ + pa_assert_se(u = s->userdata); + +- pa_assert(u->mixer_devmask & (SOUND_MASK_IGAIN|SOUND_MASK_RECLEV)); ++ mixer_fd = open_mixer(u, &mixer_devmask); ++ if (mixer_fd < 0) ++ return; + +- if (u->mixer_devmask & SOUND_MASK_IGAIN) +- if (pa_oss_set_volume(u->mixer_fd, SOUND_MIXER_WRITE_IGAIN, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_IGAIN) ++ if (pa_oss_set_volume(mixer_fd, SOUND_MIXER_WRITE_IGAIN, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + +- if (u->mixer_devmask & SOUND_MASK_RECLEV) +- if (pa_oss_get_volume(u->mixer_fd, SOUND_MIXER_WRITE_RECLEV, &s->sample_spec, &s->real_volume) >= 0) +- return; ++ if (mixer_devmask & SOUND_MASK_RECLEV) ++ if (pa_oss_set_volume(mixer_fd, SOUND_MIXER_WRITE_RECLEV, &s->sample_spec, &s->real_volume) >= 0) ++ goto done; + + pa_log_info("Device doesn't support writing mixer settings: %s", pa_cstrerror(errno)); ++done: ++ pa_close(mixer_fd); + } + + static void thread_func(void *userdata) { +@@ -1235,10 +1302,14 @@ int pa__init(pa_module*m) { use_mmap = false; } +#ifndef __FreeBSD__ +/* Disable mmap. The OSS on FreeBSD doesn't support read & write on + the same socket */ if (use_mmap && mode == O_WRONLY) { pa_log_info("Device opened for playback only, cannot do memory mapping, falling back to UNIX write() mode."); use_mmap = false; } +#endif if (pa_oss_get_hw_description(dev, hwdesc, sizeof(hwdesc)) >= 0) pa_log_info("Hardware name is '%s'.", hwdesc); +@@ -1266,8 +1337,6 @@ int pa__init(pa_module*m) { + u->module = m; + m->userdata = u; + u->fd = fd; +- u->mixer_fd = -1; +- u->mixer_devmask = 0; + u->use_getospace = u->use_getispace = true; + u->use_getodelay = true; + u->mode = mode; +@@ -1438,36 +1507,19 @@ int pa__init(pa_module*m) { + u->out_mmap_memblocks = pa_xnew0(pa_memblock*, u->out_nfrags); + } + +- if ((u->mixer_fd = pa_oss_open_mixer_for_device(u->device_name)) >= 0) { +- bool do_close = true; +- +- if (ioctl(u->mixer_fd, SOUND_MIXER_READ_DEVMASK, &u->mixer_devmask) < 0) +- pa_log_warn("SOUND_MIXER_READ_DEVMASK failed: %s", pa_cstrerror(errno)); +- else { +- if (u->sink && (u->mixer_devmask & (SOUND_MASK_VOLUME|SOUND_MASK_PCM))) { +- pa_log_debug("Found hardware mixer track for playback."); +- pa_sink_set_get_volume_callback(u->sink, sink_get_volume); +- pa_sink_set_set_volume_callback(u->sink, sink_set_volume); +- u->sink->n_volume_steps = 101; +- do_close = false; +- } +- +- if (u->source && (u->mixer_devmask & (SOUND_MASK_RECLEV|SOUND_MASK_IGAIN))) { +- pa_log_debug("Found hardware mixer track for recording."); +- pa_source_set_get_volume_callback(u->source, source_get_volume); +- pa_source_set_set_volume_callback(u->source, source_set_volume); +- u->source->n_volume_steps = 101; +- do_close = false; +- } +- } +- +- if (do_close) { +- pa_close(u->mixer_fd); +- u->mixer_fd = -1; +- u->mixer_devmask = 0; +- } ++ if (u->sink) { ++ pa_log_debug("Found hardware mixer track for playback."); ++ pa_sink_set_get_volume_callback(u->sink, sink_get_volume); ++ pa_sink_set_set_volume_callback(u->sink, sink_set_volume); ++ u->sink->n_volume_steps = 101; + } + ++ if (u->source) { ++ pa_log_debug("Found hardware mixer track for recording."); ++ pa_source_set_get_volume_callback(u->source, source_get_volume); ++ pa_source_set_set_volume_callback(u->source, source_set_volume); ++ u->source->n_volume_steps = 101; ++ } + go_on: + + pa_assert(u->source || u->sink); +@@ -1582,9 +1634,6 @@ void pa__done(pa_module*m) { + + if (u->fd >= 0) + pa_close(u->fd); +- +- if (u->mixer_fd >= 0) +- pa_close(u->mixer_fd); + + pa_xfree(u->device_name); +