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
9d7bb43b
Commit
9d7bb43b
authored
Nov 29, 2007
by
Richard Hosking
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
v4l2: Experimental ALSA input support. Currently non functional. Still defaults to OSS.
parent
acb49d8a
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
378 additions
and
45 deletions
+378
-45
configure.ac
configure.ac
+14
-1
modules/access/v4l2.c
modules/access/v4l2.c
+364
-44
No files found.
configure.ac
View file @
9d7bb43b
...
...
@@ -2347,7 +2347,7 @@ then
fi
dnl
dnl Video4Linux plugin
dnl Video4Linux
2
plugin
dnl
AC_ARG_ENABLE(v4l2,
[ --enable-v4l2 Video4Linux2 input support (default disabled)])
...
...
@@ -2360,6 +2360,19 @@ then
VLC_ADD_CPPFLAGS([v4l2],[-I${with_v4l2}/include])
fi
AC_CHECK_HEADER(alsa/asoundlib.h, AC_CHECK_LIB(asound, main, have_v4l2_alsa="true", have_v4l2_alsa="false"),have_v4l2_alsa="false")
if test "${have_v4l2_alsa}" = "true"
then
CFLAGS="${CFLAGS_save}"
AC_TRY_COMPILE([#define ALSA_PCM_NEW_HW_PARAMS_API
#define ALSA_PCM_NEW_SW_PARAMS_API
#include <alsa/asoundlib.h>],
[snd_pcm_hw_params_get_period_time(0,0,0);],
AC_DEFINE(HAVE_ALSA_NEW_API, 1, Define if ALSA is at least rc4))
VLC_ADD_LDFLAGS([v4l2],[-lasound -lm -ldl])
AC_DEFINE(HAVE_ALSA, 1, Define if ALSA is present.)
fi
CPPFLAGS="${CPPFLAGS_save} ${CPPFLAGS_v4l2}"
AC_CHECK_HEADERS(linux/videodev2.h, [
VLC_ADD_PLUGINS([v4l2])
...
...
modules/access/v4l2.c
View file @
9d7bb43b
...
...
@@ -25,12 +25,17 @@
/*
* Sections based on the reference V4L2 capture example at
* http://v4l2spec.bytesex.org/spec/capture-example.html
*
* ALSA support based on parts of
* http://www.equalarea.com/paul/alsa-audio.html
* and hints taken from alsa-utils (aplay/arecord)
* http://www.alsa-project.org
*/
/*
* TODO: No mjpeg support yet.
* TODO: Tuner partial implementation.
* TODO: Alsa input support
?
* TODO: Alsa input support
- experimental
*/
/*****************************************************************************
...
...
@@ -52,6 +57,12 @@
#include <sys/soundcard.h>
#ifdef HAVE_ALSA
# define ALSA_PCM_NEW_HW_PARAMS_API
# define ALSA_PCM_NEW_SW_PARAMS_API
# include <alsa/asoundlib.h>
#endif
/*****************************************************************************
* Module descriptior
*****************************************************************************/
...
...
@@ -102,6 +113,9 @@ static void Close( vlc_object_t * );
#define FPS_TEXT N_( "Framerate" )
#define FPS_LONGTEXT N_( "Framerate to capture, if applicable " \
"(-1 for autodetect)." )
#define ALSA_TEXT N_( "Use Alsa" )
#define ALSA_LONGTEXT N_( \
"Use ALSA instead of OSS for audio" )
#define STEREO_TEXT N_( "Stereo" )
#define STEREO_LONGTEXT N_( \
"Capture the audio stream in stereo." )
...
...
@@ -162,6 +176,8 @@ vlc_module_begin();
add_integer
(
"v4l2-hue"
,
-
1
,
NULL
,
HUE_TEXT
,
HUE_LONGTEXT
,
VLC_TRUE
);
add_float
(
"v4l2-fps"
,
0
,
NULL
,
FPS_TEXT
,
FPS_LONGTEXT
,
VLC_TRUE
);
add_bool
(
"v4l2-alsa"
,
VLC_FALSE
,
NULL
,
ALSA_TEXT
,
ALSA_LONGTEXT
,
VLC_TRUE
);
add_bool
(
"v4l2-stereo"
,
VLC_TRUE
,
NULL
,
STEREO_TEXT
,
STEREO_LONGTEXT
,
VLC_TRUE
);
add_integer
(
"v4l2-samplerate"
,
48000
,
NULL
,
SAMPLERATE_TEXT
,
...
...
@@ -189,6 +205,7 @@ static block_t* GrabAudio( demux_t *p_demux );
vlc_bool_t
IsPixelFormatSupported
(
demux_t
*
p_demux
,
unsigned
int
i_pixelformat
);
char
*
ResolveALSADeviceName
(
char
*
psz_device
);
static
int
OpenVideoDev
(
demux_t
*
,
char
*
psz_device
);
static
int
OpenAudioDev
(
demux_t
*
,
char
*
psz_device
);
static
vlc_bool_t
ProbeVideoDev
(
demux_t
*
,
char
*
psz_device
);
...
...
@@ -281,11 +298,19 @@ struct demux_sys_t
es_out_id_t
*p_es_video
;
/* Audio */
int
i_sample_rate
;
unsigned
int
i_sample_rate
;
vlc_bool_t
b_stereo
;
int
i_audio_max_frame_size
;
block_t
*p_block_audio
;
es_out_id_t
*p_es_audio
;
/* ALSA Audio */
vlc_bool_t
b_use_alsa
;
#ifdef HAVE_ALSA
snd_pcm_t
*p_alsa_pcm
;
int
i_alsa_frame_size
;
int
i_alsa_chunk_size
;
#endif
};
/*****************************************************************************
...
...
@@ -342,6 +367,10 @@ static int Open( vlc_object_t *p_this )
p_sys->psz_requested_chroma
=
var_CreateGetString(
p_demux,
"v4l2-chroma"
)
;
var_Create(
p_demux,
"v4l2-alsa"
,
VLC_VAR_BOOL
|
VLC_VAR_DOINHERIT
)
;
var_Get(
p_demux,
"v4l2-alsa"
,
&val
)
;
p_sys->b_use_alsa
=
val.b_bool
;
var_Create(
p_demux,
"v4l2-stereo"
,
VLC_VAR_BOOL
|
VLC_VAR_DOINHERIT
)
;
var_Get(
p_demux,
"v4l2-stereo"
,
&val
)
;
p_sys->b_stereo
=
val.b_bool
;
...
...
@@ -357,6 +386,11 @@ static int Open( vlc_object_t *p_this )
ParseMRL(
p_demux
)
;
/* Alsa support available? */
#ifdef HAVE_ALSA
msg_Dbg(
p_demux,
"ALSA input support available"
)
;
#endif
/* Find main device (video or audio) */
if(
p_sys->psz_device
&&
*p_sys->psz_device
)
{
...
...
@@ -619,6 +653,11 @@ static void ParseMRL( demux_t *p_demux )
strtol(
psz_parser
+
strlen(
"samplerate="
),
&psz_parser,
0
)
;
}
else
if(
!strncmp(
psz_parser,
"alsa"
,
strlen(
"alsa"
)
)
)
{
psz_parser
+=
strlen(
"alsa"
)
;
p_sys->b_use_alsa
=
VLC_TRUE
;
}
else
if(
!strncmp(
psz_parser,
"stereo"
,
strlen(
"stereo"
)
)
)
{
psz_parser
+=
strlen(
"stereo"
)
;
...
...
@@ -730,7 +769,16 @@ static void Close( vlc_object_t *p_this )
/* Close */
if(
p_sys->i_fd_video
>=
0
)
close(
p_sys->i_fd_video
)
;
if(
p_sys->i_fd_audio
>=
0
)
close(
p_sys->i_fd_audio
)
;
if(
p_sys->b_use_alsa
)
{
#ifdef HAVE_ALSA
if(
p_sys->p_alsa_pcm
)
snd_pcm_close(
p_sys->p_alsa_pcm
)
;
#endif
}
else
{
if(
p_sys->i_fd_audio
>=
0
)
close(
p_sys->i_fd_audio
)
;
}
if(
p_sys->p_block_audio
)
block_Release(
p_sys->p_block_audio
)
;
if(
p_sys->psz_device
)
free(
p_sys->psz_device
)
;
...
...
@@ -982,8 +1030,6 @@ static block_t* GrabAudio( demux_t *p_demux )
int
i_read,
i_correct
;
block_t
*p_block
;
/* Copied from v4l.c */
if(
p_sys->p_block_audio
)
p_block
=
p_sys->p_block_audio
;
else
p_block
=
block_New(
p_demux,
p_sys->i_audio_max_frame_size
)
;
...
...
@@ -995,8 +1041,22 @@ static block_t* GrabAudio( demux_t *p_demux )
p_sys->p_block_audio
=
p_block
;
i_read
=
read(
p_sys->i_fd_audio,
p_block->p_buffer,
p_sys->i_audio_max_frame_size
)
;
if(
p_sys->b_use_alsa
)
{
/* ALSA */
#ifdef HAVE_ALSA
i_read
=
snd_pcm_readi(
p_sys->p_alsa_pcm,
p_block->p_buffer,
p_sys->i_alsa_chunk_size
)
;
/* TODO: ALSA ERROR HANDLING?? xrun?? */
#else
i_read
=
0
;
#endif
}
else
{
/* OSS */
i_read
=
read(
p_sys->i_fd_audio,
p_block->p_buffer,
p_sys->i_audio_max_frame_size
)
;
}
if(
i_read
<=
0
)
return
0
;
...
...
@@ -1005,9 +1065,39 @@ static block_t* GrabAudio( demux_t *p_demux )
/* Correct the date because of kernel buffering */
i_correct
=
i_read
;
if(
ioctl(
p_sys->i_fd_audio,
SNDCTL_DSP_GETISPACE,
&buf_info
)
==
0
)
if(
!p_sys->b_use_alsa
)
{
i_correct
+=
buf_info.bytes
;
if(
ioctl(
p_sys->i_fd_audio,
SNDCTL_DSP_GETISPACE,
&buf_info
)
==
0
)
{
i_correct
+=
buf_info.bytes
;
}
}
else
{
#ifdef HAVE_ALSA
/* TODO: ALSA timing */
/* Very experimental code... */
int
i_err
;
snd_pcm_sframes_t
delay
=
0
;
if(
(
i_err
=
snd_pcm_delay(
p_sys->p_alsa_pcm,
&delay
)
)
>=
0
)
{
int
i_correction_delta
=
delay
*
p_sys->i_alsa_frame_size
;
/* Test for overrun */
if(
i_correction_delta>p_sys->i_audio_max_frame_size
)
{
msg_Warn(
p_demux,
"ALSA read overrun"
)
;
i_correction_delta
=
p_sys->i_audio_max_frame_size
;
snd_pcm_prepare(
p_sys->p_alsa_pcm
)
;
}
i_correct
+=
i_correction_delta
;
}
else
{
/* delay failed so reset */
msg_Warn(
p_demux,
"ALSA snd_pcm_delay failed (%s)"
,
snd_strerror(
i_err
)
)
;
snd_pcm_prepare(
p_sys->p_alsa_pcm
)
;
}
#endif
}
/* Timestamp */
...
...
@@ -1615,55 +1705,244 @@ open_failed:
}
/*****************************************************************************
* ResolveALSADeviceName: Change any . to : in the ALSA device name
*****************************************************************************/
char
*
ResolveALSADeviceName
(
char
*
psz_device
)
{
char*
psz_alsa_name
=
strdup(
psz_device
)
;
for(
unsigned
int
i
=
0
;
i
<
strlen(
psz_device
)
;
i++
)
{
if(
psz_alsa_name[i]
==
'.'
)
psz_alsa_name[i]
=
':'
;
}
return
psz_alsa_name
;
}
/*****************************************************************************
* OpenAudioDev: open and set up the audio device and probe for capabilities
*****************************************************************************/
int
OpenAudioDev
(
demux_t
*
p_demux
,
char
*
psz_device
)
{
demux_sys_t
*p_sys
=
p_demux->p_sys
;
int
i_fd,
i_format
;
int
i_fd
=
0
;
int
i_format
;
#ifdef HAVE_ALSA
p_sys->p_alsa_pcm
=
NULL
;
char*
psz_alsa_device_name
=
ResolveALSADeviceName(
psz_device
)
;
snd_pcm_hw_params_t
*p_hw_params
=
NULL
;
snd_pcm_uframes_t
buffer_size
;
snd_pcm_uframes_t
chunk_size
;
#endif
if(
(i_fd
=
open(
psz_device,
O_RDONLY
|
O_NONBLOCK
))
<
0
)
if(
p_sys->b_use_alsa
)
{
msg_Err(
p_demux,
"cannot open audio device (%m)"
)
;
goto
adev_fail
;
}
/* ALSA */
i_format
=
AFMT_S
16
_LE
;
if(
ioctl(
i_fd,
SNDCTL_DSP_SETFMT,
&i_format
)
<
0
||
i_format
!=
AFMT_S
16
_LE
)
{
msg_Err(
p_demux,
"cannot set audio format (16b little endian) "
"(%m)"
)
;
goto
adev_fail
;
}
#ifdef HAVE_ALSA
int
i_err
;
if(
ioctl(
i_fd,
SNDCTL_DSP_STEREO,
&p_sys->b_stereo
)
<
0
)
{
msg_Err(
p_demux,
"cannot set audio channels count (%m)"
)
;
goto
adev_fail
;
}
if(
(
i_err
=
snd_pcm_open(
&p_sys->p_alsa_pcm,
psz_alsa_device_name,
SND_PCM_STREAM_CAPTURE,
SND_PCM_NONBLOCK
)
)
<
0
)
{
msg_Err(
p_demux,
"Cannot open ALSA audio device %s (%s)"
,
psz_alsa_device_name,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
if(
ioctl(
i_fd,
SNDCTL_DSP_SPEED,
&p_sys->i_sample_rate
)
<
0
)
if(
(
i_err
=
snd_pcm_nonblock(
p_sys->p_alsa_pcm,
1
)
)
<
0
)
{
msg_Err(
p_demux,
"Cannot set ALSA nonblock (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Begin setting hardware parameters */
if(
(
i_err
=
snd_pcm_hw_params_malloc(
&p_hw_params
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot allocate hardware parameter structure (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
if(
(
i_err
=
snd_pcm_hw_params_any(
p_sys->p_alsa_pcm,
p_hw_params
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot initialize hardware parameter structure (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Set Interleaved access */
if(
(
i_err
=
snd_pcm_hw_params_set_access(
p_sys->p_alsa_pcm,
p_hw_params,
SND_PCM_ACCESS_RW_INTERLEAVED
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set access type (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Set 16 bit little endian */
if(
(
i_err
=
snd_pcm_hw_params_set_format(
p_sys->p_alsa_pcm,
p_hw_params,
SND_PCM_FORMAT_S
16
_LE
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set sample format (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Set sample rate */
#ifdef HAVE_ALSA_NEW_API
i_err
=
snd_pcm_hw_params_set_rate_near(
p_sys->p_alsa_pcm,
p_hw_params,
&p_sys->i_sample_rate,
NULL
)
;
#else
i_err
=
snd_pcm_hw_params_set_rate_near(
p_sys->p_alsa_pcm,
p_hw_params,
p_sys->i_sample_rate,
NULL
)
;
#endif
if(
i_err
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set sample rate (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Set channels */
unsigned
int
channels
=
p_sys->b_stereo
?
2
:
1
;
if(
(
i_err
=
snd_pcm_hw_params_set_channels(
p_sys->p_alsa_pcm,
p_hw_params,
channels
)
)
<
0
)
{
channels
=
(
channels==
1
)
?
2
:
1
;
msg_Warn(
p_demux,
"ALSA: cannot set channel count (%s). Trying with channels=%d"
,
snd_strerror(
i_err
),
channels
)
;
if(
(
i_err
=
snd_pcm_hw_params_set_channels(
p_sys->p_alsa_pcm,
p_hw_params,
channels
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set channel count (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
p_sys->b_stereo
=
(
channels
==
2
)
;
}
/* Set metrics for buffer calculations later */
unsigned
int
buffer_time
;
if(
(
i_err
=
snd_pcm_hw_params_get_buffer_time_max(p_hw_params,
&buffer_time,
0
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot get buffer time max (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
if
(buffer_time
>
500000
)
buffer_time
=
500000
;
/* Set period time */
unsigned
int
period_time
=
buffer_time
/
4
;
#ifdef HAVE_ALSA_NEW_API
i_err
=
snd_pcm_hw_params_set_period_time_near(
p_sys->p_alsa_pcm,
p_hw_params,
&period_time,
0
)
;
#else
i_err
=
snd_pcm_hw_params_set_period_time_near(
p_sys->p_alsa_pcm,
p_hw_params,
period_time,
0
)
;
#endif
if(
i_err
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set period time (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Set buffer time */
#ifdef HAVE_ALSA_NEW_API
i_err
=
snd_pcm_hw_params_set_buffer_time_near(
p_sys->p_alsa_pcm,
p_hw_params,
&buffer_time,
0
)
;
#else
i_err
=
snd_pcm_hw_params_set_buffer_time_near(
p_sys->p_alsa_pcm,
p_hw_params,
buffer_time,
0
)
;
#endif
if(
i_err
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set buffer time (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Apply new hardware parameters */
if(
(
i_err
=
snd_pcm_hw_params(
p_sys->p_alsa_pcm,
p_hw_params
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot set hw parameters (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Get various buffer metrics */
snd_pcm_hw_params_get_period_size(
p_hw_params,
&chunk_size,
0
)
;
snd_pcm_hw_params_get_buffer_size(
p_hw_params,
&buffer_size
)
;
if
(chunk_size
==
buffer_size)
{
msg_Err(
p_demux,
"ALSA: period cannot equal buffer size (%lu == %lu)"
,
chunk_size,
buffer_size)
;
goto
adev_fail
;
}
int
bits_per_sample
=
snd_pcm_format_physical_width(SND_PCM_FORMAT_S
16
_LE)
;
int
bits_per_frame
=
bits_per_sample
*
channels
;
p_sys->i_alsa_chunk_size
=
chunk_size
;
p_sys->i_alsa_frame_size
=
(bits_per_sample
/
8
)
*
channels
;
p_sys->i_audio_max_frame_size
=
chunk_size
*
bits_per_frame
/
8
;
snd_pcm_hw_params_free(
p_hw_params
)
;
p_hw_params
=
NULL
;
/* Prep device */
if(
(
i_err
=
snd_pcm_prepare(
p_sys->p_alsa_pcm
)
)
<
0
)
{
msg_Err(
p_demux,
"ALSA: cannot prepare audio interface for use (%s)"
,
snd_strerror(
i_err
)
)
;
goto
adev_fail
;
}
/* Return a fake handle so other tests work */
i_fd
=
1
;
#endif
}
else
{
msg_Err(
p_demux,
"cannot set audio sample rate (%m)"
)
;
goto
adev_fail
;
/* OSS */
if(
(i_fd
=
open(
psz_device,
O_RDONLY
|
O_NONBLOCK
))
<
0
)
{
msg_Err(
p_demux,
"cannot open OSS audio device (%m)"
)
;
goto
adev_fail
;
}
i_format
=
AFMT_S
16
_LE
;
if(
ioctl(
i_fd,
SNDCTL_DSP_SETFMT,
&i_format
)
<
0
||
i_format
!=
AFMT_S
16
_LE
)
{
msg_Err(
p_demux,
"cannot set audio format (16b little endian) "
"(%m)"
)
;
goto
adev_fail
;
}
if(
ioctl(
i_fd,
SNDCTL_DSP_STEREO,
&p_sys->b_stereo
)
<
0
)
{
msg_Err(
p_demux,
"cannot set audio channels count (%m)"
)
;
goto
adev_fail
;
}
if(
ioctl(
i_fd,
SNDCTL_DSP_SPEED,
&p_sys->i_sample_rate
)
<
0
)
{
msg_Err(
p_demux,
"cannot set audio sample rate (%m)"
)
;
goto
adev_fail
;
}
p_sys->i_audio_max_frame_size
=
6
*
1024
;
}
msg_Dbg(
p_demux,
"opened adev=`%s' %s %dHz"
,
psz_device,
p_sys->b_stereo
?
"stereo"
:
"mono"
,
p_sys->i_sample_rate
)
;
p_sys->i_audio_max_frame_size
=
6
*
1024
;
es_format_t
fmt
;
es_format_Init(
&fmt,
AUDIO_ES,
VLC_FOURCC(
'a'
,
'r'
,
'a'
,
'w'
)
)
;
fmt.audio.i_channels
=
p_sys->b_stereo
?
2
:
1
;
fmt.audio.i_rate
=
p_sys->i_sample_rate
;
fmt.audio.i_bitspersample
=
16
;
/* FIXME ? */
fmt.audio.i_bitspersample
=
16
;
fmt.audio.i_blockalign
=
fmt.audio.i_channels
*
fmt.audio.i_bitspersample
/
8
;
fmt.i_bitrate
=
fmt.audio.i_channels
*
fmt.audio.i_rate
*
fmt.audio.i_bitspersample
;
...
...
@@ -1672,11 +1951,22 @@ int OpenAudioDev( demux_t *p_demux, char *psz_device )
p_sys->p_es_audio
=
es_out_Add(
p_demux->out,
&fmt
)
;
#ifdef HAVE_ALSA
free(
psz_alsa_device_name
)
;
#endif
return
i_fd
;
adev_fail:
if(
i_fd
>=
0
)
close(
i_fd
)
;
#ifdef HAVE_ALSA
if(
p_hw_params
)
snd_pcm_hw_params_free(
p_hw_params
)
;
if(
p_sys->p_alsa_pcm
)
snd_pcm_close(
p_sys->p_alsa_pcm
)
;
free(
psz_alsa_device_name
)
;
#endif
return
-
1
;
}
...
...
@@ -1975,21 +2265,51 @@ vlc_bool_t ProbeAudioDev( demux_t *p_demux, char *psz_device )
{
int
i_fd
=
0
;
int
i_caps
;
demux_sys_t
*p_sys
=
p_demux->p_sys
;
if(
(
i_fd
=
open(
psz_device,
O_RDONLY
|
O_NONBLOCK
)
)
<
0
)
if(
p_sys->b_use_alsa
)
{
msg_Err(
p_demux,
"cannot open audio device (%m)"
)
;
goto
open_failed
;
}
/* ALSA */
/* this will fail if the device is video */
if(
ioctl(
i_fd,
SNDCTL_DSP_GETCAPS,
&i_caps
)
<
0
)
{
msg_Err(
p_demux,
"cannot get audio caps (%m)"
)
;
#ifdef HAVE_ALSA
int
i_err
;
snd_pcm_t
*p_alsa_pcm
;
char*
psz_alsa_device_name
=
ResolveALSADeviceName(
psz_device
)
;
if(
(
i_err
=
snd_pcm_open(
&p_alsa_pcm,
psz_alsa_device_name,
SND_PCM_STREAM_CAPTURE,
SND_PCM_NONBLOCK
)
)
<
0
)
{
msg_Err(
p_demux,
"cannot open device %s for ALSA audio (%s)"
,
psz_alsa_device_name,
snd_strerror(
i_err
)
)
;
free(
psz_alsa_device_name
)
;
goto
open_failed
;
}
snd_pcm_close(
p_alsa_pcm
)
;
free(
psz_alsa_device_name
)
;
#else
msg_Err(
p_demux,
"ALSA support not available"
)
;
goto
open_failed
;
#endif
}
else
{
/* OSS */
if(
(
i_fd
=
open(
psz_device,
O_RDONLY
|
O_NONBLOCK
)
)
<
0
)
{
msg_Err(
p_demux,
"cannot open device %s for OSS audio (%m)"
,
psz_device
)
;
goto
open_failed
;
}
/* this will fail if the device is video */
if(
ioctl(
i_fd,
SNDCTL_DSP_GETCAPS,
&i_caps
)
<
0
)
{
msg_Err(
p_demux,
"cannot get audio caps (%m)"
)
;
goto
open_failed
;
}
if(
i_fd
>=
0
)
close(
i_fd
)
;
}
if(
i_fd
>=
0
)
close(
i_fd
)
;
return
VLC_TRUE
;
open_failed:
...
...
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