mirror of
https://github.com/mpv-player/mpv
synced 2025-02-16 20:27:23 +00:00
JACK audio support through bio2jack by Kamil Strzelecki <esack@o2.pl>
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12663 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
d9df8faa79
commit
f6a749eff0
@ -1612,6 +1612,9 @@ Audio output through the Arts daemon.
|
||||
.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
|
||||
|
@ -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>
|
||||
|
@ -117,6 +117,16 @@ You need a fairly recent system. On Linux, 2.4.x kernels are recommended.
|
||||
<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>
|
||||
|
||||
|
@ -49,6 +49,9 @@ Interfejs audio <application>MPlayera</application> nazywa si
|
||||
<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>
|
||||
|
@ -119,6 +119,16 @@ Potrzebujesz do
|
||||
<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>
|
||||
|
||||
|
2
Makefile
2
Makefile
@ -33,7 +33,7 @@ OBJS_MENCODER = $(SRCS_MENCODER:.c=.o)
|
||||
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)
|
||||
|
||||
|
47
configure
vendored
47
configure
vendored
@ -255,6 +255,7 @@ Audio output:
|
||||
--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 @@ Use these options if autodetection fails:
|
||||
--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 @@ _rtc=auto
|
||||
_ossaudio=auto
|
||||
_arts=auto
|
||||
_esd=auto
|
||||
_jack=auto
|
||||
_liblzo=auto
|
||||
_mad=auto
|
||||
_vorbis=auto
|
||||
@ -1337,6 +1340,8 @@ for ac_option do
|
||||
--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 @@ for ac_option do
|
||||
--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 @@ else
|
||||
_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_LIB = $_ld_arts
|
||||
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_alsa1x
|
||||
$_def_arts
|
||||
$_def_esd
|
||||
$_def_esd_latency
|
||||
$_def_jack
|
||||
$_def_sys_asoundlib_h
|
||||
$_def_alsa_asoundlib_h
|
||||
$_def_sunaudio
|
||||
|
@ -6,7 +6,7 @@ SRCS=afmt.c audio_out.c ao_mpegpes.c ao_null.c ao_pcm.c ao_plugin.c pl_delay.c p
|
||||
|
||||
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
|
||||
|
||||
|
191
libao2/ao_jack.c
Normal file
191
libao2/ao_jack.c
Normal file
@ -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);
|
||||
}
|
||||
|
@ -22,6 +22,9 @@ extern ao_functions_t audio_out_arts;
|
||||
#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 @@ ao_functions_t* audio_out_drivers[] =
|
||||
#ifdef USE_ESD
|
||||
&audio_out_esd,
|
||||
#endif
|
||||
#ifdef USE_JACK
|
||||
&audio_out_jack,
|
||||
#endif
|
||||
#ifdef HAVE_NAS
|
||||
&audio_out_nas,
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user