Package: xine-lib
Severity: wishlist
Hi,
please find attached a patch which adds support for remote esound
server. Until now, only `localhost' is used, since the `NULL' parameter
is specified when calling esd_* functions. With this patch, one can
specify a `audio.device.esd_server' parameter, which will be used to
determine the esound server to use.
By default, when one has selected the `esd' output with the following
line in the configuration file, localhost is used automatically, as
before, so that the default behaviour isn't changed.
audio.driver:esd
The new configuration item can be used as follows, either by specifying
`localhost' (or leaving it blank, which has the same effect), or by
specifying a remote server.
audio.device.esd_server:my_remote_server
I didn't get really how configuration item types are determined, so
instead of querying the `str_value' of the configuration item, I query
`unknown_value'. But I guess that upstream will know how to handle this
tiny imperfection.
Of course, I checked all the above-mentioned behaviours.
Cheers,
--
Cyril Brulebois
PS: Looks like a call to a xine_config_register_string() should do the
job, but that would be in xine-ui, I guess. However, documenting
this new feature could be sufficient at the moment, e.g. in a
README.Debian file.
--- xine-lib-1.1.2+dfsg~/src/audio_out/audio_esd_out.c 2006-11-24 06:40:40.000000000 +0100
+++ xine-lib-1.1.2+dfsg/src/audio_out/audio_esd_out.c 2006-11-24 06:44:41.000000000 +0100
@@ -92,6 +92,8 @@
int reblock_rem;
#endif
+ char *server_name; /* ESD server, NULL for localhost */
+
} esd_driver_t;
typedef struct {
@@ -160,7 +162,7 @@
#endif
this->output_sample_k_rate = this->output_sample_rate / 1000;
- this->audio_fd = esd_play_stream(format, this->output_sample_rate, NULL, this->pname);
+ this->audio_fd = esd_play_stream(format, this->output_sample_rate, this->server_name, this->pname);
if (this->audio_fd < 0) {
char *server = getenv("ESPEAKER");
xprintf(this->xine, XINE_VERBOSITY_LOG,
@@ -343,6 +345,7 @@
if (this->audio_fd != -1)
esd_close(this->audio_fd);
+ free(this->server_name);
free(this->pname);
free (this);
@@ -357,7 +360,7 @@
switch(property) {
case AO_PROP_MIXER_VOL:
- if((mixer_fd = esd_open_sound(NULL)) >= 0) {
+ if((mixer_fd = esd_open_sound(this->server_name)) >= 0) {
if((esd_i = esd_get_all_info(mixer_fd)) != NULL) {
for(esd_pi = esd_i->player_list; esd_pi != NULL; esd_pi = esd_pi->next) {
if(!strcmp(this->pname, esd_pi->name)) {
@@ -398,7 +401,7 @@
/* need this to get source_id */
(void) ao_esd_get_property(&this->ao_driver, AO_PROP_MIXER_VOL);
- if((mixer_fd = esd_open_sound(NULL)) >= 0) {
+ if((mixer_fd = esd_open_sound(this->server_name)) >= 0) {
int v = (value * 256) / 100;
esd_set_stream_pan(mixer_fd, this->mixer.source_id, v, v);
@@ -422,7 +425,7 @@
(void) ao_esd_get_property(&this->ao_driver, AO_PROP_MIXER_VOL);
if(mute) {
- if((mixer_fd = esd_open_sound(NULL)) >= 0) {
+ if((mixer_fd = esd_open_sound(this->server_name)) >= 0) {
int v = 0;
esd_set_stream_pan(mixer_fd, this->mixer.source_id, v, v);
@@ -430,7 +433,7 @@
}
}
else {
- if((mixer_fd = esd_open_sound(NULL)) >= 0) {
+ if((mixer_fd = esd_open_sound(this->server_name)) >= 0) {
int v = (this->mixer.volume * 256) / 100;
esd_set_stream_pan(mixer_fd, this->mixer.source_id, v, v);
@@ -478,6 +481,8 @@
esd_server_info_t *esd_svinfo;
int server_sample_rate;
sigset_t vo_mask, vo_mask_orig;
+ char *esd_server_name;
+ cfg_entry_t *config_entry;
/*
* open stream to ESD server
@@ -491,13 +496,21 @@
* (Otherwise xine hangs in esd_open_sound on a machine without sound)
*/
+ /* We need it to test the esd server, before storing it inside this->server_name */
+
+ config_entry = config->lookup_entry(config, "audio.device.esd_server");
+ if (config_entry)
+ esd_server_name = strdup(config_entry->unknown_value); // str_value!
+ else
+ esd_server_name = NULL;
+
sigemptyset(&vo_mask);
sigaddset(&vo_mask, SIGALRM);
if (sigprocmask(SIG_UNBLOCK, &vo_mask, &vo_mask_orig))
xprintf(class->xine, XINE_VERBOSITY_DEBUG, "audio_esd_out: cannot unblock SIGALRM: %s\n", strerror(errno));
xprintf(class->xine, XINE_VERBOSITY_LOG, _("audio_esd_out: connecting to esd server...\n"));
- audio_fd = esd_open_sound(NULL);
+ audio_fd = esd_open_sound(esd_server_name);
err = errno;
if (sigprocmask(SIG_SETMASK, &vo_mask_orig, NULL))
@@ -526,6 +539,7 @@
this = (esd_driver_t *) xine_xmalloc (sizeof (esd_driver_t));
this->xine = class->xine;
+ this->server_name = esd_server_name;
this->pname = strdup("xine esd audio output plugin");
this->output_sample_rate = 0;
this->server_sample_rate = server_sample_rate;