freebsd-ports/multimedia/mplayer/files/patch-libao2-ao_oss.c
Michael Scheidell dbadfe7b3a - Update to 1.0.r20111218
PR:		ports/163969
Submitted by:	thomas.e.zander@googlemail.com (maintainer)
Approved by:	gabor (mentor)
----------------------------------------------------------------------
2012-01-15 22:31:53 +00:00

89 lines
2.4 KiB
C

--- libao2/ao_oss.c.orig 2010-01-11 21:27:52.000000000 +0100
+++ libao2/ao_oss.c 2011-12-29 01:06:49.227522915 +0100
@@ -56,6 +56,8 @@
""
};
+static int volume = -1;
+
/* Support for >2 output channels added 2001-11-25 - Steve Davies <steve@daviesfam.org> */
LIBAO_EXTERN(oss)
@@ -72,6 +74,11 @@
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;
@@ -115,6 +122,11 @@
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;
@@ -434,9 +446,29 @@
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 oss_format;
+ savevol();
uninit(1);
audio_fd=open(dsp, O_WRONLY);
if(audio_fd < 0){
@@ -448,6 +480,7 @@
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))
ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
@@ -459,13 +492,14 @@
int c = ao_data.channels-1;
ioctl (audio_fd, SNDCTL_DSP_STEREO, &c);
}
- ioctl (audio_fd, SNDCTL_DSP_SPEED, &ao_data.samplerate);
}
+ restorevol();
}
// stop playing, keep buffers (for pause)
static void audio_pause(void)
{
+ savevol();
prepause_space = get_space();
uninit(1);
}