realtime_demo_bios: add the DRC support
authorMing Wei <a0868762@ti.com>
Wed, 18 Jan 2017 00:02:59 +0000 (18:02 -0600)
committerMing Wei <a0868762@ti.com>
Wed, 18 Jan 2017 00:02:59 +0000 (18:02 -0600)
Signed-off-by: Ming Wei <a0868762@ti.com>
common/components/sys.c
common/components/sys.h
common/components/sysdrc.c [new file with mode: 0644]
realtime_demo_bios/k2g/.project
realtime_demo_bios/k2g/build/makefile
realtime_demo_bios/k2g/build/subdir_rules.mk
realtime_demo_bios/k2g/build/subdir_vars.mk

index ae625868506f713dc32a301ec9ed0ac20b4a1daf..80a68d07c05cbcd8aaf17225de89eeef8aaeded9 100644 (file)
@@ -170,13 +170,22 @@ int sysCreate(sysConfig_t *cfg)
   sysContext.use_fileio      = cfg->use_fileio;   /* probably FALSE since slow */\r
   sysContext.eof             = FALSE;             /* no EOF reached yet */\r
   sysContext.use_default     = cfg->use_default;  /* TRUE for default vmic angles */\r
+  for (k = 0; k < 3; k++) {\r
+    sysContext.asnr_attn[k] = cfg->asnr_attn[k];\r
+  }\r
+  sysContext.asnr_delay   = cfg->asnr_delay;\r
+  sysContext.asnr_enable  = cfg->asnr_enable;\r
+  sysContext.vad_enable   = cfg->vad_enable;\r
+  sysContext.drc_exp_knee = cfg->drc_exp_knee;\r
+  sysContext.drc_max_amp  = cfg->drc_max_amp;\r
+  sysContext.drc_enable   = cfg->drc_enable;\r
 \r
   /* Initialize input buffer pointers and read portion */\r
   sysContext.in_lo = &sysInBuf[0];                /* Input buffer start (Low part) */\r
   sysContext.in_hi = &sysInBuf[SYS_IN_SIZE/2];    /* High part of input buffer */\r
   sysContext.in_w  = sysContext.in_lo;            /* Write pointer */\r
   sysContext.in_r  = sysContext.in_hi;            /* Read pointer */\r
