Mercurial > mplayer.hg
changeset 12662:05d46af5e2bf
JACK audio support through bio2jack by Kamil Strzelecki <esack@o2.pl>
author | alex |
---|---|
date | Fri, 25 Jun 2004 18:11:15 +0000 |
parents | 31b3c61e53dd |
children | e2013db75137 |
files | DOCS/man/en/mplayer.1 DOCS/xml/en/audio.xml DOCS/xml/en/install.xml DOCS/xml/pl/audio.xml DOCS/xml/pl/install.xml Makefile configure libao2/Makefile libao2/ao_jack.c libao2/audio_out.c |
diffstat | 10 files changed, 275 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/DOCS/man/en/mplayer.1 Fri Jun 25 17:45:00 2004 +0000 +++ b/DOCS/man/en/mplayer.1 Fri Jun 25 18:11:15 2004 +0000 @@ -1612,6 +1612,9 @@ .B esd\ \ \ \ Audio output through the ESD daemon. .TP +.B jack\ \ \ \ +Audio output through JACK (Jack Audio Connection Kit). +.TP .B nas\ \ \ \ Audio output through NAS. .TP
--- a/DOCS/xml/en/audio.xml Fri Jun 25 17:45:00 2004 +0000 +++ b/DOCS/xml/en/audio.xml Fri Jun 25 18:11:15 2004 +0000 @@ -47,6 +47,9 @@ <row><entry>esd</entry><entry> native ESD driver (mostly for GNOME users) </entry></row> +<row><entry>jack</entry><entry> + JACK (Jack Audio Connection Kit) driver + </entry></row> </tbody> </tgroup> </informaltable>
--- a/DOCS/xml/en/install.xml Fri Jun 25 17:45:00 2004 +0000 +++ b/DOCS/xml/en/install.xml Fri Jun 25 18:11:15 2004 +0000 @@ -117,6 +117,16 @@ <listitem><para> <emphasis role="bold">libsmb</emphasis> - optional, for Samba support. </para></listitem> +<listitem><para> + <emphasis role="bold">bio2jack</emphasis> - optional, for JACK audio output + support, needed only in compile time. You can obtain it from + <ulink url="http://bio2jack.sf.net/">http://bio2jack.sf.net</ulink>. Since it + doesn't have install option you have to manually put the file + <filename>libbio2jack.a</filename> somewhere in your library path + (e.g. <filename>/usr/local/lib</filename>) or use the + <option>--with-bio2jack=DIR</option> switch to tell + <filename>./configure</filename> where that file is. + </para></listitem> </itemizedlist> </sect2>
--- a/DOCS/xml/pl/audio.xml Fri Jun 25 17:45:00 2004 +0000 +++ b/DOCS/xml/pl/audio.xml Fri Jun 25 18:11:15 2004 +0000 @@ -49,6 +49,9 @@ <row><entry>esd</entry><entry> rdzenny sterownik ESD (głównie dla użytkowników GNOMEa) </entry></row> +<row><entry>jack</entry><entry> + sterownik JACK (Jack Audio Connection Kit) + </entry></row> </tbody> </tgroup> </informaltable>
--- a/DOCS/xml/pl/install.xml Fri Jun 25 17:45:00 2004 +0000 +++ b/DOCS/xml/pl/install.xml Fri Jun 25 18:11:15 2004 +0000 @@ -119,6 +119,16 @@ <listitem><para> <emphasis role="bold">libsmb</emphasis> - opcjonalna, do obsługi Samby. </para></listitem> +<listitem><para> + <emphasis role="bold">bio2jack</emphasis> - opcjonalna, do obsługi wyjścia + dźwięku poprzez JACK, potrzebna jedynie w czasie kompilacji. Do pobrania z + <ulink url="http://bio2jack.sf.net/">http://bio2jack.sf.net</ulink>. Ponieważ + nie posiada ona opcji instalacji musisz samodzielnie umieścić plik + <filename>libbio2jack.a</filename> w swoim katalogu z bibliotekami + (np. <filename>/usr/local/lib/</filename>) lub użyć opcji + <option>--with-bio2jack=KATALOG</option> aby przekazać jego lokalizację do + skryptu <filename>./configure</filename>. + </para></listitem> </itemizedlist> </sect2>
--- a/Makefile Fri Jun 25 17:45:00 2004 +0000 +++ b/Makefile Fri Jun 25 18:11:15 2004 +0000 @@ -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)
--- a/configure Fri Jun 25 17:45:00 2004 +0000 +++ b/configure Fri Jun 25 18:11:15 2004 +0000 @@ -255,6 +255,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] @@ -321,6 +322,7 @@ --with-livelibdir=DIR path to LIVE.COM Streaming Media libraries --with-xmmsplugindir=DIR path to XMMS plugins --with-xmmslibdir=DIR path to libxmms.so.1 + --with-bio2jack=DIR path to libbio2jack.a (e.g. /home/user/bio2jack) --with-cdparanoiaincdir=DIR cdparanoia headers in DIR --with-cdparanoialibdir=DIR cdparanoia libraries (libcdda_*) in DIR --with-termcaplib=NAME name of library with termcap functionality @@ -1171,6 +1173,7 @@ _ossaudio=auto _arts=auto _esd=auto +_jack=auto _liblzo=auto _mad=auto _vorbis=auto @@ -1337,6 +1340,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 ;; @@ -1546,6 +1551,10 @@ --with-xmmsplugindir=*) _xmmsplugindir=`echo $ac_option | cut -d '=' -f 2` ;; + + --with-bio2jack=*) + _bio2jackdir=`echo $ac_option | cut -d '=' -f 2` + ;; --enable-profile) _profile='-p' @@ -4101,6 +4110,41 @@ _noaomodules="esd $_noaomodules" fi + +echocheck "JACK" +if test "$_jack" = auto ; then + _jack=no + if ( ( pkg-config --modversion jack ) > /dev/null 2>&1 ) && + ( 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 + if test -z "$_bio2jackdir" ; then + cc_check -lbio2jack `pkg-config --libs --cflags jack` && ( "$TMPO" >> "$TMPLOG" 2>&1 ) && _jack=yes + else + cc_check -L "$_bio2jackdir" -lbio2jack `pkg-config --libs --cflags jack` && ( "$TMPO" >> "$TMPLOG" 2>&1 ) && _jack=yes + fi + fi +fi + +if test "$_jack" = yes ; then + _def_jack='#define USE_JACK 1' + _aosrc="$_aosrc ao_jack.c" + _aomodules="jack $_aomodules" + if test -z "$_bio2jackdir" ; then + _ld_jack="-lbio2jack `pkg-config --libs jack`" + else + _ld_jack="-L \"$_bio2jackdir\" -lbio2jack `pkg-config --libs jack`" + fi + _inc_jack=`pkg-config --cflags jack` +else + _noaomodules="jack $_noaomodules" +fi +echores "$_jack" + + echocheck "ALSA audio" if test "$_alsa" != no ; then _alsa=no @@ -6094,6 +6138,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 @@ -6495,6 +6541,7 @@ $_def_arts $_def_esd $_def_esd_latency +$_def_jack $_def_sys_asoundlib_h $_def_alsa_asoundlib_h $_def_sunaudio
--- a/libao2/Makefile Fri Jun 25 17:45:00 2004 +0000 +++ b/libao2/Makefile Fri Jun 25 18:11:15 2004 +0000 @@ -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
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libao2/ao_jack.c Fri Jun 25 18:11:15 2004 +0000 @@ -0,0 +1,191 @@ +/* + * 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@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; + 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 = 1; + break; + default: + format = AFMT_S16_LE; + bits_per_sample = 16; + m = 2; + break; + } + + rate = 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 (rate now contains that which jackd use) */ + if(err == ERR_RATE_MISMATCH) { + mp_msg(MSGT_AO, MSGL_INFO, + "AO: [Jack] Sample rate mismatch, trying to resample.\n"); + + err = JACK_Open(&driver, bits_per_sample, &rate, channels); + } + + /* any other error */ + if(err != ERR_SUCCESS) { + mp_msg(MSGT_AO, MSGL_ERR, + "AO: [Jack] JACK_Open() failed, error %d\n", err); + return 0; + } + + ao_data.format = format; + ao_data.channels = channels; + ao_data.samplerate = rate; + ao_data.bps = ( rate * channels * m ); + + 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); +} +
--- a/libao2/audio_out.c Fri Jun 25 17:45:00 2004 +0000 +++ b/libao2/audio_out.c Fri Jun 25 18:11:15 2004 +0000 @@ -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; @@ -94,6 +97,9 @@ #ifdef USE_ESD &audio_out_esd, #endif +#ifdef USE_JACK + &audio_out_jack, +#endif #ifdef HAVE_NAS &audio_out_nas, #endif