]> git.sesse.net Git - vlc/blob - modules/access/alsa.c
7e82ee0f2816f12d9956d9addbebf570f19b95ea
[vlc] / modules / access / alsa.c
1 /*****************************************************************************
2  * alsa.c : Alsa input module for vlc
3  *****************************************************************************
4  * Copyright (C) 2002-2009 the VideoLAN team
5  * $Id$
6  *
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>
11  *
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.
16  *
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.
21  *
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  *****************************************************************************/
26
27 /*
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
32  */
33
34 /*****************************************************************************
35  * Preamble
36  *****************************************************************************/
37
38 #ifdef HAVE_CONFIG_H
39 # include "config.h"
40 #endif
41
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_vout.h>
48
49 #include <ctype.h>
50 #include <fcntl.h>
51 #include <unistd.h>
52 #include <sys/ioctl.h>
53 #include <sys/mman.h>
54
55 #include <sys/soundcard.h>
56
57 #define ALSA_PCM_NEW_HW_PARAMS_API
58 #define ALSA_PCM_NEW_SW_PARAMS_API
59 #include <alsa/asoundlib.h>
60
61 #include <poll.h>
62
63 /*****************************************************************************
64  * Module descriptior
65  *****************************************************************************/
66
67 static int  DemuxOpen ( vlc_object_t * );
68 static void DemuxClose( vlc_object_t * );
69
70 #define STEREO_TEXT N_( "Stereo" )
71 #define STEREO_LONGTEXT N_( \
72     "Capture the audio stream in stereo." )
73
74 #define SAMPLERATE_TEXT N_( "Samplerate" )
75 #define SAMPLERATE_LONGTEXT N_( \
76     "Samplerate of the captured audio stream, in Hz (eg: 11025, 22050, 44100, 48000)" )
77
78 #define CACHING_TEXT N_("Caching value in ms")
79 #define CACHING_LONGTEXT N_( \
80     "Caching value for Alsa captures. This " \
81     "value should be set in milliseconds." )
82
83 #define ALSA_DEFAULT "hw"
84 #define CFG_PREFIX "alsa-"
85
86 vlc_module_begin();
87     set_shortname( N_("Alsa") );
88     set_description( N_("Alsa audio capture input") );
89     set_category( CAT_INPUT );
90     set_subcategory( SUBCAT_INPUT_ACCESS );
91
92     add_shortcut( "alsa" );
93     set_capability( "access_demux", 10 );
94     set_callbacks( DemuxOpen, DemuxClose );
95
96     add_bool( CFG_PREFIX "stereo", true, NULL, STEREO_TEXT, STEREO_LONGTEXT,
97                 true );
98     add_integer( CFG_PREFIX "samplerate", 48000, NULL, SAMPLERATE_TEXT,
99                 SAMPLERATE_LONGTEXT, true );
100     add_integer( CFG_PREFIX "caching", DEFAULT_PTS_DELAY / 1000, NULL,
101                 CACHING_TEXT, CACHING_LONGTEXT, true );
102 vlc_module_end();
103
104 /*****************************************************************************
105  * Access: local prototypes
106  *****************************************************************************/
107
108 static int DemuxControl( demux_t *, int, va_list );
109
110 static int Demux( demux_t * );
111
112 static block_t* GrabAudio( demux_t *p_demux );
113
114 static int OpenAudioDev( demux_t * );
115 static bool ProbeAudioDevAlsa( demux_t *, const char *psz_device );
116
117 struct demux_sys_t
118 {
119     const char *psz_device;  /* Alsa device from MRL */
120
121     /* Audio */
122     int i_pts;
123     unsigned int i_sample_rate;
124     bool b_stereo;
125     size_t i_audio_max_frame_size;
126     block_t *p_block_audio;
127     es_out_id_t *p_es_audio;
128
129     /* ALSA Audio */
130     snd_pcm_t *p_alsa_pcm;
131     size_t i_alsa_frame_size;
132     int i_alsa_chunk_size;
133 };
134
135 static int FindMainDevice( demux_t *p_demux )
136 {
137     msg_Dbg( p_demux, "opening device '%s'", p_demux->p_sys->psz_device );
138     if( ProbeAudioDevAlsa( p_demux, p_demux->p_sys->psz_device ) )
139     {
140         msg_Dbg( p_demux, "'%s' is an audio device",
141                  p_demux->p_sys->psz_device );
142         OpenAudioDev( p_demux );
143     }
144
145     if( p_demux->p_sys->p_alsa_pcm == NULL )
146         return VLC_EGENERIC;
147     return VLC_SUCCESS;
148 }
149
150 /*****************************************************************************
151  * DemuxOpen: opens alsa device, access_demux callback
152  *****************************************************************************
153  *
154  * url: <alsa device>::::
155  *
156  *****************************************************************************/
157 static int DemuxOpen( vlc_object_t *p_this )
158 {
159     demux_t     *p_demux = (demux_t*)p_this;
160     demux_sys_t *p_sys;
161
162     /* Only when selected */
163     if( *p_demux->psz_access == '\0' ) return VLC_EGENERIC;
164
165     /* Set up p_demux */
166     p_demux->pf_control = DemuxControl;
167     p_demux->pf_demux = Demux;
168     p_demux->info.i_update = 0;
169     p_demux->info.i_title = 0;
170     p_demux->info.i_seekpoint = 0;
171
172     p_demux->p_sys = p_sys = calloc( 1, sizeof( demux_sys_t ) );
173     if( p_sys == NULL ) return VLC_ENOMEM;
174
175     p_sys->i_sample_rate = var_CreateGetInteger( p_demux, CFG_PREFIX "samplerate" );
176     p_sys->b_stereo = var_CreateGetBool( p_demux, CFG_PREFIX "stereo" );
177     p_sys->i_pts = var_CreateGetInteger( p_demux, CFG_PREFIX "caching" );
178     p_sys->psz_device = NULL;
179     p_sys->p_es_audio = NULL;
180     p_sys->p_block_audio = NULL;
181
182     if( p_demux->psz_path && *p_demux->psz_path )
183         p_sys->psz_device = p_demux->psz_path;
184     else
185         p_sys->psz_device = ALSA_DEFAULT;
186
187     if( FindMainDevice( p_demux ) != VLC_SUCCESS )
188     {
189         DemuxClose( p_this );
190         return VLC_EGENERIC;
191     }
192
193     return VLC_SUCCESS;
194 }
195
196 /*****************************************************************************
197  * Close: close device, free resources
198  *****************************************************************************/
199 static void DemuxClose( vlc_object_t *p_this )
200 {
201     demux_t     *p_demux = (demux_t *)p_this;
202     demux_sys_t *p_sys   = p_demux->p_sys;
203
204     if( p_sys->p_alsa_pcm )
205     {
206         snd_pcm_close( p_sys->p_alsa_pcm );
207     }
208
209     if( p_sys->p_block_audio ) block_Release( p_sys->p_block_audio );
210
211     free( p_sys );
212 }
213
214 /*****************************************************************************
215  * DemuxControl:
216  *****************************************************************************/
217 static int DemuxControl( demux_t *p_demux, int i_query, va_list args )
218 {
219     demux_sys_t *p_sys = p_demux->p_sys;
220     bool *pb;
221     int64_t *pi64;
222
223     switch( i_query )
224     {
225         /* Special for access_demux */
226         case DEMUX_CAN_PAUSE:
227         case DEMUX_CAN_SEEK:
228         case DEMUX_SET_PAUSE_STATE:
229         case DEMUX_CAN_CONTROL_PACE:
230             pb = (bool*)va_arg( args, bool * );
231             *pb = false;
232             return VLC_SUCCESS;
233
234         case DEMUX_GET_PTS_DELAY:
235             pi64 = (int64_t*)va_arg( args, int64_t * );
236             *pi64 = (int64_t)p_sys->i_pts * 1000;
237             return VLC_SUCCESS;
238
239         case DEMUX_GET_TIME:
240             pi64 = (int64_t*)va_arg( args, int64_t * );
241             *pi64 = mdate();
242             return VLC_SUCCESS;
243
244         /* TODO implement others */
245         default:
246             return VLC_EGENERIC;
247     }
248
249     return VLC_EGENERIC;
250 }
251
252 /*****************************************************************************
253  * Demux: Processes the audio frame
254  *****************************************************************************/
255 static int Demux( demux_t *p_demux )
256 {
257     demux_sys_t *p_sys = p_demux->p_sys;
258
259     int i_wait = snd_pcm_wait( p_sys->p_alsa_pcm, 500 );
260     switch( i_wait )
261     {
262         case 1:
263         {
264             block_t *p_block = GrabAudio( p_demux );
265             if( p_block )
266             {
267                 es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_block->i_pts );
268                 es_out_Send( p_demux->out, p_sys->p_es_audio, p_block );
269             }
270         }
271
272         case -EPIPE:
273             /* xrun */
274             snd_pcm_prepare( p_sys->p_alsa_pcm );
275             break;
276         case -ESTRPIPE:
277         {
278             /* suspend */
279             int i_resume = snd_pcm_resume( p_sys->p_alsa_pcm );
280             if( i_resume < 0 && i_resume != -EAGAIN ) snd_pcm_prepare( p_sys->p_alsa_pcm );
281             break;
282         }
283     }
284
285     return 1;
286 }
287
288
289 /*****************************************************************************
290  * GrabAudio: Grab an audio frame
291  *****************************************************************************/
292 static block_t* GrabAudio( demux_t *p_demux )
293 {
294     demux_sys_t *p_sys = p_demux->p_sys;
295     int i_read, i_correct;
296     block_t *p_block;
297
298     if( p_sys->p_block_audio ) p_block = p_sys->p_block_audio;
299     else p_block = block_New( p_demux, p_sys->i_audio_max_frame_size );
300
301     if( !p_block )
302     {
303         msg_Warn( p_demux, "cannot get block" );
304         return 0;
305     }
306
307     p_sys->p_block_audio = p_block;
308
309     /* ALSA */
310     i_read = snd_pcm_readi( p_sys->p_alsa_pcm, p_block->p_buffer, p_sys->i_alsa_chunk_size );
311     if( i_read <= 0 )
312     {
313         int i_resume;
314         switch( i_read )
315         {
316             case -EAGAIN:
317                 break;
318             case -EPIPE:
319                 /* xrun */
320                 snd_pcm_prepare( p_sys->p_alsa_pcm );
321                 break;
322             case -ESTRPIPE:
323                 /* suspend */
324                 i_resume = snd_pcm_resume( p_sys->p_alsa_pcm );
325                 if( i_resume < 0 && i_resume != -EAGAIN ) snd_pcm_prepare( p_sys->p_alsa_pcm );
326                 break;
327             default:
328                 msg_Err( p_demux, "Failed to read alsa frame (%s)", snd_strerror( i_read ) );
329                 return 0;
330         }
331     }
332     else
333     {
334         /* convert from frames to bytes */
335         i_read *= p_sys->i_alsa_frame_size;
336     }
337
338     if( i_read <= 0 ) return 0;
339
340     p_block->i_buffer = i_read;
341     p_sys->p_block_audio = 0;
342
343     /* Correct the date because of kernel buffering */
344     i_correct = i_read;
345     /* ALSA */
346     int i_err;
347     snd_pcm_sframes_t delay = 0;
348     if( ( i_err = snd_pcm_delay( p_sys->p_alsa_pcm, &delay ) ) >= 0 )
349     {
350         size_t i_correction_delta = delay * p_sys->i_alsa_frame_size;
351         /* Test for overrun */
352         if( i_correction_delta > p_sys->i_audio_max_frame_size )
353         {
354             msg_Warn( p_demux, "ALSA read overrun (%zu > %zu)",
355                       i_correction_delta, p_sys->i_audio_max_frame_size );
356             i_correction_delta = p_sys->i_audio_max_frame_size;
357             snd_pcm_prepare( p_sys->p_alsa_pcm );
358         }
359         i_correct += i_correction_delta;
360     }
361     else
362     {
363         /* delay failed so reset */
364         msg_Warn( p_demux, "ALSA snd_pcm_delay failed (%s)", snd_strerror( i_err ) );
365         snd_pcm_prepare( p_sys->p_alsa_pcm );
366     }
367
368     /* Timestamp */
369     p_block->i_pts = p_block->i_dts =
370         mdate() - INT64_C(1000000) * (mtime_t)i_correct /
371         2 / ( p_sys->b_stereo ? 2 : 1) / p_sys->i_sample_rate;
372
373     return p_block;
374 }
375
376 /*****************************************************************************
377  * OpenAudioDev: open and set up the audio device and probe for capabilities
378  *****************************************************************************/
379 static int OpenAudioDevAlsa( demux_t *p_demux )
380 {
381     demux_sys_t *p_sys = p_demux->p_sys;
382     const char *psz_device = p_sys->psz_device;
383     p_sys->p_alsa_pcm = NULL;
384     snd_pcm_hw_params_t *p_hw_params = NULL;
385     snd_pcm_uframes_t buffer_size;
386     snd_pcm_uframes_t chunk_size;
387
388     /* ALSA */
389     int i_err;
390
391     if( ( i_err = snd_pcm_open( &p_sys->p_alsa_pcm, psz_device,
392         SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK ) ) < 0)
393     {
394         msg_Err( p_demux, "Cannot open ALSA audio device %s (%s)",
395                  psz_device, snd_strerror( i_err ) );
396         goto adev_fail;
397     }
398
399     if( ( i_err = snd_pcm_nonblock( p_sys->p_alsa_pcm, 1 ) ) < 0)
400     {
401         msg_Err( p_demux, "Cannot set ALSA nonblock (%s)",
402                  snd_strerror( i_err ) );
403         goto adev_fail;
404     }
405
406     /* Begin setting hardware parameters */
407
408     if( ( i_err = snd_pcm_hw_params_malloc( &p_hw_params ) ) < 0 )
409     {
410         msg_Err( p_demux,
411                  "ALSA: cannot allocate hardware parameter structure (%s)",
412                  snd_strerror( i_err ) );
413         goto adev_fail;
414     }
415
416     if( ( i_err = snd_pcm_hw_params_any( p_sys->p_alsa_pcm, p_hw_params ) ) < 0 )
417     {
418         msg_Err( p_demux,
419                 "ALSA: cannot initialize hardware parameter structure (%s)",
420                  snd_strerror( i_err ) );
421         goto adev_fail;
422     }
423
424     /* Set Interleaved access */
425     if( ( i_err = snd_pcm_hw_params_set_access( p_sys->p_alsa_pcm, p_hw_params, SND_PCM_ACCESS_RW_INTERLEAVED ) ) < 0 )
426     {
427         msg_Err( p_demux, "ALSA: cannot set access type (%s)",
428                  snd_strerror( i_err ) );
429         goto adev_fail;
430     }
431
432     /* Set 16 bit little endian */
433     if( ( i_err = snd_pcm_hw_params_set_format( p_sys->p_alsa_pcm, p_hw_params, SND_PCM_FORMAT_S16_LE ) ) < 0 )
434     {
435         msg_Err( p_demux, "ALSA: cannot set sample format (%s)",
436                  snd_strerror( i_err ) );
437         goto adev_fail;
438     }
439
440     /* Set sample rate */
441 #ifdef HAVE_ALSA_NEW_API
442     i_err = snd_pcm_hw_params_set_rate_near( p_sys->p_alsa_pcm, p_hw_params, &p_sys->i_sample_rate, NULL );
443 #else
444     i_err = snd_pcm_hw_params_set_rate_near( p_sys->p_alsa_pcm, p_hw_params, p_sys->i_sample_rate, NULL );
445 #endif
446     if( i_err < 0 )
447     {
448         msg_Err( p_demux, "ALSA: cannot set sample rate (%s)",
449                  snd_strerror( i_err ) );
450         goto adev_fail;
451     }
452
453     /* Set channels */
454     unsigned int channels = p_sys->b_stereo ? 2 : 1;
455     if( ( i_err = snd_pcm_hw_params_set_channels( p_sys->p_alsa_pcm, p_hw_params, channels ) ) < 0 )
456     {
457         channels = ( channels==1 ) ? 2 : 1;
458         msg_Warn( p_demux, "ALSA: cannot set channel count (%s). "
459                   "Trying with channels=%d",
460                   snd_strerror( i_err ),
461                   channels );
462         if( ( i_err = snd_pcm_hw_params_set_channels( p_sys->p_alsa_pcm, p_hw_params, channels ) ) < 0 )
463         {
464             msg_Err( p_demux, "ALSA: cannot set channel count (%s)",
465                      snd_strerror( i_err ) );
466             goto adev_fail;
467         }
468         p_sys->b_stereo = ( channels == 2 );
469     }
470
471     /* Set metrics for buffer calculations later */
472     unsigned int buffer_time;
473     if( ( i_err = snd_pcm_hw_params_get_buffer_time_max(p_hw_params, &buffer_time, 0) ) < 0 )
474     {
475         msg_Err( p_demux, "ALSA: cannot get buffer time max (%s)",
476                  snd_strerror( i_err ) );
477         goto adev_fail;
478     }
479     if( buffer_time > 500000 ) buffer_time = 500000;
480
481     /* Set period time */
482     unsigned int period_time = buffer_time / 4;
483 #ifdef HAVE_ALSA_NEW_API
484     i_err = snd_pcm_hw_params_set_period_time_near( p_sys->p_alsa_pcm, p_hw_params, &period_time, 0 );
485 #else
486     i_err = snd_pcm_hw_params_set_period_time_near( p_sys->p_alsa_pcm, p_hw_params, period_time, 0 );
487 #endif
488     if( i_err < 0 )
489     {
490         msg_Err( p_demux, "ALSA: cannot set period time (%s)",
491                  snd_strerror( i_err ) );
492         goto adev_fail;
493     }
494
495     /* Set buffer time */
496 #ifdef HAVE_ALSA_NEW_API
497     i_err = snd_pcm_hw_params_set_buffer_time_near( p_sys->p_alsa_pcm, p_hw_params, &buffer_time, 0 );
498 #else
499     i_err = snd_pcm_hw_params_set_buffer_time_near( p_sys->p_alsa_pcm, p_hw_params, buffer_time, 0 );
500 #endif
501     if( i_err < 0 )
502     {
503         msg_Err( p_demux, "ALSA: cannot set buffer time (%s)",
504                  snd_strerror( i_err ) );
505         goto adev_fail;
506     }
507
508     /* Apply new hardware parameters */
509     if( ( i_err = snd_pcm_hw_params( p_sys->p_alsa_pcm, p_hw_params ) ) < 0 )
510     {
511         msg_Err( p_demux, "ALSA: cannot set hw parameters (%s)",
512                  snd_strerror( i_err ) );
513         goto adev_fail;
514     }
515
516     /* Get various buffer metrics */
517     snd_pcm_hw_params_get_period_size( p_hw_params, &chunk_size, 0 );
518     snd_pcm_hw_params_get_buffer_size( p_hw_params, &buffer_size );
519     if( chunk_size == buffer_size )
520     {
521         msg_Err( p_demux,
522                  "ALSA: period cannot equal buffer size (%lu == %lu)",
523                  chunk_size, buffer_size);
524         goto adev_fail;
525     }
526
527     int bits_per_sample = snd_pcm_format_physical_width(SND_PCM_FORMAT_S16_LE);
528     int bits_per_frame = bits_per_sample * channels;
529
530     p_sys->i_alsa_chunk_size = chunk_size;
531     p_sys->i_alsa_frame_size = bits_per_frame / 8;
532     p_sys->i_audio_max_frame_size = chunk_size * bits_per_frame / 8;
533
534     snd_pcm_hw_params_free( p_hw_params );
535     p_hw_params = NULL;
536
537     /* Prep device */
538     if( ( i_err = snd_pcm_prepare( p_sys->p_alsa_pcm ) ) < 0 )
539     {
540         msg_Err( p_demux,
541                  "ALSA: cannot prepare audio interface for use (%s)",
542                  snd_strerror( i_err ) );
543         goto adev_fail;
544     }
545
546     snd_pcm_start( p_sys->p_alsa_pcm );
547
548     return VLC_SUCCESS;
549
550  adev_fail:
551
552     if( p_hw_params ) snd_pcm_hw_params_free( p_hw_params );
553     if( p_sys->p_alsa_pcm ) snd_pcm_close( p_sys->p_alsa_pcm );
554     p_sys->p_alsa_pcm = NULL;
555
556     return VLC_EGENERIC;
557
558 }
559
560 static int OpenAudioDev( demux_t *p_demux )
561 {
562     demux_sys_t *p_sys = p_demux->p_sys;
563     if( OpenAudioDevAlsa( p_demux ) != VLC_SUCCESS )
564         return VLC_EGENERIC;
565
566     msg_Dbg( p_demux, "opened adev=`%s' %s %dHz",
567              p_sys->psz_device, p_sys->b_stereo ? "stereo" : "mono",
568              p_sys->i_sample_rate );
569
570     es_format_t fmt;
571     es_format_Init( &fmt, AUDIO_ES, VLC_FOURCC('a','r','a','w') );
572
573     fmt.audio.i_channels = p_sys->b_stereo ? 2 : 1;
574     fmt.audio.i_rate = p_sys->i_sample_rate;
575     fmt.audio.i_bitspersample = 16;
576     fmt.audio.i_blockalign = fmt.audio.i_channels * fmt.audio.i_bitspersample / 8;
577     fmt.i_bitrate = fmt.audio.i_channels * fmt.audio.i_rate * fmt.audio.i_bitspersample;
578
579     msg_Dbg( p_demux, "new audio es %d channels %dHz",
580              fmt.audio.i_channels, fmt.audio.i_rate );
581
582     p_sys->p_es_audio = es_out_Add( p_demux->out, &fmt );
583
584     return VLC_SUCCESS;
585 }
586
587 /*****************************************************************************
588  * ProbeAudioDevAlsa: probe audio for capabilities
589  *****************************************************************************/
590 static bool ProbeAudioDevAlsa( demux_t *p_demux, const char *psz_device )
591 {
592     int i_err;
593     snd_pcm_t *p_alsa_pcm;
594
595     if( ( i_err = snd_pcm_open( &p_alsa_pcm, psz_device, SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK ) ) < 0 )
596     {
597         msg_Err( p_demux, "cannot open device %s for ALSA audio (%s)", psz_device, snd_strerror( i_err ) );
598         return false;
599     }
600
601     snd_pcm_close( p_alsa_pcm );
602
603     return true;
604 }