-  memset(sysContext.in_r, 0xBA, SYS_IN_SIZE/2);   /* Initial the read portion */\r
+  memset(sysContext.in_r, 0xBA, SYS_IN_SIZE/2);   /* Initialize the read portion */\r
 \r
   /* Clear instance pointers */\r
   for (k = 0; k < SYS_VMICS_MAX; k++) {\r
@@ -250,6 +259,7 @@ void sysError(int err)
 \r
 int sysHeapAlloc(void *bd_in, tint reset)\r
 {\r
+  int     err = SYS_ERR_SUCCESS;\r
   tuint   size;\r
   void    *handle;\r
   tword   *base_w;\r
@@ -291,7 +301,10 @@ int sysHeapAlloc(void *bd_in, tint reset)
 \r
   bd_p->base = base_w;      /* store the bsae address for a buffer */\r
 \r
-  return(SYS_ERR_SUCCESS);\r
+  if (base_w == NULL) {\r
+    err = SYS_ERR_NOMEMORY;\r
+  }\r
+  return(err);\r
 } /* sysHeapAlloc */\r
 \r
 /*=================================================================\r
index d0fa142bda91aebcce35c2ce7eca30f583d70b92..4a241721700b29e7faa75d94edf99aecc07573f1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, Texas Instruments Incorporated
+ * Copyright (c) 2017, Texas Instruments Incorporated\r
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -55,6 +55,7 @@
 #define SYS_FRAME_SIZE        (TYP_LINSAMPLE_SIZE*SYS_FRAME_LENGTH/TYP_TWORD_SIZE)  /* Frame size in bytes */\r
 #define SYS_IN_LENGTH         (2L*SYS_FRAME_LENGTH*SYS_MICS_MAX)                    /* Input buffer length (dual) */\r
 #define SYS_IN_SIZE           (TYP_LINSAMPLE_SIZE*SYS_IN_LENGTH/TYP_TWORD_SIZE)     /* # of words in input buffer */\r
+#define SYS_USE_DRC           1                                                                                                /* Do we want use DRC */\r
 \r
 /*======================================================================\r
  * Bit masks, bit-mask handling macros, error codes\r
@@ -88,6 +89,7 @@
 #define SYS_ERR_MSSDEBUG      (-15)\r
 #define SYS_ERR_ANGLECONFIG   (-16)\r
 #define SYS_ERR_VAUERROR      (-17)\r
+#define SYS_ERR_NOMEMORY      (-18)\r
 \r
 /*======================================================================\r
  * System Data Types\r
 struct sysConfig_stc {\r
   tint  nmics;        /* The actual number of microphones in ths system */\r
   tint  nvmics;       /* The acutal number of virtual microphones in the system */\r
-  tbool use_fileio;   /* Use file I/O to load microphone files */\r
-  tbool use_default;  /* Use default angles for virtual microphones */\r
+  tint  asnr_delay;   /* delay in ms. Default is 5ms. */\r
+  tint  asnr_attn[3]; /* band1, band2, band3 attenutation for ASNR (dB) */\r
+  tint  asnr_enable;  /* TRUE: enable ASNR, FALSE: disable it */\r
+  tint  use_fileio;   /* Use file I/O to load microphone files */\r
+  tint  use_default;  /* Use default angles for virtual microphones */\r
+  tint  vad_enable;   /* TRUE: enable VAD, FALSE: disable it */\r
+  tint  drc_exp_knee; /* in dBm0! (default was -50dBm0 */\r
+  tint  drc_max_amp;  /* max gain in dB (default was 6dB */\r
+  tint  drc_enable;   /* TRUE: enable DRC, FALSE: disable it */\r
 };\r
 typedef struct sysConfig_stc sysConfig_t;\r
 \r
@@ -136,12 +145,20 @@ struct sysContext_stc {
   void *asnrInst_p[SYS_VMICS_MAX];    /* ASNR instance pointers */\r
   void *mssInst_p;                    /* MSS instance pointer */\r
   void *vauInst_p;                    /* VAU instance pointer */\r
+  void *drcInst_p;                    /* DRC instance pointer */\r
 \r
   tint vmicangles[SYS_VMICS_MAX];     /* use SYS_BF_ANGLE_xxx from sysbfflt.h */\r
 \r
-  tbool use_fileio;   /* Use file I/O to load microphone files */\r
-  tbool eof;          /* End of file reached */\r
-  tbool use_default;  /* Use default vmic angles (4,6,8,12 vmics supported only) */\r
+  tint  asnr_delay;   /* in ms. Default is 5ms. */\r
+  tint  asnr_attn[3]; /* band 1,2,3 attenutations in dB */\r
+  tint  asnr_enable;  /* TRUE: enable, FALSE: disable ASNR */\r
+  tint  use_fileio;   /* Use file I/O to load microphone files */\r
+  tint  eof;          /* End of file reached */\r
+  tint  use_default;  /* Use default vmic angles (4,6,8,12 vmics supported only) */\r
+  tint  vad_enable;   /* TRUE: enable VAD, FALSE: disable it */\r
+  tint  drc_exp_knee; /* in dBm0 (default was -50dBm0 */\r
+  tint  drc_max_amp;  /* max gain in dB (default was 6dB */\r
+  tint  drc_enable;   /* TRUE: enable DRC, FALSE: disable it */\r
 };\r
 typedef struct sysContext_stc  sysContext_t;\r
 \r
@@ -153,7 +170,7 @@ extern sysContext_t sysContext;         /* Defined in sys.c */
 extern tint         sysBfVMicAngles[];  /* Defined in sys.c */\r
 \r
 /* Buffer descriptor array for memory allocations */\r
