summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2004-12-19 20:24:30 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2004-12-19 20:24:30 +0000
commite1019bfd4706a9ab58e68c33e4c4d8aae2489557 (patch)
tree8a158d2bee82b11e3f2484befbd2d46cf4710342
parent709552aeea14284f980ace3e71c786c26f0371d5 (diff)
downloadxine-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.c18
-rw-r--r--src/xine-engine/demux.c13
-rw-r--r--src/xine-engine/xine_interface.c6
-rw-r--r--src/xine-engine/xine_internal.h6
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
};