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

Go to the source code of this file.

Data Structures

struct  feed_eq_tone
 
struct  feed_eq_info
 

Macros

#define SND_USE_FXDIV
 
#define FEEDEQ_LEVELS
 
#define FEEDEQ_L2GAIN(v)    ((int)min(((v) * FEEDEQ_LEVELS) / 100, FEEDEQ_LEVELS - 1))
 
#define FEEDEQ_PREAMP_IPART(x)   (abs(x) >> FEEDEQ_GAIN_SHIFT)
 
#define FEEDEQ_PREAMP_FPART(x)   (abs(x) & FEEDEQ_GAIN_FMASK)
 
#define FEEDEQ_PREAMP_SIGNVAL(x)   ((x) < 0 ? -1 : 1)
 
#define FEEDEQ_PREAMP_SIGNMARK(x)   (((x) < 0) ? '-' : '+')
 
#define FEEDEQ_PREAMP_IMIN   -192
 
#define FEEDEQ_PREAMP_IMAX   192
 
#define FEEDEQ_PREAMP_FMIN   0
 
#define FEEDEQ_PREAMP_FMAX   9
 
#define FEEDEQ_PREAMP_INVALID   INT_MAX
 
#define FEEDEQ_IF2PREAMP(i, f)
 
#define FEEDEQ_PREAMP_MIN
 
#define FEEDEQ_PREAMP_MAX
 
#define FEEDEQ_PREAMP_DEFAULT   FEEDEQ_IF2PREAMP(0, 0)
 
#define FEEDEQ_PREAMP2IDX(v)
 
#define FEEDEQ_ERR_CLIP_CHECK(...)
 
#define FEEDEQ_CLAMP(v)
 
#define FEEDEQ_DECLARE(SIGN, BIT, ENDIAN)
 
#define FEEDEQ_ENTRY(SIGN, BIT, ENDIAN)
 
#define FEEDEQ_BIQUAD_TAB_SIZE    ((int32_t)(sizeof(feed_eq_biquad_tab) / sizeof(feed_eq_biquad_tab[0])))
 

Typedefs

typedef void(* feed_eq_t) (struct feed_eq_info *, uint8_t *, uint32_t)
 

Functions

 SND_DECLARE_FILE ("$FreeBSD$")
 
 SYSCTL_STRING (_hw_snd, OID_AUTO, feeder_eq_presets, CTLFLAG_RD, &feeder_eq_presets, 0, "compile-time eq presets")
 
 SYSCTL_INT (_hw_snd, OID_AUTO, feeder_eq_exact_rate, CTLFLAG_RWTUN, &feeder_eq_exact_rate, 0, "force exact rate validation")
 
static struct feed_eq_coeff * feed_eq_coeff_rate (uint32_t rate)
 
int feeder_eq_validrate (uint32_t rate)
 
static void feed_eq_reset (struct feed_eq_info *info)
 
static int feed_eq_setup (struct feed_eq_info *info)
 
static int feed_eq_init (struct pcm_feeder *f)
 
static int feed_eq_set (struct pcm_feeder *f, int what, int value)
 
static int feed_eq_free (struct pcm_feeder *f)
 
static int feed_eq_feed (struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b, uint32_t count, void *source)
 
 FEEDER_DECLARE (feeder_eq, NULL)
 
static int32_t feed_eq_scan_preamp_arg (const char *s)
 
static int sysctl_dev_pcm_eq (SYSCTL_HANDLER_ARGS)
 
static int sysctl_dev_pcm_eq_preamp (SYSCTL_HANDLER_ARGS)
 
void feeder_eq_initsys (device_t dev)
 

Variables

static int feeder_eq_exact_rate = 0
 
static char feeder_eq_presets [] = FEEDER_EQ_PRESETS
 
struct {
   uint32_t   format
 
