summaryrefslogtreecommitdiff
path: root/src/audio_out
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio_out')
-rw-r--r--src/audio_out/Makefile.am19
-rw-r--r--src/audio_out/audio_alsa_out.c45
-rw-r--r--src/audio_out/audio_esd_out.c38
-rw-r--r--src/audio_out/audio_oss_out.c45
4 files changed, 88 insertions, 59 deletions
diff --git a/src/audio_out/Makefile.am b/src/audio_out/Makefile.am
index 0e90b2028..c8c82ee32 100644
--- a/src/audio_out/Makefile.am
+++ b/src/audio_out/Makefile.am
@@ -1,4 +1,4 @@
-CFLAGS = @GLOBAL_CFLAGS@ -DXINE_COMPILE
+CFLAGS = @GLOBAL_CFLAGS@ -DXINE_COMPILE $(ALSA_CFLAGS) $(ESD_CFLAGS)
EXTRA_DIST = audio_alsa_out.c audio_esd_out.c
@@ -20,17 +20,18 @@ endif
# All of xine audio out plugins should be named like the
# scheme "xineplug_ao_out_"
#
-##lib_LTLIBRARIES = xineplug_ao_out_oss.la $(alsa_module) $(esd_module)
-lib_LTLIBRARIES =
+lib_LTLIBRARIES = xineplug_ao_out_oss.la $(alsa_module) $(esd_module)
-##xineplug_ao_out_oss_la_SOURCES = audio_oss_out.c resample.c
-##xineplug_ao_out_oss_la_LDFLAGS = -avoid-version -module
+xineplug_ao_out_oss_la_SOURCES = audio_oss_out.c resample.c
+xineplug_ao_out_oss_la_LDFLAGS = -avoid-version -module
-##xineplug_ao_out_alsa_la_SOURCES = audio_alsa_out.c resample.c
-##xineplug_ao_out_alsa_la_LDFLAGS = -avoid-version -module
+xineplug_ao_out_alsa_la_SOURCES = audio_alsa_out.c resample.c
+xineplug_ao_out_alsa_la_LIBADD = $(ALSA_LIBS)
+xineplug_ao_out_alsa_la_LDFLAGS = -avoid-version -module
-##xineplug_ao_out_esd_la_SOURCES = audio_esd_out.c resample.c
-##xineplug_ao_out_esd_la_LDFLAGS = -avoid-version -module
+xineplug_ao_out_esd_la_SOURCES = audio_esd_out.c resample.c
+xineplug_ao_out_esd_la_LIBADD = $(ESD_LIBS)
+xineplug_ao_out_esd_la_LDFLAGS = -avoid-version -module
noinst_HEADERS = audio_oss_out.h audio_alsa_out.h audio_esd_out.h resample.h
diff --git a/src/audio_out/audio_alsa_out.c b/src/audio_out/audio_alsa_out.c
index 95405511f..4a3d84b59 100644
--- a/src/audio_out/audio_alsa_out.c
+++ b/src/audio_out/audio_alsa_out.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: audio_alsa_out.c,v 1.1 2001/04/24 20:53:00 f1rmb Exp $
+ * $Id: audio_alsa_out.c,v 1.2 2001/04/27 10:42:38 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -36,13 +36,15 @@
//#include <linux/asoundid.h>
#include <inttypes.h>
-#include "xine/xine.h"
-#include "xine/monitor.h"
-#include "xine/audio_out.h"
-#include "xine/metronom.h"
+#include "xine_internal.h"
+#include "monitor.h"
+#include "audio_out.h"
+#include "metronom.h"
#include "resample.h"
-#include "xine/ac3.h"
-#include "xine/utils.h"
+#include "libac3/ac3.h"
+#include "utils.h"
+
+#define AO_OUT_ALSA_IFACE_VERSION 1
#define AUDIO_NUM_FRAGMENTS 15
#define AUDIO_FRAGMENT_SIZE 8192
@@ -50,9 +52,6 @@
#define GAP_TOLERANCE 15000
#define MAX_MASTER_CLOCK_DIV 5000
-extern uint32_t xine_debug;
-
-
typedef struct _audio_alsa_globals {
snd_pcm_t *front_handle;
@@ -157,7 +156,8 @@ static void alsa_set_frag(int fragment_size, int fragment_count) {
/*
* open the audio device for writing to
*/
-static int ao_open(uint32_t bits, uint32_t rate, int ao_mode) {
+static int ao_open(metronom_t *metronom,
+ uint32_t bits, uint32_t rate, int ao_mode) {
int channels;
int subdevice = 0;
int direction = SND_PCM_OPEN_PLAYBACK;
@@ -290,7 +290,7 @@ static int ao_open(uint32_t bits, uint32_t rate, int ao_mode) {
xprintf (VERBOSE|AUDIO, "audio_out : audio_step %d pts per 32768 samples\n",
gAudioALSA.audio_step);
- metronom_set_audio_rate (gAudioALSA.audio_step);
+ metronom->set_audio_rate (metronom, gAudioALSA.audio_step);
memcpy(&pcm_chan_params.format, &pcm_format, sizeof(snd_pcm_format_t));
@@ -419,7 +419,8 @@ static uint32_t ao_get_current_vpts (void) {
/*
*
*/
-static void ao_put_samples(int16_t* output_samples,
+static void ao_put_samples(metronom_t *metronom,
+ int16_t* output_samples,
uint32_t num_samples, uint32_t pts_) {
uint32_t vpts;
uint32_t audio_vpts;
@@ -441,7 +442,7 @@ static void ao_put_samples(int16_t* output_samples,
// alsa_set_frag(num_samples, 6);
// }
- vpts = metronom_got_audio_samples (pts_, num_samples);
+ vpts = metronom->got_audio_samples (metronom, pts_, num_samples);
/*
* check if these samples "fit" in the audio output buffer
@@ -465,7 +466,7 @@ static void ao_put_samples(int16_t* output_samples,
*/
audio_vpts = ao_get_current_vpts () ;
- master_vpts = metronom_get_current_time ();
+ master_vpts = metronom->get_current_time (metronom);
diff = audio_vpts - master_vpts;
xprintf (VERBOSE|AUDIO,"audio_alsa_out: syncing on master clock: "
@@ -485,7 +486,7 @@ static void ao_put_samples(int16_t* output_samples,
if (abs(diff) > MAX_MASTER_CLOCK_DIV) {
printf ("master clock adjust time %d -> %d\n", master_vpts, audio_vpts);
- metronom_adjust_clock (audio_vpts);
+ metronom->adjust_clock (metronom, audio_vpts);
}
/*
@@ -597,15 +598,21 @@ static int ao_is_mode_supported (int mode) {
return 0;
}
+static char *ao_get_ident(void) {
+ return "ALSA";
+}
+
/* ------------------------------------------------------------------------- */
/*
*
*/
static ao_functions_t audio_alsaout = {
+ AO_OUT_ALSA_IFACE_VERSION,
ao_is_mode_supported,
ao_open,
ao_put_samples,
- ao_close
+ ao_close,
+ ao_get_ident
};
/* ------------------------------------------------------------------------- */
/*
@@ -617,7 +624,7 @@ static void sighandler(int signum) {
/*
*
*/
-ao_functions_t *audio_alsaout_init(void) {
+ao_functions_t *audio_alsaout_init(int iface, config_values_t *config) {
int best_rate;
int devnum;
int err;
@@ -636,6 +643,7 @@ ao_functions_t *audio_alsaout_init(void) {
else {
snd_default_card = snd_defaults_card();
if((err = snd_card_load(snd_default_card)) < 0) {
+
perr("snd_card_load() failed: %s\n", snd_strerror(err));
}
xprintf (VERBOSE|AUDIO, "%d card(s) installed. Default = %d\n",
@@ -759,3 +767,4 @@ ao_functions_t *audio_alsaout_init(void) {
return &audio_alsaout;
}
+
diff --git a/src/audio_out/audio_esd_out.c b/src/audio_out/audio_esd_out.c
index 259364a55..6200d5d18 100644
--- a/src/audio_out/audio_esd_out.c
+++ b/src/audio_out/audio_esd_out.c
@@ -31,19 +31,19 @@
#include <sys/time.h>
#include <inttypes.h>
-#include "xine/xine.h"
-#include "xine/monitor.h"
-#include "xine/audio_out.h"
+#include "xine_internal.h"
+#include "monitor.h"
+#include "audio_out.h"
#include "resample.h"
-#include "xine/metronom.h"
-#include "xine/ac3.h"
-#include "xine/utils.h"
+#include "metronom.h"
+#include "libac3/ac3.h"
+#include "utils.h"
+
+#define AO_OUT_ESD_IFACE_VERSION 1
#define GAP_TOLERANCE 15000
#define MAX_MASTER_CLOCK_DIV 5000
-extern uint32_t xine_debug;
-
typedef struct _audio_esd_globals {
int audio_fd;
@@ -73,7 +73,8 @@ static audio_esd_globals_t gAudioESD;
/*
* open the audio device for writing to
*/
-static int ao_open(uint32_t bits, uint32_t rate, int mode)
+static int ao_open(metronom_t *metronom,
+ uint32_t bits, uint32_t rate, int mode)
{
esd_format_t format;
@@ -132,7 +133,7 @@ static int ao_open(uint32_t bits, uint32_t rate, int mode)
xprintf (VERBOSE|AUDIO, "audio_out : audio_step %d pts per 32768 samples\n", gAudioESD.audio_step);
- metronom_set_audio_rate (gAudioESD.audio_step);
+ metronom->set_audio_rate (metronom, gAudioESD.audio_step);
return 1;
}
@@ -178,7 +179,8 @@ static void ao_fill_gap (uint32_t pts_len) {
gAudioESD.last_vpts += pts_len;
}
-static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
+static void ao_write_audio_data(metronom_t *metronom,
+ int16_t* output_samples, uint32_t num_samples,
uint32_t pts_)
{
@@ -193,7 +195,7 @@ static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
if (gAudioESD.audio_fd<0)
return;
- vpts = metronom_got_audio_samples (pts_, num_samples);
+ vpts = metronom->got_audio_samples (metronom, pts_, num_samples);
xprintf (VERBOSE|AUDIO, "audio_esd_out: got %d samples, vpts=%d, last_vpts=%d\n",
num_samples, vpts, gAudioESD.last_vpts);
@@ -223,7 +225,7 @@ static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
*/
audio_vpts = ao_get_current_vpts () ;
- master_vpts = metronom_get_current_time ();
+ master_vpts = metronom->get_current_time (metronom);
diff = audio_vpts - master_vpts;
xprintf (AUDIO|VERBOSE, "audio_esd_out: syncing on master clock: audio_vpts=%d master_vpts=%d\n",
@@ -239,7 +241,7 @@ static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
if (abs(diff)>MAX_MASTER_CLOCK_DIV) {
printf ("master clock adjust time %d -> %d (diff: %d)\n", master_vpts, audio_vpts, diff);
- metronom_adjust_clock (audio_vpts);
+ metronom->adjust_clock (metronom, audio_vpts);
}
/*
@@ -289,15 +291,21 @@ static int ao_is_mode_supported (int mode) {
return ((mode == AO_MODE_STEREO) || (mode == AO_MODE_MONO));
}
+static char *ao_get_ident(void) {
+ return "ESD";
+}
+
static ao_functions_t audio_esdout = {
+ AO_OUT_ESD_IFACE_VERSION,
ao_is_mode_supported,
ao_open,
ao_write_audio_data,
ao_close,
+ ao_get_ident
};
-ao_functions_t *audio_esdout_init (void)
+ao_functions_t *audio_esdout_init (int iface, config_values_t *config)
{
int audio_fd;
diff --git a/src/audio_out/audio_oss_out.c b/src/audio_out/audio_oss_out.c
index 18d11ff5d..795a2c8d3 100644
--- a/src/audio_out/audio_oss_out.c
+++ b/src/audio_out/audio_oss_out.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: audio_oss_out.c,v 1.1 2001/04/24 20:53:00 f1rmb Exp $
+ * $Id: audio_oss_out.c,v 1.2 2001/04/27 10:42:38 f1rmb Exp $
*/
#ifdef HAVE_CONFIG_H
@@ -40,13 +40,16 @@
#include <sys/ioctl.h>
#include <inttypes.h>
-#include "xine/xine.h"
-#include "xine/monitor.h"
-#include "xine/audio_out.h"
+#include "xine_internal.h"
+#include "monitor.h"
+#include "audio_out.h"
#include "resample.h"
-#include "xine/metronom.h"
-#include "xine/ac3.h"
-#include "xine/utils.h"
+#include "metronom.h"
+#include "libac3/ac3.h"
+#include "utils.h"
+#include "metronom.h"
+
+#define AO_OUT_OSS_IFACE_VERSION 1
#define AUDIO_NUM_FRAGMENTS 15
#define AUDIO_FRAGMENT_SIZE 8192
@@ -54,8 +57,6 @@
#define GAP_TOLERANCE 15000
#define MAX_MASTER_CLOCK_DIV 5000
-extern uint32_t xine_debug;
-
#define DSP_TEMPLATE "/dev/dsp%d"
typedef struct _audio_oss_globals {
@@ -88,7 +89,8 @@ static audio_oss_globals_t gAudioOSS;
/*
* open the audio device for writing to
*/
-static int ao_open(uint32_t bits, uint32_t rate, int mode)
+static int ao_open(metronom_t *metronom,
+ uint32_t bits, uint32_t rate, int mode)
{
int tmp;
int fsize;
@@ -157,7 +159,7 @@ static int ao_open(uint32_t bits, uint32_t rate, int mode)
xprintf (VERBOSE|AUDIO, "audio_out : audio_step %d pts per 32768 samples\n", gAudioOSS.audio_step);
- metronom_set_audio_rate (gAudioOSS.audio_step);
+ metronom->set_audio_rate(metronom, gAudioOSS.audio_step);
/*
* audio buffer size handling
@@ -230,7 +232,8 @@ static void ao_fill_gap (uint32_t pts_len) {
gAudioOSS.last_vpts += pts_len;
}
-static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
+static void ao_write_audio_data(metronom_t *metronom,
+ int16_t* output_samples, uint32_t num_samples,
uint32_t pts_)
{
@@ -245,7 +248,7 @@ static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
if (gAudioOSS.audio_fd<0)
return;
- vpts = metronom_got_audio_samples (pts_, num_samples);
+ vpts = metronom->got_audio_samples (metronom, pts_, num_samples);
xprintf (VERBOSE|AUDIO, "audio_oss_out: got %d samples, vpts=%d, last_vpts=%d\n",
num_samples, vpts, gAudioOSS.last_vpts);
@@ -275,7 +278,7 @@ static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
*/
audio_vpts = ao_get_current_vpts () ;
- master_vpts = metronom_get_current_time ();
+ master_vpts = metronom->get_current_time (metronom);
diff = audio_vpts - master_vpts;
xprintf (AUDIO|VERBOSE, "audio_oss_out: syncing on master clock: audio_vpts=%d master_vpts=%d\n",
@@ -316,7 +319,7 @@ static void ao_write_audio_data(int16_t* output_samples, uint32_t num_samples,
if (abs(diff)>MAX_MASTER_CLOCK_DIV) {
printf ("master clock adjust time %d -> %d (diff: %d)\n", master_vpts, audio_vpts, diff);
- metronom_adjust_clock (audio_vpts);
+ metronom->adjust_clock (metronom, audio_vpts);
}
@@ -367,16 +370,21 @@ static int ao_is_mode_supported (int mode) {
return ((mode == AO_MODE_STEREO) || (mode == AO_MODE_MONO));
}
+static char *ao_get_ident(void) {
+ return "OSS";
+}
+
static ao_functions_t audio_ossout = {
+ AO_OUT_OSS_IFACE_VERSION,
ao_is_mode_supported,
ao_open,
ao_write_audio_data,
ao_close,
+ ao_get_ident
};
-ao_functions_t *audio_ossout_init (void)
-{
+ao_functions_t *init_audio_out_plugin (int iface, config_values_t *config) {
int caps;
char devname[] = "/dev/dsp\0\0\0";
int best_rate;
@@ -384,6 +392,9 @@ ao_functions_t *audio_ossout_init (void)
int devnum;
int audio_fd;
+
+ /* FIXME: add iface check */
+
/*
* find best device driver/channel
*/