-#define SYS_COMP_MAXBUFS    10\r
+#define SYS_COMP_MAXBUFS    12\r
 extern ecomemBuffer_t sysCompBufs[];\r
 \r
 /*======================================================================\r
@@ -183,6 +200,9 @@ extern void sysAsnrCreate(void);      /* Create all active ASNR's */
 /* sysmss.c */\r
 extern void sysMssCreate(void);       /* Create the MSS module */\r
 \r
+/* sysdrc.c */\r
+extern void sysDrcCreate(void);       /* Create the DRC module */\r
+\r
 /* sysvau.c */\r
 extern void sysVauCreate(void);       /* Create the VAU module */\r
 \r
diff --git a/common/components/sysdrc.c b/common/components/sysdrc.c
new file mode 100644 (file)
index 0000000..e789f24
--- /dev/null
@@ -0,0 +1,134 @@
+/*=================================================================\r
+ *  sysdrc.c: DRC creation routines.\r
+ *=================================================================*/\r
+\r
+#include <xdc/std.h>\r
+#include <ti/sysbios/BIOS.h>\r
+#include <xdc/runtime/System.h>\r
+\r
+#include <ti/mas/types/types.h>\r
+#include <ti/mas/fract/fract.h>\r
+#include <ti/mas/util/ecomem.h>\r
+\r
+#include <ti/mas/aer/drc.h>\r
+\r
+#include "sys.h"\r
+\r
+drcSizeConfig_t drcSizeConfig = {\r
+  drc_SAMP_RATE_16K,          /* sampling rate */\r
+  16*drc_SAMP_RATE_16K        /* 2ms maximum forward looking limiter delay in samples */\r
+};\r
+\r
+drcOpenConfig_t drcOpenConfig = {   /* for drcOpen */\r
+  ((1<<drc_CFGBITS_FBAND) |   /* use full-band operation */\r
+   (1<<drc_CFGBITS_LIM)   |   /* use limiter */\r
+   (1<<drc_CFGBITS_VAD)),     /* update gains only during speech */\r
+  drc_SAMP_RATE_16K           /* sampling rate */\r
+};\r
+\r
+static void sysDbgInfo (void *handle, tuint par1, tuint par2, tuint par3, tuint *ptr)\r
+{\r
+  return;\r
+} /* dummy sysDbgInfo */\r
+\r
+/*=================================================================\r
+ *  void sysDrcCreate(void)     Create DRC\r
+ *=================================================================*/\r
+void sysDrcCreate(void)\r
+{\r
+  int   err;\r
+  tint  nbufs;\r
+  const ecomemBuffer_t  *bufs;\r
+  drcNewConfig_t drcNewConfig;\r
+  drcControl_t   drcCtl;\r
+\r
+  drcCreateConfig_t drcCreateConfig = {sysDbgInfo}; /* pointer to a dummy debug info (not used in DRC) */\r
+\r
+  System_printf("...Initializing DRC\n");\r
+  System_flush();\r
+\r
+  /* Create DRC Context */\r
+  err = drcCreate (&drcCreateConfig);\r
+  if (err != drc_NOERR) {\r
+    System_printf("*** drcCreate() error: %d\n", err);\r
+    BIOS_exit(0);\r
+  }\r
+\r
+  /* Configure DRC */\r
+  err = drcGetSizes(&nbufs, &bufs, &drcSizeConfig);\r
+  if (err != drc_NOERR) {\r
+    System_printf("*** drcGetSizes error: %d\n", err);\r
+    BIOS_exit(0);\r
+  }\r
+\r
+  /* Allocate memory for beamformer */\r
+  if (nbufs > SYS_COMP_MAXBUFS) {\r
+    System_printf("*** not enough buffer descriptors");\r
+    BIOS_exit(0);\r
+  }\r
+\r
+  drcNewConfig.sizeCfg = drcSizeConfig;\r
+  err = sysHeapAllocAll(nbufs, sysCompBufs, (const void*)bufs);\r
+  SYS_CHECK_ERROR(err);\r
+  \r
+  /* Give memory to DRC */\r
+  drcNewConfig.handle = (void*)0;     /* Indicate instance #0 */\r
+  sysContext.drcInst_p = NULL;\r
+  err = drcNew(&sysContext.drcInst_p, nbufs, sysCompBufs, &drcNewConfig);\r
+  if (err != drc_NOERR) {\r
+    System_printf("*** drcNew() error: %d\n", err);\r
+    BIOS_exit(0);\r
+  }\r
+\r
+  /* Open DRC for business */\r
+  err = drcOpen(sysContext.drcInst_p,&drcOpenConfig);\r
+  if (err != drc_NOERR) {\r
+    System_printf("*** drcOpen() error: %d\n", err);\r
+      BIOS_exit(0);\r
+  }\r
+  /* At this point DRC is open, but DISABLED! */\r
+  /* We need to do a few additional configurations through drcControl() */\r
+\r
+  /* Set the full band companding curve */\r
+  drcCtl.ctl_code = drc_CTL_SET_FBAND;\r
+  drcCtl.u.band.valid_bitfield    = (1u<<drc_BAND_CFG_VALID_CURVE_PARAM_BIT);\r
+  drcCtl.u.band.curve.exp_knee    = sysContext.drc_exp_knee;    /* in dBm0! */\r
+  drcCtl.u.band.curve.ratios      = frctAdjustQ(2,0,4) | (frctAdjustQ(2,0,4) << 8);\r
+  drcCtl.u.band.curve.max_amp     = sysContext.drc_max_amp;     /* in dB */\r
+  drcCtl.u.band.curve.com_knee    = -15;    /* -15dBm0 */\r
+  drcCtl.u.band.curve.energy_lim  = -3;     /* -3dBm0 */\r
+  err = drcControl (sysContext.drcInst_p, &drcCtl);\r
+  if (err != drc_NOERR) {\r
+    System_printf("*** drcControl() config full band error: %d\n", err);\r
+    BIOS_exit(0);\r
+  }\r
+\r
+  /* Set the limiter configuration */\r
+  drcCtl.ctl_code = drc_CTL_SET_LIM;\r
+  drcCtl.u.limiter.valid_bitfield = (1u<<drc_LIM_CFG_VALID_THRESH_BIT) |\r
+                                    (1u<<drc_LIM_CFG_VALID_DELAY_BIT);\r
+  drcCtl.u.limiter.thresh_dBm = -3;       /* -3dBm0 */\r
+  drcCtl.u.limiter.delay_len  = (8*drc_SAMP_RATE_16K);    /* just the current value! */\r
+  err = drcControl (sysContext.drcInst_p, &drcCtl);\r
+  if (err != drc_NOERR) {\r
+    System_printf("*** drcControl() config limiter error: %d\n", err);\r
+    BIOS_exit(0);\r
+  }\r
+\r
+  /* Turn DRC on */\r
+  if (sysContext.drc_enable) {\r
+    drcCtl.ctl_code = drc_CTL_DRC_ON;\r
+    err = drcControl (sysContext.drcInst_p, &drcCtl);\r
+    if (err != drc_NOERR) {\r
+      System_printf("*** drcControl() enable error: %d\n", err);\r
+      BIOS_exit(0);\r
+    }\r
+  }\r
+\r
+  System_printf("Done with DRC\n");\r
+  System_flush();\r
+\r
+} /* sysDrcCreate */\r
+\r
+/* nothing past this point */\r
+\r
index fa2ee35ec7740c756061834b84b6f4a1cc4490e1..8443184bf69ab7e614ca9899dd8ba736fc41447c 100644 (file)
                        <type>1</type>\r
                        <locationURI>PARENT-2-PROJECT_LOC/common/components/sysbfflt.h</locationURI>\r
                </link>\r