   feed_eq_t   biquad
 
feed_eq_biquad_tab []
 
static struct pcm_feederdesc feeder_eq_desc []
 
static kobj_method_t feeder_eq_methods []
 

Macro Definition Documentation

◆ FEEDEQ_BIQUAD_TAB_SIZE

#define FEEDEQ_BIQUAD_TAB_SIZE    ((int32_t)(sizeof(feed_eq_biquad_tab) / sizeof(feed_eq_biquad_tab[0])))

Definition at line 269 of file feeder_eq.c.

◆ FEEDEQ_CLAMP

#define FEEDEQ_CLAMP (   v)
Value:
(((v) > PCM_S32_MAX) ? PCM_S32_MAX : \
(((v) < PCM_S32_MIN) ? PCM_S32_MIN : \
(v)))
#define PCM_S32_MAX
Definition: pcm.h:95
#define PCM_S32_MIN
Definition: pcm.h:96

Definition at line 140 of file feeder_eq.c.

◆ FEEDEQ_DECLARE

#define FEEDEQ_DECLARE (   SIGN,
  BIT,
  ENDIAN 
)

Definition at line 144 of file feeder_eq.c.

◆ FEEDEQ_ENTRY

#define FEEDEQ_ENTRY (   SIGN,
  BIT,
  ENDIAN 
)
Value:
{ \
AFMT_##SIGN##BIT##_##ENDIAN, \
feed_eq_biquad_##SIGN##BIT##ENDIAN \
}

Definition at line 237 of file feeder_eq.c.

◆ FEEDEQ_ERR_CLIP_CHECK

#define FEEDEQ_ERR_CLIP_CHECK (   ...)

Definition at line 137 of file feeder_eq.c.

◆ FEEDEQ_IF2PREAMP

#define FEEDEQ_IF2PREAMP (   i,
 
)
Value:
((abs(i) << FEEDEQ_GAIN_SHIFT) | \
(((abs(f) / FEEDEQ_GAIN_STEP) * FEEDEQ_GAIN_STEP) & \
FEEDEQ_GAIN_FMASK))

Definition at line 73 of file feeder_eq.c.

◆ FEEDEQ_L2GAIN

#define FEEDEQ_L2GAIN (   v)     ((int)min(((v) * FEEDEQ_LEVELS) / 100, FEEDEQ_LEVELS - 1))

Definition at line 58 of file feeder_eq.c.

◆ FEEDEQ_LEVELS

#define FEEDEQ_LEVELS
Value:
(((FEEDEQ_GAIN_MAX - FEEDEQ_GAIN_MIN) * \
(FEEDEQ_GAIN_DIV / FEEDEQ_GAIN_STEP)) + 1)

Definition at line 54 of file feeder_eq.c.

◆ FEEDEQ_PREAMP2IDX

#define FEEDEQ_PREAMP2IDX (   v)
Value:
((int32_t)((FEEDEQ_GAIN_MAX * (FEEDEQ_GAIN_DIV / \
FEEDEQ_GAIN_STEP)) + (FEEDEQ_PREAMP_SIGNVAL(v) * \
FEEDEQ_PREAMP_IPART(v) * (FEEDEQ_GAIN_DIV / \
FEEDEQ_GAIN_STEP)) + (FEEDEQ_PREAMP_SIGNVAL(v) * \
(FEEDEQ_PREAMP_FPART(v) / FEEDEQ_GAIN_STEP))))
#define FEEDEQ_PREAMP_FPART(x)
Definition: feeder_eq.c:62
#define FEEDEQ_PREAMP_SIGNVAL(x)
Definition: feeder_eq.c:63

Definition at line 88 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_DEFAULT

#define FEEDEQ_PREAMP_DEFAULT   FEEDEQ_IF2PREAMP(0, 0)

Definition at line 86 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_FMAX

#define FEEDEQ_PREAMP_FMAX   9

Definition at line 69 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_FMIN

#define FEEDEQ_PREAMP_FMIN   0

Definition at line 68 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_FPART

#define FEEDEQ_PREAMP_FPART (   x)    (abs(x) & FEEDEQ_GAIN_FMASK)

Definition at line 62 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_IMAX

#define FEEDEQ_PREAMP_IMAX   192

