- quit using select() for audio playback. we end up counting bytes
in the playback buffer and waiting until there's enough space anyway. - use -pthread instead of -lpthread for pthreads linkage - don't even try to use the "real time sample counter" on *BSD, since it's not that same as with Sun audio. - use the audio(4) interface to the mixer "master" volume control - actually mute the audio when output volume is '0' - set the audio(4) blocksize to match size of chunks to be written - provide *BSD equivilents to some Sun functionality
This commit is contained in:
parent
9181197077
commit
2bcfc1e21d
@ -1,4 +1,4 @@
|
|||||||
# $OpenBSD: Makefile,v 1.122 2007/11/12 07:08:24 ajacoutot Exp $
|
# $OpenBSD: Makefile,v 1.123 2007/11/15 07:50:27 jakemsr Exp $
|
||||||
|
|
||||||
# May not be hard to add more.
|
# May not be hard to add more.
|
||||||
ONLY_FOR_ARCHS= amd64 i386 powerpc sparc64 arm
|
ONLY_FOR_ARCHS= amd64 i386 powerpc sparc64 arm
|
||||||
@ -7,7 +7,7 @@ COMMENT= movie player supporting MPEG, DivX, AVI, ASF, MOV & more
|
|||||||
|
|
||||||
DISTNAME= MPlayer-1.0pre8
|
DISTNAME= MPlayer-1.0pre8
|
||||||
DIST_SUBDIR= mplayer
|
DIST_SUBDIR= mplayer
|
||||||
PKGNAME= ${DISTNAME:L}p16
|
PKGNAME= ${DISTNAME:L}p17
|
||||||
CATEGORIES= x11
|
CATEGORIES= x11
|
||||||
EXTRACT_SUFX= .tar.bz2
|
EXTRACT_SUFX= .tar.bz2
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ CONFIGURE_ARGS+=--disable-alsa \
|
|||||||
--disable-external-tremor \
|
--disable-external-tremor \
|
||||||
--disable-faac \
|
--disable-faac \
|
||||||
--enable-theora \
|
--enable-theora \
|
||||||
--enable-select \
|
--disable-select \
|
||||||
--enable-vorbis \
|
--enable-vorbis \
|
||||||
--enable-menu \
|
--enable-menu \
|
||||||
--enable-iconv \
|
--enable-iconv \
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
$OpenBSD: patch-configure,v 1.41 2007/04/19 08:37:09 ajacoutot Exp $
|
$OpenBSD: patch-configure,v 1.42 2007/11/15 07:50:27 jakemsr Exp $
|
||||||
--- configure.orig Sun Jun 11 20:35:47 2006
|
--- configure.orig Sun Jun 11 11:35:47 2006
|
||||||
+++ configure Thu Apr 19 09:41:27 2007
|
+++ configure Thu Jul 19 23:31:17 2007
|
||||||
@@ -77,7 +77,7 @@ cc_check() {
|
@@ -77,7 +77,7 @@ cc_check() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -19,6 +19,15 @@ $OpenBSD: patch-configure,v 1.41 2007/04/19 08:37:09 ajacoutot Exp $
|
|||||||
for ext in $pparam ; do
|
for ext in $pparam ; do
|
||||||
eval _$ext=auto && eval _$ext=yes
|
eval _$ext=auto && eval _$ext=yes
|
||||||
done
|
done
|
||||||
|
@@ -2939,7 +2941,7 @@ int main(void) { pthread_t tid; return pthread_create
|
||||||
|
EOF
|
||||||
|
_pthreads=no
|
||||||
|
if not hpux ; then
|
||||||
|
- for _ld_tmp in "-lpthreadGC2" "" "-lpthread" "-pthread" ; do
|
||||||
|
+ for _ld_tmp in "-lpthreadGC2" "" "-pthread" "-lpthread" ; do
|
||||||
|
# for crosscompilation, we cannot execute the program, be happy if we can link statically
|
||||||
|
cc_check $_ld_tmp && (tmp_run || test "$_ld_static") && _ld_pthread="$_ld_tmp" && _pthreads=yes && break
|
||||||
|
done
|
||||||
@@ -2970,7 +2972,7 @@ fi
|
@@ -2970,7 +2972,7 @@ fi
|
||||||
echores "$_rpath"
|
echores "$_rpath"
|
||||||
|
|
||||||
|
@ -1,144 +1,125 @@
|
|||||||
$OpenBSD: patch-libao2_ao_sun_c,v 1.2 2006/07/19 21:40:47 robert Exp $
|
$OpenBSD: patch-libao2_ao_sun_c,v 1.3 2007/11/15 07:50:27 jakemsr Exp $
|
||||||
--- libao2/ao_sun.c.orig Sun Jun 11 20:35:42 2006
|
--- libao2/ao_sun.c.orig Sun Jun 11 11:35:42 2006
|
||||||
+++ libao2/ao_sun.c Thu Jul 6 00:08:11 2006
|
+++ libao2/ao_sun.c Wed Oct 31 00:53:40 2007
|
||||||
@@ -65,7 +65,57 @@ static enum {
|
@@ -95,6 +95,7 @@ static int af2sunfmt(int format)
|
||||||
} enable_sample_timing;
|
// sample counter information
|
||||||
|
static int realtime_samplecounter_available(char *dev)
|
||||||
|
|
||||||
+#if defined(__OpenBSD__) || defined(__NetBSD__)
|
|
||||||
+int sun_mixer_get_dev(int fd, int *dev, char *id)
|
|
||||||
+{
|
|
||||||
+ mixer_devinfo_t info;
|
|
||||||
|
|
||||||
+ for (info.index = 0; ioctl(fd, AUDIO_MIXER_DEVINFO, &info) >= 0;
|
|
||||||
+ info.index++) {
|
|
||||||
+ if (!strcmp(id, info.label.name)) {
|
|
||||||
+ *dev = info.index;
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return -1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sun_get_volume(int fd, int *l, int *r)
|
|
||||||
+{
|
|
||||||
+ mixer_ctrl_t mixer;
|
|
||||||
+
|
|
||||||
+ if (sun_mixer_get_dev(fd, &mixer.dev, "master") < 0)
|
|
||||||
+ return -1;
|
|
||||||
+
|
|
||||||
+ mixer.type = AUDIO_MIXER_VALUE;
|
|
||||||
+ mixer.un.value.num_channels = 2;
|
|
||||||
+ if (ioctl(fd, AUDIO_MIXER_READ, &mixer) < 0)
|
|
||||||
+ return -1;
|
|
||||||
+ *l = mixer.un.value.level[AUDIO_MIXER_LEVEL_LEFT];
|
|
||||||
+ *r = mixer.un.value.level[AUDIO_MIXER_LEVEL_RIGHT];
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+int sun_set_volume(int fd, int l, int r)
|
|
||||||
+{
|
|
||||||
+ mixer_ctrl_t mixer;
|
|
||||||
+
|
|
||||||
+ if (sun_mixer_get_dev(fd, &mixer.dev, "master") < 0)
|
|
||||||
+ return -1;
|
|
||||||
+
|
|
||||||
+ mixer.type = AUDIO_MIXER_VALUE;
|
|
||||||
+ mixer.un.value.num_channels = 2;
|
|
||||||
+ mixer.un.value.level[AUDIO_MIXER_LEVEL_LEFT] = l;
|
|
||||||
+ mixer.un.value.level[AUDIO_MIXER_LEVEL_RIGHT] = r;
|
|
||||||
+
|
|
||||||
+ if (ioctl(fd, AUDIO_MIXER_WRITE, &mixer) < 0)
|
|
||||||
+ return -1;
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
// convert an OSS audio format specification into a sun audio encoding
|
|
||||||
static int af2sunfmt(int format)
|
|
||||||
{
|
{
|
||||||
@@ -365,13 +415,21 @@ static void setup_device_paths()
|
+#ifdef __svr4__
|
||||||
audio_dev = "/dev/audio";
|
int fd = -1;
|
||||||
|
audio_info_t info;
|
||||||
|
int rtsc_ok = RTSC_DISABLED;
|
||||||
|
@@ -213,6 +214,9 @@ error:
|
||||||
}
|
}
|
||||||
|
|
||||||
+#if defined(__OpenBSD__) || defined(__NetBSD__)
|
return rtsc_ok;
|
||||||
if (sun_mixer_device == NULL) {
|
|
||||||
+ if (mixer_device == NULL)
|
|
||||||
+ mixer_device = strdup("/dev/mixer");
|
|
||||||
+ sun_mixer_device = mixer_device;
|
|
||||||
+ }
|
|
||||||
+#else
|
+#else
|
||||||
+ if (sun_mixer_device == NULL) {
|
+ return RTSC_DISABLED;
|
||||||
if ((sun_mixer_device = mixer_device) == NULL || !sun_mixer_device[0]) {
|
|
||||||
sun_mixer_device = malloc(strlen(audio_dev) + 4);
|
|
||||||
strcpy(sun_mixer_device, audio_dev);
|
|
||||||
strcat(sun_mixer_device, "ctl");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+#endif
|
+#endif
|
||||||
|
|
||||||
if (ao_subdevice) audio_dev = ao_subdevice;
|
|
||||||
}
|
}
|
||||||
@@ -395,6 +453,14 @@ static int control(int cmd,void *arg){
|
|
||||||
if ( fd != -1 )
|
|
||||||
{
|
|
||||||
ao_control_vol_t *vol = (ao_control_vol_t *)arg;
|
|
||||||
+#if defined(__OpenBSD__) || defined(__NetBSD__)
|
|
||||||
+ int r, l;
|
|
||||||
+ if (sun_get_volume(fd, &r, &l) < 0) {
|
|
||||||
+ close(fd);
|
|
||||||
+ goto cgerr;
|
|
||||||
+ }
|
|
||||||
+ vol->right = vol->left = (float)(r * 100. / AUDIO_MAX_GAIN);
|
|
||||||
+#else
|
|
||||||
float volume;
|
|
||||||
struct audio_info info;
|
|
||||||
ioctl( fd,AUDIO_GETINFO,&info);
|
|
||||||
@@ -409,9 +475,11 @@ static int control(int cmd,void *arg){
|
|
||||||
/ AUDIO_MID_BALANCE;
|
|
||||||
vol->right = volume;
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
close( fd );
|
|
||||||
return CONTROL_OK;
|
|
||||||
- }
|
|
||||||
+ }
|
|
||||||
+cgerr:
|
|
||||||
return CONTROL_ERROR;
|
|
||||||
}
|
|
||||||
case AOCONTROL_SET_VOLUME:
|
|
||||||
@@ -422,10 +490,18 @@ static int control(int cmd,void *arg){
|
|
||||||
if ( !sun_mixer_device ) /* control function is used before init? */
|
|
||||||
setup_device_paths();
|
|
||||||
|
|
||||||
- fd=open( sun_mixer_device,O_RDONLY );
|
|
||||||
+ fd=open( sun_mixer_device,O_RDWR );
|
@@ -436,7 +440,7 @@ static int control(int cmd,void *arg){
|
||||||
if ( fd != -1 )
|
else
|
||||||
{
|
info.play.balance = (vol->right - vol->left + volume) * AUDIO_RIGHT_BALANCE / (2*volume);
|
||||||
struct audio_info info;
|
}
|
||||||
+#if defined(__OpenBSD__) || defined(__NetBSD__)
|
-#if !defined (__OpenBSD__) && !defined (__NetBSD__)
|
||||||
+ int r;
|
+#if !defined (__NetBSD__)
|
||||||
+ r = (int)(vol->right * AUDIO_MAX_GAIN / 100);
|
|
||||||
+ if (sun_set_volume(fd, r, r) < 0) {
|
|
||||||
+ close(fd);
|
|
||||||
+ goto cserr;
|
|
||||||
+ }
|
|
||||||
+#else
|
|
||||||
float volume;
|
|
||||||
AUDIO_INITINFO(&info);
|
|
||||||
volume = vol->right > vol->left ? vol->right : vol->left;
|
|
||||||
@@ -440,9 +516,11 @@ static int control(int cmd,void *arg){
|
|
||||||
info.output_muted = (volume == 0);
|
info.output_muted = (volume == 0);
|
||||||
#endif
|
#endif
|
||||||
ioctl( fd,AUDIO_SETINFO,&info );
|
ioctl( fd,AUDIO_SETINFO,&info );
|
||||||
|
@@ -562,6 +566,13 @@ static int init(int rate,int channels,int format,int f
|
||||||
|
ao_data.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate;
|
||||||
|
ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
|
||||||
|
|
||||||
|
+#if defined(__OpenBSD__) || defined(__NetBSD__)
|
||||||
|
+ AUDIO_INITINFO(&info);
|
||||||
|
+ info.blocksize = ao_data.outburst;
|
||||||
|
+ ioctl(audio_fd, AUDIO_SETINFO, &info);
|
||||||
+#endif
|
+#endif
|
||||||
close( fd );
|
+
|
||||||
return CONTROL_OK;
|
+
|
||||||
- }
|
#ifdef __not_used__
|
||||||
+ }
|
/*
|
||||||
+cserr:
|
* hmm, ao_data.buffersize is currently not used in this driver, do there's
|
||||||
return CONTROL_ERROR;
|
@@ -598,11 +609,15 @@ static int init(int rate,int channels,int format,int f
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
#endif /* __not_used__ */
|
||||||
|
|
||||||
|
+#ifdef __svr4__
|
||||||
|
AUDIO_INITINFO(&info);
|
||||||
|
info.play.samples = 0;
|
||||||
|
info.play.eof = 0;
|
||||||
|
info.play.error = 0;
|
||||||
|
ioctl (audio_fd, AUDIO_SETINFO, &info);
|
||||||
|
+#else
|
||||||
|
+ ioctl (audio_fd, AUDIO_FLUSH);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
queued_bursts = 0;
|
||||||
|
queued_samples = 0;
|
||||||
|
@@ -616,6 +631,9 @@ static void uninit(int immed){
|
||||||
|
// throw away buffered data in the audio driver's STREAMS queue
|
||||||
|
if (immed)
|
||||||
|
ioctl(audio_fd, I_FLUSH, FLUSHW);
|
||||||
|
+#else
|
||||||
|
+ if (immed)
|
||||||
|
+ ioctl(audio_fd, AUDIO_FLUSH);
|
||||||
|
#endif
|
||||||
|
close(audio_fd);
|
||||||
|
}
|
||||||
|
@@ -641,9 +659,11 @@ static void reset(){
|
||||||
|
: AUDIO_PRECISION_8);
|
||||||
|
info.play.channels = ao_data.channels;
|
||||||
|
info.play.sample_rate = ao_data.samplerate;
|
||||||
|
+#ifdef __svr4__
|
||||||
|
info.play.samples = 0;
|
||||||
|
info.play.eof = 0;
|
||||||
|
info.play.error = 0;
|
||||||
|
+#endif
|
||||||
|
ioctl (audio_fd, AUDIO_SETINFO, &info);
|
||||||
|
queued_bursts = 0;
|
||||||
|
queued_samples = 0;
|
||||||
|
@@ -670,7 +690,11 @@ static void audio_resume()
|
||||||
|
|
||||||
|
// return: how many bytes can be played without blocking
|
||||||
|
static int get_space(){
|
||||||
|
+#if defined(__OpenBSD__)
|
||||||
|
+ audio_bufinfo_t ab;
|
||||||
|
+#else
|
||||||
|
audio_info_t info;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
// check buffer
|
||||||
|
#ifdef HAVE_AUDIO_SELECT
|
||||||
|
@@ -691,9 +715,9 @@ static int get_space(){
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-#if defined(__NetBSD__) || defined(__OpenBSD__)
|
||||||
|
- ioctl(audio_fd, AUDIO_GETINFO, &info);
|
||||||
|
- return info.hiwat * info.blocksize - info.play.seek;
|
||||||
|
+#if defined(__OpenBSD__)
|
||||||
|
+ ioctl(audio_fd, AUDIO_GETPRINFO, &ab);
|
||||||
|
+ return (ab.hiwat * ab.blksize - ab.seek);
|
||||||
|
#else
|
||||||
|
return ao_data.outburst;
|
||||||
|
#endif
|
||||||
|
@@ -722,11 +746,14 @@ static int play(void* data,int len,int flags){
|
||||||
|
|
||||||
|
// return: delay in seconds between first and last sample in buffer
|
||||||
|
static float get_delay(){
|
||||||
|
- audio_info_t info;
|
||||||
|
- ioctl(audio_fd, AUDIO_GETINFO, &info);
|
||||||
|
#if defined (__OpenBSD__) || defined(__NetBSD__)
|
||||||
|
- return (float) info.play.seek/ (float)byte_per_sec ;
|
||||||
|
+ u_long bytes;
|
||||||
|
+ ioctl(audio_fd, AUDIO_WSEEK, &bytes);
|
||||||
|
+ return (float) bytes/ (float)byte_per_sec ;
|
||||||
|
#else
|
||||||
|
+ audio_info_t info;
|
||||||
|
+ ioctl(audio_fd, AUDIO_GETINFO, &info);
|
||||||
|
+
|
||||||
|
if (info.play.samples && enable_sample_timing == RTSC_ENABLED)
|
||||||
|
return (float)(queued_samples - info.play.samples) / (float)ao_data.samplerate;
|
||||||
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user