1 /* 2 * ALSA input and output 3 * Copyright (c) 2007 Luca Abeni ( lucabe72 email it ) 4 * Copyright (c) 2007 Benoit Fouet ( benoit fouet free fr ) 5 * 6 * This file is part of FFmpeg. 7 * 8 * FFmpeg is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Lesser General Public 10 * License as published by the Free Software Foundation; either 11 * version 2.1 of the License, or (at your option) any later version. 12 * 13 * FFmpeg is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with FFmpeg; if not, write to the Free Software 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21 */ 22 23 /** 24 * @file 25 * ALSA input and output: definitions and structures 26 * @author Luca Abeni ( lucabe72 email it ) 27 * @author Benoit Fouet ( benoit fouet free fr ) 28 */ 29 30 #ifndef AVDEVICE_ALSA_H 31 #define AVDEVICE_ALSA_H 32 33 #include <alsa/asoundlib.h> 34 #include "config.h" 35 #include "libavutil/log.h" 36 #include "timefilter.h" 37 #include "avdevice.h" 38 39 /* XXX: we make the assumption that the soundcard accepts this format */ 40 /* XXX: find better solution with "preinit" method, needed also in 41 other formats */ 42 #define DEFAULT_CODEC_ID AV_NE(AV_CODEC_ID_PCM_S16BE, AV_CODEC_ID_PCM_S16LE) 43 44 typedef void (*ff_reorder_func)(const void *, void *, int); 45 46 #define ALSA_BUFFER_SIZE_MAX 131072 47 48 typedef struct AlsaData { 49 AVClass *class; 50 snd_pcm_t *h; 51 int frame_size; ///< bytes per sample * channels 52 int period_size; ///< preferred size for reads and writes, in frames 53 int sample_rate; ///< sample rate set by user 54 int channels; ///< number of channels set by user 55 int last_period; 56 TimeFilter *timefilter; 57 void (*reorder_func)(const void *, void *, int); 58 void *reorder_buf; 59 int reorder_buf_size; ///< in frames 60 int64_t timestamp; ///< current timestamp, without latency applied. 61 AVPacket *pkt; 62 } AlsaData; 63 64 /** 65 * Open an ALSA PCM. 66 * 67 * @param s media file handle 68 * @param mode either SND_PCM_STREAM_CAPTURE or SND_PCM_STREAM_PLAYBACK 69 * @param sample_rate in: requested sample rate; 70 * out: actually selected sample rate 71 * @param channels number of channels 72 * @param codec_id in: requested AVCodecID or AV_CODEC_ID_NONE; 73 * out: actually selected AVCodecID, changed only if 74 * AV_CODEC_ID_NONE was requested 75 * 76 * @return 0 if OK, AVERROR_xxx on error 77 */ 78 av_warn_unused_result 79 int ff_alsa_open(AVFormatContext *s, snd_pcm_stream_t mode, 80 unsigned int *sample_rate, 81 int channels, enum AVCodecID *codec_id); 82 83 /** 84 * Close the ALSA PCM. 85 * 86 * @param s1 media file handle 87 * 88 * @return 0 89 */ 90 int ff_alsa_close(AVFormatContext *s1); 91 92 /** 93 * Try to recover from ALSA buffer underrun. 94 * 95 * @param s1 media file handle 96 * @param err error code reported by the previous ALSA call 97 * 98 * @return 0 if OK, AVERROR_xxx on error 99 */ 100 av_warn_unused_result 101 int ff_alsa_xrun_recover(AVFormatContext *s1, int err); 102 103 av_warn_unused_result 104 int ff_alsa_extend_reorder_buf(AlsaData *s, int size); 105 106 av_warn_unused_result 107 int ff_alsa_get_device_list(AVDeviceInfoList *device_list, snd_pcm_stream_t stream_type); 108 109 #endif /* AVDEVICE_ALSA_H */ 110