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
d20dd242
Commit
d20dd242
authored
Jun 17, 2007
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added replay gain support (audio-replay-gain-mode track or album to activate
it, disabled by default)
parent
ef2723ee
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
274 additions
and
31 deletions
+274
-31
include/vlc_aout.h
include/vlc_aout.h
+2
-0
include/vlc_es.h
include/vlc_es.h
+30
-13
include/vlc_input.h
include/vlc_input.h
+41
-0
include/vlc_meta.h
include/vlc_meta.h
+5
-5
modules/audio_mixer/float32.c
modules/audio_mixer/float32.c
+14
-6
src/audio_output/aout_internal.h
src/audio_output/aout_internal.h
+2
-2
src/audio_output/dec.c
src/audio_output/dec.c
+8
-3
src/audio_output/input.c
src/audio_output/input.c
+119
-1
src/input/decoder.c
src/input/decoder.c
+19
-1
src/libvlc-module.c
src/libvlc-module.c
+34
-0
No files found.
include/vlc_aout.h
View file @
d20dd242
...
...
@@ -270,6 +270,8 @@ struct aout_input_t
/* Mixer information */
byte_t
*
p_first_byte_to_mix
;
audio_replay_gain_t
replay_gain
;
float
f_multiplier
;
/* If b_restart == 1, the input pipeline will be re-created. */
vlc_bool_t
b_restart
;
...
...
include/vlc_es.h
View file @
d20dd242
...
...
@@ -44,6 +44,25 @@ struct video_palette_t
uint8_t
palette
[
256
][
4
];
/**< 4-byte RGBA/YUVA palette */
};
/**
* audio replay gain description
*/
#define AUDIO_REPLAY_GAIN_MAX (2)
#define AUDIO_REPLAY_GAIN_TRACK (0)
#define AUDIO_REPLAY_GAIN_ALBUM (1)
typedef
struct
{
/* true if we have the peak value */
vlc_bool_t
pb_peak
[
AUDIO_REPLAY_GAIN_MAX
];
/* peak value where 1.0 means full sample value */
float
pf_peak
[
AUDIO_REPLAY_GAIN_MAX
];
/* true if we have the gain value */
vlc_bool_t
pb_gain
[
AUDIO_REPLAY_GAIN_MAX
];
/* gain value in dB */
float
pf_gain
[
AUDIO_REPLAY_GAIN_MAX
];
}
audio_replay_gain_t
;
/**
* audio format description
*/
...
...
@@ -173,7 +192,8 @@ struct es_format_t
int
i_extra_languages
;
extra_languages_t
*
p_extra_languages
;
audio_format_t
audio
;
audio_format_t
audio
;
audio_replay_gain_t
audio_replay_gain
;
video_format_t
video
;
subs_format_t
subs
;
...
...
@@ -208,6 +228,7 @@ static inline void es_format_Init( es_format_t *fmt,
fmt
->
p_extra_languages
=
NULL
;
memset
(
&
fmt
->
audio
,
0
,
sizeof
(
audio_format_t
)
);
memset
(
&
fmt
->
audio_replay_gain
,
0
,
sizeof
(
audio_replay_gain_t
)
);
memset
(
&
fmt
->
video
,
0
,
sizeof
(
video_format_t
)
);
memset
(
&
fmt
->
subs
,
0
,
sizeof
(
subs_format_t
)
);
...
...
@@ -267,34 +288,30 @@ static inline void es_format_Copy( es_format_t *dst, es_format_t *src )
static
inline
void
es_format_Clean
(
es_format_t
*
fmt
)
{
if
(
fmt
->
psz_language
)
free
(
fmt
->
psz_language
);
fmt
->
psz_language
=
NULL
;
if
(
fmt
->
psz_description
)
free
(
fmt
->
psz_description
);
fmt
->
psz_description
=
NULL
;
if
(
fmt
->
i_extra
>
0
)
free
(
fmt
->
p_extra
);
fmt
->
i_extra
=
0
;
fmt
->
p_extra
=
NULL
;
if
(
fmt
->
video
.
p_palette
)
free
(
fmt
->
video
.
p_palette
);
fmt
->
video
.
p_palette
=
NULL
;
if
(
fmt
->
subs
.
psz_encoding
)
free
(
fmt
->
subs
.
psz_encoding
);
fmt
->
subs
.
psz_encoding
=
NULL
;
if
(
fmt
->
i_extra_languages
&&
fmt
->
p_extra_languages
)
{
int
i
=
0
;
while
(
i
<
fmt
->
i_extra_languages
)
{
if
(
fmt
->
i_extra_languages
>
0
&&
fmt
->
p_extra_languages
)
{
int
i
;
for
(
i
=
0
;
i
<
fmt
->
i_extra_languages
;
i
++
)
{
if
(
fmt
->
p_extra_languages
[
i
].
psz_language
)
free
(
fmt
->
p_extra_languages
[
i
].
psz_language
);
if
(
fmt
->
p_extra_languages
[
i
].
psz_description
)
free
(
fmt
->
p_extra_languages
[
i
].
psz_description
);
i
++
;
}
free
(
fmt
->
p_extra_languages
);
}
fmt
->
i_extra_languages
=
0
;
fmt
->
p_extra_languages
=
NULL
;
/* es_format_Clean can be called multiple times */
memset
(
fmt
,
0
,
sizeof
(
*
fmt
)
);
}
#endif
include/vlc_input.h
View file @
d20dd242
...
...
@@ -195,6 +195,47 @@ VLC_EXPORT( input_item_t *, input_ItemNewWithType, ( vlc_object_t *, const char
VLC_EXPORT
(
input_item_t
*
,
input_ItemGetById
,
(
playlist_t
*
,
int
)
);
/*****************************************************************************
* Meta data helpers
*****************************************************************************/
static
inline
void
vlc_audio_replay_gain_MergeFromMeta
(
audio_replay_gain_t
*
p_dst
,
const
vlc_meta_t
*
p_meta
)
{
int
i
;
if
(
!
p_meta
)
return
;
for
(
i
=
0
;
i
<
p_meta
->
i_extra
;
i
++
)
{
const
char
*
psz_name
=
p_meta
->
ppsz_extra_name
[
i
];
const
char
*
psz_value
=
p_meta
->
ppsz_extra_value
[
i
];
if
(
!
strcasecmp
(
psz_name
,
"REPLAYGAIN_TRACK_GAIN"
)
||
!
strcasecmp
(
psz_name
,
"RG_RADIO"
)
)
{
p_dst
->
pb_gain
[
AUDIO_REPLAY_GAIN_TRACK
]
=
VLC_TRUE
;
p_dst
->
pf_gain
[
AUDIO_REPLAY_GAIN_TRACK
]
=
atof
(
psz_value
);
}
else
if
(
!
strcasecmp
(
psz_name
,
"REPLAYGAIN_TRACK_PEAK"
)
||
!
strcasecmp
(
psz_name
,
"RG_PEAK"
)
)
{
p_dst
->
pb_peak
[
AUDIO_REPLAY_GAIN_TRACK
]
=
VLC_TRUE
;
p_dst
->
pf_peak
[
AUDIO_REPLAY_GAIN_TRACK
]
=
atof
(
psz_value
);
}
else
if
(
!
strcasecmp
(
psz_name
,
"REPLAYGAIN_ALBUM_GAIN"
)
||
!
strcasecmp
(
psz_name
,
"RG_AUDIOPHILE"
)
)
{
p_dst
->
pb_gain
[
AUDIO_REPLAY_GAIN_ALBUM
]
=
VLC_TRUE
;
p_dst
->
pf_gain
[
AUDIO_REPLAY_GAIN_ALBUM
]
=
atof
(
psz_value
);
}
else
if
(
!
strcasecmp
(
psz_name
,
"REPLAYGAIN_ALBUM_PEAK"
)
)
{
p_dst
->
pb_peak
[
AUDIO_REPLAY_GAIN_ALBUM
]
=
VLC_TRUE
;
p_dst
->
pf_peak
[
AUDIO_REPLAY_GAIN_ALBUM
]
=
atof
(
psz_value
);
}
}
}
/*****************************************************************************
* Seek point: (generalisation of chapters)
*****************************************************************************/
...
...
include/vlc_meta.h
View file @
d20dd242
...
...
@@ -209,15 +209,15 @@ static inline void vlc_meta_Merge( vlc_meta_t *dst, const vlc_meta_t *src )
int
j
;
for
(
j
=
0
;
j
<
dst
->
i_extra
;
j
++
)
{
if
(
!
strcmp
(
dst
->
ppsz_extra_name
[
i
],
src
->
ppsz_extra_name
[
i
]
)
)
if
(
!
strcmp
(
dst
->
ppsz_extra_name
[
j
],
src
->
ppsz_extra_name
[
i
]
)
)
{
free
(
dst
->
ppsz_extra_value
[
i
]
);
dst
->
ppsz_extra_value
[
i
]
=
strdup
(
src
->
ppsz_extra_value
[
i
]
);
free
(
dst
->
ppsz_extra_value
[
j
]
);
dst
->
ppsz_extra_value
[
j
]
=
strdup
(
src
->
ppsz_extra_value
[
i
]
);
break
;
}
if
(
j
>=
dst
->
i_extra
)
vlc_meta_AddExtra
(
dst
,
src
->
ppsz_extra_name
[
i
],
src
->
ppsz_extra_value
[
i
]
);
}
if
(
j
>=
dst
->
i_extra
)
vlc_meta_AddExtra
(
dst
,
src
->
ppsz_extra_name
[
i
],
src
->
ppsz_extra_value
[
i
]
);
}
}
...
...
modules/audio_mixer/float32.c
View file @
d20dd242
...
...
@@ -60,14 +60,20 @@ static int Create( vlc_object_t *p_this )
return
-
1
;
}
/* Use the trivial mixer when we can */
if
(
p_aout
->
i_nb_inputs
==
1
&&
p_aout
->
mixer
.
f_multiplier
==
1
.
0
)
{
/* Tell the trivial mixer to go for it. */
return
-
1
;
int
i
;
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
{
if
(
p_aout
->
pp_inputs
[
i
]
->
f_multiplier
!=
1
.
0
)
break
;
}
if
(
i
>=
p_aout
->
i_nb_inputs
)
return
-
1
;
}
p_aout
->
mixer
.
pf_do_work
=
DoWork
;
return
0
;
}
...
...
@@ -109,15 +115,17 @@ static void MeanWords( float * p_out, const float * p_in, size_t i_nb_words,
*****************************************************************************/
static
void
DoWork
(
aout_instance_t
*
p_aout
,
aout_buffer_t
*
p_buffer
)
{
int
i_nb_inputs
=
p_aout
->
i_nb_inputs
;
float
f_multiplier
=
p_aout
->
mixer
.
f_multiplier
;
const
int
i_nb_inputs
=
p_aout
->
i_nb_inputs
;
const
float
f_multiplier_global
=
p_aout
->
mixer
.
f_multiplier
;
const
int
i_nb_channels
=
aout_FormatNbChannels
(
&
p_aout
->
mixer
.
mixer
);
int
i_input
;
int
i_nb_channels
=
aout_FormatNbChannels
(
&
p_aout
->
mixer
.
mixer
);
for
(
i_input
=
0
;
i_input
<
i_nb_inputs
;
i_input
++
)
{
int
i_nb_words
=
p_buffer
->
i_nb_samples
*
i_nb_channels
;
aout_input_t
*
p_input
=
p_aout
->
pp_inputs
[
i_input
];
float
f_multiplier
=
f_multiplier_global
*
p_input
->
f_multiplier
;
float
*
p_out
=
(
float
*
)
p_buffer
->
p_buffer
;
float
*
p_in
=
(
float
*
)
p_input
->
p_first_byte_to_mix
;
...
...
src/audio_output/aout_internal.h
View file @
d20dd242
...
...
@@ -124,8 +124,8 @@ int aout_VolumeNoneSet( aout_instance_t *, audio_volume_t );
int
aout_VolumeNoneInfos
(
aout_instance_t
*
,
audio_volume_t
*
);
/* From dec.c */
#define aout_DecNew(a, b, c
) __aout_DecNew(VLC_OBJECT(a), b, c
)
aout_input_t
*
__aout_DecNew
(
vlc_object_t
*
,
aout_instance_t
**
,
audio_sample_format_t
*
);
#define aout_DecNew(a, b, c
, d) __aout_DecNew(VLC_OBJECT(a), b, c, d
)
aout_input_t
*
__aout_DecNew
(
vlc_object_t
*
,
aout_instance_t
**
,
audio_sample_format_t
*
,
audio_replay_gain_t
*
);
int
aout_DecDelete
(
aout_instance_t
*
,
aout_input_t
*
);
aout_buffer_t
*
aout_DecNewBuffer
(
aout_instance_t
*
,
aout_input_t
*
,
size_t
);
void
aout_DecDeleteBuffer
(
aout_instance_t
*
,
aout_input_t
*
,
aout_buffer_t
*
);
...
...
src/audio_output/dec.c
View file @
d20dd242
...
...
@@ -45,7 +45,8 @@
* aout_DecNew : create a decoder
*****************************************************************************/
static
aout_input_t
*
DecNew
(
vlc_object_t
*
p_this
,
aout_instance_t
*
p_aout
,
audio_sample_format_t
*
p_format
)
audio_sample_format_t
*
p_format
,
audio_replay_gain_t
*
p_replay_gain
)
{
aout_input_t
*
p_input
;
input_thread_t
*
p_input_thread
;
...
...
@@ -82,6 +83,7 @@ static aout_input_t * DecNew( vlc_object_t * p_this, aout_instance_t * p_aout,
msg_Err
(
p_aout
,
"out of memory"
);
goto
error
;
}
memset
(
p_input
,
0
,
sizeof
(
aout_input_t
)
);
vlc_mutex_init
(
p_aout
,
&
p_input
->
lock
);
...
...
@@ -90,6 +92,8 @@ static aout_input_t * DecNew( vlc_object_t * p_this, aout_instance_t * p_aout,
aout_FormatPrepare
(
p_format
);
memcpy
(
&
p_input
->
input
,
p_format
,
sizeof
(
audio_sample_format_t
)
);
if
(
p_replay_gain
)
p_input
->
replay_gain
=
*
p_replay_gain
;
p_aout
->
pp_inputs
[
p_aout
->
i_nb_inputs
]
=
p_input
;
p_aout
->
i_nb_inputs
++
;
...
...
@@ -166,7 +170,8 @@ error:
aout_input_t
*
__aout_DecNew
(
vlc_object_t
*
p_this
,
aout_instance_t
**
pp_aout
,
audio_sample_format_t
*
p_format
)
audio_sample_format_t
*
p_format
,
audio_replay_gain_t
*
p_replay_gain
)
{
if
(
*
pp_aout
==
NULL
)
{
...
...
@@ -191,7 +196,7 @@ aout_input_t * __aout_DecNew( vlc_object_t * p_this,
}
}
return
DecNew
(
p_this
,
*
pp_aout
,
p_format
);
return
DecNew
(
p_this
,
*
pp_aout
,
p_format
,
p_replay_gain
);
}
/*****************************************************************************
...
...
src/audio_output/input.c
View file @
d20dd242
...
...
@@ -30,6 +30,7 @@
#include <stdio.h>
#include <stdlib.h>
/* calloc(), malloc(), free() */
#include <string.h>
#include <math.h>
#include <vlc_input.h>
/* for input_thread_t and i_pts_delay */
...
...
@@ -51,7 +52,9 @@ static int VisualizationCallback( vlc_object_t *, char const *,
vlc_value_t
,
vlc_value_t
,
void
*
);
static
int
EqualizerCallback
(
vlc_object_t
*
,
char
const
*
,
vlc_value_t
,
vlc_value_t
,
void
*
);
static
int
ReplayGainCallback
(
vlc_object_t
*
,
char
const
*
,
vlc_value_t
,
vlc_value_t
,
void
*
);
static
void
ReplayGainSelect
(
aout_instance_t
*
,
aout_input_t
*
);
/*****************************************************************************
* aout_InputNew : allocate a new input and rework the filter pipeline
*****************************************************************************/
...
...
@@ -162,6 +165,47 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input )
var_Change
(
p_aout
,
"audio-visual"
,
VLC_VAR_SETTEXT
,
&
text
,
NULL
);
}
if
(
var_Type
(
p_aout
,
"audio-replay-gain-mode"
)
==
0
)
{
module_config_t
*
p_config
;
int
i
;
p_config
=
config_FindConfig
(
VLC_OBJECT
(
p_aout
),
"audio-replay-gain-mode"
);
if
(
p_config
&&
p_config
->
i_list
)
{
var_Create
(
p_aout
,
"audio-replay-gain-mode"
,
VLC_VAR_STRING
|
VLC_VAR_DOINHERIT
);
text
.
psz_string
=
_
(
"Replay gain"
);
var_Change
(
p_aout
,
"audio-replay-gain-mode"
,
VLC_VAR_SETTEXT
,
&
text
,
NULL
);
for
(
i
=
0
;
i
<
p_config
->
i_list
;
i
++
)
{
val
.
psz_string
=
(
char
*
)
p_config
->
ppsz_list
[
i
];
text
.
psz_string
=
(
char
*
)
p_config
->
ppsz_list_text
[
i
];
var_Change
(
p_aout
,
"audio-replay-gain-mode"
,
VLC_VAR_ADDCHOICE
,
&
val
,
&
text
);
}
var_AddCallback
(
p_aout
,
"audio-replay-gain-mode"
,
ReplayGainCallback
,
NULL
);
}
}
if
(
var_Type
(
p_aout
,
"audio-replay-gain-preamp"
)
==
0
)
{
var_Create
(
p_aout
,
"audio-replay-gain-preamp"
,
VLC_VAR_FLOAT
|
VLC_VAR_DOINHERIT
);
}
if
(
var_Type
(
p_aout
,
"audio-replay-gain-default"
)
==
0
)
{
var_Create
(
p_aout
,
"audio-replay-gain-default"
,
VLC_VAR_FLOAT
|
VLC_VAR_DOINHERIT
);
}
if
(
var_Type
(
p_aout
,
"audio-replay-gain-peak-protection"
)
==
0
)
{
var_Create
(
p_aout
,
"audio-replay-gain-peak-protection"
,
VLC_VAR_BOOL
|
VLC_VAR_DOINHERIT
);
}
var_Get
(
p_aout
,
"audio-filter"
,
&
val
);
psz_filters
=
val
.
psz_string
;
var_Get
(
p_aout
,
"audio-visual"
,
&
val
);
...
...
@@ -366,6 +410,9 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input )
(
int
)(
p_input
->
input
.
i_bytes_per_frame
*
p_input
->
input
.
i_rate
/
p_input
->
input
.
i_frame_length
)
);
ReplayGainSelect
(
p_aout
,
p_input
);
/* Success */
p_input
->
b_error
=
VLC_FALSE
;
p_input
->
b_restart
=
VLC_FALSE
;
...
...
@@ -658,6 +705,11 @@ static void inputFailure( aout_instance_t * p_aout, aout_input_t * p_input,
var_Destroy
(
p_aout
,
"audio-filter"
);
var_Destroy
(
p_aout
,
"audio-visual"
);
var_Destroy
(
p_aout
,
"audio-replay-gain-mode"
);
var_Destroy
(
p_aout
,
"audio-replay-gain-default"
);
var_Destroy
(
p_aout
,
"audio-replay-gain-preamp"
);
var_Destroy
(
p_aout
,
"audio-replay-gain-peak-protection"
);
/* error flag */
p_input
->
b_error
=
1
;
}
...
...
@@ -817,3 +869,69 @@ static int EqualizerCallback( vlc_object_t *p_this, char const *psz_cmd,
return
VLC_SUCCESS
;
}
static
int
ReplayGainCallback
(
vlc_object_t
*
p_this
,
char
const
*
psz_cmd
,
vlc_value_t
oldval
,
vlc_value_t
newval
,
void
*
p_data
)
{
aout_instance_t
*
p_aout
=
(
aout_instance_t
*
)
p_this
;
int
i
;
vlc_mutex_lock
(
&
p_aout
->
mixer_lock
);
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
ReplayGainSelect
(
p_aout
,
p_aout
->
pp_inputs
[
i
]
);
vlc_mutex_unlock
(
&
p_aout
->
mixer_lock
);
return
VLC_SUCCESS
;
}
static
void
ReplayGainSelect
(
aout_instance_t
*
p_aout
,
aout_input_t
*
p_input
)
{
char
*
psz_replay_gain
=
var_GetString
(
p_aout
,
"audio-replay-gain-mode"
);
int
i_mode
;
int
i_use
;
float
f_gain
;
p_input
->
f_multiplier
=
1
.
0
;
if
(
!
psz_replay_gain
)
return
;
/* Find select mode */
if
(
!
strcmp
(
psz_replay_gain
,
"track"
)
)
i_mode
=
AUDIO_REPLAY_GAIN_TRACK
;
else
if
(
!
strcmp
(
psz_replay_gain
,
"album"
)
)
i_mode
=
AUDIO_REPLAY_GAIN_ALBUM
;
else
i_mode
=
AUDIO_REPLAY_GAIN_MAX
;
/* If the select mode is not available, prefer the other one */
i_use
=
i_mode
;
if
(
i_use
!=
AUDIO_REPLAY_GAIN_MAX
&&
!
p_input
->
replay_gain
.
pb_gain
[
i_use
]
)
{
for
(
i_use
=
0
;
i_use
<
AUDIO_REPLAY_GAIN_MAX
;
i_use
++
)
{
if
(
p_input
->
replay_gain
.
pb_gain
[
i_use
]
)
break
;
}
}
/* */
if
(
i_use
!=
AUDIO_REPLAY_GAIN_MAX
)
f_gain
=
p_input
->
replay_gain
.
pf_gain
[
i_use
]
+
var_GetFloat
(
p_aout
,
"audio-replay-gain-preamp"
);
else
if
(
i_mode
!=
AUDIO_REPLAY_GAIN_MAX
)
f_gain
=
var_GetFloat
(
p_aout
,
"audio-replay-gain-default"
);
else
f_gain
=
0
.
0
;
p_input
->
f_multiplier
=
pow
(
10
.
0
,
f_gain
/
20
.
0
);
/* */
if
(
p_input
->
replay_gain
.
pb_peak
[
i_use
]
&&
var_GetBool
(
p_aout
,
"audio-replay-gain-peak-protection"
)
&&
p_input
->
replay_gain
.
pf_peak
[
i_use
]
*
p_input
->
f_multiplier
>
1
.
0
)
{
p_input
->
f_multiplier
=
1
.
0
f
/
p_input
->
replay_gain
.
pf_peak
[
i_use
];
}
free
(
psz_replay_gain
);
}
src/input/decoder.c
View file @
d20dd242
...
...
@@ -415,6 +415,24 @@ static decoder_t * CreateDecoder( input_thread_t *p_input,
}
}
/* Copy ourself the input replay gain */
if
(
fmt
->
i_cat
==
AUDIO_ES
)
{
int
i
;
for
(
i
=
0
;
i
<
AUDIO_REPLAY_GAIN_MAX
;
i
++
)
{
if
(
!
p_dec
->
fmt_out
.
audio_replay_gain
.
pb_peak
[
i
]
)
{
p_dec
->
fmt_out
.
audio_replay_gain
.
pb_peak
[
i
]
=
fmt
->
audio_replay_gain
.
pb_peak
[
i
];
p_dec
->
fmt_out
.
audio_replay_gain
.
pf_peak
[
i
]
=
fmt
->
audio_replay_gain
.
pf_peak
[
i
];
}
if
(
!
p_dec
->
fmt_out
.
audio_replay_gain
.
pb_gain
[
i
]
)
{
p_dec
->
fmt_out
.
audio_replay_gain
.
pb_gain
[
i
]
=
fmt
->
audio_replay_gain
.
pb_gain
[
i
];
p_dec
->
fmt_out
.
audio_replay_gain
.
pf_gain
[
i
]
=
fmt
->
audio_replay_gain
.
pf_gain
[
i
];
}
}
}
return
p_dec
;
}
...
...
@@ -886,7 +904,7 @@ static aout_buffer_t *aout_new_buffer( decoder_t *p_dec, int i_samples )
}
p_sys
->
p_aout_input
=
aout_DecNew
(
p_dec
,
&
p_sys
->
p_aout
,
&
format
);
aout_DecNew
(
p_dec
,
&
p_sys
->
p_aout
,
&
format
,
&
p_dec
->
fmt_out
.
audio_replay_gain
);
if
(
p_sys
->
p_aout_input
==
NULL
)
{
msg_Err
(
p_dec
,
"failed to create audio output"
);
...
...
src/libvlc-module.c
View file @
d20dd242
...
...
@@ -220,6 +220,28 @@ static const char *ppsz_force_dolby_descriptions[] = { N_("Auto"), N_("On"), N_(
#define AUDIO_VISUAL_LONGTEXT N_( \
"This adds visualization modules (spectrum analyzer, etc.).")
#define AUDIO_REPLAY_GAIN_MODE_TEXT N_( \
"Replay gain mode" )
#define AUDIO_REPLAY_GAIN_MODE_LONGTEXT N_( \
"Select the replay gain mode" )
#define AUDIO_REPLAY_GAIN_PREAMP_TEXT N_( \
"Replay preamp" )
#define AUDIO_REPLAY_GAIN_PREAMP_LONGTEXT N_( \
"This allows you to change the default target level (89 dB) " \
"for stream with replay gain information" )
#define AUDIO_REPLAY_GAIN_DEFAULT_TEXT N_( \
"Default replay gain" )
#define AUDIO_REPLAY_GAIN_DEFAULT_LONGTEXT N_( \
"This is the gain used for stream without replay gain information" )
#define AUDIO_REPLAY_GAIN_PEAK_PROTECTION_TEXT N_( \
"Peak protection" )
#define AUDIO_REPLAY_GAIN_PEAK_PROTECTION_LONGTEXT N_( \
"Protect against sound clipping" )
static
const
char
*
ppsz_replay_gain_mode
[]
=
{
"none"
,
"track"
,
"album"
};
static
const
char
*
ppsz_replay_gain_mode_text
[]
=
{
N_
(
"None"
),
N_
(
"Track"
),
N_
(
"Album"
)
};
/*****************************************************************************
* Video
****************************************************************************/
...
...
@@ -1292,6 +1314,18 @@ vlc_module_begin();
change_integer_list
(
pi_force_dolby_values
,
ppsz_force_dolby_descriptions
,
0
);
add_integer
(
"audio-desync"
,
0
,
NULL
,
DESYNC_TEXT
,
DESYNC_LONGTEXT
,
VLC_TRUE
);
/* FIXME TODO create a subcat replay gain ? */
add_string
(
"audio-replay-gain-mode"
,
ppsz_replay_gain_mode
[
0
],
NULL
,
AUDIO_REPLAY_GAIN_MODE_TEXT
,
AUDIO_REPLAY_GAIN_MODE_LONGTEXT
,
VLC_FALSE
);
change_string_list
(
ppsz_replay_gain_mode
,
ppsz_replay_gain_mode_text
,
0
);
add_float
(
"audio-replay-gain-preamp"
,
0
.
0
,
NULL
,
AUDIO_REPLAY_GAIN_PREAMP_TEXT
,
AUDIO_REPLAY_GAIN_PREAMP_LONGTEXT
,
VLC_FALSE
);
add_float
(
"audio-replay-gain-default"
,
-
7
.
0
,
NULL
,
AUDIO_REPLAY_GAIN_DEFAULT_TEXT
,
AUDIO_REPLAY_GAIN_DEFAULT_LONGTEXT
,
VLC_FALSE
);
add_bool
(
"audio-replay-gain-peak-protection"
,
VLC_TRUE
,
NULL
,
AUDIO_REPLAY_GAIN_PEAK_PROTECTION_TEXT
,
AUDIO_REPLAY_GAIN_PEAK_PROTECTION_LONGTEXT
,
VLC_TRUE
);
set_subcategory
(
SUBCAT_AUDIO_AOUT
);
add_module
(
"aout"
,
"audio output"
,
NULL
,
NULL
,
AOUT_TEXT
,
AOUT_LONGTEXT
,
VLC_TRUE
);
...
...
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