Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
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
Commits
0b988497
Commit
0b988497
authored
Jan 09, 2010
by
Francois Cartegnie
Committed by
Rémi Denis-Courmont
Jan 10, 2010
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libvlc: Unify volume/mute change functions and add a mutex layer
Signed-off-by:
Rémi Denis-Courmont
<
remi@remlab.net
>
parent
0759676c
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
147 additions
and
71 deletions
+147
-71
include/vlc_aout.h
include/vlc_aout.h
+2
-0
src/audio_output/aout_internal.h
src/audio_output/aout_internal.h
+15
-0
src/audio_output/common.c
src/audio_output/common.c
+13
-9
src/audio_output/intf.c
src/audio_output/intf.c
+117
-62
No files found.
include/vlc_aout.h
View file @
0b988497
...
@@ -229,6 +229,8 @@ struct aout_instance_t
...
@@ -229,6 +229,8 @@ struct aout_instance_t
/* When output_fifo_lock is taken, the p_aout->output.fifo structure
/* When output_fifo_lock is taken, the p_aout->output.fifo structure
* cannot be read or written by a third-party thread. */
* cannot be read or written by a third-party thread. */
vlc_mutex_t
output_fifo_lock
;
vlc_mutex_t
output_fifo_lock
;
/* volume_vars_lock is taken */
vlc_mutex_t
volume_vars_lock
;
/* Input streams & pre-filters */
/* Input streams & pre-filters */
aout_input_t
*
pp_inputs
[
AOUT_MAX_INPUTS
];
aout_input_t
*
pp_inputs
[
AOUT_MAX_INPUTS
];
...
...
src/audio_output/aout_internal.h
View file @
0b988497
...
@@ -151,6 +151,9 @@ int aout_VolumeSoftInfos( aout_instance_t *, audio_volume_t * );
...
@@ -151,6 +151,9 @@ int aout_VolumeSoftInfos( aout_instance_t *, audio_volume_t * );
int
aout_VolumeNoneGet
(
aout_instance_t
*
,
audio_volume_t
*
);
int
aout_VolumeNoneGet
(
aout_instance_t
*
,
audio_volume_t
*
);
int
aout_VolumeNoneSet
(
aout_instance_t
*
,
audio_volume_t
);
int
aout_VolumeNoneSet
(
aout_instance_t
*
,
audio_volume_t
);
int
aout_VolumeNoneInfos
(
aout_instance_t
*
,
audio_volume_t
*
);
int
aout_VolumeNoneInfos
(
aout_instance_t
*
,
audio_volume_t
*
);
int
doVolumeChanges
(
unsigned
action
,
vlc_object_t
*
p_object
,
int
i_nb_steps
,
audio_volume_t
i_volume
,
audio_volume_t
*
i_return_volume
,
bool
b_mute
);
/* From dec.c */
/* From dec.c */
#define aout_DecNew(a, b, c, d, e) __aout_DecNew(VLC_OBJECT(a), b, c, d, e)
#define aout_DecNew(a, b, c, d, e) __aout_DecNew(VLC_OBJECT(a), b, c, d, e)
...
@@ -179,6 +182,7 @@ enum
...
@@ -179,6 +182,7 @@ enum
INPUT_LOCK
=
2
,
INPUT_LOCK
=
2
,
INPUT_FIFO_LOCK
=
4
,
INPUT_FIFO_LOCK
=
4
,
OUTPUT_FIFO_LOCK
=
8
,
OUTPUT_FIFO_LOCK
=
8
,
VOLUME_VARS_LOCK
=
16
};
};
void
aout_lock
(
unsigned
);
void
aout_lock
(
unsigned
);
...
@@ -239,6 +243,17 @@ static inline void aout_unlock_input( aout_instance_t *p_aout, aout_input_t * p_
...
@@ -239,6 +243,17 @@ static inline void aout_unlock_input( aout_instance_t *p_aout, aout_input_t * p_
vlc_mutex_unlock
(
&
p_input
->
lock
);
vlc_mutex_unlock
(
&
p_input
->
lock
);
}
}
static
inline
void
aout_lock_volume
(
aout_instance_t
*
p_aout
)
{
aout_lock
(
VOLUME_VARS_LOCK
);
vlc_mutex_lock
(
&
p_aout
->
volume_vars_lock
);
}
static
inline
void
aout_unlock_volume
(
aout_instance_t
*
p_aout
)
{
aout_unlock
(
VOLUME_VARS_LOCK
);
vlc_mutex_unlock
(
&
p_aout
->
volume_vars_lock
);
}
/* Helpers */
/* Helpers */
...
...
src/audio_output/common.c
View file @
0b988497
...
@@ -116,11 +116,12 @@ static void aout_Destructor( vlc_object_t * p_this )
...
@@ -116,11 +116,12 @@ static void aout_Destructor( vlc_object_t * p_this )
/* Lock ordering rules:
/* Lock ordering rules:
*
*
* Mixer Input IFIFO OFIFO (< Inner lock)
* Vars Mixer Input IFIFO OFIFO (< Inner lock)
* Mixer No! Yes Yes Yes
* Vars No! Yes Yes Yes Yes
* Input No! No! Yes Yes
* Mixer No! No! Yes Yes Yes
* In FIFOs No! No! No! Yes
* Input No! No! No! Yes Yes
* Out FIFOs No! No! No! No!
* In FIFOs No! No! No! No! Yes
* Out FIFOs No! No! No! No! No!
* (^ Outer lock)
* (^ Outer lock)
*/
*/
#ifdef AOUT_DEBUG
#ifdef AOUT_DEBUG
...
@@ -132,17 +133,20 @@ void aout_lock (unsigned i)
...
@@ -132,17 +133,20 @@ void aout_lock (unsigned i)
unsigned
allowed
;
unsigned
allowed
;
switch
(
i
)
switch
(
i
)
{
{
case
MIXER
_LOCK
:
case
VOLUME_VARS
_LOCK
:
allowed
=
0
;
allowed
=
0
;
break
;
break
;
case
MIXER_LOCK
:
allowed
=
VOLUME_VARS_LOCK
;
break
;
case
INPUT_LOCK
:
case
INPUT_LOCK
:
allowed
=
MIXER_LOCK
;
allowed
=
VOLUME_VARS_LOCK
|
MIXER_LOCK
;
break
;
break
;
case
INPUT_FIFO_LOCK
:
case
INPUT_FIFO_LOCK
:
allowed
=
MIXER_LOCK
|
INPUT_LOCK
;
allowed
=
VOLUME_VARS_LOCK
|
MIXER_LOCK
|
INPUT_LOCK
;
break
;
break
;
case
OUTPUT_FIFO_LOCK
:
case
OUTPUT_FIFO_LOCK
:
allowed
=
MIXER_LOCK
|
INPUT_LOCK
|
INPUT_FIFO_LOCK
;
allowed
=
VOLUME_VARS_LOCK
|
MIXER_LOCK
|
INPUT_LOCK
|
INPUT_FIFO_LOCK
;
break
;
break
;
default:
default:
abort
();
abort
();
...
...
src/audio_output/intf.c
View file @
0b988497
...
@@ -61,6 +61,110 @@
...
@@ -61,6 +61,110 @@
* a very low volume and users may complain.
* a very low volume and users may complain.
*/
*/
enum
{
SET_MUTE
=
1
,
SET_VOLUME
=
2
,
INCREMENT_VOLUME
=
4
,
TOGGLE_MUTE
=
8
};
/*****************************************************************************
* doVolumeChanges : handle all volume changes. Internal use only to ease
* variables locking.
*****************************************************************************/
int
doVolumeChanges
(
unsigned
action
,
vlc_object_t
*
p_object
,
int
i_nb_steps
,
audio_volume_t
i_volume
,
audio_volume_t
*
i_return_volume
,
bool
b_mute
)
{
int
i_result
=
VLC_SUCCESS
;
int
i_volume_step
=
1
;
bool
b_var_mute
=
false
;
aout_instance_t
*
p_aout
=
vlc_object_find
(
p_object
,
VLC_OBJECT_AOUT
,
FIND_ANYWHERE
);
if
(
p_aout
)
aout_lock_volume
(
p_aout
);
b_var_mute
=
(
bool
)
var_GetBool
(
p_object
->
p_libvlc
,
"volume-muted"
);
const
bool
b_unmute_condition
=
(
/* Also unmute on increments */
(
action
==
INCREMENT_VOLUME
)
||
/* On explicit unmute */
(
(
action
==
SET_MUTE
)
&&
(
b_var_mute
&&
!
b_mute
)
)
||
/* On toggle from muted */
(
(
action
==
TOGGLE_MUTE
)
&&
b_var_mute
)
);
const
bool
b_mute_condition
=
(
!
b_var_mute
&&
(
/* explicit */
(
(
action
==
SET_MUTE
)
&&
b_mute
)
||
/* or toggle */
(
action
==
TOGGLE_MUTE
)
));
/* On UnMute */
if
(
b_unmute_condition
)
{
/* Restore saved volume */
var_Create
(
p_object
->
p_libvlc
,
"saved-volume"
,
VLC_VAR_INTEGER
);
i_volume
=
(
audio_volume_t
)
var_GetInteger
(
p_object
->
p_libvlc
,
"saved-volume"
);
var_SetBool
(
p_object
->
p_libvlc
,
"volume-muted"
,
false
);
}
else
if
(
b_mute_condition
)
{
/* We need an initial value to backup later */
i_volume
=
config_GetInt
(
p_object
,
"volume"
);
}
if
(
action
==
INCREMENT_VOLUME
)
{
i_volume_step
=
config_GetInt
(
p_object
->
p_libvlc
,
"volume-step"
);
i_volume
=
config_GetInt
(
p_object
,
"volume"
)
+
i_volume_step
*
i_nb_steps
;
if
(
i_volume
>
AOUT_VOLUME_MAX
)
i_volume
=
AOUT_VOLUME_MAX
;
else
if
(
i_volume
<
AOUT_VOLUME_MIN
)
i_volume
=
AOUT_VOLUME_MIN
;
if
(
i_return_volume
!=
NULL
)
*
i_return_volume
=
i_volume
;
}
var_Create
(
p_object
->
p_libvlc
,
"saved-volume"
,
VLC_VAR_INTEGER
);
var_SetInteger
(
p_object
->
p_libvlc
,
"saved-volume"
,
i_volume
);
/* On Mute */
if
(
b_mute_condition
)
{
i_volume
=
AOUT_VOLUME_MIN
;
var_SetBool
(
p_object
->
p_libvlc
,
"volume-muted"
,
true
);
}
/* Commit volume changes */
config_PutInt
(
p_object
,
"volume"
,
i_volume
);
if
(
p_aout
)
{
aout_lock_mixer
(
p_aout
);
aout_lock_input_fifos
(
p_aout
);
if
(
p_aout
->
p_mixer
)
i_result
=
p_aout
->
output
.
pf_volume_set
(
p_aout
,
i_volume
);
aout_unlock_input_fifos
(
p_aout
);
aout_unlock_mixer
(
p_aout
);
}
/* trigger callbacks */
var_SetBool
(
p_object
->
p_libvlc
,
"volume-change"
,
true
);
if
(
p_aout
)
var_SetBool
(
p_aout
,
"intf-change"
,
true
);
if
(
p_aout
)
{
aout_unlock_volume
(
p_aout
);
vlc_object_release
(
p_aout
);
}
return
i_result
;
}
/*****************************************************************************
/*****************************************************************************
* aout_VolumeGet : get the volume of the output device
* aout_VolumeGet : get the volume of the output device
*****************************************************************************/
*****************************************************************************/
...
@@ -78,6 +182,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
...
@@ -78,6 +182,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
return
0
;
return
0
;
}
}
aout_lock_volume
(
p_aout
);
aout_lock_mixer
(
p_aout
);
aout_lock_mixer
(
p_aout
);
if
(
p_aout
->
p_mixer
)
if
(
p_aout
->
p_mixer
)
{
{
...
@@ -88,6 +193,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
...
@@ -88,6 +193,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
*
pi_volume
=
(
audio_volume_t
)
config_GetInt
(
p_object
,
"volume"
);
*
pi_volume
=
(
audio_volume_t
)
config_GetInt
(
p_object
,
"volume"
);
}
}
aout_unlock_mixer
(
p_aout
);
aout_unlock_mixer
(
p_aout
);
aout_unlock_volume
(
p_aout
);
vlc_object_release
(
p_aout
);
vlc_object_release
(
p_aout
);
return
i_result
;
return
i_result
;
...
@@ -98,29 +204,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
...
@@ -98,29 +204,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
*****************************************************************************/
*****************************************************************************/
int
__aout_VolumeSet
(
vlc_object_t
*
p_object
,
audio_volume_t
i_volume
)
int
__aout_VolumeSet
(
vlc_object_t
*
p_object
,
audio_volume_t
i_volume
)
{
{
config_PutInt
(
p_object
,
"volume"
,
i_volume
);
return
doVolumeChanges
(
SET_VOLUME
,
p_object
,
1
,
i_volume
,
NULL
,
true
);
var_SetBool
(
p_object
->
p_libvlc
,
"volume-change"
,
true
);
var_Create
(
p_object
->
p_libvlc
,
"saved-volume"
,
VLC_VAR_INTEGER
);
var_SetInteger
(
p_object
->
p_libvlc
,
"saved-volume"
,
i_volume
);
aout_instance_t
*
p_aout
=
vlc_object_find
(
p_object
,
VLC_OBJECT_AOUT
,
FIND_ANYWHERE
);
if
(
p_aout
==
NULL
)
return
VLC_SUCCESS
;
int
i_result
=
VLC_SUCCESS
;
aout_lock_mixer
(
p_aout
);
aout_lock_input_fifos
(
p_aout
);
if
(
p_aout
->
p_mixer
)
i_result
=
p_aout
->
output
.
pf_volume_set
(
p_aout
,
i_volume
);
aout_unlock_input_fifos
(
p_aout
);
aout_unlock_mixer
(
p_aout
);
var_SetBool
(
p_aout
,
"intf-change"
,
true
);
vlc_object_release
(
p_aout
);
return
i_result
;
}
}
/*****************************************************************************
/*****************************************************************************
...
@@ -132,19 +216,7 @@ int __aout_VolumeSet( vlc_object_t * p_object, audio_volume_t i_volume )
...
@@ -132,19 +216,7 @@ int __aout_VolumeSet( vlc_object_t * p_object, audio_volume_t i_volume )
int
__aout_VolumeUp
(
vlc_object_t
*
p_object
,
int
i_nb_steps
,
int
__aout_VolumeUp
(
vlc_object_t
*
p_object
,
int
i_nb_steps
,
audio_volume_t
*
pi_volume
)
audio_volume_t
*
pi_volume
)
{
{
aout_SetMute
(
p_object
,
pi_volume
,
false
);
return
doVolumeChanges
(
INCREMENT_VOLUME
,
p_object
,
i_nb_steps
,
0
,
pi_volume
,
true
);
const
int
i_volume_step
=
config_GetInt
(
p_object
->
p_libvlc
,
"volume-step"
);
int
i_volume
=
config_GetInt
(
p_object
,
"volume"
)
+
i_volume_step
*
i_nb_steps
;
if
(
i_volume
>
AOUT_VOLUME_MAX
)
i_volume
=
AOUT_VOLUME_MAX
;
else
if
(
i_volume
<
AOUT_VOLUME_MIN
)
i_volume
=
AOUT_VOLUME_MIN
;
if
(
pi_volume
!=
NULL
)
*
pi_volume
=
i_volume
;
return
__aout_VolumeSet
(
p_object
,
i_volume
);
}
}
/*****************************************************************************
/*****************************************************************************
...
@@ -167,7 +239,7 @@ int __aout_VolumeDown( vlc_object_t * p_object, int i_nb_steps,
...
@@ -167,7 +239,7 @@ int __aout_VolumeDown( vlc_object_t * p_object, int i_nb_steps,
*****************************************************************************/
*****************************************************************************/
int
__aout_ToggleMute
(
vlc_object_t
*
p_object
,
audio_volume_t
*
pi_volume
)
int
__aout_ToggleMute
(
vlc_object_t
*
p_object
,
audio_volume_t
*
pi_volume
)
{
{
return
aout_SetMute
(
p_object
,
pi_volume
,
!
aout_IsMuted
(
p_object
)
);
return
doVolumeChanges
(
TOGGLE_MUTE
,
p_object
,
1
,
0
,
pi_volume
,
true
);
}
}
/*****************************************************************************
/*****************************************************************************
...
@@ -175,7 +247,13 @@ int __aout_ToggleMute( vlc_object_t * p_object, audio_volume_t * pi_volume )
...
@@ -175,7 +247,13 @@ int __aout_ToggleMute( vlc_object_t * p_object, audio_volume_t * pi_volume )
*****************************************************************************/
*****************************************************************************/
bool
aout_IsMuted
(
vlc_object_t
*
p_object
)
bool
aout_IsMuted
(
vlc_object_t
*
p_object
)
{
{
return
(
bool
)
var_GetBool
(
p_object
->
p_libvlc
,
"volume-muted"
);
bool
b_return_val
;
aout_instance_t
*
p_aout
=
vlc_object_find
(
p_object
,
VLC_OBJECT_AOUT
,
FIND_ANYWHERE
);
if
(
p_aout
)
aout_lock_volume
(
p_aout
);
b_return_val
=
var_GetBool
(
p_object
->
p_libvlc
,
"volume-muted"
);
if
(
p_aout
)
aout_unlock_volume
(
p_aout
);
return
b_return_val
;
}
}
/*****************************************************************************
/*****************************************************************************
...
@@ -187,30 +265,7 @@ bool aout_IsMuted( vlc_object_t * p_object )
...
@@ -187,30 +265,7 @@ bool aout_IsMuted( vlc_object_t * p_object )
int
aout_SetMute
(
vlc_object_t
*
p_object
,
audio_volume_t
*
pi_volume
,
int
aout_SetMute
(
vlc_object_t
*
p_object
,
audio_volume_t
*
pi_volume
,
bool
b_mute
)
bool
b_mute
)
{
{
int
i_result
;
return
doVolumeChanges
(
SET_MUTE
,
p_object
,
1
,
0
,
pi_volume
,
b_mute
);
audio_volume_t
i_volume
;
var_SetBool
(
p_object
->
p_libvlc
,
"volume-muted"
,
(
bool
)
b_mute
);
i_volume
=
(
audio_volume_t
)
config_GetInt
(
p_object
,
"volume"
);
if
(
b_mute
)
{
/* Mute */
i_result
=
aout_VolumeSet
(
p_object
,
AOUT_VOLUME_MIN
);
var_Create
(
p_object
->
p_libvlc
,
"saved-volume"
,
VLC_VAR_INTEGER
);
var_SetInteger
(
p_object
->
p_libvlc
,
"saved-volume"
,
(
int
)
i_volume
);
if
(
pi_volume
!=
NULL
)
*
pi_volume
=
AOUT_VOLUME_MIN
;
}
else
{
/* Un-mute */
var_Create
(
p_object
->
p_libvlc
,
"saved-volume"
,
VLC_VAR_INTEGER
);
i_volume
=
(
audio_volume_t
)
var_GetInteger
(
p_object
->
p_libvlc
,
"saved-volume"
);
i_result
=
aout_VolumeSet
(
p_object
,
i_volume
);
if
(
pi_volume
!=
NULL
)
*
pi_volume
=
i_volume
;
}
return
i_result
;
}
}
/*
/*
...
...
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