+               <link>\r
+                       <name>sysdrc.c</name>\r
+                       <type>1</type>\r
+                       <locationURI>PARENT-2-PROJECT_LOC/common/components/sysdrc.c</locationURI>\r
+               </link>\r
                <link>\r
                        <name>syseram.c</name>\r
                        <type>1</type>\r
index 2fa4b345aa14722a41cb9a20016ebcc2198a80d2..570fb1eee7e8d8ec025315f2137527180ee01cdc 100644 (file)
@@ -22,6 +22,7 @@ ORDERED_OBJS += \
 "./sysasnr.obj" \
 "./sysbf.obj" \
 "./sysbfflt.obj" \
+"./sysdrc.obj" \\r
 "./syseram.obj" \
 "./sysiram.obj" \
 "./sysmss.obj" \
@@ -204,8 +205,8 @@ audioAnalogLoopbackTest.hex: $(EXE_OUTPUTS)
 clean:\r
        -$(RM) $(GEN_MISC_FILES__QUOTED)$(EXE_OUTPUTS__QUOTED)$(GEN_FILES__QUOTED)$(BIN_OUTPUTS__QUOTED)$(GEN_OPTS__QUOTED)$(GEN_CMDS__QUOTED)\r
        -$(RMDIR) $(GEN_MISC_DIRS__QUOTED)\r