Definition at line 67 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_IMIN

#define FEEDEQ_PREAMP_IMIN   -192

Definition at line 66 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_INVALID

#define FEEDEQ_PREAMP_INVALID   INT_MAX

Definition at line 71 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_IPART

#define FEEDEQ_PREAMP_IPART (   x)    (abs(x) >> FEEDEQ_GAIN_SHIFT)

Definition at line 61 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_MAX

#define FEEDEQ_PREAMP_MAX
Value:
(FEEDEQ_PREAMP_SIGNVAL(FEEDEQ_GAIN_MAX) * \
FEEDEQ_IF2PREAMP(FEEDEQ_GAIN_MAX, 0))

Definition at line 82 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_MIN

#define FEEDEQ_PREAMP_MIN
Value:
(FEEDEQ_PREAMP_SIGNVAL(FEEDEQ_GAIN_MIN) * \
FEEDEQ_IF2PREAMP(FEEDEQ_GAIN_MIN, 0))

Definition at line 78 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_SIGNMARK

#define FEEDEQ_PREAMP_SIGNMARK (   x)    (((x) < 0) ? '-' : '+')

Definition at line 64 of file feeder_eq.c.

◆ FEEDEQ_PREAMP_SIGNVAL

#define FEEDEQ_PREAMP_SIGNVAL (   x)    ((x) < 0 ? -1 : 1)

Definition at line 63 of file feeder_eq.c.

◆ SND_USE_FXDIV

#define SND_USE_FXDIV

Definition at line 46 of file feeder_eq.c.

Typedef Documentation

◆ feed_eq_t

typedef void(* feed_eq_t) (struct feed_eq_info *, uint8_t *, uint32_t)

Definition at line 108 of file feeder_eq.c.

Function Documentation

◆ feed_eq_coeff_rate()

static struct feed_eq_coeff * feed_eq_coeff_rate ( uint32_t  rate)
static

Definition at line 273 of file feeder_eq.c.

References feeder_eq_exact_rate, rate, and spd.

Referenced by feed_eq_setup(), and feeder_eq_validrate().

Here is the caller graph for this function:

◆ feed_eq_feed()

static int feed_eq_feed ( struct pcm_feeder f,
struct pcm_channel c,
uint8_t *  b,
uint32_t  count,
void *  source 
)
static

◆ feed_eq_free()

static int feed_eq_free ( struct pcm_feeder f)
static

Definition at line 431 of file feeder_eq.c.

References pcm_feeder::data, and free.

◆ feed_eq_init()

◆ feed_eq_reset()

static void feed_eq_reset ( struct feed_eq_info info)
static

Definition at line 309 of file feeder_eq.c.

References feed_eq_info::bass, feed_eq_info::channels, feed_eq_tone::i1, feed_eq_tone::i2, feed_eq_tone::o1, feed_eq_tone::o2, and feed_eq_info::treble.

Referenced by feed_eq_set(), and feed_eq_setup().

Here is the caller graph for this function:

◆ feed_eq_scan_preamp_arg()

static int32_t feed_eq_scan_preamp_arg ( const char *  s)
static

Definition at line 502 of file feeder_eq.c.

References buf, FEEDEQ_IF2PREAMP, FEEDEQ_PREAMP_FMAX, FEEDEQ_PREAMP_IMAX, FEEDEQ_PREAMP_INVALID, FEEDEQ_PREAMP_SIGNMARK, len, and r.

Referenced by feeder_eq_initsys(), and sysctl_dev_pcm_eq_preamp().

Here is the caller graph for this function:

◆ feed_eq_set()

◆ feed_eq_setup()

static int feed_eq_setup ( struct feed_eq_info info)
static

Definition at line 326 of file feeder_eq.c.

References feed_eq_info::coeff, feed_eq_coeff_rate(), feed_eq_reset(), and feed_eq_info::rate.

Referenced by feed_eq_init(), and feed_eq_set().

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

◆ FEEDER_DECLARE()

FEEDER_DECLARE ( feeder_eq  ,
NULL   
)

