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
5b24e072
Commit
5b24e072
authored
Sep 27, 2011
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
PulseAudio: negotiate digital pass-through for A/52 and DTS
parent
bdb59d19
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
71 additions
and
1 deletion
+71
-1
modules/audio_output/pulse.c
modules/audio_output/pulse.c
+71
-1
No files found.
modules/audio_output/pulse.c
View file @
5b24e072
...
@@ -648,6 +648,9 @@ static int Open(vlc_object_t *obj)
...
@@ -648,6 +648,9 @@ static int Open(vlc_object_t *obj)
/* Sample format specification */
/* Sample format specification */
struct
pa_sample_spec
ss
;
struct
pa_sample_spec
ss
;
vlc_fourcc_t
format
=
aout
->
format
.
i_format
;
vlc_fourcc_t
format
=
aout
->
format
.
i_format
;
#if PA_CHECK_VERSION(1,0,0)
pa_encoding_t
encoding
=
PA_ENCODING_INVALID
;
#endif
switch
(
format
)
switch
(
format
)
{
{
...
@@ -688,6 +691,28 @@ static int Open(vlc_object_t *obj)
...
@@ -688,6 +691,28 @@ static int Open(vlc_object_t *obj)
case
VLC_CODEC_U8
:
case
VLC_CODEC_U8
:
ss
.
format
=
PA_SAMPLE_U8
;
ss
.
format
=
PA_SAMPLE_U8
;
break
;
break
;
#if PA_CHECK_VERSION(1,0,0)
case
VLC_CODEC_A52
:
format
=
VLC_CODEC_SPDIFL
;
encoding
=
PA_ENCODING_AC3_IEC61937
;
ss
.
format
=
HAVE_FPU
?
PA_SAMPLE_FLOAT32NE
:
PA_SAMPLE_S16NE
;
break
;
/*case VLC_CODEC_EAC3:
format = VLC_CODEC_SPDIFL FIXME;
encoding = PA_ENCODING_EAC3_IEC61937;
ss.format = HAVE_FPU ? PA_SAMPLE_FLOAT32NE : PA_SAMPLE_S16NE;
break;
case VLC_CODEC_MPGA:
format = VLC_CODEC_SPDIFL FIXME;
encoding = PA_ENCODING_MPEG_IEC61937;
ss.format = HAVE_FPU ? PA_SAMPLE_FLOAT32NE : PA_SAMPLE_S16NE;
break;*/
case
VLC_CODEC_DTS
:
format
=
VLC_CODEC_SPDIFL
;
encoding
=
PA_ENCODING_DTS_IEC61937
;
ss
.
format
=
HAVE_FPU
?
PA_SAMPLE_FLOAT32NE
:
PA_SAMPLE_S16NE
;
break
;
#endif
default:
default:
if
(
HAVE_FPU
)
if
(
HAVE_FPU
)
{
{
...
@@ -802,9 +827,39 @@ static int Open(vlc_object_t *obj)
...
@@ -802,9 +827,39 @@ static int Open(vlc_object_t *obj)
sys
->
base_volume
=
PA_VOLUME_NORM
;
sys
->
base_volume
=
PA_VOLUME_NORM
;
pa_cvolume_set
(
&
sys
->
cvolume
,
ss
.
channels
,
PA_VOLUME_NORM
);
pa_cvolume_set
(
&
sys
->
cvolume
,
ss
.
channels
,
PA_VOLUME_NORM
);
vlc_pa_lock
();
#if PA_CHECK_VERSION(1,0,0)
pa_format_info
*
formatv
[
2
];
unsigned
formatc
=
0
;
/* Favor digital pass-through if available*/
if
(
encoding
!=
PA_ENCODING_INVALID
)
{
formatv
[
formatc
]
=
pa_format_info_new
();
formatv
[
formatc
]
->
encoding
=
encoding
;
pa_format_info_set_rate
(
formatv
[
formatc
],
ss
.
rate
);
pa_format_info_set_channels
(
formatv
[
formatc
],
ss
.
channels
);
formatc
++
;
}
/* Fallback to PCM */
formatv
[
formatc
]
=
pa_format_info_new
();
formatv
[
formatc
]
->
encoding
=
PA_ENCODING_PCM
;
pa_format_info_set_sample_format
(
formatv
[
formatc
],
ss
.
format
);
pa_format_info_set_rate
(
formatv
[
formatc
],
ss
.
rate
);
pa_format_info_set_channels
(
formatv
[
formatc
],
ss
.
channels
);
formatc
++
;
/* Create a playback stream */
/* Create a playback stream */
pa_stream
*
s
;
vlc_pa_lock
();
s
=
pa_stream_new_extended
(
ctx
,
"audio stream"
,
formatv
,
formatc
,
NULL
);
for
(
unsigned
i
=
0
;
i
<
formatc
;
i
++
)
pa_format_info_free
(
formatv
[
i
]);
#else
vlc_pa_lock
();
pa_stream
*
s
=
pa_stream_new
(
ctx
,
"audio stream"
,
&
ss
,
&
map
);
pa_stream
*
s
=
pa_stream_new
(
ctx
,
"audio stream"
,
&
ss
,
&
map
);
#endif
if
(
s
==
NULL
)
{
if
(
s
==
NULL
)
{
vlc_pa_error
(
obj
,
"stream creation failure"
,
ctx
);
vlc_pa_error
(
obj
,
"stream creation failure"
,
ctx
);
goto
fail
;
goto
fail
;
...
@@ -825,6 +880,21 @@ static int Open(vlc_object_t *obj)
...
@@ -825,6 +880,21 @@ static int Open(vlc_object_t *obj)
goto
fail
;
goto
fail
;
}
}
#if PA_CHECK_VERSION(1,0,0)
if
(
encoding
!=
PA_ENCODING_INVALID
)
{
const
pa_format_info
*
info
=
pa_stream_get_format_info
(
s
);
assert
(
info
!=
NULL
);
if
(
pa_format_info_is_pcm
(
info
))
{
msg_Dbg
(
aout
,
"digital pass-through not available"
);
format
=
HAVE_FPU
?
VLC_CODEC_FL32
:
VLC_CODEC_S16N
;
}
else
{
msg_Dbg
(
aout
,
"digital pass-through enabled"
);
pa_stream_set_latency_update_callback
(
s
,
NULL
,
NULL
);
}
}
#endif
const
struct
pa_buffer_attr
*
pba
=
pa_stream_get_buffer_attr
(
s
);
const
struct
pa_buffer_attr
*
pba
=
pa_stream_get_buffer_attr
(
s
);
msg_Dbg
(
aout
,
"using buffer metrics: maxlength=%u, tlength=%u, "
msg_Dbg
(
aout
,
"using buffer metrics: maxlength=%u, tlength=%u, "
"prebuf=%u, minreq=%u"
,
"prebuf=%u, minreq=%u"
,
...
...
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