On Fri, Oct 24, 2014 at 11:35:03AM +0200, Alexandre Ratchov wrote:
> This diff adds a sndio backend and disables -lossaudio usage.
> Tested on amd64 with a simple ac3 file.
>
sorry, the diff was incomplete (forgotten "cvs add"), new diff
below.
Index: Makefile
===================================================================
RCS file: /cvs/ports/audio/liba52/Makefile,v
retrieving revision 1.22
diff -u -p -u -p -r1.22 Makefile
--- Makefile 21 Mar 2013 08:45:12 -0000 1.22
+++ Makefile 24 Oct 2014 10:42:52 -0000
@@ -6,7 +6,7 @@ V = 0.7.5
# 0.7.5-cvs
DISTNAME = a52dec-snapshot
PKGNAME = liba52-${V}
-REVISION = 0
+REVISION = 1
CATEGORIES = audio
MASTER_SITES = http://comstyle.com/source/
@@ -19,7 +19,7 @@ MAINTAINER = Marc Espie <[email protected]
# GPLv2+
PERMIT_PACKAGE_CDROM = Yes
-WANTLIB = c m ossaudio
+WANTLIB = c m sndio
WRKDIST = ${WRKDIR}/a52dec-${V}-cvs
@@ -27,6 +27,10 @@ SEPARATE_BUILD = Yes
CONFIGURE_STYLE = autoconf
AUTOCONF_VERSION = 2.59
CONFIGURE_ARGS += ${CONFIGURE_SHARED}
+CONFIGURE_ARGS += --disable-oss
MODGNU_CONFIG_GUESS_DIRS = ${WRKSRC}/autotools
+
+post-extract:
+ @cp ${FILESDIR}/audio_out_sndio.c ${WRKSRC}/libao
.include <bsd.port.mk>
Index: files/audio_out_sndio.c
===================================================================
RCS file: files/audio_out_sndio.c
diff -N files/audio_out_sndio.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ files/audio_out_sndio.c 24 Oct 2014 10:42:52 -0000
@@ -0,0 +1,170 @@
+/*
+ * audio_out_sndio.c
+ * Copyright (C) 2000-2003 Michel Lespinasse <[email protected]>
+ * Copyright (C) 1999-2000 Aaron Holtzman <[email protected]>
+ *
+ * This file is part of a52dec, a free ATSC A-52 stream decoder.
+ * See http://liba52.sourceforge.net/ for updates.
+ *
+ * a52dec is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * a52dec is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "config.h"
+
+#ifdef LIBAO_SNDIO
+
+#include <sndio.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <inttypes.h>
+
+#include "a52.h"
+#include "audio_out.h"
+#include "audio_out_internal.h"
+
+typedef struct sndio_instance_s {
+ ao_instance_t ao;
+ struct sio_hdl *hdl;
+ int sample_rate;
+ int set_params;
+ int flags;
+} sndio_instance_t;
+
+static int sndio_setup (ao_instance_t * _instance, int sample_rate, int *
flags,
+ level_t * level, sample_t * bias)
+{
+ sndio_instance_t * instance = (sndio_instance_t *) _instance;
+
+ if ((instance->set_params == 0) && (instance->sample_rate != sample_rate))
+ return 1;
+ instance->sample_rate = sample_rate;
+
+ *flags = instance->flags;
+ *level = CONVERT_LEVEL;
+ *bias = CONVERT_BIAS;
+
+ return 0;
+}
+
+static int sndio_play (ao_instance_t * _instance, int flags, sample_t *
_samples)
+{
+ sndio_instance_t * instance = (sndio_instance_t *) _instance;
+ int16_t int16_samples[256*6];
+ int chans = -1;
+
+#ifdef LIBA52_DOUBLE
+ convert_t samples[256 * 6];
+ int i;
+
+ for (i = 0; i < 256 * 6; i++)
+ samples[i] = _samples[i];
+#else
+ convert_t * samples = _samples;
+#endif
+
+ chans = channels_multi (flags);
+ flags &= A52_CHANNEL_MASK | A52_LFE;
+
+ if (instance->set_params) {
+ struct sio_par par;
+
+ sio_initpar(&par);
+ par.bits = 16;
+ par.sig = 1;
+ par.le = SIO_LE_NATIVE;
+ par.pchan = chans;
+ par.rate = instance->sample_rate;
+ if (!sio_setpar(instance->hdl, &par) || !sio_setpar(instance->hdl,
&par)) {
+ fprintf (stderr, "Can not set audio parameters\n");
+ return 1;
+ }
+ if (par.bits != 16 || par.sig != 1 || par.le != SIO_LE_NATIVE ||
+ par.pchan != chans || par.rate != instance->sample_rate) {
+ fprintf (stderr, "Unsupported audio parameters\n");
+ return 1;
+ }
+ instance->flags = flags;
+ instance->set_params = 0;
+ sio_start(instance->hdl);
+ } else if ((flags == A52_DOLBY) && (instance->flags == A52_STEREO)) {
+ fprintf (stderr, "Switching from stereo to dolby surround\n");
+ instance->flags = A52_DOLBY;
+ } else if ((flags == A52_STEREO) && (instance->flags == A52_DOLBY)) {
+ fprintf (stderr, "Switching from dolby surround to stereo\n");
+ instance->flags = A52_STEREO;
+ } else if (flags != instance->flags)
+ return 1;
+
+ convert2s16_multi (samples, int16_samples, flags);
+ sio_write (instance->hdl, int16_samples, 256 * sizeof (int16_t) * chans);
+
+ return 0;
+}
+
+static void sndio_close (ao_instance_t * _instance)
+{
+ sndio_instance_t * instance = (sndio_instance_t *) _instance;
+
+ sio_close (instance->hdl);
+}
+
+static ao_instance_t * sndio_open (int flags)
+{
+ sndio_instance_t * instance;
+ int format;
+
+ instance = (sndio_instance_t *) malloc (sizeof (sndio_instance_t));
+ if (instance == NULL)
+ return NULL;
+
+ instance->ao.setup = sndio_setup;
+ instance->ao.play = sndio_play;
+ instance->ao.close = sndio_close;
+
+ instance->sample_rate = 0;
+ instance->set_params = 1;
+ instance->flags = flags;
+
+ instance->hdl = sio_open (SIO_DEVANY, SIO_PLAY, 0);
+ if (instance->hdl == NULL) {
+ fprintf (stderr, "Can not open " SIO_DEVANY " device\n");
+ free (instance);
+ return NULL;
+ }
+
+ return (ao_instance_t *) instance;
+}
+
+ao_instance_t * ao_sndio_open (void)
+{
+ return sndio_open (A52_STEREO);
+}
+
+ao_instance_t * ao_sndiodolby_open (void)
+{
+ return sndio_open (A52_DOLBY);
+}
+
+ao_instance_t * ao_sndio4_open (void)
+{
+ return sndio_open (A52_2F2R);
+}
+
+ao_instance_t * ao_sndio6_open (void)
+{
+ return sndio_open (A52_3F2R | A52_LFE);
+}
+
+#endif
Index: patches/patch-libao_Makefile_am
===================================================================
RCS file: patches/patch-libao_Makefile_am
diff -N patches/patch-libao_Makefile_am
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-libao_Makefile_am 24 Oct 2014 10:42:52 -0000
@@ -0,0 +1,12 @@
+$OpenBSD$
+--- libao/Makefile.am.orig Wed Oct 22 18:29:58 2014
++++ libao/Makefile.am Wed Oct 22 18:33:05 2014
+@@ -2,7 +2,7 @@ AM_CFLAGS = $(OPT_CFLAGS)
+
+ noinst_LIBRARIES = libao.a
+ libao_a_SOURCES = audio_out.c audio_out_null.c audio_out_float.c \
+- audio_out_oss.c audio_out_solaris.c audio_out_al.c \
++ audio_out_oss.c audio_out_sndio.c audio_out_solaris.c
audio_out_al.c \
+ audio_out_win.c audio_out_wav.c audio_out_aif.c \
+ audio_out_peak.c convert2s16.c
+
Index: patches/patch-libao_Makefile_in
===================================================================
RCS file: patches/patch-libao_Makefile_in
diff -N patches/patch-libao_Makefile_in
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-libao_Makefile_in 24 Oct 2014 10:42:52 -0000
@@ -0,0 +1,37 @@
+$OpenBSD$
+--- libao/Makefile.in.orig Wed Oct 22 18:31:21 2014
++++ libao/Makefile.in Wed Oct 22 18:32:54 2014
+@@ -52,7 +52,7 @@ ARFLAGS = cru
+ libao_a_AR = $(AR) $(ARFLAGS)
+ libao_a_LIBADD =
+ am_libao_a_OBJECTS = audio_out.$(OBJEXT) audio_out_null.$(OBJEXT) \
+- audio_out_float.$(OBJEXT) audio_out_oss.$(OBJEXT) \
++ audio_out_float.$(OBJEXT) audio_out_oss.$(OBJEXT)
audio_out_sndio.$(OBJEXT) \
+ audio_out_solaris.$(OBJEXT) audio_out_al.$(OBJEXT) \
+ audio_out_win.$(OBJEXT) audio_out_wav.$(OBJEXT) \
+ audio_out_aif.$(OBJEXT) audio_out_peak.$(OBJEXT) \
+@@ -67,6 +67,7 @@ am__depfiles_maybe = depfiles
+ @AMDEP_TRUE@ ./$(DEPDIR)/audio_out_float.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/audio_out_null.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/audio_out_oss.Po \
++@AMDEP_TRUE@ ./$(DEPDIR)/audio_out_sndio.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/audio_out_peak.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/audio_out_solaris.Po \
+ @AMDEP_TRUE@ ./$(DEPDIR)/audio_out_wav.Po \
+@@ -197,7 +198,7 @@ target_alias = @target_alias@
+ AM_CFLAGS = $(OPT_CFLAGS)
+ noinst_LIBRARIES = libao.a
+ libao_a_SOURCES = audio_out.c audio_out_null.c audio_out_float.c \
+- audio_out_oss.c audio_out_solaris.c audio_out_al.c \
++ audio_out_oss.c audio_out_sndio.c audio_out_solaris.c
audio_out_al.c \
+ audio_out_win.c audio_out_wav.c audio_out_aif.c \
+ audio_out_peak.c convert2s16.c
+
+@@ -255,6 +256,7 @@ distclean-compile:
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_out_float.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_out_null.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_out_oss.Po@am__quote@
++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_out_sndio.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_out_peak.Po@am__quote@
+ @AMDEP_TRUE@@am__include@
@am__quote@./$(DEPDIR)/audio_out_solaris.Po@am__quote@
+ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/audio_out_wav.Po@am__quote@
Index: patches/patch-libao_audio_out_c
===================================================================
RCS file: patches/patch-libao_audio_out_c
diff -N patches/patch-libao_audio_out_c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-libao_audio_out_c 24 Oct 2014 10:42:52 -0000
@@ -0,0 +1,27 @@
+$OpenBSD$
+--- libao/audio_out.c.orig Thu Oct 23 10:23:53 2014
++++ libao/audio_out.c Thu Oct 23 10:26:36 2014
+@@ -33,6 +33,10 @@ extern ao_open_t ao_oss_open;
+ extern ao_open_t ao_ossdolby_open;
+ extern ao_open_t ao_oss4_open;
+ extern ao_open_t ao_oss6_open;
++extern ao_open_t ao_sndio_open;
++extern ao_open_t ao_sndiodolby_open;
++extern ao_open_t ao_sndio4_open;
++extern ao_open_t ao_sndio6_open;
+ extern ao_open_t ao_solaris_open;
+ extern ao_open_t ao_solarisdolby_open;
+ extern ao_open_t ao_al_open;
+@@ -59,6 +63,12 @@ static ao_driver_t audio_out_drivers[] = {
+ {"ossdolby", ao_ossdolby_open},
+ {"oss4", ao_oss4_open},
+ {"oss6", ao_oss6_open},
++#endif
++#ifdef LIBAO_SNDIO
++ {"sndio", ao_sndio_open},
++ {"sndiodolby", ao_sndiodolby_open},
++ {"sndio4", ao_sndio4_open},
++ {"sndio6", ao_sndio6_open},
+ #endif
+ #ifdef LIBAO_SOLARIS
+ {"solaris", ao_solaris_open},
Index: patches/patch-libao_configure_incl
===================================================================
RCS file: patches/patch-libao_configure_incl
diff -N patches/patch-libao_configure_incl
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ patches/patch-libao_configure_incl 24 Oct 2014 10:42:52 -0000
@@ -0,0 +1,19 @@
+$OpenBSD$
+--- libao/configure.incl.orig Wed Oct 22 17:08:13 2014
++++ libao/configure.incl Wed Oct 22 18:29:09 2014
+@@ -12,6 +12,15 @@ if test x"$enable_oss" != x"no"; then
+ esac
+ fi
+
++dnl check for sndio
++AC_ARG_ENABLE([sndio],
++ [ --disable-sndio make a version not using sndio])
++if test x"$enable_sndio" != x"no"; then
++ AC_DEFINE([LIBAO_SNDIO],,[libao SNDIO support])
++ AC_CHECK_LIB([sndio],[sio_initpar],
++ [LIBAO_LIBS="$LIBAO_LIBS -lsndio"])
++fi
++
+ dnl check for solaris
+ AC_ARG_ENABLE([solaris-audio],
+ [ --disable-solaris-audio make a version not using solaris audio])