|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
/*
|
|
|
|
|
This file is part of KDE/aRts (Noatun) - xine integration
|
|
|
|
|
Copyright (C) 2002-2003 Ewald Snel <ewald@rambo.its.tudelft.nl>
|
|
|
|
|
Copyright (C) 2014 Timothy Pearson <kb9vqf@pearsoncomputing.net>
|
|
|
|
|
|
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
|
|
|
modify it under the terms of the GNU Lesser General Public
|
|
|
|
@ -21,12 +22,18 @@
|
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
#include <xine/audio_out.h>
|
|
|
|
|
|
|
|
|
|
#if (XINE_MAJOR_VERSION >= 1) && (XINE_MINOR_VERSION >= 2)
|
|
|
|
|
#include <xine/xine_internal.h>
|
|
|
|
|
#include <xine/xine_plugin.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include "audio_fifo_out.h"
|
|
|
|
|
|
|
|
|
|
#define GAP_TOLERANCE 5000
|
|
|
|
|
|
|
|
|
|
typedef struct fifo_driver_s
|
|
|
|
|
{
|
|
|
|
|
// #define XINE_DEBUG 1
|
|
|
|
|
|
|
|
|
|
typedef struct fifo_driver_s {
|
|
|
|
|
ao_driver_t ao_driver;
|
|
|
|
|
|
|
|
|
|
xine_arts_audio *audio;
|
|
|
|
@ -44,6 +51,11 @@ typedef struct fifo_driver_s
|
|
|
|
|
int fifo_write_ptr;
|
|
|
|
|
int fifo_flush;
|
|
|
|
|
int fifo_delay;
|
|
|
|
|
|
|
|
|
|
#if (XINE_MAJOR_VERSION >= 1) && (XINE_MINOR_VERSION >= 2)
|
|
|
|
|
config_values_t *config;
|
|
|
|
|
xine_t *xine;
|
|
|
|
|
#endif
|
|
|
|
|
} fifo_driver_t;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -280,9 +292,111 @@ static int ao_fifo_control( ao_driver_t *this_gen, int cmd, ... )
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if (XINE_MAJOR_VERSION >= 1) && (XINE_MINOR_VERSION >= 2)
|
|
|
|
|
static fifo_driver_t * _ao_driver = NULL;
|
|
|
|
|
|
|
|
|
|
typedef struct fifo_class_s {
|
|
|
|
|
audio_driver_class_t driver_class;
|
|
|
|
|
config_values_t *config;
|
|
|
|
|
xine_t *xine;
|
|
|
|
|
} fifo_class_t;
|
|
|
|
|
|
|
|
|
|
static void _arts_class_dispose(audio_driver_class_t *driver_class) {
|
|
|
|
|
fifo_class_t *cl;
|
|
|
|
|
|
|
|
|
|
cl = (fifo_class_t *)driver_class;
|
|
|
|
|
free(cl);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static char *_arts_class_identifier_get(video_driver_class_t *driver_class) {
|
|
|
|
|
return "arts";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static char *_arts_class_description_get(video_driver_class_t *driver_class) {
|
|
|
|
|
return "aRts xine video output plugin";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static ao_driver_t * _arts_open(audio_driver_class_t *driver_class, const void *data) {
|
|
|
|
|
fifo_class_t *cl;
|
|
|
|
|
|
|
|
|
|
cl = (fifo_class_t *)driver_class;
|
|
|
|
|
|
|
|
|
|
_ao_driver = (fifo_driver_t *)malloc(sizeof(fifo_driver_t));
|
|
|
|
|
if (!_ao_driver) return NULL;
|
|
|
|
|
|
|
|
|
|
_ao_driver->config = cl->config;
|
|
|
|
|
_ao_driver->xine = cl->xine;
|
|
|
|
|
_ao_driver->audio = data;
|
|
|
|
|
_ao_driver->fifo = NULL;
|
|
|
|
|
_ao_driver->fifo_read_ptr = 0;
|
|
|
|
|
_ao_driver->fifo_write_ptr = 0;
|
|
|
|
|
_ao_driver->fifo_flush = 2;
|
|
|
|
|
_ao_driver->fifo_delay = 0;
|
|
|
|
|
_ao_driver->capabilities = (AO_CAP_MODE_MONO | AO_CAP_MODE_STEREO);
|
|
|
|
|
|
|
|
|
|
_ao_driver->ao_driver.get_capabilities = ao_fifo_get_capabilities;
|
|
|
|
|
_ao_driver->ao_driver.get_property = ao_fifo_get_property;
|
|
|
|
|
_ao_driver->ao_driver.set_property = ao_fifo_set_property;
|
|
|
|
|
_ao_driver->ao_driver.open = ao_fifo_open;
|
|
|
|
|
_ao_driver->ao_driver.num_channels = ao_fifo_num_channels;
|
|
|
|
|
_ao_driver->ao_driver.bytes_per_frame = ao_fifo_bytes_per_frame;
|
|
|
|
|
_ao_driver->ao_driver.delay = ao_fifo_delay;
|
|
|
|
|
_ao_driver->ao_driver.write = ao_fifo_write;
|
|
|
|
|
_ao_driver->ao_driver.close = ao_fifo_close;
|
|
|
|
|
_ao_driver->ao_driver.exit = ao_fifo_exit;
|
|
|
|
|
_ao_driver->ao_driver.get_gap_tolerance = ao_fifo_get_gap_tolerance;
|
|
|
|
|
_ao_driver->ao_driver.control = ao_fifo_control;
|
|
|
|
|
|
|
|
|
|
pthread_cond_init( &_ao_driver->cond, NULL );
|
|
|
|
|
pthread_mutex_init( &_ao_driver->read_mutex, NULL );
|
|
|
|
|
pthread_mutex_init( &_ao_driver->write_mutex, NULL );
|
|
|
|
|
|
|
|
|
|
return &_ao_driver->ao_driver;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void *_arts_plugin_class_init(xine_t *xine, void *data) {
|
|
|
|
|
fifo_class_t *cl;
|
|
|
|
|
|
|
|
|
|
cl = (fifo_class_t *) malloc(sizeof(fifo_class_t));
|
|
|
|
|
if (!cl) return NULL;
|
|
|
|
|
cl->driver_class.open_plugin = _arts_open;
|
|
|
|
|
cl->driver_class.identifier = _arts_class_identifier_get(NULL);
|
|
|
|
|
cl->driver_class.description = _arts_class_description_get(NULL);
|
|
|
|
|
cl->driver_class.dispose = _arts_class_dispose;
|
|
|
|
|
cl->config = xine->config;
|
|
|
|
|
cl->xine = xine;
|
|
|
|
|
|
|
|
|
|
return cl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static ao_info_t _arts_info =
|
|
|
|
|
{
|
|
|
|
|
1 /* priority */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
plugin_info_t arts_xine_plugin_info[] =
|
|
|
|
|
{
|
|
|
|
|
{ PLUGIN_AUDIO_OUT, AUDIO_OUT_IFACE_VERSION, "arts", XINE_VERSION_CODE, &_arts_info, _arts_plugin_class_init },
|
|
|
|
|
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
|
|
|
|
|
};
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
xine_audio_port_t *init_audio_out_plugin( xine_t *xine, xine_arts_audio *audio,
|
|
|
|
|
void **ao_driver )
|
|
|
|
|
{
|
|
|
|
|
#ifdef XINE_DEBUG
|
|
|
|
|
xine->verbosity = 1;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#if (XINE_MAJOR_VERSION >= 1) && (XINE_MINOR_VERSION >= 2)
|
|
|
|
|
xine_audio_port_t *ret;
|
|
|
|
|
xine_register_plugins(xine, arts_xine_plugin_info);
|
|
|
|
|
ret = xine_open_audio_driver( xine, "arts", audio );
|
|
|
|
|
if (ret) {
|
|
|
|
|
*ao_driver = (void *)_ao_driver;
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
#else
|
|
|
|
|
fifo_driver_t *ao = (fifo_driver_t *)malloc( sizeof(fifo_driver_t) );
|
|
|
|
|
|
|
|
|
|
ao->audio = audio;
|
|
|
|
@ -312,7 +426,8 @@ xine_audio_port_t *init_audio_out_plugin( xine_t *xine, xine_arts_audio *audio,
|
|
|
|
|
|
|
|
|
|
*ao_driver = (void *)ao;
|
|
|
|
|
|
|
|
|
|
return _x_ao_new_port( xine, (ao_driver_t *)ao, 0 );
|
|
|
|
|
return ao_new_port( xine, (ao_driver_t *)ao, 0 );
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
unsigned long ao_fifo_read( void *ao_driver, unsigned char **buffer,
|
|
|
|
|