[MPlayer-dev-eng] [PATCH] JACK audio output module
Kamil Strzelecki
esack at o2.pl
Mon Jun 7 00:32:07 CEST 2004
Dnia 18:32 06.06.2004, Reimar Döffinger napisał(a):
> yes, "statically link", not hack it into your code ;-). The package from
> sourceforge creates a libbio2jack.a file. If you put that in your
> library path, you can link to it simply by passing -lbio2jack to gcc.
[...]
> The problem is that we will need somebody to look after it and apply
> patches that go into sourceforge code, etc. I think we just don't have
> _any_ developer resources to waste, there is already so much code that
> is completely unmaintained...
Eh, you are probably right, I'm just sick of those
one-program-depends-of-me libraries lying all around in my /usr/*lib/ and
that obviously evolved into some kind of phobia... ;) sorry. :]
Anyway, I've modified the patch (included in attachement). Thanks for your
concern.
cheers
--
..:: Kamil Strzelecki = esack at dharma.one.pl ::..
"There are two major products that come out of Berkeley: LSD and UNIX.
We don't believe this to be a coincidence." --Jeremy S. Anderson
-------------- next part --------------
diff -Nur main/configure main-jack/configure
--- main/configure 2004-05-31 17:07:20.000000000 +0200
+++ main-jack/configure 2004-06-06 22:29:54.000000000 +0200
@@ -254,6 +254,7 @@
--disable-ossaudio disable OSS sound support [autodetect]
--disable-arts disable aRts sound support [autodetect]
--disable-esd disable esd sound support [autodetect]
+ --disable-jack disable JACK sound support [autodetect]
--disable-nas disable NAS sound support [autodetect]
--disable-sgiaudio disable SGI sound support [autodetect]
--disable-sunaudio disable Sun sound support [autodetect]
@@ -1170,6 +1171,7 @@
_ossaudio=auto
_arts=auto
_esd=auto
+_jack=auto
_liblzo=auto
_mad=auto
_vorbis=auto
@@ -1335,6 +1337,8 @@
--disable-arts) _arts=no ;;
--enable-esd) _esd=yes ;;
--disable-esd) _esd=no ;;
+ --enable-jack) _jack=yes ;;
+ --disable-jack) _jack=no ;;
--enable-mad) _mad=yes ;;
--disable-mad) _mad=no ;;
--enable-liblzo) _liblzo=yes ;;
@@ -4013,6 +4017,39 @@
_noaomodules="esd $_noaomodules"
fi
+
+echocheck "JACK"
+if test "$_jack" = auto || test "$_jack" = yes ; then
+ _jack=no
+ if ( jackd --version | grep version | awk '{ print $3 }' ) >> "$TMPLOG" 2>&1 ; then
+
+cat > $TMPC << EOF
+#include <jack/jack.h>
+int main(void) { JACK_Init(); return 0; }
+EOF
+cc_check -lbio2jack `pkg-config --libs --cflags jack` && ( "$TMPO" >> "$TMPLOG" 2>&1 ) && _jack=yes
+
+ if test "$_jack" = no ; then
+ cat << EOF
+JACK audio output disabled.
+Please check if you have bio2jack (http://bio2jack.sf.net/) library installed.
+EOF
+ fi
+ fi
+fi
+
+if test "$_jack" = yes ; then
+ _def_jack='#define USE_JACK 1'
+ _aosrc="$_aosrc ao_jack.c"
+ _aomodules="jack $_aomodules"
+ _ld_jack="-lbio2jack `pkg-config --libs jack`"
+ _inc_jack=`pkg-config --cflags jack`
+else
+ _noaomodules="jack $_noaomodules"
+fi
+echores "$_jack"
+
+
echocheck "ALSA audio"
if test "$_alsa" != no ; then
_alsa=no
@@ -6032,6 +6069,8 @@
ARTS_INC = $_inc_arts
ESD_LIB = $_ld_esd
ESD_INC = $_inc_esd
+JACK_LIB = $_ld_jack
+JACK_INC = $_inc_jack
SGIAUDIO_LIB = $_ld_sgiaudio
# input/demuxer/codecs
@@ -6418,6 +6457,7 @@
$_def_arts
$_def_esd
$_def_esd_latency
+$_def_jack
$_def_sys_asoundlib_h
$_def_alsa_asoundlib_h
$_def_sunaudio
diff -Nur main/libao2/ao_jack.c main-jack/libao2/ao_jack.c
--- main/libao2/ao_jack.c 1970-01-01 01:00:00.000000000 +0100
+++ main-jack/libao2/ao_jack.c 2004-06-06 23:32:27.000000000 +0200
@@ -0,0 +1,196 @@
+/*
+ * ao_jack - JACK audio output driver for MPlayer
+ *
+ * Kamil Strzelecki < esack at browarek.net >
+ *
+ * This driver is distribuited under terms of GPL
+ *
+ * It uses bio2jack (http://bio2jack.sf.net/).
+ *
+ */
+
+#include <stdio.h>
+
+#include "audio_out.h"
+#include "audio_out_internal.h"
+#include "afmt.h"
+#include "../config.h"
+#include "../mp_msg.h"
+
+//#include "bio2jack.h"
+
+static int driver = 0;
+
+//bio2jack stuff:
+#define ERR_SUCCESS 0
+#define ERR_OPENING_JACK 1
+#define ERR_RATE_MISMATCH 2
+#define ERR_BYTES_PER_FRAME_INVALID 3
+enum status_enum { PLAYING, PAUSED, STOPPED, CLOSED, RESET };
+void JACK_Init(void);
+int JACK_Open(int* deviceID, unsigned int bits_per_sample, unsigned long *rate, int channels);
+int JACK_Close(int deviceID); /* return 0 for success */
+void JACK_Reset(int deviceID); /* free all buffered data and reset several values in the device */
+long JACK_Write(int deviceID, char *data, unsigned long bytes); /* returns the number of bytes written */
+long JACK_GetJackLatency(int deviceID); /* return the latency in milliseconds of jack */
+int JACK_SetState(int deviceID, enum status_enum state); /* playing, paused, stopped */
+int JACK_SetVolume(int deviceID, int left, int right); /* returns 0 on success */
+void JACK_GetVolume(int deviceID, int *left, int *right);
+//
+
+
+static ao_info_t info =
+{
+ "JACK audio output",
+ "jack",
+ "Kamil Strzelecki <esack at browarek.net>",
+ ""
+};
+
+LIBAO_EXTERN(jack)
+
+
+static int control(int cmd, void *arg)
+{
+ switch (cmd) {
+ case AOCONTROL_GET_VOLUME:
+ {
+ ao_control_vol_t *vol = (ao_control_vol_t *)arg;
+ int *l, *r;
+
+ JACK_GetVolume(driver, l, r);
+ vol->left = (float )*l;
+ vol->right = (float )*r;
+
+ return CONTROL_OK;
+ }
+ case AOCONTROL_SET_VOLUME:
+ {
+ ao_control_vol_t *vol = (ao_control_vol_t *)arg;
+ int l = (int )vol->left,
+ r = (int )vol->right,
+ err = 0;
+
+ if((err = JACK_SetVolume(driver, l, r))) {
+ mp_msg(MSGT_AO, MSGL_ERR,
+ "AO: [Jack] Setting volume failed, error %d\n",err);
+ return CONTROL_ERROR;
+ }
+
+ return CONTROL_OK;
+ }
+ }
+
+ return(CONTROL_UNKNOWN);
+}
+
+
+static int init(int rate_hz, int channels, int format, int flags)
+{
+ int err, m, frag_spec;
+ unsigned long *rate = NULL;
+ unsigned int bits_per_sample;
+
+ mp_msg(MSGT_AO, MSGL_INFO, "AO: [Jack] Initialising library.\n");
+ JACK_Init();
+
+ switch (format) {
+ case AFMT_U8:
+ case AFMT_S8:
+ format = AFMT_U8;
+ bits_per_sample = 8;
+ m = 0;
+ break;
+ default:
+ format = AFMT_S16_LE;
+ bits_per_sample = 16;
+ m = 2;
+ break;
+ }
+
+ ao_data.format = format;
+ ao_data.channels = channels;
+ ao_data.samplerate = rate_hz;
+ ao_data.bps = (rate_hz*channels*m);
+
+ rate = (unsigned long *)&rate_hz;
+
+ err = JACK_Open(&driver, bits_per_sample, rate, channels);
+
+ /* if sample rates doesn't match try to open device with jack's rate and
+ * let mplayer convert it */
+ if(err == ERR_RATE_MISMATCH) {
+ mp_msg(MSGT_AO, MSGL_INFO,
+ "AO: [Jack] Sample rate mismatch, trying to resample.\n");
+
+ ao_data.samplerate = *rate; // mplayer's filter will handle this
+
+ if((err = JACK_Open(&driver, bits_per_sample, rate, channels))) {
+ mp_msg(MSGT_AO, MSGL_ERR,
+ "AO: [Jack] JACK_Open() failed, error %d\n", err);
+ return 0;
+ }
+ }
+ /* any other error */
+ else if(err != ERR_SUCCESS) {
+ mp_msg(MSGT_AO, MSGL_ERR,
+ "AO: [Jack] JACK_Open() failed, error %d\n", err);
+ return 0;
+ }
+
+ if(err == ERR_SUCCESS)
+ mp_msg(MSGT_AO, MSGL_INFO,
+ "AO: [Jack] OK. I'm ready to go (%d Hz/%d channels/%d bit)\n"
+ , ao_data.samplerate, ao_data.channels, bits_per_sample);
+
+ return 1;
+}
+
+
+static void uninit(int immed)
+{
+ int errval = 0;
+
+ JACK_Reset(driver);
+
+ if((errval = JACK_Close(driver)))
+ mp_msg(MSGT_AO, MSGL_ERR,
+ "AO: [Jack] error closing device, error %d\n", errval);
+}
+
+
+static int play(void* data,int len,int flags)
+{
+ return JACK_Write(driver, data, len);
+}
+
+
+static void audio_pause()
+{
+ JACK_SetState(driver, PAUSED);
+}
+
+
+static void audio_resume()
+{
+ JACK_SetState(driver, PLAYING);
+}
+
+
+static void reset()
+{
+ JACK_Reset(driver);
+}
+
+
+static int get_space()
+{
+ return JACK_GetBytesFreeSpace(driver);
+}
+
+
+static float get_delay()
+{
+ return (float )JACK_GetJackLatency(driver);
+}
+
diff -Nur main/libao2/audio_out.c main-jack/libao2/audio_out.c
--- main/libao2/audio_out.c 2004-05-13 00:48:15.000000000 +0200
+++ main-jack/libao2/audio_out.c 2004-06-06 22:29:54.000000000 +0200
@@ -22,6 +22,9 @@
#ifdef USE_ESD
extern ao_functions_t audio_out_esd;
#endif
+#ifdef USE_JACK
+extern ao_functions_t audio_out_jack;
+#endif
extern ao_functions_t audio_out_null;
#ifdef HAVE_ALSA5
extern ao_functions_t audio_out_alsa5;
@@ -97,6 +100,9 @@
#ifdef USE_ESD
&audio_out_esd,
#endif
+#ifdef USE_JACK
+ &audio_out_jack,
+#endif
#ifdef HAVE_NAS
&audio_out_nas,
#endif
diff -Nur main/libao2/Makefile main-jack/libao2/Makefile
--- main/libao2/Makefile 2003-05-23 14:37:58.000000000 +0200
+++ main-jack/libao2/Makefile 2004-06-06 22:29:54.000000000 +0200
@@ -6,7 +6,7 @@
OBJS=$(SRCS:.c=.o)
-CFLAGS = $(OPTFLAGS) -I. -I.. $(ARTS_INC) $(ESD_INC) $(SDL_INC) $(X11_INC) $(EXTRA_INC) $(DXR2_INC) $(DVB_INC)
+CFLAGS = $(OPTFLAGS) -I. -I.. $(ARTS_INC) $(ESD_INC) $(JACK_INC) $(SDL_INC) $(X11_INC) $(EXTRA_INC) $(DXR2_INC) $(DVB_INC)
.SUFFIXES: .c .o
diff -Nur main/Makefile main-jack/Makefile
--- main/Makefile 2004-05-08 19:52:24.000000000 +0200
+++ main-jack/Makefile 2004-06-06 22:29:54.000000000 +0200
@@ -33,7 +33,7 @@
OBJS_MPLAYER = $(SRCS_MPLAYER:.c=.o)
VO_LIBS = $(AA_LIB) $(X_LIB) $(SDL_LIB) $(GGI_LIB) $(MP1E_LIB) $(MLIB_LIB) $(SVGA_LIB) $(DIRECTFB_LIB) $(CACA_LIB)
-AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(NAS_LIB) $(SGIAUDIO_LIB)
+AO_LIBS = $(ARTS_LIB) $(ESD_LIB) $(JACK_LIB) $(NAS_LIB) $(SGIAUDIO_LIB)
CODEC_LIBS = $(AV_LIB) $(FAME_LIB) $(MAD_LIB) $(VORBIS_LIB) $(THEORA_LIB) $(FAAD_LIB) $(LIBLZO_LIB) $(DECORE_LIB) $(XVID_LIB) $(PNG_LIB) $(Z_LIB) $(JPEG_LIB) $(ALSA_LIB) $(XMMS_LIB) $(MATROSKA_LIB)
COMMON_LIBS = libmpcodecs/libmpcodecs.a mp3lib/libMP3.a liba52/liba52.a libmpeg2/libmpeg2.a $(W32_LIB) $(DS_LIB) libaf/libaf.a libmpdemux/libmpdemux.a input/libinput.a postproc/libswscale.a osdep/libosdep.a $(DVDREAD_LIB) $(CODEC_LIBS) $(FREETYPE_LIB) $(TERMCAP_LIB) $(CDPARANOIA_LIB) $(MPLAYER_NETWORK_LIB) $(WIN32_LIB) $(GIF_LIB) $(MACOSX_FRAMEWORKS) $(SMBSUPPORT_LIB) $(FRIBIDI_LIB) $(FONTCONFIG_LIB) $(ENCA_LIB)
More information about the MPlayer-dev-eng
mailing list