diff options
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/Makefile | 2 | ||||
-rw-r--r-- | libao2/ao_arts.c | 117 | ||||
-rw-r--r-- | libao2/audio_out.c | 6 |
3 files changed, 124 insertions, 1 deletions
diff --git a/libao2/Makefile b/libao2/Makefile index 372cc907fc..118f455b54 100644 --- a/libao2/Makefile +++ b/libao2/Makefile @@ -8,7 +8,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.. $(SDL_INC) $(X11_INC) $(EXTRA_INC) $(DXR2_INC) $(DVB_INC) +CFLAGS = $(OPTFLAGS) -I. -I.. $(ARTS_INC) $(SDL_INC) $(X11_INC) $(EXTRA_INC) $(DXR2_INC) $(DVB_INC) .SUFFIXES: .c .o diff --git a/libao2/ao_arts.c b/libao2/ao_arts.c new file mode 100644 index 0000000000..6fa6b88cf0 --- /dev/null +++ b/libao2/ao_arts.c @@ -0,0 +1,117 @@ +/* + * ao_arts - aRts audio output driver for MPlayer + * + * Michele Balistreri <brain87@gmx.net> + * + * This driver is distribuited under terms of GPL + * + */ + +#include <artsc.h> +#include <stdio.h> + +#include "audio_out.h" +#include "audio_out_internal.h" +#include "afmt.h" +#include "../config.h" +#include "../mp_msg.h" + +#define OBTAIN_BITRATE(a) (((a != AFMT_U8) || (a != AFMT_S8)) ? 16 : 8) + +static arts_stream_t stream; + +static ao_info_t info = +{ + "aRts audio output", + "arts", + "Michele Balistreri <brain87@gmx.net>", + "" +}; + +LIBAO_EXTERN(arts) + +static int control(int cmd, int arg) +{ + return(CONTROL_UNKNOWN); +} + +static int init(int rate_hz, int channels, int format, int flags) +{ + int err; + int frag_spec; + + if(err=arts_init()) { + mp_msg(MSGT_AO, MSGL_ERR, "AO: [arts] %s\n", arts_error_text(err)); + return 0; + } + + else + mp_msg(MSGT_AO, MSGL_INFO, "AO: [arts] Connected to sound server\n"); + + ao_data.format = format; + ao_data.channels = channels; + ao_data.samplerate = rate_hz; + ao_data.bps = (rate_hz*channels); + ao_data.buffersize = 4096; + + if(format != AFMT_U8 && format != AFMT_S8) + ao_data.bps*=2; + + for (frag_spec = 0; (0x01<<frag_spec) < ao_data.buffersize; ++frag_spec) + ; + frag_spec |= 0x00020000; + stream=arts_play_stream(rate_hz, OBTAIN_BITRATE(format), channels, "Mplayer"); + arts_stream_set(stream, ARTS_P_PACKET_SETTINGS, frag_spec); + arts_stream_set(stream, ARTS_P_BLOCKING, 0); + + if(stream == NULL) { + mp_msg(MSGT_AO, MSGL_ERR, "AO: [arts] Unable to open a stream\n"); + return 0; + } + + else + mp_msg(MSGT_AO, MSGL_INFO, "AO: [arts] Stream opened\n"); + + + return 1; +} + +static void uninit() +{ + arts_close_stream(stream); + arts_free(); +} + +static int play(void* data,int len,int flags) +{ + arts_write(stream, data, len); +} + +static void audio_pause() +{ +} + +static void audio_resume() +{ +} + +static void reset() +{ +} + +static int get_space() +{ + return arts_stream_get(stream, ARTS_P_BUFFER_SPACE); +} + +static float get_delay() +{ + return ((float) arts_stream_get(stream, ARTS_P_BUFFER_SIZE) / (float) ao_data.bps); +} + + + + + + + diff --git a/libao2/audio_out.c b/libao2/audio_out.c index e1c8d6dd7c..8b861ede6b 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -12,6 +12,9 @@ char *ao_subdevice = NULL; #ifdef USE_OSS_AUDIO extern ao_functions_t audio_out_oss; #endif +#ifdef USE_ARTS +extern ao_functions_t audio_out_arts; +#endif extern ao_functions_t audio_out_null; #ifdef HAVE_ALSA5 extern ao_functions_t audio_out_alsa5; @@ -47,6 +50,9 @@ ao_functions_t* audio_out_drivers[] = #ifdef USE_OSS_AUDIO &audio_out_oss, #endif +#ifdef USE_ARTS + &audio_out_arts, +#endif #ifdef USE_SUN_AUDIO &audio_out_sun, #endif |