-       -$(RM) "fil.d" "mhm.d" "mss.d" "mssproc.d" "sys.d" "sysasnr.d" "sysbf.d" "sysbfflt.d" "syseram.d" "sysiram.d" "sysmss.d" "src\audio_dc_cfg.d" "src\edma_cfg.d" "src\main.d" "src\mcasp_cfg.d" "src\mcasp_osal.d" "src\sample_cs.d" "src\sample_k2g_cfg.d" "src\sample_k2g_int_reg.d" "src\sine.d" "src\test_exit.d" \r
-       -$(RM) "fil.obj" "mhm.obj" "mss.obj" "mssproc.obj" "sys.obj" "sysasnr.obj" "sysbf.obj" "sysbfflt.obj" "syseram.obj" "sysiram.obj" "sysmss.obj" "src\audio_dc_cfg.obj" "src\edma_cfg.obj" "src\main.obj" "src\mcasp_cfg.obj" "src\mcasp_osal.obj" "src\sample_cs.obj" "src\sample_k2g_cfg.obj" "src\sample_k2g_int_reg.obj" "src\sine.obj" "src\test_exit.obj" \r
+       -$(RM) "fil.d" "mhm.d" "mss.d" "mssproc.d" "sys.d" "sysasnr.d" "sysbf.d" "sysbfflt.d" "sysdrc.d" "syseram.d" "sysiram.d" "sysmss.d" "src\audio_dc_cfg.d" "src\edma_cfg.d" "src\main.d" "src\mcasp_cfg.d" "src\mcasp_osal.d" "src\sample_cs.d" "src\sample_k2g_cfg.d" "src\sample_k2g_int_reg.d" "src\sine.d" "src\test_exit.d" \r
+       -$(RM) "fil.obj" "mhm.obj" "mss.obj" "mssproc.obj" "sys.obj" "sysasnr.obj" "sysbf.obj" "sysbfflt.obj" "sysdrc.obj" "syseram.obj" "sysiram.obj" "sysmss.obj" "src\audio_dc_cfg.obj" "src\edma_cfg.obj" "src\main.obj" "src\mcasp_cfg.obj" "src\mcasp_osal.obj" "src\sample_cs.obj" "src\sample_k2g_cfg.obj" "src\sample_k2g_int_reg.obj" "src\sine.obj" "src\test_exit.obj" \r
        -@echo 'Finished clean'\r
        -@echo ' '\r
 \r
