diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2004-12-19 20:24:30 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2004-12-19 20:24:30 +0000 |
commit | e1019bfd4706a9ab58e68c33e4c4d8aae2489557 (patch) | |
tree | 8a158d2bee82b11e3f2484befbd2d46cf4710342 | |
parent | 709552aeea14284f980ace3e71c786c26f0371d5 (diff) | |
download | xine-lib-e1019bfd4706a9ab58e68c33e4c4d8aae2489557.tar.gz xine-lib-e1019bfd4706a9ab58e68c33e4c4d8aae2489557.tar.bz2 |
stop stream if audio device failed to open. user receives a notification
and should check if any other application is using the device.
CVS patchset: 7282
CVS date: 2004/12/19 20:24:30
-rw-r--r-- | src/xine-engine/audio_out.c | 18 | ||||
-rw-r--r-- | src/xine-engine/demux.c | 13 | ||||
-rw-r--r-- | src/xine-engine/xine_interface.c | 6 | ||||
-rw-r--r-- | src/xine-engine/xine_internal.h | 6 |
4 files changed, 29 insertions, 14 deletions
diff --git a/src/xine-engine/audio_out.c b/src/xine-engine/audio_out.c index e8c852091..e9414ced9 100644 --- a/src/xine-engine/audio_out.c +++ b/src/xine-engine/audio_out.c @@ -17,7 +17,7 @@ * along with self program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: audio_out.c,v 1.188 2004/12/12 22:01:30 mroi Exp $ + * $Id: audio_out.c,v 1.189 2004/12/19 20:24:30 miguelfreitas Exp $ * * 22-8-2001 James imported some useful AC3 sections from the previous alsa driver. * (c) 2001 Andy Lo A Foe <andy@alsaplayer.org> @@ -1047,10 +1047,10 @@ static void *ao_loop (void *this_gen) { pthread_mutex_lock(&this->streams_lock); for (stream = xine_list_first_content(this->streams); stream; stream = xine_list_next_content(this->streams)) { - _x_message (stream, XINE_MSG_AUDIO_OUT_UNAVAILABLE, NULL); - /* This is necessary for the message to get to the front-end at some - * point before another message is sent */ - sched_yield(); + if( !stream->emergency_brake ) { + stream->emergency_brake = 1; + _x_message (stream, XINE_MSG_AUDIO_OUT_UNAVAILABLE, NULL); + } } pthread_mutex_unlock(&this->streams_lock); } @@ -1399,8 +1399,14 @@ static int ao_open(xine_audio_port_t *this_gen, xine_stream_t *stream, pthread_mutex_lock( &this->driver_lock ); ret = ao_change_settings(this, bits, rate, mode); pthread_mutex_unlock( &this->driver_lock ); - if( !ret ) + + if( !ret ) { + if( !stream->emergency_brake ) { + stream->emergency_brake = 1; + _x_message (stream, XINE_MSG_AUDIO_OUT_UNAVAILABLE, NULL); + } return 0; + } } /* diff --git a/src/xine-engine/demux.c b/src/xine-engine/demux.c index 4b4049464..27c63d2a7 100644 --- a/src/xine-engine/demux.c +++ b/src/xine-engine/demux.c @@ -20,7 +20,7 @@ * Demuxer helper functions * hide some xine engine details from demuxers and reduce code duplication * - * $Id: demux.c,v 1.53 2004/10/30 12:45:27 miguelfreitas Exp $ + * $Id: demux.c,v 1.54 2004/12/19 20:24:31 miguelfreitas Exp $ */ @@ -243,13 +243,15 @@ static void *demux_loop (void *stream_gen) { lprintf ("loop starting...\n"); pthread_mutex_lock( &stream->demux_lock ); - + stream->emergency_brake = 0; + /* do-while needed to seek after demux finished */ do { /* main demuxer loop */ status = stream->demux_plugin->get_status(stream->demux_plugin); - while(status == DEMUX_OK && stream->demux_thread_running) { + while(status == DEMUX_OK && stream->demux_thread_running && + !stream->emergency_brake) { status = stream->demux_plugin->send_chunk(stream->demux_plugin); @@ -275,14 +277,15 @@ static void *demux_loop (void *stream_gen) { while(stream->demux_thread_running && ((stream->video_fifo->size(stream->video_fifo)) || (stream->audio_fifo->size(stream->audio_fifo))) && - status == DEMUX_FINISHED ){ + status == DEMUX_FINISHED && !stream->emergency_brake){ pthread_mutex_unlock( &stream->demux_lock ); xine_usec_sleep(100000); pthread_mutex_lock( &stream->demux_lock ); status = stream->demux_plugin->get_status(stream->demux_plugin); } - } while( status == DEMUX_OK && stream->demux_thread_running ); + } while( status == DEMUX_OK && stream->demux_thread_running && + !stream->emergency_brake); lprintf ("loop finished (status: %d)\n", status); diff --git a/src/xine-engine/xine_interface.c b/src/xine-engine/xine_interface.c index 932c98b46..04b5ce630 100644 --- a/src/xine-engine/xine_interface.c +++ b/src/xine-engine/xine_interface.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: xine_interface.c,v 1.85 2004/12/19 10:50:18 f1rmb Exp $ + * $Id: xine_interface.c,v 1.86 2004/12/19 20:24:31 miguelfreitas Exp $ * * convenience/abstraction layer, functions to implement * libxine's public interface @@ -884,7 +884,9 @@ int _x_message(xine_stream_t *stream, int type, ...) { "Read error from:", "Error loading library:", "Encrypted media stream detected", - "Security message:" + "Security message:", + "Audio device unavailable", + "Permission error", }; if (!stream) return 0; diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h index 64bbe2d5e..0193428ba 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.162 2004/10/29 13:11:47 miguelfreitas Exp $ + * $Id: xine_internal.h,v 1.163 2004/12/19 20:24:31 miguelfreitas Exp $ * */ @@ -326,6 +326,10 @@ struct xine_stream_s { broadcaster_t *broadcaster; refcounter_t *refcounter; + + int emergency_brake; /* something went really wrong and this stream must be + * stopped. usually due some fatal error on output + * layers as they cannot call xine_stop. */ #endif }; |