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
d29ead01
Commit
d29ead01
authored
Aug 25, 2009
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split out aout_mixer_t from aout_instance_t.
It will allow to sanetize aout_instance_t.
parent
8d6e134e
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
245 additions
and
117 deletions
+245
-117
include/vlc_aout.h
include/vlc_aout.h
+10
-24
include/vlc_aout_mixer.h
include/vlc_aout_mixer.h
+104
-0
src/Makefile.am
src/Makefile.am
+1
-0
src/audio_output/common.c
src/audio_output/common.c
+6
-3
src/audio_output/dec.c
src/audio_output/dec.c
+4
-4
src/audio_output/input.c
src/audio_output/input.c
+27
-28
src/audio_output/intf.c
src/audio_output/intf.c
+5
-4
src/audio_output/mixer.c
src/audio_output/mixer.c
+75
-40
src/audio_output/output.c
src/audio_output/output.c
+13
-14
No files found.
include/vlc_aout.h
View file @
d29ead01
...
...
@@ -174,25 +174,6 @@ typedef struct aout_alloc_t
#define AOUT_ALLOC_STACK 1
#define AOUT_ALLOC_HEAP 2
/** audio output mixer */
typedef
struct
aout_mixer_t
{
audio_sample_format_t
mixer
;
aout_alloc_t
output_alloc
;
module_t
*
p_module
;
struct
aout_mixer_sys_t
*
p_sys
;
void
(
*
pf_do_work
)(
struct
aout_instance_t
*
,
struct
aout_buffer_t
*
);
/** If b_error == 1, there is no mixer. */
bool
b_error
;
/** Multiplier used to raise or lower the volume of the sound in
* software. Beware, this creates sound distortion and should be avoided
* as much as possible. This isn't available for non-float32 mixer. */
float
f_multiplier
;
}
aout_mixer_t
;
/** audio output buffer FIFO */
struct
aout_fifo_t
{
...
...
@@ -201,6 +182,9 @@ struct aout_fifo_t
date_t
end_date
;
};
/* FIXME to remove once aout.h is cleaned a bit more */
#include <vlc_aout_mixer.h>
/* */
typedef
struct
{
...
...
@@ -266,12 +250,8 @@ struct aout_input_t
mtime_t
i_resamp_start_date
;
int
i_resamp_start_drift
;
aout_fifo_t
fifo
;
/* Mixer information */
uint8_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. */
bool
b_restart
;
...
...
@@ -295,6 +275,9 @@ struct aout_input_t
/* */
bool
b_recycle_vout
;
aout_request_vout_t
request_vout
;
/* */
aout_mixer_input_t
mixer
;
};
/** an output stream for the audio output */
...
...
@@ -351,7 +334,10 @@ struct aout_instance_t
int
i_nb_inputs
;
/* Mixer */
aout_mixer_t
mixer
;
audio_sample_format_t
mixer_format
;
aout_alloc_t
mixer_allocation
;
float
mixer_multiplier
;
aout_mixer_t
*
p_mixer
;
/* Output plug-in */
aout_output_t
output
;
...
...
include/vlc_aout_mixer.h
0 → 100644
View file @
d29ead01
/*****************************************************************************
* vlc_aout_mixer.h : audio output mixer interface
*****************************************************************************
* Copyright (C) 2002-2009 the VideoLAN team
* $Id$
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
* Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef VLC_AOUT_MIXER_H
#define VLC_AOUT_MIXER_H 1
/**
* \file
* This file defines functions, structures and macros for audio output mixer object
*/
#ifdef __cplusplus
extern
"C"
{
#endif
//#include <vlc_aout.h>
/* */
typedef
struct
aout_mixer_sys_t
aout_mixer_sys_t
;
typedef
struct
aout_mixer_t
aout_mixer_t
;
typedef
struct
{
/* Is the input to be ignored while mixing */
bool
is_invalid
;
/* */
aout_fifo_t
fifo
;
/* Pointer on the first byte of data to mix.
*
* It points in the first buffer of fifo
*/
uint8_t
*
begin
;
/* Software multiplier */
float
multiplier
;
}
aout_mixer_input_t
;
/**
* audio output mixer
*/
struct
aout_mixer_t
{
VLC_COMMON_MEMBERS
/* Module */
module_t
*
module
;
/* Mixer format.
*
* You cannot modify it.
*/
audio_sample_format_t
fmt
;
/* Mixer output buffer allocation method.
*
* You can override it in the open function only.
*/
aout_alloc_t
allocation
;
/* Multiplier used to raise or lower the volume of the sound in
* software.
*/
float
multiplier
;
/* Array of mixer inputs */
unsigned
input_count
;
aout_mixer_input_t
**
input
;
/* Mix input into the given buffer (mandatory) */
void
(
*
mix
)(
aout_mixer_t
*
,
struct
aout_buffer_t
*
);
/* Private place holder for the aout_mixer_t module (optional)
*
* A module is free to use it as it wishes.
*/
aout_mixer_sys_t
*
sys
;
};
#ifdef __cplusplus
}
#endif
#endif
src/Makefile.am
View file @
d29ead01
...
...
@@ -46,6 +46,7 @@ pluginsinclude_HEADERS = \
../include/vlc_access.h
\
../include/vlc_acl.h
\
../include/vlc_aout.h
\
../include/vlc_aout_mixer.h
\
../include/vlc_arrays.h
\
../include/vlc_avcodec.h
\
../include/vlc_bits.h
\
...
...
src/audio_output/common.c
View file @
d29ead01
...
...
@@ -43,6 +43,9 @@
static
inline
void
aout_assert_fifo_locked
(
aout_instance_t
*
p_aout
,
aout_fifo_t
*
p_fifo
)
{
#ifndef NDEBUG
if
(
!
p_aout
)
return
;
if
(
p_fifo
==
&
p_aout
->
output
.
fifo
)
vlc_assert_locked
(
&
p_aout
->
output_fifo_lock
);
else
...
...
@@ -50,7 +53,7 @@ static inline void aout_assert_fifo_locked( aout_instance_t * p_aout, aout_fifo_
int
i
;
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
{
if
(
p_fifo
==
&
p_aout
->
pp_inputs
[
i
]
->
fifo
)
if
(
p_fifo
==
&
p_aout
->
pp_inputs
[
i
]
->
mixer
.
fifo
)
{
vlc_assert_locked
(
&
p_aout
->
input_fifos_lock
);
break
;
...
...
@@ -88,8 +91,8 @@ aout_instance_t * __aout_New( vlc_object_t * p_parent )
vlc_mutex_init
(
&
p_aout
->
mixer_lock
);
vlc_mutex_init
(
&
p_aout
->
output_fifo_lock
);
p_aout
->
i_nb_inputs
=
0
;
p_aout
->
mixer
.
f
_multiplier
=
1
.
0
;
p_aout
->
mixer
.
b_error
=
1
;
p_aout
->
mixer_multiplier
=
1
.
0
;
p_aout
->
p_mixer
=
NULL
;
p_aout
->
output
.
b_error
=
1
;
p_aout
->
output
.
b_starving
=
1
;
...
...
src/audio_output/dec.c
View file @
d29ead01
...
...
@@ -112,7 +112,7 @@ static aout_input_t * DecNew( aout_instance_t * p_aout,
p_aout
->
pp_inputs
[
p_aout
->
i_nb_inputs
]
=
p_input
;
p_aout
->
i_nb_inputs
++
;
if
(
p_aout
->
mixer
.
b_erro
r
)
if
(
!
p_aout
->
p_mixe
r
)
{
int
i
;
...
...
@@ -379,7 +379,7 @@ void aout_DecChangePause( aout_instance_t *p_aout, aout_input_t *p_input, bool b
if
(
i_duration
!=
0
)
{
aout_lock_mixer
(
p_aout
);
for
(
aout_buffer_t
*
p
=
p_input
->
fifo
.
p_first
;
p
!=
NULL
;
p
=
p
->
p_next
)
for
(
aout_buffer_t
*
p
=
p_input
->
mixer
.
fifo
.
p_first
;
p
!=
NULL
;
p
=
p
->
p_next
)
{
p
->
start_date
+=
i_duration
;
p
->
end_date
+=
i_duration
;
...
...
@@ -392,8 +392,8 @@ void aout_DecFlush( aout_instance_t *p_aout, aout_input_t *p_input )
{
aout_lock_input_fifos
(
p_aout
);
aout_FifoSet
(
p_aout
,
&
p_input
->
fifo
,
0
);
p_input
->
p_first_byte_to_mix
=
NULL
;
aout_FifoSet
(
p_aout
,
&
p_input
->
mixer
.
fifo
,
0
);
p_input
->
mixer
.
begin
=
NULL
;
aout_unlock_input_fifos
(
p_aout
);
}
...
...
src/audio_output/input.c
View file @
d29ead01
...
...
@@ -83,8 +83,8 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_
p_input
->
i_nb_resamplers
=
p_input
->
i_nb_filters
=
0
;
/* Prepare FIFO. */
aout_FifoInit
(
p_aout
,
&
p_input
->
fifo
,
p_aout
->
mixer
.
mixer
.
i_rate
);
p_input
->
p_first_byte_to_mix
=
NULL
;
aout_FifoInit
(
p_aout
,
&
p_input
->
mixer
.
fifo
,
p_aout
->
p_mixer
->
fmt
.
i_rate
);
p_input
->
mixer
.
begin
=
NULL
;
/* */
if
(
p_request_vout
)
...
...
@@ -98,10 +98,8 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_
}
/* Prepare format structure */
memcpy
(
&
chain_input_format
,
&
p_input
->
input
,
sizeof
(
audio_sample_format_t
)
);
memcpy
(
&
chain_output_format
,
&
p_aout
->
mixer
.
mixer
,
sizeof
(
audio_sample_format_t
)
);
chain_input_format
=
p_input
->
input
;
chain_output_format
=
p_aout
->
p_mixer
->
fmt
;
chain_output_format
.
i_rate
=
p_input
->
input
.
i_rate
;
aout_FormatPrepare
(
&
chain_output_format
);
...
...
@@ -419,12 +417,12 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_
p_input
->
input_alloc
.
i_bytes_per_sec
=
-
1
;
/* Create resamplers. */
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
mixer
.
mixer
)
)
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
p_mixer
->
fmt
)
)
{
chain_output_format
.
i_rate
=
(
__MAX
(
p_input
->
input
.
i_rate
,
p_aout
->
mixer
.
mixer
.
i_rate
)
p_aout
->
p_mixer
->
fmt
.
i_rate
)
*
(
100
+
AOUT_MAX_RESAMPLING
))
/
100
;
if
(
chain_output_format
.
i_rate
==
p_aout
->
mixer
.
mixer
.
i_rate
)
if
(
chain_output_format
.
i_rate
==
p_aout
->
p_mixer
->
fmt
.
i_rate
)
{
/* Just in case... */
chain_output_format
.
i_rate
++
;
...
...
@@ -432,7 +430,7 @@ int aout_InputNew( aout_instance_t * p_aout, aout_input_t * p_input, const aout_
if
(
aout_FiltersCreatePipeline
(
p_aout
,
p_input
->
pp_resamplers
,
&
p_input
->
i_nb_resamplers
,
&
chain_output_format
,
&
p_aout
->
mixer
.
mixer
)
<
0
)
&
p_aout
->
p_mixer
->
fmt
)
<
0
)
{
inputFailure
(
p_aout
,
p_input
,
"couldn't set a resampler pipeline"
);
return
-
1
;
...
...
@@ -500,7 +498,7 @@ int aout_InputDelete( aout_instance_t * p_aout, aout_input_t * p_input )
aout_FiltersDestroyPipeline
(
p_aout
,
p_input
->
pp_resamplers
,
p_input
->
i_nb_resamplers
);
p_input
->
i_nb_resamplers
=
0
;
aout_FifoDestroy
(
p_aout
,
&
p_input
->
fifo
);
aout_FifoDestroy
(
p_aout
,
&
p_input
->
mixer
.
fifo
);
return
0
;
}
...
...
@@ -530,18 +528,18 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
/* A little trick to avoid loosing our input fifo and properties */
p_first_byte_to_mix
=
p_input
->
p_first_byte_to_mix
;
fifo
=
p_input
->
fifo
;
p_first_byte_to_mix
=
p_input
->
mixer
.
begin
;
fifo
=
p_input
->
mixer
.
fifo
;
b_paused
=
p_input
->
b_paused
;
i_pause_date
=
p_input
->
i_pause_date
;
aout_FifoInit
(
p_aout
,
&
p_input
->
fifo
,
p_aout
->
mixer
.
mixer
.
i_rate
);
aout_FifoInit
(
p_aout
,
&
p_input
->
mixer
.
fifo
,
p_aout
->
p_mixer
->
fmt
.
i_rate
);
aout_InputDelete
(
p_aout
,
p_input
);
aout_InputNew
(
p_aout
,
p_input
,
&
p_input
->
request_vout
);
p_input
->
p_first_byte_to_mix
=
p_first_byte_to_mix
;
p_input
->
fifo
=
fifo
;
p_input
->
mixer
.
begin
=
p_first_byte_to_mix
;
p_input
->
mixer
.
fifo
=
fifo
;
p_input
->
b_paused
=
b_paused
;
p_input
->
i_pause_date
=
i_pause_date
;
...
...
@@ -591,7 +589,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
* this. We'll deal with that when pushing the buffer, and compensate
* with the next incoming buffer. */
aout_lock_input_fifos
(
p_aout
);
start_date
=
aout_FifoNextStart
(
p_aout
,
&
p_input
->
fifo
);
start_date
=
aout_FifoNextStart
(
p_aout
,
&
p_input
->
mixer
.
fifo
);
aout_unlock_input_fifos
(
p_aout
);
if
(
start_date
!=
0
&&
start_date
<
mdate
()
)
...
...
@@ -602,8 +600,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
msg_Warn
(
p_aout
,
"computed PTS is out of range (%"
PRId64
"), "
"clearing out"
,
mdate
()
-
start_date
);
aout_lock_input_fifos
(
p_aout
);
aout_FifoSet
(
p_aout
,
&
p_input
->
fifo
,
0
);
p_input
->
p_first_byte_to_mix
=
NULL
;
aout_FifoSet
(
p_aout
,
&
p_input
->
mixer
.
fifo
,
0
);
p_input
->
mixer
.
begin
=
NULL
;
aout_unlock_input_fifos
(
p_aout
);
if
(
p_input
->
i_resampling_type
!=
AOUT_RESAMPLING_NONE
)
msg_Warn
(
p_aout
,
"timing screwed, stopping resampling"
);
...
...
@@ -632,8 +630,8 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
msg_Warn
(
p_aout
,
"audio drift is too big (%"
PRId64
"), clearing out"
,
start_date
-
p_buffer
->
start_date
);
aout_lock_input_fifos
(
p_aout
);
aout_FifoSet
(
p_aout
,
&
p_input
->
fifo
,
0
);
p_input
->
p_first_byte_to_mix
=
NULL
;
aout_FifoSet
(
p_aout
,
&
p_input
->
mixer
.
fifo
,
0
);
p_input
->
mixer
.
begin
=
NULL
;
aout_unlock_input_fifos
(
p_aout
);
if
(
p_input
->
i_resampling_type
!=
AOUT_RESAMPLING_NONE
)
msg_Warn
(
p_aout
,
"timing screwed, stopping resampling"
);
...
...
@@ -760,7 +758,7 @@ int aout_InputPlay( aout_instance_t * p_aout, aout_input_t * p_input,
p_buffer
->
start_date
=
start_date
;
aout_lock_input_fifos
(
p_aout
);
aout_FifoPush
(
p_aout
,
&
p_input
->
fifo
,
p_buffer
);
aout_FifoPush
(
p_aout
,
&
p_input
->
mixer
.
fifo
,
p_buffer
);
aout_unlock_input_fifos
(
p_aout
);
return
0
;
}
...
...
@@ -780,7 +778,7 @@ static void inputFailure( aout_instance_t * p_aout, aout_input_t * p_input,
p_input
->
i_nb_filters
);
aout_FiltersDestroyPipeline
(
p_aout
,
p_input
->
pp_resamplers
,
p_input
->
i_nb_resamplers
);
aout_FifoDestroy
(
p_aout
,
&
p_input
->
fifo
);
aout_FifoDestroy
(
p_aout
,
&
p_input
->
mixer
.
fifo
);
var_Destroy
(
p_aout
,
"visual"
);
var_Destroy
(
p_aout
,
"equalizer"
);
var_Destroy
(
p_aout
,
"audio-filter"
);
...
...
@@ -934,7 +932,8 @@ static int ReplayGainCallback( vlc_object_t *p_this, char const *psz_cmd,
ReplayGainSelect
(
p_aout
,
p_aout
->
pp_inputs
[
i
]
);
/* Restart the mixer (a trivial mixer may be in use) */
aout_MixerMultiplierSet
(
p_aout
,
p_aout
->
mixer
.
f_multiplier
);
if
(
p_aout
->
p_mixer
)
aout_MixerMultiplierSet
(
p_aout
,
p_aout
->
mixer_multiplier
);
aout_unlock_mixer
(
p_aout
);
return
VLC_SUCCESS
;
...
...
@@ -948,7 +947,7 @@ static void ReplayGainSelect( aout_instance_t *p_aout, aout_input_t *p_input )
int
i_use
;
float
f_gain
;
p_input
->
f_
multiplier
=
1
.
0
;
p_input
->
mixer
.
multiplier
=
1
.
0
;
if
(
!
psz_replay_gain
)
return
;
...
...
@@ -979,14 +978,14 @@ static void ReplayGainSelect( aout_instance_t *p_aout, aout_input_t *p_input )
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
);
p_input
->
mixer
.
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
->
replay_gain
.
pf_peak
[
i_use
]
*
p_input
->
mixer
.
multiplier
>
1
.
0
)
{
p_input
->
f_
multiplier
=
1
.
0
f
/
p_input
->
replay_gain
.
pf_peak
[
i_use
];
p_input
->
mixer
.
multiplier
=
1
.
0
f
/
p_input
->
replay_gain
.
pf_peak
[
i_use
];
}
free
(
psz_replay_gain
);
...
...
src/audio_output/intf.c
View file @
d29ead01
...
...
@@ -79,7 +79,7 @@ int __aout_VolumeGet( vlc_object_t * p_object, audio_volume_t * pi_volume )
}
aout_lock_mixer
(
p_aout
);
if
(
!
p_aout
->
mixer
.
b_erro
r
)
if
(
p_aout
->
p_mixe
r
)
{
i_result
=
p_aout
->
output
.
pf_volume_get
(
p_aout
,
pi_volume
);
}
...
...
@@ -110,11 +110,12 @@ int __aout_VolumeSet( vlc_object_t * p_object, audio_volume_t i_volume )
return
VLC_SUCCESS
;
int
i_result
=
VLC_SUCCESS
;
aout_lock_mixer
(
p_aout
);
if
(
!
p_aout
->
mixer
.
b_error
)
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
);
...
...
src/audio_output/mixer.c
View file @
d29ead01
...
...
@@ -27,9 +27,11 @@
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <assert.h>
#include <stddef.h>
#include <vlc_common.h>
#include <libvlc.h>
#ifdef HAVE_ALLOCA_H
# include <alloca.h>
...
...
@@ -43,14 +45,38 @@
*****************************************************************************/
int
aout_MixerNew
(
aout_instance_t
*
p_aout
)
{
p_aout
->
mixer
.
p_module
=
module_need
(
p_aout
,
"audio mixer"
,
NULL
,
false
);
if
(
p_aout
->
mixer
.
p_module
==
NULL
)
assert
(
!
p_aout
->
p_mixer
);
vlc_assert_locked
(
&
p_aout
->
input_fifos_lock
);
aout_mixer_t
*
p_mixer
=
vlc_object_create
(
p_aout
,
sizeof
(
*
p_mixer
)
);
if
(
!
p_mixer
)
return
VLC_EGENERIC
;
p_mixer
->
fmt
=
p_aout
->
mixer_format
;
p_mixer
->
allocation
=
p_aout
->
mixer_allocation
;
p_mixer
->
multiplier
=
p_aout
->
mixer_multiplier
;
p_mixer
->
input_count
=
p_aout
->
i_nb_inputs
;
p_mixer
->
input
=
calloc
(
p_mixer
->
input_count
,
sizeof
(
*
p_mixer
->
input
)
);
for
(
int
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
p_mixer
->
input
[
i
]
=
&
p_aout
->
pp_inputs
[
i
]
->
mixer
;
p_mixer
->
mix
=
NULL
;
p_mixer
->
sys
=
NULL
;
vlc_object_attach
(
p_mixer
,
p_aout
);
p_mixer
->
module
=
module_need
(
p_mixer
,
"audio mixer"
,
NULL
,
false
);
if
(
!
p_mixer
->
module
)
{
msg_Err
(
p_aout
,
"no suitable audio mixer"
);
return
-
1
;
vlc_object_detach
(
p_mixer
);
free
(
p_mixer
->
input
);
vlc_object_release
(
p_mixer
);
return
VLC_EGENERIC
;
}
p_aout
->
mixer
.
b_error
=
0
;
return
0
;
/* */
p_aout
->
p_mixer
=
p_mixer
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
...
...
@@ -60,9 +86,17 @@ int aout_MixerNew( aout_instance_t * p_aout )
*****************************************************************************/
void
aout_MixerDelete
(
aout_instance_t
*
p_aout
)
{
if
(
p_aout
->
mixer
.
b_error
)
return
;
module_unneed
(
p_aout
,
p_aout
->
mixer
.
p_module
);
p_aout
->
mixer
.
b_error
=
1
;
if
(
!
p_aout
->
p_mixer
)
return
;
vlc_object_detach
(
p_aout
->
p_mixer
);
module_unneed
(
p_aout
->
p_mixer
,
p_aout
->
p_mixer
->
module
);
vlc_object_release
(
p_aout
->
p_mixer
);
/* */
p_aout
->
p_mixer
=
NULL
;
}
/*****************************************************************************
...
...
@@ -77,14 +111,14 @@ static int MixBuffer( aout_instance_t * p_aout )
mtime_t
start_date
,
end_date
;
date_t
exact_start_date
;
if
(
p_aout
->
mixer
.
b_erro
r
)
if
(
!
p_aout
->
p_mixe
r
)
{
/* Free all incoming buffers. */
aout_lock_input_fifos
(
p_aout
);
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
{
aout_input_t
*
p_input
=
p_aout
->
pp_inputs
[
i
];
aout_buffer_t
*
p_buffer
=
p_input
->
fifo
.
p_first
;
aout_buffer_t
*
p_buffer
=
p_input
->
mixer
.
fifo
.
p_first
;
if
(
p_input
->
b_error
)
continue
;
while
(
p_buffer
!=
NULL
)
{
...
...
@@ -127,7 +161,7 @@ static int MixBuffer( aout_instance_t * p_aout )
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
{
aout_input_t
*
p_input
=
p_aout
->
pp_inputs
[
i
];
aout_fifo_t
*
p_fifo
=
&
p_input
->
fifo
;
aout_fifo_t
*
p_fifo
=
&
p_input
->
mixer
.
fifo
;
aout_buffer_t
*
p_buffer
;
if
(
p_input
->
b_error
||
p_input
->
b_paused
)
...
...
@@ -141,7 +175,7 @@ static int MixBuffer( aout_instance_t * p_aout )
p_buffer
=
aout_FifoPop
(
p_aout
,
p_fifo
);
aout_BufferFree
(
p_buffer
);
p_buffer
=
p_fifo
->
p_first
;
p_input
->
p_first_byte_to_mix
=
NULL
;
p_input
->
mixer
.
begin
=
NULL
;
}
if
(
p_buffer
==
NULL
)
...
...
@@ -171,12 +205,13 @@ static int MixBuffer( aout_instance_t * p_aout )
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
{
aout_input_t
*
p_input
=
p_aout
->
pp_inputs
[
i
];
aout_fifo_t
*
p_fifo
=
&
p_input
->
fifo
;
aout_fifo_t
*
p_fifo
=
&
p_input
->
mixer
.
fifo
;
aout_buffer_t
*
p_buffer
;
mtime_t
prev_date
;
bool
b_drop_buffers
;
if
(
p_input
->
b_error
||
p_input
->
b_paused
)
p_input
->
mixer
.
is_invalid
=
p_input
->
b_error
||
p_input
->
b_paused
;
if
(
p_input
->
mixer
.
is_invalid
)
{
if
(
i_first_input
==
i
)
i_first_input
++
;
continue
;
...
...
@@ -198,7 +233,7 @@ static int MixBuffer( aout_instance_t * p_aout )
start_date
-
p_buffer
->
end_date
);
aout_BufferFree
(
p_buffer
);
p_fifo
->
p_first
=
p_buffer
=
p_next
;
p_input
->
p_first_byte_to_mix
=
NULL
;
p_input
->
mixer
.
begin
=
NULL
;
}
if
(
p_buffer
==
NULL
)
{
...
...
@@ -246,34 +281,34 @@ static int MixBuffer( aout_instance_t * p_aout )
if
(
p_buffer
==
NULL
)
break
;
p_buffer
=
p_fifo
->
p_first
;
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
mixer
.
mixer
)
)
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
p_mixer
->
fmt
)
)
{
/* Additionally check that p_first_byte_to_mix is well
* located. */
mtime_t
i_nb_bytes
=
(
start_date
-
p_buffer
->
start_date
)
*
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
*
p_aout
->
mixer
.
mixer
.
i_rate
/
p_aout
->
mixer
.
mixer
.
i_frame_length
*
p_aout
->
p_mixer
->
fmt
.
i_bytes_per_frame
*
p_aout
->
p_mixer
->
fmt
.
i_rate
/
p_aout
->
p_mixer
->
fmt
.
i_frame_length
/
1000000
;
ptrdiff_t
mixer_nb_bytes
;
if
(
p_input
->
p_first_byte_to_mix
==
NULL
)
if
(
p_input
->
mixer
.
begin
==
NULL
)
{
p_input
->
p_first_byte_to_mix
=
p_buffer
->
p_buffer
;
p_input
->
mixer
.
begin
=
p_buffer
->
p_buffer
;
}
mixer_nb_bytes
=
p_input
->
p_first_byte_to_mix
-
p_buffer
->
p_buffer
;
mixer_nb_bytes
=
p_input
->
mixer
.
begin
-
p_buffer
->
p_buffer
;
if
(
!
((
i_nb_bytes
+
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
if
(
!
((
i_nb_bytes
+
p_aout
->
p_mixer
->
fmt
.
i_bytes_per_frame
>
mixer_nb_bytes
)
&&
(
i_nb_bytes
<
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
(
i_nb_bytes
<
p_aout
->
p_mixer
->
fmt
.
i_bytes_per_frame
+
mixer_nb_bytes
))
)
{
msg_Warn
(
p_aout
,
"mixer start isn't output start (%"
PRId64
")"
,
i_nb_bytes
-
mixer_nb_bytes
);
/* Round to the nearest multiple */
i_nb_bytes
/=
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
;
i_nb_bytes
*=
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
;
i_nb_bytes
/=
p_aout
->
p_mixer
->
fmt
.
i_bytes_per_frame
;
i_nb_bytes
*=
p_aout
->
p_mixer
->
fmt
.
i_bytes_per_frame
;
if
(
i_nb_bytes
<
0
)
{
/* Is it really the best way to do it ? */
...
...
@@ -284,7 +319,7 @@ static int MixBuffer( aout_instance_t * p_aout )
break
;
}
p_input
->
p_first_byte_to_mix
=
p_buffer
->
p_buffer
+
i_nb_bytes
;
p_input
->
mixer
.
begin
=
p_buffer
->
p_buffer
+
i_nb_bytes
;
}
}
}
...
...
@@ -297,12 +332,12 @@ static int MixBuffer( aout_instance_t * p_aout )
}
/* Run the mixer. */
aout_BufferAlloc
(
&
p_aout
->
mixer
.
output_alloc
,
aout_BufferAlloc
(
&
p_aout
->
p_mixer
->
allocation
,
((
uint64_t
)
p_aout
->
output
.
i_nb_samples
*
1000000
)
/
p_aout
->
output
.
output
.
i_rate
,
/* This is a bit kludgy, but is actually only used
* for the S/PDIF dummy mixer : */
p_aout
->
pp_inputs
[
i_first_input
]
->
fifo
.
p_first
,
p_aout
->
pp_inputs
[
i_first_input
]
->
mixer
.
fifo
.
p_first
,
p_output_buffer
);
if
(
p_output_buffer
==
NULL
)
{
...
...
@@ -310,17 +345,17 @@ static int MixBuffer( aout_instance_t * p_aout )
return
-
1
;
}
/* This is again a bit kludgy - for the S/PDIF mixer. */
if
(
p_aout
->
mixer
.
output_alloc
.
i_alloc_type
!=
AOUT_ALLOC_NONE
)
if
(
p_aout
->
p_mixer
->
allocation
.
i_alloc_type
!=
AOUT_ALLOC_NONE
)
{
p_output_buffer
->
i_nb_samples
=
p_aout
->
output
.
i_nb_samples
;
p_output_buffer
->
i_nb_bytes
=
p_aout
->
output
.
i_nb_samples
*
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
/
p_aout
->
mixer
.
mixer
.
i_frame_length
;
*
p_aout
->
p_mixer
->
fmt
.
i_bytes_per_frame
/
p_aout
->
p_mixer
->
fmt
.
i_frame_length
;
}
p_output_buffer
->
start_date
=
start_date
;
p_output_buffer
->
end_date
=
end_date
;
p_aout
->
mixer
.
pf_do_work
(
p_aout
,
p_output_buffer
);
p_aout
->
p_mixer
->
mix
(
p_aout
->
p_mixer
,
p_output_buffer
);
aout_unlock_input_fifos
(
p_aout
);
...
...
@@ -347,20 +382,20 @@ void aout_MixerRun( aout_instance_t * p_aout )
*****************************************************************************/
int
aout_MixerMultiplierSet
(
aout_instance_t
*
p_aout
,
float
f_multiplier
)
{
float
f_old
=
p_aout
->
mixer
.
f
_multiplier
;
bool
b_new_mixer
=
0
;
float
f_old
=
p_aout
->
mixer_multiplier
;
bool
b_new_mixer
=
false
;
if
(
!
p_aout
->
mixer
.
b_erro
r
)
if
(
p_aout
->
p_mixe
r
)
{
aout_MixerDelete
(
p_aout
);
b_new_mixer
=
1
;
b_new_mixer
=
true
;
}
p_aout
->
mixer
.
f
_multiplier
=
f_multiplier
;
p_aout
->
mixer_multiplier
=
f_multiplier
;
if
(
b_new_mixer
&&
aout_MixerNew
(
p_aout
)
)
{
p_aout
->
mixer
.
f
_multiplier
=
f_old
;
p_aout
->
mixer_multiplier
=
f_old
;
aout_MixerNew
(
p_aout
);
return
-
1
;
}
...
...
@@ -376,7 +411,7 @@ int aout_MixerMultiplierSet( aout_instance_t * p_aout, float f_multiplier )
*****************************************************************************/
int
aout_MixerMultiplierGet
(
aout_instance_t
*
p_aout
,
float
*
pf_multiplier
)
{
*
pf_multiplier
=
p_aout
->
mixer
.
f
_multiplier
;
*
pf_multiplier
=
p_aout
->
mixer_multiplier
;
return
0
;
}
src/audio_output/output.c
View file @
d29ead01
...
...
@@ -170,28 +170,27 @@ int aout_OutputNew( aout_instance_t * p_aout,
aout_FormatPrint
(
p_aout
,
"output"
,
&
p_aout
->
output
.
output
);
/* Calculate the resulting mixer output format. */
memcpy
(
&
p_aout
->
mixer
.
mixer
,
&
p_aout
->
output
.
output
,
sizeof
(
audio_sample_format_t
)
);
p_aout
->
mixer_format
=
p_aout
->
output
.
output
;
if
(
!
AOUT_FMT_NON_LINEAR
(
&
p_aout
->
output
.
output
)
)
{
/* Non-S/PDIF mixer only deals with float32 or fixed32. */
p_aout
->
mixer
.
mixer
.
i_format
p_aout
->
mixer
_format
.
i_format
=
(
vlc_CPU
()
&
CPU_CAPABILITY_FPU
)
?
VLC_CODEC_FL32
:
VLC_CODEC_FI32
;
aout_FormatPrepare
(
&
p_aout
->
mixer
.
mixer
);
aout_FormatPrepare
(
&
p_aout
->
mixer
_format
);
}
else
{
p_aout
->
mixer
.
mixer
.
i_format
=
p_format
->
i_format
;
p_aout
->
mixer
_format
.
i_format
=
p_format
->
i_format
;
}
aout_FormatPrint
(
p_aout
,
"mixer"
,
&
p_aout
->
mixer
.
mixer
);
aout_FormatPrint
(
p_aout
,
"mixer"
,
&
p_aout
->
mixer
_format
);
/* Create filters. */
p_aout
->
output
.
i_nb_filters
=
0
;
if
(
aout_FiltersCreatePipeline
(
p_aout
,
p_aout
->
output
.
pp_filters
,
&
p_aout
->
output
.
i_nb_filters
,
&
p_aout
->
mixer
.
mixer
,
&
p_aout
->
mixer
_format
,
&
p_aout
->
output
.
output
)
<
0
)
{
msg_Err
(
p_aout
,
"couldn't create audio output pipeline"
);
...
...
@@ -200,15 +199,15 @@ int aout_OutputNew( aout_instance_t * p_aout,
}
/* Prepare hints for the buffer allocator. */
p_aout
->
mixer
.
output_alloc
.
i_alloc_type
=
AOUT_ALLOC_HEAP
;
p_aout
->
mixer
.
output_alloc
.
i_bytes_per_sec
=
p_aout
->
mixer
.
mixer
.
i_bytes_per_frame
*
p_aout
->
mixer
.
mixer
.
i_rate
/
p_aout
->
mixer
.
mixer
.
i_frame_length
;
p_aout
->
mixer
_allocation
.
i_alloc_type
=
AOUT_ALLOC_HEAP
;
p_aout
->
mixer
_allocation
.
i_bytes_per_sec
=
p_aout
->
mixer
_format
.
i_bytes_per_frame
*
p_aout
->
mixer
_format
.
i_rate
/
p_aout
->
mixer
_format
.
i_frame_length
;
aout_FiltersHintBuffers
(
p_aout
,
p_aout
->
output
.
pp_filters
,
p_aout
->
output
.
i_nb_filters
,
&
p_aout
->
mixer
.
output_alloc
);
&
p_aout
->
mixer
_allocation
);
p_aout
->
output
.
b_error
=
0
;
return
0
;
...
...
@@ -350,7 +349,7 @@ aout_buffer_t * aout_OutputNextBuffer( aout_instance_t * p_aout,
aout_lock_input_fifos
(
p_aout
);
for
(
i
=
0
;
i
<
p_aout
->
i_nb_inputs
;
i
++
)
{
aout_fifo_t
*
p_fifo
=
&
p_aout
->
pp_inputs
[
i
]
->
fifo
;
aout_fifo_t
*
p_fifo
=
&
p_aout
->
pp_inputs
[
i
]
->
mixer
.
fifo
;
aout_FifoMoveDates
(
p_aout
,
p_fifo
,
difference
);
}
...
...
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