Index: head/multimedia/mplayer/Makefile =================================================================== --- head/multimedia/mplayer/Makefile (revision 512611) +++ head/multimedia/mplayer/Makefile (revision 512612) @@ -1,101 +1,101 @@ # Created by: Thomas E. Zander with help from Vladimir Kushnir # $FreeBSD$ PORTNAME= mplayer PORTVERSION= ${MPLAYER_PORT_VERSION}.${MPLAYER_SNAPSHOT_DATE:S/-//g} -PORTREVISION= 2 +PORTREVISION= 3 CATEGORIES= multimedia audio MAINTAINER= riggs@FreeBSD.org COMMENT= High performance media player supporting many formats .include "${.CURDIR}/../../multimedia/mplayer/Makefile.common" OPTIONS_DEFINE= AALIB AMR_NB AMR_WB ASS BLURAY CACA CDIO DEBUG DV DVDNAV \ ENCA FONTCONFIG FRIBIDI GIF GNUTLS GSM GUI IPV6 JACK \ LADSPA LIBMNG LIRC LZO NAS OPENAL OPENGL \ OPENJPEG OPUS PULSEAUDIO RTMP \ SDL SKINS SNDIO SMB SPEEX SVGALIB V4L VDPAU VPX \ X11 X11DGA X11VM XINERAMA XVIDEO XVMC OPTIONS_DEFAULT=ASS DVDNAV FONTCONFIG FRIBIDI GNUTLS OPENGL \ SKINS X11 X11DGA X11VM XINERAMA XVIDEO OPTIONS_DEFINE_i386= RTCPU OPTIONS_DEFINE_amd64= RTCPU OPTIONS_DEFINE_powerpc= RTCPU OPTIONS_DEFAULT_i386= RTCPU VDPAU OPTIONS_DEFAULT_amd64= RTCPU VDPAU OPTIONS_DEFAULT_powerpc=RTCPU ASS_DESC?= Subtitles rendering via libass BLURAY_DESC?= BluRay support DVDNAV_DESC?= DVD navigation features support ENCA_DESC?= Charset conversion via enca LZO_DESC?= External liblzo support RTCPU_DESC?= Use runtime CPU detection SKINS_DESC?= Install skins for GUI X11DGA_DESC?= X11 DGA video driver support X11VM_DESC?= X11 VidMode support SUB_FILES= pkg-message CONFLICTS= mplayer2-2.* CONFFILES= example.conf input.conf menu.conf dvb-menu.conf USES+= iconv pkgconfig OPTIONS_SUB= yes .include "${.CURDIR}/../../multimedia/mplayer/Makefile.optvars" .include CONFIGURE_ARGS+= --disable-arts \ --disable-directfb \ --disable-faac \ --disable-libdca \ --disable-toolame \ --disable-twolame \ --disable-x264 \ --disable-xvid \ --disable-mencoder \ --disable-mpg123 \ --disable-musepack \ --disable-theora .include "${.CURDIR}/../../multimedia/mplayer/Makefile.options" pre-everything:: @${ECHO_MSG} "N - O - T - E" @${ECHO_MSG} "" @${ECHO_MSG} "There are some knobs which *can* *not* be selected via the" @${ECHO_MSG} "OPTIONS framework. At the moment, these settings are:" @${ECHO_MSG} "WITH_KERN_HZ=${DEFAULT_KERN_HZ}" @${ECHO_MSG} "DEFAULT_DVD_DEVICE=${DEFAULT_DVD_DEVICE}" @${ECHO_MSG} "DEFAULT_CDROM_DEVICE=${DEFAULT_CDROM_DEVICE}" .if ${PORT_OPTIONS:MGUI} && ${PORT_OPTIONS:MX11} @${ECHO_MSG} "If you want to use the GUI, you can use the skins from" @${ECHO_MSG} "${PORTSDIR}/multimedia/mplayer-skins" @${ECHO_MSG} "or download them from" @${ECHO_MSG} "http://www.mplayerhq.hu/" .endif post-patch: common-post-patch post-install: @${MKDIR} ${STAGEDIR}${DATADIR} @${CHMOD} 755 ${STAGEDIR}${DATADIR} @${MKDIR} ${STAGEDIR}${DATADIR}/examples/etc @${CHMOD} 755 ${STAGEDIR}${DATADIR}/examples/etc .for conf in ${CONFFILES} ${INSTALL_DATA} ${WRKSRC}/etc/${conf} ${STAGEDIR}${DATADIR}/examples/etc .endfor .if ${PORT_OPTIONS:MGUI} && ${PORT_OPTIONS:MX11} @${LN} -sf mplayer ${STAGEDIR}${PREFIX}/bin/gmplayer @(cd ${STAGEDIR}${MAN1PREFIX}/man/man1 && ${LN} -sf mplayer.1.gz gmplayer.1.gz) ${CP} -f ${WRKSRC}/etc/mplayer256x256.png ${STAGEDIR}${PREFIX}/share/pixmaps/mplayer.png .endif .include Index: head/multimedia/mplayer/files/patch-libao2_ao__oss.c =================================================================== --- head/multimedia/mplayer/files/patch-libao2_ao__oss.c (revision 512611) +++ head/multimedia/mplayer/files/patch-libao2_ao__oss.c (revision 512612) @@ -1,91 +1,149 @@ --- libao2/ao_oss.c.orig 2016-02-26 20:47:16 UTC +++ libao2/ao_oss.c @@ -57,6 +57,8 @@ static const ao_info_t info = "" }; +static int volume = -1; + /* Support for >2 output channels added 2001-11-25 - Steve Davies */ LIBAO_EXTERN(oss) @@ -73,6 +75,11 @@ static int format2oss(int format) case AF_FORMAT_S16_BE: return AFMT_S16_BE; #ifdef AFMT_S24_PACKED case AF_FORMAT_S24_LE: return AFMT_S24_PACKED; +#elif defined(__FreeBSD__) && defined(AFMT_S24_LE) + case AF_FORMAT_U24_LE: return AFMT_U24_LE; + case AF_FORMAT_U24_BE: return AFMT_U24_BE; + case AF_FORMAT_S24_LE: return AFMT_S24_LE; + case AF_FORMAT_S24_BE: return AFMT_S24_BE; #endif #ifdef AFMT_U32_LE case AF_FORMAT_U32_LE: return AFMT_U32_LE; @@ -116,6 +123,11 @@ static int oss2format(int format) case AFMT_S16_BE: return AF_FORMAT_S16_BE; #ifdef AFMT_S24_PACKED case AFMT_S24_PACKED: return AF_FORMAT_S24_LE; +#elif defined(__FreeBSD__) && defined(AFMT_S24_LE) + case AFMT_U24_LE: return AF_FORMAT_U24_LE; + case AFMT_U24_BE: return AF_FORMAT_U24_BE; + case AFMT_S24_LE: return AF_FORMAT_S24_LE; + case AFMT_S24_BE: return AF_FORMAT_S24_BE; #endif #ifdef AFMT_U32_LE case AFMT_U32_LE: return AF_FORMAT_U32_LE; -@@ -441,10 +453,30 @@ static void uninit(int immed){ +@@ -217,6 +229,48 @@ static int control(int cmd,void *arg){ + return CONTROL_UNKNOWN; + } + ++static void setfragment(int audio_fd) ++{ ++ int buffer_bytes = ao_data.channels * ao_data.samplerate; ++ int block_size = 0; ++ ++ switch (ao_data.format & AF_FORMAT_BITS_MASK) { ++ case AF_FORMAT_8BIT: ++ break; ++ case AF_FORMAT_16BIT: ++ buffer_bytes *= 2; ++ break; ++ case AF_FORMAT_24BIT: ++ buffer_bytes *= 3; ++ break; ++ case AF_FORMAT_32BIT: ++ buffer_bytes *= 4; ++ break; ++ } ++ buffer_bytes *= 0.050; ++ ++ if(ioctl(audio_fd, SNDCTL_DSP_GETBLKSIZE, &block_size)==0){ ++ int setfrag; ++ /* make block size power of two */ ++ while (block_size & (block_size - 1)) ++ block_size += block_size & ~(block_size - 1); ++ /* set number of fragments */ ++ setfrag = ((buffer_bytes + block_size - 1) / block_size) << 16; ++ /* need at least double buffering */ ++ if (setfrag < (2 << 16)) ++ setfrag = (2 << 16); ++ /* set block size in power of two */ ++ while (block_size) { ++ setfrag++; ++ block_size /= 2; ++ } ++ /* try to set a total buffer of 50ms */ ++ if (ioctl(audio_fd, SNDCTL_DSP_SETFRAGMENT, &setfrag)==-1){ ++ mp_msg(MSGT_AO,MSGL_V,"audio_setup: setfragment %d failed\n", setfrag); ++ } ++ } ++} ++ + // open & setup audio device + // return: 1=success 0=fail + static int init(int rate,int channels,int format,int flags){ +@@ -364,6 +418,7 @@ ac3_retry: + mp_msg(MSGT_AO,MSGL_WARN, "OSS: Failed setting sample-rate %i %s\n", rate, strerror(errno)); + mp_msg(MSGT_AO,MSGL_V,"audio_setup: using %d Hz samplerate (requested: %d)\n",ao_data.samplerate,rate); + } ++ setfragment(audio_fd); + + if(ioctl(audio_fd, SNDCTL_DSP_GETOSPACE, &zz)==-1){ + int r=0; +@@ -441,10 +496,30 @@ static void uninit(int immed){ audio_fd = -1; } +static void savevol(void){ + int fd; + if (volume < 0) { + if ((fd = open(oss_mixer_device, O_RDONLY)) >= 0) { + ioctl(fd, MIXER_READ(oss_mixer_channel), &volume); + close(fd); + } + } +} + +static void restorevol(void){ + int fd; + if ((fd = open(oss_mixer_device, O_RDONLY)) >= 0) { + ioctl(fd, MIXER_WRITE(oss_mixer_channel), &volume); + close(fd); + } + volume = -1; +} + // stop playing and empty buffers (for seeking/pause) static void reset(void){ int fail = 0; int oss_format; + savevol(); uninit(1); audio_fd=open(dsp, O_WRONLY); if(audio_fd < 0){ -@@ -456,6 +488,7 @@ static void reset(void){ +@@ -456,6 +531,7 @@ static void reset(void){ fcntl(audio_fd, F_SETFD, FD_CLOEXEC); #endif + ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate); oss_format = format2oss(ao_data.format); if(AF_FORMAT_IS_AC3(ao_data.format)) fail |= ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate) == -1; -@@ -467,14 +500,14 @@ static void reset(void){ +@@ -467,14 +543,15 @@ static void reset(void){ int c = ao_data.channels-1; fail |= ioctl (audio_fd, SNDCTL_DSP_STEREO, &c) == -1; } - fail |= ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate) == -1; } - mp_msg(MSGT_AO,MSGL_WARN, "OSS: Reset failed\n"); ++ setfragment(audio_fd); + restorevol(); } // stop playing, keep buffers (for pause) static void audio_pause(void) { + savevol(); prepause_space = get_space(); uninit(1); }