summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Caujolle-Bert <f1rmb@users.sourceforge.net>2001-04-27 10:42:38 +0000
committerDaniel Caujolle-Bert <f1rmb@users.sourceforge.net>2001-04-27 10:42:38 +0000
commita1f5ebe0d19b2552ef6f3c4a099f140249b81d58 (patch)
tree7bf6c5f908bb39a5320cad7bd6420476ef397d7c /src
parent34eb54c49bb64f74e8ef8945fb40d4172bb271f5 (diff)
downloadxine-lib-a1f5ebe0d19b2552ef6f3c4a099f140249b81d58.tar.gz
xine-lib-a1f5ebe0d19b2552ef6f3c4a099f140249b81d58.tar.bz2
Audio out compile again. Change prototypes in audio out, libac3 and
libmpg123, passing the metronom arg. CVS patchset: 34 CVS date: 2001/04/27 10:42:38
Diffstat (limited to 'src')
-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
-rw-r--r--src/libac3/ac3.h3
-rw-r--r--src/libac3/decode.c12
-rw-r--r--src/libmpg123/interface.c11
-rw-r--r--src/libmpg123/layer1.c8
-rw-r--r--src/libmpg123/layer2.c8
-rw-r--r--src/libmpg123/layer3.c10
-rw-r--r--src/libmpg123/mpg123.h8
-rw-r--r--src/libmpg123/mpglib.h8
-rw-r--r--src/xine-engine/audio_decoder.c4
-rw-r--r--src/xine-engine/audio_out.h32
-rw-r--r--src/xine-engine/load_plugins.c97
-rw-r--r--src/xine-engine/metronom.h3
-rw-r--r--src/xine-engine/video_decoder.c5
-rw-r--r--src/xine-engine/xine_internal.h18
18 files changed, 259 insertions, 115 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
*/
diff --git a/src/libac3/ac3.h b/src/libac3/ac3.h
index dcc125f85..510a97095 100644
--- a/src/libac3/ac3.h
+++ b/src/libac3/ac3.h
@@ -47,7 +47,8 @@ typedef struct ac3_config_s {
void ac3_init(ac3_config_t *,ao_functions_t*);
-size_t ac3_decode_data(uint8_t *data_start,uint8_t *data_end,uint32_t pts);
+size_t ac3_decode_data(metronom_t *metronom,
+ uint8_t *data_start,uint8_t *data_end,uint32_t pts);
void ac3_reset(void);
diff --git a/src/libac3/decode.c b/src/libac3/decode.c
index cca544933..fd004f3fe 100644
--- a/src/libac3/decode.c
+++ b/src/libac3/decode.c
@@ -48,6 +48,7 @@
#include "sanity_check.h"
#include "audio_out.h"
+#include "metronom.h"
#include "attributes.h"
@@ -193,7 +194,8 @@ void ac3_reset ()
}
-size_t ac3_decode_data (uint8_t *data_start, uint8_t *data_end, uint32_t pts_)
+size_t ac3_decode_data (metronom_t *metronom,
+ uint8_t *data_start, uint8_t *data_end, uint32_t pts_)
{
uint32_t i;
@@ -284,16 +286,18 @@ size_t ac3_decode_data (uint8_t *data_start, uint8_t *data_end, uint32_t pts_)
}
if (!is_output_initialized) {
- ac3_output.open (16, syncinfo.sampling_rate,
+ ac3_output.open (metronom, 16, syncinfo.sampling_rate,
(ac3_config.flags & AO_MODE_AC3) ? AO_MODE_AC3 : AO_MODE_STEREO);
is_output_initialized = 1;
}
if ((ac3_config.flags & AO_MODE_AC3) == 0) {
- ac3_output.write_audio_data(s16_samples, 256*6, pts_);
+ ac3_output.write_audio_data(metronom,
+ s16_samples, 256*6, pts_);
}
else {
- ac3_output.write_audio_data(s16_samples_out, 6 * 256, pts_);
+ ac3_output.write_audio_data(metronom,
+ s16_samples_out, 6 * 256, pts_);
}
pts_ = 0;
diff --git a/src/libmpg123/interface.c b/src/libmpg123/interface.c
index 8f6a2118f..12b3b47af 100644
--- a/src/libmpg123/interface.c
+++ b/src/libmpg123/interface.c
@@ -18,7 +18,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: interface.c,v 1.1 2001/04/18 22:34:36 f1rmb Exp $
+ * $Id: interface.c,v 1.2 2001/04/27 10:42:38 f1rmb Exp $
*/
#include <stdlib.h>
@@ -68,7 +68,8 @@ int head_check(struct mpstr *mp)
return 1;
}
-void mpg_audio_decode_data (mpgaudio_t *mp, uint8_t *data, uint8_t *data_end,
+void mpg_audio_decode_data (metronom_t *metronom,
+ mpgaudio_t *mp, uint8_t *data, uint8_t *data_end,
uint32_t pts)
{
/* printf ("mpg123: decoding package\n"); */
@@ -124,13 +125,13 @@ void mpg_audio_decode_data (mpgaudio_t *mp, uint8_t *data, uint8_t *data_end,
/* printf ("layer : %d\n",mp->fr.lay); */
switch(mp->fr.lay) {
case 1:
- do_layer1(mp, pts_for_package);
+ do_layer1(metronom, mp, pts_for_package);
break;
case 2:
- do_layer2(mp, pts_for_package);
+ do_layer2(metronom, mp, pts_for_package);
break;
case 3:
- do_layer3(mp, pts_for_package);
+ do_layer3(metronom, mp, pts_for_package);
break;
}
diff --git a/src/libmpg123/layer1.c b/src/libmpg123/layer1.c
index dad35766c..dd6cef6ac 100644
--- a/src/libmpg123/layer1.c
+++ b/src/libmpg123/layer1.c
@@ -10,6 +10,8 @@
#include "mpg123.h"
+#include "metronom.h"
+
void I_step_one(unsigned int balloc[], unsigned int scale_index[2][SBLIMIT],struct frame *fr)
{
unsigned int *ba=balloc;
@@ -111,7 +113,7 @@ void I_step_two(real fraction[2][SBLIMIT],unsigned int balloc[2*SBLIMIT],
}
}
-void do_layer1(mpgaudio_t *mp, uint32_t pts)
+void do_layer1(metronom_t *metronom, mpgaudio_t *mp, uint32_t pts)
{
int clip=0;
struct frame *fr = &mp->fr;
@@ -145,14 +147,14 @@ void do_layer1(mpgaudio_t *mp, uint32_t pts)
}
if (!mp->is_output_initialized) {
- mp->ao_output->open (16, fr->sample_rate,
+ mp->ao_output->open (metronom, 16, fr->sample_rate,
stereo-1 ? AO_MODE_STEREO: AO_MODE_MONO);
mp->is_output_initialized = 1;
printf ("layer1\n");
}
- mp->ao_output->write_audio_data ((int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), pts);
+ mp->ao_output->write_audio_data (metronom, (int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), pts);
}
diff --git a/src/libmpg123/layer2.c b/src/libmpg123/layer2.c
index 8c320f11b..738825995 100644
--- a/src/libmpg123/layer2.c
+++ b/src/libmpg123/layer2.c
@@ -8,6 +8,8 @@
#include "mpg123.h"
#include "l2tables.h"
+#include "metronom.h"
+
static int grp_3tab[32 * 3] = { 0, }; /* used: 27 */
static int grp_5tab[128 * 3] = { 0, }; /* used: 125 */
static int grp_9tab[1024 * 3] = { 0, }; /* used: 729 */
@@ -247,7 +249,7 @@ static void II_select_table(struct frame *fr)
fr->II_sblimit = sblim;
}
-void do_layer2(mpgaudio_t *mp, uint32_t pts)
+void do_layer2(metronom_t *metronom, mpgaudio_t *mp, uint32_t pts)
{
int clip=0;
int i,j;
@@ -285,7 +287,7 @@ void do_layer2(mpgaudio_t *mp, uint32_t pts)
}
if (!mp->is_output_initialized) {
- mp->ao_output->open (16, fr->sample_rate,
+ mp->ao_output->open (metronom, 16, fr->sample_rate,
stereo-1 ? AO_MODE_STEREO: AO_MODE_MONO);
mp->is_output_initialized = 1;
@@ -293,7 +295,7 @@ void do_layer2(mpgaudio_t *mp, uint32_t pts)
}
- mp->ao_output->write_audio_data ((int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), pts);
+ mp->ao_output->write_audio_data (metronom, (int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), pts);
}
diff --git a/src/libmpg123/layer3.c b/src/libmpg123/layer3.c
index 27fc7b547..7f1d36b32 100644
--- a/src/libmpg123/layer3.c
+++ b/src/libmpg123/layer3.c
@@ -10,6 +10,8 @@
#include "mpglib.h"
#include "huffman.h"
+#include "metronom.h"
+
#define MPEG1
@@ -1446,7 +1448,7 @@ static void III_hybrid(mpgaudio_t *mp,
/*
* main layer3 handler
*/
-void do_layer3(mpgaudio_t *mp, uint32_t pts)
+void do_layer3(metronom_t *metronom, mpgaudio_t *mp, uint32_t pts)
{
int gr, ch, ss,clip=0;
struct frame *fr = &mp->fr;
@@ -1595,14 +1597,12 @@ void do_layer3(mpgaudio_t *mp, uint32_t pts)
}
if (!mp->is_output_initialized) {
- mp->ao_output->open (16, fr->sample_rate,
+ mp->ao_output->open (metronom, 16, fr->sample_rate,
stereo-1 ? AO_MODE_STEREO: AO_MODE_MONO);
mp->is_output_initialized = 1;
printf ("layer3\n");
}
- mp->ao_output->write_audio_data ((int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), pts);
+ mp->ao_output->write_audio_data (metronom, (int16_t*)mp->osspace, num_bytes/(stereo-1 ? 4:2), pts);
}
-
-
diff --git a/src/libmpg123/mpg123.h b/src/libmpg123/mpg123.h
index 9e947aa13..fc7709201 100644
--- a/src/libmpg123/mpg123.h
+++ b/src/libmpg123/mpg123.h
@@ -9,6 +9,8 @@
#include <math.h>
+#include "metronom.h"
+
#ifdef _WIN32
# undef WIN32
# define WIN32
@@ -108,9 +110,9 @@ extern unsigned char *mpg123_wordpointer;
extern int mpg123_bitindex;
extern void make_decode_tables(long scaleval);
-extern void do_layer3(mpgaudio_t *mp, uint32_t pts);
-extern void do_layer2(mpgaudio_t *mp, uint32_t pts);
-extern void do_layer1(mpgaudio_t *mp, uint32_t pts);
+extern void do_layer3(metronom_t *metronom, mpgaudio_t *mp, uint32_t pts);
+extern void do_layer2(metronom_t *metronom, mpgaudio_t *mp, uint32_t pts);
+extern void do_layer1(metronom_t *metronom, mpgaudio_t *mp, uint32_t pts);
extern int decode_header(struct frame *fr,unsigned long newhead);
diff --git a/src/libmpg123/mpglib.h b/src/libmpg123/mpglib.h
index 04b33a922..3f1eea165 100644
--- a/src/libmpg123/mpglib.h
+++ b/src/libmpg123/mpglib.h
@@ -18,14 +18,16 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: mpglib.h,v 1.1 2001/04/18 22:34:49 f1rmb Exp $
+ * $Id: mpglib.h,v 1.2 2001/04/27 10:42:38 f1rmb Exp $
*/
#ifndef HAVE_MPGLIB_H
#define HAVE_MPGLIB_H
#include <inttypes.h>
+
#include "audio_out.h"
+#include "metronom.h"
typedef struct mpstr {
unsigned char bsspace[2][MAXFRAMESIZE+512]; /* MAXFRAMESIZE */
@@ -58,7 +60,8 @@ mpgaudio_t *mpg_audio_init (ao_functions_t *ao_output);
void mpg_audio_reset (mpgaudio_t *mp);
-void mpg_audio_decode_data (mpgaudio_t *mp, uint8_t *data, uint8_t *data_end,
+void mpg_audio_decode_data (metronom_t *metronom,
+ mpgaudio_t *mp, uint8_t *data, uint8_t *data_end,
uint32_t pts);
#ifdef __cplusplus
@@ -66,3 +69,4 @@ void mpg_audio_decode_data (mpgaudio_t *mp, uint8_t *data, uint8_t *data_end,
#endif
#endif
+
diff --git a/src/xine-engine/audio_decoder.c b/src/xine-engine/audio_decoder.c
index 691e68c3b..015560844 100644
--- a/src/xine-engine/audio_decoder.c
+++ b/src/xine-engine/audio_decoder.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_decoder.c,v 1.4 2001/04/24 15:47:32 guenter Exp $
+ * $Id: audio_decoder.c,v 1.5 2001/04/27 10:42:38 f1rmb Exp $
*
*
* functions that implement audio decoding
@@ -76,7 +76,7 @@ void *audio_decoder_loop (void *this_gen) {
}
- decoder->decode_data (decoder, buf);
+ decoder->decode_data (this->metronom, decoder, buf);
}
break;
diff --git a/src/xine-engine/audio_out.h b/src/xine-engine/audio_out.h
index 5688645b2..9b332e72d 100644
--- a/src/xine-engine/audio_out.h
+++ b/src/xine-engine/audio_out.h
@@ -17,13 +17,21 @@
* 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_out.h,v 1.1 2001/04/24 20:53:00 f1rmb Exp $
+ * $Id: audio_out.h,v 1.2 2001/04/27 10:42:38 f1rmb Exp $
*/
#ifndef HAVE_AUDIO_OUT_H
#define HAVE_AUDIO_OUT_H
#include <inttypes.h>
+#if defined(XINE_COMPILE)
+#include "metronom.h"
+#include "configfile.h"
+#endif
+
+
+#define AUDIO_OUT_PLUGIN_IFACE_VERSION 1
+
/*
* audio output modes Used as Bitfield in AC3 decoder
*/
@@ -38,6 +46,12 @@ typedef struct ao_functions_s
{
/*
+ * plugin interface version, lower versions _may_ be supported
+ */
+
+ int interface_version;
+
+ /*
* find out if desired output mode is supported by
* this driver
*/
@@ -49,14 +63,15 @@ typedef struct ao_functions_s
* return value: <=0 : failure, 1 : ok
*/
- int (*open)(uint32_t bits, uint32_t rate, int mode);
+ int (*open)(metronom_t *metronom, uint32_t bits, uint32_t rate, int mode);
/*
* write audio data to output buffer - may block
* audio driver must sync sample playback with metronom
*/
- void (*write_audio_data)(int16_t* audio_data, uint32_t num_samples,
+ void (*write_audio_data)(metronom_t *metronom,
+ int16_t* audio_data, uint32_t num_samples,
uint32_t pts);
/*
@@ -65,6 +80,12 @@ typedef struct ao_functions_s
void (*close)(void);
+ /*
+ * return human readable identifier for this plugin
+ */
+
+ char* (*get_identifier) (void);
+
} ao_functions_t;
/*
@@ -89,9 +110,10 @@ typedef struct ao_functions_s
* find right device driver, init it
*/
-ao_functions_t *ao_init(char *driver_name) ;
+//ao_functions_t *ao_init(char *driver_name) ;
+
+ao_functions_t *init_audio_out_plugin(int iface, config_values_t *cfg);
char *ao_get_available_drivers ();
#endif
-
diff --git a/src/xine-engine/load_plugins.c b/src/xine-engine/load_plugins.c
index 64d662b4d..53b7500da 100644
--- a/src/xine-engine/load_plugins.c
+++ b/src/xine-engine/load_plugins.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: load_plugins.c,v 1.8 2001/04/26 21:40:17 f1rmb Exp $
+ * $Id: load_plugins.c,v 1.9 2001/04/27 10:42:38 f1rmb Exp $
*
*
* Load input/demux/audio_out/video_out/codec plugins
@@ -345,7 +345,7 @@ void load_audio_out_plugins (xine_t *this,
}
-vo_driver_t *load_video_output_plugin(config_values_t *config,
+vo_driver_t *xine_load_video_output_plugin(config_values_t *config,
char *filename, char *id,
int visual_type, void *visual) {
DIR *dir;
@@ -372,6 +372,7 @@ vo_driver_t *load_video_output_plugin(config_values_t *config,
XINE_VIDEO_OUT_PLUGIN_PREFIXNAME,
XINE_VIDEO_OUT_PLUGIN_PREFIXNAME_LENGTH) == 0) &&
((pEntry->d_name[nLen-3]=='.')
+
&& (pEntry->d_name[nLen-2]=='s')
&& (pEntry->d_name[nLen-1]=='o'))) {
@@ -386,7 +387,7 @@ vo_driver_t *load_video_output_plugin(config_values_t *config,
exit(1);
}
else {
- void *(*initplug) (int, config_values_t *, int, void *);
+ void *(*initplug) (int, config_values_t *, void *, int);
if((initplug = dlsym(plugin, "init_video_out_plugin")) != NULL) {
@@ -408,7 +409,7 @@ vo_driver_t *load_video_output_plugin(config_values_t *config,
exit(1);
}
else {
- void *(*initplug) (int, config_values_t *, int, void *);
+ void *(*initplug) (int, config_values_t *, void *, int);
if((initplug = dlsym(plugin, "init_video_out_plugin")) != NULL) {
@@ -435,20 +436,92 @@ char **enum_video_output_plugins(int visual_type) {
return NULL;
}
-ao_functions_t *load_audio_output_plugin(char *filename, char *id) {
-
- if(filename == NULL && id == NULL)
+ao_functions_t *xine_load_audio_output_plugin(config_values_t *config,
+ char *filename, char *id) {
+ DIR *dir;
+ ao_functions_t *aod;
+
+ if(filename == NULL && id == NULL) {
+ printf("%s(%s@%d): parameter(s) should be non null.\n",
+ __FILE__, __FUNCTION__, __LINE__);
return NULL;
-
- // Not implemented
-
+ }
+
+ dir = opendir (XINE_PLUGINDIR);
+
+ if (dir) {
+ struct dirent *pEntry;
+
+ while ((pEntry = readdir (dir)) != NULL) {
+ char str[1024];
+ void *plugin;
+
+ int nLen = strlen (pEntry->d_name);
+
+ if ((strncasecmp(pEntry->d_name,
+ XINE_AUDIO_OUT_PLUGIN_PREFIXNAME,
+ XINE_AUDIO_OUT_PLUGIN_PREFIXNAME_LENGTH) == 0) &&
+ ((pEntry->d_name[nLen-3]=='.')
+ && (pEntry->d_name[nLen-2]=='s')
+ && (pEntry->d_name[nLen-1]=='o'))) {
+
+ sprintf (str, "%s/%s", XINE_PLUGINDIR, pEntry->d_name);
+
+ if(filename) { /* load by name */
+ if(!strncasecmp(filename, pEntry->d_name, strlen(pEntry->d_name))) {
+
+ if(!(plugin = dlopen (str, RTLD_LAZY))) {
+ fprintf(stderr, "%s(%d): %s doesn't seem to be installed (%s)\n",
+ __FILE__, __LINE__, str, dlerror());
+ exit(1);
+ }
+ else {
+ void *(*initplug) (int, config_values_t *);
+
+ if((initplug = dlsym(plugin, "init_audio_out_plugin")) != NULL) {
+
+ aod = (ao_functions_t *) initplug(AUDIO_OUT_PLUGIN_IFACE_VERSION, config);
+
+ printf("audio output plugin found : %s(ID: %s, iface: %d)\n",
+ str, aod->get_identifier(), aod->interface_version);
+
+ return aod;
+ }
+ }
+ }
+ }
+ else { /* load by ID */
+ if(!(plugin = dlopen (str, RTLD_LAZY))) {
+ fprintf(stderr, "%s(%d): %s doesn't seem to be installed (%s)\n",
+ __FILE__, __LINE__, str, dlerror());
+ exit(1);
+ }
+ else {
+ void *(*initplug) (int, config_values_t *);
+
+ if((initplug = dlsym(plugin, "init_audio_out_plugin")) != NULL) {
+
+ aod = (ao_functions_t *) initplug(AUDIO_OUT_PLUGIN_IFACE_VERSION,
+ config);
+
+ printf("audio output plugin found : %s(ID: %s, iface: %d)\n",
+ str, aod->get_identifier(), aod->interface_version);
+
+ if(!strcasecmp(id, aod->get_identifier())) {
+ return aod;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
return NULL;
}
+
char **enum_audio_output_plugins(int output_type) {
// Not implemented
return NULL;
}
-
-
diff --git a/src/xine-engine/metronom.h b/src/xine-engine/metronom.h
index a16b9ef20..2ac1354cd 100644
--- a/src/xine-engine/metronom.h
+++ b/src/xine-engine/metronom.h
@@ -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: metronom.h,v 1.1 2001/04/18 22:36:07 f1rmb Exp $
+ * $Id: metronom.h,v 1.2 2001/04/27 10:42:38 f1rmb Exp $
*
* metronom: general pts => virtual calculation/assoc
*
@@ -176,4 +176,3 @@ struct metronom_s {
metronom_t *metronom_init ();
#endif
-
diff --git a/src/xine-engine/video_decoder.c b/src/xine-engine/video_decoder.c
index 76a1807aa..98b84e0ee 100644
--- a/src/xine-engine/video_decoder.c
+++ b/src/xine-engine/video_decoder.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: video_decoder.c,v 1.7 2001/04/24 15:47:32 guenter Exp $
+ * $Id: video_decoder.c,v 1.8 2001/04/27 10:42:38 f1rmb Exp $
*
*/
@@ -69,7 +69,8 @@ void *video_decoder_loop (void *this_gen) {
}
- decoder->decode_data (this->cur_video_decoder_plugin, buf);
+ decoder->decode_data (this->metronom,
+ this->cur_video_decoder_plugin, buf);
}
break;
diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h
index 17b17a108..0a5497757 100644
--- a/src/xine-engine/xine_internal.h
+++ b/src/xine-engine/xine_internal.h
@@ -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: xine_internal.h,v 1.11 2001/04/26 11:31:36 f1rmb Exp $
+ * $Id: xine_internal.h,v 1.12 2001/04/27 10:42:38 f1rmb Exp $
*
*/
@@ -36,7 +36,6 @@
#define DECODER_PLUGIN_MAX 50
#define CODEC_PLUGIN_IFACE_VERSION 1
#define CODEC_PLUGIN_MAX 50
-#define AUDIO_OUT_PLUGIN_IFACE_VERSION 1
#define AUDIO_OUT_PLUGIN_MAX 50
#define VIDEO_OUT_PLUGIN_MAX 50
#define VIDEO_DECODER_PLUGIN_MAX 50
@@ -61,7 +60,8 @@ struct video_decoder_s {
void (*init) (video_decoder_t *this, vo_instance_t *video_out);
- void (*decode_data) (video_decoder_t *this, buf_element_t *buf);
+ void (*decode_data) (metronom_t *metronom,
+ video_decoder_t *this, buf_element_t *buf);
void (*release_img_buffers) (video_decoder_t *this);
@@ -85,7 +85,8 @@ struct audio_decoder_s {
void (*init) (audio_decoder_t *this, ao_functions_t *audio_out);
- void (*decode_data) (audio_decoder_t *this, buf_element_t *buf);
+ void (*decode_data) (metronom_t *metronom,
+ audio_decoder_t *this, buf_element_t *buf);
void (*close) (audio_decoder_t *this);
@@ -346,12 +347,15 @@ void load_decoder_plugins (xine_t *this,
#define VIDEO_OUTPUT_TYPE_PROBE 1
#define VIDEO_OUTPUT_TYPE_X11 2
#define VIDEO_OUTPUT_TYPE_FB 3
-vo_driver_t *load_video_output_plugin(config_values_t *config,
- char *filename, char *id,
- int visual_type, void *visual);
+vo_driver_t *xine_load_video_output_plugin(config_values_t *config,
+ char *filename, char *id,
+ int visual_type, void *visual);
#define AUDIO_OUTPUT_TYPE_GETID 0
#define AUDIO_OUTPUT_TYPE_PROBE 1
#define AUDIO_OUTPUT_TYPE_OSS 2
#define AUDIO_OUTPUT_TYPE_ALSA 3
#define AUDIO_OUTPUT_TYPE_ESD 4
+ao_functions_t *xine_load_audio_output_plugin(config_values_t *config,
+ char *filename, char *id);
#endif
+