1 WARNING: THINGS DESCRIBED BELOW ARE NOT YET IN THE REPOS. THEY WILL BE,
4 The TLV320AIC3X is a powerful four channel low power audio codec family.
5 More information is available at:
6 http://focus.ti.com/docs/prod/folders/print/tlv320aic34.html
8 http://www.ti.com/lit/gpn/tlv320aic34
10 The codec driver leverages the codecs effects through alsa controls and a
11 hwdep device for controlling the hardware fourth-order IIR filter block.
13 There's an alsa control, "3D Control - Depth" for depth simulation.
14 The rest of the controls are for the IIR filter:
16 1- A control for setting the bass/treble gain, which sets the filter's
17 coefficients to certain precalculated values.
18 2- A control for 'off' / 'on' / 'external control'. 'On' means the
19 bass/treble gain is used, while 'external control' means the
20 coefficients have been set through the hwdep device (see below).
24 The IIR Filter consists of 2 cascaded biquads. The formula is:
26 | (N0 + 2*N1*z^-1 + N2*z^-2) || (N3 + 2*N4*z^-1 + N5*z^-2) |
27 | ------------------------------ || ------------------------------ |
28 | (32768 - 2*D1*z^-1 - D2*z^-2) || (32768 - 2*D4*z^-1 - D5*z^-2) |
31 The filter can be controlled through an alsa hwdep device, via
32 libasound. A short example follows, note that the data struct must be
33 passed *EXACTLY* as shown. Remember to link against libasound:
34 gcc myapp.c -lasound -o myapp
36 -------------------------------EXAMPLE----------------------------------
41 #include <alsa/asoundlib.h>
42 #include <alsa/hwdep.h>
44 struct iirfilter_data {
45 int16_t N0, N1, N2, D1, D2;
46 int16_t N3, N4, N5, D4, D5;
52 struct iirfilter_data data = {
53 .N0 = 27619, .N1 = -27034, .N2 = 26461, .D1 = 32131, .D2 = -31506,
54 .N3 = 27619, .N4 = -27034, .N5 = 26461, .D4 = 32131, .D5 = -31506
58 ret = snd_hwdep_open(&hwdep, "hw:0,0", SND_HWDEP_OPEN_DUPLEX);
62 snd_hwdep_write(hwdep, (void*)&data, sizeof(data));
65 snd_hwdep_read(hwdep, (void*)&data, sizeof(data));
67 /* To enable/disable filtering: */
68 int arg = 1; /* 1 = enable, 0 = disable */
69 snd_hwdep_ioctl(hwdep, 1, &arg);
72 ------------------------------------------------------------------------