FFmpeg
Macros | Functions
alsa.c File Reference
#include <alsa/asoundlib.h>
#include "avdevice.h"
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "alsa.h"

Go to the source code of this file.

Macros

#define MAKE_REORDER_FUNC(NAME, TYPE, CHANNELS, LAYOUT, MAP)
 
#define MAKE_REORDER_FUNCS(CHANNELS, LAYOUT, MAP)
 
#define FORMAT_I8   0
 
#define FORMAT_I16   1
 
#define FORMAT_I32   2
 
#define FORMAT_F32   3
 
#define PICK_REORDER(layout)
 

Functions

static av_cold snd_pcm_format_t codec_id_to_pcm_format (int codec_id)
 
 MAKE_REORDER_FUNCS (5, out_50, out[0]=in[0];out[1]=in[1];out[2]=in[3];out[3]=in[4];out[4]=in[2];)
 
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. More...
 
av_cold int ff_alsa_close (AVFormatContext *s1)
 Close the ALSA PCM. More...
 
int ff_alsa_xrun_recover (AVFormatContext *s1, int err)
 Try to recover from ALSA buffer underrun. More...
 
int ff_alsa_extend_reorder_buf (AlsaData *s, int min_size)
 
int ff_alsa_get_device_list (AVDeviceInfoList *device_list, snd_pcm_stream_t stream_type)
 

Detailed Description

ALSA input and output: common code

Author
Luca Abeni ( lucabe72 email it )
Benoit Fouet ( benoit fouet free fr )
Nicolas George ( nicolas george normalesup org )

Definition in file alsa.c.

Macro Definition Documentation

◆ MAKE_REORDER_FUNC

#define MAKE_REORDER_FUNC (   NAME,
  TYPE,
  CHANNELS,
  LAYOUT,
  MAP 
)
Value:
static void alsa_reorder_ ## NAME ## _ ## LAYOUT(const void *in_v, \
void *out_v, \
int n) \
{ \
const TYPE *in = in_v; \
TYPE *out = out_v; \
\
while (n-- > 0) { \
MAP \
in += CHANNELS; \
out += CHANNELS; \
} \
}

Definition at line 65 of file alsa.c.

◆ MAKE_REORDER_FUNCS

#define MAKE_REORDER_FUNCS (   CHANNELS,
  LAYOUT,
  MAP 
)
Value:
MAKE_REORDER_FUNC(int8, int8_t, CHANNELS, LAYOUT, MAP) \
MAKE_REORDER_FUNC(int16, int16_t, CHANNELS, LAYOUT, MAP) \
MAKE_REORDER_FUNC(int32, int32_t, CHANNELS, LAYOUT, MAP) \
MAKE_REORDER_FUNC(f32, float, CHANNELS, LAYOUT, MAP)

Definition at line 80 of file alsa.c.

◆ FORMAT_I8

#define FORMAT_I8   0

◆ FORMAT_I16

#define FORMAT_I16   1

◆ FORMAT_I32

#define FORMAT_I32   2

◆ FORMAT_F32

#define FORMAT_F32   3

◆ PICK_REORDER

#define PICK_REORDER (   layout)
Value:
switch(format) {\
case FORMAT_I8: s->reorder_func = alsa_reorder_int8_out_ ##layout; break;\
case FORMAT_I16: s->reorder_func = alsa_reorder_int16_out_ ##layout; break;\
case FORMAT_I32: s->reorder_func = alsa_reorder_int32_out_ ##layout; break;\
case FORMAT_F32: s->reorder_func = alsa_reorder_f32_out_ ##layout; break;\
}

Function Documentation

◆ codec_id_to_pcm_format()

static av_cold snd_pcm_format_t codec_id_to_pcm_format ( int  codec_id)
static

Definition at line 38 of file alsa.c.

Referenced by ff_alsa_open().

◆ MAKE_REORDER_FUNCS()

MAKE_REORDER_FUNCS ( ,
out_50  ,
out  [0] = in[0]; out[1] = in[1]; out[2] = in[3]; out[3] = in[4]; out[4] = in[2]; 
)

Definition at line 86 of file alsa.c.

◆ ff_alsa_open()

av_cold int ff_alsa_open ( AVFormatContext s,
snd_pcm_stream_t  mode,
unsigned int sample_rate,
int  channels,
enum AVCodecID codec_id 
)

Open an ALSA PCM.

Parameters
smedia file handle
modeeither SND_PCM_STREAM_CAPTURE or SND_PCM_STREAM_PLAYBACK
sample_ratein: requested sample rate; out: actually selected sample rate
channelsnumber of channels
codec_idin: requested AVCodecID or AV_CODEC_ID_NONE; out: actually selected AVCodecID, changed only if AV_CODEC_ID_NONE was requested
Returns
0 if OK, AVERROR_xxx on error

Definition at line 167 of file alsa.c.

Referenced by audio_read_header(), and audio_write_header().

◆ ff_alsa_close()

av_cold int ff_alsa_close ( AVFormatContext s1)

Close the ALSA PCM.

Parameters
s1media file handle
Returns
0

Definition at line 299 of file alsa.c.

◆ ff_alsa_xrun_recover()

int ff_alsa_xrun_recover ( AVFormatContext s1,
int  err 
)

Try to recover from ALSA buffer underrun.

Parameters
s1media file handle
errerror code reported by the previous ALSA call
Returns
0 if OK, AVERROR_xxx on error

Definition at line 314 of file alsa.c.

Referenced by audio_read_packet(), and audio_write_packet().

◆ ff_alsa_extend_reorder_buf()

int ff_alsa_extend_reorder_buf ( AlsaData s,
int  min_size 
)

Definition at line 335 of file alsa.c.

Referenced by audio_write_packet().

◆ ff_alsa_get_device_list()

int ff_alsa_get_device_list ( AVDeviceInfoList device_list,
snd_pcm_stream_t  stream_type 
)

Definition at line 352 of file alsa.c.

Referenced by audio_get_device_list().

FORMAT_I32
#define FORMAT_I32
out
FILE * out
Definition: movenc.c:54
MAKE_REORDER_FUNC
#define MAKE_REORDER_FUNC(NAME, TYPE, CHANNELS, LAYOUT, MAP)
Definition: alsa.c:65
n
int n
Definition: avisynth_c.h:760
FORMAT_I8
#define FORMAT_I8
s
#define s(width, name)
Definition: cbs_vp9.c:257
format
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
int32_t
int32_t
Definition: audio_convert.c:194
TYPE
#define TYPE
Definition: ffv1.h:196
FORMAT_F32
#define FORMAT_F32
layout
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout
Definition: filter_design.txt:18
in
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
Definition: audio_convert.c:326
FORMAT_I16
#define FORMAT_I16
_
#define _
MAP
#define MAP(c, p, v)