Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-gpu
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-gpu
Commits
b3bfa5ad
Commit
b3bfa5ad
authored
Feb 22, 2009
by
Rémi Duraffort
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
xosd: use a condition variable instead of a sleep.
parent
60a84269
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
81 additions
and
66 deletions
+81
-66
modules/misc/notify/xosd.c
modules/misc/notify/xosd.c
+81
-66
No files found.
modules/misc/notify/xosd.c
View file @
b3bfa5ad
...
...
@@ -45,8 +45,10 @@
*****************************************************************************/
struct
intf_sys_t
{
xosd
*
p_osd
;
/* libxosd handle */
bool
b_need_update
;
/* Update display ? */
xosd
*
p_osd
;
/* libxosd handle */
bool
b_need_update
;
/* Update display ? */
vlc_mutex_t
lock
;
/* lock for the condition variable */
vlc_cond_t
cond
;
/* condition variable to know when to update */
};
#define MAX_LINE_LENGTH 256
...
...
@@ -54,13 +56,13 @@ struct intf_sys_t
/*****************************************************************************
* Local prototypes.
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
static
void
Run
(
intf_thread_t
*
);
static
void
Run
(
intf_thread_t
*
);
static
int
PlaylistNext
(
vlc_object_t
*
p_this
,
const
char
*
psz_variable
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
);
static
int
PlaylistNext
(
vlc_object_t
*
p_this
,
const
char
*
psz_variable
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
);
/*****************************************************************************
* Module descriptor
...
...
@@ -111,7 +113,7 @@ static int Open( vlc_object_t *p_this )
char
*
psz_font
,
*
psz_colour
;
/* Allocate instance and initialize some members */
p_intf
->
p_sys
=
(
intf_sys_t
*
)
malloc
(
sizeof
(
intf_sys_t
)
);
p_intf
->
p_sys
=
malloc
(
sizeof
(
intf_sys_t
)
);
if
(
p_intf
->
p_sys
==
NULL
)
return
VLC_ENOMEM
;
...
...
@@ -146,13 +148,16 @@ static int Open( vlc_object_t *p_this )
return
VLC_EGENERIC
;
}
psz_colour
=
config_GetPsz
(
p_intf
,
"xosd-colour"
);
psz_colour
=
config_GetPsz
(
p_intf
,
"xosd-colour"
);
xosd_set_colour
(
p_osd
,
psz_colour
);
xosd_set_timeout
(
p_osd
,
3
);
free
(
psz_colour
);
#endif
// Initialize mutex and condition variable before adding the callbacks
vlc_mutex_init
(
&
p_intf
->
p_sys
->
lock
);
vlc_cond_init
(
&
p_intf
->
p_sys
->
cond
);
// Add the callbacks
playlist_t
*
p_playlist
=
pl_Hold
(
p_intf
);
var_AddCallback
(
p_playlist
,
"item-current"
,
PlaylistNext
,
p_this
);
var_AddCallback
(
p_playlist
,
"item-change"
,
PlaylistNext
,
p_this
);
...
...
@@ -194,6 +199,7 @@ static int Open( vlc_object_t *p_this )
static
void
Close
(
vlc_object_t
*
p_this
)
{
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
p_this
;
playlist_t
*
p_playlist
=
pl_Hold
(
p_intf
);
var_DelCallback
(
p_playlist
,
"item-current"
,
PlaylistNext
,
p_this
);
var_DelCallback
(
p_playlist
,
"item-change"
,
PlaylistNext
,
p_this
);
...
...
@@ -203,6 +209,8 @@ static void Close( vlc_object_t *p_this )
xosd_destroy
(
p_intf
->
p_sys
->
p_osd
);
/* Destroy structure */
vlc_cond_destroy
(
&
p_intf
->
p_sys
->
cond
);
vlc_mutex_destroy
(
&
p_intf
->
p_sys
->
lock
);
free
(
p_intf
->
p_sys
);
}
...
...
@@ -216,86 +224,93 @@ static void Run( intf_thread_t *p_intf )
playlist_t
*
p_playlist
;
playlist_item_t
*
p_item
=
NULL
;
char
*
psz_display
=
NULL
;
int
cancel
=
vlc_savecancel
();
for
(
;;
)
while
(
true
)
{
int
canc
=
vlc_savecancel
();
if
(
p_intf
->
p_sys
->
b_need_update
==
true
)
// Wait for a signal
vlc_restorecancel
(
cancel
);
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
lock
);
mutex_cleanup_push
(
&
p_intf
->
p_sys
->
lock
);
while
(
!
p_intf
->
p_sys
->
b_need_update
)
vlc_cond_wait
(
&
p_intf
->
p_sys
->
cond
,
&
p_intf
->
p_sys
->
lock
);
p_intf
->
p_sys
->
b_need_update
=
false
;
vlc_cleanup_run
();
// Compute the signal
cancel
=
vlc_savecancel
();
p_playlist
=
pl_Hold
(
p_intf
);
PL_LOCK
;
// If the playlist is empty don't do anything
if
(
playlist_IsEmpty
(
p_playlist
)
)
{
p_intf
->
p_sys
->
b_need_update
=
false
;
p_playlist
=
pl_Hold
(
p_intf
);
PL_LOCK
;
PL_UNLOCK
;
pl_Release
(
p_intf
);
continue
;
}
if
(
playlist_IsEmpty
(
p_playlist
)
)
free
(
psz_display
);
int
i_status
=
playlist_Status
(
p_playlist
);
if
(
i_status
==
PLAYLIST_STOPPED
)
{
psz_display
=
strdup
(
_
(
"Stop"
));
PL_UNLOCK
;
pl_Release
(
p_intf
);
}
else
if
(
i_status
==
PLAYLIST_PAUSED
)
{
psz_display
=
strdup
(
_
(
"Pause"
));
PL_UNLOCK
;
pl_Release
(
p_intf
);
}
else
{
p_item
=
playlist_CurrentPlayingItem
(
p_playlist
);
if
(
!
p_item
)
{
PL_UNLOCK
;
pl_Release
(
p_intf
);
vlc_restorecancel
(
canc
);
continue
;
}
free
(
psz_display
);
input_item_t
*
p_input
=
p_item
->
p_input
;
vlc_gc_incref
(
p_input
);
int
i_status
=
playlist_Status
(
p_playlist
);
if
(
i_status
==
PLAYLIST_STOPPED
)
{
psz_display
=
strdup
(
_
(
"Stop"
));
PL_UNLOCK
;
pl_Release
(
p_intf
);
}
else
if
(
i_status
==
PLAYLIST_PAUSED
)
PL_UNLOCK
;
pl_Release
(
p_intf
);
mtime_t
i_duration
=
input_item_GetDuration
(
p_input
);
if
(
i_duration
!=
-
1
)
{
psz_display
=
strdup
(
_
(
"Pause"
));
PL_UNLOCK
;
pl_Release
(
p_intf
);
char
psz_durationstr
[
MSTRTIME_MAX_SIZE
];
secstotimestr
(
psz_durationstr
,
i_duration
/
1000000
);
if
(
asprintf
(
&
psz_display
,
"%s (%s)"
,
p_input
->
psz_name
,
psz_durationstr
)
==
-
1
)
psz_display
=
NULL
;
}
else
{
p_item
=
playlist_CurrentPlayingItem
(
p_playlist
);
if
(
!
p_item
)
{
PL_UNLOCK
;
pl_Release
(
p_intf
);
vlc_restorecancel
(
canc
);
continue
;
}
input_item_t
*
p_input
=
p_item
->
p_input
;
vlc_gc_incref
(
p_input
);
psz_display
=
strdup
(
p_input
->
psz_name
);
PL_UNLOCK
;
pl_Release
(
p_intf
);
mtime_t
i_duration
=
input_item_GetDuration
(
p_input
);
if
(
i_duration
!=
-
1
)
{
char
psz_durationstr
[
MSTRTIME_MAX_SIZE
];
secstotimestr
(
psz_durationstr
,
i_duration
/
1000000
);
if
(
asprintf
(
&
psz_display
,
"%s (%s)"
,
p_input
->
psz_name
,
psz_durationstr
)
==
-
1
)
psz_display
=
NULL
;
}
else
psz_display
=
strdup
(
p_input
->
psz_name
);
vlc_gc_decref
(
p_input
);
}
/* Display */
xosd_display
(
p_intf
->
p_sys
->
p_osd
,
0
,
/* first line */
XOSD_string
,
psz_display
);
vlc_gc_decref
(
p_input
);
}
vlc_restorecancel
(
canc
);
msleep
(
INTF_IDLE_SLEEP
);
/* Display */
xosd_display
(
p_intf
->
p_sys
->
p_osd
,
0
,
/* first line */
XOSD_string
,
psz_display
);
}
}
static
int
PlaylistNext
(
vlc_object_t
*
p_this
,
const
char
*
psz_variable
,
vlc_value_t
oval
,
vlc_value_t
nval
,
void
*
param
)
{
(
void
)
p_this
;
(
void
)
psz_variable
;
(
void
)
oval
;
(
void
)
nval
;
intf_thread_t
*
p_intf
=
(
intf_thread_t
*
)
param
;
// Send the signal using the condition variable
vlc_mutex_lock
(
&
p_intf
->
p_sys
->
lock
);
p_intf
->
p_sys
->
b_need_update
=
true
;
vlc_cond_signal
(
&
p_intf
->
p_sys
->
cond
);
vlc_mutex_unlock
(
&
p_intf
->
p_sys
->
lock
);
return
VLC_SUCCESS
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment