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: input
26 * @author Luca Abeni ( lucabe72 email it )
27 * @author Benoit Fouet ( benoit fouet free fr )
28 * @author Nicolas George ( nicolas george normalesup org )
29 *
30 * This avdevice decoder can capture audio from an ALSA (Advanced
31 * Linux Sound Architecture) device.
32 *
33 * The filename parameter is the name of an ALSA PCM device capable of
34 * capture, for example "default" or "plughw:1"; see the ALSA documentation
35 * for naming conventions. The empty string is equivalent to "default".
36 *
37 * The capture period is set to the lower value available for the device,
38 * which gives a low latency suitable for real-time capture.
39 *
40 * The PTS are an Unix time in microsecond.
41 *
42 * Due to a bug in the ALSA library
43 * (https://bugtrack.alsa-project.org/alsa-bug/view.php?id=4308), this
44 * decoder does not work with certain ALSA plugins, especially the dsnoop
45 * plugin.
46 */
47
48 #include <alsa/asoundlib.h>
49
54
56
59
61 {
64 int ret;
66
68 if (!st) {
70
72 }
74
76 &codec_id);
77 if (ret < 0) {
79 }
80
81 /* take real parameters */
88 /* microseconds instead of seconds, MHz instead of Hz */
93
94 return 0;
95
99 }
100
102 {
104 int res;
105 int64_t dts;
106 snd_pcm_sframes_t delay = 0;
107
110 }
111
113 if (res == -EAGAIN) {
115
117 }
120 snd_strerror(res));
122
124 }
126 }
127
129 snd_pcm_delay(s->
h, &delay);
133
135
136 return 0;
137 }
138
140 {
142 }
143
148 };
149
156 };
157
167 .priv_class = &alsa_demuxer_class,
168 };
#define LIBAVUTIL_VERSION_INT
void ff_timefilter_reset(TimeFilter *self)
Reset the filter.
static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
const char * av_default_item_name(void *ptr)
Return the context name.
int frame_size
Audio only.
ALSA input and output: definitions and structures.
static const AVOption options[]
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
static av_cold int read_close(AVFormatContext *ctx)
Main libavdevice API header.
int av_new_packet(AVPacket *pkt, int size)
Allocate the payload of a packet and initialize its fields with default values.
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
enum AVMediaType codec_type
General type of the encoded data.
common internal API header
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
enum AVCodecID audio_codec_id
Forced audio codec_id.
static int audio_get_device_list(AVFormatContext *h, AVDeviceInfoList *device_list)
int channels
number of channels set by user
static int read_header(FFV1Context *f)
int64_t av_gettime(void)
Get the current time in microseconds.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
TimeFilter * ff_timefilter_new(double time_base, double period, double bandwidth)
Create a new Delay Locked Loop time filter.
int ff_alsa_xrun_recover(AVFormatContext *s1, int err)
Try to recover from ALSA buffer underrun.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
av_cold int ff_alsa_close(AVFormatContext *s1)
Close the ALSA PCM.
Describe the class of an AVClass context structure.
int ff_alsa_get_device_list(AVDeviceInfoList *device_list, snd_pcm_stream_t stream_type)
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
int period_size
preferred size for reads and writes, in frames
int sample_rate
Audio only.
double ff_timefilter_update(TimeFilter *self, double system_time, double period)
Update the filter.
void * priv_data
Format private data.
static av_cold int audio_read_header(AVFormatContext *s1)
int frame_size
bytes per sample * channels
int sample_rate
sample rate set by user
AVCodecParameters * codecpar
Codec parameters associated with this stream.
static const AVClass alsa_demuxer_class
AVInputFormat ff_alsa_demuxer
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
av_cold int ff_alsa_open(AVFormatContext *ctx, snd_pcm_stream_t mode, unsigned int *sample_rate, int channels, enum AVCodecID *codec_id)
Open an ALSA PCM.