[vlc-commits] decomp: implement pause/resume
Rémi Denis-Courmont
git at videolan.org
Tue Apr 16 21:03:49 CEST 2013
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Tue Apr 16 22:03:33 2013 +0300| [edeafe1e1e71022a4dc0ed63c897b08f4b7a8c27] | committer: Rémi Denis-Courmont
decomp: implement pause/resume
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=edeafe1e1e71022a4dc0ed63c897b08f4b7a8c27
---
modules/stream_filter/decomp.c | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/modules/stream_filter/decomp.c b/modules/stream_filter/decomp.c
index 20075a8..86fee43 100644
--- a/modules/stream_filter/decomp.c
+++ b/modules/stream_filter/decomp.c
@@ -74,6 +74,11 @@ struct stream_sys_t
/* Thread data */
int write_fd;
+ /* Shared data */
+ vlc_cond_t wait;
+ vlc_mutex_t lock;
+ bool paused;
+
/* Caller data */
vlc_thread_t thread;
pid_t pid;
@@ -83,6 +88,7 @@ struct stream_sys_t
int read_fd;
bool can_pace;
+ bool can_pause;
};
extern char **environ;
@@ -122,7 +128,12 @@ static void *Thread (void *data)
vlc_cleanup_push (free, buf);
#endif
+ vlc_mutex_lock (&p_sys->lock);
+ while (p_sys->paused) /* practically always false, but... */
+ vlc_cond_wait (&p_sys->wait, &p_sys->lock);
len = stream_Read (stream->p_source, buf, bufsize);
+ vlc_mutex_unlock (&p_sys->lock);
+
vlc_restorecancel (canc);
error = len <= 0;
@@ -251,9 +262,11 @@ static int Control (stream_t *stream, int query, va_list args)
{
case STREAM_CAN_SEEK:
case STREAM_CAN_FASTSEEK:
- case STREAM_CAN_PAUSE: /* TODO: support pause */
*(va_arg (args, bool *)) = false;
break;
+ case STREAM_CAN_PAUSE:
+ *(va_arg (args, bool *)) = p_sys->can_pause;
+ break;
case STREAM_CAN_CONTROL_PACE:
*(va_arg (args, bool *)) = p_sys->can_pace;
break;
@@ -263,6 +276,17 @@ static int Control (stream_t *stream, int query, va_list args)
case STREAM_GET_SIZE:
*(va_arg (args, uint64_t *)) = 0;
break;
+ case STREAM_SET_PAUSE_STATE:
+ {
+ bool paused = va_arg (args, unsigned);
+
+ vlc_mutex_lock (&p_sys->lock);
+ stream_Control (stream->p_source, STREAM_SET_PAUSE_STATE, paused);
+ p_sys->paused = paused;
+ vlc_cond_signal (&p_sys->wait);
+ vlc_mutex_unlock (&p_sys->lock);
+ break;
+ }
default:
return VLC_EGENERIC;
}
@@ -284,9 +308,13 @@ static int Open (stream_t *stream, const char *path)
stream->pf_peek = Peek;
stream->pf_control = Control;
+ vlc_cond_init (&p_sys->wait);
+ vlc_mutex_init (&p_sys->lock);
+ p_sys->paused = false;
p_sys->pid = -1;
p_sys->offset = 0;
p_sys->peeked = NULL;
+ stream_Control (stream->p_source, STREAM_CAN_PAUSE, &p_sys->can_pause);
stream_Control (stream->p_source, STREAM_CAN_CONTROL_PACE,
&p_sys->can_pace);
@@ -359,6 +387,8 @@ static int Open (stream_t *stream, const char *path)
if (p_sys->pid != -1)
while (waitpid (p_sys->pid, &(int){ 0 }, 0) == -1);
+ vlc_mutex_destroy (&p_sys->lock);
+ vlc_cond_destroy (&p_sys->wait);
free (p_sys);
return ret;
}
@@ -386,6 +416,8 @@ static void Close (vlc_object_t *obj)
if (p_sys->peeked)
block_Release (p_sys->peeked);
+ vlc_mutex_destroy (&p_sys->lock);
+ vlc_cond_destroy (&p_sys->wait);
free (p_sys);
}
More information about the vlc-commits
mailing list