From 24b7171dff5bdbb05dd7ab343e718814aaba9186 Mon Sep 17 00:00:00 2001 From: Matthias Kretz Date: Mon, 4 Jun 2007 21:18:49 +0200 Subject: handle unplugged devices in audio_alsa_out (return -1) and in audio_out close the driver on a return value <0 --- src/xine-engine/audio_out.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'src/xine-engine/audio_out.c') diff --git a/src/xine-engine/audio_out.c b/src/xine-engine/audio_out.c index 66e28d80d..2655d495a 100644 --- a/src/xine-engine/audio_out.c +++ b/src/xine-engine/audio_out.c @@ -1211,13 +1211,15 @@ static void *ao_loop (void *this_gen) { } if( result < 0 ) { - /* FIXME: USB device unplugged. - * We should get the card into a closed state here, that involves closing - * the PCM as well as the MIXER. - * Maybe we should pause the stream until the USB device is plugged in again. - * Return values 0 happen even if usb not unplugged, so needs further investigation. - */ - xprintf(this->xine, XINE_VERBOSITY_LOG, _("write to sound card failed. Was a USB device unplugged ?\n")); + /* device unplugged. */ + xprintf(this->xine, XINE_VERBOSITY_LOG, _("write to sound card failed. Assuming the device was unplugged.\n")); + + pthread_mutex_lock( &this->driver_lock ); + if(this->driver_open) + this->driver->close(this->driver); + this->driver_open = 0; + pthread_mutex_unlock( &this->driver_lock ); + /* closing the driver will result in XINE_MSG_AUDIO_OUT_UNAVAILABLE to be emitted */ } lprintf ("loop: next buf from fifo\n"); -- cgit v1.2.3 From 6d72cf30f29689035eddbe95d35fd39fcf5d70ca Mon Sep 17 00:00:00 2001 From: Matthias Kretz Date: Mon, 4 Jun 2007 21:18:49 +0200 Subject: fallback to none output when the device is unplugged --- src/xine-engine/audio_out.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) (limited to 'src/xine-engine/audio_out.c') 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 */ } -- cgit v1.2.3