summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorphintuka <phintuka>2012-03-07 08:41:41 +0000
committerphintuka <phintuka>2012-03-07 08:41:41 +0000
commit11547a854f3c163ca6da81e52197234aa339c975 (patch)
tree9dd3213bf518a280fb8ba562dcd4402e07ea23a2
parent3a9c562687221ca62d0fca483ce4daec19fdec8f (diff)
downloadxineliboutput-11547a854f3c163ca6da81e52197234aa339c975.tar.gz
xineliboutput-11547a854f3c163ca6da81e52197234aa339c975.tar.bz2
xine-lib-1.2: use _x_action_raise() and _x_action_lower() instead of directly modifying stream->demux_action_pending
(Thanks to Roland Scheidegger)
-rw-r--r--xine_input_vdr.c43
1 files changed, 31 insertions, 12 deletions
diff --git a/xine_input_vdr.c b/xine_input_vdr.c
index 4f1fe266..3413bf67 100644
--- a/xine_input_vdr.c
+++ b/xine_input_vdr.c
@@ -4,7 +4,7 @@
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
- * $Id: xine_input_vdr.c,v 1.353 2012-01-18 13:29:59 phintuka Exp $
+ * $Id: xine_input_vdr.c,v 1.354 2012-03-07 08:41:41 phintuka Exp $
*
*/
@@ -136,7 +136,7 @@ typedef struct {
# include <linux/unistd.h> /* syscall(__NR_gettid) */
#endif
-static const char module_revision[] = "$Id: xine_input_vdr.c,v 1.353 2012-01-18 13:29:59 phintuka Exp $";
+static const char module_revision[] = "$Id: xine_input_vdr.c,v 1.354 2012-03-07 08:41:41 phintuka Exp $";
static const char log_module_input_vdr[] = "[input_vdr] ";
#define LOG_MODULENAME log_module_input_vdr
#define SysLogLevel iSysLogLevel
@@ -1994,20 +1994,44 @@ static int vdr_plugin_exec_osd_command(vdr_input_plugin_if_t *this_if,
# define DEMUX_RESUME_SIGNAL pthread_cond_signal(&this->stream->demux_resume)
#endif
+#if XINE_VERSION_CODE < 10200
+# define RAISE_ACTION_PENDING this->stream->demux_action_pending = 1
+# define LOWER_ACTION_PENDING this->stream->demux_action_pending = 0
+#else
+# define RAISE_ACTION_PENDING _x_action_raise(this->stream)
+# define LOWER_ACTION_PENDING _x_action_lower(this->stream)
+#endif
+
static void suspend_demuxer(vdr_input_plugin_t *this)
{
- this->stream->demux_action_pending = 1;
- signal_buffer_not_empty(this);
- if(this->is_paused)
+ if (this->is_paused)
LOGMSG("WARNING: called suspend_demuxer in paused mode !");
+
+ /* request demuxer to release demux_lock */
+ RAISE_ACTION_PENDING;
+
+ /* signal all possible sync points to speed up this */
+ pthread_cond_broadcast(&this->engine_flushed);
+ signal_buffer_not_empty(this);
+
+ /* let demuxer return from vdr_plugin_read_* */
+ if (pthread_mutex_unlock( &this->lock ))
+ LOGERR("pthread_mutex_unlock failed !");
+
+ /* lock demuxer */
pthread_mutex_lock( &this->stream->demux_lock );
- this->stream->demux_action_pending = 0;
+
+ LOWER_ACTION_PENDING;
+
+ pthread_mutex_lock( &this->lock );
+
/* must be paired with resume_demuxer !!! */
}
static void resume_demuxer(vdr_input_plugin_t *this)
{
/* must be paired with suspend_demuxer !!! */
+
DEMUX_RESUME_SIGNAL;
pthread_mutex_unlock( &this->stream->demux_lock );
}
@@ -2068,12 +2092,7 @@ static void vdr_flush_engine(vdr_input_plugin_t *this, uint64_t discard_index)
}
/* suspend demuxer */
- this->stream->demux_action_pending = 1;
- pthread_cond_broadcast(&this->engine_flushed);
- if(pthread_mutex_unlock( &this->lock )) /* to let demuxer return from vdr_plugin_read_* */
- LOGERR("pthread_mutex_unlock failed !");
suspend_demuxer(this);
- pthread_mutex_lock( &this->lock );
reset_scr_tuning(this);
@@ -5088,7 +5107,7 @@ static void vdr_plugin_dispose (input_plugin_t *this_gen)
pthread_cond_broadcast(&this->engine_flushed);
while(pthread_cond_destroy(&this->engine_flushed) == EBUSY) {
- LOGMSG("discard_signal busy !");
+ LOGMSG("engine_flushed signal busy !");
pthread_cond_broadcast(&this->engine_flushed);
xine_usec_sleep(10);
}