index 5e7199935dac0ba4e77c0bd564d3fb782a104cef..ec1722f6051ade02635682087a6ed1165acc62cd 100644 (file)
@@ -69,6 +69,13 @@ sysbfflt.obj: ../../../common/components/sysbfflt.c $(GEN_OPTS) $(GEN_HDRS)
        @echo 'Finished building: $<'\r
        @echo ' '\r
 \r
+sysdrc.obj: ../../../common/components/sysdrc.c $(GEN_OPTS) $(GEN_HDRS)\r
+       @echo 'Building file: $<'\r
+       @echo 'Invoking: C6000 Compiler'\r
+       "${C6X_GEN_INSTALL_PATH}/bin/cl6x" -mv6600 --abi=eabi --opt_for_speed=5 --include_path="${C6X_GEN_INSTALL_PATH}/include" --include_path="${PDK_INSTALL_PATH}/ti/board/diag/nand/src" --include_path="../../../realtime_demo_bios/k2g/include" --include_path="../../../common/components" --include_path="${PDK_INSTALL_PATH}/ti/drv/mcasp" --include_path="${PDK_INSTALL_PATH}/ti/board" --include_path="${PDK_INSTALL_PATH}/ti/board/src/evmK2G/include" --include_path="${PDK_INSTALL_PATH}/ti/addon/cmbk2g/include" --include_path="${PDK_INSTALL_PATH}" --include_path="${PDK_INSTALL_PATH}/ti/csl" -g --define=DEVICE_K2G --define=SOC_K2G --define=evmK2G --define=PLATFORM_INIT_IN --define=BUILD_DSP --diag_warning=225 --diag_wrap=off --display_error_number --preproc_with_compile --preproc_dependency="sysdrc.d" $(GEN_OPTS__FLAG) "$<"\r
+       @echo 'Finished building: $<'\r
+       @echo ' '\r
+\r
 syseram.obj: ../../../common/components/syseram.c $(GEN_OPTS) $(GEN_HDRS)\r
        @echo 'Building file: $<'\r
        @echo 'Invoking: C6000 Compiler'\r
index 6fa9ea324456e098ffb573bec97a3c826c25aaa4..b4d6b2294b1d88e0002079d21faf7fe6c7d3bd9a 100644 (file)
@@ -18,6 +18,7 @@ C_SRCS += \
 ../../../common/components/sysasnr.c \
 ../../../common/components/sysbf.c \
 ../../../common/components/sysbfflt.c \
+../../../common/components/sysdrc.c \
 ../../../common/components/syseram.c \
 ../../../common/components/sysiram.c \
 ../../../common/components/sysmss.c 
@@ -31,6 +32,7 @@ OBJS += \
 ./sysasnr.obj \
 ./sysbf.obj \
 ./sysbfflt.obj \
+./sysdrc.obj \
 ./syseram.obj \
 ./sysiram.obj \
 ./sysmss.obj 
@@ -44,6 +46,7 @@ C_DEPS += \
 ./sysasnr.d \
 ./sysbf.d \
 ./sysbfflt.d \
+./sysdrc.d \
 ./syseram.d \
 ./sysiram.d \
 ./sysmss.d 
@@ -77,6 +80,7 @@ C_DEPS__QUOTED += \
 "sysasnr.d" \
 "sysbf.d" \
 "sysbfflt.d" \
+"sysdrc.d" \
 "syseram.d" \
 "sysiram.d" \
 "sysmss.d" 
@@ -90,6 +94,7 @@ OBJS__QUOTED += \
 "sysasnr.obj" \
 "sysbf.obj" \
 "sysbfflt.obj" \
+"sysdrc.obj" \
 "syseram.obj" \
 "sysiram.obj" \
 "sysmss.obj" 
@@ -103,6 +108,7 @@ C_SRCS__QUOTED += \
 "../../../common/components/sysasnr.c" \
 "../../../common/components/sysbf.c" \
 "../../../common/components/sysbfflt.c" \
+"../../../common/components/sysdrc.c" \
 "../../../common/components/syseram.c" \
 "../../../common/components/sysiram.c" \
 "../../../common/components/sysmss.c"