FreeBSD kernel sound device code
feeder_chain.c File Reference
#include <dev/sound/pcm/sound.h>
#include "feeder_if.h"
Include dependency graph for feeder_chain.c:

Go to the source code of this file.

Data Structures

struct  feeder_chain_state
 
struct  feeder_chain_desc
 

Macros

#define FEEDER_CHAIN_LEAN   0
 
#define FEEDER_CHAIN_16   1
 
#define FEEDER_CHAIN_32   2
 
#define FEEDER_CHAIN_MULTI   3
 
#define FEEDER_CHAIN_FULLMULTI   4
 
#define FEEDER_CHAIN_LAST   5
 
#define FEEDER_CHAIN_DEFAULT   FEEDER_CHAIN_LEAN
 
#define FEEDER_BW(c, t)   ((c)->t.matrix->channels * (c)->t.rate)
 
#define FEEDRATE_UP(c)   ((c)->target.rate > (c)->current.rate)
 
#define FEEDRATE_DOWN(c)   ((c)->target.rate < (c)->current.rate)
 
#define FEEDRATE_REQUIRED(c)   (FEEDRATE_UP(c) || FEEDRATE_DOWN(c))
 
#define FEEDMATRIX_UP(c)
 
#define FEEDMATRIX_DOWN(c)
 
#define FEEDMATRIX_REQUIRED(c)
 
#define FEEDFORMAT_REQUIRED(c)
 
#define FEEDVOLUME_REQUIRED(c)   ((c)->use_volume != 0)
 
#define FEEDEQ_VALIDRATE(c, t)   (feeder_eq_validrate((c)->t.rate) != 0)
 
#define FEEDEQ_ECONOMY(c)   (FEEDER_BW(c, current) < FEEDER_BW(c, target))
 
#define FEEDEQ_REQUIRED(c)
 
#define FEEDFORMAT_NE_REQUIRED(c)
 
#define VCHAN_PASSTHROUGH(c)
 
#define FEEDER_BUILD(t)
 

Functions

 SND_DECLARE_FILE ("$FreeBSD$")
 
