1 /*****************************************************************************
2 * alsa.c : Alsa input module for vlc
3 *****************************************************************************
4 * Copyright (C) 2002-2011 the VideoLAN team
7 * Authors: Benjamin Pracht <bigben at videolan dot org>
8 * Richard Hosking <richard at hovis dot net>
9 * Antoine Cellerier <dionoea at videolan d.t org>
10 * Dennis Lou <dlou99 at yahoo dot com>
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25 *****************************************************************************/
28 * ALSA support based on parts of
29 * http://www.equalarea.com/paul/alsa-audio.html
30 * and hints taken from alsa-utils (aplay/arecord)
31 * http://www.alsa-project.org
34 /*****************************************************************************
36 *****************************************************************************/
42 #include <vlc_common.h>
43 #include <vlc_plugin.h>
44 #include <vlc_access.h>
45 #include <vlc_demux.h>
46 #include <vlc_input.h>
47 #include <vlc_fourcc.h>
51 #include <sys/ioctl.h>
54 #include <sys/soundcard.h>
56 #define ALSA_PCM_NEW_HW_PARAMS_API
57 #define ALSA_PCM_NEW_SW_PARAMS_API
58 #include <alsa/asoundlib.h>
62 /*****************************************************************************
64 *****************************************************************************/
66 static int DemuxOpen ( vlc_object_t
* );
67 static void DemuxClose( vlc_object_t
* );
69 #define STEREO_TEXT N_( "Stereo" )
70 #define STEREO_LONGTEXT N_( \
71 "Capture the audio stream in stereo." )
73 #define FORMAT_TEXT N_( "Capture format (default s16l)" )
74 #define FORMAT_LONGTEXT N_( \
75 "Capture format of audio stream." )
77 #define SAMPLERATE_TEXT N_( "Samplerate" )
78 #define SAMPLERATE_LONGTEXT N_( \
79 "Samplerate of the captured audio stream, in Hz (eg: 11025, 22050, 44100, 48000)" )
81 #define HELP_TEXT N_( \
82 "Use alsa:// to open the default audio input. If multiple audio " \
83 "inputs are available, they will be listed in the vlc debug output. " \
84 "To select hw:0,1 , use alsa://hw:0,1 ." )
86 #define ALSA_DEFAULT "hw"
87 #define CFG_PREFIX "alsa-"
89 static const char *const ppsz_fourcc
[] = {
90 "u8", "s8", "gsm", "u16l", "s16l", "u16b", "s16b",
91 "u24l", "s24l", "u24b", "s24b", "u32l", "s32l",
92 "u32b", "s32b", "f32l", "f32b", "f64l", "f64b"
94 static const char *const ppsz_fourcc_text
[] = {
95 N_("PCM U8"), N_("PCM S8"), N_("GSM Audio"),
96 N_("PCM U16 LE"), N_("PCM S16 LE"),
97 N_("PCM U16 BE"), N_("PCM S16 BE"),
98 N_("PCM U24 LE"), N_("PCM S24 LE"),
99 N_("PCM U24 BE"), N_("PCM S24 BE"),
100 N_("PCM U32 LE"), N_("PCM S32 LE"),
101 N_("PCM U32 BE"), N_("PCM S32 BE"),
102 N_("PCM F32 LE"), N_("PCM F32 BE"),
103 N_("PCM F64 LE"), N_("PCM F64 BE")
107 set_shortname( N_("ALSA") )
108 set_description( N_("ALSA audio capture input") )
109 set_category( CAT_INPUT
)
110 set_subcategory( SUBCAT_INPUT_ACCESS
)
111 set_help( HELP_TEXT
)
113 add_shortcut( "alsa" )
114 set_capability( "access_demux", 10 )
115 set_callbacks( DemuxOpen
, DemuxClose
)
117 add_bool( CFG_PREFIX
"stereo", true, STEREO_TEXT
, STEREO_LONGTEXT
,
119 add_string( CFG_PREFIX
"format", "s16l", FORMAT_TEXT
,
120 FORMAT_LONGTEXT
, true )
121 change_string_list( ppsz_fourcc
, ppsz_fourcc_text
, 0 )
122 add_integer( CFG_PREFIX
"samplerate", 48000, SAMPLERATE_TEXT
,
123 SAMPLERATE_LONGTEXT
, true )
126 /*****************************************************************************
127 * Access: local prototypes
128 *****************************************************************************/
130 static int DemuxControl( demux_t
*, int, va_list );
132 static int Demux( demux_t
* );
134 static block_t
* GrabAudio( demux_t
*p_demux
);
136 static int OpenAudioDev( demux_t
*, const char * );
137 static bool ProbeAudioDevAlsa( demux_t
*, const char * );
138 static char *ListAvailableDevices( demux_t
*, bool b_probe
);
143 unsigned int i_sample_rate
;
145 vlc_fourcc_t i_format
;
146 size_t i_max_frame_size
;
151 snd_pcm_t
*p_alsa_pcm
;
152 size_t i_alsa_frame_size
;
153 int i_alsa_chunk_size
;
155 int64_t i_next_demux_date
; /* Used to handle alsa:// as input-slave properly */
158 static int FindMainDevice( demux_t
*p_demux
, const char *psz_device
)
162 msg_Dbg( p_demux
, "opening device '%s'", psz_device
);
163 if( ProbeAudioDevAlsa( p_demux
, psz_device
) )
165 msg_Dbg( p_demux
, "'%s' is an audio device", psz_device
);
166 OpenAudioDev( p_demux
, psz_device
);
169 else if( ProbeAudioDevAlsa( p_demux
, ALSA_DEFAULT
) )
171 msg_Dbg( p_demux
, "'%s' is an audio device", ALSA_DEFAULT
);
172 OpenAudioDev( p_demux
, ALSA_DEFAULT
);
174 else if( ( psz_device
= ListAvailableDevices( p_demux
, true ) ) )
176 msg_Dbg( p_demux
, "'%s' is an audio device", psz_device
);
177 OpenAudioDev( p_demux
, psz_device
);
178 free( (char *)psz_device
);
181 if( p_demux
->p_sys
->p_alsa_pcm
== NULL
)
186 static char *ListAvailableDevices( demux_t
*p_demux
, bool b_probe
)
188 snd_ctl_card_info_t
*p_info
= NULL
;
189 snd_ctl_card_info_alloca( &p_info
);
191 snd_pcm_info_t
*p_pcminfo
= NULL
;
192 snd_pcm_info_alloca( &p_pcminfo
);
195 msg_Dbg( p_demux
, "Available alsa capture devices:" );
197 while( !snd_card_next( &i_card
) && i_card
>= 0 )
199 char psz_devname
[10];
200 snprintf( psz_devname
, 10, "hw:%d", i_card
);
202 snd_ctl_t
*p_ctl
= NULL
;
203 if( snd_ctl_open( &p_ctl
, psz_devname
, 0 ) < 0 ) continue;
205 snd_ctl_card_info( p_ctl
, p_info
);
207 msg_Dbg( p_demux
, " %s (%s)",
208 snd_ctl_card_info_get_id( p_info
),
209 snd_ctl_card_info_get_name( p_info
) );
212 while( !snd_ctl_pcm_next_device( p_ctl
, &i_dev
) && i_dev
>= 0 )
214 snd_pcm_info_set_device( p_pcminfo
, i_dev
);
215 snd_pcm_info_set_subdevice( p_pcminfo
, 0 );
216 snd_pcm_info_set_stream( p_pcminfo
, SND_PCM_STREAM_CAPTURE
);
217 if( snd_ctl_pcm_info( p_ctl
, p_pcminfo
) < 0 ) continue;
220 msg_Dbg( p_demux
, " hw:%d,%d : %s (%s)", i_card
, i_dev
,
221 snd_pcm_info_get_id( p_pcminfo
),
222 snd_pcm_info_get_name( p_pcminfo
) );
226 if( asprintf( &psz_device
, "hw:%d,%d", i_card
, i_dev
) > 0 )
228 if( ProbeAudioDevAlsa( p_demux
, psz_device
) )
230 snd_ctl_close( p_ctl
);
239 snd_ctl_close( p_ctl
);
244 /*****************************************************************************
245 * DemuxOpen: opens alsa device, access_demux callback
246 *****************************************************************************
248 * url: <alsa device>::::
250 *****************************************************************************/
251 static int DemuxOpen( vlc_object_t
*p_this
)
253 demux_t
*p_demux
= (demux_t
*)p_this
;
256 /* Only when selected */
257 if( *p_demux
->psz_access
== '\0' ) return VLC_EGENERIC
;
260 p_demux
->pf_control
= DemuxControl
;
261 p_demux
->pf_demux
= Demux
;
262 p_demux
->info
.i_update
= 0;
263 p_demux
->info
.i_title
= 0;
264 p_demux
->info
.i_seekpoint
= 0;
266 p_demux
->p_sys
= p_sys
= calloc( 1, sizeof( demux_sys_t
) );
267 if( p_sys
== NULL
) return VLC_ENOMEM
;
269 p_sys
->i_sample_rate
= var_InheritInteger( p_demux
, CFG_PREFIX
"samplerate" );
270 p_sys
->b_stereo
= var_InheritBool( p_demux
, CFG_PREFIX
"stereo" );
272 p_sys
->p_block
= NULL
;
273 p_sys
->i_next_demux_date
= -1;
275 char *psz_format
= var_InheritString( p_demux
, CFG_PREFIX
"format" );
276 p_sys
->i_format
= vlc_fourcc_GetCodecFromString( AUDIO_ES
, psz_format
);
279 const char *psz_device
= NULL
;
280 if( p_demux
->psz_location
&& *p_demux
->psz_location
)
281 psz_device
= p_demux
->psz_location
;
283 ListAvailableDevices( p_demux
, false );
285 if( FindMainDevice( p_demux
, psz_device
) != VLC_SUCCESS
)
287 if( p_demux
->psz_location
&& *p_demux
->psz_location
)
288 ListAvailableDevices( p_demux
, false );
289 DemuxClose( p_this
);
296 /*****************************************************************************
297 * Close: close device, free resources
298 *****************************************************************************/
299 static void DemuxClose( vlc_object_t
*p_this
)
301 demux_t
*p_demux
= (demux_t
*)p_this
;
302 demux_sys_t
*p_sys
= p_demux
->p_sys
;
304 if( p_sys
->p_alsa_pcm
)
306 snd_pcm_close( p_sys
->p_alsa_pcm
);
309 if( p_sys
->p_block
) block_Release( p_sys
->p_block
);
314 /*****************************************************************************
316 *****************************************************************************/
317 static int DemuxControl( demux_t
*p_demux
, int i_query
, va_list args
)
319 demux_sys_t
*p_sys
= p_demux
->p_sys
;
323 /* Special for access_demux */
324 case DEMUX_CAN_PAUSE
:
326 case DEMUX_SET_PAUSE_STATE
:
327 case DEMUX_CAN_CONTROL_PACE
:
328 *va_arg( args
, bool * ) = false;
331 case DEMUX_GET_PTS_DELAY
:
332 *va_arg( args
, int64_t * ) =
333 INT64_C(1000) * var_InheritInteger( p_demux
, "live-caching" );
337 *va_arg( args
, int64_t * ) = mdate();
340 case DEMUX_SET_NEXT_DEMUX_TIME
:
341 p_sys
->i_next_demux_date
= va_arg( args
, int64_t );
344 /* TODO implement others */
352 /*****************************************************************************
353 * Demux: Processes the audio frame
354 *****************************************************************************/
355 static int Demux( demux_t
*p_demux
)
357 demux_sys_t
*p_sys
= p_demux
->p_sys
;
359 block_t
*p_block
= NULL
;
363 p_block
= GrabAudio( p_demux
);
366 es_out_Control( p_demux
->out
, ES_OUT_SET_PCR
, p_block
->i_pts
);
367 es_out_Send( p_demux
->out
, p_sys
->p_es
, p_block
);
371 } while( p_block
&& p_sys
->i_next_demux_date
> 0 &&
372 p_block
->i_pts
< p_sys
->i_next_demux_date
);
375 es_out_Send( p_demux
->out
, p_sys
->p_es
, p_block
);
380 /*****************************************************************************
381 * GrabAudio: Grab an audio frame
382 *****************************************************************************/
383 static block_t
* GrabAudio( demux_t
*p_demux
)
385 demux_sys_t
*p_sys
= p_demux
->p_sys
;
386 int i_read
, i_correct
;
389 if( p_sys
->p_block
) p_block
= p_sys
->p_block
;
390 else p_block
= block_New( p_demux
, p_sys
->i_max_frame_size
);
394 msg_Warn( p_demux
, "cannot get block" );
398 p_sys
->p_block
= p_block
;
401 i_read
= snd_pcm_readi( p_sys
->p_alsa_pcm
, p_block
->p_buffer
,
402 p_sys
->i_alsa_chunk_size
);
403 if( i_read
== -EAGAIN
)
405 snd_pcm_wait( p_sys
->p_alsa_pcm
, 10 ); /* See poll() comment in oss.c */
410 i_read
= snd_pcm_recover( p_sys
->p_alsa_pcm
, i_read
, 0 );
416 case 0: /* state recovered or no data */
419 snd_pcm_wait( p_sys
->p_alsa_pcm
, 10 ); /* See poll() comment in oss.c */
422 msg_Err( p_demux
, "Failed to read alsa frame (%s)",
423 snd_strerror( i_read
) );
428 /* convert from frames to bytes */
429 i_read
*= p_sys
->i_alsa_frame_size
;
431 p_block
->i_buffer
= i_read
;
434 /* Correct the date because of kernel buffering */
438 snd_pcm_sframes_t delay
= 0;
439 if( ( i_err
= snd_pcm_delay( p_sys
->p_alsa_pcm
, &delay
) ) >= 0 )
441 size_t i_correction_delta
= delay
* p_sys
->i_alsa_frame_size
;
442 /* Test for overrun */
443 if( i_correction_delta
> p_sys
->i_max_frame_size
)
445 msg_Warn( p_demux
, "ALSA read overrun (%zu > %zu)",
446 i_correction_delta
, p_sys
->i_max_frame_size
);
447 i_correction_delta
= p_sys
->i_max_frame_size
;
448 snd_pcm_prepare( p_sys
->p_alsa_pcm
);
450 i_correct
+= i_correction_delta
;
454 /* delay failed so reset */
455 msg_Warn( p_demux
, "ALSA snd_pcm_delay failed (%s)", snd_strerror( i_err
) );
456 snd_pcm_prepare( p_sys
->p_alsa_pcm
);
460 p_block
->i_pts
= p_block
->i_dts
=
461 mdate() - INT64_C(1000000) * (mtime_t
)i_correct
/
462 2 / ( p_sys
->b_stereo
? 2 : 1) / p_sys
->i_sample_rate
;
467 static snd_pcm_format_t
GetAlsaPCMFormat( demux_t
*p_demux
, const vlc_fourcc_t i_format
)
469 demux_sys_t
*p_sys
= p_demux
->p_sys
;
473 case VLC_CODEC_U8
: return SND_PCM_FORMAT_U8
;
474 case VLC_CODEC_S8
: return SND_PCM_FORMAT_S8
;
476 case VLC_CODEC_GSM
: return SND_PCM_FORMAT_GSM
;
478 case VLC_CODEC_U16L
: return SND_PCM_FORMAT_U16_LE
;
479 case VLC_CODEC_S16L
: return SND_PCM_FORMAT_S16_LE
;
480 case VLC_CODEC_U16B
: return SND_PCM_FORMAT_U16_BE
;
481 case VLC_CODEC_S16B
: return SND_PCM_FORMAT_S16_BE
;
483 case VLC_CODEC_U24L
: return SND_PCM_FORMAT_U24_3LE
;
484 case VLC_CODEC_S24L
: return SND_PCM_FORMAT_S24_3LE
;
485 case VLC_CODEC_U24B
: return SND_PCM_FORMAT_U24_3BE
;
486 case VLC_CODEC_S24B
: return SND_PCM_FORMAT_S24_3BE
;
488 case VLC_CODEC_U32L
: return SND_PCM_FORMAT_U32_LE
;
489 case VLC_CODEC_U32B
: return SND_PCM_FORMAT_U32_BE
;
490 case VLC_CODEC_S32L
: return SND_PCM_FORMAT_S32_LE
;
491 case VLC_CODEC_S32B
: return SND_PCM_FORMAT_S32_BE
;
492 case VLC_CODEC_F32L
: return SND_PCM_FORMAT_FLOAT_LE
;
493 case VLC_CODEC_F32B
: return SND_PCM_FORMAT_FLOAT_BE
;
495 case VLC_CODEC_F64L
: return SND_PCM_FORMAT_FLOAT64_LE
;
496 case VLC_CODEC_F64B
: return SND_PCM_FORMAT_FLOAT64_BE
;
499 msg_Err( p_demux
, "ALSA: unsupported sample format '%s' falling back to 's16l'",
500 (const char *)&i_format
);
501 p_sys
->i_format
= VLC_CODEC_S16L
;
504 return SND_PCM_FORMAT_S16_LE
;
507 /*****************************************************************************
508 * OpenAudioDev: open and set up the audio device and probe for capabilities
509 *****************************************************************************/
510 static int OpenAudioDevAlsa( demux_t
*p_demux
, const char *psz_device
)
512 demux_sys_t
*p_sys
= p_demux
->p_sys
;
513 p_sys
->p_alsa_pcm
= NULL
;
514 snd_pcm_hw_params_t
*p_hw_params
= NULL
;
515 snd_pcm_format_t i_alsa_pcm_format
;
516 snd_pcm_uframes_t buffer_size
;
517 snd_pcm_uframes_t chunk_size
;
522 if( ( i_err
= snd_pcm_open( &p_sys
->p_alsa_pcm
, psz_device
,
523 SND_PCM_STREAM_CAPTURE
, SND_PCM_NONBLOCK
) ) < 0)
525 msg_Err( p_demux
, "Cannot open ALSA audio device %s (%s)",
526 psz_device
, snd_strerror( i_err
) );
530 if( ( i_err
= snd_pcm_nonblock( p_sys
->p_alsa_pcm
, 1 ) ) < 0)
532 msg_Err( p_demux
, "Cannot set ALSA nonblock (%s)",
533 snd_strerror( i_err
) );
537 /* Begin setting hardware parameters */
539 if( ( i_err
= snd_pcm_hw_params_malloc( &p_hw_params
) ) < 0 )
542 "ALSA: cannot allocate hardware parameter structure (%s)",
543 snd_strerror( i_err
) );
547 if( ( i_err
= snd_pcm_hw_params_any( p_sys
->p_alsa_pcm
, p_hw_params
) ) < 0 )
550 "ALSA: cannot initialize hardware parameter structure (%s)",
551 snd_strerror( i_err
) );
555 /* Set Interleaved access */
556 if( ( i_err
= snd_pcm_hw_params_set_access( p_sys
->p_alsa_pcm
, p_hw_params
,
557 SND_PCM_ACCESS_RW_INTERLEAVED
) ) < 0 )
559 msg_Err( p_demux
, "ALSA: cannot set access type (%s)",
560 snd_strerror( i_err
) );
564 /* Set capture format, default is signed 16 bit little endian */
565 i_alsa_pcm_format
= GetAlsaPCMFormat( p_demux
, p_sys
->i_format
);
566 if( ( i_err
= snd_pcm_hw_params_set_format( p_sys
->p_alsa_pcm
, p_hw_params
,
567 i_alsa_pcm_format
) ) < 0 )
569 msg_Err( p_demux
, "ALSA: cannot set sample format (%s)",
570 snd_strerror( i_err
) );
574 /* Set sample rate */
575 i_err
= snd_pcm_hw_params_set_rate_near( p_sys
->p_alsa_pcm
, p_hw_params
,
576 &p_sys
->i_sample_rate
, NULL
);
579 msg_Err( p_demux
, "ALSA: cannot set sample rate (%s)",
580 snd_strerror( i_err
) );
585 unsigned int channels
= p_sys
->b_stereo
? 2 : 1;
586 if( ( i_err
= snd_pcm_hw_params_set_channels( p_sys
->p_alsa_pcm
, p_hw_params
,
589 channels
= ( channels
==1 ) ? 2 : 1;
590 msg_Warn( p_demux
, "ALSA: cannot set channel count (%s). "
591 "Trying with channels=%d",
592 snd_strerror( i_err
),
594 if( ( i_err
= snd_pcm_hw_params_set_channels( p_sys
->p_alsa_pcm
, p_hw_params
,
597 msg_Err( p_demux
, "ALSA: cannot set channel count (%s)",
598 snd_strerror( i_err
) );
601 p_sys
->b_stereo
= ( channels
== 2 );
604 /* Set metrics for buffer calculations later */
605 unsigned int buffer_time
;
606 if( ( i_err
= snd_pcm_hw_params_get_buffer_time_max(p_hw_params
, &buffer_time
, 0) ) < 0 )
608 msg_Err( p_demux
, "ALSA: cannot get buffer time max (%s)",
609 snd_strerror( i_err
) );
612 if( buffer_time
> 500000 ) buffer_time
= 500000;
614 /* Set period time */
615 unsigned int period_time
= buffer_time
/ 4;
616 i_err
= snd_pcm_hw_params_set_period_time_near( p_sys
->p_alsa_pcm
, p_hw_params
,
620 msg_Err( p_demux
, "ALSA: cannot set period time (%s)",
621 snd_strerror( i_err
) );
625 /* Set buffer time */
626 i_err
= snd_pcm_hw_params_set_buffer_time_near( p_sys
->p_alsa_pcm
, p_hw_params
,
630 msg_Err( p_demux
, "ALSA: cannot set buffer time (%s)",
631 snd_strerror( i_err
) );
635 /* Apply new hardware parameters */
636 if( ( i_err
= snd_pcm_hw_params( p_sys
->p_alsa_pcm
, p_hw_params
) ) < 0 )
638 msg_Err( p_demux
, "ALSA: cannot set hw parameters (%s)",
639 snd_strerror( i_err
) );
643 /* Get various buffer metrics */
644 snd_pcm_hw_params_get_period_size( p_hw_params
, &chunk_size
, 0 );
645 snd_pcm_hw_params_get_buffer_size( p_hw_params
, &buffer_size
);
646 if( chunk_size
== buffer_size
)
649 "ALSA: period cannot equal buffer size (%lu == %lu)",
650 chunk_size
, buffer_size
);
654 int bits_per_sample
= snd_pcm_format_physical_width(i_alsa_pcm_format
);
655 int bits_per_frame
= bits_per_sample
* channels
;
657 p_sys
->i_alsa_chunk_size
= chunk_size
;
658 p_sys
->i_alsa_frame_size
= bits_per_frame
/ 8;
659 p_sys
->i_max_frame_size
= chunk_size
* bits_per_frame
/ 8;
661 snd_pcm_hw_params_free( p_hw_params
);
665 if( ( i_err
= snd_pcm_prepare( p_sys
->p_alsa_pcm
) ) < 0 )
668 "ALSA: cannot prepare audio interface for use (%s)",
669 snd_strerror( i_err
) );
673 snd_pcm_start( p_sys
->p_alsa_pcm
);
679 if( p_hw_params
) snd_pcm_hw_params_free( p_hw_params
);
680 if( p_sys
->p_alsa_pcm
) snd_pcm_close( p_sys
->p_alsa_pcm
);
681 p_sys
->p_alsa_pcm
= NULL
;
686 static int OpenAudioDev( demux_t
*p_demux
, const char *psz_device
)
688 demux_sys_t
*p_sys
= p_demux
->p_sys
;
689 if( OpenAudioDevAlsa( p_demux
, psz_device
) != VLC_SUCCESS
)
692 msg_Dbg( p_demux
, "opened adev=`%s' %s %dHz codec '%s'",
693 psz_device
, p_sys
->b_stereo
? "stereo" : "mono",
694 p_sys
->i_sample_rate
,
695 vlc_fourcc_GetDescription( AUDIO_ES
, p_sys
->i_format
) );
698 es_format_Init( &fmt
, AUDIO_ES
, p_sys
->i_format
);
700 fmt
.audio
.i_channels
= p_sys
->b_stereo
? 2 : 1;
701 fmt
.audio
.i_rate
= p_sys
->i_sample_rate
;
702 fmt
.audio
.i_bitspersample
= aout_BitsPerSample( p_sys
->i_format
);
703 fmt
.audio
.i_blockalign
= fmt
.audio
.i_channels
* fmt
.audio
.i_bitspersample
/ 8;
704 fmt
.i_bitrate
= fmt
.audio
.i_channels
* fmt
.audio
.i_rate
* fmt
.audio
.i_bitspersample
;
706 msg_Dbg( p_demux
, "new audio es %d channels %dHz",
707 fmt
.audio
.i_channels
, fmt
.audio
.i_rate
);
709 p_sys
->p_es
= es_out_Add( p_demux
->out
, &fmt
);
714 /*****************************************************************************
715 * ProbeAudioDevAlsa: probe audio for capabilities
716 *****************************************************************************/
717 static bool ProbeAudioDevAlsa( demux_t
*p_demux
, const char *psz_device
)
720 snd_pcm_t
*p_alsa_pcm
;
722 if( ( i_err
= snd_pcm_open( &p_alsa_pcm
, psz_device
, SND_PCM_STREAM_CAPTURE
, SND_PCM_NONBLOCK
) ) < 0 )
724 msg_Err( p_demux
, "cannot open device %s for ALSA audio (%s)", psz_device
, snd_strerror( i_err
) );
728 snd_pcm_close( p_alsa_pcm
);