Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-2-2
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-2-2
Commits
7dc50c98
Commit
7dc50c98
authored
Jul 27, 2011
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PulseAudio: more conservative and stable resampling
This time, it should work (famous last words).
parent
a97f3aa7
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
19 additions
and
14 deletions
+19
-14
modules/audio_output/pulse.c
modules/audio_output/pulse.c
+19
-14
No files found.
modules/audio_output/pulse.c
View file @
7dc50c98
...
...
@@ -253,34 +253,39 @@ static void stream_latency_cb(pa_stream *s, void *userdata)
//msg_Dbg(aout, "desync: %+"PRId64" us (variation: %+"PRId64" us)",
// delta, change);
const
unsigned
inrate
=
aout
->
format
.
i_rate
;
unsigned
outrate
=
sys
->
rate
;
bool
sync
=
false
;
if
(
delta
<
-
AOUT_MAX_PTS_DELAY
)
msg_Warn
(
aout
,
"too late by %"
PRId64
" us"
,
-
delta
);
else
if
(
delta
>
+
AOUT_MAX_PTS_ADVANCE
)
msg_Warn
(
aout
,
"too early by %"
PRId64
" us"
,
delta
);
else
if
(
outrate
==
inrate
)
return
;
/* In sync, do not add unnecessary disturbance! */
else
sync
=
true
;
/* Compute playback sample rate */
const
unsigned
inrate
=
aout
->
format
.
i_rate
;
int
limit
=
inrate
/
100
;
/* max varation per iteration */
#define ADJUST_FACTOR 4
/* This is empirical. Feel free to define something smarter. */
int
adj
=
sys
->
rate
*
(
delta
+
change
)
/
(
CLOCK_FREQ
*
ADJUST_FACTOR
);
/* This avoids too fast rate variation. They sound ugly as hell and they
* make the algorithm unstable (e.g. oscillation around inrate). */
int
adj
=
sync
?
(
outrate
-
inrate
)
:
outrate
*
(
delta
+
change
)
/
(
CLOCK_FREQ
<<
4
);
/* This avoids too quick rate variation. It sounds really bad and
* causes unstability (e.g. oscillation around the correct rate). */
int
limit
=
inrate
>>
10
;
/* However, to improve stability and try to converge, closing to the
* nominal rate is favored over drifting from it. */
if
((
adj
>
0
)
==
(
sys
->
rate
>
inrate
))
limit
*=
2
;
if
(
adj
>
+
limit
)
adj
=
+
limit
;
if
(
adj
<
-
limit
)
adj
=
-
limit
;
unsigned
outrate
=
sys
->
rate
-
adj
;
/* Favor native rate to avoid resampling (FIXME: really a good idea?) */
if
(
abs
(
outrate
-
inrate
)
<
limit
)
outrate
=
inrate
;
outrate
-=
adj
;
/* This keeps the effective rate within specified range
* (+/-AOUT_MAX_RESAMPLING% - see <vlc_aout.h>) of the nominal rate. */
limit
*=
AOUT_MAX_RESAMPLING
;
limit
=
inrate
*
AOUT_MAX_RESAMPLING
/
100
;
if
(
outrate
>
inrate
+
limit
)
outrate
=
inrate
+
limit
;
if
(
outrate
<
inrate
-
limit
)
...
...
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