summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/xine-engine/audio_out.c18
-rw-r--r--src/xine-engine/load_plugins.c32
-rw-r--r--src/xine-engine/xine_internal.h2
3 files changed, 48 insertions, 4 deletions
diff --git a/src/xine-engine/audio_out.c b/src/xine-engine/audio_out.c
index 2655d495a..75cef4ce6 100644
--- a/src/xine-engine/audio_out.c
+++ b/src/xine-engine/audio_out.c
@@ -1213,11 +1213,23 @@ static void *ao_loop (void *this_gen) {
if( result < 0 ) {
/* device unplugged. */
xprintf(this->xine, XINE_VERBOSITY_LOG, _("write to sound card failed. Assuming the device was unplugged.\n"));
+ _x_message (in_buf->stream, XINE_MSG_AUDIO_OUT_UNAVAILABLE, NULL);
pthread_mutex_lock( &this->driver_lock );
- if(this->driver_open)
- this->driver->close(this->driver);
- this->driver_open = 0;
+ if(this->driver_open) {
+ this->driver->close(this->driver);
+ this->driver_open = 0;
+ this->driver->exit(this->driver);
+ this->driver = _x_load_audio_output_plugin (this->xine, "none");
+ if (this->driver && !in_buf->stream->emergency_brake &&
+ ao_change_settings(this,
+ in_buf->format.bits,
+ in_buf->format.rate,
+ in_buf->format.mode) == 0) {
+ in_buf->stream->emergency_brake = 1;
+ _x_message (in_buf->stream, XINE_MSG_AUDIO_OUT_UNAVAILABLE, NULL);
+ }
+ }
pthread_mutex_unlock( &this->driver_lock );
/* closing the driver will result in XINE_MSG_AUDIO_OUT_UNAVAILABLE to be emitted */
}
diff --git a/src/xine-engine/load_plugins.c b/src/xine-engine/load_plugins.c
index ca1f87c7a..750ec21e7 100644
--- a/src/xine-engine/load_plugins.c
+++ b/src/xine-engine/load_plugins.c
@@ -1721,6 +1721,38 @@ static ao_driver_t *_load_audio_driver (xine_t *this, plugin_node_t *node,
return driver;
}
+ao_driver_t *_x_load_audio_output_plugin (xine_t *this, const char *id)
+{
+ plugin_node_t *node;
+ ao_driver_t *driver = NULL;
+ ao_info_t *ao_info;
+ plugin_catalog_t *catalog = this->plugin_catalog;
+ int list_id, list_size;
+
+ pthread_mutex_lock (&catalog->lock);
+
+ list_size = xine_sarray_size (this->plugin_catalog->plugin_lists[PLUGIN_AUDIO_OUT - 1]);
+ for (list_id = 0; list_id < list_size; list_id++) {
+
+ node = xine_sarray_get (this->plugin_catalog->plugin_lists[PLUGIN_AUDIO_OUT - 1], list_id);
+
+ ao_info = (ao_info_t *)node->info->special_info;
+
+ if (!strcasecmp(node->info->id, id)) {
+ driver = _load_audio_driver (this, node, NULL);
+ break;
+ }
+ }
+
+ pthread_mutex_unlock (&catalog->lock);
+
+ if (!driver) {
+ xprintf (this, XINE_VERBOSITY_LOG,
+ _("load_plugins: failed to load audio output plugin <%s>\n"), id);
+ }
+ return driver;
+}
+
xine_audio_port_t *xine_open_audio_driver (xine_t *this, const char *id,
void *data) {
diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h
index 208ef7647..fc142d44b 100644
--- a/src/xine-engine/xine_internal.h
+++ b/src/xine-engine/xine_internal.h
@@ -500,7 +500,7 @@ vo_driver_t *_x_load_video_output_plugin(xine_t *this,
* load a specific audio output plugin
*/
-ao_driver_t *_x_load_audio_output_plugin (xine_t *self, char *id) XINE_PROTECTED;
+ao_driver_t *_x_load_audio_output_plugin (xine_t *self, const char *id) XINE_PROTECTED;
void _x_set_speed (xine_stream_t *stream, int speed) XINE_PROTECTED;