static int feeder_build_format (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_formatne (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_rate (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_matrix (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_volume (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_eq (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_root (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static int feeder_build_mixer (struct pcm_channel *c, struct feeder_chain_desc *cdesc)
 
static void feeder_default_matrix (struct pcmchan_matrix *m, uint32_t fmt, int id)
 
int feeder_chain (struct pcm_channel *c)
 

Variables

static uint32_t feeder_chain_formats_lean []
 
static uint32_t feeder_chain_formats_16 []
 
static uint32_t feeder_chain_formats_32 []
 
static uint32_t feeder_chain_formats_multi []
 
static uint32_t feeder_chain_formats_fullmulti []
 
static uint32_t * feeder_chain_formats [FEEDER_CHAIN_LAST]
 
static int feeder_chain_mode = FEEDER_CHAIN_DEFAULT
 

Macro Definition Documentation

◆ FEEDEQ_ECONOMY

#define FEEDEQ_ECONOMY (   c)    (FEEDER_BW(c, current) < FEEDER_BW(c, target))

Definition at line 550 of file feeder_chain.c.

◆ FEEDEQ_REQUIRED

#define FEEDEQ_REQUIRED (   c)
Value:
((c)->use_eq != 0 && \
FEEDEQ_VALIDRATE(c, current))
struct pcm_channel * c
Definition: channel_if.m:106
#define FEEDEQ_VALIDRATE(c, t)
Definition: feeder_chain.c:549

Definition at line 551 of file feeder_chain.c.

◆ FEEDEQ_VALIDRATE

#define FEEDEQ_VALIDRATE (   c,
 
)    (feeder_eq_validrate((c)->t.rate) != 0)

Definition at line 549 of file feeder_chain.c.

◆ FEEDER_BUILD

#define FEEDER_BUILD (   t)
Value:
do { \
ret = feeder_build_##t(c, &cdesc); \
if (ret != 0) \
return (ret); \
} while (0)

◆ FEEDER_BW

#define FEEDER_BW (   c,
 
)    ((c)->t.matrix->channels * (c)->t.rate)

Definition at line 531 of file feeder_chain.c.

◆ FEEDER_CHAIN_16

#define FEEDER_CHAIN_16   1

Definition at line 65 of file feeder_chain.c.

◆ FEEDER_CHAIN_32

#define FEEDER_CHAIN_32   2

Definition at line 66 of file feeder_chain.c.

◆ FEEDER_CHAIN_DEFAULT

#define FEEDER_CHAIN_DEFAULT   FEEDER_CHAIN_LEAN

Definition at line 76 of file feeder_chain.c.

◆ FEEDER_CHAIN_FULLMULTI

#define FEEDER_CHAIN_FULLMULTI   4

Definition at line 68 of file feeder_chain.c.

◆ FEEDER_CHAIN_LAST

#define FEEDER_CHAIN_LAST   5

Definition at line 69 of file feeder_chain.c.

◆ FEEDER_CHAIN_LEAN

#define FEEDER_CHAIN_LEAN   0

Definition at line 64 of file feeder_chain.c.

◆ FEEDER_CHAIN_MULTI

#define FEEDER_CHAIN_MULTI   3

Definition at line 67 of file feeder_chain.c.

◆ FEEDFORMAT_NE_REQUIRED

#define FEEDFORMAT_NE_REQUIRED (   c)
Value:
((c)->afmt_ne != AFMT_S32_NE && \
(((c)->mode == FEEDER_CHAIN_16 && \
AFMT_ENCODING((c)->current.afmt) != AFMT_S16_NE) || \
((c)->mode == FEEDER_CHAIN_32 && \
AFMT_ENCODING((c)->current.afmt) != AFMT_S32_NE) || \
(c)->mode == FEEDER_CHAIN_FULLMULTI || \
((c)->mode == FEEDER_CHAIN_MULTI && \
((c)->current.afmt & AFMT_8BIT)) || \
((c)->mode == FEEDER_CHAIN_LEAN && \
!((c)->current.afmt & (AFMT_S16_NE | AFMT_S32_NE)))))
#define FEEDER_CHAIN_32
Definition: feeder_chain.c:66
#define FEEDER_CHAIN_LEAN
Definition: feeder_chain.c:64
#define FEEDER_CHAIN_MULTI
Definition: feeder_chain.c:67
#define FEEDER_CHAIN_16
Definition: feeder_chain.c:65
#define FEEDER_CHAIN_FULLMULTI
Definition: feeder_chain.c:68
#define AFMT_ENCODING(v)
Definition: sound.h:222
#define AFMT_8BIT
Definition: sound.h:193

Definition at line 554 of file feeder_chain.c.

◆ FEEDFORMAT_REQUIRED

#define FEEDFORMAT_REQUIRED (   c)
Value:
(AFMT_ENCODING((c)->current.afmt) != \
AFMT_ENCODING((c)->target.afmt))

Definition at line 544 of file feeder_chain.c.

◆ FEEDMATRIX_DOWN

#define FEEDMATRIX_DOWN (   c)
Value:
((c)->target.matrix->channels < \
(c)->current.matrix->channels)

Definition at line 539 of file feeder_chain.c.

◆ FEEDMATRIX_REQUIRED

#define FEEDMATRIX_REQUIRED (   c)
Value:
FEEDMATRIX_DOWN(c) || (c)->use_matrix != 0)
#define FEEDMATRIX_UP(c)
Definition: feeder_chain.c:537

Definition at line 541 of file feeder_chain.c.

◆ FEEDMATRIX_UP

#define FEEDMATRIX_UP (   c)
Value:
((c)->target.matrix->channels > \
(c)->current.matrix->channels)

Definition at line 537 of file feeder_chain.c.

◆ FEEDRATE_DOWN

#define FEEDRATE_DOWN (   c)    ((c)->target.rate < (c)->current.rate)

Definition at line 534 of file feeder_chain.c.

◆ FEEDRATE_REQUIRED

#define FEEDRATE_REQUIRED (   c)    (FEEDRATE_UP(c) || FEEDRATE_DOWN(c))

Definition at line 535 of file feeder_chain.c.

◆ FEEDRATE_UP

#define FEEDRATE_UP (   c)    ((c)->target.rate > (c)->current.rate)

Definition at line 533 of file feeder_chain.c.

◆ FEEDVOLUME_REQUIRED

#define FEEDVOLUME_REQUIRED (   c)    ((c)->use_volume != 0)

Definition at line 547 of file feeder_chain.c.

◆ VCHAN_PASSTHROUGH

#define VCHAN_PASSTHROUGH (   c)
Value:
(((c)->flags & (CHN_F_VIRTUAL | \
#define CHN_F_PASSTHROUGH
Definition: channel.h:378
#define CHN_F_VIRTUAL
Definition: channel.h:376

Function Documentation

◆ feeder_build_eq()

◆ feeder_build_format()

static int feeder_build_format ( struct pcm_channel c,
struct feeder_chain_desc cdesc 
)
static

Definition at line 140 of file feeder_chain.c.

References feeder_chain_state::afmt, c, chn_addfeeder(), feeder_chain_desc::current, desc, feeder_chain_desc::desc, pcm_channel::dev, FEEDER_FORMAT, feeder_getclass(), pcm_channel::feederflags, and feeder_chain_desc::target.

Referenced by feeder_build_formatne().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ feeder_build_formatne()

static int feeder_build_formatne ( struct pcm_channel c,
struct feeder_chain_desc cdesc 
)
static

◆ feeder_build_matrix()

◆ feeder_build_mixer()

static int feeder_build_mixer ( struct pcm_channel c,
struct feeder_chain_desc cdesc 
)
static

◆ feeder_build_rate()

◆ feeder_build_root()

static int feeder_build_root ( struct pcm_channel c,
struct feeder_chain_desc cdesc 
)
static

◆ feeder_build_volume()

◆ feeder_chain()

int feeder_chain ( struct pcm_channel c)

Definition at line 581 of file feeder_chain.c.

References feeder_chain_state::afmt, AFMT_24BIT, AFMT_32BIT, AFMT_CHANNEL, AFMT_CONVERTIBLE, AFMT_ENCODING, AFMT_EXTCHANNEL, feeder_chain_desc::afmt_ne, AFMT_PASSTHROUGH, pcm_channel::bufhard, pcm_channel::bufsoft, c, pcmchan_caps::caps, pcmchan_matrix::channels, CHN_BITPERFECT, CHN_DIRSTR, CHN_F_HAS_VCHAN, CHN_F_VIRTUAL, chn_getcaps(), CHN_LOCKASSERT, chn_removefeeder(), chn_syncstate(), feeder_chain_desc::current, pcm_channel::dev, pcm_channel::devinfo, pcm_channel::direction, feeder_chain_desc::dummy, feeder_chain_desc::expensive, pcmchan_matrix::ext, FEEDEQ_ECONOMY, FEEDEQ_REQUIRED, FEEDEQ_VALIDRATE, pcm_channel::feeder, FEEDER_BUILD, FEEDER_CHAIN_16, FEEDER_CHAIN_32, FEEDER_CHAIN_DEFAULT, feeder_chain_formats, FEEDER_CHAIN_FULLMULTI, FEEDER_CHAIN_LEAN, feeder_chain_mode, FEEDER_CHAIN_MULTI, feeder_default_matrix(), feeder_matrix_compare(), feeder_matrix_format_map(), pcm_channel::feederflags, FEEDFORMAT_NE_REQUIRED, FEEDFORMAT_REQUIRED, FEEDMATRIX_DOWN, FEEDMATRIX_REQUIRED, FEEDMATRIX_UP, FEEDRATE_DOWN, FEEDRATE_REQUIRED, FEEDRATE_UP, FEEDVOLUME_REQUIRED, pcm_channel::flags, snddev_info::flags, pcmchan_caps::fmtlist, format, pcm_channel::format, pcmchan_matrix::id, pcm_channel::matrix, feeder_chain_state::matrix, pcm_channel::matrix_scratch, pcm_channel::methods, mixer, feeder_chain_desc::mode, feeder_chain_desc::origin, pcm_channel::parentchannel, pcm_channel::parentsnddev, PCMDIR_PLAY, PCMDIR_REC, rate, feeder_chain_state::rate, SD_F_EQ, SD_F_EQ_PC, SD_F_SOFTPCMVOL, SD_F_VPC, SND_CHN_MATRIX_PCMCHANNEL, SND_CHN_MATRIX_UNKNOWN, snd_fmtbest(), snd_fmtvalid(), SND_FORMAT, sndbuf_getspd(), sndbuf_setfmt(), sndbuf_setspd(), pcm_channel::speed, feeder_chain_desc::target, feeder_chain_desc::use_eq, feeder_chain_desc::use_matrix, feeder_chain_desc::use_volume, and VCHAN_PASSTHROUGH.

Referenced by chn_setparam(), and vchan_sync().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ feeder_default_matrix()

static void feeder_default_matrix ( struct pcmchan_matrix m,
uint32_t  fmt,
int  id 
)
static

Definition at line 567 of file feeder_chain.c.

References AFMT_CHANNEL, AFMT_EXTCHANNEL, pcmchan_matrix::channels, pcmchan_matrix::ext, fmt, id, pcmchan_matrix::id, m, pcmchan_matrix::offset, and SND_CHN_T_MAX.

Referenced by feeder_chain().

Here is the caller graph for this function:

◆ SND_DECLARE_FILE()

SND_DECLARE_FILE ( "$FreeBSD$"  )

Variable Documentation

◆ feeder_chain_formats

uint32_t* feeder_chain_formats[FEEDER_CHAIN_LAST]
static
Initial value:
= {
}
static uint32_t feeder_chain_formats_fullmulti[]
Definition: feeder_chain.c:111
static uint32_t feeder_chain_formats_16[]
Definition: feeder_chain.c:91
static uint32_t feeder_chain_formats_32[]
Definition: feeder_chain.c:97
static uint32_t feeder_chain_formats_lean[]
Definition: feeder_chain.c:85
static uint32_t feeder_chain_formats_multi[]
Definition: feeder_chain.c:103

Definition at line 119 of file feeder_chain.c.

Referenced by feeder_chain().

◆ feeder_chain_formats_16

uint32_t feeder_chain_formats_16[]
static
Initial value:
= {
AFMT_S16_NE,
0
}

Definition at line 91 of file feeder_chain.c.

◆ feeder_chain_formats_32

uint32_t feeder_chain_formats_32[]
static
Initial value:
= {
AFMT_S32_NE,
0
}

Definition at line 97 of file feeder_chain.c.

◆ feeder_chain_formats_fullmulti

uint32_t feeder_chain_formats_fullmulti[]
static
Initial value:
= {
AFMT_S8, AFMT_U8,
AFMT_S16_LE, AFMT_S16_BE, AFMT_U16_LE, AFMT_U16_BE,
AFMT_S24_LE, AFMT_S24_BE, AFMT_U24_LE, AFMT_U24_BE,
AFMT_S32_LE, AFMT_S32_BE, AFMT_U32_LE, AFMT_U32_BE,
0
}

Definition at line 111 of file feeder_chain.c.

◆ feeder_chain_formats_lean

uint32_t feeder_chain_formats_lean[]
static
Initial value:
= {
AFMT_S16_NE, AFMT_S32_NE,
0
}

Definition at line 85 of file feeder_chain.c.

◆ feeder_chain_formats_multi

uint32_t feeder_chain_formats_multi[]
static
Initial value:
= {
AFMT_S16_LE, AFMT_S16_BE, AFMT_U16_LE, AFMT_U16_BE,
AFMT_S24_LE, AFMT_S24_BE, AFMT_U24_LE, AFMT_U24_BE,
AFMT_S32_LE, AFMT_S32_BE, AFMT_U32_LE, AFMT_U32_BE,
0
}

Definition at line 103 of file feeder_chain.c.

◆ feeder_chain_mode

int feeder_chain_mode = FEEDER_CHAIN_DEFAULT
static

Definition at line 127 of file feeder_chain.c.

Referenced by feeder_chain().