1 /*=================================================================\r
2 * sysdrc.c: DRC creation routines.\r
3 *=================================================================*/\r
4 \r
5 #include <xdc/std.h>\r
6 #include <ti/sysbios/BIOS.h>\r
7 #include <xdc/runtime/System.h>\r
8 \r
9 #include <types.h>\r
10 #include <ti/mas/fract/fract.h>\r
11 #include <ti/mas/util/ecomem.h>\r
12 \r
13 #include <ti/mas/aer/drc.h>\r
14 \r
15 #include "sys.h"\r
16 \r
17 drcSizeConfig_t drcSizeConfig = {\r
18 drc_SAMP_RATE_16K, /* sampling rate */\r
19 16*drc_SAMP_RATE_16K /* 2ms maximum forward looking limiter delay in samples */\r
20 };\r
21 \r
22 drcOpenConfig_t drcOpenConfig = { /* for drcOpen */\r
23 ((1<<drc_CFGBITS_FBAND) | /* use full-band operation */\r
24 (1<<drc_CFGBITS_LIM) | /* use limiter */\r
25 (1<<drc_CFGBITS_VAD)), /* update gains only during speech */\r
26 drc_SAMP_RATE_16K /* sampling rate */\r
27 };\r
28 \r
29 static void sysDbgInfo (void *handle, tuint par1, tuint par2, tuint par3, tuint *ptr)\r
30 {\r
31 return;\r
32 } /* dummy sysDbgInfo */\r
33 \r
34 /*=================================================================\r
35 * void sysDrcCreate(void) Create DRC\r
36 *=================================================================*/\r
37 void sysDrcCreate(void)\r
38 {\r
39 int err;\r
40 tint nbufs;\r
41 const ecomemBuffer_t *bufs;\r
42 drcNewConfig_t drcNewConfig;\r
43 drcControl_t drcCtl;\r
44 \r
45 drcCreateConfig_t drcCreateConfig = {sysDbgInfo}; /* pointer to a dummy debug info (not used in DRC) */\r
46 \r
47 System_printf("...Initializing DRC\n");\r
48 System_flush();\r
49 \r
50 /* Create DRC Context */\r
51 err = drcCreate (&drcCreateConfig);\r
52 if (err != drc_NOERR) {\r
53 System_printf("*** drcCreate() error: %d\n", err);\r
54 BIOS_exit(0);\r
55 }\r
56 \r
57 /* Configure DRC */\r
58 err = drcGetSizes(&nbufs, &bufs, &drcSizeConfig);\r
59 if (err != drc_NOERR) {\r
60 System_printf("*** drcGetSizes error: %d\n", err);\r
61 BIOS_exit(0);\r
62 }\r
63 \r
64 /* Allocate memory for beamformer */\r
65 if (nbufs > SYS_COMP_MAXBUFS) {\r
66 System_printf("*** not enough buffer descriptors");\r
67 BIOS_exit(0);\r
68 }\r
69 \r
70 drcNewConfig.sizeCfg = drcSizeConfig;\r
71 err = sysHeapAllocAll(nbufs, sysCompBufs, (const void*)bufs);\r
72 SYS_CHECK_ERROR(err);\r
73 \r
74 /* Give memory to DRC */\r
75 drcNewConfig.handle = (void*)0; /* Indicate instance #0 */\r
76 sysContext.drcInst_p = NULL;\r
77 err = drcNew(&sysContext.drcInst_p, nbufs, sysCompBufs, &drcNewConfig);\r
78 if (err != drc_NOERR) {\r
79 System_printf("*** drcNew() error: %d\n", err);\r
80 BIOS_exit(0);\r
81 }\r
82 \r
83 /* Open DRC for business */\r
84 err = drcOpen(sysContext.drcInst_p,&drcOpenConfig);\r
85 if (err != drc_NOERR) {\r
86 System_printf("*** drcOpen() error: %d\n", err);\r
87 BIOS_exit(0);\r
88 }\r
89 /* At this point DRC is open, but DISABLED! */\r
90 /* We need to do a few additional configurations through drcControl() */\r
91 \r
92 /* Set the full band companding curve */\r
93 drcCtl.ctl_code = drc_CTL_SET_FBAND;\r
94 drcCtl.u.band.valid_bitfield = (1u<<drc_BAND_CFG_VALID_CURVE_PARAM_BIT);\r
95 drcCtl.u.band.curve.exp_knee = sysContext.drc_exp_knee; /* in dBm0! */\r
96 drcCtl.u.band.curve.ratios = frctAdjustQ(2,0,4) | (frctAdjustQ(2,0,4) << 8);\r
97 drcCtl.u.band.curve.max_amp = sysContext.drc_max_amp; /* in dB */\r
98 drcCtl.u.band.curve.com_knee = -15; /* -15dBm0 */\r
99 drcCtl.u.band.curve.energy_lim = -3; /* -3dBm0 */\r
100 err = drcControl (sysContext.drcInst_p, &drcCtl);\r
101 if (err != drc_NOERR) {\r
102 System_printf("*** drcControl() config full band error: %d\n", err);\r
103 BIOS_exit(0);\r
104 }\r
105 \r
106 /* Set the limiter configuration */\r
107 drcCtl.ctl_code = drc_CTL_SET_LIM;\r
108 drcCtl.u.limiter.valid_bitfield = (1u<<drc_LIM_CFG_VALID_THRESH_BIT) |\r
109 (1u<<drc_LIM_CFG_VALID_DELAY_BIT);\r
110 drcCtl.u.limiter.thresh_dBm = -3; /* -3dBm0 */\r
111 drcCtl.u.limiter.delay_len = (8*drc_SAMP_RATE_16K); /* just the current value! */\r
112 err = drcControl (sysContext.drcInst_p, &drcCtl);\r
113 if (err != drc_NOERR) {\r
114 System_printf("*** drcControl() config limiter error: %d\n", err);\r
115 BIOS_exit(0);\r
116 }\r
117 \r
118 /* Turn DRC on */\r
119 if (sysContext.drc_enable) {\r
120 drcCtl.ctl_code = drc_CTL_DRC_ON;\r
121 err = drcControl (sysContext.drcInst_p, &drcCtl);\r
122 if (err != drc_NOERR) {\r
123 System_printf("*** drcControl() enable error: %d\n", err);\r
124 BIOS_exit(0);\r
125 }\r
126 }\r
127 \r
128 System_printf("Done with DRC\n");\r
129 System_flush();\r
130 \r
131 } /* sysDrcCreate */\r
132 \r
133 /* nothing past this point */\r
134 \r