TI DSP (C5x and C6x) patch by Jim Crichton
authorjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 29 Oct 2005 13:13:13 +0000 (13:13 +0000)
committerjm <jm@0101bb08-14d6-0310-b084-bc0e0c8e3800>
Sat, 29 Oct 2005 13:13:13 +0000 (13:13 +0000)
git-svn-id: http://svn.xiph.org/trunk/speex@10312 0101bb08-14d6-0310-b084-bc0e0c8e3800

ti/README.TI-DSP [new file with mode: 0644]
ti/config.h [new file with mode: 0644]
ti/speex_C54_test/speex_C54_test.cmd [new file with mode: 0644]
ti/speex_C54_test/speex_C54_test.pjt [new file with mode: 0644]
ti/speex_C55_test/speex_C55_test.cmd [new file with mode: 0644]
ti/speex_C55_test/speex_C55_test.pjt [new file with mode: 0644]
ti/speex_C64_test/speex_C64_test.cmd [new file with mode: 0644]
ti/speex_C64_test/speex_C64_test.pjt [new file with mode: 0644]
ti/testenc-TI-C5x.c [new file with mode: 0644]
ti/testenc-TI-C64x.c [new file with mode: 0644]
ti/user_misc.h [new file with mode: 0644]

diff --git a/ti/README.TI-DSP b/ti/README.TI-DSP
new file mode 100644 (file)
index 0000000..74503ee
--- /dev/null
@@ -0,0 +1,56 @@
+These are all of the changes and additions necessary to build a loopback application for the \r
+TI C6415, C5509A, or C5416 simulators using the TI Code Composer Studio (CCS) development system.  \r
+A trial version of the tools can be downloaded from the TI website.\r
+\r
+This build runs 8kbps narrowband, with minimum complexity.\r
+\r
+Several changes are introduced in Speex 1.1.11 which are used in these applications:\r
+\r
+arch.h: Added switch for compilers not supporting "long long" (C55x does, C54x, CCS 2.x C64x does not)\r
+bits.c: Allow external definition for max buffer size, changed MAX_BYTES_PER_FRAME\r
+        to MAX_CHARS_PER_FRAME for consistency\r
+misc.c: Added override switches to alloc routines, conditional include of user file "user_misc.h".\r
+        These changes allow manual memory allocation rather than using heap\r
+\r
+The arch.h change allows operation with 2.x versions of Code Composer Studio.\r
+The bits.c change reduces the data memory usage.\r
+The misc.c change allows private memory allocation, for cases where it is not\r
+desirable to use the normal heap.\r
+\r
+Added files:\r
+\r
+testenc-TI-C5x.c  (For C54x and C55x builds, derived from testenc.c, \r
+                       manual alloc, byte packing/unpacking added)\r
+testenc-TI-C64x.c  (For C64x builds, derived from testenc.c, manual alloc, byte packing/unpacking added)\r
+\r
+config.h (not automatically generated, sets memory sizes, enables/disables manual alloc)\r
+user_misc.h (contains the manual memory alloc routines, with debug code to display mem usage)\r
+speex\speex_config_types.h (match Speex types to compiler types, not generated from types.in)\r
+\r
+speex_c54_test\speex_c54_test.cmd (C5416 linker command file)\r
+speex_c54_test\speex_c54_test.pjt (Code Composer Studio Project File )\r
+speex_c55_test\speex_c55_test.cmd (C5509A linker command file)\r
+speex_c55_test\speex_c55_test.pjt (Code Composer Studio Project File )\r
+speex_c64_test\speex_c64_test.cmd (C6415 linker command file)\r
+speex_c64_test\speex_c64_test.pjt (Code Composer Studio Project File )\r
+\r
+samples\male.snd  \r
+\r
+Usage:\r
+1. Create a Speex 1.1.11 (or later) source tree.\r
+2. Edit the files testenc-TI-C5x.c and/or testenc-TI-C64x.c to change the hard-coded path \r
+   for the test audio and data files.\r
+   This build uses the file e:\speextrunktest\samples\male.snd.\r
+   Note:  This is a headerless 16-bit stereo audio file derived from the male.wav test file \r
+          http://www.speex.org/samples/male.wav\r
+3. Edit the .pjt file with a text editor and change projdir or projectdir to the correct path \r
+   (one place near the top of the file).\r
+4. Edit config.h if desired, to change the memory allocation method (calloc or manual),\r
+   and to enable/disable debug prints for the memory allocation \r
+   (this makes it easier to determine the required size).\r
+5. Run Code Composer Studio, and open the project for the desired target (e.g. speex_c55_test).\r
+   Note that the correct simulator must be selected (in CCS Setup) before starting CCS.\r
+6. Build and run the simulation.\r
+\r
+Note that assembly optimizations will be required to run C54x in real time.\r
+There are no assembly optimizations in any of these builds.\r
diff --git a/ti/config.h b/ti/config.h
new file mode 100644 (file)
index 0000000..1d6d65b
--- /dev/null
@@ -0,0 +1,73 @@
+/* Copyright (C) 2005 Psi Systems, Inc.
+   File: config.h
+   Main Speex option include file for TI C64xx, C54xx and C55xx processors\r
+   for use with TI Code Composer (TM) DSP development tools.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+\r
+#define FIXED_POINT\r
+#define FRAME_SIZE 160\r
+#define DISABLE_WIDEBAND\r
+\r
+/* Allow for 2 20ms narrowband blocks per frame, plus a couple of bytes */\r
+#define MAX_CHARS_PER_FRAME (42/BYTES_PER_CHAR)\r
+\r
+/* for debug */\r
+#undef DECODE_ONLY\r
+\r
+/* EITHER    Allocate from fixed array (C heap not used) */\r
+/*           Enable VERBOSE_ALLOC to see how much is used */\r
+#define MANUAL_ALLOC\r
+#define USER_MISC\r
+#define VERBOSE_ALLOC\r
+/* OR        Use CALLOC (heap size must be increased in linker command file) */\r
+//#undef MANUAL_ALLOC\r
+//#undef USER_MISC\r
+\r
+#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) \r
+//#define PRECISION16\r
+\r
+// These values determined by analysis for 8kbps narrowband\r
+#define SPEEXENC_PERSIST_STACK_SIZE 5000\r
+#define SPEEXENC_SCRATCH_STACK_SIZE 3000\r
+#define SPEEXDEC_PERSIST_STACK_SIZE 2500\r
+#define SPEEXDEC_SCRATCH_STACK_SIZE 1000\r
+#else /* C6X */\r
+#define NO_LONGLONG\r
+\r
+#define SPEEXENC_PERSIST_STACK_SIZE 10000\r
+#define SPEEXENC_SCRATCH_STACK_SIZE 6000\r
+#define SPEEXDEC_PERSIST_STACK_SIZE 5000\r
+#define SPEEXDEC_SCRATCH_STACK_SIZE 2000\r
+#endif\r
+#define SPEEX_PERSIST_STACK_SIZE (SPEEXENC_PERSIST_STACK_SIZE + SPEEXDEC_PERSIST_STACK_SIZE)\r
+#define SPEEX_SCRATCH_STACK_SIZE SPEEXENC_SCRATCH_STACK_SIZE\r
+#define NB_ENC_STACK SPEEXENC_SCRATCH_STACK_SIZE\r
+#define NB_DEC_STACK SPEEXDEC_SCRATCH_STACK_SIZE\r
+\r
diff --git a/ti/speex_C54_test/speex_C54_test.cmd b/ti/speex_C54_test/speex_C54_test.cmd
new file mode 100644 (file)
index 0000000..4dd4c18
--- /dev/null
@@ -0,0 +1,71 @@
+/* Copyright (C) 2005 Psi Systems, Inc.
+   File: speex_C54_test.cmd
+   Linker command file with memory allocation for TI TMS320VC5416 processor\r
+   for use with TI Code Composer (TM) DSP development tools.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+\r
+-c\r
+-stack 0x2000\r
+-heap 0x1000   /* If private memory allocation is used for Speex */\r
+/*-heap 0x6000 /* If calloc is used for Speex */\r
+-lrts_ext.lib\r
+\r
+MEMORY\r
+{\r
+/*   PAGE 0:   P_DARAM03:  origin = 0x80,          len = 0x7f00*/\r
+   PAGE 0:   P_DARAM03:  origin = 0x5000,          len = 0x2f80\r
+   PAGE 0:   VECT:       origin = 0x7f80,        len = 0x80\r
+   PAGE 0:   P_DARAM47:  origin = 0x18000,       len = 0x8000\r
+   PAGE 0:   SARAM03:    origin = 0x28000,       len = 0x8000\r
+   PAGE 0:   SARAM47:    origin = 0x38000,       len = 0x8000\r
+\r
+   PAGE 1:   USERREGS:   origin = 0x60,          len = 0x1a\r
+   PAGE 1:   BIOSREGS:   origin = 0x7c,          len = 0x4\r
+   PAGE 1:   CSLREGS:    origin = 0x7a,          len = 0x2\r
+            D_DARAM03:  origin = 0x80,          len = 0x4f80\r
+            D_DARAM47:  origin = 0x8000,        len = 0x8000\r
+}\r
+\r
+SECTIONS\r
+{\r
+    .vectors: {} > VECT PAGE 0\r
+    .bootmem: {rts_ext.lib (.text)} > P_DARAM03 PAGE 0 \r
+/*    .bootmem: {} > P_DARAM03 PAGE 0 */\r
+    .text:    {} > SARAM03 PAGE 0\r
+    .cinit:   {} > SARAM03 PAGE 0\r
+    .switch:  {} > SARAM03 PAGE 0\r
+    .bss:     {} > D_DARAM03 | D_DARAM47 PAGE 1\r
+    .far:     {} > D_DARAM03 | D_DARAM47  PAGE 1\r
+    .const:   {} > D_DARAM03 | D_DARAM47  PAGE 1\r
+    .sysmem:  {} > D_DARAM47 PAGE 1\r
+    .cio:     {} > D_DARAM03 | D_DARAM47  PAGE 1\r
+    .stack:   {} > D_DARAM03 | D_DARAM47  PAGE 1\r
+    .myheap:   {} > D_DARAM47 PAGE 1\r
+}\r
diff --git a/ti/speex_C54_test/speex_C54_test.pjt b/ti/speex_C54_test/speex_C54_test.pjt
new file mode 100644 (file)
index 0000000..fb93609
--- /dev/null
@@ -0,0 +1,59 @@
+; Code Composer Project File, Version 2.0 (do not modify or remove this line)\r
+\r
+[Project Settings]\r
+ProjectDir="C:\speextrunktest\ti\speex_C54_test\"\r
+ProjectType=Executable\r
+CPUFamily=TMS320C54XX\r
+Tool="Compiler"\r
+Tool="DspBiosBuilder"\r
+Tool="Linker"\r
+Config="Debug"\r
+Config="Release"\r
+\r
+[Source Files]\r
+Source="..\..\libspeex\bits.c"\r
+Source="..\..\libspeex\cb_search.c"\r
+Source="..\..\libspeex\exc_10_16_table.c"\r
+Source="..\..\libspeex\exc_10_32_table.c"\r
+Source="..\..\libspeex\exc_20_32_table.c"\r
+Source="..\..\libspeex\exc_5_256_table.c"\r
+Source="..\..\libspeex\exc_5_64_table.c"\r
+Source="..\..\libspeex\exc_8_128_table.c"\r
+Source="..\..\libspeex\filters.c"\r
+Source="..\..\libspeex\gain_table.c"\r
+Source="..\..\libspeex\gain_table_lbr.c"\r
+Source="..\..\libspeex\lpc.c"\r
+Source="..\..\libspeex\lsp.c"\r
+Source="..\..\libspeex\lsp_tables_nb.c"\r
+Source="..\..\libspeex\ltp.c"\r
+Source="..\..\libspeex\math_approx.c"\r
+Source="..\..\libspeex\misc.c"\r
+Source="..\..\libspeex\modes.c"\r
+Source="..\..\libspeex\nb_celp.c"\r
+Source="..\..\libspeex\quant_lsp.c"\r
+Source="..\..\libspeex\sb_celp.c"\r
+Source="..\..\libspeex\speex.c"\r
+Source="..\..\libspeex\speex_callbacks.c"\r
+Source="..\..\libspeex\vbr.c"\r
+Source="..\..\libspeex\vq.c"\r
+Source="..\..\ti\testenc-TI-C5x.c"\r
+Source="speex_C54_test.cmd"\r
+\r
+["Compiler" Settings: "Debug"]\r
+Options=-g -q -o3 -fr"..\ti\speex_C54_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C55X" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms\r
+\r
+["Compiler" Settings: "Release"]\r
+Options=-q -o2 -fr"..\ti\speex_C54_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms\r
+\r
+["DspBiosBuilder" Settings: "Debug"]\r
+Options=-v54\r
+\r
+["DspBiosBuilder" Settings: "Release"]\r
+Options=-v54\r
+\r
+["Linker" Settings: "Debug"]\r
+Options=-q -c -heap4096 -m".\Debug\speex_C54_test.map" -o".\Debug\speex_C54_test.out" -stack4096 -w -x\r
+\r
+["Linker" Settings: "Release"]\r
+Options=-q -c -m".\Release\speex_C54_test.map" -o".\Release\speex_C54_test.out" -w -x\r
+\r
diff --git a/ti/speex_C55_test/speex_C55_test.cmd b/ti/speex_C55_test/speex_C55_test.cmd
new file mode 100644 (file)
index 0000000..36e7923
--- /dev/null
@@ -0,0 +1,65 @@
+/* Copyright (C) 2005 Psi Systems, Inc.
+   File: speex_C55_test.cmd
+   Linker command file with memory allocation for TI TMS320VC5509A processor\r
+   for use with TI Code Composer (TM) DSP development tools.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+\r
+-c\r
+-stack 0x1c00\r
+-heap 0x1000   /* If private memory allocation is used for Speex */\r
+/*-heap 0x6000 / * If calloc is used for Speex */\r
+-sysstack 0x200\r
+-lrts55.lib\r
+\r
+MEMORY\r
+{\r
+   DARAM:      origin = 0x200,         len = 0x7e00\r
+   DARAM_B:    origin = 0x8000,        len = 0x8000\r
+   VECT:       origin = 0x100,         len = 0x100\r
+   SARAM_A:    origin = 0x10000,       len = 0x10000\r
+   SARAM_B:    origin = 0x20000,       len = 0x20000\r
+}\r
+\r
+SECTIONS\r
+{\r
+    .vectors: {} > VECT\r
+    .bootmem: {} > DARAM\r
+    .text:    {} > SARAM_B\r
+    .cinit:   {} > SARAM_B\r
+    .switch:  {} > SARAM_B\r
+    .bss:     {} > DARAM\r
+/*    .far:     {} > DARAM*/\r
+    .const:   {} > DARAM\r
+    .sysmem:  {} > DARAM_B\r
+    .cio:     {} > DARAM\r
+    .stack:   {} > DARAM\r
+    .sysstack:   {} > DARAM\r
+    .myheap:   {} > SARAM_A\r
+}\r
diff --git a/ti/speex_C55_test/speex_C55_test.pjt b/ti/speex_C55_test/speex_C55_test.pjt
new file mode 100644 (file)
index 0000000..28ab02f
--- /dev/null
@@ -0,0 +1,59 @@
+; Code Composer Project File, Version 2.0 (do not modify or remove this line)\r
+\r
+[Project Settings]\r
+ProjectDir="C:\speextrunktest\ti\speex_C55_test\"\r
+ProjectType=Executable\r
+CPUFamily=TMS320C55XX\r
+Tool="Compiler"\r
+Tool="DspBiosBuilder"\r
+Tool="Linker"\r
+Config="Debug"\r
+Config="Release"\r
+\r
+[Source Files]\r
+Source="..\..\libspeex\bits.c"\r
+Source="..\..\libspeex\cb_search.c"\r
+Source="..\..\libspeex\exc_10_16_table.c"\r
+Source="..\..\libspeex\exc_10_32_table.c"\r
+Source="..\..\libspeex\exc_20_32_table.c"\r
+Source="..\..\libspeex\exc_5_256_table.c"\r
+Source="..\..\libspeex\exc_5_64_table.c"\r
+Source="..\..\libspeex\exc_8_128_table.c"\r
+Source="..\..\libspeex\filters.c"\r
+Source="..\..\libspeex\gain_table.c"\r
+Source="..\..\libspeex\gain_table_lbr.c"\r
+Source="..\..\libspeex\lpc.c"\r
+Source="..\..\libspeex\lsp.c"\r
+Source="..\..\libspeex\lsp_tables_nb.c"\r
+Source="..\..\libspeex\ltp.c"\r
+Source="..\..\libspeex\math_approx.c"\r
+Source="..\..\libspeex\misc.c"\r
+Source="..\..\libspeex\modes.c"\r
+Source="..\..\libspeex\nb_celp.c"\r
+Source="..\..\libspeex\quant_lsp.c"\r
+Source="..\..\libspeex\sb_celp.c"\r
+Source="..\..\libspeex\speex.c"\r
+Source="..\..\libspeex\speex_callbacks.c"\r
+Source="..\..\libspeex\vbr.c"\r
+Source="..\..\libspeex\vq.c"\r
+Source="..\..\ti\testenc-TI-C5x.c"\r
+Source="speex_C55_test.cmd"\r
+\r
+["Compiler" Settings: "Debug"]\r
+Options=-g -q -o3 -fr"..\ti\speex_C55_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn\r
+\r
+["Compiler" Settings: "Release"]\r
+Options=-q -o2 -fr"..\ti\speex_C55_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn\r
+\r
+["DspBiosBuilder" Settings: "Debug"]\r
+Options=-v55\r
+\r
+["DspBiosBuilder" Settings: "Release"]\r
+Options=-v55\r
+\r
+["Linker" Settings: "Debug"]\r
+Options=-q -c -m".\Debug\speex_C55_test.map" -o".\Debug\speex_C55_test.out" -w -x\r
+\r
+["Linker" Settings: "Release"]\r
+Options=-q -c -m".\Release\speex_C55_test.map" -o".\Release\speex_C55_test.out" -w -x\r
+\r
diff --git a/ti/speex_C64_test/speex_C64_test.cmd b/ti/speex_C64_test/speex_C64_test.cmd
new file mode 100644 (file)
index 0000000..545e7b4
--- /dev/null
@@ -0,0 +1,59 @@
+/* Copyright (C) 2005 Psi Systems, Inc.
+   File: speex_C64_test.cmd
+   Linker command file with memory allocation for TI TMS320C6415 processor\r
+   for use with TI Code Composer (TM) DSP development tools.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+\r
+-stack 0x10000\r
+-heap 0x10000\r
+\r
+\r
+MEMORY \r
+{\r
+   VECRAM       : origin = 0x0,         len = 0x200\r
+   IPRAM       : origin = 0x200,         len = 0x40000\r
+   IDRAM       : origin = 0x80000,  len = 0x70000\r
+}\r
+\r
+SECTIONS\r
+{\r
+        .vectors > VECRAM\r
+        .text    > IPRAM\r
+\r
+        .bss     > IDRAM\r
+        .cinit   > IDRAM\r
+        .const   > IDRAM\r
+        .far     > IDRAM\r
+        .stack   > IDRAM\r
+        .cio     > IDRAM\r
+        .sysmem  > IDRAM\r
+        .switch  > IDRAM\r
+        .myheap  > IDRAM\r
+}\r
diff --git a/ti/speex_C64_test/speex_C64_test.pjt b/ti/speex_C64_test/speex_C64_test.pjt
new file mode 100644 (file)
index 0000000..bccc703
--- /dev/null
@@ -0,0 +1,59 @@
+; Code Composer Project File, Version 2.0 (do not modify or remove this line)\r
+\r
+[Project Settings]\r
+ProjectDir="E:\speextrunktest\ti\speex_C64_test\"\r
+ProjectType=Executable\r
+CPUFamily=TMS320C64XX\r
+Tool="Compiler"\r
+Tool="DspBiosBuilder"\r
+Tool="Linker"\r
+Config="Debug"\r
+Config="Release"\r
+\r
+[Source Files]\r
+Source="..\..\libspeex\bits.c"\r
+Source="..\..\libspeex\cb_search.c"\r
+Source="..\..\libspeex\exc_10_16_table.c"\r
+Source="..\..\libspeex\exc_10_32_table.c"\r
+Source="..\..\libspeex\exc_20_32_table.c"\r
+Source="..\..\libspeex\exc_5_256_table.c"\r
+Source="..\..\libspeex\exc_5_64_table.c"\r
+Source="..\..\libspeex\exc_8_128_table.c"\r
+Source="..\..\libspeex\filters.c"\r
+Source="..\..\libspeex\gain_table.c"\r
+Source="..\..\libspeex\gain_table_lbr.c"\r
+Source="..\..\libspeex\lpc.c"\r
+Source="..\..\libspeex\lsp.c"\r
+Source="..\..\libspeex\lsp_tables_nb.c"\r
+Source="..\..\libspeex\ltp.c"\r
+Source="..\..\libspeex\math_approx.c"\r
+Source="..\..\libspeex\misc.c"\r
+Source="..\..\libspeex\modes.c"\r
+Source="..\..\libspeex\nb_celp.c"\r
+Source="..\..\libspeex\quant_lsp.c"\r
+Source="..\..\libspeex\sb_celp.c"\r
+Source="..\..\libspeex\speex.c"\r
+Source="..\..\libspeex\speex_callbacks.c"\r
+Source="..\..\libspeex\vbr.c"\r
+Source="..\..\libspeex\vq.c"\r
+Source="..\testenc-TI-C64x.c"\r
+Source="C:\ti\c6000\cgtools\lib\rts6400.lib"\r
+Source="speex_C64_test.cmd"\r
+\r
+["Compiler" Settings: "Debug"]\r
+Options=-g -o3 -fr"$(Proj_dir)\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"HAVE_CONFIG_H" -mv6400\r
+\r
+["Compiler" Settings: "Release"]\r
+Options=-o3 -fr"$(Proj_dir)\Release" -i"..\ti" -i"..\include"  -i"..\" -i"..\..\include" -d"HAVE_CONFIG_H" -mv6400\r
+\r
+["DspBiosBuilder" Settings: "Debug"]\r
+Options=-v6x\r
+\r
+["DspBiosBuilder" Settings: "Release"]\r
+Options=-v6x\r
+\r
+["Linker" Settings: "Debug"]\r
+Options=-c -m".\Debug\speex_C64_test.map" -o".\Debug\speex_C64_test.out" -w -x\r
+\r
+["Linker" Settings: "Release"]\r
+Options=-c -m".\Release\speex_C64_test.map" -o".\Release\speex_C64_test.out" -w -x\r
diff --git a/ti/testenc-TI-C5x.c b/ti/testenc-TI-C5x.c
new file mode 100644 (file)
index 0000000..710cfcf
--- /dev/null
@@ -0,0 +1,265 @@
+/* Copyright (C) 2005 Psi Systems, Inc.\r
+   File: testenc-TI-C5x.c\r
+   Encoder/Decoder Loop Main file for TI C54xx and C55xx processors\r
+   for use with TI Code Composer (TM) DSP development tools.\r
+   Modified from speexlib/testenc.c\r
+\r
+\r
+   Redistribution and use in source and binary forms, with or without\r
+   modification, are permitted provided that the following conditions\r
+   are met:\r
+   \r
+   - Redistributions of source code must retain the above copyright\r
+   notice, this list of conditions and the following disclaimer.\r
+   \r
+   - Redistributions in binary form must reproduce the above copyright\r
+   notice, this list of conditions and the following disclaimer in the\r
+   documentation and/or other materials provided with the distribution.\r
+   \r
+   - Neither the name of the Xiph.org Foundation nor the names of its\r
+   contributors may be used to endorse or promote products derived from\r
+   this software without specific prior written permission.\r
+   \r
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR\r
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+*/\r
+\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+/* Modified from speexlib/testenc.c for Code Composer simulator */\r
+\r
+#include <speex/speex.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <speex/speex_callbacks.h>\r
+#include <..\libspeex\arch.h>\r
+\r
+#undef DECODE_ONLY\r
+\r
+#ifdef FIXED_DEBUG\r
+extern long long spx_mips;\r
+#endif\r
+#include <math.h>\r
+\r
+#ifdef MANUAL_ALLOC\r
+#pragma DATA_SECTION(spxHeap, ".myheap"); \r
+static char spxHeap[SPEEX_PERSIST_STACK_SIZE];\r
+\r
+#pragma DATA_SECTION(spxScratch, ".myheap"); \r
+static char spxScratch[SPEEX_SCRATCH_STACK_SIZE];\r
+\r
+char *spxGlobalHeapPtr, *spxGlobalHeapEnd;\r
+char *spxGlobalScratchPtr, *spxGlobalScratchEnd;\r
+#endif\r
+\r
+void byte2word(short* pInBuf, short* pOutBuf, int nWords)\r
+{\r
+   short *pIn, *pOut, sNext;\r
+   int i;\r
+   \r
+   pIn = pInBuf;\r
+   pOut = pOutBuf;\r
+   for(i=0;i<nWords;i++)\r
+   {\r
+      sNext = *pIn++;                  // Get low byte\r
+      *pOut++ = (sNext & 0x00ff) | (*pIn++ << 8);      // insert high byte\r
+   }\r
+}\r
+   \r
+void word2byte(short* pInBuf, short* pOutBuf, int nWords)\r
+{\r
+   short *pIn, *pOut;\r
+   int i;\r
+   \r
+   pIn = pInBuf;\r
+   pOut = pOutBuf;\r
+   for(i=0;i<nWords;i++)\r
+   {\r
+      *pOut++ = *pIn & 0x00ff; // Get low byte\r
+      *pOut++ = (short) ((unsigned short) *pIn++ >> 8);\r
+   }\r
+}\r
+   \r
+void main()\r
+{\r
+   char *outFile, *bitsFile;\r
+   FILE *fout, *fbits=NULL;\r
+#ifndef DECODE_ONLY\r
+   char *inFile;\r
+   FILE *fin;\r
+#endif\r
+   short out_short[FRAME_SIZE];\r
+   short inout_byte[2*FRAME_SIZE];\r
+#ifndef DECODE_ONLY\r
+   short in_short[FRAME_SIZE];\r
+   float sigpow,errpow,snr, seg_snr=0;\r
+   int snr_frames = 0;\r
+   int nbChars;\r
+   int i;\r
+#endif\r
+   char cbits[22];\r
+   void *st;\r
+   void *dec;\r
+   SpeexBits bits;\r
+   int tmp;\r
+   unsigned int bitCount=0;\r
+   int skip_group_delay;\r
+   SpeexCallback callback;\r
+\r
+   /* C54xx defaults to max wait states, even for parts like C5416 with \r
+      larger internal memory.  Need to force the wait state register to zero */\r
+\r
+#ifdef CONFIG_TI_C54X\r
+   asm("       STM     #0,SWWSR");\r
+#endif\r
+\r
+#ifndef DECODE_ONLY\r
+   sigpow = 0;\r
+   errpow = 0;\r
+#endif\r
+\r
+#ifdef MANUAL_ALLOC\r
+       spxGlobalHeapPtr = spxHeap;\r
+       spxGlobalHeapEnd = spxHeap + sizeof(spxHeap);\r
+\r
+       spxGlobalScratchPtr = spxScratch;\r
+       spxGlobalScratchEnd = spxScratch + sizeof(spxScratch);\r
+#endif\r
+   st = speex_encoder_init(&speex_nb_mode);\r
+#ifdef MANUAL_ALLOC\r
+       spxGlobalScratchPtr = spxScratch;               /* Reuse scratch for decoder */\r
+#endif\r
+   dec = speex_decoder_init(&speex_nb_mode);\r
+\r
+   callback.callback_id = SPEEX_INBAND_CHAR;\r
+   callback.func = speex_std_char_handler;\r
+   callback.data = stderr;\r
+   speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback);\r
+\r
+   callback.callback_id = SPEEX_INBAND_MODE_REQUEST;\r
+   callback.func = speex_std_mode_request_handler;\r
+   callback.data = st;\r
+   speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback);\r
+\r
+   tmp=0;\r
+   speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp);\r
+   tmp=0;\r
+   speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);\r
+   tmp=4;\r
+   speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);\r
+   tmp=1;\r
+   speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp);\r
+\r
+   speex_mode_query(&speex_nb_mode, SPEEX_MODE_FRAME_SIZE, &tmp);\r
+   fprintf (stderr, "frame size: %d\n", tmp);\r
+   skip_group_delay = tmp / 2;\r
+\r
+#ifdef DECODE_ONLY\r
+   bitsFile = "c:\\speextrunktest\\samples\\malebitsin5x.dat";\r
+   fbits = fopen(bitsFile, "rb");\r
+#else\r
+   bitsFile = "c:\\speextrunktest\\samples\\malebits.dat";\r
+   fbits = fopen(bitsFile, "wb");\r
+#endif\r
+   inFile = "c:\\speextrunktest\\samples\\male.snd";\r
+   fin = fopen(inFile, "rb");\r
+   outFile = "c:\\speextrunktest\\samples\\maleout.snd";\r
+   fout = fopen(outFile, "wb+");\r
\r
+   speex_bits_init(&bits);\r
+#ifndef DECODE_ONLY\r
+   while (!feof(fin))\r
+   {\r
+      fread(inout_byte, 2, FRAME_SIZE, fin);\r
+      byte2word(inout_byte, in_short, FRAME_SIZE);  /* C5x has 16-bit char */\r
+\r
+      if (feof(fin))\r
+         break;\r
+      speex_bits_reset(&bits);\r
+\r
+      speex_encode_int(st, in_short, &bits);\r
+      nbChars = speex_bits_write(&bits, cbits, sizeof(cbits))/BYTES_PER_CHAR;\r
+      bitCount+=bits.nbBits;\r
+\r
+      word2byte((short *) cbits, inout_byte, nbChars);\r
+      fwrite(inout_byte, 2, nbChars, fbits);\r
+      speex_bits_rewind(&bits);\r
+\r
+#else /* DECODE_ONLY */\r
+   while (!feof(fbits))\r
+   {\r
+      fread(inout_byte, 1, 20, fbits);\r
+\r
+      if (feof(fbits))\r
+         break;\r
+\r
+      byte2word(inout_byte, (short *)cbits, 10);\r
+      speex_bits_read_from(&bits, cbits, 20);\r
+      bitCount+=160;\r
+#endif\r
+      speex_decode_int(dec, &bits, out_short);\r
+      speex_bits_reset(&bits);\r
+\r
+      word2byte(&out_short[skip_group_delay], inout_byte, FRAME_SIZE-skip_group_delay);\r
+      fwrite(inout_byte, 2, FRAME_SIZE-skip_group_delay, fout);\r
+      skip_group_delay = 0;\r
+#if 1\r
+   fprintf (stderr, "Bits so far: %u \n", bitCount);\r
+#endif\r
+   }\r
+   fprintf (stderr, "Total encoded size: %u bits\n", bitCount);\r
+   speex_encoder_destroy(st);\r
+   speex_decoder_destroy(dec);\r
+\r
+#ifndef DECODE_ONLY\r
+   rewind(fin);\r
+   rewind(fout);\r
+\r
+//   while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) \r
+//           &&\r
+//           FRAME_SIZE ==  fread(out_short, sizeof(short), FRAME_SIZE,fout) )\r
+   while ( bitCount > 0 )\r
+   {\r
+       float s=0, e=0;\r
+\r
+    fread(inout_byte, 2, FRAME_SIZE, fin);\r
+    byte2word(inout_byte, in_short, FRAME_SIZE);\r
+    fread(inout_byte, 2, FRAME_SIZE, fout);\r
+    byte2word(inout_byte, out_short, FRAME_SIZE);\r
+\r
+    bitCount -= FRAME_SIZE;\r
+        for (i=0;i<FRAME_SIZE;++i) {\r
+            s += (float)in_short[i] * in_short[i];\r
+            e += ((float)in_short[i]-out_short[i]) * ((float)in_short[i]-out_short[i]);\r
+        }\r
+       seg_snr += 10*log10((s+160)/(e+160));\r
+       sigpow += s;\r
+       errpow += e;\r
+       snr_frames++;\r
+   }\r
+   fclose(fin);\r
+#endif\r
+   fclose(fout);\r
+   fclose(fbits);\r
+\r
+#ifndef DECODE_ONLY\r
+   snr = 10 * log10( sigpow / errpow );\r
+   seg_snr /= snr_frames;\r
+   fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr);\r
+\r
+#ifdef FIXED_DEBUG\r
+   printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames));\r
+#endif\r
+#endif   \r
+}\r
diff --git a/ti/testenc-TI-C64x.c b/ti/testenc-TI-C64x.c
new file mode 100644 (file)
index 0000000..98c750a
--- /dev/null
@@ -0,0 +1,224 @@
+/* Copyright (C) 2005 Psi Systems, Inc.
+   Author:  Jean-Marc Valin 
+   File: testenc-TI-C64x.c
+   Encoder/Decoder Loop Main file for TI TMS320C64xx processor\r
+   for use with TI Code Composer (TM) DSP development tools.
+   Modified from speexlib/testenc.c\r
+\r
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#include <speex/speex.h>\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <speex/speex_callbacks.h>\r
+\r
+#ifdef FIXED_DEBUG\r
+extern long long spx_mips;\r
+#endif\r
+\r
+#ifdef MANUAL_ALLOC\r
+#pragma DATA_SECTION(spxHeap, ".myheap"); \r
+static char spxHeap[SPEEX_PERSIST_STACK_SIZE];\r
+\r
+#pragma DATA_SECTION(spxScratch, ".myheap"); \r
+static char spxScratch[SPEEX_SCRATCH_STACK_SIZE];\r
+\r
+char *spxGlobalHeapPtr, *spxGlobalHeapEnd;\r
+char *spxGlobalScratchPtr, *spxGlobalScratchEnd;\r
+#endif    /* MANUAL_ALLOC */\r
+\r
+#include <math.h>\r
+void main()\r
+{\r
+   char *outFile, *bitsFile;\r
+   FILE *fout, *fbits=NULL;\r
+#ifndef DECODE_ONLY\r
+   char *inFile;\r
+   FILE *fin;\r
+#endif\r
+#if 0\r
+   char *dbgoutFile;\r
+   FILE *fdbgout;\r
+#endif\r
+   short out_short[FRAME_SIZE];\r
+#ifndef DECODE_ONLY\r
+   short in_short[FRAME_SIZE];\r
+   float sigpow,errpow,snr, seg_snr=0;\r
+   int snr_frames = 0;\r
+   int nbBits;\r
+   int i;\r
+#endif\r
+   char cbits[200];\r
+   void *st;\r
+   void *dec;\r
+   SpeexBits bits;\r
+   int tmp;\r
+   int bitCount=0;\r
+   int skip_group_delay;\r
+   SpeexCallback callback;\r
+\r
+#ifndef DECODE_ONLY\r
+   sigpow = 0;\r
+   errpow = 0;\r
+#endif\r
+\r
+#ifdef MANUAL_ALLOC\r
+       spxGlobalHeapPtr = spxHeap;\r
+       spxGlobalHeapEnd = spxHeap + sizeof(spxHeap);\r
+\r
+       spxGlobalScratchPtr = spxScratch;\r
+       spxGlobalScratchEnd = spxScratch + sizeof(spxScratch);\r
+#endif\r
+   st = speex_encoder_init(&speex_nb_mode);\r
+#ifdef MANUAL_ALLOC\r
+       spxGlobalScratchPtr = spxScratch;               /* Reuse scratch for decoder */\r
+#endif\r
+   dec = speex_decoder_init(&speex_nb_mode);\r
+\r
+   callback.callback_id = SPEEX_INBAND_CHAR;\r
+   callback.func = speex_std_char_handler;\r
+   callback.data = stderr;\r
+   speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback);\r
+\r
+   callback.callback_id = SPEEX_INBAND_MODE_REQUEST;\r
+   callback.func = speex_std_mode_request_handler;\r
+   callback.data = st;\r
+   speex_decoder_ctl(dec, SPEEX_SET_HANDLER, &callback);\r
+\r
+   tmp=0;\r
+   speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp);\r
+   tmp=0;\r
+   speex_encoder_ctl(st, SPEEX_SET_VBR, &tmp);\r
+   tmp=4;\r
+   speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);\r
+   tmp=1;\r
+   speex_encoder_ctl(st, SPEEX_SET_COMPLEXITY, &tmp);\r
+\r
+   speex_mode_query(&speex_nb_mode, SPEEX_MODE_FRAME_SIZE, &tmp);\r
+   fprintf (stderr, "frame size: %d\n", tmp);\r
+   skip_group_delay = tmp / 2;\r
+\r
+#ifdef DECODE_ONLY\r
+   bitsFile = "e:\\speextrunktest\\samples\\malebitsin54.dat";\r
+   fbits = fopen(bitsFile, "rb");\r
+#else\r
+   bitsFile = "e:\\speextrunktest\\samples\\malebits.dat";\r
+   fbits = fopen(bitsFile, "wb");\r
+#endif\r
+   inFile = "e:\\speextrunktest\\samples\\male.snd";\r
+   fin = fopen(inFile, "rb");\r
+   outFile = "e:\\speextrunktest\\samples\\maleout.snd";\r
+   fout = fopen(outFile, "wb+");\r
+#if 0\r
+   dbgoutFile = "e:\\speextrunktest\\samples\\maledbgout.snd";\r
+   fdbgout = fopen(dbgoutFile, "wb+");\r
+#endif\r
\r
+   speex_bits_init(&bits);\r
+#ifndef DECODE_ONLY\r
+   while (!feof(fin))\r
+   {\r
+      fread(in_short, sizeof(short), FRAME_SIZE, fin);\r
+#if 0\r
+      fwrite(in_short, sizeof(short), FRAME_SIZE, fdbgout);\r
+#endif\r
+      if (feof(fin))\r
+         break;\r
+      speex_bits_reset(&bits);\r
+\r
+      speex_encode_int(st, in_short, &bits);\r
+      nbBits = speex_bits_write(&bits, cbits, 200);\r
+      bitCount+=bits.nbBits;\r
+\r
+      fwrite(cbits, 1, nbBits, fbits);\r
+      speex_bits_rewind(&bits);\r
+\r
+#else /* DECODE_ONLY */\r
+   while (!feof(fbits))\r
+   {\r
+      fread(cbits, 1, 20, fbits);\r
+\r
+      if (feof(fbits))\r
+         break;\r
+\r
+      speex_bits_read_from(&bits, cbits, 20);\r
+      bitCount+=160;\r
+#endif\r
+      \r
+      speex_decode_int(dec, &bits, out_short);\r
+      speex_bits_reset(&bits);\r
+\r
+      fwrite(&out_short[skip_group_delay], sizeof(short), FRAME_SIZE-skip_group_delay, fout);\r
+      skip_group_delay = 0;\r
+#if 1\r
+   fprintf (stderr, "Bits so far: %d \n", bitCount);\r
+#endif\r
+   }\r
+   fprintf (stderr, "Total encoded size: %d bits\n", bitCount);\r
+   speex_encoder_destroy(st);\r
+   speex_decoder_destroy(dec);\r
+\r
+#ifndef DECODE_ONLY\r
+   rewind(fin);\r
+   rewind(fout);\r
+\r
+   while ( FRAME_SIZE == fread(in_short, sizeof(short), FRAME_SIZE, fin) \r
+           &&\r
+           FRAME_SIZE ==  fread(out_short, sizeof(short), FRAME_SIZE,fout) )\r
+   {\r
+       float s=0, e=0;\r
+        for (i=0;i<FRAME_SIZE;++i) {\r
+            s += (float)in_short[i] * in_short[i];\r
+            e += ((float)in_short[i]-out_short[i]) * ((float)in_short[i]-out_short[i]);\r
+        }\r
+       seg_snr += 10*log10((s+160)/(e+160));\r
+       sigpow += s;\r
+       errpow += e;\r
+       snr_frames++;\r
+   }\r
+   fclose(fin);\r
+#endif\r
+   fclose(fout);\r
+   fclose(fbits);\r
+\r
+#ifndef DECODE_ONLY\r
+   snr = 10 * log10( sigpow / errpow );\r
+   seg_snr /= snr_frames;\r
+   fprintf(stderr,"SNR = %f\nsegmental SNR = %f\n",snr, seg_snr);\r
+\r
+#ifdef FIXED_DEBUG\r
+   printf ("Total: %f MIPS\n", (float)(1e-6*50*spx_mips/snr_frames));\r
+#endif\r
+#endif   \r
+}\r
diff --git a/ti/user_misc.h b/ti/user_misc.h
new file mode 100644 (file)
index 0000000..9e2a4f5
--- /dev/null
@@ -0,0 +1,127 @@
+/* Copyright (C) 2005 Psi Systems, Inc.
+   Author:  Jean-Marc Valin 
+   File: user_misc.h
+   Memory Allocation overrides to allow user control rather than C alloc/free.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+   
+   - Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+   
+   - Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+   
+   - Neither the name of the Xiph.org Foundation nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+   
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+\r
+#ifdef MANUAL_ALLOC\r
+\r
+/* To avoid changing the Speex call model, this file relies on four static variables \r
+   The user main creates two linear buffers, and initializes spxGlobalHeap/ScratchPtr \r
+   to point to the start of the two buffers, and initializes spxGlobalHeap/ScratchEnd \r
+   to point to the first address following the last byte of the two buffers.\r
+   \r
+   This mechanism allows, for example, data caching for multichannel applications, \r
+   where the Speex state is swapped from a large slow memory to a small fast memory \r
+   each time the codec runs.\r
+   \r
+   Persistent data is allocated in spxGlobalHeap (instead of calloc), while scratch\r
+   data is allocated in spxGlobalScratch.\r
+*/\r
+\r
+extern char *spxGlobalHeapPtr, *spxGlobalHeapEnd; \r
+extern char *spxGlobalScratchPtr, *spxGlobalScratchEnd;\r
+\r
+/* Make sure that all structures are aligned to largest type */\r
+#define BLOCK_MASK      (sizeof(long double)-1)\r
+\r
+#define OVERRIDE_SPEEX_ALLOC\r
+void *speex_alloc (int size)\r
+{\r
+    void *ptr;\r
+    \r
+    ptr = (void *) (((int)spxGlobalHeapPtr + BLOCK_MASK) & ~BLOCK_MASK);  //Start on 8 boundary\r
+\r
+    spxGlobalHeapPtr = (char *)((int)ptr + size);      // Update pointer to next free location\r
+\r
+    if (spxGlobalHeapPtr > spxGlobalHeapEnd ) \r
+    {\r
+#ifdef VERBOSE_ALLOC\r
+           fprintf (stderr, "insufficient space for persistent alloc request %d bytes\n", size);\r
+#endif\r
+       return 0;\r
+    }\r
+   \r
+#ifdef VERBOSE_ALLOC\r
+    fprintf (stderr, "Persist Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalHeapEnd - (int)spxGlobalHeapPtr));\r
+#endif\r
+    memset(ptr, 0, size);\r
+    return ptr;\r
+}\r
+\r
+#define OVERRIDE_SPEEX_ALLOC_SCRATCH\r
+void *speex_alloc_scratch (int size)\r
+{\r
+    void *ptr;\r
+\r
+    ptr = (void *) (((int)spxGlobalScratchPtr + BLOCK_MASK) & ~BLOCK_MASK);  //Start on 8 boundary\r
+\r
+    spxGlobalScratchPtr = (char *)((int)ptr + size);   // Update pointer to next free location\r
+\r
+    if (spxGlobalScratchPtr > spxGlobalScratchEnd ) \r
+    {\r
+#ifdef VERBOSE_ALLOC\r
+           fprintf (stderr, "insufficient space for scratch alloc request %d bytes\n", size);\r
+#endif\r
+       return 0;\r
+    }\r
+   \r
+#ifdef VERBOSE_ALLOC\r
+    fprintf (stderr, "Scratch Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalScratchEnd - (int)spxGlobalScratchPtr));\r
+#endif\r
+    memset(ptr, 0, size);\r
+    return ptr;\r
+}\r
+\r
+#define OVERRIDE_SPEEX_REALLOC\r
+void *speex_realloc (void *ptr, int size)\r
+{\r
+#ifdef VERBOSE_ALLOC\r
+   speex_warning("realloc attempted, not allowed");\r
+#endif\r
+   return 0;\r
+}\r
+\r
+#define OVERRIDE_SPEEX_FREE\r
+void speex_free (void *ptr)\r
+{\r
+#ifdef VERBOSE_ALLOC\r
+   speex_warning("at speex_free");\r
+#endif\r
+}\r
+#define OVERRIDE_SPEEX_FREE_SCRATCH\r
+void speex_free_scratch (void *ptr)\r
+{\r
+#ifdef VERBOSE_ALLOC\r
+   speex_warning("at speex_free_scratch");\r
+#endif\r
+}\r
+\r
+#endif    /* !MANUAL_ALLOC */\r