◆ feeder_eq_initsys()

void feeder_eq_initsys ( device_t  dev)

Definition at line 664 of file feeder_eq.c.

References buf, dev, snddev_info::eqpreamp, feed_eq_scan_preamp_arg(), FEEDEQ_PREAMP_DEFAULT, FEEDEQ_PREAMP_INVALID, FEEDEQ_PREAMP_MAX, FEEDEQ_PREAMP_MIN, sysctl_dev_pcm_eq(), and sysctl_dev_pcm_eq_preamp().

Referenced by pcm_sysinit().

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

◆ feeder_eq_validrate()

int feeder_eq_validrate ( uint32_t  rate)

Definition at line 299 of file feeder_eq.c.

References feed_eq_coeff_rate(), and rate.

Referenced by feed_eq_set().

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

◆ SND_DECLARE_FILE()

SND_DECLARE_FILE ( "$FreeBSD$"  )

◆ sysctl_dev_pcm_eq()

static int sysctl_dev_pcm_eq ( SYSCTL_HANDLER_ARGS  )
static

◆ sysctl_dev_pcm_eq_preamp()

static int sysctl_dev_pcm_eq_preamp ( SYSCTL_HANDLER_ARGS  )
static

◆ SYSCTL_INT()

SYSCTL_INT ( _hw_snd  ,
OID_AUTO  ,
feeder_eq_exact_rate  ,
CTLFLAG_RWTUN  ,
feeder_eq_exact_rate,
,
"force exact rate validation"   
)

◆ SYSCTL_STRING()

SYSCTL_STRING ( _hw_snd  ,
OID_AUTO  ,
feeder_eq_presets  ,
CTLFLAG_RD  ,
feeder_eq_presets,
,
"compile-time eq presets"   
)

Variable Documentation

◆ biquad

feed_eq_t biquad

Definition at line 245 of file feeder_eq.c.

◆ 

const struct { ... } feed_eq_biquad_tab[]
Initial value:
= {
FEEDEQ_ENTRY(S, 16, LE),
FEEDEQ_ENTRY(S, 32, LE),
FEEDEQ_ENTRY(S, 16, BE),
FEEDEQ_ENTRY(S, 32, BE),
}
#define FEEDEQ_ENTRY(SIGN, BIT, ENDIAN)
Definition: feeder_eq.c:237

Referenced by feed_eq_init().

◆ feeder_eq_desc

struct pcm_feederdesc feeder_eq_desc[]
static
Initial value:
= {
{ FEEDER_EQ, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 }
}
@ FEEDER_EQ
Definition: feeder.h:86

Definition at line 486 of file feeder_eq.c.

◆ feeder_eq_exact_rate

int feeder_eq_exact_rate = 0
static

Definition at line 95 of file feeder_eq.c.

Referenced by feed_eq_coeff_rate().

◆ feeder_eq_methods

kobj_method_t feeder_eq_methods[]
static
Initial value:
= {
KOBJMETHOD(feeder_init, feed_eq_init),
KOBJMETHOD(feeder_free, feed_eq_free),
KOBJMETHOD(feeder_set, feed_eq_set),
KOBJMETHOD(feeder_feed, feed_eq_feed),
}
static int feed_eq_set(struct pcm_feeder *f, int what, int value)
Definition: feeder_eq.c:379
static int feed_eq_init(struct pcm_feeder *f)
Definition: feeder_eq.c:339
static int feed_eq_feed(struct pcm_feeder *f, struct pcm_channel *c, uint8_t *b, uint32_t count, void *source)
Definition: feeder_eq.c:445
static int feed_eq_free(struct pcm_feeder *f)
Definition: feeder_eq.c:431
#define KOBJMETHOD_END
Definition: midi.c:76

Definition at line 491 of file feeder_eq.c.

◆ feeder_eq_presets

char feeder_eq_presets[] = FEEDER_EQ_PRESETS
static

Definition at line 98 of file feeder_eq.c.

◆ format

uint32_t format

Definition at line 244 of file feeder_eq.c.