From 3f9f041e628f96100e16adc6691c30f0ac688a3d Mon Sep 17 00:00:00 2001 From: magekkkk Date: Sun, 27 Apr 2025 02:22:54 +0000 Subject: [PATCH 1/2] remove speex Signed-off-by: magekkkk --- speex/AUTHORS | 18 - speex/BUILD.gn | 54 - speex/COPYING | 35 - speex/ChangeLog | 21 - speex/Doxyfile | 225 - speex/INSTALL | 8 - speex/Makefile.am | 19 - speex/NEWS | 1 - speex/README | 3 - speex/README.Trimedia | 103 - speex/README.blackfin | 22 - speex/README.win32 | 11 - speex/SpeexDSP.kdevelop | 201 - speex/SpeexDSP.spec.in | 67 - speex/TODO | 32 - speex/acinclude.m4 | 102 - speex/configure.ac | 370 - speex/doc/.cvsignore | 2 - speex/doc/Makefile.am | 3 - speex/doc/celp_decoder.eps | 688 - speex/doc/celp_decoder.odg | Bin 10765 -> 0 bytes speex/doc/components.eps | 1361 -- speex/doc/components.odg | Bin 12462 -> 0 bytes speex/doc/echo_path.eps | 1298 -- speex/doc/echo_path.odg | Bin 29078 -> 0 bytes speex/doc/manual.lyx | 11984 ---------------- speex/doc/manual.pdf | Bin 439545 -> 0 bytes speex/doc/programming.html | 125 - speex/doc/ref_shaping.eps | 2045 --- speex/doc/sampledec.c | 65 - speex/doc/sampleenc.c | 64 - speex/doc/speex_abs.eps | 3022 ---- speex/doc/speex_abs.odg | Bin 86072 -> 0 bytes speex/doc/speex_analysis.eps | 744 - speex/doc/speex_analysis.odg | Bin 16581 -> 0 bytes speex/html/speex.png | Bin 4470 -> 0 bytes speex/html/speex.webprj | 7 - speex/html/speex.xcf | Bin 24879 -> 0 bytes speex/include/Makefile.am | 2 - speex/include/speex/Makefile.am | 18 - speex/include/speex/speex_buffer.h | 68 - speex/include/speex/speex_echo.h | 170 - speex/include/speex/speex_jitter.h | 197 - speex/include/speex/speex_preprocess.h | 219 - speex/include/speex/speex_resampler.h | 343 - speex/include/speex/speexdsp_config_types.h | 12 - speex/include/speex/speexdsp_types.h | 126 - speex/libspeexdsp/.cvsignore | 11 - speex/libspeexdsp/Makefile.am | 46 - speex/libspeexdsp/_kiss_fft_guts.h | 160 - speex/libspeexdsp/arch.h | 237 - speex/libspeexdsp/bfin.h | 15 - speex/libspeexdsp/buffer.c | 176 - speex/libspeexdsp/echo_diagnostic.m | 72 - speex/libspeexdsp/fftwrap.c | 448 - speex/libspeexdsp/fftwrap.h | 58 - speex/libspeexdsp/filterbank.c | 227 - speex/libspeexdsp/filterbank.h | 66 - speex/libspeexdsp/fixed_arm4.h | 148 - speex/libspeexdsp/fixed_arm5e.h | 178 - speex/libspeexdsp/fixed_bfin.h | 176 - speex/libspeexdsp/fixed_debug.h | 487 - speex/libspeexdsp/fixed_generic.h | 110 - speex/libspeexdsp/jitter.c | 839 -- speex/libspeexdsp/kiss_fft.c | 523 - speex/libspeexdsp/kiss_fft.h | 108 - speex/libspeexdsp/kiss_fftr.c | 297 - speex/libspeexdsp/kiss_fftr.h | 51 - speex/libspeexdsp/math_approx.h | 332 - speex/libspeexdsp/mdf.c | 1279 -- speex/libspeexdsp/misc_bfin.h | 56 - speex/libspeexdsp/os_support.h | 169 - speex/libspeexdsp/preprocess.c | 1215 -- speex/libspeexdsp/pseudofloat.h | 379 - speex/libspeexdsp/resample.c | 1241 -- speex/libspeexdsp/resample_neon.h | 339 - speex/libspeexdsp/resample_sse.h | 128 - speex/libspeexdsp/scal.c | 293 - speex/libspeexdsp/smallft.c | 1261 -- speex/libspeexdsp/smallft.h | 46 - speex/libspeexdsp/stack_alloc.h | 115 - speex/libspeexdsp/testdenoise.c | 44 - speex/libspeexdsp/testecho.c | 53 - speex/libspeexdsp/testjitter.c | 75 - speex/libspeexdsp/testresample.c | 86 - speex/libspeexdsp/testresample2.c | 93 - speex/libspeexdsp/vorbis_psy.h | 97 - speex/macosx/English.lproj/InfoPlist.strings | 3 - speex/macosx/Info.plist | 30 - speex/macosx/Speex.xcodeproj/project.pbxproj | 538 - speex/macosx/Speex_Prefix.pch | 5 - .../macosx/Speex_UB.xcodeproj/project.pbxproj | 435 - .../1-resampler_unsigned_fix.patch | 17 - speex/regressions | 4 - speex/speexdsp.pc.in | 15 - speex/symbian/Makefile.am | 6 - speex/symbian/bld.inf | 49 - speex/symbian/speex.mmp | 40 - speex/ti/Makefile.am | 9 - speex/ti/os_support_custom.h | 128 - speex/ti/speex_C54_test/Makefile.am | 8 - speex/ti/speex_C54_test/speex_C54_test.cmd | 71 - speex/ti/speex_C54_test/speex_C54_test.pjt | 44 - speex/ti/speex_C55_test/Makefile.am | 6 - speex/ti/speex_C55_test/speex_C55_test.cmd | 65 - speex/ti/speex_C55_test/speex_C55_test.pjt | 44 - speex/ti/speex_C64_test/Makefile.am | 6 - speex/ti/speex_C64_test/speex_C64_test.cmd | 59 - speex/ti/speex_C64_test/speex_C64_test.pjt | 45 - speex/tmv/_kiss_fft_guts_tm.h | 188 - speex/tmv/fftwrap_tm.h | 233 - speex/tmv/filterbank_tm.h | 289 - speex/tmv/fixed_tm.h | 100 - speex/tmv/kiss_fft_tm.h | 599 - speex/tmv/kiss_fftr_tm.h | 235 - speex/tmv/mdf_tm.h | 1192 -- speex/tmv/misc_tm.h | 92 - speex/tmv/preprocess_tm.h | 1135 -- speex/tmv/profile_tm.h | 407 - speex/tmv/speex_config_types.h | 31 - speex/win32/Makefile.am | 8 - speex/win32/VS2003/Makefile.am | 8 - speex/win32/VS2003/libspeexdsp.sln | 116 - speex/win32/VS2003/libspeexdsp/Makefile.am | 8 - .../VS2003/libspeexdsp/libspeexdsp.vcproj | 345 - speex/win32/VS2003/tests/Makefile.am | 8 - speex/win32/VS2003/tests/testdenoise.vcproj | 213 - speex/win32/VS2003/tests/testecho.vcproj | 213 - speex/win32/VS2003/tests/testresample.vcproj | 213 - speex/win32/VS2005/Makefile.am | 8 - speex/win32/VS2005/libspeexdsp.sln | 231 - speex/win32/VS2005/libspeexdsp/Makefile.am | 8 - .../VS2005/libspeexdsp/libspeexdsp.vcproj | 1628 --- speex/win32/VS2005/tests/Makefile.am | 8 - speex/win32/VS2005/tests/testdenoise.vcproj | 307 - speex/win32/VS2005/tests/testecho.vcproj | 307 - speex/win32/VS2005/tests/testresample.vcproj | 307 - speex/win32/VS2008/Makefile.am | 8 - speex/win32/VS2008/libspeexdsp.sln | 411 - speex/win32/VS2008/libspeexdsp/Makefile.am | 8 - .../VS2008/libspeexdsp/libspeexdsp.vcproj | 474 - speex/win32/VS2008/tests/Makefile.am | 8 - speex/win32/VS2008/tests/testdenoise.vcproj | 305 - speex/win32/VS2008/tests/testecho.vcproj | 305 - speex/win32/VS2008/tests/testresample.vcproj | 305 - speex/win32/libspeexdsp.def | 76 - speex/win32/libspeexdsp/Makefile.am | 6 - speex/win32/libspeexdsp/libspeexdsp.dsp | 228 - speex/win32/libspeexdsp/libspeexdsp.dsw | 41 - .../win32/libspeexdsp/libspeexdsp_dynamic.dsp | 237 - speex/win32/speex.iss | 47 - 151 files changed, 48112 deletions(-) delete mode 100644 speex/AUTHORS delete mode 100644 speex/BUILD.gn delete mode 100644 speex/COPYING delete mode 100644 speex/ChangeLog delete mode 100644 speex/Doxyfile delete mode 100644 speex/INSTALL delete mode 100644 speex/Makefile.am delete mode 100644 speex/NEWS delete mode 100644 speex/README delete mode 100644 speex/README.Trimedia delete mode 100644 speex/README.blackfin delete mode 100644 speex/README.win32 delete mode 100644 speex/SpeexDSP.kdevelop delete mode 100644 speex/SpeexDSP.spec.in delete mode 100644 speex/TODO delete mode 100644 speex/acinclude.m4 delete mode 100644 speex/configure.ac delete mode 100644 speex/doc/.cvsignore delete mode 100644 speex/doc/Makefile.am delete mode 100644 speex/doc/celp_decoder.eps delete mode 100644 speex/doc/celp_decoder.odg delete mode 100644 speex/doc/components.eps delete mode 100644 speex/doc/components.odg delete mode 100644 speex/doc/echo_path.eps delete mode 100644 speex/doc/echo_path.odg delete mode 100644 speex/doc/manual.lyx delete mode 100644 speex/doc/manual.pdf delete mode 100644 speex/doc/programming.html delete mode 100644 speex/doc/ref_shaping.eps delete mode 100644 speex/doc/sampledec.c delete mode 100644 speex/doc/sampleenc.c delete mode 100644 speex/doc/speex_abs.eps delete mode 100644 speex/doc/speex_abs.odg delete mode 100644 speex/doc/speex_analysis.eps delete mode 100644 speex/doc/speex_analysis.odg delete mode 100644 speex/html/speex.png delete mode 100644 speex/html/speex.webprj delete mode 100644 speex/html/speex.xcf delete mode 100644 speex/include/Makefile.am delete mode 100644 speex/include/speex/Makefile.am delete mode 100644 speex/include/speex/speex_buffer.h delete mode 100644 speex/include/speex/speex_echo.h delete mode 100644 speex/include/speex/speex_jitter.h delete mode 100644 speex/include/speex/speex_preprocess.h delete mode 100644 speex/include/speex/speex_resampler.h delete mode 100644 speex/include/speex/speexdsp_config_types.h delete mode 100644 speex/include/speex/speexdsp_types.h delete mode 100644 speex/libspeexdsp/.cvsignore delete mode 100644 speex/libspeexdsp/Makefile.am delete mode 100644 speex/libspeexdsp/_kiss_fft_guts.h delete mode 100644 speex/libspeexdsp/arch.h delete mode 100644 speex/libspeexdsp/bfin.h delete mode 100644 speex/libspeexdsp/buffer.c delete mode 100644 speex/libspeexdsp/echo_diagnostic.m delete mode 100644 speex/libspeexdsp/fftwrap.c delete mode 100644 speex/libspeexdsp/fftwrap.h delete mode 100644 speex/libspeexdsp/filterbank.c delete mode 100644 speex/libspeexdsp/filterbank.h delete mode 100644 speex/libspeexdsp/fixed_arm4.h delete mode 100644 speex/libspeexdsp/fixed_arm5e.h delete mode 100644 speex/libspeexdsp/fixed_bfin.h delete mode 100644 speex/libspeexdsp/fixed_debug.h delete mode 100644 speex/libspeexdsp/fixed_generic.h delete mode 100644 speex/libspeexdsp/jitter.c delete mode 100644 speex/libspeexdsp/kiss_fft.c delete mode 100644 speex/libspeexdsp/kiss_fft.h delete mode 100644 speex/libspeexdsp/kiss_fftr.c delete mode 100644 speex/libspeexdsp/kiss_fftr.h delete mode 100644 speex/libspeexdsp/math_approx.h delete mode 100644 speex/libspeexdsp/mdf.c delete mode 100644 speex/libspeexdsp/misc_bfin.h delete mode 100644 speex/libspeexdsp/os_support.h delete mode 100644 speex/libspeexdsp/preprocess.c delete mode 100644 speex/libspeexdsp/pseudofloat.h delete mode 100644 speex/libspeexdsp/resample.c delete mode 100644 speex/libspeexdsp/resample_neon.h delete mode 100644 speex/libspeexdsp/resample_sse.h delete mode 100644 speex/libspeexdsp/scal.c delete mode 100644 speex/libspeexdsp/smallft.c delete mode 100644 speex/libspeexdsp/smallft.h delete mode 100644 speex/libspeexdsp/stack_alloc.h delete mode 100644 speex/libspeexdsp/testdenoise.c delete mode 100644 speex/libspeexdsp/testecho.c delete mode 100644 speex/libspeexdsp/testjitter.c delete mode 100644 speex/libspeexdsp/testresample.c delete mode 100644 speex/libspeexdsp/testresample2.c delete mode 100644 speex/libspeexdsp/vorbis_psy.h delete mode 100644 speex/macosx/English.lproj/InfoPlist.strings delete mode 100644 speex/macosx/Info.plist delete mode 100644 speex/macosx/Speex.xcodeproj/project.pbxproj delete mode 100644 speex/macosx/Speex_Prefix.pch delete mode 100644 speex/macosx/Speex_UB.xcodeproj/project.pbxproj delete mode 100644 speex/regression-fixes/1-resampler_unsigned_fix.patch delete mode 100644 speex/regressions delete mode 100644 speex/speexdsp.pc.in delete mode 100644 speex/symbian/Makefile.am delete mode 100644 speex/symbian/bld.inf delete mode 100644 speex/symbian/speex.mmp delete mode 100644 speex/ti/Makefile.am delete mode 100644 speex/ti/os_support_custom.h delete mode 100644 speex/ti/speex_C54_test/Makefile.am delete mode 100644 speex/ti/speex_C54_test/speex_C54_test.cmd delete mode 100644 speex/ti/speex_C54_test/speex_C54_test.pjt delete mode 100644 speex/ti/speex_C55_test/Makefile.am delete mode 100644 speex/ti/speex_C55_test/speex_C55_test.cmd delete mode 100644 speex/ti/speex_C55_test/speex_C55_test.pjt delete mode 100644 speex/ti/speex_C64_test/Makefile.am delete mode 100644 speex/ti/speex_C64_test/speex_C64_test.cmd delete mode 100644 speex/ti/speex_C64_test/speex_C64_test.pjt delete mode 100644 speex/tmv/_kiss_fft_guts_tm.h delete mode 100644 speex/tmv/fftwrap_tm.h delete mode 100644 speex/tmv/filterbank_tm.h delete mode 100644 speex/tmv/fixed_tm.h delete mode 100644 speex/tmv/kiss_fft_tm.h delete mode 100644 speex/tmv/kiss_fftr_tm.h delete mode 100644 speex/tmv/mdf_tm.h delete mode 100644 speex/tmv/misc_tm.h delete mode 100644 speex/tmv/preprocess_tm.h delete mode 100644 speex/tmv/profile_tm.h delete mode 100644 speex/tmv/speex_config_types.h delete mode 100644 speex/win32/Makefile.am delete mode 100644 speex/win32/VS2003/Makefile.am delete mode 100644 speex/win32/VS2003/libspeexdsp.sln delete mode 100644 speex/win32/VS2003/libspeexdsp/Makefile.am delete mode 100644 speex/win32/VS2003/libspeexdsp/libspeexdsp.vcproj delete mode 100644 speex/win32/VS2003/tests/Makefile.am delete mode 100644 speex/win32/VS2003/tests/testdenoise.vcproj delete mode 100644 speex/win32/VS2003/tests/testecho.vcproj delete mode 100644 speex/win32/VS2003/tests/testresample.vcproj delete mode 100644 speex/win32/VS2005/Makefile.am delete mode 100644 speex/win32/VS2005/libspeexdsp.sln delete mode 100644 speex/win32/VS2005/libspeexdsp/Makefile.am delete mode 100644 speex/win32/VS2005/libspeexdsp/libspeexdsp.vcproj delete mode 100644 speex/win32/VS2005/tests/Makefile.am delete mode 100644 speex/win32/VS2005/tests/testdenoise.vcproj delete mode 100644 speex/win32/VS2005/tests/testecho.vcproj delete mode 100644 speex/win32/VS2005/tests/testresample.vcproj delete mode 100644 speex/win32/VS2008/Makefile.am delete mode 100644 speex/win32/VS2008/libspeexdsp.sln delete mode 100644 speex/win32/VS2008/libspeexdsp/Makefile.am delete mode 100644 speex/win32/VS2008/libspeexdsp/libspeexdsp.vcproj delete mode 100644 speex/win32/VS2008/tests/Makefile.am delete mode 100644 speex/win32/VS2008/tests/testdenoise.vcproj delete mode 100644 speex/win32/VS2008/tests/testecho.vcproj delete mode 100644 speex/win32/VS2008/tests/testresample.vcproj delete mode 100644 speex/win32/libspeexdsp.def delete mode 100644 speex/win32/libspeexdsp/Makefile.am delete mode 100644 speex/win32/libspeexdsp/libspeexdsp.dsp delete mode 100644 speex/win32/libspeexdsp/libspeexdsp.dsw delete mode 100644 speex/win32/libspeexdsp/libspeexdsp_dynamic.dsp delete mode 100644 speex/win32/speex.iss diff --git a/speex/AUTHORS b/speex/AUTHORS deleted file mode 100644 index 395c3fec2..000000000 --- a/speex/AUTHORS +++ /dev/null @@ -1,18 +0,0 @@ -Jean-Marc Valin - All the code except the following - -David Rowe - lsp.c lsp.h - Also ideas and feedback - -John Francis Edwards - wave_out.[ch], some #ifdefs for windows port and MSVC project files - -Segher Boessenkool - Misc. optimizations (for QMF in particular) - -Atsuhiko Yamanaka : - Patch to speexenc.c to add Vorbis comment format - -Radim Kolar : - Patch to speexenc.c for supporting more input formats diff --git a/speex/BUILD.gn b/speex/BUILD.gn deleted file mode 100644 index 523c0e2d4..000000000 --- a/speex/BUILD.gn +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (c) 2021-2022 Huawei Device Co., Ltd. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import("//build/ohos.gni") - -config("speex_config") { - visibility = [ ":*" ] - - include_dirs = [ - "include", - "libspeexdsp", - ] - - cflags = [ - "-Wall", - "-Werror", - "-Wno-sign-compare", - "-Wno-unused-parameter", - ] -} - -ohos_source_set("speex_sources") { - sources = [ "libspeexdsp/resample.c" ] - - configs = [ ":speex_config" ] - subsystem_name = "thirdparty" - part_name = "pulseaudio" -} - -config("speexresampler_header") { - include_dirs = [ "//third_party/pulseaudio/speex/include" ] -} - -ohos_shared_library("speexresampler") { - deps = [ ":speex_sources" ] - innerapi_tags = [ - "chipsetsdk_indirect", - "platformsdk_indirect", - ] - - public_configs = [ ":speexresampler_header" ] - subsystem_name = "thirdparty" - part_name = "pulseaudio" -} diff --git a/speex/COPYING b/speex/COPYING deleted file mode 100644 index de6fbe2c9..000000000 --- a/speex/COPYING +++ /dev/null @@ -1,35 +0,0 @@ -Copyright 2002-2008 Xiph.org Foundation -Copyright 2002-2008 Jean-Marc Valin -Copyright 2005-2007 Analog Devices Inc. -Copyright 2005-2008 Commonwealth Scientific and Industrial Research - Organisation (CSIRO) -Copyright 1993, 2002, 2006 David Rowe -Copyright 2003 EpicGames -Copyright 1992-1994 Jutta Degener, Carsten Bormann - -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. diff --git a/speex/ChangeLog b/speex/ChangeLog deleted file mode 100644 index 9a6cd8af0..000000000 --- a/speex/ChangeLog +++ /dev/null @@ -1,21 +0,0 @@ -2005-09-07 Thomas Vander Stichele - - * libspeex/cb_search.c: (split_cb_search_shape_sign_N1): - add declaration for n, seems like an obvious build fix, slap - me down if it's not - -2004-02-18 Jean-Marc Valin - Patch for compiling with mingw32 sent by j@thing.net - -2004-02-18 Jean-Marc Valin - Integrated IRIX patch (getopt stuff) from Michael Pruett - -2004-02-18 Jean-Marc Valin - Changed the Makefile.am so that KDevelop can parse SUBDIRS correctly - -2002/03/27 Jean-Marc Valin: -Working encoder and decoder for both narrowband and wideband. - -2002/02/27 Jean-Marc Valin: -Got the basic encoder working as a demo with quantization only on some -parameters. diff --git a/speex/Doxyfile b/speex/Doxyfile deleted file mode 100644 index 772934fc3..000000000 --- a/speex/Doxyfile +++ /dev/null @@ -1,225 +0,0 @@ -# Doxyfile 1.5.1-KDevelop - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- -PROJECT_NAME = Speex -PROJECT_NUMBER = 1.2-beta2 -OUTPUT_DIRECTORY = doc -CREATE_SUBDIRS = NO -OUTPUT_LANGUAGE = English -USE_WINDOWS_ENCODING = NO -BRIEF_MEMBER_DESC = YES -REPEAT_BRIEF = YES -ABBREVIATE_BRIEF = -ALWAYS_DETAILED_SEC = NO -INLINE_INHERITED_MEMB = NO -FULL_PATH_NAMES = NO -STRIP_FROM_PATH = -STRIP_FROM_INC_PATH = -SHORT_NAMES = NO -JAVADOC_AUTOBRIEF = NO -MULTILINE_CPP_IS_BRIEF = NO -DETAILS_AT_TOP = NO -INHERIT_DOCS = YES -SEPARATE_MEMBER_PAGES = NO -TAB_SIZE = 8 -ALIASES = -OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = NO -BUILTIN_STL_SUPPORT = NO -DISTRIBUTE_GROUP_DOC = NO -SUBGROUPING = YES -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- -EXTRACT_ALL = NO -EXTRACT_PRIVATE = NO -EXTRACT_STATIC = NO -EXTRACT_LOCAL_CLASSES = YES -EXTRACT_LOCAL_METHODS = NO -HIDE_UNDOC_MEMBERS = NO -HIDE_UNDOC_CLASSES = NO -HIDE_FRIEND_COMPOUNDS = NO -HIDE_IN_BODY_DOCS = NO -INTERNAL_DOCS = NO -CASE_SENSE_NAMES = YES -HIDE_SCOPE_NAMES = NO -SHOW_INCLUDE_FILES = YES -INLINE_INFO = YES -SORT_MEMBER_DOCS = YES -SORT_BRIEF_DOCS = NO -SORT_BY_SCOPE_NAME = NO -GENERATE_TODOLIST = YES -GENERATE_TESTLIST = YES -GENERATE_BUGLIST = YES -GENERATE_DEPRECATEDLIST= YES -ENABLED_SECTIONS = -MAX_INITIALIZER_LINES = 30 -SHOW_USED_FILES = YES -SHOW_DIRECTORIES = YES -FILE_VERSION_FILTER = -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- -QUIET = NO -WARNINGS = YES -WARN_IF_UNDOCUMENTED = YES -WARN_IF_DOC_ERROR = YES -WARN_NO_PARAMDOC = NO -WARN_FORMAT = "$file:$line: $text" -WARN_LOGFILE = -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- -INPUT = include/speex -FILE_PATTERNS = -RECURSIVE = NO -EXCLUDE = -EXCLUDE_SYMLINKS = NO -EXCLUDE_PATTERNS = speex_config_types.h -EXAMPLE_PATH = -EXAMPLE_PATTERNS = -EXAMPLE_RECURSIVE = NO -IMAGE_PATH = -INPUT_FILTER = -FILTER_PATTERNS = -FILTER_SOURCE_FILES = NO -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- -SOURCE_BROWSER = NO -INLINE_SOURCES = NO -STRIP_CODE_COMMENTS = YES -REFERENCED_BY_RELATION = YES -REFERENCES_RELATION = YES -REFERENCES_LINK_SOURCE = YES -USE_HTAGS = NO -VERBATIM_HEADERS = YES -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- -ALPHABETICAL_INDEX = NO -COLS_IN_ALPHA_INDEX = 5 -IGNORE_PREFIX = -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- -GENERATE_HTML = YES -HTML_OUTPUT = html -HTML_FILE_EXTENSION = .html -HTML_HEADER = -HTML_FOOTER = -HTML_STYLESHEET = -HTML_ALIGN_MEMBERS = YES -GENERATE_HTMLHELP = NO -CHM_FILE = -HHC_LOCATION = -GENERATE_CHI = NO -BINARY_TOC = NO -TOC_EXPAND = NO -DISABLE_INDEX = NO -ENUM_VALUES_PER_LINE = 4 -GENERATE_TREEVIEW = NO -TREEVIEW_WIDTH = 250 -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- -GENERATE_LATEX = YES -LATEX_OUTPUT = latex -LATEX_CMD_NAME = latex -MAKEINDEX_CMD_NAME = makeindex -COMPACT_LATEX = NO -PAPER_TYPE = a4wide -EXTRA_PACKAGES = -LATEX_HEADER = -PDF_HYPERLINKS = YES -USE_PDFLATEX = YES -LATEX_BATCHMODE = NO -LATEX_HIDE_INDICES = NO -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- -GENERATE_RTF = NO -RTF_OUTPUT = rtf -COMPACT_RTF = NO -RTF_HYPERLINKS = NO -RTF_STYLESHEET_FILE = -RTF_EXTENSIONS_FILE = -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- -GENERATE_MAN = NO -MAN_OUTPUT = man -MAN_EXTENSION = .3 -MAN_LINKS = NO -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- -GENERATE_XML = NO -XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = -XML_PROGRAMLISTING = YES -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- -GENERATE_AUTOGEN_DEF = NO -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- -GENERATE_PERLMOD = NO -PERLMOD_LATEX = NO -PERLMOD_PRETTY = YES -PERLMOD_MAKEVAR_PREFIX = -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- -ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO -SEARCH_INCLUDES = YES -INCLUDE_PATH = -INCLUDE_FILE_PATTERNS = -PREDEFINED = -EXPAND_AS_DEFINED = -SKIP_FUNCTION_MACROS = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- -TAGFILES = -GENERATE_TAGFILE = -ALLEXTERNALS = NO -EXTERNAL_GROUPS = YES -PERL_PATH = /usr/bin/perl -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- -CLASS_DIAGRAMS = YES -HIDE_UNDOC_RELATIONS = YES -HAVE_DOT = NO -CLASS_GRAPH = YES -COLLABORATION_GRAPH = YES -GROUP_GRAPHS = YES -UML_LOOK = NO -TEMPLATE_RELATIONS = YES -INCLUDE_GRAPH = YES -INCLUDED_BY_GRAPH = YES -CALL_GRAPH = NO -CALLER_GRAPH = NO -GRAPHICAL_HIERARCHY = YES -DIRECTORY_GRAPH = YES -DOT_IMAGE_FORMAT = gif -DOT_PATH = -DOTFILE_DIRS = -MAX_DOT_GRAPH_WIDTH = 1024 -MAX_DOT_GRAPH_HEIGHT = 1024 -MAX_DOT_GRAPH_DEPTH = 0 -DOT_TRANSPARENT = NO -DOT_MULTI_TARGETS = NO -GENERATE_LEGEND = YES -DOT_CLEANUP = YES -#--------------------------------------------------------------------------- -# Configuration::additions related to the search engine -#--------------------------------------------------------------------------- -SEARCHENGINE = NO diff --git a/speex/INSTALL b/speex/INSTALL deleted file mode 100644 index 1920150e7..000000000 --- a/speex/INSTALL +++ /dev/null @@ -1,8 +0,0 @@ -Installing SpeexDSP is as easy as: - -% ./configure [--prefix=] -% make -% make install - -Note that if you are using the code from git you will need to run "autogen.sh" -and then "configure". diff --git a/speex/Makefile.am b/speex/Makefile.am deleted file mode 100644 index 177ff1baf..000000000 --- a/speex/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# To disable automatic dependency tracking if using other tools than -# gcc and gmake, add the option 'no-dependencies' -AUTOMAKE_OPTIONS = 1.8 -ACLOCAL_AMFLAGS = -I m4 - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = speexdsp.pc - -EXTRA_DIST = SpeexDSP.spec SpeexDSP.spec.in SpeexDSP.kdevelop speexdsp.pc.in README.blackfin - -#Fools KDevelop into including all files -SUBDIRS = libspeexdsp include doc win32 symbian ti - -DIST_SUBDIRS = libspeexdsp include doc win32 symbian ti - -rpm: dist - rpmbuild -ta ${PACKAGE}-${VERSION}.tar.gz diff --git a/speex/NEWS b/speex/NEWS deleted file mode 100644 index 9a9952914..000000000 --- a/speex/NEWS +++ /dev/null @@ -1 +0,0 @@ -2002/02/13: Creation of the "Speex" project diff --git a/speex/README b/speex/README deleted file mode 100644 index 8d10b1c25..000000000 --- a/speex/README +++ /dev/null @@ -1,3 +0,0 @@ -See INSTALL file for instructions on how to install SpeexDSP. - -SpeexDSP is a patent-free, Open Source/Free Software DSP library. diff --git a/speex/README.Trimedia b/speex/README.Trimedia deleted file mode 100644 index de59c8460..000000000 --- a/speex/README.Trimedia +++ /dev/null @@ -1,103 +0,0 @@ -################# REMOVE warnings on trimedia compiler ############################## -################# Not critical to compilation ############################## - -1. Change the following statements to remove warning for constant expression -(i) mdf.c [if(0) --> #if 0] -(ii) preprocess.c [if(1) --> #if 1] - -2. add REMARK_ON macro to remove warning on not reference variable --- uses (void) to remove warning on not referenced variable --- #define REMARK_ON --- (void) --- #endif --- search for REMARK_ON on the following files -(i) jitter.c -(ii) mdf.c -(iii) filterbank.c -(iv) preprocess.c - -3. commented out the following in pseudofloat.h for unused variable -//static const spx_float_t FLOAT_HALF = {16384,-15}; - -################# Patches for trimedia compiler ############################## -################# Critical to compilation ############################## - --- added the #elif defined (TM_ASM) to the following files for optimized codes -(1) arch.h -(2) fftwrap.c -(3) filterbank.c -(4) kiss_fft.c -(5) kiss_fftr.c -(6) mdf.c -(7) preprocess.c - --- added macro PREPROCESS_MDF_FLOAT to allow using of floating point --- in mdf and preprocess while keeping fixed point in encoder/decoder --- This is due to the fact that preprocess/mdf run faster on floating --- point on trimedia --- added the following 3 lines to the files below -#ifdef PREPROCESS_MDF_FLOAT -#undef FIXED_POINT -#endif -(1) mdf.c -(2) preprocess.c -(3) filterbank.c -(4) fftwrap.c -(5) kiss_fft.c -(6) kiss_fftr.c - --- created a new USE_COMPACT_KISS_FFT for fftwrap.c and shifted defination --- to config file so that user configure the usage of fft on config.h --- TOEXPLORE:is it possible to share table between mdf/preprocess? --- Introducing this macro made the following changes in C code --- New macro to facilitate integration -(grouping real/complex for dc and nyquist frequency seems to require a large -amount of memory for mdf, therefore did not made the changes for that) -(1) modify preprocess.c on init and destroy -(2) modify mdf.c on init and destroy -(3) shifted power_spectrum to fftwrap.c to share optimised code between - preprocess.c and mdf.c - -################# NOTES ############################## -(1) fixed point encoding/decoding is tested on narrowband - - some of the QX fractions are packed together to - (frac1 * a + frac2 * a) >> X (should be more accurate in rounding) - instead of - ((frac1 * a) >> X) + ((frac2 * a) >> X) - will cause some different between optimized and unoptimized code. - tried decoding/encoding optimized code on some audio files retains - the clearity of the word - - - wideband/ultrawideband is not heavily tested yet - -(2) optimized fixed point code requires memory alignment - - used config to debug on functions where memory is not align - -(3) floating point optimization for preprocess/mdf is tested - fixed point is not tested yet (except fft/filterbank) - Note (1) also applies to sround in fft for fixed point - some optimization is provided for fixed point as it requires lesser - memory compared to floating point. - -(4) unroll configurations provided to reduce code size if required - -(5) use profile options only if compiler profiling fails to work - -(6) can't include the makefile as it is close proprietary - -################# TODO:For Trimedia ############################## -(1) Optimizations for fixed point in mdf/preprocess - -################# Added Files ############################## -- _kiss_fft_guts_tm.h -- fftwrap_tm.h -- filterbank_tm.h -- filters_tm.h -- fixed_tm.h -- kiss_fft_tm.h -- kiss_fftr_tm.h -- mdf_tm.h -- misc_tm.h -- preprocess_tm.h -- config.h -- speex_config_types.h diff --git a/speex/README.blackfin b/speex/README.blackfin deleted file mode 100644 index 4270d210f..000000000 --- a/speex/README.blackfin +++ /dev/null @@ -1,22 +0,0 @@ -SpeexDSP has been ported to the Blackfin DSP, for the STAMP development board. - -This port has been tested on the STAMP development board and requires the -toolchain available at http://blackfin.uclinux.org/ - -1/ In order to cross-compile for uClinux from the SpeexDSP tarball: - - ./configure --enable-blackfin-asm --enable-fixed-point --host=bfin-uclinux - cd libspeexdsp - make - -The --enable-blackfin-asm option is not required, but it speeds up Speex by -approximately a factor of two. - -2/ In order to cross-compile for uClinux from the SpeexDSP git: - - git clone git://git.xiph.org/speexdsp.git - cd speexdsp - ./autogen.sh - ./configure --enable-blackfin-asm --enable-fixed-point --host=bfin-uclinux - cd libspeexdsp - make diff --git a/speex/README.win32 b/speex/README.win32 deleted file mode 100644 index d9d4414f2..000000000 --- a/speex/README.win32 +++ /dev/null @@ -1,11 +0,0 @@ -Win32 Specific options - -In order to enable the following options within SpeexDSP, you will need to manually edit the project options for the appropriate VC configuration. These macros can be specified by adding them as "Preprocessor Definitions" under the appropriate Configuration's project options. If you don't know how to do this, please check your Visual C documentation. - -Feature: - -Intel Streaming SIMD Extensions - SSE - macro: USE_SSE -Fixed point - macro: FIXED_POINT -Epic 48 - macro: EPIC_48K - -Note: USE_SSE and FIXED_POINT are mutually exclusive. diff --git a/speex/SpeexDSP.kdevelop b/speex/SpeexDSP.kdevelop deleted file mode 100644 index 1b3d683b0..000000000 --- a/speex/SpeexDSP.kdevelop +++ /dev/null @@ -1,201 +0,0 @@ - - - - Jean-Marc Valin - jean-marc.valin@usherbrooke.ca - $VERSION$ - KDevAutoProject - C - - . - false - - - kdevsubversion - - Speex - - - - libspeex/libspeex.la - float - - - src/Speex - executable - / - - false - true - - false - false - - - - float - kdevgccoptions - kdevgppoptions - kdevpgf77options - -O2 -g -Wall - - --disable-shared - - - - - - - - - - - --enable-fixed-point --disable-shared - fixed - kdevgccoptions - kdevgppoptions - kdevpgf77options - -O2 -g -Wall - - - - - - - - - - - - - - - - - - - - false - 4 - false - - true - 0 - - - - - libtool - - - - - - true - false - false - - - false - true - 10 - - - - - - - - - - - - - true - true - true - false - true - true - true - 350 - 400 - 250 - false - 0 - true - true - false - std=_GLIBCXX_STD;__gnu_cxx=std - true - true - false - false - true - true - true - true - .; - false - false - - - false - 3 - /usr/share/qt3 - 3 - EmbeddedKDevDesigner - /usr/share/qt3/bin/qmake - /usr/bin/designer-qt3 - - - - - set - m_,_ - theValue - true - true - - - true - true - Horizontal - - - - - false - false - - - *.o,*.lo,CVS - true - false - - - - - html/ - html/ - - - - - - - - - - .h - .cpp - - - - - - - - - - diff --git a/speex/SpeexDSP.spec.in b/speex/SpeexDSP.spec.in deleted file mode 100644 index 440856bb0..000000000 --- a/speex/SpeexDSP.spec.in +++ /dev/null @@ -1,67 +0,0 @@ -%define name @PACKAGE@ -%define ver @VERSION@ -%define rel 1 - -Summary: An open-source, patent-free speech codec -Name: %name -Version: %ver -Release: %rel -License: BSD -Group: Application/Devel -Source: http://www.speex.org/download/%{name}-%{ver}.tar.gz -URL: http://www.speex.org/ -Vendor: Speex -Packager: Jean-Marc Valin (jean-marc.valin@usherbrooke.ca) -BuildRoot: /var/tmp/%{name}-build-root -Docdir: /usr/share/doc - -%description -Speex is a patent-free audio codec designed especially for voice (unlike -Vorbis which targets general audio) signals and providing good narrowband -and wideband quality. This project aims to be complementary to the Vorbis -codec. - -%package devel -Summary: Speex development files -Group: Development/Libraries -Requires: %{name} = %{version} - -%description devel -Speex development files. - -%changelog -* Thu Oct 03 2002 Jean-Marc Valin -- Added devel package inspired from PLD spec file - -* Tue Jul 30 2002 Fredrik Rambris 0.5.2 -- Added buildroot and docdir and ldconfig. Makes it builadble by non-roots - and also doesn't write to actual library paths when building. - -%prep -%setup - -%build -export CFLAGS='-O3' -./configure --prefix=/usr --enable-shared --enable-static -make - -%install -rm -rf $RPM_BUILD_ROOT -make DESTDIR=$RPM_BUILD_ROOT install - -%post -p /sbin/ldconfig -%postun -p /sbin/ldconfig - -%files -%defattr(644,root,root,755) -%doc COPYING AUTHORS ChangeLog NEWS README -%doc doc/manual.pdf -%attr(755,root,root) %{_bindir}/speex* -%attr(755,root,root) %{_libdir}/libspeex*.so* - -%files devel -%defattr(644,root,root,755) -%attr(755,root,root) %{_libdir}/libspeex*.la -%{_includedir}/speex/speex*.h -%{_libdir}/pkgconfig/speexdsp.pc -%{_libdir}/libspeex*.a diff --git a/speex/TODO b/speex/TODO deleted file mode 100644 index ffca50200..000000000 --- a/speex/TODO +++ /dev/null @@ -1,32 +0,0 @@ -For 1.2: -Major points: -- Make documentation match the actual code (especially jitter buffer, AEC and preprocessor) -- Get AGC to work in fixed-point even if not totally converted -- Stabilise all APIs (need feedback) -- Short-term estimate in jitter buffer -- Control delay in new AEC API. -- NaN checks? -- Better error reporting -- Make kiss-fft 32-bit safe - -Post 1.2: -improve float<->int conversion -split encoder and decoder? -Merge TriMedia stuff -packet dump -Do VAD properly ---enable-{aec,preprocessor,jitter,resampler} - -Optimisations -- Add restrict in a few places? -- use __builtin_expect() (likely()/unlikely()) - -Allocator override (speex_lib_ctl?) -Fixed-point: - - VBR - - Jitter buffer - - AGC -Denoiser: - - Better noise adaptation -AGC: - - Use median filtering instead of "non-linear mean"? diff --git a/speex/acinclude.m4 b/speex/acinclude.m4 deleted file mode 100644 index 0e1f1abf5..000000000 --- a/speex/acinclude.m4 +++ /dev/null @@ -1,102 +0,0 @@ -# Configure paths for libogg -# Jack Moffitt 10-21-2000 -# Shamelessly stolen from Owen Taylor and Manish Singh - -dnl XIPH_PATH_OGG([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl Test for libogg, and define OGG_CFLAGS and OGG_LIBS -dnl -AC_DEFUN([XIPH_PATH_OGG], -[dnl -dnl Get the cflags and libraries -dnl -AC_ARG_WITH(ogg,[ --with-ogg=PFX Prefix where libogg is installed (optional)], ogg_prefix="$withval", ogg_prefix="") -AC_ARG_WITH(ogg-libraries,[ --with-ogg-libraries=DIR Directory where libogg library is installed (optional)], ogg_libraries="$withval", ogg_libraries="") -AC_ARG_WITH(ogg-includes,[ --with-ogg-includes=DIR Directory where libogg header files are installed (optional)], ogg_includes="$withval", ogg_includes="") -AC_ARG_ENABLE(oggtest, [ --disable-oggtest Do not try to compile and run a test Ogg program],, enable_oggtest=yes) - - if test "x$ogg_libraries" != "x" ; then - OGG_LIBS="-L$ogg_libraries" - elif test "x$ogg_prefix" != "x" ; then - OGG_LIBS="-L$ogg_prefix/lib" - elif test "x$prefix" != "xNONE" ; then - OGG_LIBS="-L$prefix/lib" - fi - - OGG_LIBS="$OGG_LIBS -logg" - - if test "x$ogg_includes" != "x" ; then - OGG_CFLAGS="-I$ogg_includes" - elif test "x$ogg_prefix" != "x" ; then - OGG_CFLAGS="-I$ogg_prefix/include" - elif test "x$prefix" != "xNONE"; then - OGG_CFLAGS="-I$prefix/include" - fi - - AC_MSG_CHECKING(for Ogg) - no_ogg="" - - - if test "x$enable_oggtest" = "xyes" ; then - ac_save_CFLAGS="$CFLAGS" - ac_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $OGG_LIBS" -dnl -dnl Now check if the installed Ogg is sufficiently new. -dnl - rm -f conf.oggtest - AC_TRY_RUN([ -#include -#include -#include -#include - -int main () -{ - system("touch conf.oggtest"); - return 0; -} - -],, no_ogg=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - - if test "x$no_ogg" = "x" ; then - AC_MSG_RESULT(yes) - ifelse([$1], , :, [$1]) - else - AC_MSG_RESULT(no) - if test -f conf.oggtest ; then - : - else - echo "*** Could not run Ogg test program, checking why..." - CFLAGS="$CFLAGS $OGG_CFLAGS" - LIBS="$LIBS $OGG_LIBS" - AC_TRY_LINK([ -#include -#include -], [ return 0; ], - [ echo "*** The test program compiled, but did not run. This usually means" - echo "*** that the run-time linker is not finding Ogg or finding the wrong" - echo "*** version of Ogg. If it is not finding Ogg, you'll need to set your" - echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point" - echo "*** to the installed location Also, make sure you have run ldconfig if that" - echo "*** is required on your system" - echo "***" - echo "*** If you have an old version installed, it is best to remove it, although" - echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"], - [ echo "*** The test program failed to compile or link. See the file config.log for the" - echo "*** exact error that occured. This usually means Ogg was incorrectly installed" - echo "*** or that you have moved Ogg since it was installed." ]) - CFLAGS="$ac_save_CFLAGS" - LIBS="$ac_save_LIBS" - fi - OGG_CFLAGS="" - OGG_LIBS="" - ifelse([$2], , :, [$2]) - fi - AC_SUBST(OGG_CFLAGS) - AC_SUBST(OGG_LIBS) - rm -f conf.oggtest -]) diff --git a/speex/configure.ac b/speex/configure.ac deleted file mode 100644 index eb2801473..000000000 --- a/speex/configure.ac +++ /dev/null @@ -1,370 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -*-m4-*- - -AC_INIT([speexdsp],[1.2.0],[speex-dev@xiph.org]) - -AC_CONFIG_SRCDIR([libspeexdsp/preprocess.c]) -AC_CONFIG_MACRO_DIR([m4]) - -dnl enable silent rules on automake 1.11 and later -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) - - -SPEEXDSP_LT_CURRENT=6 -SPEEXDSP_LT_REVISION=1 -SPEEXDSP_LT_AGE=5 - - -AC_SUBST(SPEEXDSP_LT_CURRENT) -AC_SUBST(SPEEXDSP_LT_REVISION) -AC_SUBST(SPEEXDSP_LT_AGE) - -AM_INIT_AUTOMAKE([foreign no-define]) -AM_MAINTAINER_MODE([enable]) - -AC_CANONICAL_HOST -AC_LIBTOOL_WIN32_DLL -AM_PROG_LIBTOOL - -AC_C_BIGENDIAN -AC_C_CONST -AC_C_INLINE -AC_C_RESTRICT - - -AC_MSG_CHECKING(for C99 variable-size arrays) -AC_TRY_COMPILE( , [ -int foo; -foo = 10; -int array[foo]; -], -[has_var_arrays=yes;AC_DEFINE([VAR_ARRAYS], [], [Use C99 variable-size arrays]) -], -has_var_arrays=no -) -AC_MSG_RESULT($has_var_arrays) - -AC_CHECK_HEADERS([alloca.h getopt.h]) -AC_MSG_CHECKING(for alloca) -AC_TRY_COMPILE( [ -#ifdef HAVE_ALLOCA_H -# include -#endif -#include -], [ -int foo=10; -int *array = alloca(foo); -], -[ -has_alloca=yes; -if test x$has_var_arrays = "xno" ; then -AC_DEFINE([USE_ALLOCA], [], [Make use of alloca]) -fi -], -has_alloca=no -) -AC_MSG_RESULT($has_alloca) - -AC_MSG_CHECKING(for SSE in current arch/CFLAGS) -AC_LINK_IFELSE([ -AC_LANG_PROGRAM([[ -#include -__m128 testfunc(float *a, float *b) { - return _mm_add_ps(_mm_loadu_ps(a), _mm_loadu_ps(b)); -} -]])], -[ -has_sse=yes -], -[ -has_sse=no -] -) -AC_MSG_RESULT($has_sse) - -AC_MSG_CHECKING(for SSE2 in current arch/CFLAGS) -AC_LINK_IFELSE([ -AC_LANG_PROGRAM([[ -#include -__m128d testfunc(double *a, double *b) { - return _mm_add_pd(_mm_loadu_pd(a), _mm_loadu_pd(b)); -} -]])], -[ -has_sse2=yes -], -[ -has_sse2=no -] -) -AC_MSG_RESULT($has_sse2) - -AC_MSG_CHECKING(for NEON in current arch/CFLAGS) -AC_LINK_IFELSE([ -AC_LANG_PROGRAM([[ -#include -int32x4_t testfunc(int16_t *a, int16_t *b) { - return vmull_s16(vld1_s16(a), vld1_s16(b)); -} -]])], -[ -has_neon=yes -], -[ -has_neon=no -] -) -AC_MSG_RESULT($has_neon) - -SAVE_CFLAGS="$CFLAGS" -CFLAGS="$CFLAGS -fvisibility=hidden" -AC_MSG_CHECKING(for ELF visibility) -AC_COMPILE_IFELSE([ -AC_LANG_PROGRAM([[ -#pragma GCC visibility push(hidden) -__attribute__((visibility("default"))) -int var=10; -]])], -[ -has_visibility=yes -AC_DEFINE([EXPORT], [__attribute__((visibility("default")))], [Symbol visibility prefix]) -], -[ -has_visibility=no -AC_DEFINE([EXPORT], [], [Symbol visibility prefix]) -CFLAGS="$SAVE_CFLAGS" -] -) -AC_MSG_RESULT($has_visibility) - -AC_CHECK_HEADERS(sys/soundcard.h sys/audioio.h) - -AC_SUBST(src) - -LT_LIB_M - - -AC_ARG_ENABLE(valgrind, [ --enable-valgrind Enable valgrind extra checks], -[if test "$enableval" = yes; then - AC_DEFINE([ENABLE_VALGRIND], , [Enable valgrind extra checks]) -fi]) - -AC_ARG_ENABLE(sse, [ --enable-sse Enable SSE support], [ -if test "x$enableval" != xno; then -has_sse=yes -has_sse2=yes -CFLAGS="$CFLAGS -O3 -msse -msse2" -else -has_sse=no -has_sse2=no -fi -]) - -AC_ARG_ENABLE(neon, [ --enable-neon Enable NEON support], [ -if test "x$enableval" != xno; then -has_neon=yes -AS_CASE(["$host"], - [arm*], [CFLAGS="$CFLAGS -O3 -march=armv7-a -mfpu=neon"] -) -else -has_neon=no -fi -]) - - -FFT=smallft - -AC_ARG_ENABLE(fixed-point, [ --enable-fixed-point Compile as fixed-point], -[if test "$enableval" = yes; then - FFT=kiss - has_sse=no - AC_DEFINE([FIXED_POINT], , [Compile as fixed-point]) -else - AC_DEFINE([FLOATING_POINT], , [Compile as floating-point]) -fi], -AC_DEFINE([FLOATING_POINT], , [Compile as floating-point])) - -if test "$has_sse" = yes; then - AC_DEFINE([USE_SSE], , [Enable SSE support]) -fi - -if test "$has_neon" = yes; then - AC_DEFINE([USE_NEON], , [Enable NEON support]) -fi - -if test "$has_sse2" = yes; then - AC_DEFINE([USE_SSE2], , [Enable SSE2 support]) -fi - -AC_ARG_ENABLE(float-api, [ --disable-float-api Disable the floating-point API], -[if test "$enableval" = no; then - AC_DEFINE([DISABLE_FLOAT_API], , [Disable all parts of the API that are using floats]) -fi]) - -AC_ARG_ENABLE(examples, [ --disable-examples Do not build example programs, only the library]) -if test "$enableval" != no; then - AM_CONDITIONAL([BUILD_EXAMPLES], true) -else - AM_CONDITIONAL([BUILD_EXAMPLES], false) -fi - -AC_ARG_ENABLE(arm4-asm, [ --enable-arm4-asm Make use of ARM4 assembly optimizations], -[if test "$enableval" = yes; then - AC_DEFINE([ARM4_ASM], , [Make use of ARM4 assembly optimizations]) -fi]) - -AC_ARG_ENABLE(arm5e-asm, [ --enable-arm5e-asm Make use of ARM5E assembly optimizations], -[if test "$enableval" = yes; then - AC_DEFINE([ARM5E_ASM], , [Make use of ARM5E assembly optimizations]) -fi]) - -AC_ARG_ENABLE(blackfin-asm, [ --enable-blackfin-asm Make use of Blackfin assembly optimizations], -[if test "$enableval" = yes; then - AC_DEFINE([BFIN_ASM], , [Make use of Blackfin assembly optimizations]) -fi]) -case $host_os in - uclinux) LDFLAGS="-Wl,-elf2flt=-s100000 $LDFLAGS";; -esac - -AC_ARG_ENABLE(fixed-point-debug, [ --enable-fixed-point-debug Debug fixed-point implementation], -[if test "$enableval" = yes; then - AC_DEFINE([FIXED_DEBUG], , [Debug fixed-point implementation]) -fi]) - -AC_ARG_ENABLE(resample-full-sinc-table, [ --enable-resample-full-sinc-table Resample full SINC table (no interpolation)], -[if test "$enableval" = yes; then - AC_DEFINE([RESAMPLE_FULL_SINC_TABLE], , [Resample with full SINC table (no interpolation)]) -fi]) - -AC_ARG_ENABLE(ti-c55x, [ --enable-ti-c55x Enable support for TI C55X DSP], -[if test "$enableval" = yes; then - has_char16=yes; - AC_DEFINE([TI_C55X], , [Enable support for TI C55X DSP]) -fi]) - -AC_ARG_WITH([fft], [AS_HELP_STRING([--with-fft=choice],[use an alternate FFT implementation. The available choices are -kiss (default fixed point), smallft (default floating point), gpl-fftw3 and proprietary-intel-mkl])], -[FFT=$withval] -) - -FFT_PKGCONFIG= -AS_CASE([$FFT], - [kiss], [ - AC_DEFINE([USE_KISS_FFT], [], [Use KISS Fast Fourier Transform]) - ], - [smallft], [ - AC_DEFINE([USE_SMALLFT], [], [Use FFT from OggVorbis]) - ], - [gpl-fftw3], [ - AC_DEFINE([USE_GPL_FFTW3], [], [Use FFTW3 for FFT]) - PKG_CHECK_MODULES([FFT], [fftw3f]) - ], - [proprietary-intel-mkl], [ - AC_DEFINE([USE_INTEL_MKL], [], [Use Intel Math Kernel Library for FFT]) - AC_MSG_CHECKING(for valid MKL) - AC_LINK_IFELSE([ - AC_LANG_PROGRAM([[ -#include -void func() { - DFTI_DESCRIPTOR_HANDLE h; - MKL_LONG result=DftiCreateDescriptor(&h, DFTI_SINGLE, DFTI_REAL, 0); -}]])], - [AC_MSG_RESULT(yes)], - [AC_MSG_FAILURE([Failed to compile MKL test program. Make sure you set CFLAGS to include the include directory and set LDFLAGS to include the library directory and all necesarry libraries.])] - ) - ], - [AC_MSG_FAILURE([Unknown FFT $FFT specified for --with-fft])] -) -AM_CONDITIONAL(BUILD_KISS_FFT, [test "$FFT" = "kiss"]) -AM_CONDITIONAL(BUILD_SMALLFT, [test "$FFT" = "smallft"]) -AC_SUBST(FFT_PKGCONFIG) - - -AC_CHECK_SIZEOF([int16_t]) -AC_CHECK_SIZEOF([uint16_t]) -AC_CHECK_SIZEOF([u_int16_t]) -AC_CHECK_SIZEOF([int32_t]) -AC_CHECK_SIZEOF([uint32_t]) -AC_CHECK_SIZEOF([u_int32_t]) -AC_CHECK_SIZEOF([short]) -AC_CHECK_SIZEOF([int]) -AC_CHECK_SIZEOF([long]) - -AS_IF([test "$has_char16" = "yes"], - [ - SIZEOF16=1 - SIZEOF32=2 - ],[ - SIZEOF16=2 - SIZEOF32=4 - ]) - -case $SIZEOF16 in - $ac_cv_sizeof_int16_t) SIZE16="int16_t";; - $ac_cv_sizeof_short) SIZE16="short";; - $ac_cv_sizeof_int) SIZE16="int";; -esac - -case $SIZEOF16 in - $ac_cv_sizeof_uint16_t) USIZE16="uint16_t";; - $ac_cv_sizeof_u_int16_t) USIZE16="u_int16_t";; - $ac_cv_sizeof_short) USIZE16="unsigned short";; - $ac_cv_sizeof_int) USIZE16="unsigned int";; -esac - -case $SIZEOF32 in - $ac_cv_sizeof_int32_t) SIZE32="int32_t";; - $ac_cv_sizeof_int) SIZE32="int";; - $ac_cv_sizeof_long) SIZE32="long";; - $ac_cv_sizeof_short) SIZE32="short";; -esac - -case $SIZEOF32 in - $ac_cv_sizeof_uint32_t) USIZE32="uint32_t";; - $ac_cv_sizeof_u_int32_t) USIZE32="u_int32_t";; - $ac_cv_sizeof_short) USIZE32="unsigned short";; - $ac_cv_sizeof_int) USIZE32="unsigned int";; - $ac_cv_sizeof_long) USIZE32="unsigned long";; -esac - -AS_IF([test -z "$SIZE16"],[AC_MSG_ERROR([No 16 bit type found on this platform!])]) -AS_IF([test -z "$SIZE32"],[AC_MSG_ERROR([No 32 bit type found on this platform!])]) -AS_IF([test -z "$USIZE16"],[AC_MSG_ERROR([No unsigned 16 bit type found on this platform!])]) -AS_IF([test -z "$USIZE32"],[AC_MSG_ERROR([No unsigned 32 bit type found on this platform!])]) - -AC_SUBST([SIZE16]) -AC_SUBST([USIZE16]) -AC_SUBST([SIZE32]) -AC_SUBST([USIZE32]) - -AS_IF([test "$ac_cv_header_stdint_h" = "yes"], [INCLUDE_STDINT="#include "], - [test "$ac_cv_header_inttypes_h" = "yes"], [INCLUDE_STDINT="#include "], - [test "$ac_cv_header_sys_types_h" = "yes"], [INCLUDE_STDINT="#include "]) - -AC_SUBST([INCLUDE_STDINT]) - -AC_CONFIG_FILES([ - Makefile libspeexdsp/Makefile doc/Makefile SpeexDSP.spec - include/Makefile include/speex/Makefile speexdsp.pc - win32/Makefile win32/libspeexdsp/Makefile - symbian/Makefile - - win32/VS2003/Makefile - win32/VS2003/libspeexdsp/Makefile - win32/VS2003/tests/Makefile - - win32/VS2005/Makefile - win32/VS2005/libspeexdsp/Makefile - win32/VS2005/tests/Makefile - - win32/VS2008/Makefile - win32/VS2008/libspeexdsp/Makefile - win32/VS2008/tests/Makefile - include/speex/speexdsp_config_types.h ti/Makefile - ti/speex_C54_test/Makefile ti/speex_C55_test/Makefile - ti/speex_C64_test/Makefile ]) - -AC_CONFIG_HEADERS([config.h]) - -AC_OUTPUT - -echo "Type \"make; make install\" to compile and install Speex"; diff --git a/speex/doc/.cvsignore b/speex/doc/.cvsignore deleted file mode 100644 index 282522db0..000000000 --- a/speex/doc/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile -Makefile.in diff --git a/speex/doc/Makefile.am b/speex/doc/Makefile.am deleted file mode 100644 index d2896efab..000000000 --- a/speex/doc/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -doc_DATA = manual.pdf - -EXTRA_DIST = $(doc_DATA) diff --git a/speex/doc/celp_decoder.eps b/speex/doc/celp_decoder.eps deleted file mode 100644 index 87f070446..000000000 --- a/speex/doc/celp_decoder.eps +++ /dev/null @@ -1,688 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 0 0 442 315 -%%Pages: 0 -%%Creator: Sun Microsystems, Inc. -%%Title: none -%%CreationDate: none -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%BeginResource: SDRes -/b4_inc_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath -/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if -/bdef {bind def} bind def -/c {setgray} bdef -/l {neg lineto} bdef -/rl {neg rlineto} bdef -/lc {setlinecap} bdef -/lj {setlinejoin} bdef -/lw {setlinewidth} bdef -/ml {setmiterlimit} bdef -/ld {setdash} bdef -/m {neg moveto} bdef -/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef -/r {rotate} bdef -/t {neg translate} bdef -/s {scale} bdef -/sw {show} bdef -/gs {gsave} bdef -/gr {grestore} bdef -/f {findfont dup length dict begin -{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def -currentdict end /NFont exch definefont pop /NFont findfont} bdef -/p {closepath} bdef -/sf {scalefont setfont} bdef -/ef {eofill}bdef -/pc {closepath stroke}bdef -/ps {stroke}bdef -/pum {matrix currentmatrix}bdef -/pom {setmatrix}bdef -/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef -%%EndResource -%%EndProlog -%%BeginSetup -%%EndSetup -%%Page: 1 1 -%%BeginPageSetup -%%EndPageSetup -pum -0.02836 0.02834 s -0 -11113 t -/tm matrix currentmatrix def -tm setmatrix --5152 -9418 t -1 1 s -0 lw 1 lj 0.000 c 6935 14318 m 5435 14318 l 5435 10318 l 8435 10318 l -8435 14318 l 6935 14318 l pc -11436 12317 m 10934 12818 l 10936 11817 l 11436 12317 l pc -5831 11966 m 8109 11966 l ps -6425 11966 m 6425 11636 l ps -6123 11966 m 6123 12366 l ps -6727 11966 m 6727 11707 l ps -7719 11966 m 7719 11872 l ps -7070 11966 m 7070 12248 l ps -7439 11966 m 7439 11636 l ps -5830 10920 m 8108 10920 l ps -6163 10920 m 6163 10590 l ps -6470 10920 m 6470 11320 l ps -6726 10920 m 6726 10661 l ps -7109 10920 m 7109 10826 l ps -7417 10920 m 7417 11202 l ps -7699 10920 m 7699 10590 l ps -5831 10921 m 8109 10921 l ps -6164 10921 m 6164 10591 l ps -6471 10921 m 6471 11321 l ps -6727 10921 m 6727 10662 l ps -7110 10921 m 7110 10827 l ps -7418 10921 m 7418 11203 l ps -7700 10921 m 7700 10591 l ps -5857 12918 m 8135 12918 l ps -6190 12918 m 6188 12729 l ps -6497 12918 m 6497 13318 l ps -6753 12918 m 6751 13247 l ps -7136 12918 m 7136 12824 l ps -7444 12918 m 7442 12611 l ps -7796 12919 m 7794 13248 l ps -6935 17818 m 5435 17818 l 5435 15818 l 8435 15818 l 8435 17818 l 6935 17818 l -pc -gs -pum -6263 17039 t -219 -104 m 214 -66 184 -39 147 -39 ct 120 -39 99 -51 85 -74 ct 74 -92 71 -110 69 -147 ct -268 -147 l 266 -213 260 -244 245 -277 ct 224 -321 193 -341 149 -341 ct 71 -341 20 -271 20 -160 ct -20 -55 68 9 146 9 ct 208 9 252 -32 264 -104 ct 219 -104 l p -69 -192 m 72 -252 104 -292 147 -292 ct 171 -292 191 -280 203 -260 ct 214 -243 218 -226 220 -192 ct -69 -192 l p ef -362 -412 m 418 -412 l 418 -458 l 321 -458 l 321 124 l 418 124 l 418 78 l -362 78 l 362 -412 l p ef -508 -332 m 465 -332 l 465 0 l 511 0 l 511 -180 l 511 -250 539 -292 586 -292 ct -625 -292 642 -265 642 -204 ct 642 0 l 687 0 l 687 -226 l 687 -299 653 -341 595 -341 ct -558 -341 532 -324 508 -283 ct 508 -332 l p ef -870 -204 m 742 -204 l 742 -147 l 870 -147 l 870 -204 l p ef -899 -400 m 1026 -400 l 1026 0 l 1077 0 l 1077 -400 l 1204 -400 l -1204 -455 l 899 -455 l 899 -400 l p ef -1281 78 m 1225 78 l 1225 124 l 1322 124 l 1322 -458 l 1225 -458 l -1225 -412 l 1281 -412 l 1281 78 l p ef -pom -gr -10410 12492 m 10410 12142 l 10935 12317 l 10410 12492 l p ef -1 lw 0 lj 8435 12318 m 9685 12318 l 9685 12317 l 10515 12317 l ps -0 lw 1 lj 11434 16817 m 10932 17318 l 10934 16317 l 11434 16817 l pc -10483 16967 m 10483 16667 l 10933 16817 l 10483 16967 l p ef -1 lw 0 lj 8435 16818 m 9684 16818 l 9684 16817 l 10573 16817 l ps -0 lw 1 lj 13085 14818 m 12947 14818 12835 14706 12835 14568 ct 12835 14430 12947 14318 13085 14318 ct -13223 14318 13335 14430 13335 14568 ct 13335 14706 13223 14818 13085 14818 ct -pc -gs -pum -12931 14791 t -133 -183 m 20 -183 l 20 -137 l 133 -137 l 133 0 l 171 0 l 171 -137 l -283 -137 l 283 -183 l 171 -183 l 171 -320 l 133 -320 l 133 -183 l -p ef -pom -gr -13234 15268 m 12934 15268 l 13084 14818 l 13234 15268 l p ef -1 lw 0 lj 11435 16817 m 13084 16817 l 13084 15178 l ps -12934 13868 m 13234 13868 l 13084 14318 l 12934 13868 l p ef -11437 12317 m 13084 12317 l 13084 13958 l ps -0 lw 1 lj 17835 15318 m 16335 15318 l 16335 13818 l 19335 13818 l 19335 15318 l -17835 15318 l pc -16668 15023 m 16778 14801 16891 14569 16925 14316 ct 16997 13766 17307 14273 17221 14551 ct -17165 14731 17523 15058 17694 14622 ct 17856 14213 18050 14912 18286 15000 ct -18489 15075 18680 14999 18878 15000 ct 18878 15000 18878 15000 19076 15047 ct -19076 15047 19076 15047 19135 15118 ct ps -15885 14718 m 15885 14418 l 16335 14568 l 15885 14718 l p ef -1 lw 0 lj 13335 14567 m 14935 14567 l 14935 14568 l 15975 14568 l ps -gs -pum -17085 13052 t -208 -214 m 206 -241 203 -254 195 -269 ct 180 -296 151 -311 114 -311 ct 84 -311 61 -302 46 -283 ct -33 -266 25 -243 25 -219 ct 25 -180 43 -156 78 -146 ct 129 -131 l 170 -120 182 -108 182 -79 ct -182 -46 158 -27 118 -27 ct 90 -27 69 -37 58 -56 ct 51 -68 49 -78 48 -98 ct 16 -98 l -17 -65 22 -48 35 -30 ct 54 -3 78 8 116 8 ct 177 8 214 -26 214 -83 ct 214 -126 195 -154 158 -164 ct -87 -184 l 67 -190 57 -202 57 -224 ct 57 -257 78 -276 114 -276 ct 137 -276 156 -267 166 -250 ct -172 -240 175 -231 176 -214 ct 208 -214 l p ef -319 -39 m 271 -221 l 236 -221 l 304 5 l 300 16 297 25 296 28 ct 289 51 284 57 271 57 ct -265 57 259 55 253 53 ct 253 87 l 255 87 l 261 90 263 90 268 90 ct 304 90 309 83 337 -4 ct -402 -221 l 368 -221 l 319 -39 l p ef -457 -221 m 428 -221 l 428 0 l 458 0 l 458 -120 l 458 -166 477 -194 508 -194 ct -534 -194 546 -176 546 -136 ct 546 0 l 576 0 l 576 -150 l 576 -199 553 -227 515 -227 ct -490 -227 472 -216 457 -188 ct 457 -221 l p ef -690 -190 m 690 -221 l 660 -221 l 660 -282 l 630 -282 l 630 -221 l -605 -221 l 605 -190 l 630 -190 l 630 -44 l 630 -12 641 2 665 2 ct 667 2 669 2 676 1 ct -678 1 683 0 689 0 ct 689 -29 l 679 -29 l 665 -29 660 -34 660 -46 ct 660 -190 l -690 -190 l p ef -751 -303 m 721 -303 l 721 0 l 751 0 l 751 -120 l 751 -167 770 -194 803 -194 ct -828 -194 839 -179 839 -144 ct 839 0 l 869 0 l 869 -150 l 869 -199 846 -227 808 -227 ct -784 -227 769 -218 751 -190 ct 751 -303 l p ef -1038 -69 m 1035 -44 1015 -26 991 -26 ct 973 -26 958 -34 950 -49 ct 942 -61 940 -73 939 -98 ct -1071 -98 l 1070 -142 1066 -162 1056 -184 ct 1042 -214 1022 -227 992 -227 ct -940 -227 906 -180 906 -106 ct 906 -36 938 6 990 6 ct 1032 6 1061 -21 1069 -69 ct -1038 -69 l p -939 -128 m 941 -167 962 -194 991 -194 ct 1007 -194 1020 -186 1028 -173 ct 1035 -162 1038 -151 1040 -128 ct -939 -128 l p ef -1242 -158 m 1240 -202 1215 -227 1174 -227 ct 1132 -227 1104 -200 1104 -157 ct -1104 -129 1118 -111 1146 -103 ct 1182 -92 l 1210 -84 1218 -77 1218 -60 ct 1218 -39 1202 -26 1175 -26 ct -1144 -26 1130 -39 1128 -71 ct 1099 -71 l 1100 -49 1102 -38 1108 -27 ct 1120 -5 1143 6 1173 6 ct -1219 6 1248 -22 1248 -66 ct 1248 -97 1234 -113 1197 -125 ct 1167 -134 l 1140 -142 1134 -148 1134 -163 ct -1134 -183 1148 -195 1172 -195 ct 1198 -195 1211 -183 1213 -158 ct 1242 -158 l -p ef -1315 -221 m 1285 -221 l 1285 0 l 1315 0 l 1315 -221 l p -1315 -261 m 1315 -303 l 1285 -303 l 1285 -261 l 1315 -261 l p ef -1492 -158 m 1490 -202 1465 -227 1424 -227 ct 1382 -227 1354 -200 1354 -157 ct -1354 -129 1368 -111 1396 -103 ct 1432 -92 l 1460 -84 1468 -77 1468 -60 ct 1468 -39 1452 -26 1425 -26 ct -1394 -26 1380 -39 1378 -71 ct 1349 -71 l 1350 -49 1352 -38 1358 -27 ct 1370 -5 1393 6 1423 6 ct -1469 6 1498 -22 1498 -66 ct 1498 -97 1484 -113 1447 -125 ct 1417 -134 l 1390 -142 1384 -148 1384 -163 ct -1384 -183 1398 -195 1422 -195 ct 1448 -195 1461 -183 1463 -158 ct 1492 -158 l -p ef -pom -pum -17085 13581 t -90 -190 m 90 -221 l 60 -221 l 60 -248 l 60 -266 65 -274 78 -274 ct 81 -274 85 -274 90 -273 ct -90 -307 l 81 -307 79 -307 76 -307 ct 46 -307 30 -291 30 -259 ct 30 -221 l 4 -221 l -4 -190 l 30 -190 l 30 0 l 60 0 l 60 -190 l 90 -190 l p ef -150 -221 m 120 -221 l 120 0 l 150 0 l 150 -221 l p -150 -261 m 150 -303 l 120 -303 l 120 -261 l 150 -261 l p ef -227 -303 m 197 -303 l 197 0 l 227 0 l 227 -303 l p ef -339 -190 m 339 -221 l 309 -221 l 309 -282 l 279 -282 l 279 -221 l -254 -221 l 254 -190 l 279 -190 l 279 -44 l 279 -12 290 2 314 2 ct 316 2 318 2 325 1 ct -327 1 332 0 338 0 ct 338 -29 l 328 -29 l 314 -29 309 -34 309 -46 ct 309 -190 l -339 -190 l p ef -492 -69 m 489 -44 469 -26 445 -26 ct 427 -26 412 -34 404 -49 ct 396 -61 394 -73 393 -98 ct -525 -98 l 524 -142 520 -162 510 -184 ct 496 -214 476 -227 446 -227 ct 394 -227 360 -180 360 -106 ct -360 -36 392 6 444 6 ct 486 6 515 -21 523 -69 ct 492 -69 l p -393 -128 m 395 -167 416 -194 445 -194 ct 461 -194 474 -186 482 -173 ct 489 -162 492 -151 494 -128 ct -393 -128 l p ef -657 -188 m 657 -226 l 654 -227 651 -227 649 -227 ct 627 -227 613 -215 597 -183 ct -597 -221 l 568 -221 l 568 0 l 599 0 l 599 -129 l 599 -163 618 -188 645 -188 ct -657 -188 l p ef -878 -297 m 854 -297 l 844 -253 834 -244 789 -240 ct 789 -211 l 845 -211 l -845 0 l 878 0 l 878 -297 l p ef -1050 -311 m 1027 -311 l 943 8 l 965 8 l 1050 -311 l p ef -1211 -88 m 1235 0 l 1272 0 l 1182 -303 l 1144 -303 l 1050 0 l 1085 0 l -1111 -88 l 1211 -88 l p -1121 -125 m 1161 -259 l 1199 -125 l 1121 -125 l p ef -1360 -310 m 1316 -231 1301 -179 1301 -110 ct 1301 -42 1314 1 1361 87 ct 1381 87 l -1343 -5 1334 -42 1334 -107 ct 1334 -182 1344 -225 1381 -310 ct 1360 -310 l p ef -1552 -190 m 1552 -221 l 1412 -221 l 1412 -190 l 1513 -190 l 1403 -29 l -1403 0 l 1555 0 l 1555 -30 l 1444 -30 l 1552 -190 l p ef -1599 87 m 1642 8 1657 -43 1657 -111 ct 1657 -179 1644 -223 1598 -310 ct 1577 -310 l -1616 -217 1625 -179 1625 -115 ct 1625 -40 1615 2 1578 87 ct 1599 87 l p ef -pom -gr -gs -pum -5708 9956 t -63 -137 m 185 -137 l 185 -174 l 63 -174 l 63 -266 l 202 -266 l 202 -303 l -30 -303 l 30 0 l 63 0 l 63 -137 l p ef -265 -221 m 235 -221 l 235 0 l 265 0 l 265 -221 l p -265 -261 m 265 -303 l 235 -303 l 235 -261 l 265 -261 l p ef -394 -113 m 455 -221 l 418 -221 l 375 -143 l 334 -221 l 294 -221 l -355 -113 l 291 0 l 330 0 l 373 -83 l 419 0 l 458 0 l 394 -113 l -p ef -606 -69 m 603 -44 583 -26 559 -26 ct 541 -26 526 -34 518 -49 ct 510 -61 508 -73 507 -98 ct -639 -98 l 638 -142 634 -162 624 -184 ct 610 -214 590 -227 560 -227 ct 508 -227 474 -180 474 -106 ct -474 -36 506 6 558 6 ct 600 6 629 -21 637 -69 ct 606 -69 l p -507 -128 m 509 -167 530 -194 559 -194 ct 575 -194 588 -186 596 -173 ct 603 -162 606 -151 608 -128 ct -507 -128 l p ef -829 -303 m 798 -303 l 798 -187 l 784 -216 768 -227 743 -227 ct 698 -227 668 -182 668 -115 ct -668 -41 699 6 747 6 ct 772 6 787 -4 800 -31 ct 800 0 l 829 0 l 829 -303 l -p -749 -194 m 780 -194 798 -162 798 -104 ct 798 -76 793 -57 782 -43 ct 773 -32 761 -26 748 -26 ct -717 -26 699 -58 699 -113 ct 699 -167 716 -194 749 -194 ct p ef -1113 -146 m 1107 -200 1085 -227 1044 -227 ct 991 -227 958 -180 958 -106 ct -958 -37 990 6 1039 6 ct 1081 6 1106 -22 1113 -78 ct 1083 -78 l 1077 -43 1062 -26 1039 -26 ct -1008 -26 991 -56 991 -109 ct 991 -163 1009 -194 1041 -194 ct 1065 -194 1078 -180 1083 -146 ct -1113 -146 l p ef -1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct -1302 -178 1268 -227 1219 -227 ct p -1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct -1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef -1490 -303 m 1459 -303 l 1459 -187 l 1445 -216 1429 -227 1404 -227 ct 1359 -227 1329 -182 1329 -115 ct -1329 -41 1360 6 1408 6 ct 1433 6 1448 -4 1461 -31 ct 1461 0 l 1490 0 l 1490 -303 l -p -1410 -194 m 1441 -194 1459 -162 1459 -104 ct 1459 -76 1454 -57 1443 -43 ct -1434 -32 1422 -26 1409 -26 ct 1378 -26 1360 -58 1360 -113 ct 1360 -167 1377 -194 1410 -194 ct -p ef -1656 -69 m 1653 -44 1633 -26 1609 -26 ct 1591 -26 1576 -34 1568 -49 ct 1560 -61 1558 -73 1557 -98 ct -1689 -98 l 1688 -142 1684 -162 1674 -184 ct 1660 -214 1640 -227 1610 -227 ct -1558 -227 1524 -180 1524 -106 ct 1524 -36 1556 6 1608 6 ct 1650 6 1679 -21 1687 -69 ct -1656 -69 l p -1557 -128 m 1559 -167 1580 -194 1609 -194 ct 1625 -194 1638 -186 1646 -173 ct -1653 -162 1656 -151 1658 -128 ct 1557 -128 l p ef -1755 0 m 1755 -28 l 1768 -3 1782 6 1806 6 ct 1854 6 1885 -41 1885 -115 ct -1885 -182 1855 -227 1810 -227 ct 1788 -227 1772 -217 1756 -192 ct 1756 -303 l -1726 -303 l 1726 0 l 1755 0 l p -1805 -194 m 1837 -194 1853 -167 1853 -113 ct 1853 -58 1835 -26 1804 -26 ct -1792 -26 1780 -32 1771 -43 ct 1760 -57 1755 -76 1755 -105 ct 1755 -163 1772 -194 1805 -194 ct -p ef -1998 -227 m 1947 -227 1913 -180 1913 -110 ct 1913 -41 1947 5 1997 5 ct 2047 5 2081 -41 2081 -110 ct -2081 -178 2047 -227 1998 -227 ct p -1998 -195 m 2029 -195 2049 -161 2049 -110 ct 2049 -59 2029 -26 1997 -26 ct -1965 -26 1944 -59 1944 -110 ct 1944 -162 1965 -195 1998 -195 ct p ef -2193 -227 m 2142 -227 2108 -180 2108 -110 ct 2108 -41 2142 5 2192 5 ct 2242 5 2276 -41 2276 -110 ct -2276 -178 2242 -227 2193 -227 ct p -2193 -195 m 2224 -195 2244 -161 2244 -110 ct 2244 -59 2224 -26 2192 -26 ct -2160 -26 2139 -59 2139 -110 ct 2139 -162 2160 -195 2193 -195 ct p ef -2390 -138 m 2459 -221 l 2421 -221 l 2342 -127 l 2342 -303 l 2313 -303 l -2313 0 l 2342 0 l 2342 -83 l 2368 -111 l 2424 0 l 2463 0 l 2390 -138 l -p ef -pom -gr -gs -pum -5390 15539 t -165 -88 m 189 0 l 226 0 l 136 -303 l 98 -303 l 4 0 l 39 0 l 65 -88 l -165 -88 l p -75 -125 m 115 -259 l 153 -125 l 75 -125 l p ef -406 -303 m 375 -303 l 375 -187 l 361 -216 345 -227 320 -227 ct 275 -227 245 -182 245 -115 ct -245 -41 276 6 324 6 ct 349 6 364 -4 377 -31 ct 377 0 l 406 0 l 406 -303 l -p -326 -194 m 357 -194 375 -162 375 -104 ct 375 -76 370 -57 359 -43 ct 350 -32 338 -26 325 -26 ct -294 -26 276 -58 276 -113 ct 276 -167 293 -194 326 -194 ct p ef -477 -153 m 481 -184 493 -196 520 -196 ct 547 -196 562 -184 562 -159 ct 562 -143 557 -136 546 -134 ct -495 -126 l 460 -121 440 -96 440 -58 ct 440 -19 463 6 498 6 ct 524 6 543 -4 562 -29 ct -565 -5 573 4 594 4 ct 598 4 602 3 608 1 ct 610 0 610 0 612 0 ct 612 -27 l 605 -25 603 -25 601 -25 ct -595 -25 591 -30 591 -38 ct 591 -165 l 591 -204 565 -227 522 -227 ct 493 -227 472 -217 460 -198 ct -453 -186 450 -175 449 -153 ct 477 -153 l p -561 -76 m 561 -48 535 -24 504 -24 ct 484 -24 472 -38 472 -61 ct 472 -83 483 -94 511 -98 ct -546 -104 554 -107 561 -112 ct 561 -76 l p ef -642 87 m 672 87 l 672 -24 l 685 -2 699 6 722 6 ct 770 6 801 -42 801 -115 ct -801 -182 771 -227 726 -227 ct 701 -227 687 -217 671 -188 ct 671 -221 l 642 -221 l -642 87 l p -721 -194 m 752 -194 769 -166 769 -114 ct 769 -58 751 -26 720 -26 ct 690 -26 671 -55 671 -103 ct -671 -163 688 -194 721 -194 ct p ef -906 -190 m 906 -221 l 876 -221 l 876 -282 l 846 -282 l 846 -221 l -821 -221 l 821 -190 l 846 -190 l 846 -44 l 846 -12 857 2 881 2 ct 883 2 885 2 892 1 ct -894 1 899 0 905 0 ct 905 -29 l 895 -29 l 881 -29 876 -34 876 -46 ct 876 -190 l -906 -190 l p ef -967 -221 m 937 -221 l 937 0 l 967 0 l 967 -221 l p -967 -261 m 967 -303 l 937 -303 l 937 -261 l 967 -261 l p ef -1076 -39 m 1029 -221 l 993 -221 l 1059 0 l 1092 0 l 1161 -221 l 1128 -221 l -1076 -39 l p ef -1309 -69 m 1306 -44 1286 -26 1262 -26 ct 1244 -26 1229 -34 1221 -49 ct 1213 -61 1211 -73 1210 -98 ct -1342 -98 l 1341 -142 1337 -162 1327 -184 ct 1313 -214 1293 -227 1263 -227 ct -1211 -227 1177 -180 1177 -106 ct 1177 -36 1209 6 1261 6 ct 1303 6 1332 -21 1340 -69 ct -1309 -69 l p -1210 -128 m 1212 -167 1233 -194 1262 -194 ct 1278 -194 1291 -186 1299 -173 ct -1306 -162 1309 -151 1311 -128 ct 1210 -128 l p ef -1621 -146 m 1615 -200 1593 -227 1552 -227 ct 1499 -227 1466 -180 1466 -106 ct -1466 -37 1498 6 1547 6 ct 1589 6 1614 -22 1621 -78 ct 1591 -78 l 1585 -43 1570 -26 1547 -26 ct -1516 -26 1499 -56 1499 -109 ct 1499 -163 1517 -194 1549 -194 ct 1573 -194 1586 -180 1591 -146 ct -1621 -146 l p ef -1727 -227 m 1676 -227 1642 -180 1642 -110 ct 1642 -41 1676 5 1726 5 ct 1776 5 1810 -41 1810 -110 ct -1810 -178 1776 -227 1727 -227 ct p -1727 -195 m 1758 -195 1778 -161 1778 -110 ct 1778 -59 1758 -26 1726 -26 ct -1694 -26 1673 -59 1673 -110 ct 1673 -162 1694 -195 1727 -195 ct p ef -1998 -303 m 1967 -303 l 1967 -187 l 1953 -216 1937 -227 1912 -227 ct 1867 -227 1837 -182 1837 -115 ct -1837 -41 1868 6 1916 6 ct 1941 6 1956 -4 1969 -31 ct 1969 0 l 1998 0 l 1998 -303 l -p -1918 -194 m 1949 -194 1967 -162 1967 -104 ct 1967 -76 1962 -57 1951 -43 ct -1942 -32 1930 -26 1917 -26 ct 1886 -26 1868 -58 1868 -113 ct 1868 -167 1885 -194 1918 -194 ct -p ef -2164 -69 m 2161 -44 2141 -26 2117 -26 ct 2099 -26 2084 -34 2076 -49 ct 2068 -61 2066 -73 2065 -98 ct -2197 -98 l 2196 -142 2192 -162 2182 -184 ct 2168 -214 2148 -227 2118 -227 ct -2066 -227 2032 -180 2032 -106 ct 2032 -36 2064 6 2116 6 ct 2158 6 2187 -21 2195 -69 ct -2164 -69 l p -2065 -128 m 2067 -167 2088 -194 2117 -194 ct 2133 -194 2146 -186 2154 -173 ct -2161 -162 2164 -151 2166 -128 ct 2065 -128 l p ef -2263 0 m 2263 -28 l 2276 -3 2290 6 2314 6 ct 2362 6 2393 -41 2393 -115 ct -2393 -182 2363 -227 2318 -227 ct 2296 -227 2280 -217 2264 -192 ct 2264 -303 l -2234 -303 l 2234 0 l 2263 0 l p -2313 -194 m 2345 -194 2361 -167 2361 -113 ct 2361 -58 2343 -26 2312 -26 ct -2300 -26 2288 -32 2279 -43 ct 2268 -57 2263 -76 2263 -105 ct 2263 -163 2280 -194 2313 -194 ct -p ef -2506 -227 m 2455 -227 2421 -180 2421 -110 ct 2421 -41 2455 5 2505 5 ct 2555 5 2589 -41 2589 -110 ct -2589 -178 2555 -227 2506 -227 ct p -2506 -195 m 2537 -195 2557 -161 2557 -110 ct 2557 -59 2537 -26 2505 -26 ct -2473 -26 2452 -59 2452 -110 ct 2452 -162 2473 -195 2506 -195 ct p ef -2701 -227 m 2650 -227 2616 -180 2616 -110 ct 2616 -41 2650 5 2700 5 ct 2750 5 2784 -41 2784 -110 ct -2784 -178 2750 -227 2701 -227 ct p -2701 -195 m 2732 -195 2752 -161 2752 -110 ct 2752 -59 2732 -26 2700 -26 ct -2668 -26 2647 -59 2647 -110 ct 2647 -162 2668 -195 2701 -195 ct p ef -2898 -138 m 2967 -221 l 2929 -221 l 2850 -127 l 2850 -303 l 2821 -303 l -2821 0 l 2850 0 l 2850 -83 l 2876 -111 l 2932 0 l 2971 0 l 2898 -138 l -p ef -pom -gr -gs -pum -14016 13846 t -213 -36 m 63 -36 l 63 -137 l 199 -137 l 199 -174 l 63 -174 l 63 -266 l -211 -266 l 211 -303 l 30 -303 l 30 0 l 213 0 l 213 -36 l p ef -339 -113 m 400 -221 l 363 -221 l 320 -143 l 279 -221 l 239 -221 l -300 -113 l 236 0 l 275 0 l 318 -83 l 364 0 l 403 0 l 339 -113 l -p ef -571 -146 m 565 -200 543 -227 502 -227 ct 449 -227 416 -180 416 -106 ct 416 -37 448 6 497 6 ct -539 6 564 -22 571 -78 ct 541 -78 l 535 -43 520 -26 497 -26 ct 466 -26 449 -56 449 -109 ct -449 -163 467 -194 499 -194 ct 523 -194 536 -180 541 -146 ct 571 -146 l p ef -633 -221 m 603 -221 l 603 0 l 633 0 l 633 -221 l p -633 -261 m 633 -303 l 603 -303 l 603 -261 l 633 -261 l p ef -745 -190 m 745 -221 l 715 -221 l 715 -282 l 685 -282 l 685 -221 l -660 -221 l 660 -190 l 685 -190 l 685 -44 l 685 -12 696 2 720 2 ct 722 2 724 2 731 1 ct -733 1 738 0 744 0 ct 744 -29 l 734 -29 l 720 -29 715 -34 715 -46 ct 715 -190 l -745 -190 l p ef -803 -153 m 807 -184 819 -196 846 -196 ct 873 -196 888 -184 888 -159 ct 888 -143 883 -136 872 -134 ct -821 -126 l 786 -121 766 -96 766 -58 ct 766 -19 789 6 824 6 ct 850 6 869 -4 888 -29 ct -891 -5 899 4 920 4 ct 924 4 928 3 934 1 ct 936 0 936 0 938 0 ct 938 -27 l 931 -25 929 -25 927 -25 ct -921 -25 917 -30 917 -38 ct 917 -165 l 917 -204 891 -227 848 -227 ct 819 -227 798 -217 786 -198 ct -779 -186 776 -175 775 -153 ct 803 -153 l p -887 -76 m 887 -48 861 -24 830 -24 ct 810 -24 798 -38 798 -61 ct 798 -83 809 -94 837 -98 ct -872 -104 880 -107 887 -112 ct 887 -76 l p ef -1037 -190 m 1037 -221 l 1007 -221 l 1007 -282 l 977 -282 l 977 -221 l -952 -221 l 952 -190 l 977 -190 l 977 -44 l 977 -12 988 2 1012 2 ct 1014 2 1016 2 1023 1 ct -1025 1 1030 0 1036 0 ct 1036 -29 l 1026 -29 l 1012 -29 1007 -34 1007 -46 ct -1007 -190 l 1037 -190 l p ef -1099 -221 m 1069 -221 l 1069 0 l 1099 0 l 1099 -221 l p -1099 -261 m 1099 -303 l 1069 -303 l 1069 -261 l 1099 -261 l p ef -1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct -1302 -178 1268 -227 1219 -227 ct p -1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct -1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef -1368 -221 m 1339 -221 l 1339 0 l 1369 0 l 1369 -120 l 1369 -166 1388 -194 1419 -194 ct -1445 -194 1457 -176 1457 -136 ct 1457 0 l 1487 0 l 1487 -150 l 1487 -199 1464 -227 1426 -227 ct -1401 -227 1383 -216 1368 -188 ct 1368 -221 l p ef -pom -pum -14480 14375 t -145 -69 m 142 -44 122 -26 98 -26 ct 80 -26 65 -34 57 -49 ct 49 -61 47 -73 46 -98 ct -178 -98 l 177 -142 173 -162 163 -184 ct 149 -214 129 -227 99 -227 ct 47 -227 13 -180 13 -106 ct -13 -36 45 6 97 6 ct 139 6 168 -21 176 -69 ct 145 -69 l p -46 -128 m 48 -167 69 -194 98 -194 ct 114 -194 127 -186 135 -173 ct 142 -162 145 -151 147 -128 ct -46 -128 l p ef -244 -274 m 281 -274 l 281 -305 l 217 -305 l 217 82 l 281 82 l 281 52 l -244 52 l 244 -274 l p ef -343 -221 m 314 -221 l 314 0 l 344 0 l 344 -120 l 344 -166 363 -194 394 -194 ct -420 -194 432 -176 432 -136 ct 432 0 l 462 0 l 462 -150 l 462 -199 439 -227 401 -227 ct -376 -227 358 -216 343 -188 ct 343 -221 l p ef -533 52 m 496 52 l 496 82 l 561 82 l 561 -305 l 496 -305 l 496 -274 l -533 -274 l 533 52 l p ef -pom -gr -gs -pum -9491 13237 t -63 -137 m 185 -137 l 185 -174 l 63 -174 l 63 -266 l 202 -266 l 202 -303 l -30 -303 l 30 0 l 63 0 l 63 -137 l p ef -265 -221 m 235 -221 l 235 0 l 265 0 l 265 -221 l p -265 -261 m 265 -303 l 235 -303 l 235 -261 l 265 -261 l p ef -394 -113 m 455 -221 l 418 -221 l 375 -143 l 334 -221 l 294 -221 l -355 -113 l 291 0 l 330 0 l 373 -83 l 419 0 l 458 0 l 394 -113 l -p ef -606 -69 m 603 -44 583 -26 559 -26 ct 541 -26 526 -34 518 -49 ct 510 -61 508 -73 507 -98 ct -639 -98 l 638 -142 634 -162 624 -184 ct 610 -214 590 -227 560 -227 ct 508 -227 474 -180 474 -106 ct -474 -36 506 6 558 6 ct 600 6 629 -21 637 -69 ct 606 -69 l p -507 -128 m 509 -167 530 -194 559 -194 ct 575 -194 588 -186 596 -173 ct 603 -162 606 -151 608 -128 ct -507 -128 l p ef -829 -303 m 798 -303 l 798 -187 l 784 -216 768 -227 743 -227 ct 698 -227 668 -182 668 -115 ct -668 -41 699 6 747 6 ct 772 6 787 -4 800 -31 ct 800 0 l 829 0 l 829 -303 l -p -749 -194 m 780 -194 798 -162 798 -104 ct 798 -76 793 -57 782 -43 ct 773 -32 761 -26 748 -26 ct -717 -26 699 -58 699 -113 ct 699 -167 716 -194 749 -194 ct p ef -1113 -146 m 1107 -200 1085 -227 1044 -227 ct 991 -227 958 -180 958 -106 ct -958 -37 990 6 1039 6 ct 1081 6 1106 -22 1113 -78 ct 1083 -78 l 1077 -43 1062 -26 1039 -26 ct -1008 -26 991 -56 991 -109 ct 991 -163 1009 -194 1041 -194 ct 1065 -194 1078 -180 1083 -146 ct -1113 -146 l p ef -1219 -227 m 1168 -227 1134 -180 1134 -110 ct 1134 -41 1168 5 1218 5 ct 1268 5 1302 -41 1302 -110 ct -1302 -178 1268 -227 1219 -227 ct p -1219 -195 m 1250 -195 1270 -161 1270 -110 ct 1270 -59 1250 -26 1218 -26 ct -1186 -26 1165 -59 1165 -110 ct 1165 -162 1186 -195 1219 -195 ct p ef -1490 -303 m 1459 -303 l 1459 -187 l 1445 -216 1429 -227 1404 -227 ct 1359 -227 1329 -182 1329 -115 ct -1329 -41 1360 6 1408 6 ct 1433 6 1448 -4 1461 -31 ct 1461 0 l 1490 0 l 1490 -303 l -p -1410 -194 m 1441 -194 1459 -162 1459 -104 ct 1459 -76 1454 -57 1443 -43 ct -1434 -32 1422 -26 1409 -26 ct 1378 -26 1360 -58 1360 -113 ct 1360 -167 1377 -194 1410 -194 ct -p ef -1656 -69 m 1653 -44 1633 -26 1609 -26 ct 1591 -26 1576 -34 1568 -49 ct 1560 -61 1558 -73 1557 -98 ct -1689 -98 l 1688 -142 1684 -162 1674 -184 ct 1660 -214 1640 -227 1610 -227 ct -1558 -227 1524 -180 1524 -106 ct 1524 -36 1556 6 1608 6 ct 1650 6 1679 -21 1687 -69 ct -1656 -69 l p -1557 -128 m 1559 -167 1580 -194 1609 -194 ct 1625 -194 1638 -186 1646 -173 ct -1653 -162 1656 -151 1658 -128 ct 1557 -128 l p ef -1755 0 m 1755 -28 l 1768 -3 1782 6 1806 6 ct 1854 6 1885 -41 1885 -115 ct -1885 -182 1855 -227 1810 -227 ct 1788 -227 1772 -217 1756 -192 ct 1756 -303 l -1726 -303 l 1726 0 l 1755 0 l p -1805 -194 m 1837 -194 1853 -167 1853 -113 ct 1853 -58 1835 -26 1804 -26 ct -1792 -26 1780 -32 1771 -43 ct 1760 -57 1755 -76 1755 -105 ct 1755 -163 1772 -194 1805 -194 ct -p ef -1998 -227 m 1947 -227 1913 -180 1913 -110 ct 1913 -41 1947 5 1997 5 ct 2047 5 2081 -41 2081 -110 ct -2081 -178 2047 -227 1998 -227 ct p -1998 -195 m 2029 -195 2049 -161 2049 -110 ct 2049 -59 2029 -26 1997 -26 ct -1965 -26 1944 -59 1944 -110 ct 1944 -162 1965 -195 1998 -195 ct p ef -2193 -227 m 2142 -227 2108 -180 2108 -110 ct 2108 -41 2142 5 2192 5 ct 2242 5 2276 -41 2276 -110 ct -2276 -178 2242 -227 2193 -227 ct p -2193 -195 m 2224 -195 2244 -161 2244 -110 ct 2244 -59 2224 -26 2192 -26 ct -2160 -26 2139 -59 2139 -110 ct 2139 -162 2160 -195 2193 -195 ct p ef -2390 -138 m 2459 -221 l 2421 -221 l 2342 -127 l 2342 -303 l 2313 -303 l -2313 0 l 2342 0 l 2342 -83 l 2368 -111 l 2424 0 l 2463 0 l 2390 -138 l -p ef -2734 -221 m 2705 -221 l 2705 -188 l 2688 -217 2674 -227 2649 -227 ct 2604 -227 2574 -182 2574 -115 ct -2574 -42 2606 6 2654 6 ct 2676 6 2691 -2 2703 -24 ct 2703 -15 l 2703 11 2701 25 2695 37 ct -2687 54 2673 62 2651 62 ct 2628 62 2616 52 2610 27 ct 2580 27 l 2585 55 2591 68 2605 79 ct -2617 88 2632 93 2650 93 ct 2681 93 2705 80 2719 57 ct 2729 39 2734 17 2734 -18 ct -2734 -221 l p -2656 -194 m 2687 -194 2704 -162 2704 -104 ct 2704 -55 2686 -26 2654 -26 ct -2624 -26 2606 -58 2606 -113 ct 2606 -167 2623 -194 2656 -194 ct p ef -2805 -153 m 2809 -184 2821 -196 2848 -196 ct 2875 -196 2890 -184 2890 -159 ct -2890 -143 2885 -136 2874 -134 ct 2823 -126 l 2788 -121 2768 -96 2768 -58 ct -2768 -19 2791 6 2826 6 ct 2852 6 2871 -4 2890 -29 ct 2893 -5 2901 4 2922 4 ct 2926 4 2930 3 2936 1 ct -2938 0 2938 0 2940 0 ct 2940 -27 l 2933 -25 2931 -25 2929 -25 ct 2923 -25 2919 -30 2919 -38 ct -2919 -165 l 2919 -204 2893 -227 2850 -227 ct 2821 -227 2800 -217 2788 -198 ct -2781 -186 2778 -175 2777 -153 ct 2805 -153 l p -2889 -76 m 2889 -48 2863 -24 2832 -24 ct 2812 -24 2800 -38 2800 -61 ct 2800 -83 2811 -94 2839 -98 ct -2874 -104 2882 -107 2889 -112 ct 2889 -76 l p ef -3004 -221 m 2974 -221 l 2974 0 l 3004 0 l 3004 -221 l p -3004 -261 m 3004 -303 l 2974 -303 l 2974 -261 l 3004 -261 l p ef -3078 -221 m 3049 -221 l 3049 0 l 3079 0 l 3079 -120 l 3079 -166 3098 -194 3129 -194 ct -3155 -194 3167 -176 3167 -136 ct 3167 0 l 3197 0 l 3197 -150 l 3197 -199 3174 -227 3136 -227 ct -3111 -227 3093 -216 3078 -188 ct 3078 -221 l p ef -pom -gr -gs -pum -9174 17762 t -165 -88 m 189 0 l 226 0 l 136 -303 l 98 -303 l 4 0 l 39 0 l 65 -88 l -165 -88 l p -75 -125 m 115 -259 l 153 -125 l 75 -125 l p ef -406 -303 m 375 -303 l 375 -187 l 361 -216 345 -227 320 -227 ct 275 -227 245 -182 245 -115 ct -245 -41 276 6 324 6 ct 349 6 364 -4 377 -31 ct 377 0 l 406 0 l 406 -303 l -p -326 -194 m 357 -194 375 -162 375 -104 ct 375 -76 370 -57 359 -43 ct 350 -32 338 -26 325 -26 ct -294 -26 276 -58 276 -113 ct 276 -167 293 -194 326 -194 ct p ef -477 -153 m 481 -184 493 -196 520 -196 ct 547 -196 562 -184 562 -159 ct 562 -143 557 -136 546 -134 ct -495 -126 l 460 -121 440 -96 440 -58 ct 440 -19 463 6 498 6 ct 524 6 543 -4 562 -29 ct -565 -5 573 4 594 4 ct 598 4 602 3 608 1 ct 610 0 610 0 612 0 ct 612 -27 l 605 -25 603 -25 601 -25 ct -595 -25 591 -30 591 -38 ct 591 -165 l 591 -204 565 -227 522 -227 ct 493 -227 472 -217 460 -198 ct -453 -186 450 -175 449 -153 ct 477 -153 l p -561 -76 m 561 -48 535 -24 504 -24 ct 484 -24 472 -38 472 -61 ct 472 -83 483 -94 511 -98 ct -546 -104 554 -107 561 -112 ct 561 -76 l p ef -642 87 m 672 87 l 672 -24 l 685 -2 699 6 722 6 ct 770 6 801 -42 801 -115 ct -801 -182 771 -227 726 -227 ct 701 -227 687 -217 671 -188 ct 671 -221 l 642 -221 l -642 87 l p -721 -194 m 752 -194 769 -166 769 -114 ct 769 -58 751 -26 720 -26 ct 690 -26 671 -55 671 -103 ct -671 -163 688 -194 721 -194 ct p ef -906 -190 m 906 -221 l 876 -221 l 876 -282 l 846 -282 l 846 -221 l -821 -221 l 821 -190 l 846 -190 l 846 -44 l 846 -12 857 2 881 2 ct 883 2 885 2 892 1 ct -894 1 899 0 905 0 ct 905 -29 l 895 -29 l 881 -29 876 -34 876 -46 ct 876 -190 l -906 -190 l p ef -967 -221 m 937 -221 l 937 0 l 967 0 l 967 -221 l p -967 -261 m 967 -303 l 937 -303 l 937 -261 l 967 -261 l p ef -1076 -39 m 1029 -221 l 993 -221 l 1059 0 l 1092 0 l 1161 -221 l 1128 -221 l -1076 -39 l p ef -1309 -69 m 1306 -44 1286 -26 1262 -26 ct 1244 -26 1229 -34 1221 -49 ct 1213 -61 1211 -73 1210 -98 ct -1342 -98 l 1341 -142 1337 -162 1327 -184 ct 1313 -214 1293 -227 1263 -227 ct -1211 -227 1177 -180 1177 -106 ct 1177 -36 1209 6 1261 6 ct 1303 6 1332 -21 1340 -69 ct -1309 -69 l p -1210 -128 m 1212 -167 1233 -194 1262 -194 ct 1278 -194 1291 -186 1299 -173 ct -1306 -162 1309 -151 1311 -128 ct 1210 -128 l p ef -1621 -146 m 1615 -200 1593 -227 1552 -227 ct 1499 -227 1466 -180 1466 -106 ct -1466 -37 1498 6 1547 6 ct 1589 6 1614 -22 1621 -78 ct 1591 -78 l 1585 -43 1570 -26 1547 -26 ct -1516 -26 1499 -56 1499 -109 ct 1499 -163 1517 -194 1549 -194 ct 1573 -194 1586 -180 1591 -146 ct -1621 -146 l p ef -1727 -227 m 1676 -227 1642 -180 1642 -110 ct 1642 -41 1676 5 1726 5 ct 1776 5 1810 -41 1810 -110 ct -1810 -178 1776 -227 1727 -227 ct p -1727 -195 m 1758 -195 1778 -161 1778 -110 ct 1778 -59 1758 -26 1726 -26 ct -1694 -26 1673 -59 1673 -110 ct 1673 -162 1694 -195 1727 -195 ct p ef -1998 -303 m 1967 -303 l 1967 -187 l 1953 -216 1937 -227 1912 -227 ct 1867 -227 1837 -182 1837 -115 ct -1837 -41 1868 6 1916 6 ct 1941 6 1956 -4 1969 -31 ct 1969 0 l 1998 0 l 1998 -303 l -p -1918 -194 m 1949 -194 1967 -162 1967 -104 ct 1967 -76 1962 -57 1951 -43 ct -1942 -32 1930 -26 1917 -26 ct 1886 -26 1868 -58 1868 -113 ct 1868 -167 1885 -194 1918 -194 ct -p ef -2164 -69 m 2161 -44 2141 -26 2117 -26 ct 2099 -26 2084 -34 2076 -49 ct 2068 -61 2066 -73 2065 -98 ct -2197 -98 l 2196 -142 2192 -162 2182 -184 ct 2168 -214 2148 -227 2118 -227 ct -2066 -227 2032 -180 2032 -106 ct 2032 -36 2064 6 2116 6 ct 2158 6 2187 -21 2195 -69 ct -2164 -69 l p -2065 -128 m 2067 -167 2088 -194 2117 -194 ct 2133 -194 2146 -186 2154 -173 ct -2161 -162 2164 -151 2166 -128 ct 2065 -128 l p ef -2263 0 m 2263 -28 l 2276 -3 2290 6 2314 6 ct 2362 6 2393 -41 2393 -115 ct -2393 -182 2363 -227 2318 -227 ct 2296 -227 2280 -217 2264 -192 ct 2264 -303 l -2234 -303 l 2234 0 l 2263 0 l p -2313 -194 m 2345 -194 2361 -167 2361 -113 ct 2361 -58 2343 -26 2312 -26 ct -2300 -26 2288 -32 2279 -43 ct 2268 -57 2263 -76 2263 -105 ct 2263 -163 2280 -194 2313 -194 ct -p ef -2506 -227 m 2455 -227 2421 -180 2421 -110 ct 2421 -41 2455 5 2505 5 ct 2555 5 2589 -41 2589 -110 ct -2589 -178 2555 -227 2506 -227 ct p -2506 -195 m 2537 -195 2557 -161 2557 -110 ct 2557 -59 2537 -26 2505 -26 ct -2473 -26 2452 -59 2452 -110 ct 2452 -162 2473 -195 2506 -195 ct p ef -2701 -227 m 2650 -227 2616 -180 2616 -110 ct 2616 -41 2650 5 2700 5 ct 2750 5 2784 -41 2784 -110 ct -2784 -178 2750 -227 2701 -227 ct p -2701 -195 m 2732 -195 2752 -161 2752 -110 ct 2752 -59 2732 -26 2700 -26 ct -2668 -26 2647 -59 2647 -110 ct 2647 -162 2668 -195 2701 -195 ct p ef -2898 -138 m 2967 -221 l 2929 -221 l 2850 -127 l 2850 -303 l 2821 -303 l -2821 0 l 2850 0 l 2850 -83 l 2876 -111 l 2932 0 l 2971 0 l 2898 -138 l -p ef -3242 -221 m 3213 -221 l 3213 -188 l 3196 -217 3182 -227 3157 -227 ct 3112 -227 3082 -182 3082 -115 ct -3082 -42 3114 6 3162 6 ct 3184 6 3199 -2 3211 -24 ct 3211 -15 l 3211 11 3209 25 3203 37 ct -3195 54 3181 62 3159 62 ct 3136 62 3124 52 3118 27 ct 3088 27 l 3093 55 3099 68 3113 79 ct -3125 88 3140 93 3158 93 ct 3189 93 3213 80 3227 57 ct 3237 39 3242 17 3242 -18 ct -3242 -221 l p -3164 -194 m 3195 -194 3212 -162 3212 -104 ct 3212 -55 3194 -26 3162 -26 ct -3132 -26 3114 -58 3114 -113 ct 3114 -167 3131 -194 3164 -194 ct p ef -3313 -153 m 3317 -184 3329 -196 3356 -196 ct 3383 -196 3398 -184 3398 -159 ct -3398 -143 3393 -136 3382 -134 ct 3331 -126 l 3296 -121 3276 -96 3276 -58 ct -3276 -19 3299 6 3334 6 ct 3360 6 3379 -4 3398 -29 ct 3401 -5 3409 4 3430 4 ct 3434 4 3438 3 3444 1 ct -3446 0 3446 0 3448 0 ct 3448 -27 l 3441 -25 3439 -25 3437 -25 ct 3431 -25 3427 -30 3427 -38 ct -3427 -165 l 3427 -204 3401 -227 3358 -227 ct 3329 -227 3308 -217 3296 -198 ct -3289 -186 3286 -175 3285 -153 ct 3313 -153 l p -3397 -76 m 3397 -48 3371 -24 3340 -24 ct 3320 -24 3308 -38 3308 -61 ct 3308 -83 3319 -94 3347 -98 ct -3382 -104 3390 -107 3397 -112 ct 3397 -76 l p ef -3512 -221 m 3482 -221 l 3482 0 l 3512 0 l 3512 -221 l p -3512 -261 m 3512 -303 l 3482 -303 l 3482 -261 l 3512 -261 l p ef -3586 -221 m 3557 -221 l 3557 0 l 3587 0 l 3587 -120 l 3587 -166 3606 -194 3637 -194 ct -3663 -194 3675 -176 3675 -136 ct 3675 0 l 3705 0 l 3705 -150 l 3705 -199 3682 -227 3644 -227 ct -3619 -227 3601 -216 3586 -188 ct 3586 -221 l p ef -pom -gr -0 lw 1 lj 11185 19818 m 9435 19818 l 9435 18318 l 12935 18318 l 12935 19818 l -11185 19818 l pc -gs -pum -10523 19288 t -41 0 m 191 0 l 234 0 272 -17 297 -48 ct 332 -92 351 -157 351 -233 ct 351 -368 289 -455 193 -455 ct -41 -455 l 41 0 l p -92 -403 m 187 -403 l 259 -403 299 -341 299 -227 ct 299 -119 257 -52 190 -52 ct -92 -52 l 92 -403 l p ef -596 -104 m 591 -66 561 -39 524 -39 ct 497 -39 476 -51 462 -74 ct 451 -92 448 -110 446 -147 ct -645 -147 l 643 -213 637 -244 622 -277 ct 601 -321 570 -341 526 -341 ct 448 -341 397 -271 397 -160 ct -397 -55 445 9 523 9 ct 585 9 629 -32 641 -104 ct 596 -104 l p -446 -192 m 449 -252 481 -292 524 -292 ct 548 -292 568 -280 580 -260 ct 591 -243 595 -226 597 -192 ct -446 -192 l p ef -745 -455 m 699 -455 l 699 0 l 745 0 l 745 -455 l p ef -853 -231 m 859 -277 877 -295 917 -295 ct 958 -295 980 -276 980 -240 ct 980 -215 973 -204 956 -201 ct -880 -190 l 827 -182 798 -145 798 -87 ct 798 -29 832 9 885 9 ct 923 9 951 -6 981 -44 ct -984 -8 997 6 1028 6 ct 1035 6 1040 5 1049 1 ct 1052 0 1053 0 1055 0 ct 1055 -40 l -1045 -38 1043 -38 1039 -38 ct 1029 -38 1024 -45 1024 -57 ct 1024 -248 l 1024 -306 985 -341 920 -341 ct -878 -341 845 -326 827 -297 ct 817 -280 813 -264 811 -231 ct 853 -231 l p -979 -114 m 979 -73 940 -36 894 -36 ct 863 -36 845 -57 845 -92 ct 845 -125 862 -141 904 -148 ct -956 -157 969 -160 979 -169 ct 979 -114 l p ef -1197 -59 m 1124 -332 l 1072 -332 l 1173 8 l 1168 24 1164 38 1162 43 ct -1152 76 1144 85 1125 85 ct 1115 85 1106 83 1097 80 ct 1097 130 l 1101 132 l -1109 135 1113 135 1119 135 ct 1174 135 1182 125 1223 -6 ct 1321 -332 l 1270 -332 l -1197 -59 l p ef -pom -gr -13385 18918 m 13385 19218 l 12935 19068 l 13385 18918 l p ef -1 lw 0 lj 14935 14567 m 14935 19068 l 13295 19068 l ps -7085 18268 m 6785 18268 l 6935 17818 l 7085 18268 l p ef -9435 19068 m 6935 19068 l 6935 18178 l ps -20025 14718 m 20031 14418 l 20478 14577 l 20025 14718 l p ef -19335 14568 m 20127 14568 l ps -gs -pum -10179 20249 t -63 -128 m 141 -128 l 186 -128 215 -163 215 -217 ct 215 -269 186 -303 141 -303 ct -30 -303 l 30 0 l 63 0 l 63 -128 l p -63 -268 m 131 -268 l 164 -268 181 -251 181 -216 ct 181 -181 164 -163 130 -163 ct -63 -163 l 63 -268 l p ef -282 -153 m 286 -184 298 -196 325 -196 ct 352 -196 367 -184 367 -159 ct 367 -143 362 -136 351 -134 ct -300 -126 l 265 -121 245 -96 245 -58 ct 245 -19 268 6 303 6 ct 329 6 348 -4 367 -29 ct -370 -5 378 4 399 4 ct 403 4 407 3 413 1 ct 415 0 415 0 417 0 ct 417 -27 l 410 -25 408 -25 406 -25 ct -400 -25 396 -30 396 -38 ct 396 -165 l 396 -204 370 -227 327 -227 ct 298 -227 277 -217 265 -198 ct -258 -186 255 -175 254 -153 ct 282 -153 l p -366 -76 m 366 -48 340 -24 309 -24 ct 289 -24 277 -38 277 -61 ct 277 -83 288 -94 316 -98 ct -351 -104 359 -107 366 -112 ct 366 -76 l p ef -582 -158 m 580 -202 555 -227 514 -227 ct 472 -227 444 -200 444 -157 ct 444 -129 458 -111 486 -103 ct -522 -92 l 550 -84 558 -77 558 -60 ct 558 -39 542 -26 515 -26 ct 484 -26 470 -39 468 -71 ct -439 -71 l 440 -49 442 -38 448 -27 ct 460 -5 483 6 513 6 ct 559 6 588 -22 588 -66 ct -588 -97 574 -113 537 -125 ct 507 -134 l 480 -142 474 -148 474 -163 ct 474 -183 488 -195 512 -195 ct -538 -195 551 -183 553 -158 ct 582 -158 l p ef -690 -190 m 690 -221 l 660 -221 l 660 -282 l 630 -282 l 630 -221 l -605 -221 l 605 -190 l 630 -190 l 630 -44 l 630 -12 641 2 665 2 ct 667 2 669 2 676 1 ct -678 1 683 0 689 0 ct 689 -29 l 679 -29 l 665 -29 660 -34 660 -46 ct 660 -190 l -690 -190 l p ef -950 -158 m 948 -202 923 -227 882 -227 ct 840 -227 812 -200 812 -157 ct 812 -129 826 -111 854 -103 ct -890 -92 l 918 -84 926 -77 926 -60 ct 926 -39 910 -26 883 -26 ct 852 -26 838 -39 836 -71 ct -807 -71 l 808 -49 810 -38 816 -27 ct 828 -5 851 6 881 6 ct 927 6 956 -22 956 -66 ct -956 -97 942 -113 905 -125 ct 875 -134 l 848 -142 842 -148 842 -163 ct 842 -183 856 -195 880 -195 ct -906 -195 919 -183 921 -158 ct 950 -158 l p ef -1138 0 m 1138 -221 l 1108 -221 l 1108 -99 l 1108 -54 1088 -26 1058 -26 ct -1034 -26 1023 -42 1023 -74 ct 1023 -221 l 992 -221 l 992 -62 l 992 -19 1015 6 1052 6 ct -1079 6 1093 -3 1109 -34 ct 1109 0 l 1138 0 l p ef -1213 0 m 1213 -28 l 1226 -3 1240 6 1264 6 ct 1312 6 1343 -41 1343 -115 ct -1343 -182 1313 -227 1268 -227 ct 1246 -227 1230 -217 1214 -192 ct 1214 -303 l -1184 -303 l 1184 0 l 1213 0 l p -1263 -194 m 1295 -194 1311 -167 1311 -113 ct 1311 -58 1293 -26 1262 -26 ct -1250 -26 1238 -32 1229 -43 ct 1218 -57 1213 -76 1213 -105 ct 1213 -163 1230 -194 1263 -194 ct -p ef -1449 -190 m 1449 -221 l 1419 -221 l 1419 -248 l 1419 -266 1424 -274 1437 -274 ct -1440 -274 1444 -274 1449 -273 ct 1449 -307 l 1440 -307 1438 -307 1435 -307 ct -1405 -307 1389 -291 1389 -259 ct 1389 -221 l 1363 -221 l 1363 -190 l 1389 -190 l -1389 0 l 1419 0 l 1419 -190 l 1449 -190 l p ef -1571 -188 m 1571 -226 l 1568 -227 1565 -227 1563 -227 ct 1541 -227 1527 -215 1511 -183 ct -1511 -221 l 1482 -221 l 1482 0 l 1513 0 l 1513 -129 l 1513 -163 1532 -188 1559 -188 ct -1571 -188 l p ef -1620 -153 m 1624 -184 1636 -196 1663 -196 ct 1690 -196 1705 -184 1705 -159 ct -1705 -143 1700 -136 1689 -134 ct 1638 -126 l 1603 -121 1583 -96 1583 -58 ct -1583 -19 1606 6 1641 6 ct 1667 6 1686 -4 1705 -29 ct 1708 -5 1716 4 1737 4 ct 1741 4 1745 3 1751 1 ct -1753 0 1753 0 1755 0 ct 1755 -27 l 1748 -25 1746 -25 1744 -25 ct 1738 -25 1734 -30 1734 -38 ct -1734 -165 l 1734 -204 1708 -227 1665 -227 ct 1636 -227 1615 -217 1603 -198 ct -1596 -186 1593 -175 1592 -153 ct 1620 -153 l p -1704 -76 m 1704 -48 1678 -24 1647 -24 ct 1627 -24 1615 -38 1615 -61 ct 1615 -83 1626 -94 1654 -98 ct -1689 -104 1697 -107 1704 -112 ct 1704 -76 l p ef -1787 0 m 1817 0 l 1817 -120 l 1817 -165 1836 -194 1866 -194 ct 1883 -194 1894 -179 1894 -153 ct -1894 0 l 1924 0 l 1924 -134 l 1924 -168 1943 -194 1968 -194 ct 1990 -194 2001 -177 2001 -142 ct -2001 0 l 2031 0 l 2031 -153 l 2031 -199 2009 -227 1974 -227 ct 1952 -227 1940 -219 1920 -191 ct -1908 -217 1894 -227 1872 -227 ct 1848 -227 1831 -216 1816 -188 ct 1816 -221 l -1787 -221 l 1787 0 l p ef -2198 -69 m 2195 -44 2175 -26 2151 -26 ct 2133 -26 2118 -34 2110 -49 ct 2102 -61 2100 -73 2099 -98 ct -2231 -98 l 2230 -142 2226 -162 2216 -184 ct 2202 -214 2182 -227 2152 -227 ct -2100 -227 2066 -180 2066 -106 ct 2066 -36 2098 6 2150 6 ct 2192 6 2221 -21 2229 -69 ct -2198 -69 l p -2099 -128 m 2101 -167 2122 -194 2151 -194 ct 2167 -194 2180 -186 2188 -173 ct -2195 -162 2198 -151 2200 -128 ct 2099 -128 l p ef -pom -gr -tm setmatrix -0 0 t -1 1 s -0 11113 t -pom -count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore -%%PageTrailer -%%Trailer -%%EOF diff --git a/speex/doc/celp_decoder.odg b/speex/doc/celp_decoder.odg deleted file mode 100644 index ed537ad440656d290004fd7184b869c70a205880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10765 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 Djan|! diff --git a/speex/doc/components.eps b/speex/doc/components.eps deleted file mode 100644 index 8ac53a4ae..000000000 --- a/speex/doc/components.eps +++ /dev/null @@ -1,1361 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 0 0 770 174 -%%Pages: 0 -%%Creator: Sun Microsystems, Inc. -%%Title: none -%%CreationDate: none -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%BeginResource: procset SDRes-Prolog 1.0 0 -/b4_inc_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath -/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if -/bdef {bind def} bind def -/c {setrgbcolor} bdef -/l {neg lineto} bdef -/rl {neg rlineto} bdef -/lc {setlinecap} bdef -/lj {setlinejoin} bdef -/lw {setlinewidth} bdef -/ml {setmiterlimit} bdef -/ld {setdash} bdef -/m {neg moveto} bdef -/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef -/r {rotate} bdef -/t {neg translate} bdef -/s {scale} bdef -/sw {show} bdef -/gs {gsave} bdef -/gr {grestore} bdef -/f {findfont dup length dict begin -{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def -currentdict end /NFont exch definefont pop /NFont findfont} bdef -/p {closepath} bdef -/sf {scalefont setfont} bdef -/ef {eofill}bdef -/pc {closepath stroke}bdef -/ps {stroke}bdef -/pum {matrix currentmatrix}bdef -/pom {setmatrix}bdef -/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef -%%EndResource -%%EndProlog -%%BeginSetup -%%EndSetup -%%Page: 1 1 -%%BeginPageSetup -%%EndPageSetup -pum -0.02835 0.0284 s -0 -6126 t -/tm matrix currentmatrix def -tm setmatrix --450 -7975 t -1 1 s -50 lw 1 lj 0.003 0.003 0.003 c 4400 9500 m 2900 9500 l 2900 8000 l 5900 8000 l -5900 9500 l 4400 9500 l pc -gs -gs -pum -3380 8974 t -50 0 m 50 -455 l 251 -455 l 292 -455 323 -451 344 -443 ct 365 -435 382 -420 394 -399 ct -407 -379 413 -356 413 -331 ct 413 -299 403 -271 382 -249 ct 361 -227 329 -213 285 -207 ct -301 -199 313 -192 322 -184 ct 339 -168 356 -148 371 -124 ct 451 0 l 375 0 l -315 -95 l 297 -122 283 -143 271 -157 ct 260 -172 250 -182 241 -188 ct 232 -194 223 -198 213 -200 ct -207 -201 195 -202 180 -202 ct 110 -202 l 110 0 l 50 0 l p -110 -254 m 239 -254 l 267 -254 288 -257 304 -263 ct 319 -268 331 -277 339 -290 ct -347 -303 351 -316 351 -331 ct 351 -352 344 -370 328 -384 ct 312 -398 288 -405 254 -405 ct -110 -405 l 110 -254 l p ef -724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct -494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct -678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct -538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct -704 -66 716 -83 724 -107 ct p -541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct -609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef -1066 -121 m 1121 -114 l 1115 -76 1099 -46 1075 -25 ct 1050 -4 1020 7 984 7 ct -939 7 902 -8 875 -37 ct 848 -67 834 -109 834 -164 ct 834 -199 840 -230 851 -257 ct -863 -284 881 -304 905 -317 ct 929 -330 956 -337 984 -337 ct 1020 -337 1049 -328 1072 -310 ct -1094 -292 1109 -266 1115 -233 ct 1061 -224 l 1056 -247 1047 -263 1034 -274 ct -1021 -286 1005 -291 986 -291 ct 958 -291 935 -281 918 -261 ct 900 -241 891 -209 891 -165 ct -891 -121 900 -89 917 -69 ct 934 -49 956 -39 983 -39 ct 1005 -39 1023 -46 1038 -59 ct -1053 -72 1062 -93 1066 -121 ct p ef -1147 -165 m 1147 -226 1164 -271 1198 -301 ct 1226 -325 1261 -337 1302 -337 ct -1347 -337 1384 -322 1412 -293 ct 1441 -263 1456 -222 1456 -170 ct 1456 -127 1449 -94 1437 -70 ct -1424 -45 1405 -27 1381 -13 ct 1357 0 1330 7 1302 7 ct 1255 7 1218 -8 1190 -37 ct -1161 -67 1147 -110 1147 -165 ct p -1204 -165 m 1204 -123 1214 -91 1232 -70 ct 1250 -49 1274 -39 1302 -39 ct 1329 -39 1352 -49 1371 -71 ct -1389 -92 1398 -124 1398 -167 ct 1398 -208 1389 -239 1370 -260 ct 1352 -281 1329 -291 1302 -291 ct -1274 -291 1250 -281 1232 -260 ct 1214 -239 1204 -207 1204 -165 ct p ef -1518 0 m 1518 -330 l 1568 -330 l 1568 -280 l 1581 -303 1593 -318 1604 -326 ct -1615 -333 1627 -337 1640 -337 ct 1659 -337 1678 -331 1697 -319 ct 1678 -267 l -1664 -275 1651 -279 1637 -279 ct 1625 -279 1614 -276 1604 -268 ct 1594 -261 1587 -251 1583 -238 ct -1577 -218 1574 -196 1574 -173 ct 1574 0 l 1518 0 l p ef -1944 0 m 1944 -42 l 1924 -9 1893 7 1852 7 ct 1826 7 1802 0 1780 -15 ct 1758 -29 1741 -49 1729 -75 ct -1717 -101 1711 -131 1711 -165 ct 1711 -198 1716 -228 1727 -254 ct 1738 -281 1755 -302 1776 -316 ct -1798 -330 1823 -337 1850 -337 ct 1870 -337 1887 -333 1903 -325 ct 1918 -316 1931 -305 1941 -292 ct -1941 -455 l 1996 -455 l 1996 0 l 1944 0 l p -1768 -165 m 1768 -123 1777 -91 1795 -70 ct 1813 -49 1833 -39 1858 -39 ct 1882 -39 1903 -49 1920 -69 ct -1937 -89 1945 -119 1945 -160 ct 1945 -205 1937 -238 1919 -259 ct 1902 -280 1881 -291 1855 -291 ct -1830 -291 1810 -281 1793 -261 ct 1776 -240 1768 -208 1768 -165 ct p ef -pom -gr -gr -12748 9525 m 12697 9525 l 12697 9475 l 12748 9475 l 12748 9525 l p ef -12646 9525 m 12595 9525 l 12595 9475 l 12646 9475 l 12646 9525 l p ef -12544 9525 m 12493 9525 l 12493 9475 l 12544 9475 l 12544 9525 l p ef -12442 9525 m 12391 9525 l 12391 9475 l 12442 9475 l 12442 9525 l p ef -12340 9525 m 12289 9525 l 12289 9475 l 12340 9475 l 12340 9525 l p ef -12238 9525 m 12187 9525 l 12187 9475 l 12238 9475 l 12238 9525 l p ef -12136 9525 m 12085 9525 l 12085 9475 l 12136 9475 l 12136 9525 l p ef -12034 9525 m 11983 9525 l 11983 9475 l 12034 9475 l 12034 9525 l p ef -11932 9525 m 11881 9525 l 11881 9475 l 11932 9475 l 11932 9525 l p ef -11830 9525 m 11779 9525 l 11779 9475 l 11830 9475 l 11830 9525 l p ef -11728 9525 m 11677 9525 l 11677 9475 l 11728 9475 l 11728 9525 l p ef -11626 9525 m 11575 9525 l 11575 9475 l 11626 9475 l 11626 9525 l p ef -11524 9525 m 11473 9525 l 11473 9475 l 11524 9475 l 11524 9525 l p ef -11422 9525 m 11400 9525 l 11400 9500 l 11400 9475 l 11422 9475 l 11422 9500 l -11422 9525 l p ef -11400 9500 m 11400 9525 l 11396 9525 l 11391 9523 l 11388 9522 l 11384 9519 l -11381 9516 l 11378 9513 l 11377 9509 l 11375 9504 l 11375 9500 l 11375 9500 l -11400 9500 l p ef -11375 9500 m 11375 9471 l 11400 9471 l 11425 9471 l 11425 9500 l 11400 9500 l -11375 9500 l p ef -11375 9420 m 11375 9369 l 11425 9369 l 11425 9420 l 11375 9420 l p ef -11375 9318 m 11375 9267 l 11425 9267 l 11425 9318 l 11375 9318 l p ef -11375 9216 m 11375 9165 l 11425 9165 l 11425 9216 l 11375 9216 l p ef -11375 9114 m 11375 9063 l 11425 9063 l 11425 9114 l 11375 9114 l p ef -11375 9012 m 11375 8961 l 11425 8961 l 11425 9012 l 11375 9012 l p ef -11375 8910 m 11375 8859 l 11425 8859 l 11425 8910 l 11375 8910 l p ef -11375 8808 m 11375 8757 l 11425 8757 l 11425 8808 l 11375 8808 l p ef -11375 8706 m 11375 8655 l 11425 8655 l 11425 8706 l 11375 8706 l p ef -11375 8604 m 11375 8553 l 11425 8553 l 11425 8604 l 11375 8604 l p ef -11375 8502 m 11375 8451 l 11425 8451 l 11425 8502 l 11375 8502 l p ef -11375 8400 m 11375 8349 l 11425 8349 l 11425 8400 l 11375 8400 l p ef -11375 8298 m 11375 8247 l 11425 8247 l 11425 8298 l 11375 8298 l p ef -11375 8196 m 11375 8145 l 11425 8145 l 11425 8196 l 11375 8196 l p ef -11375 8094 m 11375 8043 l 11425 8043 l 11425 8094 l 11375 8094 l p ef -11408 7975 m 11459 7975 l 11459 8025 l 11408 8025 l 11408 7975 l p ef -11510 7975 m 11561 7975 l 11561 8025 l 11510 8025 l 11510 7975 l p ef -11612 7975 m 11663 7975 l 11663 8025 l 11612 8025 l 11612 7975 l p ef -11714 7975 m 11765 7975 l 11765 8025 l 11714 8025 l 11714 7975 l p ef -11816 7975 m 11867 7975 l 11867 8025 l 11816 8025 l 11816 7975 l p ef -11918 7975 m 11969 7975 l 11969 8025 l 11918 8025 l 11918 7975 l p ef -12020 7975 m 12071 7975 l 12071 8025 l 12020 8025 l 12020 7975 l p ef -12122 7975 m 12173 7975 l 12173 8025 l 12122 8025 l 12122 7975 l p ef -12224 7975 m 12275 7975 l 12275 8025 l 12224 8025 l 12224 7975 l p ef -12326 7975 m 12377 7975 l 12377 8025 l 12326 8025 l 12326 7975 l p ef -12428 7975 m 12479 7975 l 12479 8025 l 12428 8025 l 12428 7975 l p ef -12530 7975 m 12581 7975 l 12581 8025 l 12530 8025 l 12530 7975 l p ef -12632 7975 m 12683 7975 l 12683 8025 l 12632 8025 l 12632 7975 l p ef -12734 7975 m 12785 7975 l 12785 8025 l 12734 8025 l 12734 7975 l p ef -12836 7975 m 12887 7975 l 12887 8025 l 12836 8025 l 12836 7975 l p ef -12938 7975 m 12989 7975 l 12989 8025 l 12938 8025 l 12938 7975 l p ef -13040 7975 m 13091 7975 l 13091 8025 l 13040 8025 l 13040 7975 l p ef -13142 7975 m 13193 7975 l 13193 8025 l 13142 8025 l 13142 7975 l p ef -13244 7975 m 13295 7975 l 13295 8025 l 13244 8025 l 13244 7975 l p ef -13346 7975 m 13397 7975 l 13397 8025 l 13346 8025 l 13346 7975 l p ef -13448 7975 m 13499 7975 l 13499 8025 l 13448 8025 l 13448 7975 l p ef -13550 7975 m 13601 7975 l 13601 8025 l 13550 8025 l 13550 7975 l p ef -13652 7975 m 13703 7975 l 13703 8025 l 13652 8025 l 13652 7975 l p ef -13754 7975 m 13805 7975 l 13805 8025 l 13754 8025 l 13754 7975 l p ef -13856 7975 m 13907 7975 l 13907 8025 l 13856 8025 l 13856 7975 l p ef -13958 7975 m 14009 7975 l 14009 8025 l 13958 8025 l 13958 7975 l p ef -14060 7975 m 14111 7975 l 14111 8025 l 14060 8025 l 14060 7975 l p ef -14162 7975 m 14213 7975 l 14213 8025 l 14162 8025 l 14162 7975 l p ef -14264 7975 m 14300 7975 l 14300 8000 l 14300 8025 l 14264 8025 l 14264 8000 l -14264 7975 l p ef -14300 8000 m 14300 7975 l 14304 7975 l 14309 7977 l 14312 7978 l 14316 7981 l -14319 7984 l 14322 7987 l 14323 7991 l 14325 7996 l 14325 8000 l 14325 8000 l -14300 8000 l p ef -14325 8000 m 14325 8015 l 14300 8015 l 14275 8015 l 14275 8000 l 14300 8000 l -14325 8000 l p ef -14325 8066 m 14325 8117 l 14275 8117 l 14275 8066 l 14325 8066 l p ef -14325 8168 m 14325 8219 l 14275 8219 l 14275 8168 l 14325 8168 l p ef -14325 8270 m 14325 8321 l 14275 8321 l 14275 8270 l 14325 8270 l p ef -14325 8372 m 14325 8423 l 14275 8423 l 14275 8372 l 14325 8372 l p ef -14325 8474 m 14325 8525 l 14275 8525 l 14275 8474 l 14325 8474 l p ef -14325 8576 m 14325 8627 l 14275 8627 l 14275 8576 l 14325 8576 l p ef -14325 8678 m 14325 8729 l 14275 8729 l 14275 8678 l 14325 8678 l p ef -14325 8780 m 14325 8831 l 14275 8831 l 14275 8780 l 14325 8780 l p ef -14325 8882 m 14325 8933 l 14275 8933 l 14275 8882 l 14325 8882 l p ef -14325 8984 m 14325 9035 l 14275 9035 l 14275 8984 l 14325 8984 l p ef -14325 9086 m 14325 9137 l 14275 9137 l 14275 9086 l 14325 9086 l p ef -14325 9188 m 14325 9239 l 14275 9239 l 14275 9188 l 14325 9188 l p ef -14325 9290 m 14325 9341 l 14275 9341 l 14275 9290 l 14325 9290 l p ef -14325 9392 m 14325 9443 l 14275 9443 l 14275 9392 l 14325 9392 l p ef -14325 9494 m 14325 9500 l 14300 9500 l 14275 9500 l 14275 9494 l 14300 9494 l -14325 9494 l p ef -14300 9500 m 14325 9500 l 14325 9504 l 14323 9509 l 14322 9512 l 14319 9516 l -14316 9519 l 14313 9522 l 14309 9523 l 14304 9525 l 14300 9525 l 14300 9525 l -14300 9500 l p ef -14300 9525 m 14255 9525 l 14255 9500 l 14255 9475 l 14300 9475 l 14300 9500 l -14300 9525 l p ef -14204 9525 m 14153 9525 l 14153 9475 l 14204 9475 l 14204 9525 l p ef -14102 9525 m 14051 9525 l 14051 9475 l 14102 9475 l 14102 9525 l p ef -14000 9525 m 13949 9525 l 13949 9475 l 14000 9475 l 14000 9525 l p ef -13898 9525 m 13847 9525 l 13847 9475 l 13898 9475 l 13898 9525 l p ef -13796 9525 m 13745 9525 l 13745 9475 l 13796 9475 l 13796 9525 l p ef -13694 9525 m 13643 9525 l 13643 9475 l 13694 9475 l 13694 9525 l p ef -13592 9525 m 13541 9525 l 13541 9475 l 13592 9475 l 13592 9525 l p ef -13490 9525 m 13439 9525 l 13439 9475 l 13490 9475 l 13490 9525 l p ef -13388 9525 m 13337 9525 l 13337 9475 l 13388 9475 l 13388 9525 l p ef -13286 9525 m 13235 9525 l 13235 9475 l 13286 9475 l 13286 9525 l p ef -13184 9525 m 13133 9525 l 13133 9475 l 13184 9475 l 13184 9525 l p ef -13082 9525 m 13031 9525 l 13031 9475 l 13082 9475 l 13082 9525 l p ef -12980 9525 m 12929 9525 l 12929 9475 l 12980 9475 l 12980 9525 l p ef -12878 9525 m 12850 9525 l 12850 9500 l 12850 9475 l 12878 9475 l 12878 9500 l -12878 9525 l p ef -12850 9525 m 12799 9525 l 12799 9500 l 12799 9475 l 12850 9475 l 12850 9500 l -12850 9525 l p ef -gs -gs -pum -12191 8974 t --1 0 m 174 -455 l 238 -455 l 424 0 l 356 0 l 303 -138 l 113 -138 l -63 0 l -1 0 l p -130 -187 m 284 -187 l 237 -313 l 222 -351 212 -383 205 -407 ct 199 -378 191 -349 180 -320 ct -130 -187 l p ef -473 0 m 473 -455 l 802 -455 l 802 -401 l 533 -401 l 533 -262 l 785 -262 l -785 -209 l 533 -209 l 533 -54 l 812 -54 l 812 0 l 473 0 l p ef -1220 -159 m 1280 -144 l 1268 -95 1245 -57 1212 -31 ct 1180 -5 1140 8 1092 8 ct -1043 8 1003 -2 973 -22 ct 942 -42 919 -71 903 -109 ct 887 -147 879 -187 879 -231 ct -879 -278 888 -319 906 -355 ct 924 -390 950 -417 983 -435 ct 1016 -453 1053 -463 1093 -463 ct -1139 -463 1177 -451 1208 -428 ct 1239 -405 1261 -372 1273 -330 ct 1213 -316 l -1203 -349 1188 -373 1168 -388 ct 1148 -403 1122 -411 1092 -411 ct 1057 -411 1028 -403 1004 -386 ct -981 -369 964 -347 955 -318 ct 945 -290 941 -261 941 -231 ct 941 -192 946 -159 958 -130 ct -969 -101 986 -79 1010 -65 ct 1034 -51 1060 -44 1087 -44 ct 1121 -44 1150 -53 1173 -73 ct -1196 -92 1212 -121 1220 -159 ct p ef -pom -gr -gr -17600 9525 m 17549 9525 l 17549 9475 l 17600 9475 l 17600 9525 l p ef -17498 9525 m 17447 9525 l 17447 9475 l 17498 9475 l 17498 9525 l p ef -17396 9525 m 17345 9525 l 17345 9475 l 17396 9475 l 17396 9525 l p ef -17294 9525 m 17243 9525 l 17243 9475 l 17294 9475 l 17294 9525 l p ef -17192 9525 m 17141 9525 l 17141 9475 l 17192 9475 l 17192 9525 l p ef -17090 9525 m 17039 9525 l 17039 9475 l 17090 9475 l 17090 9525 l p ef -16988 9525 m 16937 9525 l 16937 9475 l 16988 9475 l 16988 9525 l p ef -16886 9525 m 16835 9525 l 16835 9475 l 16886 9475 l 16886 9525 l p ef -16784 9525 m 16733 9525 l 16733 9475 l 16784 9475 l 16784 9525 l p ef -16682 9525 m 16631 9525 l 16631 9475 l 16682 9475 l 16682 9525 l p ef -16580 9525 m 16529 9525 l 16529 9475 l 16580 9475 l 16580 9525 l p ef -16478 9525 m 16427 9525 l 16427 9475 l 16478 9475 l 16478 9525 l p ef -16376 9525 m 16325 9525 l 16325 9475 l 16376 9475 l 16376 9525 l p ef -16274 9525 m 16223 9525 l 16223 9475 l 16274 9475 l 16274 9525 l p ef -16172 9525 m 16121 9525 l 16121 9475 l 16172 9475 l 16172 9525 l p ef -16070 9525 m 16019 9525 l 16019 9475 l 16070 9475 l 16070 9525 l p ef -15968 9525 m 15917 9525 l 15917 9475 l 15968 9475 l 15968 9525 l p ef -15866 9525 m 15815 9525 l 15815 9475 l 15866 9475 l 15866 9525 l p ef -15764 9525 m 15713 9525 l 15713 9475 l 15764 9475 l 15764 9525 l p ef -15662 9525 m 15611 9525 l 15611 9475 l 15662 9475 l 15662 9525 l p ef -15560 9525 m 15509 9525 l 15509 9475 l 15560 9475 l 15560 9525 l p ef -15458 9525 m 15407 9525 l 15407 9475 l 15458 9475 l 15458 9525 l p ef -15375 9456 m 15375 9405 l 15425 9405 l 15425 9456 l 15375 9456 l p ef -15375 9354 m 15375 9303 l 15425 9303 l 15425 9354 l 15375 9354 l p ef -15375 9252 m 15375 9201 l 15425 9201 l 15425 9252 l 15375 9252 l p ef -15375 9150 m 15375 9099 l 15425 9099 l 15425 9150 l 15375 9150 l p ef -15375 9048 m 15375 8997 l 15425 8997 l 15425 9048 l 15375 9048 l p ef -15375 8946 m 15375 8895 l 15425 8895 l 15425 8946 l 15375 8946 l p ef -15375 8844 m 15375 8793 l 15425 8793 l 15425 8844 l 15375 8844 l p ef -15375 8742 m 15375 8691 l 15425 8691 l 15425 8742 l 15375 8742 l p ef -15375 8640 m 15375 8589 l 15425 8589 l 15425 8640 l 15375 8640 l p ef -15375 8538 m 15375 8487 l 15425 8487 l 15425 8538 l 15375 8538 l p ef -15375 8436 m 15375 8385 l 15425 8385 l 15425 8436 l 15375 8436 l p ef -15375 8334 m 15375 8283 l 15425 8283 l 15425 8334 l 15375 8334 l p ef -15375 8232 m 15375 8181 l 15425 8181 l 15425 8232 l 15375 8232 l p ef -15375 8130 m 15375 8079 l 15425 8079 l 15425 8130 l 15375 8130 l p ef -15375 8028 m 15375 8000 l 15400 8000 l 15425 8000 l 15425 8028 l 15400 8028 l -15375 8028 l p ef -15400 8000 m 15375 8000 l 15375 7996 l 15377 7991 l 15378 7988 l 15381 7984 l -15384 7981 l 15387 7978 l 15391 7977 l 15396 7975 l 15400 7975 l 15400 7975 l -15400 8000 l p ef -15400 7975 m 15423 7975 l 15423 8000 l 15423 8025 l 15400 8025 l 15400 8000 l -15400 7975 l p ef -15474 7975 m 15525 7975 l 15525 8025 l 15474 8025 l 15474 7975 l p ef -15576 7975 m 15627 7975 l 15627 8025 l 15576 8025 l 15576 7975 l p ef -15678 7975 m 15729 7975 l 15729 8025 l 15678 8025 l 15678 7975 l p ef -15780 7975 m 15831 7975 l 15831 8025 l 15780 8025 l 15780 7975 l p ef -15882 7975 m 15933 7975 l 15933 8025 l 15882 8025 l 15882 7975 l p ef -15984 7975 m 16035 7975 l 16035 8025 l 15984 8025 l 15984 7975 l p ef -16086 7975 m 16137 7975 l 16137 8025 l 16086 8025 l 16086 7975 l p ef -16188 7975 m 16239 7975 l 16239 8025 l 16188 8025 l 16188 7975 l p ef -16290 7975 m 16341 7975 l 16341 8025 l 16290 8025 l 16290 7975 l p ef -16392 7975 m 16443 7975 l 16443 8025 l 16392 8025 l 16392 7975 l p ef -16494 7975 m 16545 7975 l 16545 8025 l 16494 8025 l 16494 7975 l p ef -16596 7975 m 16647 7975 l 16647 8025 l 16596 8025 l 16596 7975 l p ef -16698 7975 m 16749 7975 l 16749 8025 l 16698 8025 l 16698 7975 l p ef -16800 7975 m 16851 7975 l 16851 8025 l 16800 8025 l 16800 7975 l p ef -16902 7975 m 16953 7975 l 16953 8025 l 16902 8025 l 16902 7975 l p ef -17004 7975 m 17055 7975 l 17055 8025 l 17004 8025 l 17004 7975 l p ef -17106 7975 m 17157 7975 l 17157 8025 l 17106 8025 l 17106 7975 l p ef -17208 7975 m 17259 7975 l 17259 8025 l 17208 8025 l 17208 7975 l p ef -17310 7975 m 17361 7975 l 17361 8025 l 17310 8025 l 17310 7975 l p ef -17412 7975 m 17463 7975 l 17463 8025 l 17412 8025 l 17412 7975 l p ef -17514 7975 m 17565 7975 l 17565 8025 l 17514 8025 l 17514 7975 l p ef -17616 7975 m 17667 7975 l 17667 8025 l 17616 8025 l 17616 7975 l p ef -17718 7975 m 17769 7975 l 17769 8025 l 17718 8025 l 17718 7975 l p ef -17820 7975 m 17871 7975 l 17871 8025 l 17820 8025 l 17820 7975 l p ef -17922 7975 m 17973 7975 l 17973 8025 l 17922 8025 l 17922 7975 l p ef -18024 7975 m 18075 7975 l 18075 8025 l 18024 8025 l 18024 7975 l p ef -18126 7975 m 18177 7975 l 18177 8025 l 18126 8025 l 18126 7975 l p ef -18228 7975 m 18279 7975 l 18279 8025 l 18228 8025 l 18228 7975 l p ef -18330 7975 m 18381 7975 l 18381 8025 l 18330 8025 l 18330 7975 l p ef -18432 7975 m 18483 7975 l 18483 8025 l 18432 8025 l 18432 7975 l p ef -18534 7975 m 18585 7975 l 18585 8025 l 18534 8025 l 18534 7975 l p ef -18636 7975 m 18687 7975 l 18687 8025 l 18636 8025 l 18636 7975 l p ef -18738 7975 m 18789 7975 l 18789 8025 l 18738 8025 l 18738 7975 l p ef -18840 7975 m 18891 7975 l 18891 8025 l 18840 8025 l 18840 7975 l p ef -18942 7975 m 18993 7975 l 18993 8025 l 18942 8025 l 18942 7975 l p ef -19044 7975 m 19095 7975 l 19095 8025 l 19044 8025 l 19044 7975 l p ef -19146 7975 m 19197 7975 l 19197 8025 l 19146 8025 l 19146 7975 l p ef -19248 7975 m 19299 7975 l 19299 8025 l 19248 8025 l 19248 7975 l p ef -19350 7975 m 19401 7975 l 19401 8025 l 19350 8025 l 19350 7975 l p ef -19452 7975 m 19503 7975 l 19503 8025 l 19452 8025 l 19452 7975 l p ef -19554 7975 m 19605 7975 l 19605 8025 l 19554 8025 l 19554 7975 l p ef -19656 7975 m 19707 7975 l 19707 8025 l 19656 8025 l 19656 7975 l p ef -19758 7975 m 19800 7975 l 19800 8000 l 19800 8025 l 19758 8025 l 19758 8000 l -19758 7975 l p ef -19800 8000 m 19800 7975 l 19804 7975 l 19809 7977 l 19812 7978 l 19816 7981 l -19819 7984 l 19822 7987 l 19823 7991 l 19825 7996 l 19825 8000 l 19825 8000 l -19800 8000 l p ef -19825 8000 m 19825 8009 l 19800 8009 l 19775 8009 l 19775 8000 l 19800 8000 l -19825 8000 l p ef -19825 8060 m 19825 8111 l 19775 8111 l 19775 8060 l 19825 8060 l p ef -19825 8162 m 19825 8213 l 19775 8213 l 19775 8162 l 19825 8162 l p ef -19825 8264 m 19825 8315 l 19775 8315 l 19775 8264 l 19825 8264 l p ef -19825 8366 m 19825 8417 l 19775 8417 l 19775 8366 l 19825 8366 l p ef -19825 8468 m 19825 8519 l 19775 8519 l 19775 8468 l 19825 8468 l p ef -19825 8570 m 19825 8621 l 19775 8621 l 19775 8570 l 19825 8570 l p ef -19825 8672 m 19825 8723 l 19775 8723 l 19775 8672 l 19825 8672 l p ef -19825 8774 m 19825 8825 l 19775 8825 l 19775 8774 l 19825 8774 l p ef -19825 8876 m 19825 8927 l 19775 8927 l 19775 8876 l 19825 8876 l p ef -19825 8978 m 19825 9029 l 19775 9029 l 19775 8978 l 19825 8978 l p ef -19825 9080 m 19825 9131 l 19775 9131 l 19775 9080 l 19825 9080 l p ef -19825 9182 m 19825 9233 l 19775 9233 l 19775 9182 l 19825 9182 l p ef -19825 9284 m 19825 9335 l 19775 9335 l 19775 9284 l 19825 9284 l p ef -19825 9386 m 19825 9437 l 19775 9437 l 19775 9386 l 19825 9386 l p ef -19825 9488 m 19825 9500 l 19800 9500 l 19775 9500 l 19775 9488 l 19800 9488 l -19825 9488 l p ef -19800 9500 m 19825 9500 l 19825 9504 l 19823 9509 l 19822 9512 l 19819 9516 l -19816 9519 l 19813 9522 l 19809 9523 l 19804 9525 l 19800 9525 l 19800 9525 l -19800 9500 l p ef -19800 9525 m 19761 9525 l 19761 9500 l 19761 9475 l 19800 9475 l 19800 9500 l -19800 9525 l p ef -19710 9525 m 19659 9525 l 19659 9475 l 19710 9475 l 19710 9525 l p ef -19608 9525 m 19557 9525 l 19557 9475 l 19608 9475 l 19608 9525 l p ef -19506 9525 m 19455 9525 l 19455 9475 l 19506 9475 l 19506 9525 l p ef -19404 9525 m 19353 9525 l 19353 9475 l 19404 9475 l 19404 9525 l p ef -19302 9525 m 19251 9525 l 19251 9475 l 19302 9475 l 19302 9525 l p ef -19200 9525 m 19149 9525 l 19149 9475 l 19200 9475 l 19200 9525 l p ef -19098 9525 m 19047 9525 l 19047 9475 l 19098 9475 l 19098 9525 l p ef -18996 9525 m 18945 9525 l 18945 9475 l 18996 9475 l 18996 9525 l p ef -18894 9525 m 18843 9525 l 18843 9475 l 18894 9475 l 18894 9525 l p ef -18792 9525 m 18741 9525 l 18741 9475 l 18792 9475 l 18792 9525 l p ef -18690 9525 m 18639 9525 l 18639 9475 l 18690 9475 l 18690 9525 l p ef -18588 9525 m 18537 9525 l 18537 9475 l 18588 9475 l 18588 9525 l p ef -18486 9525 m 18435 9525 l 18435 9475 l 18486 9475 l 18486 9525 l p ef -18384 9525 m 18333 9525 l 18333 9475 l 18384 9475 l 18384 9525 l p ef -18282 9525 m 18231 9525 l 18231 9475 l 18282 9475 l 18282 9525 l p ef -18180 9525 m 18129 9525 l 18129 9475 l 18180 9475 l 18180 9525 l p ef -18078 9525 m 18027 9525 l 18027 9475 l 18078 9475 l 18078 9525 l p ef -17976 9525 m 17925 9525 l 17925 9475 l 17976 9475 l 17976 9525 l p ef -17874 9525 m 17823 9525 l 17823 9475 l 17874 9475 l 17874 9525 l p ef -17772 9525 m 17721 9525 l 17721 9475 l 17772 9475 l 17772 9525 l p ef -17670 9525 m 17619 9525 l 17619 9475 l 17670 9475 l 17670 9525 l p ef -gs -gs -pum -15705 8974 t -49 0 m 49 -455 l 220 -455 l 251 -455 274 -454 290 -451 ct 312 -447 331 -440 346 -429 ct -361 -419 373 -404 382 -385 ct 391 -367 396 -346 396 -323 ct 396 -285 384 -252 359 -225 ct -334 -198 290 -185 226 -185 ct 109 -185 l 109 0 l 49 0 l p -109 -239 m 227 -239 l 266 -239 293 -246 309 -260 ct 326 -275 334 -295 334 -322 ct -334 -341 329 -357 320 -370 ct 310 -384 297 -393 282 -397 ct 271 -400 253 -401 225 -401 ct -109 -401 l 109 -239 l p ef -464 0 m 464 -330 l 514 -330 l 514 -280 l 527 -303 539 -318 550 -326 ct -561 -333 573 -337 586 -337 ct 605 -337 624 -331 643 -319 ct 624 -267 l 610 -275 597 -279 583 -279 ct -571 -279 560 -276 550 -268 ct 540 -261 533 -251 529 -238 ct 523 -218 520 -196 520 -173 ct -520 0 l 464 0 l p ef -902 -107 m 960 -99 l 951 -66 934 -40 909 -21 ct 885 -2 853 7 815 7 ct 767 7 729 -8 701 -37 ct -672 -67 658 -109 658 -162 ct 658 -218 673 -261 701 -291 ct 730 -322 767 -337 812 -337 ct -856 -337 892 -322 920 -292 ct 948 -262 962 -220 962 -166 ct 962 -163 962 -158 961 -151 ct -716 -151 l 718 -115 728 -87 747 -68 ct 765 -49 788 -39 815 -39 ct 836 -39 853 -44 868 -55 ct -882 -66 894 -83 902 -107 ct p -719 -197 m 903 -197 l 900 -225 893 -245 882 -259 ct 864 -280 841 -291 813 -291 ct -787 -291 765 -283 748 -265 ct 731 -248 721 -226 719 -197 ct p ef -1028 126 m 1028 -330 l 1079 -330 l 1079 -287 l 1091 -304 1104 -316 1119 -324 ct -1134 -333 1153 -337 1174 -337 ct 1202 -337 1227 -330 1249 -315 ct 1270 -301 1286 -280 1297 -254 ct -1308 -228 1314 -199 1314 -167 ct 1314 -134 1308 -103 1296 -77 ct 1284 -50 1266 -29 1243 -15 ct -1220 0 1196 7 1170 7 ct 1152 7 1135 3 1120 -5 ct 1105 -13 1093 -23 1084 -35 ct -1084 126 l 1028 126 l p -1078 -163 m 1078 -121 1087 -90 1104 -69 ct 1121 -49 1142 -39 1166 -39 ct 1191 -39 1213 -49 1230 -70 ct -1248 -91 1257 -124 1257 -168 ct 1257 -210 1248 -241 1231 -262 ct 1214 -283 1193 -293 1169 -293 ct -1145 -293 1124 -282 1106 -260 ct 1088 -238 1078 -205 1078 -163 ct p ef -1379 0 m 1379 -330 l 1429 -330 l 1429 -280 l 1442 -303 1454 -318 1465 -326 ct -1476 -333 1488 -337 1501 -337 ct 1520 -337 1539 -331 1558 -319 ct 1539 -267 l -1525 -275 1512 -279 1498 -279 ct 1486 -279 1475 -276 1465 -268 ct 1455 -261 1448 -251 1444 -238 ct -1438 -218 1435 -196 1435 -173 ct 1435 0 l 1379 0 l p ef -1570 -165 m 1570 -226 1587 -271 1621 -301 ct 1649 -325 1684 -337 1725 -337 ct -1770 -337 1807 -322 1835 -293 ct 1864 -263 1879 -222 1879 -170 ct 1879 -127 1872 -94 1860 -70 ct -1847 -45 1828 -27 1804 -13 ct 1780 0 1753 7 1725 7 ct 1678 7 1641 -8 1613 -37 ct -1584 -67 1570 -110 1570 -165 ct p -1627 -165 m 1627 -123 1637 -91 1655 -70 ct 1673 -49 1697 -39 1725 -39 ct 1752 -39 1775 -49 1794 -71 ct -1812 -92 1821 -124 1821 -167 ct 1821 -208 1812 -239 1793 -260 ct 1775 -281 1752 -291 1725 -291 ct -1697 -291 1673 -281 1655 -260 ct 1637 -239 1627 -207 1627 -165 ct p ef -2158 -121 m 2213 -114 l 2207 -76 2191 -46 2167 -25 ct 2142 -4 2112 7 2076 7 ct -2031 7 1994 -8 1967 -37 ct 1940 -67 1926 -109 1926 -164 ct 1926 -199 1932 -230 1943 -257 ct -1955 -284 1973 -304 1997 -317 ct 2021 -330 2048 -337 2076 -337 ct 2112 -337 2141 -328 2164 -310 ct -2186 -292 2201 -266 2207 -233 ct 2153 -224 l 2148 -247 2139 -263 2126 -274 ct -2113 -286 2097 -291 2078 -291 ct 2050 -291 2027 -281 2010 -261 ct 1992 -241 1983 -209 1983 -165 ct -1983 -121 1992 -89 2009 -69 ct 2026 -49 2048 -39 2075 -39 ct 2097 -39 2115 -46 2130 -59 ct -2145 -72 2154 -93 2158 -121 ct p ef -2485 -107 m 2543 -99 l 2534 -66 2517 -40 2492 -21 ct 2468 -2 2436 7 2398 7 ct -2350 7 2312 -8 2284 -37 ct 2255 -67 2241 -109 2241 -162 ct 2241 -218 2256 -261 2284 -291 ct -2313 -322 2350 -337 2395 -337 ct 2439 -337 2475 -322 2503 -292 ct 2531 -262 2545 -220 2545 -166 ct -2545 -163 2545 -158 2544 -151 ct 2299 -151 l 2301 -115 2311 -87 2330 -68 ct -2348 -49 2371 -39 2398 -39 ct 2419 -39 2436 -44 2451 -55 ct 2465 -66 2477 -83 2485 -107 ct -p -2302 -197 m 2486 -197 l 2483 -225 2476 -245 2465 -259 ct 2447 -280 2424 -291 2396 -291 ct -2370 -291 2348 -283 2331 -265 ct 2314 -248 2304 -226 2302 -197 ct p ef -2590 -99 m 2645 -107 l 2648 -85 2656 -68 2671 -57 ct 2685 -45 2705 -39 2730 -39 ct -2756 -39 2775 -44 2787 -55 ct 2799 -65 2806 -77 2806 -91 ct 2806 -104 2800 -114 2789 -121 ct -2782 -126 2763 -132 2732 -140 ct 2691 -150 2663 -159 2647 -167 ct 2631 -174 2619 -185 2611 -198 ct -2603 -211 2599 -226 2599 -242 ct 2599 -257 2602 -270 2609 -283 ct 2616 -295 2625 -306 2636 -314 ct -2645 -320 2657 -326 2672 -330 ct 2687 -335 2703 -337 2720 -337 ct 2746 -337 2769 -333 2788 -326 ct -2808 -318 2822 -308 2831 -296 ct 2841 -283 2847 -266 2851 -245 ct 2796 -237 l -2794 -254 2786 -267 2774 -277 ct 2763 -286 2746 -291 2724 -291 ct 2698 -291 2680 -287 2669 -278 ct -2658 -270 2653 -260 2653 -249 ct 2653 -241 2655 -235 2660 -229 ct 2664 -223 2671 -218 2681 -214 ct -2687 -212 2703 -207 2730 -200 ct 2770 -189 2797 -181 2813 -174 ct 2829 -167 2841 -158 2850 -145 ct -2859 -132 2863 -116 2863 -97 ct 2863 -79 2858 -61 2847 -45 ct 2836 -28 2820 -15 2800 -6 ct -2779 3 2756 7 2730 7 ct 2688 7 2655 -2 2632 -20 ct 2610 -37 2596 -64 2590 -99 ct -p ef -2907 -99 m 2962 -107 l 2965 -85 2973 -68 2988 -57 ct 3002 -45 3022 -39 3047 -39 ct -3073 -39 3092 -44 3104 -55 ct 3116 -65 3123 -77 3123 -91 ct 3123 -104 3117 -114 3106 -121 ct -3099 -126 3080 -132 3049 -140 ct 3008 -150 2980 -159 2964 -167 ct 2948 -174 2936 -185 2928 -198 ct -2920 -211 2916 -226 2916 -242 ct 2916 -257 2919 -270 2926 -283 ct 2933 -295 2942 -306 2953 -314 ct -2962 -320 2974 -326 2989 -330 ct 3004 -335 3020 -337 3037 -337 ct 3063 -337 3086 -333 3105 -326 ct -3125 -318 3139 -308 3148 -296 ct 3158 -283 3164 -266 3168 -245 ct 3113 -237 l -3111 -254 3103 -267 3091 -277 ct 3080 -286 3063 -291 3041 -291 ct 3015 -291 2997 -287 2986 -278 ct -2975 -270 2970 -260 2970 -249 ct 2970 -241 2972 -235 2977 -229 ct 2981 -223 2988 -218 2998 -214 ct -3004 -212 3020 -207 3047 -200 ct 3087 -189 3114 -181 3130 -174 ct 3146 -167 3158 -158 3167 -145 ct -3176 -132 3180 -116 3180 -97 ct 3180 -79 3175 -61 3164 -45 ct 3153 -28 3137 -15 3117 -6 ct -3096 3 3073 7 3047 7 ct 3005 7 2972 -2 2949 -20 ct 2927 -37 2913 -64 2907 -99 ct -p ef -3226 -165 m 3226 -226 3243 -271 3277 -301 ct 3305 -325 3340 -337 3381 -337 ct -3426 -337 3463 -322 3491 -293 ct 3520 -263 3535 -222 3535 -170 ct 3535 -127 3528 -94 3516 -70 ct -3503 -45 3484 -27 3460 -13 ct 3436 0 3409 7 3381 7 ct 3334 7 3297 -8 3269 -37 ct -3240 -67 3226 -110 3226 -165 ct p -3283 -165 m 3283 -123 3293 -91 3311 -70 ct 3329 -49 3353 -39 3381 -39 ct 3408 -39 3431 -49 3450 -71 ct -3468 -92 3477 -124 3477 -167 ct 3477 -208 3468 -239 3449 -260 ct 3431 -281 3408 -291 3381 -291 ct -3353 -291 3329 -281 3311 -260 ct 3293 -239 3283 -207 3283 -165 ct p ef -3597 0 m 3597 -330 l 3647 -330 l 3647 -280 l 3660 -303 3672 -318 3683 -326 ct -3694 -333 3706 -337 3719 -337 ct 3738 -337 3757 -331 3776 -319 ct 3757 -267 l -3743 -275 3730 -279 3716 -279 ct 3704 -279 3693 -276 3683 -268 ct 3673 -261 3666 -251 3662 -238 ct -3656 -218 3653 -196 3653 -173 ct 3653 0 l 3597 0 l p ef -pom -gr -gr -4400 13500 m 2900 13500 l 2900 12000 l 5900 12000 l 5900 13500 l 4400 13500 l -pc -gs -gs -pum -3122 12970 t -49 0 m 49 -455 l 220 -455 l 251 -455 274 -454 290 -451 ct 312 -447 331 -440 346 -429 ct -361 -419 373 -404 382 -385 ct 391 -367 396 -346 396 -323 ct 396 -285 384 -252 359 -225 ct -334 -198 290 -185 226 -185 ct 109 -185 l 109 0 l 49 0 l p -109 -239 m 227 -239 l 266 -239 293 -246 309 -260 ct 326 -275 334 -295 334 -322 ct -334 -341 329 -357 320 -370 ct 310 -384 297 -393 282 -397 ct 271 -400 253 -401 225 -401 ct -109 -401 l 109 -239 l p ef -464 0 m 464 -455 l 519 -455 l 519 0 l 464 0 l p ef -820 -41 m 799 -24 779 -11 760 -4 ct 741 3 720 7 699 7 ct 662 7 635 -2 615 -20 ct -596 -37 586 -60 586 -87 ct 586 -103 590 -118 597 -131 ct 604 -145 614 -156 626 -164 ct -638 -172 651 -178 666 -182 ct 677 -185 693 -188 716 -190 ct 761 -196 794 -202 815 -209 ct -815 -217 815 -222 815 -224 ct 815 -247 810 -263 800 -272 ct 785 -285 764 -291 736 -291 ct -710 -291 690 -286 678 -277 ct 665 -268 656 -252 650 -228 ct 596 -236 l 601 -259 609 -278 620 -292 ct -631 -307 648 -318 669 -326 ct 691 -333 716 -337 744 -337 ct 772 -337 795 -334 813 -327 ct -830 -321 843 -312 851 -302 ct 860 -292 865 -280 869 -264 ct 871 -255 872 -238 872 -213 ct -872 -138 l 872 -87 873 -54 875 -40 ct 877 -26 882 -13 889 0 ct 831 0 l 825 -12 821 -26 820 -41 ct -p -815 -166 m 795 -157 764 -150 724 -145 ct 701 -141 685 -138 675 -133 ct 666 -129 658 -123 653 -115 ct -648 -107 645 -99 645 -89 ct 645 -74 651 -62 662 -52 ct 674 -42 690 -37 712 -37 ct -733 -37 752 -41 769 -51 ct 786 -60 798 -73 806 -89 ct 812 -102 815 -121 815 -145 ct -815 -166 l p ef -953 127 m 947 75 l 959 78 970 80 979 80 ct 992 80 1001 78 1009 73 ct 1016 69 1022 64 1027 56 ct -1031 51 1036 37 1044 15 ct 1045 11 1047 7 1049 1 ct 924 -330 l 984 -330 l 1053 -139 l -1062 -114 1070 -89 1077 -62 ct 1083 -88 1091 -113 1100 -137 ct 1170 -330 l 1226 -330 l -1101 6 l 1087 42 1077 67 1069 81 ct 1059 99 1048 113 1035 121 ct 1022 130 1007 134 989 134 ct -979 134 967 132 953 127 ct p ef -1316 0 m 1265 0 l 1265 -455 l 1320 -455 l 1320 -293 l 1344 -322 1374 -337 1411 -337 ct -1431 -337 1450 -333 1468 -325 ct 1486 -317 1501 -305 1513 -290 ct 1524 -276 1534 -258 1540 -237 ct -1547 -216 1550 -194 1550 -170 ct 1550 -114 1536 -70 1508 -39 ct 1480 -8 1447 7 1408 7 ct -1369 7 1338 -9 1316 -42 ct 1316 0 l p -1316 -167 m 1316 -128 1321 -100 1332 -82 ct 1349 -53 1373 -39 1403 -39 ct 1428 -39 1449 -50 1466 -71 ct -1484 -92 1493 -123 1493 -165 ct 1493 -208 1485 -240 1467 -260 ct 1450 -281 1430 -291 1406 -291 ct -1381 -291 1360 -281 1342 -259 ct 1325 -238 1316 -208 1316 -167 ct p ef -1832 -41 m 1811 -24 1791 -11 1772 -4 ct 1753 3 1732 7 1711 7 ct 1674 7 1647 -2 1627 -20 ct -1608 -37 1598 -60 1598 -87 ct 1598 -103 1602 -118 1609 -131 ct 1616 -145 1626 -156 1638 -164 ct -1650 -172 1663 -178 1678 -182 ct 1689 -185 1705 -188 1728 -190 ct 1773 -196 1806 -202 1827 -209 ct -1827 -217 1827 -222 1827 -224 ct 1827 -247 1822 -263 1812 -272 ct 1797 -285 1776 -291 1748 -291 ct -1722 -291 1702 -286 1690 -277 ct 1677 -268 1668 -252 1662 -228 ct 1608 -236 l -1613 -259 1621 -278 1632 -292 ct 1643 -307 1660 -318 1681 -326 ct 1703 -333 1728 -337 1756 -337 ct -1784 -337 1807 -334 1825 -327 ct 1842 -321 1855 -312 1863 -302 ct 1872 -292 1877 -280 1881 -264 ct -1883 -255 1884 -238 1884 -213 ct 1884 -138 l 1884 -87 1885 -54 1887 -40 ct -1889 -26 1894 -13 1901 0 ct 1843 0 l 1837 -12 1833 -26 1832 -41 ct p -1827 -166 m 1807 -157 1776 -150 1736 -145 ct 1713 -141 1697 -138 1687 -133 ct -1678 -129 1670 -123 1665 -115 ct 1660 -107 1657 -99 1657 -89 ct 1657 -74 1663 -62 1674 -52 ct -1686 -42 1702 -37 1724 -37 ct 1745 -37 1764 -41 1781 -51 ct 1798 -60 1810 -73 1818 -89 ct -1824 -102 1827 -121 1827 -145 ct 1827 -166 l p ef -2183 -121 m 2238 -114 l 2232 -76 2216 -46 2192 -25 ct 2167 -4 2137 7 2101 7 ct -2056 7 2019 -8 1992 -37 ct 1965 -67 1951 -109 1951 -164 ct 1951 -199 1957 -230 1968 -257 ct -1980 -284 1998 -304 2022 -317 ct 2046 -330 2073 -337 2101 -337 ct 2137 -337 2166 -328 2189 -310 ct -2211 -292 2226 -266 2232 -233 ct 2178 -224 l 2173 -247 2164 -263 2151 -274 ct -2138 -286 2122 -291 2103 -291 ct 2075 -291 2052 -281 2035 -261 ct 2017 -241 2008 -209 2008 -165 ct -2008 -121 2017 -89 2034 -69 ct 2051 -49 2073 -39 2100 -39 ct 2122 -39 2140 -46 2155 -59 ct -2170 -72 2179 -93 2183 -121 ct p ef -2286 0 m 2286 -455 l 2342 -455 l 2342 -196 l 2474 -330 l 2546 -330 l -2420 -207 l 2559 0 l 2490 0 l 2381 -169 l 2342 -131 l 2342 0 l 2286 0 l -p ef -pom -gr -gr -22600 9500 m 21100 9500 l 21100 8000 l 24100 8000 l 24100 9500 l 22600 9500 l -pc -gs -gs -pum -21425 8974 t -50 0 m 50 -455 l 379 -455 l 379 -401 l 110 -401 l 110 -262 l 362 -262 l -362 -209 l 110 -209 l 110 -54 l 389 -54 l 389 0 l 50 0 l p ef -465 0 m 465 -330 l 515 -330 l 515 -283 l 539 -319 574 -337 620 -337 ct -640 -337 658 -333 675 -326 ct 691 -319 704 -310 712 -298 ct 720 -287 726 -273 729 -257 ct -731 -247 732 -229 732 -203 ct 732 0 l 677 0 l 677 -200 l 677 -223 674 -240 670 -252 ct -666 -263 658 -272 647 -279 ct 636 -285 623 -289 608 -289 ct 584 -289 564 -281 547 -266 ct -529 -251 521 -222 521 -180 ct 521 0 l 465 0 l p ef -1032 -121 m 1087 -114 l 1081 -76 1065 -46 1041 -25 ct 1016 -4 986 7 950 7 ct -905 7 868 -8 841 -37 ct 814 -67 800 -109 800 -164 ct 800 -199 806 -230 817 -257 ct -829 -284 847 -304 871 -317 ct 895 -330 922 -337 950 -337 ct 986 -337 1015 -328 1038 -310 ct -1060 -292 1075 -266 1081 -233 ct 1027 -224 l 1022 -247 1013 -263 1000 -274 ct -987 -286 971 -291 952 -291 ct 924 -291 901 -281 884 -261 ct 866 -241 857 -209 857 -165 ct -857 -121 866 -89 883 -69 ct 900 -49 922 -39 949 -39 ct 971 -39 989 -46 1004 -59 ct -1019 -72 1028 -93 1032 -121 ct p ef -1113 -165 m 1113 -226 1130 -271 1164 -301 ct 1192 -325 1227 -337 1268 -337 ct -1313 -337 1350 -322 1378 -293 ct 1407 -263 1422 -222 1422 -170 ct 1422 -127 1415 -94 1403 -70 ct -1390 -45 1371 -27 1347 -13 ct 1323 0 1296 7 1268 7 ct 1221 7 1184 -8 1156 -37 ct -1127 -67 1113 -110 1113 -165 ct p -1170 -165 m 1170 -123 1180 -91 1198 -70 ct 1216 -49 1240 -39 1268 -39 ct 1295 -39 1318 -49 1337 -71 ct -1355 -92 1364 -124 1364 -167 ct 1364 -208 1355 -239 1336 -260 ct 1318 -281 1295 -291 1268 -291 ct -1240 -291 1216 -281 1198 -260 ct 1180 -239 1170 -207 1170 -165 ct p ef -1699 0 m 1699 -42 l 1679 -9 1648 7 1607 7 ct 1581 7 1557 0 1535 -15 ct 1513 -29 1496 -49 1484 -75 ct -1472 -101 1466 -131 1466 -165 ct 1466 -198 1471 -228 1482 -254 ct 1493 -281 1510 -302 1531 -316 ct -1553 -330 1578 -337 1605 -337 ct 1625 -337 1642 -333 1658 -325 ct 1673 -316 1686 -305 1696 -292 ct -1696 -455 l 1751 -455 l 1751 0 l 1699 0 l p -1523 -165 m 1523 -123 1532 -91 1550 -70 ct 1568 -49 1588 -39 1613 -39 ct 1637 -39 1658 -49 1675 -69 ct -1692 -89 1700 -119 1700 -160 ct 1700 -205 1692 -238 1674 -259 ct 1657 -280 1636 -291 1610 -291 ct -1585 -291 1565 -281 1548 -261 ct 1531 -240 1523 -208 1523 -165 ct p ef -2062 -107 m 2120 -99 l 2111 -66 2094 -40 2069 -21 ct 2045 -2 2013 7 1975 7 ct -1927 7 1889 -8 1861 -37 ct 1832 -67 1818 -109 1818 -162 ct 1818 -218 1833 -261 1861 -291 ct -1890 -322 1927 -337 1972 -337 ct 2016 -337 2052 -322 2080 -292 ct 2108 -262 2122 -220 2122 -166 ct -2122 -163 2122 -158 2121 -151 ct 1876 -151 l 1878 -115 1888 -87 1907 -68 ct -1925 -49 1948 -39 1975 -39 ct 1996 -39 2013 -44 2028 -55 ct 2042 -66 2054 -83 2062 -107 ct -p -1879 -197 m 2063 -197 l 2060 -225 2053 -245 2042 -259 ct 2024 -280 2001 -291 1973 -291 ct -1947 -291 1925 -283 1908 -265 ct 1891 -248 1881 -226 1879 -197 ct p ef -2187 0 m 2187 -330 l 2237 -330 l 2237 -280 l 2250 -303 2262 -318 2273 -326 ct -2284 -333 2296 -337 2309 -337 ct 2328 -337 2347 -331 2366 -319 ct 2347 -267 l -2333 -275 2320 -279 2306 -279 ct 2294 -279 2283 -276 2273 -268 ct 2263 -261 2256 -251 2252 -238 ct -2246 -218 2243 -196 2243 -173 ct 2243 0 l 2187 0 l p ef -pom -gr -gr -17400 13500 m 15900 13500 l 15900 12000 l 18900 12000 l 18900 13500 l -17400 13500 l pc -gs -gs -pum -16195 12970 t -49 0 m 49 -455 l 206 -455 l 241 -455 268 -453 287 -448 ct 313 -442 335 -432 353 -416 ct -377 -396 395 -370 407 -338 ct 419 -307 425 -271 425 -230 ct 425 -195 421 -165 413 -138 ct -405 -111 394 -89 382 -72 ct 369 -54 355 -41 340 -31 ct 325 -21 307 -13 286 -8 ct -265 -3 241 0 213 0 ct 49 0 l p -109 -54 m 206 -54 l 236 -54 260 -56 277 -62 ct 294 -68 307 -76 318 -86 ct -332 -100 343 -119 351 -143 ct 359 -167 363 -197 363 -231 ct 363 -279 355 -315 339 -341 ct -324 -366 305 -383 282 -392 ct 266 -398 240 -401 205 -401 ct 109 -401 l 109 -54 l -p ef -724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct -494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct -678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct -538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct -704 -66 716 -83 724 -107 ct p -541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct -609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef -1066 -121 m 1121 -114 l 1115 -76 1099 -46 1075 -25 ct 1050 -4 1020 7 984 7 ct -939 7 902 -8 875 -37 ct 848 -67 834 -109 834 -164 ct 834 -199 840 -230 851 -257 ct -863 -284 881 -304 905 -317 ct 929 -330 956 -337 984 -337 ct 1020 -337 1049 -328 1072 -310 ct -1094 -292 1109 -266 1115 -233 ct 1061 -224 l 1056 -247 1047 -263 1034 -274 ct -1021 -286 1005 -291 986 -291 ct 958 -291 935 -281 918 -261 ct 900 -241 891 -209 891 -165 ct -891 -121 900 -89 917 -69 ct 934 -49 956 -39 983 -39 ct 1005 -39 1023 -46 1038 -59 ct -1053 -72 1062 -93 1066 -121 ct p ef -1147 -165 m 1147 -226 1164 -271 1198 -301 ct 1226 -325 1261 -337 1302 -337 ct -1347 -337 1384 -322 1412 -293 ct 1441 -263 1456 -222 1456 -170 ct 1456 -127 1449 -94 1437 -70 ct -1424 -45 1405 -27 1381 -13 ct 1357 0 1330 7 1302 7 ct 1255 7 1218 -8 1190 -37 ct -1161 -67 1147 -110 1147 -165 ct p -1204 -165 m 1204 -123 1214 -91 1232 -70 ct 1250 -49 1274 -39 1302 -39 ct 1329 -39 1352 -49 1371 -71 ct -1389 -92 1398 -124 1398 -167 ct 1398 -208 1389 -239 1370 -260 ct 1352 -281 1329 -291 1302 -291 ct -1274 -291 1250 -281 1232 -260 ct 1214 -239 1204 -207 1204 -165 ct p ef -1732 0 m 1732 -42 l 1712 -9 1681 7 1640 7 ct 1614 7 1590 0 1568 -15 ct 1546 -29 1529 -49 1517 -75 ct -1505 -101 1499 -131 1499 -165 ct 1499 -198 1504 -228 1515 -254 ct 1526 -281 1543 -302 1564 -316 ct -1586 -330 1611 -337 1638 -337 ct 1658 -337 1675 -333 1691 -325 ct 1706 -316 1719 -305 1729 -292 ct -1729 -455 l 1784 -455 l 1784 0 l 1732 0 l p -1556 -165 m 1556 -123 1565 -91 1583 -70 ct 1601 -49 1621 -39 1646 -39 ct 1670 -39 1691 -49 1708 -69 ct -1725 -89 1733 -119 1733 -160 ct 1733 -205 1725 -238 1707 -259 ct 1690 -280 1669 -291 1643 -291 ct -1618 -291 1598 -281 1581 -261 ct 1564 -240 1556 -208 1556 -165 ct p ef -2096 -107 m 2154 -99 l 2145 -66 2128 -40 2103 -21 ct 2079 -2 2047 7 2009 7 ct -1961 7 1923 -8 1895 -37 ct 1866 -67 1852 -109 1852 -162 ct 1852 -218 1867 -261 1895 -291 ct -1924 -322 1961 -337 2006 -337 ct 2050 -337 2086 -322 2114 -292 ct 2142 -262 2156 -220 2156 -166 ct -2156 -163 2156 -158 2155 -151 ct 1910 -151 l 1912 -115 1922 -87 1941 -68 ct -1959 -49 1982 -39 2009 -39 ct 2030 -39 2047 -44 2062 -55 ct 2076 -66 2088 -83 2096 -107 ct -p -1913 -197 m 2097 -197 l 2094 -225 2087 -245 2076 -259 ct 2058 -280 2035 -291 2007 -291 ct -1981 -291 1959 -283 1942 -265 ct 1925 -248 1915 -226 1913 -197 ct p ef -2221 0 m 2221 -330 l 2271 -330 l 2271 -280 l 2284 -303 2296 -318 2307 -326 ct -2318 -333 2330 -337 2343 -337 ct 2362 -337 2381 -331 2400 -319 ct 2381 -267 l -2367 -275 2354 -279 2340 -279 ct 2328 -279 2317 -276 2307 -268 ct 2297 -261 2290 -251 2286 -238 ct -2280 -218 2277 -196 2277 -173 ct 2277 0 l 2221 0 l p ef -pom -gr -gr -22600 13500 m 21100 13500 l 21100 12000 l 24100 12000 l 24100 13500 l -22600 13500 l pc -gs -gs -pum -21916 12626 t -18 -129 m 73 -136 l 74 -102 81 -78 92 -65 ct 104 -52 120 -46 140 -46 ct 155 -46 168 -49 179 -56 ct -190 -63 198 -72 202 -84 ct 206 -96 208 -115 208 -141 ct 208 -455 l 268 -455 l -268 -145 l 268 -107 264 -77 254 -56 ct 245 -35 231 -19 211 -8 ct 191 3 167 8 140 8 ct -101 8 70 -3 49 -26 ct 28 -49 17 -84 18 -129 ct p ef -360 -391 m 360 -455 l 416 -455 l 416 -391 l 360 -391 l p -360 0 m 360 -330 l 416 -330 l 416 0 l 360 0 l p ef -621 -50 m 629 -1 l 613 2 599 4 587 4 ct 566 4 551 1 539 -6 ct 528 -12 520 -20 516 -31 ct -511 -41 509 -63 509 -97 ct 509 -287 l 468 -287 l 468 -330 l 509 -330 l -509 -412 l 565 -445 l 565 -330 l 621 -330 l 621 -287 l 565 -287 l -565 -94 l 565 -78 566 -68 568 -63 ct 570 -58 573 -55 577 -52 ct 582 -49 588 -48 596 -48 ct -602 -48 611 -49 621 -50 ct p ef -799 -50 m 807 -1 l 791 2 777 4 765 4 ct 744 4 729 1 717 -6 ct 706 -12 698 -20 694 -31 ct -689 -41 687 -63 687 -97 ct 687 -287 l 646 -287 l 646 -330 l 687 -330 l -687 -412 l 743 -445 l 743 -330 l 799 -330 l 799 -287 l 743 -287 l -743 -94 l 743 -78 744 -68 746 -63 ct 748 -58 751 -55 755 -52 ct 760 -49 766 -48 774 -48 ct -780 -48 789 -49 799 -50 ct p ef -1080 -107 m 1138 -99 l 1129 -66 1112 -40 1087 -21 ct 1063 -2 1031 7 993 7 ct -945 7 907 -8 879 -37 ct 850 -67 836 -109 836 -162 ct 836 -218 851 -261 879 -291 ct -908 -322 945 -337 990 -337 ct 1034 -337 1070 -322 1098 -292 ct 1126 -262 1140 -220 1140 -166 ct -1140 -163 1140 -158 1139 -151 ct 894 -151 l 896 -115 906 -87 925 -68 ct 943 -49 966 -39 993 -39 ct -1014 -39 1031 -44 1046 -55 ct 1060 -66 1072 -83 1080 -107 ct p -897 -197 m 1081 -197 l 1078 -225 1071 -245 1060 -259 ct 1042 -280 1019 -291 991 -291 ct -965 -291 943 -283 926 -265 ct 909 -248 899 -226 897 -197 ct p ef -1205 0 m 1205 -330 l 1255 -330 l 1255 -280 l 1268 -303 1280 -318 1291 -326 ct -1302 -333 1314 -337 1327 -337 ct 1346 -337 1365 -331 1384 -319 ct 1365 -267 l -1351 -275 1338 -279 1324 -279 ct 1312 -279 1301 -276 1291 -268 ct 1281 -261 1274 -251 1270 -238 ct -1264 -218 1261 -196 1261 -173 ct 1261 0 l 1205 0 l p ef -pom -gr -gs -pum -21764 13337 t -47 0 m 47 -455 l 217 -455 l 252 -455 280 -450 301 -441 ct 322 -432 338 -418 350 -399 ct -362 -380 368 -359 368 -339 ct 368 -319 362 -301 352 -284 ct 341 -266 325 -253 304 -242 ct -332 -234 353 -220 368 -201 ct 382 -181 390 -158 390 -132 ct 390 -111 385 -91 376 -72 ct -367 -54 356 -40 343 -30 ct 330 -20 313 -13 293 -8 ct 273 -3 249 0 220 0 ct 47 0 l -p -107 -264 m 205 -264 l 232 -264 251 -265 262 -269 ct 278 -274 289 -281 297 -292 ct -305 -302 309 -315 309 -331 ct 309 -347 305 -360 298 -371 ct 290 -383 280 -391 267 -395 ct -253 -399 230 -401 198 -401 ct 107 -401 l 107 -264 l p -107 -54 m 220 -54 l 239 -54 253 -54 261 -56 ct 275 -58 286 -62 295 -68 ct -305 -74 312 -82 318 -94 ct 324 -105 327 -117 327 -132 ct 327 -149 323 -164 314 -176 ct -306 -189 294 -197 278 -202 ct 263 -207 241 -210 212 -210 ct 107 -210 l 107 -54 l -p ef -681 0 m 681 -49 l 655 -12 620 7 576 7 ct 557 7 539 3 522 -4 ct 505 -12 492 -21 484 -32 ct -476 -44 470 -57 467 -74 ct 465 -85 464 -102 464 -126 ct 464 -330 l 519 -330 l -519 -147 l 519 -118 521 -98 523 -88 ct 526 -74 534 -62 545 -54 ct 557 -45 571 -41 587 -41 ct -604 -41 620 -45 634 -54 ct 649 -63 660 -74 666 -89 ct 672 -104 675 -125 675 -153 ct -675 -330 l 731 -330 l 731 0 l 681 0 l p ef -830 0 m 830 -286 l 781 -286 l 781 -329 l 830 -329 l 830 -364 l 830 -387 832 -403 836 -414 ct -841 -428 851 -440 864 -449 ct 878 -458 897 -462 921 -462 ct 937 -462 954 -460 973 -457 ct -965 -408 l 953 -410 943 -411 932 -411 ct 915 -411 903 -407 896 -400 ct 889 -393 886 -379 886 -360 ct -886 -329 l 950 -329 l 950 -286 l 886 -286 l 886 0 l 830 0 l p ef -995 0 m 995 -286 l 946 -286 l 946 -329 l 995 -329 l 995 -364 l 995 -387 997 -403 1001 -414 ct -1006 -428 1016 -440 1029 -449 ct 1043 -458 1062 -462 1086 -462 ct 1102 -462 1119 -460 1138 -457 ct -1130 -408 l 1118 -410 1108 -411 1097 -411 ct 1080 -411 1068 -407 1061 -400 ct -1054 -393 1051 -379 1051 -360 ct 1051 -329 l 1115 -329 l 1115 -286 l 1051 -286 l -1051 0 l 995 0 l p ef -1385 -107 m 1443 -99 l 1434 -66 1417 -40 1392 -21 ct 1368 -2 1336 7 1298 7 ct -1250 7 1212 -8 1184 -37 ct 1155 -67 1141 -109 1141 -162 ct 1141 -218 1156 -261 1184 -291 ct -1213 -322 1250 -337 1295 -337 ct 1339 -337 1375 -322 1403 -292 ct 1431 -262 1445 -220 1445 -166 ct -1445 -163 1445 -158 1444 -151 ct 1199 -151 l 1201 -115 1211 -87 1230 -68 ct -1248 -49 1271 -39 1298 -39 ct 1319 -39 1336 -44 1351 -55 ct 1365 -66 1377 -83 1385 -107 ct -p -1202 -197 m 1386 -197 l 1383 -225 1376 -245 1365 -259 ct 1347 -280 1324 -291 1296 -291 ct -1270 -291 1248 -283 1231 -265 ct 1214 -248 1204 -226 1202 -197 ct p ef -1510 0 m 1510 -330 l 1560 -330 l 1560 -280 l 1573 -303 1585 -318 1596 -326 ct -1607 -333 1619 -337 1632 -337 ct 1651 -337 1670 -331 1689 -319 ct 1670 -267 l -1656 -275 1643 -279 1629 -279 ct 1617 -279 1606 -276 1596 -268 ct 1586 -261 1579 -251 1575 -238 ct -1569 -218 1566 -196 1566 -173 ct 1566 0 l 1510 0 l p ef -pom -gr -gr -7100 8750 m 6538 8938 l 6538 8563 l 7100 8750 l p ef -5900 8725 m 6650 8725 l 6650 8775 l 5900 8775 l 5900 8725 l p ef -15400 8750 m 14838 8938 l 14838 8563 l 15400 8750 l p ef -14300 8725 m 14950 8725 l 14950 8775 l 14300 8775 l 14300 8725 l p ef -21100 8750 m 20538 8938 l 20538 8563 l 21100 8750 l p ef -19800 8725 m 20650 8725 l 20650 8775 l 19800 8775 l 19800 8725 l p ef -10500 12750 m 11063 12563 l 11063 12938 l 10500 12750 l p ef -15900 12775 m 10950 12775 l 10950 12725 l 15900 12725 l 15900 12775 l -p ef -18900 12750 m 19463 12563 l 19463 12938 l 18900 12750 l p ef -21100 12775 m 19350 12775 l 19350 12725 l 21100 12725 l 21100 12775 l -p ef -12850 9500 m 13038 10063 l 12663 10063 l 12850 9500 l p ef -15900 12775 m 12850 12775 l 12850 12750 l 12850 12725 l 15900 12725 l -15900 12750 l 15900 12775 l p ef -12850 12750 m 12850 12775 l 12846 12775 l 12841 12773 l 12838 12772 l -12834 12769 l 12831 12766 l 12828 12763 l 12827 12759 l 12825 12754 l -12825 12750 l 12825 12750 l 12850 12750 l p ef -12825 12750 m 12825 9950 l 12850 9950 l 12875 9950 l 12875 12750 l -12850 12750 l 12825 12750 l p ef -1225 13350 m 1000 13350 l 1000 12150 l 1450 12150 l 1450 13350 l 1225 13350 l -pc -500 14050 m 500 11549 l 1001 12175 l 1001 13425 l 500 14050 l pc -1450 12750 m 2013 12563 l 2013 12938 l 1450 12750 l p ef -2900 12775 m 1900 12775 l 1900 12725 l 2900 12725 l 2900 12775 l p ef -24100 12750 m 24663 12563 l 24663 12938 l 24100 12750 l p ef -25100 12775 m 24550 12775 l 24550 12725 l 25100 12725 l 25100 12775 l -p ef -25100 8750 m 24538 8938 l 24538 8563 l 25100 8750 l p ef -24100 8725 m 24650 8725 l 24650 8775 l 24100 8775 l 24100 8725 l p ef -1000 9250 m 724 9250 500 9026 500 8750 ct 500 8474 724 8250 1000 8250 ct 1276 8250 1500 8474 1500 8750 ct -1500 9026 1276 9250 1000 9250 ct pc -500 8250 m 500 9250 l ps -2900 8750 m 2338 8938 l 2338 8563 l 2900 8750 l p ef -1500 8724 m 2200 8724 l 2200 8749 l 2200 8774 l 1500 8774 l 1500 8749 l -1500 8724 l p ef -2200 8749 m 2200 8724 l 2204 8724 l 2209 8726 l 2212 8727 l 2216 8730 l -2219 8733 l 2222 8736 l 2223 8740 l 2225 8745 l 2225 8749 l 2225 8749 l -2200 8749 l p ef -2225 8749 m 2225 8750 l 2200 8750 l 2175 8750 l 2175 8749 l 2200 8749 l -2225 8749 l p ef -2200 8750 m 2200 8775 l 2196 8775 l 2191 8773 l 2188 8772 l 2184 8769 l -2181 8766 l 2178 8763 l 2177 8759 l 2175 8754 l 2175 8750 l 2175 8750 l -2200 8750 l p ef -2200 8725 m 2450 8725 l 2450 8750 l 2450 8775 l 2200 8775 l 2200 8750 l -2200 8725 l p ef -4400 9500 m 4588 10063 l 4213 10063 l 4400 9500 l p ef -4400 12000 m 4213 11438 l 4588 11438 l 4400 12000 l p ef -4425 9950 m 4425 11550 l 4375 11550 l 4375 9950 l 4425 9950 l p ef -8698 9525 m 8647 9525 l 8647 9475 l 8698 9475 l 8698 9525 l p ef -8596 9525 m 8545 9525 l 8545 9475 l 8596 9475 l 8596 9525 l p ef -8494 9525 m 8443 9525 l 8443 9475 l 8494 9475 l 8494 9525 l p ef -8392 9525 m 8341 9525 l 8341 9475 l 8392 9475 l 8392 9525 l p ef -8290 9525 m 8239 9525 l 8239 9475 l 8290 9475 l 8290 9525 l p ef -8188 9525 m 8137 9525 l 8137 9475 l 8188 9475 l 8188 9525 l p ef -8086 9525 m 8035 9525 l 8035 9475 l 8086 9475 l 8086 9525 l p ef -7984 9525 m 7933 9525 l 7933 9475 l 7984 9475 l 7984 9525 l p ef -7882 9525 m 7831 9525 l 7831 9475 l 7882 9475 l 7882 9525 l p ef -7780 9525 m 7729 9525 l 7729 9475 l 7780 9475 l 7780 9525 l p ef -7678 9525 m 7627 9525 l 7627 9475 l 7678 9475 l 7678 9525 l p ef -7576 9525 m 7525 9525 l 7525 9475 l 7576 9475 l 7576 9525 l p ef -7474 9525 m 7423 9525 l 7423 9475 l 7474 9475 l 7474 9525 l p ef -7372 9525 m 7321 9525 l 7321 9475 l 7372 9475 l 7372 9525 l p ef -7270 9525 m 7219 9525 l 7219 9475 l 7270 9475 l 7270 9525 l p ef -7168 9525 m 7117 9525 l 7117 9475 l 7168 9475 l 7168 9525 l p ef -7075 9466 m 7075 9415 l 7125 9415 l 7125 9466 l 7075 9466 l p ef -7075 9364 m 7075 9313 l 7125 9313 l 7125 9364 l 7075 9364 l p ef -7075 9262 m 7075 9211 l 7125 9211 l 7125 9262 l 7075 9262 l p ef -7075 9160 m 7075 9109 l 7125 9109 l 7125 9160 l 7075 9160 l p ef -7075 9058 m 7075 9007 l 7125 9007 l 7125 9058 l 7075 9058 l p ef -7075 8956 m 7075 8905 l 7125 8905 l 7125 8956 l 7075 8956 l p ef -7075 8854 m 7075 8803 l 7125 8803 l 7125 8854 l 7075 8854 l p ef -7075 8752 m 7075 8701 l 7125 8701 l 7125 8752 l 7075 8752 l p ef -7075 8650 m 7075 8599 l 7125 8599 l 7125 8650 l 7075 8650 l p ef -7075 8548 m 7075 8497 l 7125 8497 l 7125 8548 l 7075 8548 l p ef -7075 8446 m 7075 8395 l 7125 8395 l 7125 8446 l 7075 8446 l p ef -7075 8344 m 7075 8293 l 7125 8293 l 7125 8344 l 7075 8344 l p ef -7075 8242 m 7075 8191 l 7125 8191 l 7125 8242 l 7075 8242 l p ef -7075 8140 m 7075 8089 l 7125 8089 l 7125 8140 l 7075 8140 l p ef -7075 8038 m 7075 8000 l 7100 8000 l 7125 8000 l 7125 8038 l 7100 8038 l -7075 8038 l p ef -7100 8000 m 7075 8000 l 7075 7996 l 7077 7991 l 7078 7988 l 7081 7984 l -7084 7981 l 7087 7978 l 7091 7977 l 7096 7975 l 7100 7975 l 7100 7975 l -7100 8000 l p ef -7100 7975 m 7113 7975 l 7113 8000 l 7113 8025 l 7100 8025 l 7100 8000 l -7100 7975 l p ef -7164 7975 m 7215 7975 l 7215 8025 l 7164 8025 l 7164 7975 l p ef -7266 7975 m 7317 7975 l 7317 8025 l 7266 8025 l 7266 7975 l p ef -7368 7975 m 7419 7975 l 7419 8025 l 7368 8025 l 7368 7975 l p ef -7470 7975 m 7521 7975 l 7521 8025 l 7470 8025 l 7470 7975 l p ef -7572 7975 m 7623 7975 l 7623 8025 l 7572 8025 l 7572 7975 l p ef -7674 7975 m 7725 7975 l 7725 8025 l 7674 8025 l 7674 7975 l p ef -7776 7975 m 7827 7975 l 7827 8025 l 7776 8025 l 7776 7975 l p ef -7878 7975 m 7929 7975 l 7929 8025 l 7878 8025 l 7878 7975 l p ef -7980 7975 m 8031 7975 l 8031 8025 l 7980 8025 l 7980 7975 l p ef -8082 7975 m 8133 7975 l 8133 8025 l 8082 8025 l 8082 7975 l p ef -8184 7975 m 8235 7975 l 8235 8025 l 8184 8025 l 8184 7975 l p ef -8286 7975 m 8337 7975 l 8337 8025 l 8286 8025 l 8286 7975 l p ef -8388 7975 m 8439 7975 l 8439 8025 l 8388 8025 l 8388 7975 l p ef -8490 7975 m 8541 7975 l 8541 8025 l 8490 8025 l 8490 7975 l p ef -8592 7975 m 8643 7975 l 8643 8025 l 8592 8025 l 8592 7975 l p ef -8694 7975 m 8745 7975 l 8745 8025 l 8694 8025 l 8694 7975 l p ef -8796 7975 m 8847 7975 l 8847 8025 l 8796 8025 l 8796 7975 l p ef -8898 7975 m 8949 7975 l 8949 8025 l 8898 8025 l 8898 7975 l p ef -9000 7975 m 9051 7975 l 9051 8025 l 9000 8025 l 9000 7975 l p ef -9102 7975 m 9153 7975 l 9153 8025 l 9102 8025 l 9102 7975 l p ef -9204 7975 m 9255 7975 l 9255 8025 l 9204 8025 l 9204 7975 l p ef -9306 7975 m 9357 7975 l 9357 8025 l 9306 8025 l 9306 7975 l p ef -9408 7975 m 9459 7975 l 9459 8025 l 9408 8025 l 9408 7975 l p ef -9510 7975 m 9561 7975 l 9561 8025 l 9510 8025 l 9510 7975 l p ef -9612 7975 m 9663 7975 l 9663 8025 l 9612 8025 l 9612 7975 l p ef -9714 7975 m 9765 7975 l 9765 8025 l 9714 8025 l 9714 7975 l p ef -9816 7975 m 9867 7975 l 9867 8025 l 9816 8025 l 9816 7975 l p ef -9918 7975 m 9969 7975 l 9969 8025 l 9918 8025 l 9918 7975 l p ef -10020 7975 m 10071 7975 l 10071 8025 l 10020 8025 l 10020 7975 l p ef -10122 7975 m 10173 7975 l 10173 8025 l 10122 8025 l 10122 7975 l p ef -10224 7975 m 10275 7975 l 10275 8025 l 10224 8025 l 10224 7975 l p ef -10326 7975 m 10377 7975 l 10377 8025 l 10326 8025 l 10326 7975 l p ef -10428 7975 m 10479 7975 l 10479 8025 l 10428 8025 l 10428 7975 l p ef -10525 8030 m 10525 8081 l 10475 8081 l 10475 8030 l 10525 8030 l p ef -10525 8132 m 10525 8183 l 10475 8183 l 10475 8132 l 10525 8132 l p ef -10525 8234 m 10525 8285 l 10475 8285 l 10475 8234 l 10525 8234 l p ef -10525 8336 m 10525 8387 l 10475 8387 l 10475 8336 l 10525 8336 l p ef -10525 8438 m 10525 8489 l 10475 8489 l 10475 8438 l 10525 8438 l p ef -10525 8540 m 10525 8591 l 10475 8591 l 10475 8540 l 10525 8540 l p ef -10525 8642 m 10525 8693 l 10475 8693 l 10475 8642 l 10525 8642 l p ef -10525 8744 m 10525 8795 l 10475 8795 l 10475 8744 l 10525 8744 l p ef -10525 8846 m 10525 8897 l 10475 8897 l 10475 8846 l 10525 8846 l p ef -10525 8948 m 10525 8999 l 10475 8999 l 10475 8948 l 10525 8948 l p ef -10525 9050 m 10525 9101 l 10475 9101 l 10475 9050 l 10525 9050 l p ef -10525 9152 m 10525 9203 l 10475 9203 l 10475 9152 l 10525 9152 l p ef -10525 9254 m 10525 9305 l 10475 9305 l 10475 9254 l 10525 9254 l p ef -10525 9356 m 10525 9407 l 10475 9407 l 10475 9356 l 10525 9356 l p ef -10525 9458 m 10525 9500 l 10500 9500 l 10475 9500 l 10475 9458 l 10500 9458 l -10525 9458 l p ef -10500 9500 m 10525 9500 l 10525 9504 l 10523 9509 l 10522 9512 l 10519 9516 l -10516 9519 l 10513 9522 l 10509 9523 l 10504 9525 l 10500 9525 l 10500 9525 l -10500 9500 l p ef -10500 9525 m 10491 9525 l 10491 9500 l 10491 9475 l 10500 9475 l 10500 9500 l -10500 9525 l p ef -10440 9525 m 10389 9525 l 10389 9475 l 10440 9475 l 10440 9525 l p ef -10338 9525 m 10287 9525 l 10287 9475 l 10338 9475 l 10338 9525 l p ef -10236 9525 m 10185 9525 l 10185 9475 l 10236 9475 l 10236 9525 l p ef -10134 9525 m 10083 9525 l 10083 9475 l 10134 9475 l 10134 9525 l p ef -10032 9525 m 9981 9525 l 9981 9475 l 10032 9475 l 10032 9525 l p ef -9930 9525 m 9879 9525 l 9879 9475 l 9930 9475 l 9930 9525 l p ef -9828 9525 m 9777 9525 l 9777 9475 l 9828 9475 l 9828 9525 l p ef -9726 9525 m 9675 9525 l 9675 9475 l 9726 9475 l 9726 9525 l p ef -9624 9525 m 9573 9525 l 9573 9475 l 9624 9475 l 9624 9525 l p ef -9522 9525 m 9471 9525 l 9471 9475 l 9522 9475 l 9522 9525 l p ef -9420 9525 m 9369 9525 l 9369 9475 l 9420 9475 l 9420 9525 l p ef -9318 9525 m 9267 9525 l 9267 9475 l 9318 9475 l 9318 9525 l p ef -9216 9525 m 9165 9525 l 9165 9475 l 9216 9475 l 9216 9525 l p ef -9114 9525 m 9063 9525 l 9063 9475 l 9114 9475 l 9114 9525 l p ef -9012 9525 m 8961 9525 l 8961 9475 l 9012 9475 l 9012 9525 l p ef -8910 9525 m 8859 9525 l 8859 9475 l 8910 9475 l 8910 9525 l p ef -8808 9525 m 8800 9525 l 8800 9500 l 8800 9475 l 8808 9475 l 8808 9500 l -8808 9525 l p ef -8800 9525 m 8749 9525 l 8749 9500 l 8749 9475 l 8800 9475 l 8800 9500 l -8800 9525 l p ef -gs -gs -pum -7276 8974 t -50 0 m 50 -455 l 251 -455 l 292 -455 323 -451 344 -443 ct 365 -435 382 -420 394 -399 ct -407 -379 413 -356 413 -331 ct 413 -299 403 -271 382 -249 ct 361 -227 329 -213 285 -207 ct -301 -199 313 -192 322 -184 ct 339 -168 356 -148 371 -124 ct 451 0 l 375 0 l -315 -95 l 297 -122 283 -143 271 -157 ct 260 -172 250 -182 241 -188 ct 232 -194 223 -198 213 -200 ct -207 -201 195 -202 180 -202 ct 110 -202 l 110 0 l 50 0 l p -110 -254 m 239 -254 l 267 -254 288 -257 304 -263 ct 319 -268 331 -277 339 -290 ct -347 -303 351 -316 351 -331 ct 351 -352 344 -370 328 -384 ct 312 -398 288 -405 254 -405 ct -110 -405 l 110 -254 l p ef -724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct -494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct -678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct -538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct -704 -66 716 -83 724 -107 ct p -541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct -609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef -829 -99 m 884 -107 l 887 -85 895 -68 910 -57 ct 924 -45 944 -39 969 -39 ct -995 -39 1014 -44 1026 -55 ct 1038 -65 1045 -77 1045 -91 ct 1045 -104 1039 -114 1028 -121 ct -1021 -126 1002 -132 971 -140 ct 930 -150 902 -159 886 -167 ct 870 -174 858 -185 850 -198 ct -842 -211 838 -226 838 -242 ct 838 -257 841 -270 848 -283 ct 855 -295 864 -306 875 -314 ct -884 -320 896 -326 911 -330 ct 926 -335 942 -337 959 -337 ct 985 -337 1008 -333 1027 -326 ct -1047 -318 1061 -308 1070 -296 ct 1080 -283 1086 -266 1090 -245 ct 1035 -237 l -1033 -254 1025 -267 1013 -277 ct 1002 -286 985 -291 963 -291 ct 937 -291 919 -287 908 -278 ct -897 -270 892 -260 892 -249 ct 892 -241 894 -235 899 -229 ct 903 -223 910 -218 920 -214 ct -926 -212 942 -207 969 -200 ct 1009 -189 1036 -181 1052 -174 ct 1068 -167 1080 -158 1089 -145 ct -1098 -132 1102 -116 1102 -97 ct 1102 -79 1097 -61 1086 -45 ct 1075 -28 1059 -15 1039 -6 ct -1018 3 995 7 969 7 ct 927 7 894 -2 871 -20 ct 849 -37 835 -64 829 -99 ct p ef -1383 -41 m 1362 -24 1342 -11 1323 -4 ct 1304 3 1283 7 1262 7 ct 1225 7 1198 -2 1178 -20 ct -1159 -37 1149 -60 1149 -87 ct 1149 -103 1153 -118 1160 -131 ct 1167 -145 1177 -156 1189 -164 ct -1201 -172 1214 -178 1229 -182 ct 1240 -185 1256 -188 1279 -190 ct 1324 -196 1357 -202 1378 -209 ct -1378 -217 1378 -222 1378 -224 ct 1378 -247 1373 -263 1363 -272 ct 1348 -285 1327 -291 1299 -291 ct -1273 -291 1253 -286 1241 -277 ct 1228 -268 1219 -252 1213 -228 ct 1159 -236 l -1164 -259 1172 -278 1183 -292 ct 1194 -307 1211 -318 1232 -326 ct 1254 -333 1279 -337 1307 -337 ct -1335 -337 1358 -334 1376 -327 ct 1393 -321 1406 -312 1414 -302 ct 1423 -292 1428 -280 1432 -264 ct -1434 -255 1435 -238 1435 -213 ct 1435 -138 l 1435 -87 1436 -54 1438 -40 ct -1440 -26 1445 -13 1452 0 ct 1394 0 l 1388 -12 1384 -26 1383 -41 ct p -1378 -166 m 1358 -157 1327 -150 1287 -145 ct 1264 -141 1248 -138 1238 -133 ct -1229 -129 1221 -123 1216 -115 ct 1211 -107 1208 -99 1208 -89 ct 1208 -74 1214 -62 1225 -52 ct -1237 -42 1253 -37 1275 -37 ct 1296 -37 1315 -41 1332 -51 ct 1349 -60 1361 -73 1369 -89 ct -1375 -102 1378 -121 1378 -145 ct 1378 -166 l p ef -1519 0 m 1519 -330 l 1569 -330 l 1569 -283 l 1579 -299 1593 -312 1610 -322 ct -1627 -332 1647 -337 1669 -337 ct 1693 -337 1713 -332 1729 -322 ct 1744 -312 1755 -297 1762 -279 ct -1788 -318 1822 -337 1863 -337 ct 1896 -337 1921 -328 1939 -310 ct 1956 -292 1965 -264 1965 -226 ct -1965 0 l 1910 0 l 1910 -208 l 1910 -230 1908 -246 1904 -256 ct 1901 -266 1894 -274 1884 -280 ct -1875 -286 1864 -289 1851 -289 ct 1828 -289 1809 -281 1793 -265 ct 1778 -250 1770 -225 1770 -191 ct -1770 0 l 1715 0 l 1715 -214 l 1715 -239 1710 -258 1701 -270 ct 1692 -282 1677 -289 1656 -289 ct -1641 -289 1626 -284 1613 -276 ct 1599 -268 1590 -256 1584 -240 ct 1578 -224 1575 -201 1575 -171 ct -1575 0 l 1519 0 l p ef -2049 126 m 2049 -330 l 2100 -330 l 2100 -287 l 2112 -304 2125 -316 2140 -324 ct -2155 -333 2174 -337 2195 -337 ct 2223 -337 2248 -330 2270 -315 ct 2291 -301 2307 -280 2318 -254 ct -2329 -228 2335 -199 2335 -167 ct 2335 -134 2329 -103 2317 -77 ct 2305 -50 2287 -29 2264 -15 ct -2241 0 2217 7 2191 7 ct 2173 7 2156 3 2141 -5 ct 2126 -13 2114 -23 2105 -35 ct -2105 126 l 2049 126 l p -2099 -163 m 2099 -121 2108 -90 2125 -69 ct 2142 -49 2163 -39 2187 -39 ct 2212 -39 2234 -49 2251 -70 ct -2269 -91 2278 -124 2278 -168 ct 2278 -210 2269 -241 2252 -262 ct 2235 -283 2214 -293 2190 -293 ct -2166 -293 2145 -282 2127 -260 ct 2109 -238 2099 -205 2099 -163 ct p ef -2399 0 m 2399 -455 l 2454 -455 l 2454 0 l 2399 0 l p ef -2765 -107 m 2823 -99 l 2814 -66 2797 -40 2772 -21 ct 2748 -2 2716 7 2678 7 ct -2630 7 2592 -8 2564 -37 ct 2535 -67 2521 -109 2521 -162 ct 2521 -218 2536 -261 2564 -291 ct -2593 -322 2630 -337 2675 -337 ct 2719 -337 2755 -322 2783 -292 ct 2811 -262 2825 -220 2825 -166 ct -2825 -163 2825 -158 2824 -151 ct 2579 -151 l 2581 -115 2591 -87 2610 -68 ct -2628 -49 2651 -39 2678 -39 ct 2699 -39 2716 -44 2731 -55 ct 2745 -66 2757 -83 2765 -107 ct -p -2582 -197 m 2766 -197 l 2763 -225 2756 -245 2745 -259 ct 2727 -280 2704 -291 2676 -291 ct -2650 -291 2628 -283 2611 -265 ct 2594 -248 2584 -226 2582 -197 ct p ef -2890 0 m 2890 -330 l 2940 -330 l 2940 -280 l 2953 -303 2965 -318 2976 -326 ct -2987 -333 2999 -337 3012 -337 ct 3031 -337 3050 -331 3069 -319 ct 3050 -267 l -3036 -275 3023 -279 3009 -279 ct 2997 -279 2986 -276 2976 -268 ct 2966 -261 2959 -251 2955 -238 ct -2949 -218 2946 -196 2946 -173 ct 2946 0 l 2890 0 l p ef -pom -gr -gr -11400 8750 m 10838 8938 l 10838 8563 l 11400 8750 l p ef -10500 8725 m 10950 8725 l 10950 8775 l 10500 8775 l 10500 8725 l p ef -8698 13525 m 8647 13525 l 8647 13475 l 8698 13475 l 8698 13525 l p ef -8596 13525 m 8545 13525 l 8545 13475 l 8596 13475 l 8596 13525 l p ef -8494 13525 m 8443 13525 l 8443 13475 l 8494 13475 l 8494 13525 l p ef -8392 13525 m 8341 13525 l 8341 13475 l 8392 13475 l 8392 13525 l p ef -8290 13525 m 8239 13525 l 8239 13475 l 8290 13475 l 8290 13525 l p ef -8188 13525 m 8137 13525 l 8137 13475 l 8188 13475 l 8188 13525 l p ef -8086 13525 m 8035 13525 l 8035 13475 l 8086 13475 l 8086 13525 l p ef -7984 13525 m 7933 13525 l 7933 13475 l 7984 13475 l 7984 13525 l p ef -7882 13525 m 7831 13525 l 7831 13475 l 7882 13475 l 7882 13525 l p ef -7780 13525 m 7729 13525 l 7729 13475 l 7780 13475 l 7780 13525 l p ef -7678 13525 m 7627 13525 l 7627 13475 l 7678 13475 l 7678 13525 l p ef -7576 13525 m 7525 13525 l 7525 13475 l 7576 13475 l 7576 13525 l p ef -7474 13525 m 7423 13525 l 7423 13475 l 7474 13475 l 7474 13525 l p ef -7372 13525 m 7321 13525 l 7321 13475 l 7372 13475 l 7372 13525 l p ef -7270 13525 m 7219 13525 l 7219 13475 l 7270 13475 l 7270 13525 l p ef -7168 13525 m 7117 13525 l 7117 13475 l 7168 13475 l 7168 13525 l p ef -7075 13466 m 7075 13415 l 7125 13415 l 7125 13466 l 7075 13466 l p ef -7075 13364 m 7075 13313 l 7125 13313 l 7125 13364 l 7075 13364 l p ef -7075 13262 m 7075 13211 l 7125 13211 l 7125 13262 l 7075 13262 l p ef -7075 13160 m 7075 13109 l 7125 13109 l 7125 13160 l 7075 13160 l p ef -7075 13058 m 7075 13007 l 7125 13007 l 7125 13058 l 7075 13058 l p ef -7075 12956 m 7075 12905 l 7125 12905 l 7125 12956 l 7075 12956 l p ef -7075 12854 m 7075 12803 l 7125 12803 l 7125 12854 l 7075 12854 l p ef -7075 12752 m 7075 12701 l 7125 12701 l 7125 12752 l 7075 12752 l p ef -7075 12650 m 7075 12599 l 7125 12599 l 7125 12650 l 7075 12650 l p ef -7075 12548 m 7075 12497 l 7125 12497 l 7125 12548 l 7075 12548 l p ef -7075 12446 m 7075 12395 l 7125 12395 l 7125 12446 l 7075 12446 l p ef -7075 12344 m 7075 12293 l 7125 12293 l 7125 12344 l 7075 12344 l p ef -7075 12242 m 7075 12191 l 7125 12191 l 7125 12242 l 7075 12242 l p ef -7075 12140 m 7075 12089 l 7125 12089 l 7125 12140 l 7075 12140 l p ef -7075 12038 m 7075 12000 l 7100 12000 l 7125 12000 l 7125 12038 l 7100 12038 l -7075 12038 l p ef -7100 12000 m 7075 12000 l 7075 11996 l 7077 11991 l 7078 11988 l 7081 11984 l -7084 11981 l 7087 11978 l 7091 11977 l 7096 11975 l 7100 11975 l 7100 11975 l -7100 12000 l p ef -7100 11975 m 7113 11975 l 7113 12000 l 7113 12025 l 7100 12025 l 7100 12000 l -7100 11975 l p ef -7164 11975 m 7215 11975 l 7215 12025 l 7164 12025 l 7164 11975 l p ef -7266 11975 m 7317 11975 l 7317 12025 l 7266 12025 l 7266 11975 l p ef -7368 11975 m 7419 11975 l 7419 12025 l 7368 12025 l 7368 11975 l p ef -7470 11975 m 7521 11975 l 7521 12025 l 7470 12025 l 7470 11975 l p ef -7572 11975 m 7623 11975 l 7623 12025 l 7572 12025 l 7572 11975 l p ef -7674 11975 m 7725 11975 l 7725 12025 l 7674 12025 l 7674 11975 l p ef -7776 11975 m 7827 11975 l 7827 12025 l 7776 12025 l 7776 11975 l p ef -7878 11975 m 7929 11975 l 7929 12025 l 7878 12025 l 7878 11975 l p ef -7980 11975 m 8031 11975 l 8031 12025 l 7980 12025 l 7980 11975 l p ef -8082 11975 m 8133 11975 l 8133 12025 l 8082 12025 l 8082 11975 l p ef -8184 11975 m 8235 11975 l 8235 12025 l 8184 12025 l 8184 11975 l p ef -8286 11975 m 8337 11975 l 8337 12025 l 8286 12025 l 8286 11975 l p ef -8388 11975 m 8439 11975 l 8439 12025 l 8388 12025 l 8388 11975 l p ef -8490 11975 m 8541 11975 l 8541 12025 l 8490 12025 l 8490 11975 l p ef -8592 11975 m 8643 11975 l 8643 12025 l 8592 12025 l 8592 11975 l p ef -8694 11975 m 8745 11975 l 8745 12025 l 8694 12025 l 8694 11975 l p ef -8796 11975 m 8847 11975 l 8847 12025 l 8796 12025 l 8796 11975 l p ef -8898 11975 m 8949 11975 l 8949 12025 l 8898 12025 l 8898 11975 l p ef -9000 11975 m 9051 11975 l 9051 12025 l 9000 12025 l 9000 11975 l p ef -9102 11975 m 9153 11975 l 9153 12025 l 9102 12025 l 9102 11975 l p ef -9204 11975 m 9255 11975 l 9255 12025 l 9204 12025 l 9204 11975 l p ef -9306 11975 m 9357 11975 l 9357 12025 l 9306 12025 l 9306 11975 l p ef -9408 11975 m 9459 11975 l 9459 12025 l 9408 12025 l 9408 11975 l p ef -9510 11975 m 9561 11975 l 9561 12025 l 9510 12025 l 9510 11975 l p ef -9612 11975 m 9663 11975 l 9663 12025 l 9612 12025 l 9612 11975 l p ef -9714 11975 m 9765 11975 l 9765 12025 l 9714 12025 l 9714 11975 l p ef -9816 11975 m 9867 11975 l 9867 12025 l 9816 12025 l 9816 11975 l p ef -9918 11975 m 9969 11975 l 9969 12025 l 9918 12025 l 9918 11975 l p ef -10020 11975 m 10071 11975 l 10071 12025 l 10020 12025 l 10020 11975 l -p ef -10122 11975 m 10173 11975 l 10173 12025 l 10122 12025 l 10122 11975 l -p ef -10224 11975 m 10275 11975 l 10275 12025 l 10224 12025 l 10224 11975 l -p ef -10326 11975 m 10377 11975 l 10377 12025 l 10326 12025 l 10326 11975 l -p ef -10428 11975 m 10479 11975 l 10479 12025 l 10428 12025 l 10428 11975 l -p ef -10525 12030 m 10525 12081 l 10475 12081 l 10475 12030 l 10525 12030 l -p ef -10525 12132 m 10525 12183 l 10475 12183 l 10475 12132 l 10525 12132 l -p ef -10525 12234 m 10525 12285 l 10475 12285 l 10475 12234 l 10525 12234 l -p ef -10525 12336 m 10525 12387 l 10475 12387 l 10475 12336 l 10525 12336 l -p ef -10525 12438 m 10525 12489 l 10475 12489 l 10475 12438 l 10525 12438 l -p ef -10525 12540 m 10525 12591 l 10475 12591 l 10475 12540 l 10525 12540 l -p ef -10525 12642 m 10525 12693 l 10475 12693 l 10475 12642 l 10525 12642 l -p ef -10525 12744 m 10525 12795 l 10475 12795 l 10475 12744 l 10525 12744 l -p ef -10525 12846 m 10525 12897 l 10475 12897 l 10475 12846 l 10525 12846 l -p ef -10525 12948 m 10525 12999 l 10475 12999 l 10475 12948 l 10525 12948 l -p ef -10525 13050 m 10525 13101 l 10475 13101 l 10475 13050 l 10525 13050 l -p ef -10525 13152 m 10525 13203 l 10475 13203 l 10475 13152 l 10525 13152 l -p ef -10525 13254 m 10525 13305 l 10475 13305 l 10475 13254 l 10525 13254 l -p ef -10525 13356 m 10525 13407 l 10475 13407 l 10475 13356 l 10525 13356 l -p ef -10525 13458 m 10525 13500 l 10500 13500 l 10475 13500 l 10475 13458 l -10500 13458 l 10525 13458 l p ef -10500 13500 m 10525 13500 l 10525 13504 l 10523 13509 l 10522 13512 l -10519 13516 l 10516 13519 l 10513 13522 l 10509 13523 l 10504 13525 l -10500 13525 l 10500 13525 l 10500 13500 l p ef -10500 13525 m 10491 13525 l 10491 13500 l 10491 13475 l 10500 13475 l -10500 13500 l 10500 13525 l p ef -10440 13525 m 10389 13525 l 10389 13475 l 10440 13475 l 10440 13525 l -p ef -10338 13525 m 10287 13525 l 10287 13475 l 10338 13475 l 10338 13525 l -p ef -10236 13525 m 10185 13525 l 10185 13475 l 10236 13475 l 10236 13525 l -p ef -10134 13525 m 10083 13525 l 10083 13475 l 10134 13475 l 10134 13525 l -p ef -10032 13525 m 9981 13525 l 9981 13475 l 10032 13475 l 10032 13525 l -p ef -9930 13525 m 9879 13525 l 9879 13475 l 9930 13475 l 9930 13525 l p ef -9828 13525 m 9777 13525 l 9777 13475 l 9828 13475 l 9828 13525 l p ef -9726 13525 m 9675 13525 l 9675 13475 l 9726 13475 l 9726 13525 l p ef -9624 13525 m 9573 13525 l 9573 13475 l 9624 13475 l 9624 13525 l p ef -9522 13525 m 9471 13525 l 9471 13475 l 9522 13475 l 9522 13525 l p ef -9420 13525 m 9369 13525 l 9369 13475 l 9420 13475 l 9420 13525 l p ef -9318 13525 m 9267 13525 l 9267 13475 l 9318 13475 l 9318 13525 l p ef -9216 13525 m 9165 13525 l 9165 13475 l 9216 13475 l 9216 13525 l p ef -9114 13525 m 9063 13525 l 9063 13475 l 9114 13475 l 9114 13525 l p ef -9012 13525 m 8961 13525 l 8961 13475 l 9012 13475 l 9012 13525 l p ef -8910 13525 m 8859 13525 l 8859 13475 l 8910 13475 l 8910 13525 l p ef -8808 13525 m 8800 13525 l 8800 13500 l 8800 13475 l 8808 13475 l 8808 13500 l -8808 13525 l p ef -8800 13525 m 8749 13525 l 8749 13500 l 8749 13475 l 8800 13475 l 8800 13500 l -8800 13525 l p ef -gs -gs -pum -7276 12970 t -50 0 m 50 -455 l 251 -455 l 292 -455 323 -451 344 -443 ct 365 -435 382 -420 394 -399 ct -407 -379 413 -356 413 -331 ct 413 -299 403 -271 382 -249 ct 361 -227 329 -213 285 -207 ct -301 -199 313 -192 322 -184 ct 339 -168 356 -148 371 -124 ct 451 0 l 375 0 l -315 -95 l 297 -122 283 -143 271 -157 ct 260 -172 250 -182 241 -188 ct 232 -194 223 -198 213 -200 ct -207 -201 195 -202 180 -202 ct 110 -202 l 110 0 l 50 0 l p -110 -254 m 239 -254 l 267 -254 288 -257 304 -263 ct 319 -268 331 -277 339 -290 ct -347 -303 351 -316 351 -331 ct 351 -352 344 -370 328 -384 ct 312 -398 288 -405 254 -405 ct -110 -405 l 110 -254 l p ef -724 -107 m 782 -99 l 773 -66 756 -40 731 -21 ct 707 -2 675 7 637 7 ct 589 7 551 -8 523 -37 ct -494 -67 480 -109 480 -162 ct 480 -218 495 -261 523 -291 ct 552 -322 589 -337 634 -337 ct -678 -337 714 -322 742 -292 ct 770 -262 784 -220 784 -166 ct 784 -163 784 -158 783 -151 ct -538 -151 l 540 -115 550 -87 569 -68 ct 587 -49 610 -39 637 -39 ct 658 -39 675 -44 690 -55 ct -704 -66 716 -83 724 -107 ct p -541 -197 m 725 -197 l 722 -225 715 -245 704 -259 ct 686 -280 663 -291 635 -291 ct -609 -291 587 -283 570 -265 ct 553 -248 543 -226 541 -197 ct p ef -829 -99 m 884 -107 l 887 -85 895 -68 910 -57 ct 924 -45 944 -39 969 -39 ct -995 -39 1014 -44 1026 -55 ct 1038 -65 1045 -77 1045 -91 ct 1045 -104 1039 -114 1028 -121 ct -1021 -126 1002 -132 971 -140 ct 930 -150 902 -159 886 -167 ct 870 -174 858 -185 850 -198 ct -842 -211 838 -226 838 -242 ct 838 -257 841 -270 848 -283 ct 855 -295 864 -306 875 -314 ct -884 -320 896 -326 911 -330 ct 926 -335 942 -337 959 -337 ct 985 -337 1008 -333 1027 -326 ct -1047 -318 1061 -308 1070 -296 ct 1080 -283 1086 -266 1090 -245 ct 1035 -237 l -1033 -254 1025 -267 1013 -277 ct 1002 -286 985 -291 963 -291 ct 937 -291 919 -287 908 -278 ct -897 -270 892 -260 892 -249 ct 892 -241 894 -235 899 -229 ct 903 -223 910 -218 920 -214 ct -926 -212 942 -207 969 -200 ct 1009 -189 1036 -181 1052 -174 ct 1068 -167 1080 -158 1089 -145 ct -1098 -132 1102 -116 1102 -97 ct 1102 -79 1097 -61 1086 -45 ct 1075 -28 1059 -15 1039 -6 ct -1018 3 995 7 969 7 ct 927 7 894 -2 871 -20 ct 849 -37 835 -64 829 -99 ct p ef -1383 -41 m 1362 -24 1342 -11 1323 -4 ct 1304 3 1283 7 1262 7 ct 1225 7 1198 -2 1178 -20 ct -1159 -37 1149 -60 1149 -87 ct 1149 -103 1153 -118 1160 -131 ct 1167 -145 1177 -156 1189 -164 ct -1201 -172 1214 -178 1229 -182 ct 1240 -185 1256 -188 1279 -190 ct 1324 -196 1357 -202 1378 -209 ct -1378 -217 1378 -222 1378 -224 ct 1378 -247 1373 -263 1363 -272 ct 1348 -285 1327 -291 1299 -291 ct -1273 -291 1253 -286 1241 -277 ct 1228 -268 1219 -252 1213 -228 ct 1159 -236 l -1164 -259 1172 -278 1183 -292 ct 1194 -307 1211 -318 1232 -326 ct 1254 -333 1279 -337 1307 -337 ct -1335 -337 1358 -334 1376 -327 ct 1393 -321 1406 -312 1414 -302 ct 1423 -292 1428 -280 1432 -264 ct -1434 -255 1435 -238 1435 -213 ct 1435 -138 l 1435 -87 1436 -54 1438 -40 ct -1440 -26 1445 -13 1452 0 ct 1394 0 l 1388 -12 1384 -26 1383 -41 ct p -1378 -166 m 1358 -157 1327 -150 1287 -145 ct 1264 -141 1248 -138 1238 -133 ct -1229 -129 1221 -123 1216 -115 ct 1211 -107 1208 -99 1208 -89 ct 1208 -74 1214 -62 1225 -52 ct -1237 -42 1253 -37 1275 -37 ct 1296 -37 1315 -41 1332 -51 ct 1349 -60 1361 -73 1369 -89 ct -1375 -102 1378 -121 1378 -145 ct 1378 -166 l p ef -1519 0 m 1519 -330 l 1569 -330 l 1569 -283 l 1579 -299 1593 -312 1610 -322 ct -1627 -332 1647 -337 1669 -337 ct 1693 -337 1713 -332 1729 -322 ct 1744 -312 1755 -297 1762 -279 ct -1788 -318 1822 -337 1863 -337 ct 1896 -337 1921 -328 1939 -310 ct 1956 -292 1965 -264 1965 -226 ct -1965 0 l 1910 0 l 1910 -208 l 1910 -230 1908 -246 1904 -256 ct 1901 -266 1894 -274 1884 -280 ct -1875 -286 1864 -289 1851 -289 ct 1828 -289 1809 -281 1793 -265 ct 1778 -250 1770 -225 1770 -191 ct -1770 0 l 1715 0 l 1715 -214 l 1715 -239 1710 -258 1701 -270 ct 1692 -282 1677 -289 1656 -289 ct -1641 -289 1626 -284 1613 -276 ct 1599 -268 1590 -256 1584 -240 ct 1578 -224 1575 -201 1575 -171 ct -1575 0 l 1519 0 l p ef -2049 126 m 2049 -330 l 2100 -330 l 2100 -287 l 2112 -304 2125 -316 2140 -324 ct -2155 -333 2174 -337 2195 -337 ct 2223 -337 2248 -330 2270 -315 ct 2291 -301 2307 -280 2318 -254 ct -2329 -228 2335 -199 2335 -167 ct 2335 -134 2329 -103 2317 -77 ct 2305 -50 2287 -29 2264 -15 ct -2241 0 2217 7 2191 7 ct 2173 7 2156 3 2141 -5 ct 2126 -13 2114 -23 2105 -35 ct -2105 126 l 2049 126 l p -2099 -163 m 2099 -121 2108 -90 2125 -69 ct 2142 -49 2163 -39 2187 -39 ct 2212 -39 2234 -49 2251 -70 ct -2269 -91 2278 -124 2278 -168 ct 2278 -210 2269 -241 2252 -262 ct 2235 -283 2214 -293 2190 -293 ct -2166 -293 2145 -282 2127 -260 ct 2109 -238 2099 -205 2099 -163 ct p ef -2399 0 m 2399 -455 l 2454 -455 l 2454 0 l 2399 0 l p ef -2765 -107 m 2823 -99 l 2814 -66 2797 -40 2772 -21 ct 2748 -2 2716 7 2678 7 ct -2630 7 2592 -8 2564 -37 ct 2535 -67 2521 -109 2521 -162 ct 2521 -218 2536 -261 2564 -291 ct -2593 -322 2630 -337 2675 -337 ct 2719 -337 2755 -322 2783 -292 ct 2811 -262 2825 -220 2825 -166 ct -2825 -163 2825 -158 2824 -151 ct 2579 -151 l 2581 -115 2591 -87 2610 -68 ct -2628 -49 2651 -39 2678 -39 ct 2699 -39 2716 -44 2731 -55 ct 2745 -66 2757 -83 2765 -107 ct -p -2582 -197 m 2766 -197 l 2763 -225 2756 -245 2745 -259 ct 2727 -280 2704 -291 2676 -291 ct -2650 -291 2628 -283 2611 -265 ct 2594 -248 2584 -226 2582 -197 ct p ef -2890 0 m 2890 -330 l 2940 -330 l 2940 -280 l 2953 -303 2965 -318 2976 -326 ct -2987 -333 2999 -337 3012 -337 ct 3031 -337 3050 -331 3069 -319 ct 3050 -267 l -3036 -275 3023 -279 3009 -279 ct 2997 -279 2986 -276 2976 -268 ct 2966 -261 2959 -251 2955 -238 ct -2949 -218 2946 -196 2946 -173 ct 2946 0 l 2890 0 l p ef -pom -gr -gr -5900 12750 m 6463 12563 l 6463 12938 l 5900 12750 l p ef -7100 12775 m 6350 12775 l 6350 12725 l 7100 12725 l 7100 12775 l p ef -gs -gs -pum -25603 12626 t -52 -1 m 52 -455 l 359 -455 l 359 -401 l 112 -401 l 112 -261 l 326 -261 l -326 -207 l 112 -207 l 112 -1 l 52 -1 l p ef -430 0 m 430 -330 l 480 -330 l 480 -280 l 493 -303 505 -318 516 -326 ct -527 -333 539 -337 552 -337 ct 571 -337 590 -331 609 -319 ct 590 -267 l 576 -275 563 -279 549 -279 ct -537 -279 526 -276 516 -268 ct 506 -261 499 -251 495 -238 ct 489 -218 486 -196 486 -173 ct -486 0 l 430 0 l p ef -622 -165 m 622 -226 639 -271 673 -301 ct 701 -325 736 -337 777 -337 ct 822 -337 859 -322 887 -293 ct -916 -263 931 -222 931 -170 ct 931 -127 924 -94 912 -70 ct 899 -45 880 -27 856 -13 ct -832 0 805 7 777 7 ct 730 7 693 -8 665 -37 ct 636 -67 622 -110 622 -165 ct p -679 -165 m 679 -123 689 -91 707 -70 ct 725 -49 749 -39 777 -39 ct 804 -39 827 -49 846 -71 ct -864 -92 873 -124 873 -167 ct 873 -208 864 -239 845 -260 ct 827 -281 804 -291 777 -291 ct -749 -291 725 -281 707 -260 ct 689 -239 679 -207 679 -165 ct p ef -995 0 m 995 -330 l 1045 -330 l 1045 -283 l 1055 -299 1069 -312 1086 -322 ct -1103 -332 1123 -337 1145 -337 ct 1169 -337 1189 -332 1205 -322 ct 1220 -312 1231 -297 1238 -279 ct -1264 -318 1298 -337 1339 -337 ct 1372 -337 1397 -328 1415 -310 ct 1432 -292 1441 -264 1441 -226 ct -1441 0 l 1386 0 l 1386 -208 l 1386 -230 1384 -246 1380 -256 ct 1377 -266 1370 -274 1360 -280 ct -1351 -286 1340 -289 1327 -289 ct 1304 -289 1285 -281 1269 -265 ct 1254 -250 1246 -225 1246 -191 ct -1246 0 l 1191 0 l 1191 -214 l 1191 -239 1186 -258 1177 -270 ct 1168 -282 1153 -289 1132 -289 ct -1117 -289 1102 -284 1089 -276 ct 1075 -268 1066 -256 1060 -240 ct 1054 -224 1051 -201 1051 -171 ct -1051 0 l 995 0 l p ef -pom -gr -gs -pum -25241 13337 t -42 0 m 42 -330 l 92 -330 l 92 -283 l 116 -319 151 -337 197 -337 ct 217 -337 235 -333 252 -326 ct -268 -319 281 -310 289 -298 ct 297 -287 303 -273 306 -257 ct 308 -247 309 -229 309 -203 ct -309 0 l 254 0 l 254 -200 l 254 -223 251 -240 247 -252 ct 243 -263 235 -272 224 -279 ct -213 -285 200 -289 185 -289 ct 161 -289 141 -281 124 -266 ct 106 -251 98 -222 98 -180 ct -98 0 l 42 0 l p ef -618 -107 m 676 -99 l 667 -66 650 -40 625 -21 ct 601 -2 569 7 531 7 ct 483 7 445 -8 417 -37 ct -388 -67 374 -109 374 -162 ct 374 -218 389 -261 417 -291 ct 446 -322 483 -337 528 -337 ct -572 -337 608 -322 636 -292 ct 664 -262 678 -220 678 -166 ct 678 -163 678 -158 677 -151 ct -432 -151 l 434 -115 444 -87 463 -68 ct 481 -49 504 -39 531 -39 ct 552 -39 569 -44 584 -55 ct -598 -66 610 -83 618 -107 ct p -435 -197 m 619 -197 l 616 -225 609 -245 598 -259 ct 580 -280 557 -291 529 -291 ct -503 -291 481 -283 464 -265 ct 447 -248 437 -226 435 -197 ct p ef -867 -50 m 875 -1 l 859 2 845 4 833 4 ct 812 4 797 1 785 -6 ct 774 -12 766 -20 762 -31 ct -757 -41 755 -63 755 -97 ct 755 -287 l 714 -287 l 714 -330 l 755 -330 l -755 -412 l 811 -445 l 811 -330 l 867 -330 l 867 -287 l 811 -287 l -811 -94 l 811 -78 812 -68 814 -63 ct 816 -58 819 -55 823 -52 ct 828 -49 834 -48 842 -48 ct -848 -48 857 -49 867 -50 ct p ef -984 0 m 883 -330 l 941 -330 l 993 -139 l 1012 -69 l 1013 -72 1019 -95 1030 -137 ct -1082 -330 l 1139 -330 l 1189 -138 l 1205 -75 l 1224 -139 l 1280 -330 l -1335 -330 l 1232 0 l 1174 0 l 1121 -197 l 1109 -253 l 1042 0 l 984 0 l -p ef -1346 -165 m 1346 -226 1363 -271 1397 -301 ct 1425 -325 1460 -337 1501 -337 ct -1546 -337 1583 -322 1611 -293 ct 1640 -263 1655 -222 1655 -170 ct 1655 -127 1648 -94 1636 -70 ct -1623 -45 1604 -27 1580 -13 ct 1556 0 1529 7 1501 7 ct 1454 7 1417 -8 1389 -37 ct -1360 -67 1346 -110 1346 -165 ct p -1403 -165 m 1403 -123 1413 -91 1431 -70 ct 1449 -49 1473 -39 1501 -39 ct 1528 -39 1551 -49 1570 -71 ct -1588 -92 1597 -124 1597 -167 ct 1597 -208 1588 -239 1569 -260 ct 1551 -281 1528 -291 1501 -291 ct -1473 -291 1449 -281 1431 -260 ct 1413 -239 1403 -207 1403 -165 ct p ef -1717 0 m 1717 -330 l 1767 -330 l 1767 -280 l 1780 -303 1792 -318 1803 -326 ct -1814 -333 1826 -337 1839 -337 ct 1858 -337 1877 -331 1896 -319 ct 1877 -267 l -1863 -275 1850 -279 1836 -279 ct 1824 -279 1813 -276 1803 -268 ct 1793 -261 1786 -251 1782 -238 ct -1776 -218 1773 -196 1773 -173 ct 1773 0 l 1717 0 l p ef -1930 0 m 1930 -455 l 1986 -455 l 1986 -196 l 2118 -330 l 2190 -330 l -2064 -207 l 2203 0 l 2134 0 l 2025 -169 l 1986 -131 l 1986 0 l 1930 0 l -p ef -pom -gr -gr -gs -gs -pum -26008 8604 t -165 0 m 165 -401 l 15 -401 l 15 -455 l 375 -455 l 375 -401 l 225 -401 l -225 0 l 165 0 l p ef -343 -165 m 343 -226 360 -271 394 -301 ct 422 -325 457 -337 498 -337 ct 543 -337 580 -322 608 -293 ct -637 -263 652 -222 652 -170 ct 652 -127 645 -94 633 -70 ct 620 -45 601 -27 577 -13 ct -553 0 526 7 498 7 ct 451 7 414 -8 386 -37 ct 357 -67 343 -110 343 -165 ct p -400 -165 m 400 -123 410 -91 428 -70 ct 446 -49 470 -39 498 -39 ct 525 -39 548 -49 567 -71 ct -585 -92 594 -124 594 -167 ct 594 -208 585 -239 566 -260 ct 548 -281 525 -291 498 -291 ct -470 -291 446 -281 428 -260 ct 410 -239 400 -207 400 -165 ct p ef -pom -gr -gs -pum -25241 9315 t -42 0 m 42 -330 l 92 -330 l 92 -283 l 116 -319 151 -337 197 -337 ct 217 -337 235 -333 252 -326 ct -268 -319 281 -310 289 -298 ct 297 -287 303 -273 306 -257 ct 308 -247 309 -229 309 -203 ct -309 0 l 254 0 l 254 -200 l 254 -223 251 -240 247 -252 ct 243 -263 235 -272 224 -279 ct -213 -285 200 -289 185 -289 ct 161 -289 141 -281 124 -266 ct 106 -251 98 -222 98 -180 ct -98 0 l 42 0 l p ef -618 -107 m 676 -99 l 667 -66 650 -40 625 -21 ct 601 -2 569 7 531 7 ct 483 7 445 -8 417 -37 ct -388 -67 374 -109 374 -162 ct 374 -218 389 -261 417 -291 ct 446 -322 483 -337 528 -337 ct -572 -337 608 -322 636 -292 ct 664 -262 678 -220 678 -166 ct 678 -163 678 -158 677 -151 ct -432 -151 l 434 -115 444 -87 463 -68 ct 481 -49 504 -39 531 -39 ct 552 -39 569 -44 584 -55 ct -598 -66 610 -83 618 -107 ct p -435 -197 m 619 -197 l 616 -225 609 -245 598 -259 ct 580 -280 557 -291 529 -291 ct -503 -291 481 -283 464 -265 ct 447 -248 437 -226 435 -197 ct p ef -867 -50 m 875 -1 l 859 2 845 4 833 4 ct 812 4 797 1 785 -6 ct 774 -12 766 -20 762 -31 ct -757 -41 755 -63 755 -97 ct 755 -287 l 714 -287 l 714 -330 l 755 -330 l -755 -412 l 811 -445 l 811 -330 l 867 -330 l 867 -287 l 811 -287 l -811 -94 l 811 -78 812 -68 814 -63 ct 816 -58 819 -55 823 -52 ct 828 -49 834 -48 842 -48 ct -848 -48 857 -49 867 -50 ct p ef -984 0 m 883 -330 l 941 -330 l 993 -139 l 1012 -69 l 1013 -72 1019 -95 1030 -137 ct -1082 -330 l 1139 -330 l 1189 -138 l 1205 -75 l 1224 -139 l 1280 -330 l -1335 -330 l 1232 0 l 1174 0 l 1121 -197 l 1109 -253 l 1042 0 l 984 0 l -p ef -1346 -165 m 1346 -226 1363 -271 1397 -301 ct 1425 -325 1460 -337 1501 -337 ct -1546 -337 1583 -322 1611 -293 ct 1640 -263 1655 -222 1655 -170 ct 1655 -127 1648 -94 1636 -70 ct -1623 -45 1604 -27 1580 -13 ct 1556 0 1529 7 1501 7 ct 1454 7 1417 -8 1389 -37 ct -1360 -67 1346 -110 1346 -165 ct p -1403 -165 m 1403 -123 1413 -91 1431 -70 ct 1449 -49 1473 -39 1501 -39 ct 1528 -39 1551 -49 1570 -71 ct -1588 -92 1597 -124 1597 -167 ct 1597 -208 1588 -239 1569 -260 ct 1551 -281 1528 -291 1501 -291 ct -1473 -291 1449 -281 1431 -260 ct 1413 -239 1403 -207 1403 -165 ct p ef -1717 0 m 1717 -330 l 1767 -330 l 1767 -280 l 1780 -303 1792 -318 1803 -326 ct -1814 -333 1826 -337 1839 -337 ct 1858 -337 1877 -331 1896 -319 ct 1877 -267 l -1863 -275 1850 -279 1836 -279 ct 1824 -279 1813 -276 1803 -268 ct 1793 -261 1786 -251 1782 -238 ct -1776 -218 1773 -196 1773 -173 ct 1773 0 l 1717 0 l p ef -1930 0 m 1930 -455 l 1986 -455 l 1986 -196 l 2118 -330 l 2190 -330 l -2064 -207 l 2203 0 l 2134 0 l 2025 -169 l 1986 -131 l 1986 0 l 1930 0 l -p ef -pom -gr -gr -gs -gs -pum -4551 10959 t -29 -146 m 85 -151 l 88 -128 94 -109 104 -95 ct 114 -80 129 -68 150 -59 ct -170 -51 194 -46 220 -46 ct 242 -46 263 -49 280 -56 ct 298 -63 311 -72 320 -84 ct -328 -96 332 -109 332 -123 ct 332 -137 328 -150 320 -161 ct 312 -171 298 -180 279 -187 ct -267 -192 240 -200 198 -210 ct 156 -220 127 -229 110 -238 ct 89 -249 73 -263 62 -280 ct -51 -297 46 -316 46 -337 ct 46 -360 52 -381 65 -401 ct 78 -421 97 -436 122 -447 ct -147 -457 175 -462 206 -462 ct 240 -462 269 -457 295 -446 ct 321 -435 341 -419 354 -398 ct -368 -377 376 -353 377 -326 ct 319 -322 l 316 -351 305 -372 288 -387 ct 270 -402 243 -409 208 -409 ct -172 -409 145 -402 129 -389 ct 112 -376 104 -360 104 -341 ct 104 -324 110 -311 122 -301 ct -133 -290 163 -279 212 -268 ct 261 -257 295 -247 313 -239 ct 339 -227 359 -211 371 -193 ct -384 -174 390 -153 390 -128 ct 390 -104 383 -81 370 -60 ct 356 -38 336 -22 310 -10 ct -284 2 255 8 222 8 ct 181 8 147 2 119 -10 ct 91 -22 69 -40 53 -64 ct 38 -88 29 -115 29 -146 ct -p ef -680 -41 m 659 -24 639 -11 620 -4 ct 601 3 580 7 559 7 ct 522 7 495 -2 475 -20 ct -456 -37 446 -60 446 -87 ct 446 -103 450 -118 457 -131 ct 464 -145 474 -156 486 -164 ct -498 -172 511 -178 526 -182 ct 537 -185 553 -188 576 -190 ct 621 -196 654 -202 675 -209 ct -675 -217 675 -222 675 -224 ct 675 -247 670 -263 660 -272 ct 645 -285 624 -291 596 -291 ct -570 -291 550 -286 538 -277 ct 525 -268 516 -252 510 -228 ct 456 -236 l 461 -259 469 -278 480 -292 ct -491 -307 508 -318 529 -326 ct 551 -333 576 -337 604 -337 ct 632 -337 655 -334 673 -327 ct -690 -321 703 -312 711 -302 ct 720 -292 725 -280 729 -264 ct 731 -255 732 -238 732 -213 ct -732 -138 l 732 -87 733 -54 735 -40 ct 737 -26 742 -13 749 0 ct 691 0 l 685 -12 681 -26 680 -41 ct -p -675 -166 m 655 -157 624 -150 584 -145 ct 561 -141 545 -138 535 -133 ct 526 -129 518 -123 513 -115 ct -508 -107 505 -99 505 -89 ct 505 -74 511 -62 522 -52 ct 534 -42 550 -37 572 -37 ct -593 -37 612 -41 629 -51 ct 646 -60 658 -73 666 -89 ct 672 -102 675 -121 675 -145 ct -675 -166 l p ef -817 0 m 817 -330 l 867 -330 l 867 -283 l 877 -299 891 -312 908 -322 ct -925 -332 945 -337 967 -337 ct 991 -337 1011 -332 1027 -322 ct 1042 -312 1053 -297 1060 -279 ct -1086 -318 1120 -337 1161 -337 ct 1194 -337 1219 -328 1237 -310 ct 1254 -292 1263 -264 1263 -226 ct -1263 0 l 1208 0 l 1208 -208 l 1208 -230 1206 -246 1202 -256 ct 1199 -266 1192 -274 1182 -280 ct -1173 -286 1162 -289 1149 -289 ct 1126 -289 1107 -281 1091 -265 ct 1076 -250 1068 -225 1068 -191 ct -1068 0 l 1013 0 l 1013 -214 l 1013 -239 1008 -258 999 -270 ct 990 -282 975 -289 954 -289 ct -939 -289 924 -284 911 -276 ct 897 -268 888 -256 882 -240 ct 876 -224 873 -201 873 -171 ct -873 0 l 817 0 l p ef -1571 -107 m 1629 -99 l 1620 -66 1603 -40 1578 -21 ct 1554 -2 1522 7 1484 7 ct -1436 7 1398 -8 1370 -37 ct 1341 -67 1327 -109 1327 -162 ct 1327 -218 1342 -261 1370 -291 ct -1399 -322 1436 -337 1481 -337 ct 1525 -337 1561 -322 1589 -292 ct 1617 -262 1631 -220 1631 -166 ct -1631 -163 1631 -158 1630 -151 ct 1385 -151 l 1387 -115 1397 -87 1416 -68 ct -1434 -49 1457 -39 1484 -39 ct 1505 -39 1522 -44 1537 -55 ct 1551 -66 1563 -83 1571 -107 ct -p -1388 -197 m 1572 -197 l 1569 -225 1562 -245 1551 -259 ct 1533 -280 1510 -291 1482 -291 ct -1456 -291 1434 -283 1417 -265 ct 1400 -248 1390 -226 1388 -197 ct p ef -2090 -121 m 2145 -114 l 2139 -76 2123 -46 2099 -25 ct 2074 -4 2044 7 2008 7 ct -1963 7 1926 -8 1899 -37 ct 1872 -67 1858 -109 1858 -164 ct 1858 -199 1864 -230 1875 -257 ct -1887 -284 1905 -304 1929 -317 ct 1953 -330 1980 -337 2008 -337 ct 2044 -337 2073 -328 2096 -310 ct -2118 -292 2133 -266 2139 -233 ct 2085 -224 l 2080 -247 2071 -263 2058 -274 ct -2045 -286 2029 -291 2010 -291 ct 1982 -291 1959 -281 1942 -261 ct 1924 -241 1915 -209 1915 -165 ct -1915 -121 1924 -89 1941 -69 ct 1958 -49 1980 -39 2007 -39 ct 2029 -39 2047 -46 2062 -59 ct -2077 -72 2086 -93 2090 -121 ct p ef -2192 0 m 2192 -455 l 2247 -455 l 2247 0 l 2192 0 l p ef -2311 -165 m 2311 -226 2328 -271 2362 -301 ct 2390 -325 2425 -337 2466 -337 ct -2511 -337 2548 -322 2576 -293 ct 2605 -263 2620 -222 2620 -170 ct 2620 -127 2613 -94 2601 -70 ct -2588 -45 2569 -27 2545 -13 ct 2521 0 2494 7 2466 7 ct 2419 7 2382 -8 2354 -37 ct -2325 -67 2311 -110 2311 -165 ct p -2368 -165 m 2368 -123 2378 -91 2396 -70 ct 2414 -49 2438 -39 2466 -39 ct 2493 -39 2516 -49 2535 -71 ct -2553 -92 2562 -124 2562 -167 ct 2562 -208 2553 -239 2534 -260 ct 2516 -281 2493 -291 2466 -291 ct -2438 -291 2414 -281 2396 -260 ct 2378 -239 2368 -207 2368 -165 ct p ef -2899 -121 m 2954 -114 l 2948 -76 2932 -46 2908 -25 ct 2883 -4 2853 7 2817 7 ct -2772 7 2735 -8 2708 -37 ct 2681 -67 2667 -109 2667 -164 ct 2667 -199 2673 -230 2684 -257 ct -2696 -284 2714 -304 2738 -317 ct 2762 -330 2789 -337 2817 -337 ct 2853 -337 2882 -328 2905 -310 ct -2927 -292 2942 -266 2948 -233 ct 2894 -224 l 2889 -247 2880 -263 2867 -274 ct -2854 -286 2838 -291 2819 -291 ct 2791 -291 2768 -281 2751 -261 ct 2733 -241 2724 -209 2724 -165 ct -2724 -121 2733 -89 2750 -69 ct 2767 -49 2789 -39 2816 -39 ct 2838 -39 2856 -46 2871 -59 ct -2886 -72 2895 -93 2899 -121 ct p ef -3001 0 m 3001 -455 l 3057 -455 l 3057 -196 l 3189 -330 l 3261 -330 l -3135 -207 l 3274 0 l 3205 0 l 3096 -169 l 3057 -131 l 3057 0 l 3001 0 l -p ef -pom -gr -gr -0 6126 t -pom -count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore -%%PageTrailer -%%Trailer -%%EOF diff --git a/speex/doc/components.odg b/speex/doc/components.odg deleted file mode 100644 index 28aa86c9de9f0d78855920e013ef1535257729e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12462 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 diff --git a/speex/doc/manual.lyx b/speex/doc/manual.lyx deleted file mode 100644 index fcbe985a1..000000000 --- a/speex/doc/manual.lyx +++ /dev/null @@ -1,11984 +0,0 @@ -#LyX 1.6.1 created this file. For more info see http://www.lyx.org/ -\lyxformat 345 -\begin_document -\begin_header -\textclass scrbook -\use_default_options true -\language english -\inputencoding auto -\font_roman default -\font_sans default -\font_typewriter default -\font_default_family default -\font_sc false -\font_osf false -\font_sf_scale 100 -\font_tt_scale 100 - -\graphics default -\paperfontsize 10 -\spacing single -\use_hyperref false -\papersize letterpaper -\use_geometry true -\use_amsmath 2 -\use_esint 2 -\cite_engine basic -\use_bibtopic false -\paperorientation portrait -\leftmargin 2cm -\topmargin 2cm -\rightmargin 2cm -\bottommargin 2cm -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation indent -\defskip medskip -\quotes_language english -\papercolumns 1 -\papersides 1 -\paperpagestyle headings -\tracking_changes false -\output_changes false -\author "" -\author "" -\end_header - -\begin_body - -\begin_layout Title -The Speex Manual -\begin_inset Newline newline -\end_inset - -Version 1.2 -\end_layout - -\begin_layout Author -Jean-Marc Valin -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Standard -Copyright -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -copyright -\end_layout - -\end_inset - - 2002-2008 Jean-Marc Valin/Xiph.org Foundation -\end_layout - -\begin_layout Standard -Permission is granted to copy, distribute and/or modify this document under - the terms of the GNU Free Documentation License, Version 1.1 or any later - version published by the Free Software Foundation; with no Invariant Section, - with no Front-Cover Texts, and with no Back-Cover. - A copy of the license is included in the section entitled "GNU Free Documentati -on License". - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\begin_inset CommandInset toc -LatexCommand tableofcontents - -\end_inset - - -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset FloatList table - -\end_inset - - -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Introduction to Speex -\end_layout - -\begin_layout Standard -The Speex codec ( -\family typewriter -http://www.speex.org/ -\family default -) exists because there is a need for a speech codec that is open-source - and free from software patent royalties. - These are essential conditions for being usable in any open-source software. - In essence, Speex is to speech what Vorbis is to audio/music. - Unlike many other speech codecs, Speex is not designed for mobile phones - but rather for packet networks and voice over IP (VoIP) applications. - File-based compression is of course also supported. - -\end_layout - -\begin_layout Standard -The Speex codec is designed to be very flexible and support a wide range - of speech quality and bit-rate. - Support for very good quality speech also means that Speex can encode wideband - speech (16 kHz sampling rate) in addition to narrowband speech (telephone - quality, 8 kHz sampling rate). -\end_layout - -\begin_layout Standard -Designing for VoIP instead of mobile phones means that Speex is robust to - lost packets, but not to corrupted ones. - This is based on the assumption that in VoIP, packets either arrive unaltered - or don't arrive at all. - Because Speex is targeted at a wide range of devices, it has modest (adjustable -) complexity and a small memory footprint. -\end_layout - -\begin_layout Standard -All the design goals led to the choice of CELP -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -CELP -\end_layout - -\end_inset - - as the encoding technique. - One of the main reasons is that CELP has long proved that it could work - reliably and scale well to both low bit-rates (e.g. - DoD CELP @ 4.8 kbps) and high bit-rates (e.g. - G.728 @ 16 kbps). - -\end_layout - -\begin_layout Section -Getting help -\begin_inset CommandInset label -LatexCommand label -name "sec:Getting-help" - -\end_inset - - -\end_layout - -\begin_layout Standard -As for many open source projects, there are many ways to get help with Speex. - These include: -\end_layout - -\begin_layout Itemize -This manual -\end_layout - -\begin_layout Itemize -Other documentation on the Speex website (http://www.speex.org/) -\end_layout - -\begin_layout Itemize -Mailing list: Discuss any Speex-related topic on speex-dev@xiph.org (not - just for developers) -\end_layout - -\begin_layout Itemize -IRC: The main channel is #speex on irc.freenode.net. - Note that due to time differences, it may take a while to get someone, - so please be patient. -\end_layout - -\begin_layout Itemize -Email the author privately at jean-marc.valin@usherbrooke.ca -\series bold -only -\series default - for private/delicate topics you do not wish to discuss publicly. -\end_layout - -\begin_layout Standard -Before asking for help (mailing list or IRC), -\series bold -it is important to first read this manual -\series default - (OK, so if you made it here it's already a good sign). - It is generally considered rude to ask on a mailing list about topics that - are clearly detailed in the documentation. - On the other hand, it's perfectly OK (and encouraged) to ask for clarifications - about something covered in the manual. - This manual does not (yet) cover everything about Speex, so everyone is - encouraged to ask questions, send comments, feature requests, or just let - us know how Speex is being used. - -\end_layout - -\begin_layout Standard -Here are some additional guidelines related to the mailing list. - Before reporting bugs in Speex to the list, it is strongly recommended - (if possible) to first test whether these bugs can be reproduced using - the speexenc and speexdec (see Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Command-line-encoder/decoder" - -\end_inset - -) command-line utilities. - Bugs reported based on 3rd party code are both harder to find and far too - often caused by errors that have nothing to do with Speex. - -\end_layout - -\begin_layout Section -About this document -\end_layout - -\begin_layout Standard -This document is divided in the following way. - Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Feature-description" - -\end_inset - - describes the different Speex features and defines many basic terms that - are used throughout this manual. - Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Command-line-encoder/decoder" - -\end_inset - - documents the standard command-line tools provided in the Speex distribution. - Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Programming-with-Speex" - -\end_inset - - includes detailed instructions about programming using the libspeex -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -libspeex -\end_layout - -\end_inset - - API. - Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Formats-and-standards" - -\end_inset - - has some information related to Speex and standards. - -\end_layout - -\begin_layout Standard -The three last sections describe the algorithms used in Speex. - These sections require signal processing knowledge, but are not required - for merely using Speex. - They are intended for people who want to understand how Speex really works - and/or want to do research based on Speex. - Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Introduction-to-CELP" - -\end_inset - - explains the general idea behind CELP, while sections -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Speex-narrowband-mode" - -\end_inset - - and -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Speex-wideband-mode" - -\end_inset - - are specific to Speex. -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Codec description -\begin_inset CommandInset label -LatexCommand label -name "sec:Feature-description" - -\end_inset - - -\end_layout - -\begin_layout Standard -This section describes Speex and its features into more details. -\end_layout - -\begin_layout Section -Concepts -\end_layout - -\begin_layout Standard -Before introducing all the Speex features, here are some concepts in speech - coding that help better understand the rest of the manual. - Although some are general concepts in speech/audio processing, others are - specific to Speex. -\end_layout - -\begin_layout Subsection* -Sampling rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -sampling rate -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The sampling rate expressed in Hertz (Hz) is the number of samples taken - from a signal per second. - For a sampling rate of -\begin_inset Formula $F_{s}$ -\end_inset - - kHz, the highest frequency that can be represented is equal to -\begin_inset Formula $F_{s}/2$ -\end_inset - - kHz ( -\begin_inset Formula $F_{s}/2$ -\end_inset - - is known as the Nyquist frequency). - This is a fundamental property in signal processing and is described by - the sampling theorem. - Speex is mainly designed for three different sampling rates: 8 kHz, 16 - kHz, and 32 kHz. - These are respectively referred to as narrowband -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -narrowband -\end_layout - -\end_inset - -, wideband -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -wideband -\end_layout - -\end_inset - - and ultra-wideband -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -ultra-wideband -\end_layout - -\end_inset - -. - -\end_layout - -\begin_layout Subsection* -Bit-rate -\end_layout - -\begin_layout Standard -When encoding a speech signal, the bit-rate is defined as the number of - bits per unit of time required to encode the speech. - It is measured in -\emph on -bits per second -\emph default - (bps), or generally -\emph on -kilobits per second -\emph default -. - It is important to make the distinction between -\emph on -kilo -\series bold -bits -\series default -\emph default - -\emph on -per second -\emph default - (k -\series bold -b -\series default -ps) and -\emph on -kilo -\series bold -bytes -\series default -\emph default - -\emph on -per second -\emph default - (k -\series bold -B -\series default -ps). -\end_layout - -\begin_layout Subsection* -Quality -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -quality -\end_layout - -\end_inset - - (variable) -\end_layout - -\begin_layout Standard -Speex is a lossy codec, which means that it achieves compression at the - expense of fidelity of the input speech signal. - Unlike some other speech codecs, it is possible to control the trade-off - made between quality and bit-rate. - The Speex encoding process is controlled most of the time by a quality - parameter that ranges from 0 to 10. - In constant bit-rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -constant bit-rate -\end_layout - -\end_inset - - (CBR) operation, the quality parameter is an integer, while for variable - bit-rate (VBR), the parameter is a float. - -\end_layout - -\begin_layout Subsection* -Complexity -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -complexity -\end_layout - -\end_inset - - (variable) -\end_layout - -\begin_layout Standard -With Speex, it is possible to vary the complexity allowed for the encoder. - This is done by controlling how the search is performed with an integer - ranging from 1 to 10 in a way that's similar to the -1 to -9 options to - -\emph on -gzip -\emph default - and -\emph on -bzip2 -\emph default - compression utilities. - For normal use, the noise level at complexity 1 is between 1 and 2 dB higher - than at complexity 10, but the CPU requirements for complexity 10 is about - 5 times higher than for complexity 1. - In practice, the best trade-off is between complexity 2 and 4, though higher - settings are often useful when encoding non-speech sounds like DTMF -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -DTMF -\end_layout - -\end_inset - - tones. -\end_layout - -\begin_layout Subsection* -Variable Bit-Rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -variable bit-rate -\end_layout - -\end_inset - - (VBR) -\end_layout - -\begin_layout Standard -Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically - to adapt to the -\begin_inset Quotes eld -\end_inset - -difficulty -\begin_inset Quotes erd -\end_inset - - of the audio being encoded. - In the example of Speex, sounds like vowels and high-energy transients - require a higher bit-rate to achieve good quality, while fricatives (e.g. - s,f sounds) can be coded adequately with less bits. - For this reason, VBR can achieve lower bit-rate for the same quality, or - a better quality for a certain bit-rate. - Despite its advantages, VBR has two main drawbacks: first, by only specifying - quality, there's no guaranty about the final average bit-rate. - Second, for some real-time applications like voice over IP (VoIP), what - counts is the maximum bit-rate, which must be low enough for the communication - channel. -\end_layout - -\begin_layout Subsection* -Average Bit-Rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -average bit-rate -\end_layout - -\end_inset - - (ABR) -\end_layout - -\begin_layout Standard -Average bit-rate solves one of the problems of VBR, as it dynamically adjusts - VBR quality in order to meet a specific target bit-rate. - Because the quality/bit-rate is adjusted in real-time (open-loop), the - global quality will be slightly lower than that obtained by encoding in - VBR with exactly the right quality setting to meet the target average bit-rate. -\end_layout - -\begin_layout Subsection* -Voice Activity Detection -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -voice activity detection -\end_layout - -\end_inset - - (VAD) -\end_layout - -\begin_layout Standard -When enabled, voice activity detection detects whether the audio being encoded - is speech or silence/background noise. - VAD is always implicitly activated when encoding in VBR, so the option - is only useful in non-VBR operation. - In this case, Speex detects non-speech periods and encode them with just - enough bits to reproduce the background noise. - This is called -\begin_inset Quotes eld -\end_inset - -comfort noise generation -\begin_inset Quotes erd -\end_inset - - (CNG). -\end_layout - -\begin_layout Subsection* -Discontinuous Transmission -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -discontinuous transmission -\end_layout - -\end_inset - - (DTX) -\end_layout - -\begin_layout Standard -Discontinuous transmission is an addition to VAD/VBR operation, that allows - to stop transmitting completely when the background noise is stationary. - In file-based operation, since we cannot just stop writing to the file, - only 5 bits are used for such frames (corresponding to 250 bps). -\end_layout - -\begin_layout Subsection* -Perceptual enhancement -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -perceptual enhancement -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Perceptual enhancement is a part of the decoder which, when turned on, attempts - to reduce the perception of the noise/distortion produced by the encoding/decod -ing process. - In most cases, perceptual enhancement brings the sound further from the - original -\emph on -objectively -\emph default - (e.g. - considering only SNR), but in the end it still -\emph on -sounds -\emph default - better (subjective improvement). -\end_layout - -\begin_layout Subsection* -Latency and algorithmic delay -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -algorithmic delay -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Every speech codec introduces a delay in the transmission. - For Speex, this delay is equal to the frame size, plus some amount of -\begin_inset Quotes eld -\end_inset - -look-ahead -\begin_inset Quotes erd -\end_inset - - required to process each frame. - In narrowband operation (8 kHz), the look-ahead is 10 ms, in wideband operation - (16 kHz), the look-ahead is 13.9 ms and in ultra-wideband operation (32 - kHz) look-ahead is 15.9 ms, resulting in the algorithic delays of 30 ms, - 33.9 ms and 35.9 ms accordingly. - These values don't account for the CPU time it takes to encode or decode - the frames. -\end_layout - -\begin_layout Section -Codec -\end_layout - -\begin_layout Standard -The main characteristics of Speex can be summarized as follows: -\end_layout - -\begin_layout Itemize -Free software/open-source -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -open-source -\end_layout - -\end_inset - -, patent -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -patent -\end_layout - -\end_inset - - and royalty-free -\end_layout - -\begin_layout Itemize -Integration of narrowband -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -narrowband -\end_layout - -\end_inset - - and wideband -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -wideband -\end_layout - -\end_inset - - using an embedded bit-stream -\end_layout - -\begin_layout Itemize -Wide range of bit-rates available (from 2.15 kbps to 44 kbps) -\end_layout - -\begin_layout Itemize -Dynamic bit-rate switching (AMR) and Variable Bit-Rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -variable bit-rate -\end_layout - -\end_inset - - (VBR) operation -\end_layout - -\begin_layout Itemize -Voice Activity Detection -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -voice activity detection -\end_layout - -\end_inset - - (VAD, integrated with VBR) and discontinuous transmission (DTX) -\end_layout - -\begin_layout Itemize -Variable complexity -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -complexity -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -Embedded wideband structure (scalable sampling rate) -\end_layout - -\begin_layout Itemize -Ultra-wideband sampling rate at 32 kHz -\end_layout - -\begin_layout Itemize -Intensity stereo encoding option -\end_layout - -\begin_layout Itemize -Fixed-point implementation -\end_layout - -\begin_layout Section -Preprocessor -\end_layout - -\begin_layout Standard -This part refers to the preprocessor module introduced in the 1.1.x branch. - The preprocessor is designed to be used on the audio -\emph on -before -\emph default - running the encoder. - The preprocessor provides three main functionalities: -\end_layout - -\begin_layout Itemize -noise suppression -\end_layout - -\begin_layout Itemize -automatic gain control (AGC) -\end_layout - -\begin_layout Itemize -voice activity detection (VAD) -\end_layout - -\begin_layout Standard -The denoiser can be used to reduce the amount of background noise present - in the input signal. - This provides higher quality speech whether or not the denoised signal - is encoded with Speex (or at all). - However, when using the denoised signal with the codec, there is an additional - benefit. - Speech codecs in general (Speex included) tend to perform poorly on noisy - input, which tends to amplify the noise. - The denoiser greatly reduces this effect. -\end_layout - -\begin_layout Standard -Automatic gain control (AGC) is a feature that deals with the fact that - the recording volume may vary by a large amount between different setups. - The AGC provides a way to adjust a signal to a reference volume. - This is useful for voice over IP because it removes the need for manual - adjustment of the microphone gain. - A secondary advantage is that by setting the microphone gain to a conservative - (low) level, it is easier to avoid clipping. -\end_layout - -\begin_layout Standard -The voice activity detector (VAD) provided by the preprocessor is more advanced - than the one directly provided in the codec. - -\end_layout - -\begin_layout Section -Adaptive Jitter Buffer -\end_layout - -\begin_layout Standard -When transmitting voice (or any content for that matter) over UDP or RTP, - packet may be lost, arrive with different delay, or even out of order. - The purpose of a jitter buffer is to reorder packets and buffer them long - enough (but no longer than necessary) so they can be sent to be decoded. - -\end_layout - -\begin_layout Section -Acoustic Echo Canceller -\end_layout - -\begin_layout Standard -In any hands-free communication system (Fig. - -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:Acoustic-echo-model" - -\end_inset - -), speech from the remote end is played in the local loudspeaker, propagates - in the room and is captured by the microphone. - If the audio captured from the microphone is sent directly to the remote - end, then the remote user hears an echo of his voice. - An acoustic echo canceller is designed to remove the acoustic echo before - it is sent to the remote end. - It is important to understand that the echo canceller is meant to improve - the quality on the -\series bold -remote -\series default - end. - For those who care a lot about mouth-to-ear delays it should be noted that - unlike Speex codec, resampler and preprocessor, this Acoustic Echo Canceller - does not introduce any latency. -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Graphics - filename echo_path.eps - width 10cm - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Acoustic echo model -\begin_inset CommandInset label -LatexCommand label -name "fig:Acoustic-echo-model" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Resampler -\end_layout - -\begin_layout Standard -In some cases, it may be useful to convert audio from one sampling rate - to another. - There are many reasons for that. - It can be for mixing streams that have different sampling rates, for supporting - sampling rates that the soundcard doesn't support, for transcoding, etc. - That's why there is now a resampler that is part of the Speex project. - This resampler can be used to convert between any two arbitrary rates (the - ratio must only be a rational number) and there is control over the quality/com -plexity tradeoff. - Keep in mind, that resampler introduce some delay in audio stream, which - size depends on resampler quality setting. - Refer to resampler API documentation to know how to get exact delay values. -\end_layout - -\begin_layout Section -Integration -\end_layout - -\begin_layout Standard -Knowing -\emph on -how -\emph default - to use each of the components is not that useful unless we know -\emph on -where -\emph default - to use them. - Figure -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:Integration-VoIP" - -\end_inset - - shows where each of the components would be used in a typical VoIP client. - Components in dotted lines are optional, though they may be very useful - in some circumstances. - There are several important things to note from there. - The AEC must be placed as close as possible to the playback and capture. - Only the resampling may be closer. - Also, it is very important to use the same clock for both mic capture and - speaker/headphones playback. -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Graphics - filename components.eps - width 80text% - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Integration of all the components in a VoIP client. -\begin_inset CommandInset label -LatexCommand label -name "fig:Integration-VoIP" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Compiling and Porting -\end_layout - -\begin_layout Standard -Compiling Speex under UNIX/Linux or any other platform supported by autoconf - (e.g. - Win32/cygwin) is as easy as typing: -\end_layout - -\begin_layout LyX-Code -% ./configure [options] -\end_layout - -\begin_layout LyX-Code -% make -\end_layout - -\begin_layout LyX-Code -% make install -\end_layout - -\begin_layout Standard -The options supported by the Speex configure script are: -\end_layout - -\begin_layout Description ---prefix= Specifies the base path for installing Speex (e.g. - /usr) -\end_layout - -\begin_layout Description ---enable-shared/--disable-shared Whether to compile shared libraries -\end_layout - -\begin_layout Description ---enable-static/--disable-static Whether to compile static libraries -\end_layout - -\begin_layout Description ---disable-wideband Disable the wideband part of Speex (typically to save - space) -\end_layout - -\begin_layout Description ---enable-valgrind Enable extra hits for valgrind for debugging purposes - (do not use by default) -\end_layout - -\begin_layout Description ---enable-sse Enable use of SSE instructions (x86/float only) -\end_layout - -\begin_layout Description ---enable-fixed-point -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -fixed-point -\end_layout - -\end_inset - - Compile Speex for a processor that does not have a floating point unit - (FPU) -\end_layout - -\begin_layout Description ---enable-arm4-asm Enable assembly specific to the ARMv4 architecture (gcc - only) -\end_layout - -\begin_layout Description ---enable-arm5e-asm Enable assembly specific to the ARMv5E architecture (gcc - only) -\end_layout - -\begin_layout Description ---enable-fixed-point-debug Use only for debugging the fixed-point -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -fixed-point -\end_layout - -\end_inset - - code (very slow) -\end_layout - -\begin_layout Description ---enable-ti-c55x Enable support for the TI C5x family -\end_layout - -\begin_layout Description ---enable-blackfin-asm Enable assembly specific to the Blackfin DSP architecture - (gcc only) -\end_layout - -\begin_layout Section -Platforms -\end_layout - -\begin_layout Standard -Speex is known to compile and work on a large number of architectures, both - floating-point and fixed-point. - In general, any architecture that can natively compute the multiplication - of two signed 16-bit numbers (32-bit result) and runs at a sufficient clock - rate (architecture-dependent) is capable of running Speex. - Architectures on which Speex is -\series bold -known -\series default - to work (it probably works on many others) are: -\end_layout - -\begin_layout Itemize -x86 & x86-64 -\end_layout - -\begin_layout Itemize -Power -\end_layout - -\begin_layout Itemize -SPARC -\end_layout - -\begin_layout Itemize -ARM -\end_layout - -\begin_layout Itemize -Blackfin -\end_layout - -\begin_layout Itemize -Coldfire (68k family) -\end_layout - -\begin_layout Itemize -TI C54xx & C55xx -\end_layout - -\begin_layout Itemize -TI C6xxx -\end_layout - -\begin_layout Itemize -TriMedia (experimental) -\end_layout - -\begin_layout Standard -Operating systems on top of which Speex is known to work include (it probably - works on many others): -\end_layout - -\begin_layout Itemize -Linux -\end_layout - -\begin_layout Itemize -\begin_inset Formula $\mu$ -\end_inset - -Clinux -\end_layout - -\begin_layout Itemize -MacOS X -\end_layout - -\begin_layout Itemize -BSD -\end_layout - -\begin_layout Itemize -Other UNIX/POSIX variants -\end_layout - -\begin_layout Itemize -Symbian -\end_layout - -\begin_layout Standard -The source code directory include additional information for compiling on - certain architectures or operating systems in README.xxx files. -\end_layout - -\begin_layout Section -Porting and Optimising -\end_layout - -\begin_layout Standard -Here are a few things to consider when porting or optimising Speex for a - new platform or an existing one. -\end_layout - -\begin_layout Subsection -CPU optimisation -\end_layout - -\begin_layout Standard -The single factor that will affect the CPU usage of Speex the most is whether - it is compiled for floating point or fixed-point. - If your CPU/DSP does not have a floating-point unit FPU, then compiling - as fixed-point will be orders of magnitudes faster. - If there is an FPU present, then it is important to test which version - is faster. - On the x86 architecture, floating-point is -\series bold -generally -\series default - faster, but not always. - To compile Speex as fixed-point, you need to pass --fixed-point to the - configure script or define the FIXED_POINT macro for the compiler. - As of 1.2beta3, it is now possible to disable the floating-point compatibility - API, which means that your code can link without a float emulation library. - To do that configure with --disable-float-api or define the DISABLE_FLOAT_API - macro. - Until the VBR feature is ported to fixed-point, you will also need to configure - with --disable-vbr or define DISABLE_VBR. -\end_layout - -\begin_layout Standard -Other important things to check on some DSP architectures are: -\end_layout - -\begin_layout Itemize -Make sure the cache is set to write-back mode -\end_layout - -\begin_layout Itemize -If the chip has SRAM instead of cache, make sure as much code and data are - in SRAM, rather than in RAM -\end_layout - -\begin_layout Standard -If you are going to be writing assembly, then the following functions are - -\series bold -usually -\series default - the first ones you should consider optimising: -\end_layout - -\begin_layout Itemize -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -filter_mem16() -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -iir_mem16() -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -vq_nbest() -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -pitch_xcorr() -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Itemize -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -interp_pitch() -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The filtering functions -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -filter_mem16() -\end_layout - -\end_inset - - and -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -iir_mem16() -\end_layout - -\end_inset - - are implemented in the direct form II transposed (DF2T). - However, for architectures based on multiply-accumulate (MAC), DF2T requires - frequent reload of the accumulator, which can make the code very slow. - For these architectures (e.g. - Blackfin and Coldfire), a better approach is to implement those functions - as direct form I (DF1), which is easier to express in terms of MAC. - When doing that however, -\series bold -it is important to make sure that the DF1 implementation still behaves like - the original DF2T behaviour when it comes to memory values -\series default -. - This is necessary because the filter is time-varying and must compute exactly - the same value (not counting machine rounding) on any encoder or decoder. -\end_layout - -\begin_layout Subsection -Memory optimisation -\end_layout - -\begin_layout Standard -Memory optimisation is mainly something that should be considered for small - embedded platforms. - For PCs, Speex is already so tiny that it's just not worth doing any of - the things suggested here. - There are several ways to reduce the memory usage of Speex, both in terms - of code size and data size. - For optimising code size, the trick is to first remove features you do - not need. - Some examples of things that can easily be disabled -\series bold -if you don't need them -\series default - are: -\end_layout - -\begin_layout Itemize -Wideband support (--disable-wideband) -\end_layout - -\begin_layout Itemize -Support for stereo (removing stereo.c) -\end_layout - -\begin_layout Itemize -VBR support (--disable-vbr or DISABLE_VBR) -\end_layout - -\begin_layout Itemize -Static codebooks that are not needed for the bit-rates you are using (*_table.c - files) -\end_layout - -\begin_layout Standard -Speex also has several methods for allocating temporary arrays. - When using a compiler that supports C99 properly (as of 2007, Microsoft - compilers don't, but gcc does), it is best to define VAR_ARRAYS. - That makes use of the variable-size array feature of C99. - The next best is to define USE_ALLOCA so that Speex can use alloca() to - allocate the temporary arrays. - Note that on many systems, alloca() is buggy so it may not work. - If none of VAR_ARRAYS and USE_ALLOCA are defined, then Speex falls back - to allocating a large -\begin_inset Quotes eld -\end_inset - -scratch space -\begin_inset Quotes erd -\end_inset - - and doing its own internal allocation. - The main disadvantage of this solution is that it is wasteful. - It needs to allocate enough stack for the worst case scenario (worst bit-rate, - highest complexity setting, ...) and by default, the memory isn't shared between - multiple encoder/decoder states. - Still, if the -\begin_inset Quotes eld -\end_inset - -manual -\begin_inset Quotes erd -\end_inset - - allocation is the only option left, there are a few things that can be - improved. - By overriding the speex_alloc_scratch() call in os_support.h, it is possible - to always return the same memory area for all states -\begin_inset Foot -status collapsed - -\begin_layout Plain Layout -In this case, one must be careful with threads -\end_layout - -\end_inset - -. - In addition to that, by redefining the NB_ENC_STACK and NB_DEC_STACK (or - similar for wideband), it is possible to only allocate memory for a scenario - that is known in advance. - In this case, it is important to measure the amount of memory required - for the specific sampling rate, bit-rate and complexity level being used. -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Command-line encoder/decoder -\begin_inset CommandInset label -LatexCommand label -name "sec:Command-line-encoder/decoder" - -\end_inset - - -\end_layout - -\begin_layout Standard -The base Speex distribution includes a command-line encoder ( -\emph on -speexenc -\emph default -) and decoder ( -\emph on -speexdec -\emph default -). - Those tools produce and read Speex files encapsulated in the Ogg container. - Although it is possible to encapsulate Speex in any container, Ogg is the - recommended container for files. - This section describes how to use the command line tools for Speex files - in Ogg. -\end_layout - -\begin_layout Section - -\emph on -speexenc -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -speexenc -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The -\emph on -speexenc -\emph default - utility is used to create Speex files from raw PCM or wave files. - It can be used by calling: -\end_layout - -\begin_layout LyX-Code -speexenc [options] input_file output_file -\end_layout - -\begin_layout Standard -The value '-' for input_file or output_file corresponds respectively to - stdin and stdout. - The valid options are: -\end_layout - -\begin_layout Description ---narrowband -\begin_inset space ~ -\end_inset - -(-n) Tell Speex to treat the input as narrowband (8 kHz). - This is the default -\end_layout - -\begin_layout Description ---wideband -\begin_inset space ~ -\end_inset - -(-w) Tell Speex to treat the input as wideband (16 kHz) -\end_layout - -\begin_layout Description ---ultra-wideband -\begin_inset space ~ -\end_inset - -(-u) Tell Speex to treat the input as -\begin_inset Quotes eld -\end_inset - -ultra-wideband -\begin_inset Quotes erd -\end_inset - - (32 kHz) -\end_layout - -\begin_layout Description ---quality -\begin_inset space ~ -\end_inset - -n Set the encoding quality (0-10), default is 8 -\end_layout - -\begin_layout Description ---bitrate -\begin_inset space ~ -\end_inset - -n Encoding bit-rate (use bit-rate n or lower) -\end_layout - -\begin_layout Description ---vbr Enable VBR (Variable Bit-Rate), disabled by default -\end_layout - -\begin_layout Description ---abr -\begin_inset space ~ -\end_inset - -n Enable ABR (Average Bit-Rate) at n kbps, disabled by default -\end_layout - -\begin_layout Description ---vad Enable VAD (Voice Activity Detection), disabled by default -\end_layout - -\begin_layout Description ---dtx Enable DTX (Discontinuous Transmission), disabled by default -\end_layout - -\begin_layout Description ---nframes -\begin_inset space ~ -\end_inset - -n Pack n frames in each Ogg packet (this saves space at low bit-rates) -\end_layout - -\begin_layout Description ---comp -\begin_inset space ~ -\end_inset - -n Set encoding speed/quality tradeoff. - The higher the value of n, the slower the encoding (default is 3) -\end_layout - -\begin_layout Description --V Verbose operation, print bit-rate currently in use -\end_layout - -\begin_layout Description ---help -\begin_inset space ~ -\end_inset - -(-h) Print the help -\end_layout - -\begin_layout Description ---version -\begin_inset space ~ -\end_inset - -(-v) Print version information -\end_layout - -\begin_layout Subsection* -Speex comments -\end_layout - -\begin_layout Description ---comment Add the given string as an extra comment. - This may be used multiple times. - -\end_layout - -\begin_layout Description ---author Author of this track. - -\end_layout - -\begin_layout Description ---title Title for this track. - -\end_layout - -\begin_layout Subsection* -Raw input options -\end_layout - -\begin_layout Description ---rate -\begin_inset space ~ -\end_inset - -n Sampling rate for raw input -\end_layout - -\begin_layout Description ---stereo Consider raw input as stereo -\end_layout - -\begin_layout Description ---le Raw input is little-endian -\end_layout - -\begin_layout Description ---be Raw input is big-endian -\end_layout - -\begin_layout Description ---8bit Raw input is 8-bit unsigned -\end_layout - -\begin_layout Description ---16bit Raw input is 16-bit signed -\end_layout - -\begin_layout Section - -\emph on -speexdec -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -speexdec -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The -\emph on -speexdec -\emph default - utility is used to decode Speex files and can be used by calling: -\end_layout - -\begin_layout LyX-Code -speexdec [options] speex_file [output_file] -\end_layout - -\begin_layout Standard -The value '-' for input_file or output_file corresponds respectively to - stdin and stdout. - Also, when no output_file is specified, the file is played to the soundcard. - The valid options are: -\end_layout - -\begin_layout Description ---enh enable post-filter (default) -\end_layout - -\begin_layout Description ---no-enh disable post-filter -\end_layout - -\begin_layout Description ---force-nb Force decoding in narrowband -\end_layout - -\begin_layout Description ---force-wb Force decoding in wideband -\end_layout - -\begin_layout Description ---force-uwb Force decoding in ultra-wideband -\end_layout - -\begin_layout Description ---mono Force decoding in mono -\end_layout - -\begin_layout Description ---stereo Force decoding in stereo -\end_layout - -\begin_layout Description ---rate -\begin_inset space ~ -\end_inset - -n Force decoding at n Hz sampling rate -\end_layout - -\begin_layout Description ---packet-loss -\begin_inset space ~ -\end_inset - -n Simulate n % random packet loss -\end_layout - -\begin_layout Description --V Verbose operation, print bit-rate currently in use -\end_layout - -\begin_layout Description ---help -\begin_inset space ~ -\end_inset - -(-h) Print the help -\end_layout - -\begin_layout Description ---version -\begin_inset space ~ -\end_inset - -(-v) Print version information -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Using the Speex Codec API ( -\emph on -libspeex -\emph default - -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -libspeex -\end_layout - -\end_inset - -) -\begin_inset CommandInset label -LatexCommand label -name "sec:Programming-with-Speex" - -\end_inset - - -\end_layout - -\begin_layout Standard -The -\emph on -libspeex -\emph default - library contains all the functions for encoding and decoding speech with - the Speex codec. - When linking on a UNIX system, one must add -\emph on --lspeex -lm -\emph default - to the compiler command line. - One important thing to know is that -\series bold -libspeex calls are reentrant, but not thread-safe -\series default -. - That means that it is fine to use calls from many threads, but -\series bold -calls using the same state from multiple threads must be protected by mutexes -\series default -. - Examples of code can also be found in Appendix -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Sample-code" - -\end_inset - - and the complete API documentation is included in the Documentation section - of the Speex website (http://www.speex.org/). -\end_layout - -\begin_layout Section -Encoding -\begin_inset CommandInset label -LatexCommand label -name "sub:Encoding" - -\end_inset - - -\end_layout - -\begin_layout Standard -In order to encode speech using Speex, one first needs to: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -#include -\end_layout - -\end_inset - -Then in the code, a Speex bit-packing struct must be declared, along with - a Speex encoder state: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -SpeexBits bits; -\end_layout - -\begin_layout Plain Layout - -void *enc_state; -\end_layout - -\end_inset - -The two are initialized by: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_bits_init(&bits); -\end_layout - -\begin_layout Plain Layout - -enc_state = speex_encoder_init(&speex_nb_mode); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -For wideband coding, -\emph on -speex_nb_mode -\emph default - will be replaced by -\emph on -speex_wb_mode -\emph default -. - In most cases, you will need to know the frame size used at the sampling - rate you are using. - You can get that value in the -\emph on -frame_size -\emph default - variable (expressed in -\series bold -samples -\series default -, not bytes) with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -In practice, -\emph on -frame_size -\emph default - will correspond to 20 ms when using 8, 16, or 32 kHz sampling rate. - There are many parameters that can be set for the Speex encoder, but the - most useful one is the quality parameter that controls the quality vs bit-rate - tradeoff. - This is set by: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_encoder_ctl(enc_state,SPEEX_SET_QUALITY,&quality); -\end_layout - -\end_inset - -where -\emph on -quality -\emph default - is an integer value ranging from 0 to 10 (inclusively). - The mapping between quality and bit-rate is described in Fig. - -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:quality_vs_bps" - -\end_inset - - for narrowband. -\end_layout - -\begin_layout Standard -Once the initialization is done, for every input frame: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_bits_reset(&bits); -\end_layout - -\begin_layout Plain Layout - -speex_encode_int(enc_state, input_frame, &bits); -\end_layout - -\begin_layout Plain Layout - -nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -where -\emph on -input_frame -\emph default - is a -\emph on -( -\emph default -short -\emph on -*) -\emph default - pointing to the beginning of a speech frame, -\emph on -byte_ptr -\emph default - is a -\emph on -(char *) -\emph default - where the encoded frame will be written, -\emph on -MAX_NB_BYTES -\emph default - is the maximum number of bytes that can be written to -\emph on -byte_ptr -\emph default - without causing an overflow and -\emph on -nbBytes -\emph default - is the number of bytes actually written to -\emph on -byte_ptr -\emph default - (the encoded size in bytes). - Before calling speex_bits_write, it is possible to find the number of bytes - that need to be written by calling -\family typewriter -speex_bits_nbytes(&bits) -\family default -, which returns a number of bytes. -\end_layout - -\begin_layout Standard -It is still possible to use the -\emph on -speex_encode() -\emph default - function, which takes a -\emph on -(float *) -\emph default - for the audio. - However, this would make an eventual port to an FPU-less platform (like - ARM) more complicated. - Internally, -\emph on -speex_encode() -\emph default - and -\emph on -speex_encode_int() -\emph default - are processed in the same way. - Whether the encoder uses the fixed-point version is only decided by the - compile-time flags, not at the API level. -\end_layout - -\begin_layout Standard -After you're done with the encoding, free all resources with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_bits_destroy(&bits); -\end_layout - -\begin_layout Plain Layout - -speex_encoder_destroy(enc_state); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -That's about it for the encoder. - -\end_layout - -\begin_layout Section -Decoding -\begin_inset CommandInset label -LatexCommand label -name "sub:Decoding" - -\end_inset - - -\end_layout - -\begin_layout Standard -In order to decode speech using Speex, you first need to: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -#include -\end_layout - -\end_inset - -You also need to declare a Speex bit-packing struct -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -SpeexBits bits; -\end_layout - -\end_inset - -and a Speex decoder state -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -void *dec_state; -\end_layout - -\end_inset - -The two are initialized by: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_bits_init(&bits); -\end_layout - -\begin_layout Plain Layout - -dec_state = speex_decoder_init(&speex_nb_mode); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -For wideband decoding, -\emph on -speex_nb_mode -\emph default - will be replaced by -\emph on -speex_wb_mode -\emph default -. - If you need to obtain the size of the frames that will be used by the decoder, - you can get that value in the -\emph on -frame_size -\emph default - variable (expressed in -\series bold -samples -\series default -, not bytes) with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -There is also a parameter that can be set for the decoder: whether or not - to use a perceptual enhancer. - This can be set by: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_decoder_ctl(dec_state, SPEEX_SET_ENH, &enh); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -where -\emph on -enh -\emph default - is an int with value 0 to have the enhancer disabled and 1 to have it enabled. - As of 1.2-beta1, the default is now to enable the enhancer. -\end_layout - -\begin_layout Standard -Again, once the decoder initialization is done, for every input frame: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_bits_read_from(&bits, input_bytes, nbBytes); -\end_layout - -\begin_layout Plain Layout - -speex_decode_int(dec_state, &bits, output_frame); -\end_layout - -\end_inset - -where input_bytes is a -\emph on -(char *) -\emph default - containing the bit-stream data received for a frame, -\emph on -nbBytes -\emph default - is the size (in bytes) of that bit-stream, and -\emph on -output_frame -\emph default - is a -\emph on -(short *) -\emph default - and points to the area where the decoded speech frame will be written. - A NULL value as the second argument indicates that we don't have the bits - for the current frame. - When a frame is lost, the Speex decoder will do its best to "guess" the - correct signal. -\end_layout - -\begin_layout Standard -As for the encoder, the -\emph on -speex_decode() -\emph default - function can still be used, with a -\emph on -(float *) -\emph default - as the output for the audio. - After you're done with the decoding, free all resources with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_bits_destroy(&bits); -\end_layout - -\begin_layout Plain Layout - -speex_decoder_destroy(dec_state); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Codec Options (speex_*_ctl) -\begin_inset CommandInset label -LatexCommand label -name "sub:Codec-Options" - -\end_inset - - -\end_layout - -\begin_layout Quote -\align center - -\emph on -Entities should not be multiplied beyond necessity -- William of Ockham. -\end_layout - -\begin_layout Quote -\align center - -\emph on -Just because there's an option for it doesn't mean you have to turn it on - -- me. -\end_layout - -\begin_layout Standard -The Speex encoder and decoder support many options and requests that can - be accessed through the -\emph on -speex_encoder_ctl -\emph default - and -\emph on -speex_decoder_ctl -\emph default - functions. - These functions are similar to the -\emph on -ioctl -\emph default - system call and their prototypes are: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -void speex_encoder_ctl(void *encoder, int request, void *ptr); -\end_layout - -\begin_layout Plain Layout - -void speex_decoder_ctl(void *encoder, int request, void *ptr); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Despite those functions, the defaults are usually good for many applications - and -\series bold -optional settings should only be used when one understands them and knows - that they are needed -\series default -. - A common error is to attempt to set many unnecessary settings. - -\end_layout - -\begin_layout Standard -Here is a list of the values allowed for the requests. - Some only apply to the encoder or the decoder. - Because the last argument is of type -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -void * -\end_layout - -\end_inset - -, the -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -_ctl() -\end_layout - -\end_inset - - functions are -\series bold -not type safe -\series default -, and should thus be used with care. - The type -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - is the same as the C99 -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -int32_t -\end_layout - -\end_inset - - type. -\end_layout - -\begin_layout Description -SPEEX_SET_ENH -\begin_inset Formula $\ddagger$ -\end_inset - - Set perceptual enhancer -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -perceptual enhancement -\end_layout - -\end_inset - - to on (1) or off (0) ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -, default is on) -\end_layout - -\begin_layout Description -SPEEX_GET_ENH -\begin_inset Formula $\ddagger$ -\end_inset - - Get perceptual enhancer status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_GET_FRAME_SIZE Get the number of samples per frame for the current - mode ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_SET_QUALITY -\begin_inset Formula $\dagger$ -\end_inset - - Set the encoder speech quality ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - from 0 to 10, default is 8) -\end_layout - -\begin_layout Description -SPEEX_GET_QUALITY -\begin_inset Formula $\dagger$ -\end_inset - - Get the current encoder speech quality ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - from 0 to 10) -\end_layout - -\begin_layout Description -SPEEX_SET_MODE -\begin_inset Formula $\dagger$ -\end_inset - - Set the mode number, as specified in the RTP spec ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_GET_MODE -\begin_inset Formula $\dagger$ -\end_inset - - Get the current mode number, as specified in the RTP spec ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_SET_VBR -\begin_inset Formula $\dagger$ -\end_inset - - Set variable bit-rate (VBR) to on (1) or off (0) ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -, default is off) -\end_layout - -\begin_layout Description -SPEEX_GET_VBR -\begin_inset Formula $\dagger$ -\end_inset - - Get variable bit-rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -variable bit-rate -\end_layout - -\end_inset - - (VBR) status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_SET_VBR_QUALITY -\begin_inset Formula $\dagger$ -\end_inset - - Set the encoder VBR speech quality (float 0.0 to 10.0, default is 8.0) -\end_layout - -\begin_layout Description -SPEEX_GET_VBR_QUALITY -\begin_inset Formula $\dagger$ -\end_inset - - Get the current encoder VBR speech quality (float 0 to 10) -\end_layout - -\begin_layout Description -SPEEX_SET_COMPLEXITY -\begin_inset Formula $\dagger$ -\end_inset - - Set the CPU resources allowed for the encoder ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - from 1 to 10, default is 2) -\end_layout - -\begin_layout Description -SPEEX_GET_COMPLEXITY -\begin_inset Formula $\dagger$ -\end_inset - - Get the CPU resources allowed for the encoder ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - from 1 to 10, default is 2) -\end_layout - -\begin_layout Description -SPEEX_SET_BITRATE -\begin_inset Formula $\dagger$ -\end_inset - - Set the bit-rate to use the closest value not exceeding the parameter ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in bits per second) -\end_layout - -\begin_layout Description -SPEEX_GET_BITRATE Get the current bit-rate in use ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in bits per second) -\end_layout - -\begin_layout Description -SPEEX_SET_SAMPLING_RATE Set real sampling rate ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in Hz) -\end_layout - -\begin_layout Description -SPEEX_GET_SAMPLING_RATE Get real sampling rate ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in Hz) -\end_layout - -\begin_layout Description -SPEEX_RESET_STATE Reset the encoder/decoder state to its original state, - clearing all memories (no argument) -\end_layout - -\begin_layout Description -SPEEX_SET_VAD -\begin_inset Formula $\dagger$ -\end_inset - - Set voice activity detection -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -voice activity detection -\end_layout - -\end_inset - - (VAD) to on (1) or off (0) ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -, default is off) -\end_layout - -\begin_layout Description -SPEEX_GET_VAD -\begin_inset Formula $\dagger$ -\end_inset - - Get voice activity detection (VAD) status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_SET_DTX -\begin_inset Formula $\dagger$ -\end_inset - - Set discontinuous transmission -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -discontinuous transmission -\end_layout - -\end_inset - - (DTX) to on (1) or off (0) ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -, default is off) -\end_layout - -\begin_layout Description -SPEEX_GET_DTX -\begin_inset Formula $\dagger$ -\end_inset - - Get discontinuous transmission (DTX) status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_SET_ABR -\begin_inset Formula $\dagger$ -\end_inset - - Set average bit-rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -average bit-rate -\end_layout - -\end_inset - - (ABR) to a value n in bits per second ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in bits per second) -\end_layout - -\begin_layout Description -SPEEX_GET_ABR -\begin_inset Formula $\dagger$ -\end_inset - - Get average bit-rate (ABR) setting ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in bits per second) -\end_layout - -\begin_layout Description -SPEEX_SET_PLC_TUNING -\begin_inset Formula $\dagger$ -\end_inset - - Tell the encoder to optimize encoding for a certain percentage of packet - loss ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in percent) -\end_layout - -\begin_layout Description -SPEEX_GET_PLC_TUNING -\begin_inset Formula $\dagger$ -\end_inset - - Get the current tuning of the encoder for PLC ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in percent) -\end_layout - -\begin_layout Description -SPEEX_GET_LOOKAHEAD Returns the lookahead used by Speex separately for an - encoder and a decoder. - Sum encoder and decoder lookahead values to get the total codec lookahead. -\end_layout - -\begin_layout Description -SPEEX_SET_VBR_MAX_BITRATE -\begin_inset Formula $\dagger$ -\end_inset - - Set the maximum bit-rate allowed in VBR operation ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in bits per second) -\end_layout - -\begin_layout Description -SPEEX_GET_VBR_MAX_BITRATE -\begin_inset Formula $\dagger$ -\end_inset - - Get the current maximum bit-rate allowed in VBR operation ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - - in bits per second) -\end_layout - -\begin_layout Description -SPEEX_SET_HIGHPASS Set the high-pass filter on (1) or off (0) ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -, default is on) -\end_layout - -\begin_layout Description -SPEEX_GET_HIGHPASS Get the current high-pass filter status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -\begin_inset Formula $\dagger$ -\end_inset - - applies only to the encoder -\end_layout - -\begin_layout Description -\begin_inset Formula $\ddagger$ -\end_inset - - applies only to the decoder -\end_layout - -\begin_layout Section -Mode queries -\begin_inset CommandInset label -LatexCommand label -name "sub:Mode-queries" - -\end_inset - - -\end_layout - -\begin_layout Standard -Speex modes have a query system similar to the speex_encoder_ctl and speex_decod -er_ctl calls. - Since modes are read-only, it is only possible to get information about - a particular mode. - The function used to do that is: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -void speex_mode_query(SpeexMode *mode, int request, void *ptr); -\end_layout - -\end_inset - -The admissible values for request are (unless otherwise note, the values - are returned through -\emph on -ptr -\emph default -): -\end_layout - -\begin_layout Description -SPEEX_MODE_FRAME_SIZE Get the frame size (in samples) for the mode -\end_layout - -\begin_layout Description -SPEEX_SUBMODE_BITRATE Get the bit-rate for a submode number specified through - -\emph on -ptr -\emph default - (integer in bps). - -\end_layout - -\begin_layout Section -Packing and in-band signalling -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -in-band signalling -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Sometimes it is desirable to pack more than one frame per packet (or other - basic unit of storage). - The proper way to do it is to call speex_encode -\begin_inset Formula $N$ -\end_inset - - times before writing the stream with speex_bits_write. - In cases where the number of frames is not determined by an out-of-band - mechanism, it is possible to include a terminator code. - That terminator consists of the code 15 (decimal) encoded with 5 bits, - as shown in Table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:quality_vs_bps" - -\end_inset - -. - Note that as of version 1.0.2, calling speex_bits_write automatically inserts - the terminator so as to fill the last byte. - This doesn't involves any overhead and makes sure Speex can always detect - when there is no more frame in a packet. -\end_layout - -\begin_layout Standard -It is also possible to send in-band -\begin_inset Quotes eld -\end_inset - -messages -\begin_inset Quotes erd -\end_inset - - to the other side. - All these messages are encoded as -\begin_inset Quotes eld -\end_inset - -pseudo-frames -\begin_inset Quotes erd -\end_inset - - of mode 14 which contain a 4-bit message type code, followed by the message. - Table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:In-band-signalling-codes" - -\end_inset - - lists the available codes, their meaning and the size of the message that - follows. - Most of these messages are requests that are sent to the encoder or decoder - on the other end, which is free to comply or ignore them. - By default, all in-band messages are ignored. -\end_layout - -\begin_layout Standard -\begin_inset Float table -placement htbp -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Code -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Size (bits) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Content -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks decoder to set perceptual enhancement off (0) or on(1) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks (if 1) the encoder to be less -\begin_inset Quotes eld -\end_inset - -aggressive -\begin_inset Quotes erd -\end_inset - - due to high packet loss -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks encoder to switch to mode N -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks encoder to switch to mode N for low-band -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks encoder to switch to mode N for high-band -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks encoder to switch to quality N for VBR -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Request acknowledge (0=no, 1=all, 2=only for in-band data) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Asks encoder to set CBR (0), VAD(1), DTX(3), VBR(5), VBR+DTX(7) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Transmit (8-bit) character to the other end -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Intensity stereo information -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -16 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Announce maximum bit-rate acceptable (N in bytes/second) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -11 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -16 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -32 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Acknowledge receiving packet N -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -13 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -32 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -14 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -64 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -15 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -64 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -In-band signalling codes -\begin_inset CommandInset label -LatexCommand label -name "cap:In-band-signalling-codes" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Finally, applications may define custom in-band messages using mode 13. - The size of the message in bytes is encoded with 5 bits, so that the decoder - can skip it if it doesn't know how to interpret it. -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Speech Processing API ( -\emph on -libspeexdsp -\emph default -) -\end_layout - -\begin_layout Standard -As of version 1.2beta3, the non-codec parts of the Speex package are now - in a separate library called -\emph on -libspeexdsp -\emph default -. - This library includes the preprocessor, the acoustic echo canceller, the - jitter buffer, and the resampler. - In a UNIX environment, it can be linked into a program by adding -\emph on --lspeexdsp -lm -\emph default - to the compiler command line. - Just like for libspeex, -\series bold -libspeexdsp calls are reentrant, but not thread-safe -\series default -. - That means that it is fine to use calls from many threads, but -\series bold -calls using the same state from multiple threads must be protected by mutexes -\series default -. -\end_layout - -\begin_layout Section -Preprocessor -\begin_inset CommandInset label -LatexCommand label -name "sub:Preprocessor" - -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent -In order to use the Speex preprocessor -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -preprocessor -\end_layout - -\end_inset - -, you first need to: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -#include -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent -Then, a preprocessor state can be created as: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -SpeexPreprocessState *preprocess_state = speex_preprocess_state_init(frame_size, - sampling_rate); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent -and it is recommended to use the same value for -\family typewriter -frame_size -\family default - as is used by the encoder (20 -\emph on -ms -\emph default -). -\end_layout - -\begin_layout Standard -For each input frame, you need to call: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_preprocess_run(preprocess_state, audio_frame); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent -where -\family typewriter -audio_frame -\family default - is used both as input and output. - In cases where the output audio is not useful for a certain frame, it is - possible to use instead: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_preprocess_estimate_update(preprocess_state, audio_frame); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent -This call will update all the preprocessor internal state variables without - computing the output audio, thus saving some CPU cycles. -\end_layout - -\begin_layout Standard -The behaviour of the preprocessor can be changed using: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_preprocess_ctl(preprocess_state, request, ptr); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\noindent -which is used in the same way as the encoder and decoder equivalent. - Options are listed in Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sub:Preprocessor-options" - -\end_inset - -. -\end_layout - -\begin_layout Standard -The preprocessor state can be destroyed using: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_preprocess_state_destroy(preprocess_state); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Preprocessor options -\begin_inset CommandInset label -LatexCommand label -name "sub:Preprocessor-options" - -\end_inset - - -\end_layout - -\begin_layout Standard -As with the codec, the preprocessor also has options that can be controlled - using an ioctl()-like call. - The available options are: -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_DENOISE Turns denoising on(1) or off(0) ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_DENOISE Get denoising status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_AGC Turns automatic gain control (AGC) on(1) or off(0) - ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_AGC Get AGC status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_VAD Turns voice activity detector (VAD) on(1) or off(0) - ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_VAD Get VAD status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_AGC_LEVEL -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_AGC_LEVEL -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_DEREVERB Turns reverberation removal on(1) or off(0) - ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_DEREVERB Get reverberation removal status ( -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_DEREVERB_LEVEL Not working yet, do not use -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_DEREVERB_LEVEL Not working yet, do not use -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_DEREVERB_DECAY Not working yet, do not use -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_DEREVERB_DECAY Not working yet, do not use -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_PROB_START -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_PROB_START -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_PROB_CONTINUE -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_PROB_CONTINUE -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_NOISE_SUPPRESS Set maximum attenuation of the noise - in dB (negative -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_NOISE_SUPPRESS Get maximum attenuation of the noise - in dB (negative -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_ECHO_SUPPRESS Set maximum attenuation of the residual - echo in dB (negative -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_ECHO_SUPPRESS Get maximum attenuation of the residual - echo in dB (negative -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE Set maximum attenuation of the - echo in dB when near end is active (negative -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE Get maximum attenuation of the - echo in dB when near end is active (negative -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -spx_int32_t -\end_layout - -\end_inset - -) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_SET_ECHO_STATE Set the associated echo canceller for residual - echo suppression (pointer or NULL for no residual echo suppression) -\end_layout - -\begin_layout Description -SPEEX_PREPROCESS_GET_ECHO_STATE Get the associated echo canceller (pointer) -\end_layout - -\begin_layout Section -Echo Cancellation -\begin_inset CommandInset label -LatexCommand label -name "sub:Echo-Cancellation" - -\end_inset - - -\end_layout - -\begin_layout Standard -The Speex library now includes an echo cancellation -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -echo cancellation -\end_layout - -\end_inset - - algorithm suitable for Acoustic Echo Cancellation -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -acoustic echo cancellation -\end_layout - -\end_inset - - (AEC). - In order to use the echo canceller, you first need to -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -#include -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Then, an echo canceller state can be created by: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -where -\family typewriter -frame_size -\family default - is the amount of data (in samples) you want to process at once and -\family typewriter -filter_length -\family default - is the length (in samples) of the echo cancelling filter you want to use - (also known as -\shape italic -tail length -\shape default - -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -tail length -\end_layout - -\end_inset - -). - It is recommended to use a frame size in the order of 20 ms (or equal to - the codec frame size) and make sure it is easy to perform an FFT of that - size (powers of two are better than prime sizes). - The recommended tail length is approximately the third of the room reverberatio -n time. - For example, in a small room, reverberation time is in the order of 300 - ms, so a tail length of 100 ms is a good choice (800 samples at 8000 Hz - sampling rate). -\end_layout - -\begin_layout Standard -Once the echo canceller state is created, audio can be processed by: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -where -\family typewriter -input_frame -\family default - is the audio as captured by the microphone, -\family typewriter -echo_frame -\family default - is the signal that was played in the speaker (and needs to be removed) - and -\family typewriter -output_frame -\family default - is the signal with echo removed. - -\end_layout - -\begin_layout Standard -One important thing to keep in mind is the relationship between -\family typewriter -input_frame -\family default - and -\family typewriter -echo_frame -\family default -. - It is important that, at any time, any echo that is present in the input - has already been sent to the echo canceller as -\family typewriter -echo_frame -\family default -. - In other words, the echo canceller cannot remove a signal that it hasn't - yet received. - On the other hand, the delay between the input signal and the echo signal - must be small enough because otherwise part of the echo cancellation filter - is inefficient. - In the ideal case, you code would look like: -\begin_inset listings -lstparams "breaklines=true" -inline false -status open - -\begin_layout Plain Layout - -write_to_soundcard(echo_frame, frame_size); -\end_layout - -\begin_layout Plain Layout - -read_from_soundcard(input_frame, frame_size); -\end_layout - -\begin_layout Plain Layout - -speex_echo_cancellation(echo_state, input_frame, echo_frame, output_frame); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -If you wish to further reduce the echo present in the signal, you can do - so by associating the echo canceller to the preprocessor (see Section -\begin_inset CommandInset ref -LatexCommand ref -reference "sub:Preprocessor" - -\end_inset - -). - This is done by calling: -\begin_inset listings -lstparams "breaklines=true" -inline false -status open - -\begin_layout Plain Layout - -speex_preprocess_ctl(preprocess_state, SPEEX_PREPROCESS_SET_ECHO_STATE,echo_stat -e); -\end_layout - -\end_inset - -in the initialisation. -\end_layout - -\begin_layout Standard -As of version 1.2-beta2, there is an alternative, simpler API that can be - used instead of -\emph on -speex_echo_cancellation() -\emph default -. - When audio capture and playback are handled asynchronously (e.g. - in different threads or using the -\emph on -poll() -\emph default - or -\emph on -select() -\emph default - system call), it can be difficult to keep track of what input_frame comes - with what echo_frame. - Instead, the playback context/thread can simply call: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_echo_playback(echo_state, echo_frame); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -every time an audio frame is played. - Then, the capture context/thread calls: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_echo_capture(echo_state, input_frame, output_frame); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -for every frame captured. - Internally, -\emph on -speex_echo_playback() -\emph default - simply buffers the playback frame so it can be used by -\emph on -speex_echo_capture() -\emph default - to call -\emph on -speex_echo_cancel() -\emph default -. - A side effect of using this alternate API is that the playback audio is - delayed by two frames, which is the normal delay caused by the soundcard. - When capture and playback are already synchronised, -\emph on -speex_echo_cancellation() -\emph default - is preferable since it gives better control on the exact input/echo timing. -\end_layout - -\begin_layout Standard -The echo cancellation state can be destroyed with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_echo_state_destroy(echo_state); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -It is also possible to reset the state of the echo canceller so it can be - reused without the need to create another state with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -speex_echo_state_reset(echo_state); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Troubleshooting -\end_layout - -\begin_layout Standard -There are several things that may prevent the echo canceller from working - properly. - One of them is a bug (or something suboptimal) in the code, but there are - many others you should consider first -\end_layout - -\begin_layout Itemize -Using a different soundcard to do the capture and plaback will -\series bold -not -\series default - work, regardless of what you may think. - The only exception to that is if the two cards can be made to have their - sampling clock -\begin_inset Quotes eld -\end_inset - -locked -\begin_inset Quotes erd -\end_inset - - on the same clock source. - If not, the clocks will always have a small amount of drift, which will - prevent the echo canceller from adapting. -\end_layout - -\begin_layout Itemize -The delay between the record and playback signals must be minimal. - Any signal played has to -\begin_inset Quotes eld -\end_inset - -appear -\begin_inset Quotes erd -\end_inset - - on the playback (far end) signal slightly before the echo canceller -\begin_inset Quotes eld -\end_inset - -sees -\begin_inset Quotes erd -\end_inset - - it in the near end signal, but excessive delay means that part of the filter - length is wasted. - In the worst situations, the delay is such that it is longer than the filter - length, in which case, no echo can be cancelled. -\end_layout - -\begin_layout Itemize -When it comes to echo tail length (filter length), longer is -\series bold -not -\series default - better. - Actually, the longer the tail length, the longer it takes for the filter - to adapt. - Of course, a tail length that is too short will not cancel enough echo, - but the most common problem seen is that people set a very long tail length - and then wonder why no echo is being cancelled. -\end_layout - -\begin_layout Itemize -Non-linear distortion cannot (by definition) be modeled by the linear adaptive - filter used in the echo canceller and thus cannot be cancelled. - Use good audio gear and avoid saturation/clipping. -\end_layout - -\begin_layout Standard -Also useful is reading -\emph on -Echo Cancellation Demystified -\emph default - by Alexey Frunze -\begin_inset Foot -status collapsed - -\begin_layout Plain Layout -http://www.embeddedstar.com/articles/2003/7/article20030720-1.html -\end_layout - -\end_inset - -, which explains the fundamental principles of echo cancellation. - The details of the algorithm described in the article are different, but - the general ideas of echo cancellation through adaptive filters are the - same. -\end_layout - -\begin_layout Standard -As of version 1.2beta2, a new -\family typewriter -echo_diagnostic.m -\family default - tool is included in the source distribution. - The first step is to define DUMP_ECHO_CANCEL_DATA during the build. - This causes the echo canceller to automatically save the near-end, far-end - and output signals to files (aec_rec.sw aec_play.sw and aec_out.sw). - These are exactly what the AEC receives and outputs. - From there, it is necessary to start Octave and type: -\end_layout - -\begin_layout Standard -\begin_inset listings -lstparams "language=Matlab" -inline false -status open - -\begin_layout Plain Layout - -echo_diagnostic('aec_rec.sw', 'aec_play.sw', 'aec_diagnostic.sw', 1024); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The value of 1024 is the filter length and can be changed. - There will be some (hopefully) useful messages printed and echo cancelled - audio will be saved to aec_diagnostic.sw . - If even that output is bad (almost no cancellation) then there is probably - problem with the playback or recording process. -\end_layout - -\begin_layout Section -Jitter Buffer -\end_layout - -\begin_layout Standard -The jitter buffer can be enabled by including: -\begin_inset listings -lstparams "breaklines=true" -inline false -status open - -\begin_layout Plain Layout - -#include -\end_layout - -\end_inset - - and a new jitter buffer state can be initialised by: -\end_layout - -\begin_layout Standard -\begin_inset listings -lstparams "breaklines=true" -inline false -status open - -\begin_layout Plain Layout - -JitterBuffer *state = jitter_buffer_init(step); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -where the -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -step -\end_layout - -\end_inset - - argument is the default time step (in timestamp units) used for adjusting - the delay and doing concealment. - A value of 1 is always correct, but higher values may be more convenient - sometimes. - For example, if you are only able to do concealment on 20ms frames, there - is no point in the jitter buffer asking you to do it on one sample. - Another example is that for video, it makes no sense to adjust the delay - by less than a full frame. - The value provided can always be changed at a later time. -\end_layout - -\begin_layout Standard -The jitter buffer API is based on the -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -JitterBufferPacket -\end_layout - -\end_inset - - type, which is defined as: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -typedef struct { -\end_layout - -\begin_layout Plain Layout - - char *data; /* Data bytes contained in the packet */ -\end_layout - -\begin_layout Plain Layout - - spx_uint32_t len; /* Length of the packet in bytes */ -\end_layout - -\begin_layout Plain Layout - - spx_uint32_t timestamp; /* Timestamp for the packet */ -\end_layout - -\begin_layout Plain Layout - - spx_uint32_t span; /* Time covered by the packet (timestamp units) - */ -\end_layout - -\begin_layout Plain Layout - -} JitterBufferPacket; -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -As an example, for audio the timestamp field would be what is obtained from - the RTP timestamp field and the span would be the number of samples that - are encoded in the packet. - For Speex narrowband, span would be 160 if only one frame is included in - the packet. - -\end_layout - -\begin_layout Standard -When a packet arrives, it need to be inserter into the jitter buffer by: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -JitterBufferPacket packet; -\end_layout - -\begin_layout Plain Layout - -/* Fill in each field in the packet struct */ -\end_layout - -\begin_layout Plain Layout - -jitter_buffer_put(state, &packet); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -When the decoder is ready to decode a packet the packet to be decoded can - be obtained by: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -int start_offset; -\end_layout - -\begin_layout Plain Layout - -err = jitter_buffer_get(state, &packet, desired_span, &start_offset); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -If -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -jitter_buffer_put() -\end_layout - -\end_inset - - and -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -jitter_buffer_get() -\end_layout - -\end_inset - - are called from different threads, then -\series bold -you need to protect the jitter buffer state with a mutex -\series default -. - -\end_layout - -\begin_layout Standard -Because the jitter buffer is designed not to use an explicit timer, it needs - to be told about the time explicitly. - This is done by calling: -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -jitter_buffer_tick(state); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -This needs to be done periodically in the playing thread. - This will be the last jitter buffer call before going to sleep (until more - data is played back). - In some cases, it may be preferable to use -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -jitter_buffer_remaining_span(state, remaining); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The second argument is used to specify that we are still holding data that - has not been written to the playback device. - For instance, if 256 samples were needed by the soundcard (specified by - -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -desired_span -\end_layout - -\end_inset - -), but -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -jitter_buffer_get() -\end_layout - -\end_inset - - returned 320 samples, we would have -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -remaining=64 -\end_layout - -\end_inset - -. -\end_layout - -\begin_layout Section -Resampler -\end_layout - -\begin_layout Standard -Speex includes a resampling modules. - To make use of the resampler, it is necessary to include its header file: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -#include -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -For each stream that is to be resampled, it is necessary to create a resampler - state with: -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -SpeexResamplerState *resampler; -\end_layout - -\begin_layout Plain Layout - -resampler = speex_resampler_init(nb_channels, input_rate, output_rate, quality, - &err); -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -where -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -nb_channels -\end_layout - -\end_inset - - is the number of channels that will be used (either interleaved or non-interlea -ved), -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -input_rate -\end_layout - -\end_inset - - is the sampling rate of the input stream, -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -output_rate -\end_layout - -\end_inset - - is the sampling rate of the output stream and -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -quality -\end_layout - -\end_inset - - is the requested quality setting (0 to 10). - The quality parameter is useful for controlling the quality/complexity/latency - tradeoff. - Using a higher quality setting means less noise/aliasing, a higher complexity - and a higher latency. - Usually, a quality of 3 is acceptable for most desktop uses and quality - 10 is mostly recommended for pro audio work. - Quality 0 usually has a decent sound (certainly better than using linear - interpolation resampling), but artifacts may be heard. -\end_layout - -\begin_layout Standard -The actual resampling is performed using -\end_layout - -\begin_layout Standard -\begin_inset listings -inline false -status open - -\begin_layout Plain Layout - -err = speex_resampler_process_int(resampler, channelID, in, &in_length, - out, &out_length); -\end_layout - -\end_inset - -where -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -channelID -\end_layout - -\end_inset - - is the ID of the channel to be processed. - For a mono stream, use 0. - The -\emph on -in -\emph default - pointer points to the first sample of the input buffer for the selected - channel and -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -out -\end_layout - -\end_inset - - points to the first sample of the output. - The size of the input and output buffers are specified by -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -in_length -\end_layout - -\end_inset - - and -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -out_length -\end_layout - -\end_inset - - respectively. - Upon completion, these values are replaced by the number of samples read - and written by the resampler. - Unless an error occurs, either all input samples will be read or all output - samples will be written to (or both). - For floating-point samples, the function -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_process_float() -\end_layout - -\end_inset - - behaves similarly. -\end_layout - -\begin_layout Standard -It is also possible to process multiple channels at once. - To do that, you can use speex_resampler_process_interleaved_int() or -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_process_interleaved_float() -\end_layout - -\end_inset - -. - The arguments are the same except that there is no -\begin_inset listings -inline true -status collapsed - -\begin_layout Plain Layout - -channelID -\end_layout - -\end_inset - - argument. - Note that the -\series bold -length parameters are per-channel -\series default -. - So if you have 1024 samples for each of 4 channels, you pass 1024 and not - 4096. -\end_layout - -\begin_layout Standard -The resampler allows changing the quality and input/output sampling frequencies - on the fly without glitches. - This can be done with calls such as -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_set_quality() -\end_layout - -\end_inset - - and -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_set_rate() -\end_layout - -\end_inset - -. - The only side effect is that a new filter will have to be recomputed, consuming - many CPU cycles. - -\end_layout - -\begin_layout Standard -When resampling a file, it is often desirable to have the output file perfectly - synchronised with the input. - To do that, you need to call -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_skip_zeros() -\end_layout - -\end_inset - - -\series bold -before -\series default - you start processing any samples. - For real-time applications (e.g. - VoIP), it is not recommended to do that as the first process frame will - be shorter to compensate for the delay (the skipped zeros). - Instead, in real-time applications you may want to know how many delay - is introduced by the resampler. - This can be done at run-time with -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_get_input_latency() -\end_layout - -\end_inset - - and -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_get_output_latency() -\end_layout - -\end_inset - - functions. - First function returns delay measured in samples at input samplerate, while - second returns delay measured in samples at output samplerate. -\end_layout - -\begin_layout Standard -To destroy a resampler state, just call -\begin_inset listings -inline true -status open - -\begin_layout Plain Layout - -speex_resampler_destroy() -\end_layout - -\end_inset - -. -\end_layout - -\begin_layout Section -Ring Buffer -\end_layout - -\begin_layout Standard -In some cases, it is necessary to interface components that use different - block sizes. - For example, it is possible that the soundcard does not support reading/writing - in blocks of 20 -\begin_inset space ~ -\end_inset - -ms or sometimes, complicated resampling ratios mean that the blocks don't - always have the same time. - In thoses cases, it is often necessary to buffer a bit of audio using a - ring buffer. -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Formats and standards -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -standards -\end_layout - -\end_inset - - -\begin_inset CommandInset label -LatexCommand label -name "sec:Formats-and-standards" - -\end_inset - - -\end_layout - -\begin_layout Standard -Speex can encode speech in both narrowband and wideband and provides different - bit-rates. - However, not all features need to be supported by a certain implementation - or device. - In order to be called -\begin_inset Quotes eld -\end_inset - -Speex compatible -\begin_inset Quotes erd -\end_inset - - (whatever that means), an implementation must implement at least a basic - set of features. -\end_layout - -\begin_layout Standard -At the minimum, all narrowband modes of operation MUST be supported at the - decoder. - This includes the decoding of a wideband bit-stream by the narrowband decoder -\begin_inset Foot -status collapsed - -\begin_layout Plain Layout -The wideband bit-stream contains an embedded narrowband bit-stream which - can be decoded alone -\end_layout - -\end_inset - -. - If present, a wideband decoder MUST be able to decode a narrowband stream, - and MAY either be able to decode all wideband modes or be able to decode - the embedded narrowband part of all modes (which includes ignoring the - high-band bits). -\end_layout - -\begin_layout Standard -For encoders, at least one narrowband or wideband mode MUST be supported. - The main reason why all encoding modes do not have to be supported is that - some platforms may not be able to handle the complexity of encoding in - some modes. -\end_layout - -\begin_layout Section -RTP -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -RTP -\end_layout - -\end_inset - - Payload Format -\end_layout - -\begin_layout Standard -The RTP payload draft is included in appendix -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:IETF-draft" - -\end_inset - - and the latest version is available at -\begin_inset Flex URL -status collapsed - -\begin_layout Plain Layout - -http://www.speex.org/drafts/latest -\end_layout - -\end_inset - -. - This draft has been sent (2003/02/26) to the Internet Engineering Task - Force (IETF) and will be discussed at the March 18th meeting in San Francisco. - -\end_layout - -\begin_layout Section -MIME Type -\end_layout - -\begin_layout Standard -For now, you should use the MIME type audio/x-speex for Speex-in-Ogg. - We will apply for type -\family typewriter -audio/speex -\family default - in the near future. -\end_layout - -\begin_layout Section -Ogg -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -Ogg -\end_layout - -\end_inset - - file format -\end_layout - -\begin_layout Standard -Speex bit-streams can be stored in Ogg files. - In this case, the first packet of the Ogg file contains the Speex header - described in table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:ogg_speex_header" - -\end_inset - -. - All integer fields in the headers are stored as little-endian. - The -\family typewriter -speex_string -\family default - field must contain the -\begin_inset Quotes eld -\end_inset - - -\family typewriter -Speex -\family default - -\begin_inset space ~ -\end_inset - - -\begin_inset space ~ -\end_inset - - -\begin_inset space ~ -\end_inset - - -\begin_inset Quotes erd -\end_inset - - (with 3 trailing spaces), which identifies the bit-stream. - The next field, -\family typewriter -speex_version -\family default - contains the version of Speex that encoded the file. - For now, refer to speex_header.[ch] for more info. - The -\emph on -beginning of stream -\emph default - ( -\family typewriter -b_o_s -\family default -) flag is set to 1 for the header. - The header packet has -\family typewriter -packetno=0 -\family default - and -\family typewriter -granulepos=0 -\family default -. -\end_layout - -\begin_layout Standard -The second packet contains the Speex comment header. - The format used is the Vorbis comment format described here: http://www.xiph.org/ -ogg/vorbis/doc/v-comment.html . - This packet has -\family typewriter -packetno=1 -\family default - and -\family typewriter -granulepos=0 -\family default -. -\end_layout - -\begin_layout Standard -The third and subsequent packets each contain one or more (number found - in header) Speex frames. - These are identified with -\family typewriter -packetno -\family default - starting from 2 and the -\family typewriter -granulepos -\family default - is the number of the last sample encoded in that packet. - The last of these packets has the -\emph on -end of stream -\emph default - ( -\family typewriter -e_o_s -\family default -) flag is set to 1. -\end_layout - -\begin_layout Standard -\begin_inset Float table -placement htbp -wide true -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Field -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Type -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Size -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -speex_string -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -char[] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -speex_version -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -char[] -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -20 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -speex_version_id -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -header_size -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -rate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -mode -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -mode_bitstream_version -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -nb_channels -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -bitrate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -frame_size -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -vbr -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -frames_per_packet -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -extra_headers -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -reserved1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -reserved2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -int -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Ogg/Speex header packet -\begin_inset CommandInset label -LatexCommand label -name "cap:ogg_speex_header" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -clearpage -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Chapter -Introduction to CELP Coding -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -CELP -\end_layout - -\end_inset - - -\begin_inset CommandInset label -LatexCommand label -name "sec:Introduction-to-CELP" - -\end_inset - - -\end_layout - -\begin_layout Quote -\align center - -\emph on -Do not meddle in the affairs of poles, for they are subtle and quick to - leave the unit circle. -\end_layout - -\begin_layout Standard -Speex is based on CELP, which stands for Code Excited Linear Prediction. - This section attempts to introduce the principles behind CELP, so if you - are already familiar with CELP, you can safely skip to section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Speex-narrowband-mode" - -\end_inset - -. - The CELP technique is based on three ideas: -\end_layout - -\begin_layout Enumerate -The use of a linear prediction (LP) model to model the vocal tract -\end_layout - -\begin_layout Enumerate -The use of (adaptive and fixed) codebook entries as input (excitation) of - the LP model -\end_layout - -\begin_layout Enumerate -The search performed in closed-loop in a -\begin_inset Quotes eld -\end_inset - -perceptually weighted domain -\begin_inset Quotes erd -\end_inset - - -\end_layout - -\begin_layout Standard -This section describes the basic ideas behind CELP. - This is still a work in progress. -\end_layout - -\begin_layout Section -Source-Filter Model of Speech Prediction -\end_layout - -\begin_layout Standard -The source-filter model of speech production assumes that the vocal cords - are the source of spectrally flat sound (the excitation signal), and that - the vocal tract acts as a filter to spectrally shape the various sounds - of speech. - While still an approximation, the model is widely used in speech coding - because of its simplicity.Its use is also the reason why most speech codecs - (Speex included) perform badly on music signals. - The different phonemes can be distinguished by their excitation (source) - and spectral shape (filter). - Voiced sounds (e.g. - vowels) have an excitation signal that is periodic and that can be approximated - by an impulse train in the time domain or by regularly-spaced harmonics - in the frequency domain. - On the other hand, fricatives (such as the "s", "sh" and "f" sounds) have - an excitation signal that is similar to white Gaussian noise. - So called voice fricatives (such as "z" and "v") have excitation signal - composed of an harmonic part and a noisy part. -\end_layout - -\begin_layout Standard -The source-filter model is usually tied with the use of Linear prediction. - The CELP model is based on source-filter model, as can be seen from the - CELP decoder illustrated in Figure -\begin_inset CommandInset ref -LatexCommand ref -reference "fig:The-CELP-model" - -\end_inset - -. - -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Graphics - filename celp_decoder.eps - width 45page% - keepAspectRatio - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -The CELP model of speech synthesis (decoder) -\begin_inset CommandInset label -LatexCommand label -name "fig:The-CELP-model" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Linear Prediction Coefficients (LPC) -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -linear prediction -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Linear prediction is at the base of many speech coding techniques, including - CELP. - The idea behind it is to predict the signal -\begin_inset Formula $x[n]$ -\end_inset - - using a linear combination of its past samples: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -y[n]=\sum_{i=1}^{N}a_{i}x[n-i]\] - -\end_inset - -where -\begin_inset Formula $y[n]$ -\end_inset - - is the linear prediction of -\begin_inset Formula $x[n]$ -\end_inset - -. - The prediction error is thus given by: -\begin_inset Formula \[ -e[n]=x[n]-y[n]=x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\] - -\end_inset - - -\end_layout - -\begin_layout Standard -The goal of the LPC analysis is to find the best prediction coefficients - -\begin_inset Formula $a_{i}$ -\end_inset - - which minimize the quadratic error function: -\begin_inset Formula \[ -E=\sum_{n=0}^{L-1}\left[e[n]\right]^{2}=\sum_{n=0}^{L-1}\left[x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\right]^{2}\] - -\end_inset - -That can be done by making all derivatives -\begin_inset Formula $\frac{\partial E}{\partial a_{i}}$ -\end_inset - - equal to zero: -\begin_inset Formula \[ -\frac{\partial E}{\partial a_{i}}=\frac{\partial}{\partial a_{i}}\sum_{n=0}^{L-1}\left[x[n]-\sum_{i=1}^{N}a_{i}x[n-i]\right]^{2}=0\] - -\end_inset - - -\end_layout - -\begin_layout Standard -For an order -\begin_inset Formula $N$ -\end_inset - - filter, the filter coefficients -\begin_inset Formula $a_{i}$ -\end_inset - - are found by solving the system -\begin_inset Formula $N\times N$ -\end_inset - - linear system -\begin_inset Formula $\mathbf{Ra}=\mathbf{r}$ -\end_inset - -, where -\begin_inset Formula \[ -\mathbf{R}=\left[\begin{array}{cccc} -R(0) & R(1) & \cdots & R(N-1)\\ -R(1) & R(0) & \cdots & R(N-2)\\ -\vdots & \vdots & \ddots & \vdots\\ -R(N-1) & R(N-2) & \cdots & R(0)\end{array}\right]\] - -\end_inset - - -\begin_inset Formula \[ -\mathbf{r}=\left[\begin{array}{c} -R(1)\\ -R(2)\\ -\vdots\\ -R(N)\end{array}\right]\] - -\end_inset - -with -\begin_inset Formula $R(m)$ -\end_inset - -, the auto-correlation -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -auto-correlation -\end_layout - -\end_inset - - of the signal -\begin_inset Formula $x[n]$ -\end_inset - -, computed as: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -R(m)=\sum_{i=0}^{N-1}x[i]x[i-m]\] - -\end_inset - - -\end_layout - -\begin_layout Standard -Because -\begin_inset Formula $\mathbf{R}$ -\end_inset - - is Hermitian Toeplitz, the Levinson-Durbin -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -Levinson-Durbin -\end_layout - -\end_inset - - algorithm can be used, making the solution to the problem -\begin_inset Formula $\mathcal{O}\left(N^{2}\right)$ -\end_inset - - instead of -\begin_inset Formula $\mathcal{O}\left(N^{3}\right)$ -\end_inset - -. - Also, it can be proven that all the roots of -\begin_inset Formula $A(z)$ -\end_inset - - are within the unit circle, which means that -\begin_inset Formula $1/A(z)$ -\end_inset - - is always stable. - This is in theory; in practice because of finite precision, there are two - commonly used techniques to make sure we have a stable filter. - First, we multiply -\begin_inset Formula $R(0)$ -\end_inset - - by a number slightly above one (such as 1.0001), which is equivalent to - adding noise to the signal. - Also, we can apply a window to the auto-correlation, which is equivalent - to filtering in the frequency domain, reducing sharp resonances. -\end_layout - -\begin_layout Section -Pitch Prediction -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -pitch -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -During voiced segments, the speech signal is periodic, so it is possible - to take advantage of that property by approximating the excitation signal - -\begin_inset Formula $e[n]$ -\end_inset - - by a gain times the past of the excitation: -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -e[n]\simeq p[n]=\beta e[n-T]\ ,\] - -\end_inset - -where -\begin_inset Formula $T$ -\end_inset - - is the pitch period, -\begin_inset Formula $\beta$ -\end_inset - - is the pitch gain. - We call that long-term prediction since the excitation is predicted from - -\begin_inset Formula $e[n-T]$ -\end_inset - - with -\begin_inset Formula $T\gg N$ -\end_inset - -. -\end_layout - -\begin_layout Section -Innovation Codebook -\end_layout - -\begin_layout Standard -The final excitation -\begin_inset Formula $e[n]$ -\end_inset - - will be the sum of the pitch prediction and an -\emph on -innovation -\emph default - signal -\begin_inset Formula $c[n]$ -\end_inset - - taken from a fixed codebook, hence the name -\emph on -Code -\emph default - Excited Linear Prediction. - The final excitation is given by -\end_layout - -\begin_layout Standard -\begin_inset Formula \[ -e[n]=p[n]+c[n]=\beta e[n-T]+c[n]\ .\] - -\end_inset - -The quantization of -\begin_inset Formula $c[n]$ -\end_inset - - is where most of the bits in a CELP codec are allocated. - It represents the information that couldn't be obtained either from linear - prediction or pitch prediction. - In the -\emph on -z -\emph default --domain we can represent the final signal -\begin_inset Formula $X(z)$ -\end_inset - - as -\begin_inset Formula \[ -X(z)=\frac{C(z)}{A(z)\left(1-\beta z^{-T}\right)}\] - -\end_inset - - -\end_layout - -\begin_layout Section -Noise Weighting -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -error weighting -\end_layout - -\end_inset - - -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -analysis-by-synthesis -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -Most (if not all) modern audio codecs attempt to -\begin_inset Quotes eld -\end_inset - -shape -\begin_inset Quotes erd -\end_inset - - the noise so that it appears mostly in the frequency regions where the - ear cannot detect it. - For example, the ear is more tolerant to noise in parts of the spectrum - that are louder and -\emph on -vice versa -\emph default -. - In order to maximize speech quality, CELP codecs minimize the mean square - of the error (noise) in the perceptually weighted domain. - This means that a perceptual noise weighting filter -\begin_inset Formula $W(z)$ -\end_inset - - is applied to the error signal in the encoder. - In most CELP codecs, -\begin_inset Formula $W(z)$ -\end_inset - - is a pole-zero weighting filter derived from the linear prediction coefficients - (LPC), generally using bandwidth expansion. - Let the spectral envelope be represented by the synthesis filter -\begin_inset Formula $1/A(z)$ -\end_inset - -, CELP codecs typically derive the noise weighting filter as -\begin_inset Formula \begin{equation} -W(z)=\frac{A(z/\gamma_{1})}{A(z/\gamma_{2})}\ ,\label{eq:gamma-weighting}\end{equation} - -\end_inset - -where -\begin_inset Formula $\gamma_{1}=0.9$ -\end_inset - - and -\begin_inset Formula $\gamma_{2}=0.6$ -\end_inset - - in the Speex reference implementation. - If a filter -\begin_inset Formula $A(z)$ -\end_inset - - has (complex) poles at -\begin_inset Formula $p_{i}$ -\end_inset - - in the -\begin_inset Formula $z$ -\end_inset - --plane, the filter -\begin_inset Formula $A(z/\gamma)$ -\end_inset - - will have its poles at -\begin_inset Formula $p'_{i}=\gamma p_{i}$ -\end_inset - -, making it a flatter version of -\begin_inset Formula $A(z)$ -\end_inset - -. -\end_layout - -\begin_layout Standard -The weighting filter is applied to the error signal used to optimize the - codebook search through analysis-by-synthesis (AbS). - This results in a spectral shape of the noise that tends towards -\begin_inset Formula $1/W(z)$ -\end_inset - -. - While the simplicity of the model has been an important reason for the - success of CELP, it remains that -\begin_inset Formula $W(z)$ -\end_inset - - is a very rough approximation for the perceptually optimal noise weighting - function. - Fig. - -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:Standard-noise-shaping" - -\end_inset - - illustrates the noise shaping that results from Eq. - -\begin_inset CommandInset ref -LatexCommand ref -reference "eq:gamma-weighting" - -\end_inset - -. - Throughout this paper, we refer to -\begin_inset Formula $W(z)$ -\end_inset - - as the noise weighting filter and to -\begin_inset Formula $1/W(z)$ -\end_inset - - as the noise shaping filter (or curve). -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Graphics - filename ref_shaping.eps - width 45page% - keepAspectRatio - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Standard noise shaping in CELP. - Arbitrary y-axis offset. -\begin_inset CommandInset label -LatexCommand label -name "cap:Standard-noise-shaping" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Analysis-by-Synthesis -\end_layout - -\begin_layout Standard -One of the main principles behind CELP is called Analysis-by-Synthesis (AbS), - meaning that the encoding (analysis) is performed by perceptually optimising - the decoded (synthesis) signal in a closed loop. - In theory, the best CELP stream would be produced by trying all possible - bit combinations and selecting the one that produces the best-sounding - decoded signal. - This is obviously not possible in practice for two reasons: the required - complexity is beyond any currently available hardware and the -\begin_inset Quotes eld -\end_inset - -best sounding -\begin_inset Quotes erd -\end_inset - - selection criterion implies a human listener. - -\end_layout - -\begin_layout Standard -In order to achieve real-time encoding using limited computing resources, - the CELP optimisation is broken down into smaller, more manageable, sequential - searches using the perceptual weighting function described earlier. -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -The Speex Decoder Specification -\end_layout - -\begin_layout Section -Narrowband decoder -\end_layout - -\begin_layout Standard - -\end_layout - -\begin_layout Subsection -Narrowband modes -\end_layout - -\begin_layout Standard -There are 7 different narrowband bit-rates defined for Speex, ranging from - 250 bps to 24.6 kbps, although the modes below 5.9 kbps should not be used - for speech. - The bit-allocation for each mode is detailed in table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:bits-narrowband" - -\end_inset - -. - Each frame starts with the mode ID encoded with 4 bits which allows a range - from 0 to 15, though only the first 7 values are used (the others are reserved). - The parameters are listed in the table in the order they are packed in - the bit-stream. - All frame-based parameters are packed before sub-frame parameters. - The parameters for a certain sub-frame are all packed before the following - sub-frame is packed. - The -\begin_inset Quotes eld -\end_inset - -OL -\begin_inset Quotes erd -\end_inset - - in the parameter description means that the parameter is an open loop estimatio -n based on the whole frame. -\end_layout - -\begin_layout Standard -\begin_inset Float table -placement h -wide true -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Tabular - - - - - - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Parameter -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Update rate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Wideband bit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mode ID -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -LSP -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -18 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -18 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -18 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -18 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -30 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -30 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -30 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -18 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -OL pitch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -OL pitch gain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -OL Exc gain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Fine pitch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -sub-frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Pitch gain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -sub-frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Innovation gain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -sub-frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Innovation VQ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -sub-frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -16 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -20 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -35 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -48 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -64 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -96 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Total -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -43 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -119 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -160 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -220 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -300 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -364 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -492 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -79 -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Bit allocation for narrowband modes -\begin_inset CommandInset label -LatexCommand label -name "cap:bits-narrowband" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -LSP decoding -\end_layout - -\begin_layout Standard -Depending on the mode, LSP parameters are encoded using either 18 bits or - 30 bits. -\end_layout - -\begin_layout Standard -Interpolation -\end_layout - -\begin_layout Standard -Safe margin -\end_layout - -\begin_layout Subsection -Adaptive codebook -\end_layout - -\begin_layout Standard -For rates of 8 kbit/s and above, the pitch period is encoded for each subframe. - The real period is -\begin_inset Formula $T=p_{i}+17$ -\end_inset - - where -\begin_inset Formula $p_{i}$ -\end_inset - - is a value encoded with 7 bits and 17 corresponds to the minimum pitch. - The maximum period is 144. - At 5.95 kbit/s (mode 2), the pitch period is similarly encoded, but only - once for the frame. - Each sub-frame then has a 2-bit offset that is added to the pitch value - of the frame. - In that case, the pitch for each sub-frame is equal to -\begin_inset Formula $T-1+offset$ -\end_inset - -. - For rates below 5.95 kbit/s, only the per-frame pitch is used and the pitch - is constant for all sub-frames. -\end_layout - -\begin_layout Standard -Speex uses a 3-tap predictor for rates of 5.95 kbit/s and above. - The three gain values are obtained from a 5-bit or a 7-bit codebook, depending - on the mode. - -\end_layout - -\begin_layout Subsection -Innovation codebook -\end_layout - -\begin_layout Standard -Split codebook, size and entries depend on bit-rate -\end_layout - -\begin_layout Standard -a 5-bit gain is encoder on a per-frame basis -\end_layout - -\begin_layout Standard -Depending on the mode, higher resolution per sub-frame -\end_layout - -\begin_layout Standard -innovation sub-vectors concatenated, gain applied -\end_layout - -\begin_layout Subsection -Perceptual enhancement -\end_layout - -\begin_layout Standard -Optional, implementation-defined. - -\end_layout - -\begin_layout Subsection -Bit-stream definition -\end_layout - -\begin_layout Standard -This section defines the bit-stream that is transmitted on the wire. - One speex packet consist of 1 frame header and 4 sub-frames: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Frame Header -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Subframe 1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Subframe2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Subframe 3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Subframe 4 -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -The frame header is variable length, depending on decoding mode and submode. - The narrowband frame header is defined as follows: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -wb bit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -modeid -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -LSP -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -OL-pitch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -OL-pitchgain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -OL ExcGain -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -wb-bit: Wideband bit (1 bit) 0=narrowband, 1=wideband -\end_layout - -\begin_layout Standard -modeid: Mode identifier (4 bits) -\end_layout - -\begin_layout Standard -LSP: Line Spectral Pairs (0, 18 or 30 bits) -\end_layout - -\begin_layout Standard -OL-pitch: Open Loop Pitch (0 or 7 bits) -\end_layout - -\begin_layout Standard -OL-pitchgain: Open Loop Pitch Gain (0 or 4 bits) -\end_layout - -\begin_layout Standard -OL-ExcGain: Open Loop Excitation Gain (0 or 5 bits) -\end_layout - -\begin_layout Standard -... -\end_layout - -\begin_layout Standard -Each subframe is defined as follows: -\end_layout - -\begin_layout Standard -\begin_inset Tabular - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -FinePitch -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -PitchGain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -InnovationGain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Innovation VQ -\end_layout - -\end_inset - - - - -\end_inset - - -\end_layout - -\begin_layout Standard -FinePitch: (0 or 7 bits) -\end_layout - -\begin_layout Standard -PitchGain: (0, 5, or 7 bits) -\end_layout - -\begin_layout Standard -Innovation Gain: (0, 1, 3 bits) -\end_layout - -\begin_layout Standard -Innovation VQ: (0-96 bits) -\end_layout - -\begin_layout Standard -... -\end_layout - -\begin_layout Subsection -Sample decoder -\end_layout - -\begin_layout Standard -This section contains some sample source code, showing how a basic Speex - decoder can be implemented. - The sample decoder is narrowband submode 3 only, and with no advanced features - like enhancement, vbr etc. -\end_layout - -\begin_layout Standard -... -\end_layout - -\begin_layout Subsection -Lookup tables -\end_layout - -\begin_layout Standard -The Speex decoder includes a set of lookup tables and codebooks, which are - used to convert between values of different domains. - This includes: -\end_layout - -\begin_layout Standard -- Excitation 10x16 (3200 bps) -\end_layout - -\begin_layout Standard -- Excitation 10x32 (4000 bps) -\end_layout - -\begin_layout Standard -- Excitation 20x32 (2000 bps) -\end_layout - -\begin_layout Standard -- Excitation 5x256 (12800 bps) -\end_layout - -\begin_layout Standard -- Excitation 5x64 (9600 bps) -\end_layout - -\begin_layout Standard -- Excitation 8x128 (7000 bps) -\end_layout - -\begin_layout Standard -- Codebook for 3-tap pitch prediction gain (Normal and Low Bitrate) -\end_layout - -\begin_layout Standard -- Codebook for LSPs in narrowband CELP mode -\end_layout - -\begin_layout Standard -... -\end_layout - -\begin_layout Standard -The exact lookup tables are included here for reference. -\end_layout - -\begin_layout Section -Wideband embedded decoder -\end_layout - -\begin_layout Standard -QMF filter. - Narrowband signal decoded using narrowband decoder -\end_layout - -\begin_layout Standard -For the high band, the decoder is similar to the narrowband decoder, with - the main difference being that there is no adaptive codebook. -\end_layout - -\begin_layout Standard -Gain is per-subframe -\end_layout - -\begin_layout Chapter -Speex narrowband mode -\begin_inset CommandInset label -LatexCommand label -name "sec:Speex-narrowband-mode" - -\end_inset - - -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -narrowband -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -This section looks at how Speex works for narrowband ( -\begin_inset Formula $8\:\mathrm{kHz}$ -\end_inset - - sampling rate) operation. - The frame size for this mode is -\begin_inset Formula $20\:\mathrm{ms}$ -\end_inset - -, corresponding to 160 samples. - Each frame is also subdivided into 4 sub-frames of 40 samples each. -\end_layout - -\begin_layout Standard -Also many design decisions were based on the original goals and assumptions: -\end_layout - -\begin_layout Itemize -Minimizing the amount of information extracted from past frames (for robustness - to packet loss) -\end_layout - -\begin_layout Itemize -Dynamically-selectable codebooks (LSP, pitch and innovation) -\end_layout - -\begin_layout Itemize -sub-vector fixed (innovation) codebooks -\end_layout - -\begin_layout Section -Whole-Frame Analysis -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -linear prediction -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -In narrowband, Speex frames are 20 ms long (160 samples) and are subdivided - in 4 sub-frames of 5 ms each (40 samples). - For most narrowband bit-rates (8 kbps and above), the only parameters encoded - at the frame level are the Line Spectral Pairs (LSP) and a global excitation - gain -\begin_inset Formula $g_{frame}$ -\end_inset - -, as shown in Fig. - -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:Frame-open-loop-analysis" - -\end_inset - -. - All other parameters are encoded at the sub-frame level. -\end_layout - -\begin_layout Standard -Linear prediction analysis is performed once per frame using an asymmetric - Hamming window centered on the fourth sub-frame. - Because linear prediction coefficients (LPC) are not robust to quantization, - they are first converted to line spectral pairs (LSP) -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -line spectral pair -\end_layout - -\end_inset - -. - The LSP's are considered to be associated to the -\begin_inset Formula $4^{th}$ -\end_inset - - sub-frames and the LSP's associated to the first 3 sub-frames are linearly - interpolated using the current and previous LSP coefficients. - The LSP coefficients and converted back to the LPC filter -\begin_inset Formula $\hat{A}(z)$ -\end_inset - -. - The non-quantized interpolated filter is denoted -\begin_inset Formula $A(z)$ -\end_inset - - and can be used for the weighting filter -\begin_inset Formula $W(z)$ -\end_inset - - because it does not need to be available to the decoder. - -\end_layout - -\begin_layout Standard -To make Speex more robust to packet loss, no prediction is applied on the - LSP coefficients prior to quantization. - The LSPs are encoded using vector quantization (VQ) with 30 bits for higher - quality modes and 18 bits for lower quality. -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Graphics - filename speex_analysis.eps - width 35page% - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Frame open-loop analysis -\begin_inset CommandInset label -LatexCommand label -name "cap:Frame-open-loop-analysis" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Sub-Frame Analysis-by-Synthesis -\end_layout - -\begin_layout Standard -\begin_inset Float figure -wide false -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Graphics - filename speex_abs.eps - lyxscale 75 - width 40page% - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Analysis-by-synthesis closed-loop optimization on a sub-frame. -\begin_inset CommandInset label -LatexCommand label -name "cap:Sub-frame-AbS" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -The analysis-by-synthesis (AbS) encoder loop is described in Fig. - -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:Sub-frame-AbS" - -\end_inset - -. - There are three main aspects where Speex significantly differs from most - other CELP codecs. - First, while most recent CELP codecs make use of fractional pitch estimation - with a single gain, Speex uses an integer to encode the pitch period, but - uses a 3-tap predictor (3 gains). - The adaptive codebook contribution -\begin_inset Formula $e_{a}[n]$ -\end_inset - - can thus be expressed as: -\begin_inset Formula \begin{equation} -e_{a}[n]=g_{0}e[n-T-1]+g_{1}e[n-T]+g_{2}e[n-T+1]\label{eq:adaptive-3tap}\end{equation} - -\end_inset - -where -\begin_inset Formula $g_{0}$ -\end_inset - -, -\begin_inset Formula $g_{1}$ -\end_inset - - and -\begin_inset Formula $g_{2}$ -\end_inset - - are the jointly quantized pitch gains and -\begin_inset Formula $e[n]$ -\end_inset - - is the codec excitation memory. - It is worth noting that when the pitch is smaller than the sub-frame size, - we repeat the excitation at a period -\begin_inset Formula $T$ -\end_inset - -. - For example, when -\begin_inset Formula $n-T+1\geq0$ -\end_inset - -, we use -\begin_inset Formula $n-2T+1$ -\end_inset - - instead. - In most modes, the pitch period is encoded with 7 bits in the -\begin_inset Formula $\left[17,144\right]$ -\end_inset - - range and the -\begin_inset Formula $\beta_{i}$ -\end_inset - - coefficients are vector-quantized using 7 bits at higher bit-rates (15 - kbps narrowband and above) and 5 bits at lower bit-rates (11 kbps narrowband - and below). -\end_layout - -\begin_layout Standard -Many current CELP codecs use moving average (MA) prediction to encode the - fixed codebook gain. - This provides slightly better coding at the expense of introducing a dependency - on previously encoded frames. - A second difference is that Speex encodes the fixed codebook gain as the - product of the global excitation gain -\begin_inset Formula $g_{frame}$ -\end_inset - - with a sub-frame gain corrections -\begin_inset Formula $g_{subf}$ -\end_inset - -. - This increases robustness to packet loss by eliminating the inter-frame - dependency. - The sub-frame gain correction is encoded before the fixed codebook is searched - (not closed-loop optimized) and uses between 0 and 3 bits per sub-frame, - depending on the bit-rate. -\end_layout - -\begin_layout Standard -The third difference is that Speex uses sub-vector quantization of the innovatio -n (fixed codebook) signal instead of an algebraic codebook. - Each sub-frame is divided into sub-vectors of lengths ranging between 5 - and 20 samples. - Each sub-vector is chosen from a bitrate-dependent codebook and all sub-vectors - are concatenated to form a sub-frame. - As an example, the 3.95 kbps mode uses a sub-vector size of 20 samples with - 32 entries in the codebook (5 bits). - This means that the innovation is encoded with 10 bits per sub-frame, or - 2000 bps. - On the other hand, the 18.2 kbps mode uses a sub-vector size of 5 samples - with 256 entries in the codebook (8 bits), so the innovation uses 64 bits - per sub-frame, or 12800 bps. - -\end_layout - -\begin_layout Section -Bit-rates -\end_layout - -\begin_layout Standard -So far, no MOS (Mean Opinion Score -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -mean opinion score -\end_layout - -\end_inset - -) subjective evaluation has been performed for Speex. - In order to give an idea of the quality achievable with it, table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:quality_vs_bps" - -\end_inset - - presents my own subjective opinion on it. - It should be noted that different people will perceive the quality differently - and that the person that designed the codec often has a bias (one way or - another) when it comes to subjective evaluation. - Last thing, it should be noted that for most codecs (including Speex) encoding - quality sometimes varies depending on the input. - Note that the complexity is only approximate (within 0.5 mflops and using - the lowest complexity setting). - Decoding requires approximately 0.5 mflops -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -complexity -\end_layout - -\end_inset - - in most modes (1 mflops with perceptual enhancement). -\end_layout - -\begin_layout Standard -\begin_inset Float table -placement h -wide true -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Tabular - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mode -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Quality -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Bit-rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -bit-rate -\end_layout - -\end_inset - - (bps) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -mflops -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -complexity -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Quality/description -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -250 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -No transmission (DTX) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -2,150 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Vocoder (mostly for comfort noise) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5,950 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Very noticeable artifacts/noise, good intelligibility -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3-4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -8,000 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Artifacts/noise sometimes noticeable -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5-6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -11,000 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -14 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Artifacts usually noticeable only with headphones -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7-8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -15,000 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -11 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Need good headphones to tell the difference -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -18,200 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -17.5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Hard to tell the difference even with good headphones -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -24,600 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -14.5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Completely transparent for voice, good quality music -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3,950 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -10.5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Very noticeable artifacts/noise, good intelligibility -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -11 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -reserved -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -13 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Application-defined, interpreted by callback or skipped -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -14 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Speex in-band signaling -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -15 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -- -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Terminator code -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Quality versus bit-rate -\begin_inset CommandInset label -LatexCommand label -name "cap:quality_vs_bps" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Section -Perceptual enhancement -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -perceptual enhancement -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard - -\series bold -This section was only valid for version 1.1.12 and earlier. - It does not apply to version 1.2-beta1 (and later), for which the new perceptual - enhancement is not yet documented. -\end_layout - -\begin_layout Standard -This part of the codec only applies to the decoder and can even be changed - without affecting inter-operability. - For that reason, the implementation provided and described here should - only be considered as a reference implementation. - The enhancement system is divided into two parts. - First, the synthesis filter -\begin_inset Formula $S(z)=1/A(z)$ -\end_inset - - is replaced by an enhanced filter: -\begin_inset Formula \[ -S'(z)=\frac{A\left(z/a_{2}\right)A\left(z/a_{3}\right)}{A\left(z\right)A\left(z/a_{1}\right)}\] - -\end_inset - -where -\begin_inset Formula $a_{1}$ -\end_inset - - and -\begin_inset Formula $a_{2}$ -\end_inset - - depend on the mode in use and -\begin_inset Formula $a_{3}=\frac{1}{r}\left(1-\frac{1-ra_{1}}{1-ra_{2}}\right)$ -\end_inset - - with -\begin_inset Formula $r=.9$ -\end_inset - -. - The second part of the enhancement consists of using a comb filter to enhance - the pitch in the excitation domain. - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Speex wideband mode (sub-band CELP) -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -wideband -\end_layout - -\end_inset - - -\begin_inset CommandInset label -LatexCommand label -name "sec:Speex-wideband-mode" - -\end_inset - - -\end_layout - -\begin_layout Standard -For wideband, the Speex approach uses a -\emph on -q -\emph default -uadrature -\emph on -m -\emph default -irror -\emph on -f -\emph default -ilter -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -quadrature mirror filter -\end_layout - -\end_inset - - (QMF) to split the band in two. - The 16 kHz signal is thus divided into two 8 kHz signals, one representing - the low band (0-4 kHz), the other the high band (4-8 kHz). - The low band is encoded with the narrowband mode described in section -\begin_inset CommandInset ref -LatexCommand ref -reference "sec:Speex-narrowband-mode" - -\end_inset - - in such a way that the resulting -\begin_inset Quotes eld -\end_inset - -embedded narrowband bit-stream -\begin_inset Quotes erd -\end_inset - - can also be decoded with the narrowband decoder. - Since the low band encoding has already been described, only the high band - encoding is described in this section. -\end_layout - -\begin_layout Section -Linear Prediction -\end_layout - -\begin_layout Standard -The linear prediction part used for the high-band is very similar to what - is done for narrowband. - The only difference is that we use only 12 bits to encode the high-band - LSP's using a multi-stage vector quantizer (MSVQ). - The first level quantizes the 10 coefficients with 6 bits and the error - is then quantized using 6 bits, too. -\end_layout - -\begin_layout Section -Pitch Prediction -\end_layout - -\begin_layout Standard -That part is easy: there's no pitch prediction for the high-band. - There are two reasons for that. - First, there is usually little harmonic structure in this band (above 4 - kHz). - Second, it would be very hard to implement since the QMF folds the 4-8 - kHz band into 4-0 kHz (reversing the frequency axis), which means that - the location of the harmonics is no longer at multiples of the fundamental - (pitch). -\end_layout - -\begin_layout Section -Excitation Quantization -\end_layout - -\begin_layout Standard -The high-band excitation is coded in the same way as for narrowband. - -\end_layout - -\begin_layout Section -Bit allocation -\end_layout - -\begin_layout Standard -For the wideband mode, the entire narrowband frame is packed before the - high-band is encoded. - The narrowband part of the bit-stream is as defined in table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:bits-narrowband" - -\end_inset - -. - The high-band follows, as described in table -\begin_inset CommandInset ref -LatexCommand ref -reference "cap:bits-wideband" - -\end_inset - -. - For wideband, the mode ID is the same as the Speex quality setting and - is defined in table -\begin_inset CommandInset ref -LatexCommand ref -reference "tab:wideband-quality" - -\end_inset - -. - This also means that a wideband frame may be correctly decoded by a narrowband - decoder with the only caveat that if more than one frame is packed in the - same packet, the decoder will need to skip the high-band parts in order - to sync with the bit-stream. -\end_layout - -\begin_layout Standard -\begin_inset Float table -placement h -wide true -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Tabular - - - - - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Parameter -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Update rate -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Wideband bit -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mode ID -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -LSP -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -12 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Excitation gain -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -sub-frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Excitation VQ -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -sub-frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -20 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -40 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -80 -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -Total -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -frame -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -36 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -112 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -192 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -352 -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Bit allocation for high-band in wideband mode -\begin_inset CommandInset label -LatexCommand label -name "cap:bits-wideband" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Float table -placement h -wide true -sideways false -status open - -\begin_layout Plain Layout -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -begin{center} -\end_layout - -\end_inset - - -\begin_inset Tabular - - - - - - - -\begin_inset Text - -\begin_layout Plain Layout -Mode/Quality -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Bit-rate -\begin_inset Index -status collapsed - -\begin_layout Plain Layout -bit-rate -\end_layout - -\end_inset - - (bps) -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Quality/description -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -0 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -3,950 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Barely intelligible (mostly for comfort noise) -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -1 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -5,750 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Very noticeable artifacts/noise, poor intelligibility -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -2 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -7,750 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Very noticeable artifacts/noise, good intelligibility -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -3 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -9,800 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Artifacts/noise sometimes annoying -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -4 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -12,800 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Artifacts/noise usually noticeable -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -5 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -16,800 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Artifacts/noise sometimes noticeable -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -6 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -20,600 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Need good headphones to tell the difference -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -7 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -23,800 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Need good headphones to tell the difference -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -8 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -27,800 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Hard to tell the difference even with good headphones -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -9 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -34,200 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Hard to tell the difference even with good headphones -\end_layout - -\end_inset - - - - -\begin_inset Text - -\begin_layout Plain Layout -10 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -42,200 -\end_layout - -\end_inset - - -\begin_inset Text - -\begin_layout Plain Layout -Completely transparent for voice, good quality music -\end_layout - -\end_inset - - - - -\end_inset - - -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -end{center} -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Plain Layout -\begin_inset Caption - -\begin_layout Plain Layout -Quality versus bit-rate for the wideband encoder -\begin_inset CommandInset label -LatexCommand label -name "tab:wideband-quality" - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status open - -\begin_layout Plain Layout - - -\backslash -clearpage -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset ERT -status collapsed - -\begin_layout Plain Layout - - -\backslash -clearpage -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Chapter -\start_of_appendix -Sample code -\begin_inset CommandInset label -LatexCommand label -name "sec:Sample-code" - -\end_inset - - -\end_layout - -\begin_layout Standard -This section shows sample code for encoding and decoding speech using the - Speex API. - The commands can be used to encode and decode a file by calling: -\family typewriter - -\begin_inset Newline newline -\end_inset - -% sampleenc in_file.sw | sampledec out_file.sw -\family default - -\begin_inset Newline newline -\end_inset - -where both files are raw (no header) files encoded at 16 bits per sample - (in the machine natural endianness). -\end_layout - -\begin_layout Section -sampleenc.c -\end_layout - -\begin_layout Standard -sampleenc takes a raw 16 bits/sample file, encodes it and outputs a Speex - stream to stdout. - Note that the packing used is -\series bold -not -\series default - compatible with that of speexenc/speexdec. -\end_layout - -\begin_layout Standard -\begin_inset CommandInset include -LatexCommand lstinputlisting -filename "sampleenc.c" -lstparams "caption={Source code for sampleenc},label={sampleenc-source-code},numbers=left,numberstyle={\\footnotesize}" - -\end_inset - - -\end_layout - -\begin_layout Section -sampledec.c -\end_layout - -\begin_layout Standard -sampledec reads a Speex stream from stdin, decodes it and outputs it to - a raw 16 bits/sample file. - Note that the packing used is -\series bold -not -\series default - compatible with that of speexenc/speexdec. -\end_layout - -\begin_layout Standard -\begin_inset CommandInset include -LatexCommand lstinputlisting -filename "sampledec.c" -lstparams "caption={Source code for sampledec},label={sampledec-source-code},numbers=left,numberstyle={\\footnotesize}" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Jitter Buffer for Speex -\end_layout - -\begin_layout Standard -\begin_inset CommandInset include -LatexCommand lstinputlisting -filename "../speexclient/speex_jitter_buffer.c" -lstparams "caption={Example of using the jitter buffer for Speex packets},label={example-speex-jitter},numbers=left,numberstyle={\\footnotesize}" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -IETF RTP Profile -\begin_inset CommandInset label -LatexCommand label -name "sec:IETF-draft" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset CommandInset include -LatexCommand verbatiminput -filename "draft-ietf-avt-rtp-speex-05-tmp.txt" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -Speex License -\begin_inset CommandInset label -LatexCommand label -name "sec:Speex-License" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset CommandInset include -LatexCommand verbatiminput -filename "../COPYING" - -\end_inset - - -\end_layout - -\begin_layout Standard -\begin_inset Newpage newpage -\end_inset - - -\end_layout - -\begin_layout Chapter -GNU Free Documentation License -\end_layout - -\begin_layout Standard -Version 1.1, March 2000 -\end_layout - -\begin_layout Standard -Copyright (C) 2000 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted - to copy and distribute verbatim copies of this license document, but changing - it is not allowed. - -\end_layout - -\begin_layout Section* -0. - PREAMBLE -\end_layout - -\begin_layout Standard -The purpose of this License is to make a manual, textbook, or other written - document "free" in the sense of freedom: to assure everyone the effective - freedom to copy and redistribute it, with or without modifying it, either - commercially or noncommercially. - Secondarily, this License preserves for the author and publisher a way - to get credit for their work, while not being considered responsible for - modifications made by others. -\end_layout - -\begin_layout Standard -This License is a kind of "copyleft", which means that derivative works - of the document must themselves be free in the same sense. - It complements the GNU General Public License, which is a copyleft license - designed for free software. -\end_layout - -\begin_layout Standard -We have designed this License in order to use it for manuals for free software, - because free software needs free documentation: a free program should come - with manuals providing the same freedoms that the software does. - But this License is not limited to software manuals; it can be used for - any textual work, regardless of subject matter or whether it is published - as a printed book. - We recommend this License principally for works whose purpose is instruction - or reference. - -\end_layout - -\begin_layout Section* -1. - APPLICABILITY AND DEFINITIONS -\end_layout - -\begin_layout Standard -This License applies to any manual or other work that contains a notice - placed by the copyright holder saying it can be distributed under the terms - of this License. - The "Document", below, refers to any such manual or work. - Any member of the public is a licensee, and is addressed as "you". -\end_layout - -\begin_layout Standard -A "Modified Version" of the Document means any work containing the Document - or a portion of it, either copied verbatim, or with modifications and/or - translated into another language. -\end_layout - -\begin_layout Standard -A "Secondary Section" is a named appendix or a front-matter section of the - Document that deals exclusively with the relationship of the publishers - or authors of the Document to the Document's overall subject (or to related - matters) and contains nothing that could fall directly within that overall - subject. - (For example, if the Document is in part a textbook of mathematics, a Secondary - Section may not explain any mathematics.) The relationship could be a matter - of historical connection with the subject or with related matters, or of - legal, commercial, philosophical, ethical or political position regarding - them. -\end_layout - -\begin_layout Standard -The "Invariant Sections" are certain Secondary Sections whose titles are - designated, as being those of Invariant Sections, in the notice that says - that the Document is released under this License. -\end_layout - -\begin_layout Standard -The "Cover Texts" are certain short passages of text that are listed, as - Front-Cover Texts or Back-Cover Texts, in the notice that says that the - Document is released under this License. -\end_layout - -\begin_layout Standard -A "Transparent" copy of the Document means a machine-readable copy, represented - in a format whose specification is available to the general public, whose - contents can be viewed and edited directly and straightforwardly with generic - text editors or (for images composed of pixels) generic paint programs - or (for drawings) some widely available drawing editor, and that is suitable - for input to text formatters or for automatic translation to a variety - of formats suitable for input to text formatters. - A copy made in an otherwise Transparent file format whose markup has been - designed to thwart or discourage subsequent modification by readers is - not Transparent. - A copy that is not "Transparent" is called "Opaque". -\end_layout - -\begin_layout Standard -Examples of suitable formats for Transparent copies include plain ASCII - without markup, Texinfo input format, LaTeX input format, SGML or XML using - a publicly available DTD, and standard-conforming simple HTML designed - for human modification. - Opaque formats include PostScript, PDF, proprietary formats that can be - read and edited only by proprietary word processors, SGML or XML for which - the DTD and/or processing tools are not generally available, and the machine-ge -nerated HTML produced by some word processors for output purposes only. -\end_layout - -\begin_layout Standard -The "Title Page" means, for a printed book, the title page itself, plus - such following pages as are needed to hold, legibly, the material this - License requires to appear in the title page. - For works in formats which do not have any title page as such, "Title Page" - means the text near the most prominent appearance of the work's title, - preceding the beginning of the body of the text. -\end_layout - -\begin_layout Section* -2. - VERBATIM COPYING -\end_layout - -\begin_layout Standard -You may copy and distribute the Document in any medium, either commercially - or noncommercially, provided that this License, the copyright notices, - and the license notice saying this License applies to the Document are - reproduced in all copies, and that you add no other conditions whatsoever - to those of this License. - You may not use technical measures to obstruct or control the reading or - further copying of the copies you make or distribute. - However, you may accept compensation in exchange for copies. - If you distribute a large enough number of copies you must also follow - the conditions in section 3. -\end_layout - -\begin_layout Standard -You may also lend copies, under the same conditions stated above, and you - may publicly display copies. -\end_layout - -\begin_layout Section* -3. - COPYING IN QUANTITY -\end_layout - -\begin_layout Standard -If you publish printed copies of the Document numbering more than 100, and - the Document's license notice requires Cover Texts, you must enclose the - copies in covers that carry, clearly and legibly, all these Cover Texts: - Front-Cover Texts on the front cover, and Back-Cover Texts on the back - cover. - Both covers must also clearly and legibly identify you as the publisher - of these copies. - The front cover must present the full title with all words of the title - equally prominent and visible. - You may add other material on the covers in addition. - Copying with changes limited to the covers, as long as they preserve the - title of the Document and satisfy these conditions, can be treated as verbatim - copying in other respects. -\end_layout - -\begin_layout Standard -If the required texts for either cover are too voluminous to fit legibly, - you should put the first ones listed (as many as fit reasonably) on the - actual cover, and continue the rest onto adjacent pages. -\end_layout - -\begin_layout Standard -If you publish or distribute Opaque copies of the Document numbering more - than 100, you must either include a machine-readable Transparent copy along - with each Opaque copy, or state in or with each Opaque copy a publicly-accessib -le computer-network location containing a complete Transparent copy of the - Document, free of added material, which the general network-using public - has access to download anonymously at no charge using public-standard network - protocols. - If you use the latter option, you must take reasonably prudent steps, when - you begin distribution of Opaque copies in quantity, to ensure that this - Transparent copy will remain thus accessible at the stated location until - at least one year after the last time you distribute an Opaque copy (directly - or through your agents or retailers) of that edition to the public. -\end_layout - -\begin_layout Standard -It is requested, but not required, that you contact the authors of the Document - well before redistributing any large number of copies, to give them a chance - to provide you with an updated version of the Document. - -\end_layout - -\begin_layout Section* -4. - MODIFICATIONS -\end_layout - -\begin_layout Standard -You may copy and distribute a Modified Version of the Document under the - conditions of sections 2 and 3 above, provided that you release the Modified - Version under precisely this License, with the Modified Version filling - the role of the Document, thus licensing distribution and modification - of the Modified Version to whoever possesses a copy of it. - In addition, you must do these things in the Modified Version: -\end_layout - -\begin_layout Itemize -A. - Use in the Title Page (and on the covers, if any) a title distinct from - that of the Document, and from those of previous versions (which should, - if there were any, be listed in the History section of the Document). - You may use the same title as a previous version if the original publisher - of that version gives permission. -\end_layout - -\begin_layout Itemize -B. - List on the Title Page, as authors, one or more persons or entities responsible - for authorship of the modifications in the Modified Version, together with - at least five of the principal authors of the Document (all of its principal - authors, if it has less than five). -\end_layout - -\begin_layout Itemize -C. - State on the Title page the name of the publisher of the Modified Version, - as the publisher. -\end_layout - -\begin_layout Itemize -D. - Preserve all the copyright notices of the Document. -\end_layout - -\begin_layout Itemize -E. - Add an appropriate copyright notice for your modifications adjacent to - the other copyright notices. -\end_layout - -\begin_layout Itemize -F. - Include, immediately after the copyright notices, a license notice giving - the public permission to use the Modified Version under the terms of this - License, in the form shown in the Addendum below. -\end_layout - -\begin_layout Itemize -G. - Preserve in that license notice the full lists of Invariant Sections and - required Cover Texts given in the Document's license notice. -\end_layout - -\begin_layout Itemize -H. - Include an unaltered copy of this License. -\end_layout - -\begin_layout Itemize -I. - Preserve the section entitled "History", and its title, and add to it an - item stating at least the title, year, new authors, and publisher of the - Modified Version as given on the Title Page. - If there is no section entitled "History" in the Document, create one stating - the title, year, authors, and publisher of the Document as given on its - Title Page, then add an item describing the Modified Version as stated - in the previous sentence. -\end_layout - -\begin_layout Itemize -J. - Preserve the network location, if any, given in the Document for public - access to a Transparent copy of the Document, and likewise the network - locations given in the Document for previous versions it was based on. - These may be placed in the "History" section. - You may omit a network location for a work that was published at least - four years before the Document itself, or if the original publisher of - the version it refers to gives permission. -\end_layout - -\begin_layout Itemize -K. - In any section entitled "Acknowledgements" or "Dedications", preserve the - section's title, and preserve in the section all the substance and tone - of each of the contributor acknowledgements and/or dedications given therein. -\end_layout - -\begin_layout Itemize -L. - Preserve all the Invariant Sections of the Document, unaltered in their - text and in their titles. - Section numbers or the equivalent are not considered part of the section - titles. -\end_layout - -\begin_layout Itemize -M. - Delete any section entitled "Endorsements". - Such a section may not be included in the Modified Version. -\end_layout - -\begin_layout Itemize -N. - Do not retitle any existing section as "Endorsements" or to conflict in - title with any Invariant Section. - -\end_layout - -\begin_layout Standard -If the Modified Version includes new front-matter sections or appendices - that qualify as Secondary Sections and contain no material copied from - the Document, you may at your option designate some or all of these sections - as invariant. - To do this, add their titles to the list of Invariant Sections in the Modified - Version's license notice. - These titles must be distinct from any other section titles. -\end_layout - -\begin_layout Standard -You may add a section entitled "Endorsements", provided it contains nothing - but endorsements of your Modified Version by various parties--for example, - statements of peer review or that the text has been approved by an organization - as the authoritative definition of a standard. -\end_layout - -\begin_layout Standard -You may add a passage of up to five words as a Front-Cover Text, and a passage - of up to 25 words as a Back-Cover Text, to the end of the list of Cover - Texts in the Modified Version. - Only one passage of Front-Cover Text and one of Back-Cover Text may be - added by (or through arrangements made by) any one entity. - If the Document already includes a cover text for the same cover, previously - added by you or by arrangement made by the same entity you are acting on - behalf of, you may not add another; but you may replace the old one, on - explicit permission from the previous publisher that added the old one. -\end_layout - -\begin_layout Standard -The author(s) and publisher(s) of the Document do not by this License give - permission to use their names for publicity for or to assert or imply endorseme -nt of any Modified Version. - -\end_layout - -\begin_layout Section* -5. - COMBINING DOCUMENTS -\end_layout - -\begin_layout Standard -You may combine the Document with other documents released under this License, - under the terms defined in section 4 above for modified versions, provided - that you include in the combination all of the Invariant Sections of all - of the original documents, unmodified, and list them all as Invariant Sections - of your combined work in its license notice. -\end_layout - -\begin_layout Standard -The combined work need only contain one copy of this License, and multiple - identical Invariant Sections may be replaced with a single copy. - If there are multiple Invariant Sections with the same name but different - contents, make the title of each such section unique by adding at the end - of it, in parentheses, the name of the original author or publisher of - that section if known, or else a unique number. - Make the same adjustment to the section titles in the list of Invariant - Sections in the license notice of the combined work. -\end_layout - -\begin_layout Standard -In the combination, you must combine any sections entitled "History" in - the various original documents, forming one section entitled "History"; - likewise combine any sections entitled "Acknowledgements", and any sections - entitled "Dedications". - You must delete all sections entitled "Endorsements." -\end_layout - -\begin_layout Section* -6. - COLLECTIONS OF DOCUMENTS -\end_layout - -\begin_layout Standard -You may make a collection consisting of the Document and other documents - released under this License, and replace the individual copies of this - License in the various documents with a single copy that is included in - the collection, provided that you follow the rules of this License for - verbatim copying of each of the documents in all other respects. -\end_layout - -\begin_layout Standard -You may extract a single document from such a collection, and distribute - it individually under this License, provided you insert a copy of this - License into the extracted document, and follow this License in all other - respects regarding verbatim copying of that document. - -\end_layout - -\begin_layout Section* -7. - AGGREGATION WITH INDEPENDENT WORKS -\end_layout - -\begin_layout Standard -A compilation of the Document or its derivatives with other separate and - independent documents or works, in or on a volume of a storage or distribution - medium, does not as a whole count as a Modified Version of the Document, - provided no compilation copyright is claimed for the compilation. - Such a compilation is called an "aggregate", and this License does not - apply to the other self-contained works thus compiled with the Document, - on account of their being thus compiled, if they are not themselves derivative - works of the Document. -\end_layout - -\begin_layout Standard -If the Cover Text requirement of section 3 is applicable to these copies - of the Document, then if the Document is less than one quarter of the entire - aggregate, the Document's Cover Texts may be placed on covers that surround - only the Document within the aggregate. - Otherwise they must appear on covers around the whole aggregate. -\end_layout - -\begin_layout Section* -8. - TRANSLATION -\end_layout - -\begin_layout Standard -Translation is considered a kind of modification, so you may distribute - translations of the Document under the terms of section 4. - Replacing Invariant Sections with translations requires special permission - from their copyright holders, but you may include translations of some - or all Invariant Sections in addition to the original versions of these - Invariant Sections. - You may include a translation of this License provided that you also include - the original English version of this License. - In case of a disagreement between the translation and the original English - version of this License, the original English version will prevail. -\end_layout - -\begin_layout Section* -9. - TERMINATION -\end_layout - -\begin_layout Standard -You may not copy, modify, sublicense, or distribute the Document except - as expressly provided for under this License. - Any other attempt to copy, modify, sublicense or distribute the Document - is void, and will automatically terminate your rights under this License. - However, parties who have received copies, or rights, from you under this - License will not have their licenses terminated so long as such parties - remain in full compliance. - -\end_layout - -\begin_layout Section* -10. - FUTURE REVISIONS OF THIS LICENSE -\end_layout - -\begin_layout Standard -The Free Software Foundation may publish new, revised versions of the GNU - Free Documentation License from time to time. - Such new versions will be similar in spirit to the present version, but - may differ in detail to address new problems or concerns. - See http://www.gnu.org/copyleft/. -\end_layout - -\begin_layout Standard -Each version of the License is given a distinguishing version number. - If the Document specifies that a particular numbered version of this License - "or any later version" applies to it, you have the option of following - the terms and conditions either of that specified version or of any later - version that has been published (not as a draft) by the Free Software Foundatio -n. - If the Document does not specify a version number of this License, you - may choose any version ever published (not as a draft) by the Free Software - Foundation. -\end_layout - -\begin_layout Standard -\begin_inset CommandInset index_print -LatexCommand printindex - -\end_inset - - -\end_layout - -\end_body -\end_document diff --git a/speex/doc/manual.pdf b/speex/doc/manual.pdf deleted file mode 100644 index 292f304defd312957dbf95c66b3afc6316cfc255..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 439545 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
1^XyR#Dk$4xJE#!`bg0D7so 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 *p|siy!m$>rpxsm=X{o5!dj3Pf9)klUwi*np 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

DUQI#oWMmmb$c_X1i3=j9*Yox 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ΞC&*Q=SxkgptYm-!@=$ zT#-9{pKnbSmS$vdQ0chwh8U04R?I4%+ zllv$9vz6&pa#Z?ik2ch3FxvWPL)%j^L~GB(4}U-UPwY!vF4TY+>BYp91BCs(~@m zNF6_(S5f=y{+_f;>>D|mGku|As^w#iWIJ_Z)5ZK4ulurHtNux((DN!4~6>xY$qu_??!+|OJ zg5D{i+lOGKypEZTHU)S zSIZLgIX+(7iyN8$H<|F%_{N*{IM+>bX zWbp+{1~h_FZO-L@({`g4Q>u1ApIIlJe_5mUx{w9jB3z9A)s4!d1aa5k&H+zEhss$0h!QHMNfxph}nR$Z?dn3C z%U@Y;mnHUB_7Uva5ZfAL^zg!bfxXXq3*E{IPCv}CtZ!t+F~SlLm)_q+bWRPJyHo0t zLfLZvd~48t3=G+lJyC&=82J1*HpivUdYW>*q=Dm~fEp zoqEWxqhFb1-;et)oBf^os}}0^od#&jCC|}gf^1?7En#umIKKTJ%;A*ryScc1f2{>g zN!PFO*V6d#4Gbl4#QPTw#*H!X)Bwg~(6k(NBSXps#=CtiLfX;MAa} z>KW;ugHj*tFIsQv&eRhecMUAM%)6rfGiGsuEni{2qrXW z@58s1;}L8(4ZL?=W0DwqKAIa`&)0tS>Z9K98KmwbpO>WS2VJ)G1jg1^`Wo6%)%diC z)@d*p@MyHEOjzfm?yxVMH${R~&gihdLbC;Ijb0q^JNP6W;Bgp2+}hH2dFGJzBRJ{` z@JvJc5RWN%NaNxSu1IG!SSc^`C@D3egi}}T9eyQpSd)#TlDmIC0Ybo( zfPeG>nhkdzIka1Hg0Enl+^XPs z9Put@?%a#7kWXV`&pQ9vIW!n`ULb-Ks7)h>6V=(M-1uN~*eYU;02+n&Ow7!F{_O6j zbKoY0Nc@`DL+9|h6z2cdqnqj|;zxcY&EUd@`NX$hSo<3bZhsm@IGg(IoAK#;$ZoS| zTy#?8e-iTP$$g>Sl9EU?UiPj1xO>k(qK)15yVjQn-9rW&-2CSK@ITV!WKZQv z@lOog_jIM5B)dv*Bo(QqsZ`^;ay&MpYvt$3utlU*!;rH8?|JU&N_l?_;a{d#K+?|D zs`n0Nknm_YnuNlBI`PFN@q#bUZI24^{A|fUoaP`?sgki>N`_r8-Z8rakM8l?nZwX$ zc82L_jh~9Yn%xynh-G0L#HY{>XS`M+2uJxi@wj6~Hyw_MH`BJx6EPF9n*jL?$d%n; z{h$84SohZMUmP$DnpnlZiw6a(qrjP>qN29v!W~lcHm;e-***;nHLO08%>{_dX3sa} zSDz4_-2$synW$F%QXfK45=?>{Et9N-eaiooH5&CkI^XAz_+p)UXYFC1NPLQ-j$4$# zde2&OpwSpc7}TUkZnz>g0@J8^AmA!yc$LL*%xBsK&v@iJVLX_!rmluNa>LsIt>-Y@pZf<1hUJpG?SbAl8%Q7i38rx{QMUs0!^Z0%B4X=}!LNsbt=bfAi$e>6Cu@fK9 zv}^<3t8H{W;zfJ=6A!I0vZO@ZLT{yb7MAicq)njE^!XilBUm(KWFp+<{~yNAAxacr zTe4-{vTfV8ZQHhO+qP}nwryA4ve|dNwSM=Y-{8-4lsSo$Cn9#h1PZKJEfN_DtVT2E z;Ut659Gz%Hy$A@C6$DakeJm!d)EUh&Xv_{@$x;P}CsXUE-`z_L*wP{$({i;v8nxs3 z()k$j(NZZa{YEOSrB@R0-^?MXzm5>p!yeQ3BC zAZFt`*4gX=>8wl|Xw*NEK4j}_%YlXq$5IJ%_DUKHN0fvSNT3P~D-=*3 z{(rFZyOA!nKCxK<&g>pKl%hY>eK|;yvUCLX{nuu8gGwq5&<^^rNebLA*}W5 za7VGtgM0qrA7yY?xR%xQpPSg}?AJmbhD*Psu1@E{j(C(WcpIHUhhh_O7_L)HebB;i zu0r+>jg5#gIIf{Lej$_)aejJon7D?7Pun>cKwqR!`VGfe30`0br137Y*meHZY9PNC z7|HYwpj3xjb91b;MjDWbh7Bq-wAaFgvKpCb6GEXA3^dr<=x-)<6}u)RAI#DyAq4;6O5 zFy1FVk>M5y{?a6ES~?wH&~aad@Si zoduF%3D`Gox>h~YXO|$WM7QJ}fDtR?i{Lp)rgpu}R);>bZ z2+RsoZQ^qs1VB9yt+q!cbTiBfI+U1JrkW00 z44ka%BW2H}QWjeFHqPT%d|#JZsC`%vW>Sh?-t;cC5tE-*z59|4O^d(Au!1y8$kQUW z8XA=Yn0IKQxl8Ro1AQL(?nK9K;f&Y1T903&Jy4o8JkBH-C)uIY5kWXqlvX}_C|v{J zQZ+?{%@34Fw-8B$YJk-J>|BS-OU^6jPY5;78YxR}$m&A6xfzB23!fK5;dkp`TAq%F zkkwSJ(UEMM?`X)o!tdluJ3jYok}^d31a3XuQB>Rocou)CQ`og>7@O3r?JoW{Ekc}> z7Qo`Odw)4R=lnZCYi1F3(;+mccR#G*obTf305#OY1|7U~fM#^Kz)qT`7g#vCD&{JW^e(9t`MZ*?z*u@P9j_oE`Bfoz)h`*r@-?;Itkr(iu z+$V}V+_6?ZAycAH)1A083s@Xx9C0<9^sDplOz?*{hm%K`iy2`N)F z#LXl+;wtUGE-F7WA(&^M%1-3c+<4)U+j~~PTHo@(2zg(E)>-*`WnFm z-rf&5N8|f42}U518W}+82cIBa;#Db)evCd`c#t$fceD{*OvkR4NMUtJ)(xdEw;)l_*4;R|Ne&j2qf{N-ngmels+A&cn*rMB;k zo&1X*>GSBTM=Ma>Xk{>)#0%>eDdxs=q?2D&5cKt9rK@ypo!AhEr}xhZ2jE7#KmdFA zPLutb))_=L>6TH`6o(j4+#sCnOEmt2uVSq`G)$8+4$c+qyc4Z%4*4G#n#@{5GFM+N zX>U$7Wa; z`Nk!tlXLn55ZGDgY2&jlI!6h&vB&i^yo4JM9k~fl;oXhDO{#ZVN{*_1lMOgwT_V~&bUW~8}iTihA} zCoUe~2UMB%#M+jR=1TW%K2N@i5ghVHaz7GDg!HU@Q`UF4HhL17g?_yu1LRqB2UTim zY+k%`m`a9OF~ZL9bL3@;&WJI5i(F%m=Ap&U)vc?@4hK_h-~CT^at)Z?HMS6XYx)iMnEI6zub z@xu$fsi3RZMndtH5I+0&7$R3s@s=k1kY&GIGjGRa_g_OdDzZH-G}B#~<@-ictIL-k z3%#!gjL*`p=kzczMBtBu>c=(Zh?7q`pJZ z*+f9&_Vs|Ktc5C?sJQ@wR!Y*8Q2gP|lUOvyq-Z3>)6tuo;(&r7cW#>f^wis?E?m!s zqQO1iLLLLs3Szgr>S?bTPnG~!<_y2AnvYkihwTy{5Sccdm%htS3f~QMDBMJo@+gz6 zL#UQ|kVt`*=C?bMPBETX_0nM2ty)|M;Xv<@9}svlr=2@nf20jT) zR!mkKx|daO8Mq98P)dOyShrSNVR|-c8kcF@&m8Tn$iD*|PZSPE=)TBwFCNzKW^ILB zG@5D8Vz$QU({h%vT2nS*-4EpQ(t2)Fi}5yc8G|s+@9b|`x?15I#T%tDnsHC~D?E@0 zX4dU(;KD;$HU@n3X=>xHGqzrC z$msRMrxA<<zCTtNSo1Dxk5+b` z%wB%YwY@mZSL*OAZF|zbx@vtYJvRJ5uKO0+dpV@RTCRGph8ytK{v{r~8`a_r$zVDE zdTu}D$UbB_{M9kCs=??8K!k*Jc_NN-Hs|ZU<#&>}UwJhG&5eyoB&_9{ zZ3+M(fNxZuTDs*lBF+~9>fNHter7SQ7`-#>&gB^+N<~g{?-m^__K6Bp2jsRK{OjU_ zF!!&}TCReqfpsb*faH-cLA~{QfNsd)5B`-7F&xEi5P@^&FJfdky2SCSPtgk&dIRTP zx7&(G;`rh%ww~Ct;Ad0Gtr}UXwZnO2l~blYm=&7|`9f>oz4$SIVE_l_NnkUe}f<2z(*^0 zS7GR2^QpXVblRT(w`t6bYTupFI0qGqod5%)q!x; zO)1Jo(S69!sBXir?n>mJ^zjZb`r<(*IZ(2VfnnG91~9{DvqfUUn%ryQop%Y;>BC!jW- z7|1UDHld^u(7Wm#H@QxIT9Fc&&sK^(OyDk(7dyGDf^7_@bs@ic@g6t_sOq-4^nNz9 zGe`Fwa&9lS2D%cXuuy*^?c!_g$;<3V{T6Waq(}KMK1~OaEJLJC5M+SPMd3B0Kdz*E z<4gtigubDyg~F~fzbJH2()nie7lUAuujN_k!KSifZ+Oro-M^r!iJqOL%A3%6b7iUF zBD^*qSOd^jx@|tF0<%g_$MBuQWzZP%D^H29FcttHM3TBw{XUma`8#oOT4AjJK%0 zl@ml~vKyUy!0?4X+wH*%j|T&bl1~QZmZybuIH}0oYj|u)5Z#!Y3KYr=5zQo?yf;t= z(1@AB?WHCm~*vk=_-w*lkW}Mo@HBvL=%|{bBAr_9MfB?p*7BZmm+PinG;km zh$%>KaJcS;c&dPU2g(U40$)EkmKsmw1s?O>u{onFMS?=5m?M>(2ik`r;KB26z3MvmgElVELcuQU^%!4#cnnHrNz*55=8Qy+q98jg{R6POq2N%7voRiSW( zHj*?5vB!5a$|yj0_pYSAPu9M<+$b1X({7xZGL5XN{%EQfJG}CCV{#d)A^nNY&qNC-U50JY++LvVL3AL?4(!liv2R&Qzu)%C?z|1wJ*_c#|) zIe}*#orw*9+LZ%wt?2VVna}5_LiakN^Zm?s7mzyp z^To9}^FIjX0qp{J6-KHNbjE#XQte@I0K@%|{Dq?mT{G6BON-w^yh=@SZ2;ES3p@Sz zS25W0fY|WfZ1pxelW#no>S>w|g%z@{K`5T>S%YTU&W_RP%CG??uo(%U|Hx;>em;^3 zpHCF@SFPbA2_T_=8hb&gzJnnYtie%l!(l(2F|D^tXd5blfmtgOw-xFKGw?UXaXH}r zBF|*89!wJCSeu4hE{IMvo8JJavn7j)C9@Y$z{-OH1l7rvmpP}CtHhl%vkwtjPBomu z3=RQv`agnDk7k$#$sXMW(PTdnDblP(NEHXeK$xIMAlsdPa2l^L(+3ds)J6Pp3Jopp zrgaTqlPlNNQU>|t;OP0Tbul0~H6fKl{hNa`FdB=c+tDR>MMY|Jt)=sLZrZW+%S6t##38Y<0l!fr6 z{OrQ=HH%E{j#l`sg>XP|{D*%gUQ1b>Zs-PsMJ7x>7T(IyPdeu=ldW_$@}l7^Co{E#99SUmjm8 ze;YHTir6O`wu<`CMWDdwy?UJ=+5Xv`q32S3Q=s;ojD;mgtYBdrh-kfngv>GaGpR31EtQ?tm(s{v)<{ zmX+x|;^?6ZkMz`A-3N{aEHl-~t8~gA0y0sG?zmBour^W+k=jE{)hle8}#+ew)XvYGIgad-&;k4k&>tnXkhIU0rtNNDq z`@6y>=lgBucK`KBb~SQ4pkuMgm`ZSA1+uV8Id%c8C}pI0I-D%vQm z>ige8&W^XcDK@zu&yS~v$?B`ZVvg^h2TPseyTSJ*Ji3uajIN0#KW*I!8Cu!#rQ1P~ z4k#pNG|oB^e)fou-4jw0T&w7T04Yw|T=B@~#|SI<&`}QA~j?0nC5p*FL{p+uc8V zSAH-@mvr85&CQsjDib4@D!ST!KgS<=zn&j+QVpH-@{~L#LuJ&_$-2e&t6^)EBkL|9 zqtypAqv8meJ|?L)kGdnSR$c73a)i3iRSRV#+B)5D552^rB!r`;H@jU#^2YRUmYBd2p=#$utZJ{B!gsaD%#q6p(T&^C9pz8JtaBr zP8MhdtX6WbEiK0I;%j+pSh~w--7qoC2EIAm-+z-k8z>)Y`gB6Es^QY+Enw|Mbq6B@eC@RObJ`Vq$%#HHU4xzJ+9pC- zljH>CwADSc$dm-ZVxmDX@Uq3-6iehPd7D{*O{Ndk+&*lybyVFMxfC>KNKJe>_zneV zrM;8><#n2vCuyXA#OxQSU5D&O%Z$I3meIlwD8D>XN=$doR|@Fv<G`k45EaoEV0Ei^s`EKib7cT z6+R$#lCzQw{iqfM1AuH4F>*l)<-IMq511LzcK498)W^G>mUQ&sn8r)ZGudXM&*T-hN(rK5`@-x z6?X2m_CleA%%13VBb^c^ncb*0K`nP7(8i4CO0g_%H+{&10f; z%$`+rY}!CX^z-*xqC*F%qr}&njlSx|n<`uZWMGIlr3a(Ii+^!8cJu#A;i(+wDb_?m zHfM~Z_Py*m#EY!ri)#}v_3ms9;g)HuXYe^1evpuTp_KI2qTN4N5%>9lqkT6*o%<0o z2(VDh4-;y2*^GL)#H_=&PCTYKkOigf6kPK$7VCgM)5Zh%ec)edvNCP8Cqyr&=hJqhAjzxIc<&9JJScAe}FPX=?fDj5KWdi9re-ws5wo@ zc_@X7%u7u@aoAb-Hpurx2sghvfOS4Infn@uz^^rml;SL7QobuO90NVl#L55abOVf* zXC|D{T6Z1_6AKM71%MD@b%d(GrqDhaG~{0;I}XIDiT^iB%?N9|l7z9w{aK|)(zU~@ zS&li=B!isgz!8MjOh(S!co5>S5aTtJ8A{VS|h3n6{Ix26FPQPu$jY7fOb zF@#d4fc5UyWF^x)<5()C7lCRaUu(#g>qxJmjF3^~TA6jBMVNU!M=?P7%~W3Ztm>fR zY#V%cP)k6RwG+VoasU{=TL1)fgiBIab3ttpys$VHFuJ=7DMlTA_N}?Vr7*tb; zEf~#u3G0s@rjFHFC#kcNWbv`l(t@ZtaczbG1DN-ed^2FIgFG|7NLc{F5yAjmt`dVQ z@rf%jOC(#u1tlUiJacmX*DkD;a^9e=g2d7l7}H>CJw#zbf}U3 zQD#<(f?PJGTic9u5l`vllh4lLm3U5p(!pTO;@&2<`yNQ$cG8JIJRbSW+4Jtg*K)!# z#b}*?%(~|cryU`Hm>@VTW#ilPr;L>W^bkVw{H`fHDEAXDm2K6g=pWsa-c1RSmSEQ$ zm0rEjv}xgwz$XmC!BUE11N=fGyP69smqA%&#X=btDQX*&Ts^cHK4RbsvOjrxY!ZBc zL+fxO&TdM}UL+XLyj9GFP2H3E&49#D@L6pd+g^RP#-m*TBC*>VrHXTG$KC3_iKlW; zmd(GQ*eHz&dJmzMD~NBr+ri^qo-@5?JrTXty$w#u1c^JU2xI&KxhNDrS2=GzDYxx0w>zMxq#QMDa( z>~nhvN?%Ylct8U>7)%3|0@{&w0kRlh(YY!x)Kq}uqT;t0`QbM{yLgUDVIKb?=BhCc z0OR$DD*HB=Q!^Rw`aJz}iECdpQDD!ig`jGzW7PrEDM(unPO8w;W;Pa&$gqd_non0p>K}rj^_vE=?=Q45Q=1oRzGaJ0PI8mBzk(!<;E`u#o%pw5H ztwrbAy3g8jU{3M?gLyaI{24Eu->QSq65Bb)RmZdMlc5Sa74HsqCS$%$A9QvX!~PIJ zb;pm!KN59a_jIA3?BAE%4ly~4an!XE*{zVr@S%e7(d-Iymh9AwG^D+thKSw}a#z## zi=iiq8ju)4JS?=9?A^9sSo=5v7i_#YY#7eXT8o_)B_y+_3B& zp=OOqjMiYIYEK>`htu#?F7Wv$LpwofF2J%R;gl^%o)ToM7`s^V?r2!O{OVKqlR0!n zhRc1*$Jc`n{B^aN9%e>eQ$0$Fo8OL~_?-5F2I1i&XCYZgX)++y8=Ccm2JQDA7UkMF z!iv%WvsAnPG%44s7qc6m-b1e(IHEx=x6qDCsWmwwKLmW-})rUX+TC>=W zJtVLq%`~B>X2-83?d{#!FLIlws#bjuXUZ5i z;DF~tR2}T3f)s_{*#{ht3^7H8n}j`)uO930y;(oe9c>5{Nrmy#_m0Z7?=ihl`q2?! z1;tPZDzlaZ*ES3kd0Z&HFKWze)l*2Vlxej>=mt{if}m5WF+-?$W9uh+8w&c4GUX z(AMrr;JtQwF6h&~3GSag(&buHU*}+@nRAVCK)pT0Y_ilaL240j9^Z|{5x6`7*hIh7 z-#%>RMV0QTpX;DC#RFCzShE{U+}+Lk6PnT*VzL3M!fzXve^6xh#&|#=-w?|qKG`WU zt1X;EG(CF4-hk0`f6YcMxrb8JTE@i`&0#FRGh9JTXU+YCvrVu1(hMs)H{vnD-{v75 zZR0a}Uueo5`tLI)Plv?kuf8I9*)mVmxlt$P_Fdo$_kI%SEUWOp0#uj!3?ext(r_sx zEUDIs&&jfIMRCFY+_i)YL78mrW^>Qo51k{U$p-<3t@wLe962&VH+N8>oNl;=Mfh8>RcO>cq$(FTj(YeZTmLw94+@V?wCi(rvOFaX<&K zQK8B*elKSCTKAymf3Mt;CQr5NL%))4bay>!6`3PvXUTlcKHo*zn4_4pbMn3@i^N~P zXQJ-&1PbjcrfIyYn~OiT0#=U_LHJ;cgJ^Xvtxj}FH*uyQw8~`%z{xE?p9}KEf6clY z2TKatf*Q~^S&=9Amedr*s6iS%(+F>zYFu*@cmZ{DfV8O+9rUN(yuw^_jf)%=<-({j z^0vj)f1*_H4~SN zAXsTu`lO>8SQs&pmz%kU;7n`=oou|}l_Ydtc7x1oSohT7D@l4TOa}t= zZaI<=gmfNTfl0O4G?XY1ya{FPnir@H#L3q(+*(dtD!Mw|4#Z>UyR%haJG%5h1!ey& zO?92<6KgMMwuWAms9`bo{V^-AT?nrjSPT%}wD60?cGiKalVSo)5Rut}FIh^fA8|`H zB{dyd?kW0+NItGW3hSb?~_X&Pc=5Kt((hV?QDxmocxx({Gb3ym-ySWtM z2;=P2#1ky;bWc71r^C`_I33QOFzck#Wg{_7mM!O8<-0j15H{woxECIal6dS^^jnTJ zxPjLG(AQgct6^@^MpYXq_Gdy1AX5G%QM}U=K8Su7BH`L!ej6|yP1Qumdwo~w=H%?M z(qM)B2r}=+ae_0f+W2W*2v>{Ws?DRZyKG=^I7)5Wn~~vnHjuPY;?D{g7QaCF+?vA!Z?FBj4Zm`!K^=OffuL;ohV3jZ(Xo~gg5zpUZ4ozdqb3%aWY5j zvUu{g#jiLXyvABOx~?znzd__5UY_Vliy@lJ90_&~$;(FJl$Y(d6qOD-fF+uQ$=K##@vbG3;}LG4BP!tIf*)$j^!xKs0%)xgMe;MZZAGzy$z zJCTWT5Z*k}ie`EjXoYVSu(qI=DpGg@JS8~#y)Dm9i{<}=A-880+Pa@_T23FOYuHA0 zB(yPS7jV8X#zL|({h2Vj}5&7wH&#)7(@QWos$3wJOp>{>j# zt&T}gOO(*+9pPO-=ZSp*!{kwKaja3UkBBt7w{)GG?xr7ty7suHcdlPFUlszj(^Ml{9DrTv#mNT%1R~8jA)P!!@ph`GF)sZguaYueAdvx)W98rH}!D#Z44I;FqZU@ z4~Ty5o7-2GcxEH!@i4Zu0iW`n!iXBI`Nx<~XDO{mEJBbdWM@`D@Zuy;WdGOG)w3|4 zo|va*P^vN&Zhhjo2Ip~QfD`i?j(6}NH0doyv@SXlmaKI)6y}a4MMRn8+??(EX^RKs z(RPb)HD1dG0~9!QhhXLYw1PEwiDK+9`?{F@E&ZbC`2`AsAY^c&QQ{g+HAzNkK4$eO zqk!7^eQ_N7Dbm`f&2Wg%kyTAmP2WhtyAVctdJsuC6!M=!osMl9@N8(hY8>rD zNaoW#)%YuWfGKonD2rA3KF@X?`{=Ur)-;8CS>~&q>!}0uU^XDu?s3XWHPn^mrLnnJ zpZIM`)=P=foaFqL^#wj{k$i?@!vBa>KRB6qt(PjBl%VL}XVGf1VO~r=XTDMLSTPISdsWGyw*l z_nP$@B(>rVUj^JnRL1&V28D{e9cp4+r$&gzHGF$%Spy=&@0fmDdH1=%pdIR8&-v{- z?XIzuzP}Eq+x8++fDCtBm&Gb;5xGxBQN})fp(~ou#sHA#n8{dvW@7|uNwPa3X^bIL zXxRF5tk#2;R##MMXOB+>9|WLei_9W4^9jHE(ev~|3Myb0AvYW6K_as<7hx(TqOKGw z;KeX}=;nyV{ZA9^JawYRZhGEP26TGrX3uFTHfKM2AXt#e9B!Cls{#WNw##Hb94W4iM62YZsji1L&P{>wX>N~B>>AvT(|n(V>8ohLfkUAmEjz^+5$P7`O!>dJmVhUS?xq(P#5rb^ zs*wi|XqrL`;mYOHBc#~KzvkUJiU|m zlpIsCU|qzD+v?OAMM+LXS6iC;7K*GeaxLmESYLZmhkmsMJ2%iA2fcTlSQ$e2DzNBCzd;65Cv@a z1EQE9vN0x>N07G(gv_JSOn{EM?%I(xiSn4jSep~91O!rc&r(eHp)sA&1Jcjd-Q~(R zcRTvehE~*_bHn^_i{3UZV!rg(-ByODxXDH1O#^Z_8c?gQHkaOoKor%T1adu$$zJ8CPT%6DwPRSP>&+kK(MRodIIhUIn+_sZ*u< zH*~sOQiPlYr;==BGBxB~$$A}v%sS?E|57`f@HY(L!}cAAvQM|7V435V~R)X`Nry^mTl+a37p+jK+{dpUbL z5Q^V*63lFWO2z+Q#E|9`|Mo#YCFbM}|*tYGoJa znyU~oW_!syT6JPhxI4=eLTZ|V)JJkQk*``k>Ju#B(uZG-3<9_ZlwD%JL~;L)9+yGG z?tm-fO7Cd-!7;mfopz!_3O=MHm0-LlYK8ET0bU7G*x)pkZtIm21((-35*&1TUc!ff zOv-{a9@S@Z0p{U=OVg8CyKMO4uVV4rJjw%q%6l3CY=y1}>sjefn_$B}ND1~-HKyuO zXya7-0KL-f-alRwnq61%0Afo~;JeVnXJRuqlF)LdD241WuOoBDYOEmj`c(K);YPB&!tKinVdg%SpfUwfl?JVIu7SUfLfzg zG5=`2|FwQ>a9J56m@MV4;*aq$?D7bi;}=+1GRn2Kuh3!EW$ycP+lkt^118_ZC6gtm zha-(05)JUGvqMBKkGJ~WOl#+9uUZ*VqKXs6EF?*?+;B@h-vHk(u9L&p#^OuU3WVBl z%PlrTh4Ygz*W^_v74nIpREc5P{~Wf5QSm0^X5hMYI+7Z+oJE_9iF|qR|;7UbN`*F~mM<&n{AX z(OOektM_@XsWu(6#eo2A-Eu;`kBjq8y-drE5&fo@a=fH~vQScLQ7r0J z0o%}EF1kS5&`W&-QVB8dy=7;!ENi$-G@pM=Y|zc@V?8538WM{(I%D!E!!s7gLJY6* zDfJIqN;>|g(&*bYLyf1Y*(d36;FhMf&fZedHj6FmelO#|W25CYDRTR9SX0<75sZxa zJ&}6PXlF)YurQ}8<06eL(0b6S0J7mav$UF}>RnW~=vGHEj?vc-I&rgZpVyeT--O($ zL$N0%-8cOETq=MHX7`4r+el;8jJBLQz{^#e^@$qSk7jFB$<=aRNMSK5HW@KclCcBh zt&h!MZyzE|*6WhE6fu^TJLJGW{>1N4nB=onz<$Bdc3bNA+Z0hY()M65>l9hAN-wmC z`w*z-^n-5Q?jTk_lqOiGWht9#kA>W3H5e=A#+13e=O|O@*JDXQBBm(4)OlBaSg}Le zcxgjds869v1e@ji1Anzx)`?S9XMg1np}Rjdr1ulIx=&1oA8g-yN?@)wmL;P+i9cz zYA$TLTm>I_g4C?S_XN;ZsEaclVMeyt*xnOrY%U0lDDV@>iBrm6GGZ9Z+@%j(3&Cos z^Cn(i?c((~yf}3Y24Z70Hxt1h$q)B|u&&1g!Gg^Tz{V*DUnUUb>ALRW}w+E-TUne1`8aIaz`NvHOyeYIBU?cMO1zMKr4By7dBg z9oRv3GF9qT>qJw#Wzi9?yvyBddX{ew%TQUQE7DAk`}PMYK8m_El)EXBdR#|YN!_qj zw=71b`~YfRU#h-2D$=Lk_CALkCxnaaBxO6p>IybYkh82)1)UHz7NpC1a=i%*?_#2^ zB4f?46|9NcR5C zHt3KTWSIp(8J6w@0|Kz&Od&6Do|CyoKvI;?yQaZ7>nQZVPVB*=?jF`as#P=dYk#rl zWsj7sXT~;7aKx>m?ssjxQ3ykB{`RD%M-~izNtQ5y=b;k(y{<%P(lM(kD@~(GxiZTf zm3Rt7gi>?o28}U-^-U;-dhMEYdf116E+@@+DM1$%14pQD16WSIlgHLWWWj=`+s_CI za>~+|Hw_Q<%E=3WD>SuHI?f%-sp!ZDnfAw}E3#kQpKm-Z_a>45;t%;B?=Cwl^Z%`8 zWMcX+=3S=$UDi=YA_=E0A@(jI?fs9>qZiVpBVb6$ewOQmfmWk1mEmA6@P@V+aTiI# z;@ut`q7`X;xmsP9g&aAuw8chZn*uR$j98uRg@g=M^ZK)eS`-q8eASvI$2w$NQ66C(Z9&pNxJr_g$`Y{E@=fV zZm;iM+|b#W)X6pRvE$o=JBOTWt{M@npNQY@w>!l*im3*i9`?vFDnr%K+)t+jWIF-NG4pqwD$Q?xrE0is+H!^iIg8$Ta6kHXTwWS9zazQqoL}lk z$2Znp9So;`rX{m(UzbfkqxQ*nBfZe7W@p(EG-tHgJmQ!@w5OzVy{9=i+@CYPub5%$ z?`&F&!kz1|d-V^G_GR2?Z*LRR4GMzt3d?}BQeoo9u^Z2axl?_SBlzRZO zK1y;vi8m(LUm0<|)r0W7S+0@>kP?TSNlbWnBb*Z(o77SEWX=mp=zlmK3Uk5vGOWJ?S7~}6Bf$Egg|fI%+O6M8x64{&hf0 z5flj%L#+Ok%!5L}9eoQMIzfaieTTz?^CLWc3VBhB6315h{N2d`-F%JSw;Hy3{VD-aaYtH!+5l4y|Quo&fiB#3?5hC45ef% z&niTl$`bTDEBj%O4Bp6p; z-UB-wlp!#eUQP+-C%6c=(u2H^KjHR|)nRpy4~O7XC0_T)3PC{Pth^Mr9%yI%rNn34 zJyzl+P&C>nww!VTY0v=Rz~(12g=lmu4w*ksyB_-*C_b=>j!E@mZ@HSC&+xt|HQ9z_1lQ-Poa0jK} z;PmRaEHyYecP;SPT>soC-LhP)nIdA65n(~xl{t;h<5I~`CoVcMuUGgz=$W1Ml>4Z< z-|KNOL4W}xc#*44buo=4_vUk#+!XL`qQ0^qul`A@ndb4GQXCe9^ny$r%NW%Y{7X$} z>@2LCg5mWji2Z?Mo-(Uj%0?uUnD)Z%vqXcFvBRH%eA7Pl+S+^P#Vqavo04eabCHC# zmJ>21>3{vo3FDPRYQyG`YR!Q8 zt){~4j!%`}Oyv}I=f=>;hs}E7)UdlCRr4JvbCc@9cZ!_9(JRlL;AF(gkc^7_Clz|| z`UuWpzcu0ZDmDnaf&zCB+2sa}5qT~ANh|786RrHp@PLq9O-ReWDlV8A0LkkvRBZn+fIhNLn5lrzUYXz&Aw+r z&mU+L{G$G&;Lf;5VyZilt4(dgkz*qK^wUiVZQvXo>lO>95RUI$1qrJ516NgiOYcZv z_qmaV`*Ig9nrYNIfFqYu_XVj}4;g+zkk6(53ekXhhhzdB$DI5C#&dTFY{t~kEZlnp zU5(7nPozD>_nMqSRSm4H`@$G~mgz%^ak2}bi=3VOjtlwpF@KmNfx=-CKnypV9SLU zQqB$_T^<}4s9Ny5zqbcO#FS&i(1(p-vb>?Ih$WB&*z(gPSI4-)8c7pJFBDf1`jb02 zbWrd6wZBE6(yF99Nb0)H%~1)kUP|4)@E~)kEvfp27#TM1V!dx66iN%yg!SRIJk8g@ z;iXwE>2&v?BQHFD$MAJjX@o56AqzVy(<_eR;|%Hz@MCT!1~dG1FlEs=v!a_ zV{Ka`2)RA#n)ShK|NfM>sFCBK0TYq7r0Z6LM+6lpC5h1(+s!{z0G~oGrcX@0;oCnV z0s4V?hTZ4hrTzrV#Z6-MMX3;nrT!Y0&~T_Ls78i8-iQ`bP6Px;-#kEhVrs)al<>AmtH-nL*Di2h4E_#V63sEcDHQ zXXY!>bAX)8Y(B4+&@_{=lrJ)z!TYAq$!P8)k5BqSV&agXQm7WD&vJ+8u0CUp&o^sh zFt#B(DEZ805IeA|z9%R4g>Zg0@D6`^O3&1c5i2-P^_U~mjVNSX8Ak_=Swh@SN6L4S z-F(_qyaIM`HWaRXlZe7G8w$+0==&ivP)s2*Fn*fGixSpJW$@FijlcsM2giXjUZWDG zWR-7csodvs|5TkR%*ev#MXw#MCq&39jw1=={7SbiNo~4=RyEXz2mSQQElxXxU5@Rl^}NMr22%hk&@S zd(LJ-l$R`XxEgE<51D1MaF-THF-yw zRxTg3kkqH$9aV^#rf-dR9F%I*S5n{CKxgv+_mEzkNGKp?cJe`^YL$t`T-%8y@H%*X zeLROxteLE>;Q@BYz$hzWjb~Ew8y&xZ%k8hgInBNgJqV1U$hDGE)e$9m;GY2-ApS=f zOjj)_YXxwk;=L3;a@hw@M@js4$jL%Lb*UbtCcxkc3yo+dJ$Cfv`gpd}5S`sY0?`ND z=cZ;gxWO;Liq9K#ZS%HzGT;m=(cs&>b6!?JM&Xp`6d0c=4MSfC5*|l*896whpTAUy zI73%`Vu!3rZia7OIuer76mLojGCdDv)dyyRcq^Ak3DHYc!%+dV7%V23E#czexp0JX# z2=ZCN7DCoxup+=I z$YS~{sFNNM%*8>|1CEN&H#8=pd4qy$dPL;#8aA=rYEhf{KCHA+Y1~yg8S+<9$Z*uO z293uCbx+A{bcdb(VphPlK%%J(E1{f1^2(F+C7?@Y?B-w~7R=H7nM$}nVe`exVNX)j zWY|U2gJ&mLD5H6pQ(Ip#!6Vs7#oRELC3OJ?z($i|Kcy>sDU0wSA>t2A@zLdpJJESx zK;Z9LAlGg~F{>zpg15C+?AcQIchJO*pE8F3jqSy6HzJ~)=_4f2f#Hh;QlNm%MN^!c zlkAQQM24!SOUWV?EYgnxnWSJ6#a*&U<2G6Bbk$!k%CF8P{d9M>1cVi2jr;M1-OlJI z1^xz7NyCA~RQbs+9K{T+-B8af8TWw+NLt&NX3kn+Pd)-3pLB5m=>=i@S&pQ1Qk+_< zee%9nWpRYay~&ZdcE8$BBIq%maDN$ympiiTK35D4FB34@ z47e|={e+h8SbO*^P=n(X&h0S?@p+3}hR?3zIJ_&XdfJ6SQ>VNH4gD^g;!Y*sqq9bqNyN)EKJ~uq~R@n*RyFZ#k%_;>r@XsY&;e!eS}OCYk^Bf&L;<+ z%mofx*K~xJ*+Yf}g%#K1De8;{It6GO>3j^G=UN=i$N3_%ikSydL1~ZJBb-;SAy$ds zaY|E|J237;=iJ@@zR8?&*O$yxI11^)IT5_sD&3nx&?gD(M2@NE0saCI=tovxa;LPc z11AQ7IvW-(>6Kx%x7`_?wS!sBzv(*!mrU#VM}@~k@tC}sd&W!6Up<5vMLN-iIB*#j z`Jnb6aFlPohAhwJ;F~evK{b+!3fGv-Q>Zl_lEHSFLWm_WOYMh)hqRM4UIdPTh8D(g zm1Eg^4C#^K1BgWsSTTR^&jw5C55)#O3()H1aap({lY0b~>Q91L9lC04J^6$15>yt< z&oPT8|Jidk#!uJ7`GCm{4G$%XH1AG>cN^pv>>wH+54ne~()q-Oa=S}K_TCK>vs)74 zK=B0Xt5o(r^G_U|2*qou-*MSeiy_Jud&@ksTdVW#-1q2)(>~Zmx`GQKO`G^T&Vuqm zdFmTvAD~00$xdb1F#$cXBn{4AP=iVb& zXr0?kXPBOEHftOjN43HwO$t?qyU6FnUj?ODpDftY)@gHKH)b{M)^03gA-01_GXmd*foz zjIFZA9^0e@o!CRV;p$2fXlz@K7wjBblzl4#;;Vv&_i3!BA%?J=4r?B{uW4EV8{ohD z3I;5#kZ{h098%y1EYtHsiAAS{ZxAQ)L~X1cMY49mj^ENOoGo&i;g{ksh|%+2&#F71 zq~!qxGYorA#fO(>PCv`raZT)%@5Q<;a9P#4SnDRR!AgNEk?oKYR5+jnr0>&X6p;y@ zI620TNB;#a6B#c^8Z`VU7v+NG0PdZ0tYRIxCx+~SE+%Qnk>Bg9&FoP~mwYw+?b-oe z#xrY=;93+99HBo9)`ca4=$V!h`i%@;;gGCEi;@x8U=GWTXN^L*bWlS{x!Vvou>mTL zDhjJW2)p0+k{yUZ6oHk8t*OvRhAnCti5-7u{47_Vkbu98_Dd5K-C(V1_IR+RI}Qi; zRtU`j*^M?;;6zA?X}7{RZ3D~jJ;``u9}9;QFY zLqabPRJ#>79gA5(%1$`B$jT@Jsfv9o3$cBId*omO$G&If4={xSHB`f-1OQ+Zbu1OQ z!=mZ0h8DUDPKYViO-gI)ya*#Z<5{|a){6?OgT~b5n4YYUQXCJ)09(!HaP2hb(n#ia zY##l!mje^(L$r9fUcOO-+gYAwc{b-@kW30dVYjlWCQ}1?V4;t@z-1k)xVNxt&<~8F zMJIB@aRuy9|E%A1CTa!!Uz%pmcgE+Q-jcb z(HZMgWj}pgm4?d0)8uKr3ll&Vd_~Z8?A12}DYl^=QPcmGVoDF6wdElRO>1Ic)h3TT z(=OsagQ`k!1V^nQVhS|B5mqYL9gWL*n-s?n0R8Iv{lSQ9}3)jG@Ec_q~(zo0$@>kHMpgi*w+> zcn7BcAt`(&69lMK3EA=;`4OC@qy8Bg;YxwAmIu`L+5|;JOJ*DJvrH`ue{-g!byua0 zA61#)%!o)_Mwh#mMB-P8Z`)F;Q88QBW;AyGh3_9-;CvkS)Ml36UuZ{b~>$*@_&_jnN>WA-OYzH3k0&G)QPWMSM?Q42lh+V{FlyXpiloqcjl%i3$_jIiS=xcO z*!K6f+X5NK@ok>@4!;m6u>Yr=M#L0^*3>Rzt6q|}HdyP}c7Lh2gT5rT;6x;57eg?j zJz;aQNN@CHgeAK=`VUz|e%)dDDkkrAS^?Wx&@g$xBK;cIjwsGQ)G(m@fg}1;jnKAws^hNRN-wL4oz4$ zPiJtis;beh>hguX(oDW=9|N3 z?G>%iYP$BXC!q?|?iSKvijv6qwR0g6aT>WB739EFueiEraU)Q0>%S~rE2cqBlAF!m zYj}>uRm!x!k~BOwMN$R1mQuodr})N-ct!4hos!)lE1^>z;r@<=%VIZ4hR6R@eUrHC z3swL_ZKM#MWdkT;NeKOI@l^iOsaS99-VUOy+p)>BiKY33n|jr}numoN;j+9XhadU5 zB#gpjlojq?LJiUrnClD}Rw2ZbB$n4t2s&#M-^HoGs{@DcSd8@-NP~hd{OnauJe!in z*>{P7Y{I+jRDV^0&~khdeX=t)FeVs+gwyayR{6lxQ!eHiQF0q27_!LSxqt3((YZ$m zf2SPleMV*L=q;tk@XcHBL?`>@q2nU$Yf{Y1i)F|WfQS0Q0|ZaSuF6Jc$$cj}g4#9Hr6w6x|;@ zwaJTq3*a=eF6y*tbyeLff3~~cRXac3y8!3rFKOQL!TacJ@%OfV;uk`!ooOjEd%{NS z{pan1(vU$cv?Lba1vQc~>RfSQTXKHQk8GO9DELO7<7FEQe0$W74b zW#uPNFXpo?chT)Nj?o~R3C?e(MPu*}c?An#bBO> zySq0(G<~f5>-mg^){KQAIKu|%vx3};RTnbwDPO(HnYblK(9rGdA|WUc+6TGQG-!xb zMZxDVCEfu#BIE_1}t$A@W=TqLuV{s|7mej6yP>ryA+>WOH& zU+TuZIavuU=ZFN;1Q?UKf;yJgO0+QqWqtZ@=`TeK=|3I=f{gGUW}8(+n4Oh0Q+62v zGOkGe2{$Pbu6*l@6$Pd*jSC2jqTbNQK)>X1)%Ls1wI0i;V6`vHmn5jVRX5cxF*^{vw4Jkbc zp)zZKp@j+^D_L>5Iw}-UyZ97^{+{2mSgsF;YhHXdj_ShuWVH|W2$wVjk$$`XqCy~2 zr-d2JO5)j&g=`;e{`X8w{*~LvTixO+&~k}U%1UWJ{~@?`mf{ry4>QmrnEO>QD^Jur zbC4aZxs|>mVqL0=D&1y8NoYwp>A^*uZMr6;V%g+r_4!r}A=pLd6c`jjJ-I^&gl-y> zXTp8wn@xQgi!YO`Fstx8&)tDS8xD2+W78sOzQd492tiCp(s{N`XRc+I`!+#WAdMzs zFEe0{b`qNPm|Er=nXLUgZ4OV}U^Y$oQFjg#;~!C?|?^CPLbg4CZhE5b?Z;KV$pmB z&ldCNx-IZjj2WuWQ!6*R@H=;sWNv5b=M6cJG3>gqB2)8Lq~2iZnk>f`om6puib;6Q zv;^yTXYM4V@jmB*pN>^vw&!AL#wj$&z>Ut95ooSKUsI_i$yH&w*40_oIJ5UDTGvU> zdlHX1x$iORKRQAWKl#Om(9{8nnElud8J!+>&I85ER-ncH@2G#;)sg{stx!?8By>Lc z25&>hb)bYqjWUesOqX@>t{$BiiiS%RowpB=B5xIdCC5At&5{9@mb-+(Ow-*$YlL@& zaNj+pTG$Gwn2!nBVR-534)W*sbnb$NM8CGSt|RLZnlFsk77utjek_Jsqk78ocNSAE zbi`>ZmvOSvc=2h>lB|aoL}t#G02QAVBe?~Bu3eO_>y)o%R=*}2uvKzO5o`RkW+Eky z+{Nq+?uHx~{^0EyFo1P;Rn%H}H6{`rHuvYp=uhp#-+=tDhl?CDti)K7)65tY#mhO< z@r$^fz1gWXd6!t(>+tb5VaoHcV^AnH%6f4R{Ds)V-|G_s_O3V=(KAAfo=!WA=HBhc zt=ka-iCpG16HgDY=B{fZbZaju`^WjsC{$IUY zylL7Uw%ausv{Kzayu+ZT>hV!f#d?Yzx?P12Z2Z^LVGYUrmU=JF+*{9<65v#d;mYSe zR#$|K%B|QTt_KZQEN+^78cJ`;6;3DE^#vRqPx(eA{p8WQaSRN=`XHjRKTx25aqQAJ zHsMh~({|!9qPU2kV~*RyDzKjg00Xy|8&TfLYOrYPEO|?SxRff z{;e}Tio)603G%*$-i{5(L{ogvq>8PpwKllgj}%=guGw~7)eJtB=CWHOkdQn5b1&cQ zS&vq2Zwgdy?!`(QsRSfaX$PNBHGjy7KEs^06 z@>no)VQnUC9=vX-EfCT=Ck63bGza;Iv7ZllfR1dBe113H?<>w+@%pqUlUTVs0i{@? zy%JDaSMcp_!D~m&w=N2M8a>-wf3?83x)>=9eOS*Q3oftc`oJk2|6swPH`75qAuCN> zUcN7}{V{p=lWbOkwka7*2MM-FdYFcI;-QSVyyXz*O^Q(L2iUyuTKb1i+`LBPY(7=m z(a&k8c-;GL%&hzKoVL$w+HhQ($&te~-*tE>o^LK9%LW}-UlXJ{TH{AoJ$#_(7y8sD z*3WgXZ%@#|!K80Xnjus6v+)I#y2Y7#kAw~13?)P`6Ei@0->JeB3@0PG{FBliaa98% zmU_zG(^9?lxkM1*0!s&}F*#3ouhHJ81E`<`8E=GdJpzXtK-f%9u4XU`gqbd0wlQM1f^ zo*s{rJQ|}g5<|EwEYf=>@*EiCCLK+Z)7!f}-=C6p^Lp9!q^w9sN6vqpUV1P-bep@r zv%G(}om$=a7K}K)zh%g%)@$T`ANjI5OeeGVu>n6fp1pK&dE)=oiDTd%rj(tRk(S{ei)~BdcW|# z-dTewxht8ia(IdRI-w>lF|(Ol{rP%SvmMRoY`me>mP-FyuX{DoZWZjZIJt~w_JaR4 zeN}DzS}@WV#AjBzZI`#xY2|lrrmSHjmxS|fy>)fJ*f$XE)OE*x`2E3-H{y(0+^Bef zcz7^%@VKoZCykA#>#(1+hcdf$dDqHXyIoCoe&XLvky&dGI$jg|aDJ;I*Rz?lA;Z`? z@bS0W_WCpLY|-sl&N)o$rA&wP`s6t5t^(y|h;Cj~hz<6(-agh2C)6BE$%FIs__4xU z)Aj?4TWTO^u{4OyPmi`ohA!e|sm&e8mUsQ=gxU9k?o4;pZ=;XadSrGF+LaOFna7%7 zX36+(XvH58)WcLb#OKuRy-i8=PpWn^m0NpwM9pmTRlA$h+=hXV!T>+`I$N?fr6{<9 zKfG3MD4AG4W(fmo4#ApBeU2}`k~EI=PmrX8k)cKx>ry?=0sV4{i9j8#eACq1xf|N` za?3WC4p^hV+J3;CZqH0fubDgc06q?`dw>w+vRean1VuF8nz&=hcaxjJSO>(0iBcL= zwjN`MaWT(chF9RHn?Sy&>b=y}f8eeIwbkgbEZ;GLG7E2^Sg3*#p z{-LcDSlvKI$M=a$bj-z#+jKt{KUu*kTSHjZ?Nq6GecyP4XAuCOwq@J&@HyWs98g9J zaWuUakW+Y=Wd=sUJuQU)oOL2Xw%)PSZg$RddPo9rCky|4lqAeoe07Ok+|jwqH(sgm z`1pCw;$qX@;=$4zfB0^S+@dh{oWP)sw@S>nO54D`QdviEHtrc#+3Y8T@&hxS#m~Tn z#pQ`KyjbRqG7hH2r}>h_d%Cc@gIZ~z;%*O$l>nASICIU^^RobzyH^Y5);{abY5>1H z+g4{*O+^Eg-meOVbcPOP7;N1!c3Am1dSbap!F0Rt$QfTyWp$RljSP_J>}u!Bg8`D8 zI5^T-t$R!O+;;Gi#F)RxO-#?!L;ClM#>CmcsMO(Sf!A&U0E^D z2z1D1CY$-*EM>RVi{$mVO|PAe=4cA^9kSaH3n+5B#u{4N$g{h`9?{J?M-isC`oGvb zQ4*W^7X(m$h_h(C4ufDnV(K#zF<9>LR9_elp*`{TjV5hP624DF%}z9(<<>?ZVrdd? z7KuY3uly@&wcZWutJ}0Dvo0?PwmUkR%@(EROCRDZp+O?5_uOspzX>9WFcW0*8Y3(v z!5%4?Ytd%%jnIi}ncoti!C&vVhEpU>FjGhfczkge4t$9+S^gh4Kj#b@fTr4gTwxal z`ck`@Vt@W1TNdMDU$*gu0{9V8(WOq$L?AvrSPo8cN!nxWaty4<$zARdzMJ1{6esOySh5_varO=T~zf)H|N8Fs*mj=(OMDjjF&evGu|ud3sGZhGK5O(3sak0smZ&5 z?+E7`hun2uhy%j>*F469q!-XK>;a)%D7g0de1stA1|=N@LM}VjH(IuVsCtFM2-FQ$ zlg@W6SHu{_;?K?{UpU1ad5Fkjb&$H|M$dSTCRZ5p7qWdGA<4;Yr+Bdx3fVy|=y}=@ zmh%%F6LNs0j{>F1GgB|d!yE&zOsu+&=4kdcr_W2&QHf!_Mrwn=pC~gw!^B^lk}|Z|)5tp*#-tWGQ#6!wMC64(S&p?u^ay(M!1+^FpLs(M0^w=UN}YLc zMSu*q$zg?Nn>tS5u!%_@;VGk!UmAr>l--SvWH7x#olb;0a1R)=sEbN1De1}Neo^O{ zj_PFI1)?Js&Q`PwBtQ}X{ZWFky5z|KMH@zBkgvdr7w0R&*VYn-4r|@|z^sd^g@0~K zYCISjw_&D}gcBC10CY^ib9&9OpC=BTK>~xD>*$(p0!b55Y?azdL*}WK`xBL+x8iy( zzzDQ?io8FI8{~g|(soz*G>>H_6d-Vg{ zC44n`c0WE0PinaK0qVDHD+@V|u=BIViNCN<8lsYh{nC}i>zPy_yzqtN>!lH)h(2Kx zC(uOgheWx9lFQOsoPcN>bpoMLd|rq#f%lHk@vrDb`N#CNtOGy6G6>A$?Z)p0w%0vO zy>mtGtO}=f$ObQ>J*B1DpeU-_gU1zve?i<#L7Pe+RtdclsS6||`R4@MD*IB$wCPrr z(O#m1ISbs^+m@{er|04|+$Gfc7gsS<;cz??RroV4ftQW~Clfb%Ng(~4S0{G`9=`^Y zT$Oym0ga8q1)*oK6xIXFg^^R*1# zJg$#AH-&Z~QOEHntXl7`68hFpb8HmC#NwI|Lf3%o=1>5(Kq$t=ZC@c2_BU|a)!kc&!)AOZ0`R4xH;8%9Yd#c zIl&^1u!c!w*8K$SdN6TV?}=(B>-hMQ@FzJsb&#@FZ)-{oKvqH{)jq>;Mc?XqKnCM!+BQ;nK6hykm#$tTA=z){5evFIH#LED~v2#$jRP z$~{2Ja9!+g-DVTpu{$`;#pG+2$_Q()1^vS@GFp|=F^we&0WAXhm*YZ#$QgU1{UzSI>O_aCbL)5_0OD86tCxRK zxrs{c<_@LGzTwSt9o`v*VKC#7SQ)mlvjCp5-*9;K_w(`!-bchOQ}?%B^HFgP>F| z`cEfm64$@dqcm#th(`Gx7cEt`_Pvml_@feAE1&xuSrln)NsO>v}&X=bdZVY zE(Bd2qPc`L;FjrF$}#IA`Gjd9upG4^9P;1=RgFe-sF~e-D^Xq(LyBb+h!~~Ehyx8| zp_vM{biQiD998hum{eSBe5 z#~LZ7qSPC#S%vB!XBU(;zH(kCAqEKC6-CJbiCmi>l<06{R~S1UG4)a6OYK!Ocxv_a ze6`TAeV%K1Uuc#oa}$iB+d@Yvf*+hUw{E`T5DA%yi$JUFV&HH)Z_}bNg8+A4Fnf}Z zN(pj6t3())+5Rth1k|6A^YiuT$*Dm&$R(TU?RuKGel21S)w~>Hv+~#)LTCO^NdqFp znA~6vI~Wuf2KDB)FYv4q*Ki?~(N?PC5l{8wU8J)G&)9o*?E>e%);= zQU>d=BE4@f-SX?sx&M^ESiN>bH^Vvd-`7?Xl2XDs1)RpIj2SM~XSF^Zq{9SPkY0qq zwy}aRjSSJupg5fe+=Ma~VMvl@-5CHazp#2Jbu5pF9L0s_Z0CW3bysjBv1r@W+0qW- z-N;nGuyiy-N3;MQ3nerQ!^Lg+E?oVjp}BbG1mTwzSaF-Ux?9GTIEHm}I_#AAX_;~g zRXN$zgSKb|WWu@c-IyRT=w!Lt42JjuE94-gSx}=$*HLempr!9793ByxcRT_`%@&mzaeXbT*> zWi|9BDR$G!qiSqi&{Ld6=G0LIT01N}2#GTjwy^lg*pES6Ky{IE=*Jc`)|n`slJ*~> z{GnJxfmFzOhfddP@F#LlJvH?M;bG4lWezdx1YRJ4&{)gMiQB#qgJx(#jx}A94dtgG zxGnmkEQu#CPO-KQmo6H@De{dYShnN#iS8SZR?#_ew~JgfntWy>Hk_m+tDv;$er?$0 zTrerdB>~9+l=&8O@M0#JdTw65C7=_MO&~gShCiN&$o-%r3Eyq)t-nxK2F=GgtUIt$ zp0G8lU(TEX17XD2I`c4okDUA$bBgiGo%%@F!zLv-GRf>*jfk9S&Pc4;pj@O#CX|;| z?$I`q9{B4|t=nrYauLxKqD$;Izs$>9$6~; zB@{?4Gyp(MZrfH*%1flHUV|P^UEQ5sEzqTGlfAP(J|y=Q$WMr( zQ~uHFf94WUKl@O3!+4x`^j^p~*dCoLc(kfe(HR?>F35 z%;Q30rcw0|Fu7;PtH|?t>FaUi!L&0$j+``<`h(ts)(?0*si1)|^Q%m}OmIW@aJh!> zS3?8Rf<7B={h3HCP51`0T=HOfzuiR1Iq=NykD&-jQqp}jVtyi}__1vAj|Z0->-f-L z8_BpFpY?{npmwpj#5s2o1vP%-qQ$=saZFDt#l=*RwjmCZ?Jo{e z!r>#VaoTFIyfdtDpv#7ODmF$OVAXuWvj}3id)RAlT*pr#usgnku?_yhwRoh1uUmMv z`Kr^bNyaN(jL>`tP9G+>XUgm7l}d5+K<8h`OH?7F%}dsGEg}nJMjFiZ^I-$m!gF|S zLXpH|9@1yqM%`G?qSwRGLkJ8NqJLyo8hvce%J_%kgdlcigt0-GnnafO+aRKwaV5=v z#n3Z-%7BZ%d4Z|>_>m{;4~@)P)>L_J{}@+vCKgLDJDOjTC5(F&bTFq-$s0g+uA=AA z*)^*6rcC+6Ydk%P%gj+P*989+S&7;z-a08tRen^}SSt8h^M)M-m$Tdzgf{;2rAc<& z%s^Htx2Q%7@n`k79Ty{chNMVHx07eH5z->NRpW83OYA@^Drj#oH0Q|n$wqar}NL9b}pYylQoQp`2OTK0=D!?)vL7gQ=``x#; zfraq&_q^zXK$N-Mu{+B}5j_u(fqpMmyrD6eg1vdSp9sOjS*#{_7)U%$S0;dQ-=D*o6(#mP%L6uAw(P!ly8 zyGL7uFi0R&%uJtO2F;G4&U;FfHz zD!Cc#W-}E9p*I*`hxcFZM-R6S+IJW_q9{6*V>tI)dh6_~$>n}O+{#UCFLQQDgbArr z3yaF;<#CYoZE^mL@>sUsyfyJ*LNcOGOfSm~fk)@~Lfe&GJHETTj$PakyDifZ#83M) zUFRKN-u3X!rhU`;;pd$W-^02SmX>6F{7o-2qkr9E4qvo;coFs}ZgO?^+*CkNG(Y@c zgCB}Sa3z}&WqB}3vdID7OI78+q;6dh*7>b#zL$IcnK^>QlOCbS>8=*~@}TJyRgN5t zvV%xqAuld5Z-XPwXg$r1TyFqgFV?!`i3^P5BAThl_#t|4b|jyum+eEZ-T5l0RD=YIT?- z$gXY$x?mr@VT^nP%ixOv9jm##Bu!X(o z2HviSL~Ds6{Hw6z;5QD~QU9Kp1reN`nq!!ZMcWvr{^%u;=ouNRe_jF-1WB!O$et`~ zt-RTOxn_)SME?cQ`bZi-OFXY7lnH{o-FzV{vKNj~DL2ExppEc&){gcmk)lvVk_uFS zAi+rfhk7m~tYO#`tBkZxOz-_%hZ~Hs2u-%}!*I+qszWIiXJzGMfK+j7kvGa$NX&ZX zoB%RXD9P1?#k(I-wE;Gc943LVfHxM^aM4bStEEA2IrnkX8o&VQcEyM;lTz{wzJ}tz zDzF*$?ayLCr?6$M3zt75wXixQWb?$FfU51VoN^_ZGOi_VLqK||?U3x5PQHIr(6tcK{gum>F$a!x_js2b7q5Zqh{ z01f+2EZ?gH1yS@9nmF=O{HGCTUPPLH_MmvIu~c}G)Pos3!|eDpy)#Wi4<%W{WDGOx z4BVN-XWYDB%n+A80y@fl)j5(qGotzKjrQEathakq9>xy9gQs-9Ah{M&W%0S*D$=2l zeeaK0;z{B&EW*&<_skanxwKhDN$3@V$3bIX_>2vbwF2G%FBJ2R(-e3z@z=-dj%~Fk zkAnV|i2y~=q6JVL>o}MoeONAy6+r25YrzvK%%J;oZYUmSTX1|-k}2>Fi#OvvOFi1D zWjDo<$j^5fP?LVQ<35>Vfc}&IWh2xqAeaVcG@>`u-6xW5*&r*w+>sPYiF%4XmJ~_$ ztUU!e*((vk(Ht9;a7({ z^SeUxSE_?oo!I1xS|nQS8N3uzOJ#Y)M0ah2IIW{4Y!PfD!Mc!nz}y+($Xti`sMi~) z801%_jfiqeC^^esi0ys7e0muXH-Mv(^4U;47;5==K=>s`wI>5{3j(~m$Qn{H2EnfM zkXY+lTdln0klfMiFW4!SP1C^^$$dRl4)H;?wm;zL(|SAaQDba|)oMS_xm1pO=%SIb zHJXKDVXci7VLwKU#I_%lHll)AJGT7~V)$+7bYZCmN|{XZk_A7JxHx*znN0|?#J`jz zC_&nqx!|wjp+e^n#*V_$1D#$g(-zJrMO7ZXTSVEted-j06|pdaXeXtwYIV`MsbTxn z&d{k=&S>mwb?;F#ycbofG#*#~*=wm!acg6RV6sDfH&thS!B3jGI(hU&S*3#RvILqUE&CwrBXTIlM zj}+s6MM8~p2Jamf{^qNLWLcYyH9hMkeC;>iE*@SaaL;lL;Qpd-6QB$2Ps?H2H2BSO z(>Y}Jj+S}O-j(^VA}C9|W=ZWJ0GAIqI^Z~REQ8)iOc3oTw3Lyt`P{Wl zjK6V(9&frJtxJOLQ{m*_2rUhzO$AhQhGB9c zsg<6fZ^?(&umQZk!!U21y|Q#p=Y#_}8ym)wmJzsDcs@Y5HkkF+!0LGuO{*aFlLGyc z@%#ZF+QuoRP?y8$%O7t8dO1Ge7*6;_e8_Gu520O`eY4gE-c^IYAuQ|KDk^XN5b`8< zpKFg%x#pd$H1M8Q_fdx^rUYy6BEX%DbmC`(yuNK{nIULNSL+M!ddv_W65hSrS^#uc zSlFTMIca3;p&zl95~VoYk<;)(BKDV?*fG-Q%s78m-r1M3*^`V~j{igsom&|T)R1jy zPxUP@#=i=wFEl;fXBT-aIQY;WV|}dRhA35Tqr7fQlXMRMD^RzQ%el@tL+Bi6(EiAf zy}MEvaEO^v=%xEXYHZU=Msj$>5cBkyJ3}@GA8L9W?T#*jJ=D#WoV5=~CWtz2z6Zd# zgjP-r8;h(fPYj!iIY(CNn&6i>C*7+k1fN;(P?XM(7%z20?~jzy93tr!gK}?y%2oG^ zC7lRweemKQ2_|DMj=!26^NcqZP(FxX-EsG%G%*)ThBOU7({~$1RuxDJXdz3*)fKt4 z75H^(jN2S+nmhVcn@k#U=FD8zQLaM<7e7D~1U+ouI*O&-ii6dd623wkR%%bKkr{{y z(&`}LsHw6)Rp?7CIuo!8MQb)O&LzhEkFMuqRpeoEIln+XI2rXR~EQ8+Z!4F=%{UW^5G1Deqy4 zzBZ~RoM!+YvOc`!wmdpd?%|hNzvGJ)wahLRl*y7tEoATRrXH8}@>qEyMIHi#*|E(h z>I&=B-Vw>mwJIXmhEl5&CL7liU8-sf5>);HD7NPi6h<`t3Jut8%q07SDY6j5^phc94UQc!Wkv&l%~I2YD+ix$1!)VW z!6)dlBO0+T-rj7vaALSf%9-`7%3pkP9S_;l+1WTLubL+F$t(WXdP=`%^0t}3>{BdTJ`w!tm7 zRm$GZ@{n`^eZ2e-D-ZpbW&8h)9Q-Gc@K1Nf^#8&M%>QNCp85Z@Y~Q1^nfSXc zA!bd?cO+P^)k{c;atrq3q=iCDcU@P>h>P{g2h+hFHh~EZAbGNDM_LO_F#oHuM4p|y zvR1Ibe<~;`19Hwy?UJZg^^@%DXOS(A*YBWK*Zar3=N&+A<%Y^rflj$PAE4J3-DtC52g^`{$L?ly6%=nbAty{Hk*Ioor-i? zzqKK0+*>%hwDKW0=p@&->s~}@vl!`jE*m{D2US@7_|_-E$z=DA#M6brhp_DE7rfwU z+w0Zu@f4xEIRiwE*&9NC^6tU)U;`2R7bUgJ<>glDW z9!S4ZA?Bp09!mFH4@G-Fot^M~0~^9hM442RPw;MgDpJ-AuRTDspECSYv!Cl~Tz)00K87RB)e zix=^W6{ltXgV}#Yc1NW4#7id|-d`HN6{}j={q($Mc-1Tj>1rf=WXziO=rKYl@RV`v^&vFh<)2`u4N*Ma^StCb`bekzb#Sa+Ey z6ihr}X$!wRLQtumQ~V)r*q~&0g2hrpGp$d&=K&$!)CXsp)2OMjY~I!Ie}~ zr9RcAK85c<$vO55FP(DsO-cSw@v{QR(fS4I|H*mMpxb_z*75i!}?y5gw|4I~ry~QQ8_k}Qa zuoY(G0TP3LXXO^!&Z#OjaUYF30dSL&K>dZa2f&(Q$-jWeiEtfi%5HmogBTwRgP%WlQ5#v7rxO`dh8-Yz>$oWra_G65Dd5j9VZ4*+J14Hc&-Pf5nh_F_VA|Y>$25Ud@mt+? zLy;{G6w+iV;rxKRFau1L`wc9&{jFZxVAf|?PD-`|Q2ECq;Ipk%eB3xCZn zj`UwZz0^L#!5M{Sd{o+foO?+^HnNvytB?gCI;$>Rv1YIHeX!j#iz7d)8WIp(^|XTU zuScqF(2e5c5?W@yyAtJL+nnY7jG^Ri4GYwYDu&2)`;RWv=GWFPiXIoskx)1 zFJ5Xu$Iqa-Iree_+y-B|A8sCPYnl`N+BLxJBkp?ADq){(^GD8rvX5XMi#hEOD5;1r zv4aBwn-Ak%$d``LzlcyYN)kX1GY(HbMA*SV5+vv-6v5g-xKD9C1D3ef6|)nmjRTd& z-XDNnyImSb8}Ft=k8$s*g+7CIvZZRk1@mrloU*2uFFZI~rlc7~+xjuB8?=5NFEW&n zq;Dt`NG>CV9hB7*(lTn1R)bRb=EstaPV6FWw@gS1@AIdS(E;MQBA|O^OV*>x-%sJI zJH)}B1j29hKs|{fOBlGmkq!s0QqnIowgXs2vw04UIcyo9?3v|*){wXu7{o;fEgR*l z_z;t@!)3kN(t#yWZh&Od5Hp&%X}mv_{xw7)lYqPHw<`s(bdwOMO+Gg1fZRN9*w!yf zO?v}MQ$8FpYAa%i(tN3B=*A9 zM-IuS6*lVBZ0bTGRuQ(oDxmIn)0RzBt8U6wa651qnMhciK*Ms9|1#-biKba#*ngC6 zsrD2fYv1<-|PFMc8@Zf|=lXGwa3*hOyRi&3LFfmDFm zyZ~u3tQ>b*t{t@n#}$G=V8N{LCH=SovCkbsh{VMs^H(Y^T?M)fZu_)x;8E4#O>jjR z3p2aV{Gto!`xiPlZI`ccj}ei(zF``%{=vZ$w=%0f18kfmbT8Y_x(1Ts$tAhOZJNwEgx z>z*Rk(7o$I{_{(74uLcmU-rxm%V~9ZMmF+G-!KpHNNCqv#8tb z^&$@UQC?cg*c7j7p?pZ+_qbw!QTYZhO2p87q^H(<5K>w!GuqT=!`k0x98#U`VFm(? z3ti{dCx#;r?>gRF_Yi#Zv{eR%x1bcSiM47;+Md+0b-G6f?!UleMjX2LO@g#J3W?M_ zCRm~11tsWuWMDZB^8iT{DI0c?rsqDeS?X6xnXZ0tt3dxisn9DN^aCIoBr&qZqWF|f zcvVkF}&O z&?HFt?l~xPdt!R3hqCpQ9tB7I0M9WCNln5tajv*bMP;3=1IRn@)vEXT>CX`EQ{fy>ekvBVOSA{2 z#zT~W&ne&&#!>|-+pRRg$xc8K;|`Jmv0lm{VV~3^L{p?HIR2!@ay|oeDN#V5hA8H^ zB_2IJ8f*W_4~7nQmYHOKNvg}GrHs=f3`Z+$fEwm)yl|4O))rliVL@sm{G1Ct;`Z?w z0|(Slf-~iY2^W;~eKkB%fo@sF?+%HeC2yKT`)biQTH=XfsNFf5R}_69dWfl|cUZ4rp8)rE~v%3fL=_T&uJPdR8Z3Pg)mUjOuFLm3A?bTN?`zNI2;8B+mg{ zy^}(n+OEXRjd~`D~W|l{YLuvw0PA75>;`$b_~u#%2O!k7{DCJU9>1z@mbuO0o#kJ^ivIxtmzwE!w1o5S2nwk&2>H5&!4jnc>d8 z!`u6P|9tQJ6ZhQbp6A^2oc&p@g4qbhl5IbRDX)EX_iSqUXGTVT4MAI8Hi?;H7ovXJ z&~N1Wu&9mU&-a;BZj$!@5Z8w?mCd58xLdV|WO(0To>Zjj3E%bGLLJmbdH5b8>kfag zCNAyW&#B5A^Dap{I&xQBd9|B4wS1iEcj5tVXwq<$>>g=; zQ&Zk<+T8&Ae4}4;-%T@L((EMr(Q>@S_HSDVb@@}*y&7}cVgCdAr*YRty*%lxQJr1I zml|C@{;h73gXZ0R+q}OL`G>{gNvi4a}k!!Hqa?8iEPulw*ns?xFOp>!^a?p%J z>vfaL=w@4XxHhI_)w!uYRL>_|wF*&rIDGL{&-CPl@=CiS8qW;oSM76MGw4#y$;L}llT2?db2fcUC4^0HeRL;o z-d;vflWge?*)tBevRv&=BDP*KIXUiv=92NO9OjF=8z$P&wvJ$sp~GLtJZF}a~t3#wBm zr;YG=n||)iB&&>&($RaQeNwC}v{Rq@=t#$CojV*6(o~>zSmsvp-7M+Ev*WdX)GNrZ zzw?N&;KcJEm$>We^|###ISsb+W`D|`)rD$-14&xT69ju*>Tj^ zN!l?7y&^v@Yq&l|@nE~BXL3Y?!e*NxJfBngVNMC*q?R9JZyFj*;1-^t9~{<5Q}HN| zN#bUN+ZIpqCZ1CI`D>Hn{ER-QxqbJHlF{E-ai0yoTx(JKwjz7dy2qnOxr`|-lC3e0 zBGzZ6)iAhQRCK_m9Cf|P31{q&{Fr8!wxKWOSh30Qu%{MRJTGb~RFp2(p4M(#arSKN zz&RdibI9&qUV57=RPx;mZT1h^y=(sH-IoUGf0?mR)5Uw_#Jgdsr?O8E-ge^v_wFOV z5oH-Fk5(I1*NrT4Fe$%xqjawEzM2p16PC<7_;5bkR&(hv172mZT+s8)N@hGVSZ7H6 zu*6HRU-hJkk*>(e^K1+of(9GhBJar88bMUgP(79dqN$35nN1qZ>zpTIMNN9^n{c@2O{O&+~N!p>K zt4}VteBy!mo*$g;Cj(EuF+R5Jky-k)5MTaN?UxVoejP2=3$J&idJbAZIz%r%6HiLM zT(|tWs)s+rE?p*!GPtd9fm^Wdkn!g(1}pUm&mB1=lYfFowhCCcU$p-BbTaYvC8@IXzxSs`kfk*uu?jI=E!F=HWvBgd1^?Up7eawC=$S!NEsXiB|ppt)x4+-gol z|1TaxjLla(a~b|BrphH}irGQa`vtBSD=Ik;2hVVjUBJB`8D2bjj_#xu)qoFrFKo2l zn6uAmQ;(Z0yLiAcPoqA-+eBG+PE&CtN!c~`-NE8XRW_qngzKDWZdW)y*THDb@a2B( z`r1dmt?Xk)$@EJ;9Mr1Kt@viqaj0dC{Ft(<$H!=w9ZmV!vUo+y*?YQH$A4(n6`Uzt|=&d*P(k|_k+{?pIzjvigEQOVnU#-(`1Sk35|ne8uhv<@Cioc4Xg z#O&#Dhi9IR+~_>BV!LhrJQdl^=cgjQH-V-kDpD-ReFnf zr>A@PPKX%ZpMNUJ=11bX!0{!M_P>-5m=tL9%O!8si1Nj^Pk((lcVDv7BIDwY#2Lfo zBCT3tjvk-Rc2M}WYl2$^`$?kB;iCk~fU`l1O0L_4sXXS6vI~gKrqq>AuRpcOId1gZ zTi{b=8~JWGmui;J|2A)Lzn$CCQ&aZVOl(wRw)5tv*P?^y+>!{IlP-e=KyG9I0gZaGCLJmjwp$ z*2Pa3@;}^livM+uw`1N0@G0(94Wo=gc=t;$?%ou3CedD}!e&51)xPGXTQg)j28XRT z)z3G2?YZyuOr`8mh12qQmlj(ZycrWeW}D%Un8wQK-=iPR^tM>2nP*%b_xsuKlT5vg z9F^Q!)niQ;z20x^C_QjY@6IisaE4ELIF|<}dYse|2DteNf$J_o$cvmA(e| z9?mZr{pIb?SD}uKMa9>nUVc4oxO=vp#tHv<)u-n&gHEn>KNjD&%zoep?T*sz!#D0e z7i+)a_4~WyuSk#n67wr~>5kvSf{w;-nKo$l1~+mfeZuTD#U-kodwzkhIcN85+ut$L z>K=47I(GtXvd2Qw3a5+Q)iFL>zJGai{6@~)4q0oXfHhApJgf1sxYYKpshqB1m*_FEZtU0LFOrt#9GH~n6BAlh9r9)6 zswMt?`)_n|zN743nYo&hSZU2Zz3^n==Z;??&7We-Cu?(Ezm57mncm1qiZLJ7k=%H; zF_3!Z{N>S=UdunVmwzRmy}!EJlsi*Cacg>cg>PlqT!y{s##O~n^9%=T>|goq5w)Cg ze;a*`eaBPoem_IC-?a^L<%&xz^viQjPChsG>i(qitjdqsA@( z-r*s4C$(Pp&S`Xdp26)i)M-Q5wu;YDrp$NM4A-68l@8i`Xj{DKR{!J0LtQU^OYrm2 zZ@l!}F2UjJhz)&T_%y$4r7~8i(Cm)r(Adlh_PJ9ULDOnCN%7HMVNd?WTF!$;vX@ z;|D{e+yU?AJ{sRYgukn=(a*YDpPfJcsyMf+T`S;)_BFD!{Ny#`mK-{(+Iq$E+uWUU z_q}Q#Pq;YZ9BcHwmZi6IHg1!$+_myXlC_WX0o4%$hU}YNwsow-!70D&&R;)mrMM!F zTk*2Cx$M17Oy(w44bwBz?bp`7JNc`qpmCzHquuuAvu<9SckMd(D_y?)aoG*VLL(=> zy!-sK{q0*b0}Kso!$Wj^b=-1G3iQll!!sXG-ni$Zhb4z4%O%dfo37f@wou)^K{5X1 zc$6_{&lRG8rjBZAHDb_dd$aYFAjQ#wp-?0K~?!nJT zmd}0^CsP{Nci}_oSh?UMFW*HNjjh?>>SdQTL(QmtQRL&v(R@fNe2IaQ<(u&2$bIY= zS1aE>Y~5cL&yBcTvD@@RerY_Z`DXtjt-XccW=~E0@Vj6K|KiPPZV=m0HS{FNlcp|L zakMF$<9*aT_i0DpCl~wMNPl}9Snzc9u>Nu~2E$Ai&daqs-!$&rh0~l}qdBJjhE}8n z)``>jw&t(o-@S(l?-(Qp3?6v(3@zUMOtuZL(rf+bFa6VvimoW_A=Dl?I)81Dv1+*8 zl~?5vHKfIJzwKjY792`zoG{9T?c(3(<;M|3zSQFAciM(#r=|{1QMa}Jsd(f0<7ETX zc6|6`W$V;vlaTd#QjlY?-N~|DR>vI9v`eje&UMYNd89dZtVdEs?9wb(Md{JzM;j9x zwh&ef10U(L+L$-JNM&J6p}L!f=d#Ve_R{3{xs6ua{WFVO>K(UO8Ok_vEmrP_+^SE; zcbb$N*&gQ|=1W-)p1>qsKX>m;`{t|6quNKRJG2HE&!@iiiq|jv7W_PL@A1ckPZaj` z^{Kz79N*^19-oyWbK;0LEoqF}UGu2enFoSTxRH%IY>$3eb1}@cCD&-SiE#;?Ap0U%_@G=-0g-AiaEw?DeFOf;l6r*InJe z*7nr6ZKaQAHbvi7c2{t!rc{RBzxCzG0-d;w?1|A1{FD`6z3Lh=?3j~79)zpKUB5+DPo1^N@Ac4d%e;^u zk2Gv92OfO&ew^*nA)YFU31>Q%uCJ+?!CkpS$+RLh;%3Pmr_=UcE4S2X$uE8)Yy0e| zPtCKM6N8(tZpn=}Xm+z?SNzU5rl!)@uJ|c5b3z*Xq$x5C-lR`ziy9a6K0(8zGO%Tm zYjauH!6v#zrCFo{^t05bdC>YO?5ZS(bCq74k1X}rXeE15;oGbuyc)kJtE*u^} zV(#zjV#(p#6V3Gv6^M&DL45F>K@fkwCGsc)BV-eZhQ8o&2tqEjwF$&|;2L1$DbPe9 z;ZAkXckdDid;CrU5m!$TBM=h2G=PaHWc4nEWO&F#6p}mn)x|=xfX7`FlIgunA;&iiM>BQG3fN-y(}D$osqq96+*5Nf)3h@9Yn zrm!=D?Il&FqDPq~VU(!?CU^0W*2|+zLys~|!YI>VUq0`>_hh1rDB zX$ID}FksSq(JnI4yktt?C8N_L3hg5E@A48CKrqofWJ=&66U#$pFY}NkV4Gl+S)JO^ zC67!j4_PqDy*SD&0o#NWc4|i#g)FS)W{E<_Uh*vv3C%=^B!P=8f$8k>E)ePOvawsW zhDd0BLL>tG)fn>wk#IakqTOB;O$ZX>B_xTL5RR8nZ}XBY zCZ1#o;t4@GUXuS;@<|qOQ8@DCPV>{H@Q^U6Kxq>hroT5wUKnx315OU3aPiQoShyhZW^QT_;Z z1?ebxrFKT5BHq&eu6E%95r`%jb0JTKk-S*o2?-MrlvW`z{{MofVsShqDUgSd)B>Fi zfjUty+W@-2XbO2MjO@jEii_qUBw-OP%Fk;R;TGiStum!5Th1J4E`6? z3d4D!R9@+m$`AaR}Z|Yqmo) z;?&-jOR>2PvZTokG8M%9h-j9prMPx~N5gC^kk^gdDB!NmX-yBIEKQ@?Xw}@KlQBL1amJ z5E+*Tk^gcYB!NmaFDa7pA2Kfgq4akCLlMh=D3bCY3NHVl^mhJ35l(0bq790q{D*?e ze<*)B|G|woMJ(^3NXmOCxV(pgOqBFu}C$jXhm?3ibp+VOMCt zghm8WI5q*1Xz&Y8@7M(4w3Kl62gy^|1mUCv5^1vu!mv>omk9$OVPt`W&0zzf1dBp4ilB?s4{ zp%aaraPR~g1?~&!b5H;oeE?YGOQ)e$QNq*aD4zw|IPsmhzV0HKfn^D;r*MvqYTvbx zm_Rf$H&uYNwS{Rd;@X8R*$e`bn|GCr&>o%5Bp?z&WU~m!(4(56x|4teeoWK_L?a0N zv;;JW3lcTN(So=n(Ooi`An-;+HrT`_5J_SW6rv~P@f0F{M1;Eg*F?{mOF#mbUH=&g z+JNGbAf`-&gi0a^tTK^JVG#uSMP#Em*gdI;Jrd!;u@bRQqPwVGs7!)zlNKArU@Dy; zkj_NLVE5=l^}61gq&p=q2=yc6k5ITcXoEyfi|Hj}wuB zdP~$$p=9unbQwbOBN0ygt0Al0M7JR_9Rzyth_i`ktMT8wGLrd-I>7he`PogdVwU}1 z^@AQG3H_j>63P7RK|00!G#)v6ONoSV2|eKJL2QEzyTiMf0H(@15%ho{j&M|ZFC-%yX#?7Qz@%)#TSM{4Ok zJdLIvEiL~_Kzh(NCM?I@_m6mH(d~c7y?;;>r0^}mj30EQ5-z%p(#;-T1zCMBdIX12 zuxdwi8#fSw#WSMY5}rm6#J{uM-IGj4YQf!iDwaY1zjca~c6;cw+c%Z$GVrWK3M$=q zfRt%Pw`2Vl0!~6Q25>^I5@y5E1n#=hg$sJtwz<#TybZ;z>jDR8dR3 zj3ODW=r)QpJRuBc;GUL)4@B5Uf)8BSbwXxq^iRe}<@Mio|l-9(mNWixf=9 z{}Dw!yEnm%`5z(b+0zLowf_uJ&pZ-ySv~ToXYVDL8vY}SdUiu(F*npBMLoL}!366c zQPi_H5zK-92_nI)q^KoMX$8}iqT4;anqcBk)Dn+K%vtn^sAmTtnCuhv(=(zTYGYN>gx4DAZEYTx)X8mbdvS-sRn12%Wf{J^4AgpH_E|@F&cNlv%=7M=0 z5yl<}>$$Een0WbTG=h{?*iO%h$AM4PfXnXwo*aJ-GiR>n$^eewSP%FPfoK`v%!d#8 zfTw9d?Oe2?679=6(Jc1#=I}K1e7UY@3CfZO^KkM9$CeOHoVxzD_H^ZY@az>B6efHsiSS*B)}B7PK0MFP>u%l&sVQS= z>td4;n91;TLDSI<9<+h&WVdM4ung}82U@bRIR1bHkX>}8BAw4$80ea_O=iwBWlLbQ zu%eEPr9hgx*i0pLv6)2y{1mX60z3`;LsDQM`^Mp={3HVMFZ>toe_^X0S|HDKbDxa# z0sj3Dh8A6*>STvtXz{};k`tfPhCnM=|fOX^$O*lU8d=CY%0YqDy$M@$rc@u(;IPA%lxv4Nz zr*Z9oP*NF7E;1})S>WSw-v*5veamUbE3F?bY`?ofLDP0$eSEcCHas^Y%(|BOVdkut zn!ZZf@7$l;@87!od=g1GS1xaLEvs)+)cUJGj7)7D4hKeGsAng-Z`vJC zHGJE6Z;hg>?|Ij{N6Syo9B}-1{xqo-dyI6)ZhpVu{KNH9+sn>Bl;Ya6r&5ga5+CRH zyDpMpR1lU-> zLV_|aVg>~wAxr0g1flE&zOk?wx)E$-@C`{|DxD@KjDi&b-8oeXI{W!gg^@(`_Vfwh z2_@16oR9@Prz_DrfXnyveupZ`pM;&8m&`pslbH8KX~uo2_ewH6e9f73Bmt`=rj$S^#cEN(++6^ zj=EEj@FT9sg1UM)l1xE+;Qw5a{oo_>xEwdWv!^=|x$yUN_kgcJVP61%@9K%&1y^82 z4bj=($;FGq7v6UlT_XrU6L$iL98hieexfU+Mb{dZw9V1Tz9mlFg}FcDV< z`0_ab4!=(41;Pi(20@TNplN`k+pYuy$u|}`d2@*PG(-=akqC}R)L<$w!QnFu64L>W z1KfEER02_#2b*gc2#%t1@>{@xM_X_SBZu#4fLns_QrE|w3(i#p85*DCy+i>bgFj6@ zc|4G5A;Gi)g+c*nKuQD7R-8dJQ$?r(=8HoCz7si&q$`OM0J=4Cm^5&nC|sdY&?e8t z)zQh>(bd(JsJ3V(ohk*~qthHhCPyXAIWL|LLa_u#at@&48WEAon&)OfLop93gUKOxvHP49S zw9YEP%61*k-Z+@2GQYVf@sUi$nTjIYGpt-_rITlMyPH9o>7q%WKF*oE?&!LTITcwI zbLLP~7JU8w_4~K4rq?gll~=#`(BktvEi~_!RZR5xI_=6VYO0Fbbw=o-@8^4o>v>XF`4-qeq*{+N8| zbcJ_m#gmd}CAXo{cQ&`f8yqU~qNhCbTk)d3-$dCdp%>pfwQzQ6e}BKOL}gLTy2_6wwmK8C3PX@HAj*gK{@))7+;e1;F3#`^1y{_23SDA zpphh~4-IGnN`2tVPW1s#cBeqF*7cx3C}SyR@Q6q>)MbrPhMMTd4d99E9dhgsTJK=M zzt=k^TJNlOnJtK1Iq7cbjjV=>BNqzhW`>{kZd5ks6%V)7o1Q*nh9Pa{u{y_Q4dno` zd(1oX9q4Vu1&{ZK?=8#X-y3n;*gRV1yL+_4g(6)&&8V_(tp#x&7fuZFE#w7h$A$0f zJ1QZnNjo%$=TDscbT|9=L8DcEIZ>HM`_Z`bo1%MT9t@HL8Dqp6=4KCqpprnGk5 zjyu*xYX^V&7B@fV@Pg^1YDjy>`~6OC%c)8+O@8} z>9`WFKV#L3q)m0NIzD{fy5-7*b#beBtK~yR)ykT@nAoPhy7EMa^V2)OW#=V-ifenk zAvG~nwd(TiSfXR$q{4Dk_qLixP4q4;NQKByvNmAPo4|DoA01YG`Ms-s$>QegF223S6I6 zsL=I2c=~cZy{Y^R$!uW=82`>LvYde{fs5j3pEyLs2Q7Xu=#W(&feT^ zpIzdsn7Dm*QF%EzIb3hfgPfcPIfV*2Ieq!gI@L)XJF*jouI(6au$$5*O z{j%A?z}CB~7O}SKRxBScAHr#$;;+Lu`0_e4^ELRnb7$rf^<|lQyBg=`HD(XEv9Xpi zrCqV0?N+P%j=Ig`D}GnZnN)K4B=z!T{^h`Xze73-)6OSnWMvqqI4vx>Jbqo|JCmrI znGQcnLaG}%B_|&_wjO2fTsP(^$A>j*Z1Yd8BgWI4K9fjNQnsTb*W$$%x6P@$=nP+Q z=oDLkg9Vl{F(A4G2Lk~CL^&Avvdh81SCS(%Dujy11Ua`@DlW>l1r9}+io>b5Frycx z@YvKI$->2Qb8&%3;%T(NqatX0I@?{W$7G=e{wTZ3%ie0zT$Qvy&*(tQYuDnlt`9xY z;N((ri7X#AzG#5`P5KBgGL#ri-zQIF(7ZfTV`8f2Wc;j%ag#MpKmA}?)HgM0m*8zF zaxKXUnn!me$daG6Resg~x+S^2k3Z8dyEZtxwt17RVZZ5{p-N7iCS~0lzm6Z7?L*7r zXzyKyCbVk=w`@|`8m4$)gW1&su^YceDl}}ko^@}>mx+5eF5R*5 zw^ZnxA72Ky>+49jX2vSaeY@@9;67%zXSB5)+VfOJf2`~mm9~&}eyH9XvmwWZx7!?i zem5<=Z}X55iVw}g+&269(ba=?Ed1e-TN5YS+V^HnM9#)li@pw68&Vip_+d!!?~Q4N zQ#THuP`=6J;2bTw_D1vm>$a57*kKLj%3a*p?D1^)4ik?_tfI6!?T|sWrcEm+Z@ASCWF2sh~#wqKhe-!x2UM~tgm|!n`fZ7%*W6~m}e(9TW zVi9xx5^mOofz}0kJ-&`S^WtiiRm`u&{cc^G!ujfQH~dxKv?Mjc85^tXYRcsCw(m~A zuyN1TIKxubJ@@6Bx-#KV61QJ;k)MUNR;=mXC@Z_jr)t}eB~7~48j=3=^$G4a8?XII zcKNFNR>V7(IWm4rcQkF?kT&f0)n|l(2GBU}woid)OGDJx@AC9JeI~T>*#W4}+>50* z?e;#om%enXTreXco4BN4uR3I$qJEUfd1^^tw`p0O!^!PO_EM&~?N3UvGhblz_N&*E zESFm;=T8kw)?dY4KXWEjJ$}anKH9Sjr zUl$fWyX2~7JnifThj;07Z++`vrF$34O~@=;{W$k%gYL(!mc^LO>1HwV})%eAQ*` zz;oT0JJuhE({MRL6jFwsan|2zX>@V<(xr*6 z^1trv8BTgHm+En(Xn0%!<#x%~+9O|XnHF>$scH_boTWTrOhQz>`uE>?UTJc>OT%hC zbj`=mlXQcEoU8AgIh7MXaMQc{@}bE@kFshrug|%5DO=bd64Er+%$r&}H~(e(thpWc zUcdhmT#+ne`_lQjS{a@CBqBIt+J%hL=Njcl{llNUjk;bpdiQF(ihUoerZ;^0IC}Tk zscTE;+E)DpI%xlZ_!HddTKR7 zQ-6a@$&8&v%*hF->SmZeo@Tmtp|;Plsl>fcw?+)z`{0c|*(}Dxu=MmVy?_qr%Itgf zc}W!cQBJxhL(08a+gtosWagcKR6I_tRLW~AC#U@2rIRSOeF^WJjt8vNKJ|Nc(5Uda zN0$;RU2m`5W$M@OY~YCw6OY!w+~YW zHO#)WtX=Wz#D{%ivo?i4USBvZa(LKj?J-+6Xy;XDuRn9xYKkk}QQOff+Lq$uxbsZ= zbL+wl+Og}SR&x&Q4$7iLRE_I%HuKp-x}%HV$5#$>>&y(JKI`yF+8*uoJD*p?rB0Sh zQ(@eq2PrOI=Y00|?Ww`L)v&WxbtOJ@0pH z?WGDUxx1UgCb;ltjGr{{_W*Bo=!klNTcE=#lNT0ur0G|bqzvQz`ai8<+WCd554_|Y zI-*W?#&DTKD<T_rz#@zM5BX`dIv)PE=&yJ&pKC=NV6U<>S21V}CoE)ZK{IzCNRnd`oPfcG2^;y-Y?7g*5t6J4}t64h_=BG&AxTSM| zbNOsl%#$V!lX{=?=~hm5C%yy^H8a~eVQAagX>W+e2?Jl_4J;}}2cIf&4RGQ3&zNs+ zqA=gXm&X?@Dp0UovPi+4ZJ@z6Ffq`zG*Dp9qC={{Y{K&?p1wZ%U{+;@z9v}Y$^eBr zCYV8js1!TUz|_~Zn|q!66odRZZlEqr0lOl>{FLxNV5~v$O~Fk8fl(m_6<(1G|EJ(1 zgn`}n@XUx945G8(WdLF@68KmPrX74A-m8di2mYqQi>}Zx&@T;M@Gk}f+e_iIaKvGB zI<6gf7G9qw)(&iqg;zg`!ANvuBPtpO{-(j3a>Zc~6JA}4hEc(mS9sHfIE;mCOcjHH ze&J2KSQtD}AO<7Rso3`boMOV81kvqaR>58w4Wp8&6!^Gt42%ZPwTr^e{XHVoig0 zEuq`N_#})kOTzfF;5EJIXJLF;nt{f!aQMIpW^{}kP{D#-cqa`SAE1RLVSHKm@nw+U zU2^DWfg%8D!@$TuiE;f>>G1S1`dKR2It}k35{FTk@J=H!7{nyOXK`U+@V-DX7>Pl~ zz6S|x1BchCquY_dc}h6GfbHgzVDRR5^s`hFgNl_67$3YS2i*>cAN-XkF&GtAK}~;ALWB z{W571>>87f({peH0lbM8{VbKlBxCi61n|MDoYCz_Okl6@a=?I#hv;@-j2PH42Ypbm z;|t@%*;p18FbjhZ=sr&0AYgK^asXiP9w0GVz>B~utQV-h%~y zbVVEnNWsFui@-ZA(Cq*|ARbs4@C+E9QX!BX;QD1j@L@SuwxFwI(T8F*s~-S1N**kAGmP?6=l2)V=*Mi z1_M3>1k(o-tE<4`AUh1v?Z7E0fC-pq0iW@D$zsAg8PLyCfr4P|IE)W#Hy|pALGWV) z1|5r!B|%q7AQBUA2jheH@}p@19}%Eo{XWoC5;iWOg5y$fG6~MC#Nq?dAKs3GgaAGj z4c#vlz;Lnwlo~4sFn#cbX7sZlqz1vVI1I=Y9qTKAg#b{+nE9{Vil1KFd8ZU@W(1KwqV zhJik)@QQUT496D`N#X1eFdNvI0rX18#k=4{Z=8()Fr1A5#uyt9!T7MT4>(l^M4mXB z>G0MF%zJ=93cQ$Dj1TL#z+Mst&W8e8;IkkweK4?mp+XSO#=`ipu>eRzK}Lha z$Aq^TV)|fWWeD_vi^E`iSa|_QxKZJ4$QXRUqvK)lc~D~QfLF!R2jj!?0Gwh(#n~$m zdgJ&4VE7mgI13Cd03S|Xz_u7BeE5_YeE=UW4**9&VP%pEvUseGfbn7F1)RUef)9Mc z^nn~bkA>l7mrTa$K8z1*|G>r@5dGl#K+Xfi^nq+#5rcsb3t{yf;KSuO;Dk01+2Q)2 z;`jp2h{wmG;ACEm4FmW9r^WGsL<2ctUW`66P)n@u0Wh3>0gfN5=P*8O91Dj6cpU_C zj~^pC`~@K~TEJ0cI6VjWa5@MF7g(PRjuDfmq1R%6XOAJGg#XR`eov3P{6xkb7vTWe-B`a@$bRH#_gaF z;2E&v0Tv@;WCKKX6nL*Hnq~@>35qS^Fc=@+z5oY|u^WI_3_M>zD20(1pfVD40d`2( zenBk*OA83>aP|t|!@e&C#30z(7Zuba@HG#hAUN3t)*St|={sHQ+u`LDQ!^Wpz=MN~N;CL@VFUb^K z>JbdX<|H8NK@M)j;={)6Kq>LHNN|)Q&c*^5Rwh9o z$XVdxeNb6A+YTz>xI7++71qyy_W(sV%=-eDg04=eWo#>CZL z!RAS%{6b zuuRA?0cf6rYB91pTMWh`As>uE!vM_?HWq+kIQfIX90o?#KqU=S)5LiIiYj0tM;r$5 z0po;+;q?Q^DW)Ba4;OEcsL0{JnD>wnC&CdWre6pMDt0UZK3rZ)qLc8x0z_h1d>}-^ z&Vzy6o`ichp!s;Y2cZfsz5-&3)fsR|03IKZAsnCK;0N=*;PW9kA4;Y&@$nUKaJY8^ zORz9w4(7&~SpN&^0w8(D_Dg4={W;&?3G5;8CunIY5G_5|fQ@({(ju~befbKY2L-kQ z(a6WmR{>}gIF^-Yq_1GFHIHcsbelR)SC396=`%r`W2g(JRUo>qA&X?dBx(P13kUc_ ZSRUWWpN~w3Qo-Q`OeR5D*}%+@@PB+?|H1$O diff --git a/speex/doc/programming.html b/speex/doc/programming.html deleted file mode 100644 index 7b5bc7ae6..000000000 --- a/speex/doc/programming.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - Speex Programming - - - - - -

-

Speex Programming

- -
-

Encoding

- In order to encode speech using Speex, you first need to:
- -
-
#include <speex.h>
-
- You then need to declare a Speex bit-packing struct
- -
-
SpeexBits bits;
-
- and a Speex encoder state
- -
-
void *enc_state;
-
- The two are initialized by:
- -
-
speex_bits_init(&bits);
- -
enc_state = speex_encoder_init(&speex_nb_mode);
-
- For wideband coding, speex_nb_mode will be replaced by speex_wb_mode -. In most cases, you will need to know the frame size used by the mode you -are using. You can get that value in the frame_size variable with:
-
speex_encoder_ctl(enc_state, SPEEX_GET_FRAME_SIZE, &frame_size);
-
- For every input frame:
- -
-
speex_bits_reset(&bits);
- -
speex_encode(enc_state, input_frame, &bits);
- -
nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES);
-
- where input_frame is a (float *) pointing to the beginning -of a speech frame, byte_ptr is a (char *) where the encoded frame will -be written, MAX_NB_BYTES is the maximum number of bytes that can be -written to byte_ptr without causing an overflow and nbBytes - is the number of bytes actually written to byte_ptr (the encoded -size in bytes).
-
- After you're done with the encoding, free all resources with:
- -
-
speex_bits_destroy(&bits);
- -
speex_encoder_destroy(&enc_state);
-
- That's about it for the encoder.
- -

Decoding

- In order to encode speech using Speex, you first need to:
- -
-
#include <speex.h>
-
- You then need to declare a Speex bit-packing struct
- -
-
SpeexBits bits;
-
- and a Speex encoder state
- -
-
void *dec_state;
-
- The two are initialized by:
- -
-
speex_bits_init(&bits);
- -
dec_state = speex_decoder_init(&speex_nb_mode);
-
- For wideband decoding, speex_nb_mode will be replaced by speex_wb_mode -. You can get that value in the frame_size variable with:
- -
speex_decoder_ctl(dec_state, SPEEX_GET_FRAME_SIZE, &frame_size);
-
- There is also a parameter that can be set for the decoder: whether or not -to use a perceptual post-filter. This can be set by:
-
speex_decoder_ctl(dec_state, SPEEX_SET_PF, &pf);
-
-where pf is an int that with value 0 to have the post-filter -disabled and 1 to have it enabled.
-
-For every input frame:
- -
-
speex_bits_read_from(&bits, input_bytes, nbBytes);
- -
speex_decode(st, &bits, output_frame, 0);
-
- where input_bytes is a (char *) containing the bit-stream -data received for a frame, nbBytes is the size (in bytes) of that -bit-stream, and output_frame is a (float *) and points to the -area where the decoded speech frame will be written. The last argument indicates -whether the frame we'd like to decode was lost. A value of 0 indicates the -normal case where bits points to the bit of the current frame. A value of -1 indicates that we don't have the bits for the current frame, in which case -the bits argument should be the same as the bits for the last correctly received -frame. When a frame is lost, the Speex decoder will do its best to "guess" -the sorrect signal.
-
-
-
- - - diff --git a/speex/doc/ref_shaping.eps b/speex/doc/ref_shaping.eps deleted file mode 100644 index 4ef7007f5..000000000 --- a/speex/doc/ref_shaping.eps +++ /dev/null @@ -1,2045 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: printout.eps -%%Creator: gnuplot 4.0 patchlevel 0 -%%CreationDate: Mon Mar 6 17:15:27 2006 -%%DocumentFonts: (atend) -%%BoundingBox: 50 50 410 302 -%%Orientation: Portrait -%%EndComments -/gnudict 256 dict def -gnudict begin -/Color true def -/Solid false def -/gnulinewidth 5.000 def -/userlinewidth gnulinewidth def -/vshift -46 def -/dl {10.0 mul} def -/hpt_ 31.5 def -/vpt_ 31.5 def -/hpt hpt_ def -/vpt vpt_ def -/Rounded false def -/M {moveto} bind def -/L {lineto} bind def -/R {rmoveto} bind def -/V {rlineto} bind def -/N {newpath moveto} bind def -/C {setrgbcolor} bind def -/f {rlineto fill} bind def -/vpt2 vpt 2 mul def -/hpt2 hpt 2 mul def -/Lshow { currentpoint stroke M - 0 vshift R show } def -/Rshow { currentpoint stroke M - dup stringwidth pop neg vshift R show } def -/Cshow { currentpoint stroke M - dup stringwidth pop -2 div vshift R show } def -/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def - /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def -/DL { Color {setrgbcolor Solid {pop []} if 0 setdash } - {pop pop pop 0 setgray Solid {pop []} if 0 setdash} ifelse } def -/BL { stroke userlinewidth 2 mul setlinewidth - Rounded { 1 setlinejoin 1 setlinecap } if } def -/AL { stroke userlinewidth 2 div setlinewidth - Rounded { 1 setlinejoin 1 setlinecap } if } def -/UL { dup gnulinewidth mul /userlinewidth exch def - dup 1 lt {pop 1} if 10 mul /udl exch def } def -/PL { stroke userlinewidth setlinewidth - Rounded { 1 setlinejoin 1 setlinecap } if } def -/LTw { PL [] 1 setgray } def -/LTb { BL [] 0 0 0 DL } def -/LTa { AL [1 udl mul 2 udl mul] 0 setdash 0 0 0 setrgbcolor } def -/LT0 { PL [] 1 0 0 DL } def -/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def -/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def -/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def -/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def -/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def -/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def -/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def -/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def -/Pnt { stroke [] 0 setdash - gsave 1 setlinecap M 0 0 V stroke grestore } def -/Dia { stroke [] 0 setdash 2 copy vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V closepath stroke - Pnt } def -/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V - currentpoint stroke M - hpt neg vpt neg R hpt2 0 V stroke - } def -/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V closepath stroke - Pnt } def -/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M - hpt2 vpt2 neg V currentpoint stroke M - hpt2 neg 0 R hpt2 vpt2 V stroke } def -/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V closepath stroke - Pnt } def -/Star { 2 copy Pls Crs } def -/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V closepath fill } def -/TriUF { stroke [] 0 setdash vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V closepath fill } def -/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V closepath stroke - Pnt } def -/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V closepath fill} def -/DiaF { stroke [] 0 setdash vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V closepath fill } def -/Pent { stroke [] 0 setdash 2 copy gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - closepath stroke grestore Pnt } def -/PentF { stroke [] 0 setdash gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - closepath fill grestore } def -/Circle { stroke [] 0 setdash 2 copy - hpt 0 360 arc stroke Pnt } def -/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def -/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450 arc } bind def -/C1 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 90 arc closepath fill - vpt 0 360 arc closepath } bind def -/C2 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 90 180 arc closepath fill - vpt 0 360 arc closepath } bind def -/C3 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 180 arc closepath fill - vpt 0 360 arc closepath } bind def -/C4 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 180 270 arc closepath fill - vpt 0 360 arc closepath } bind def -/C5 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 90 arc - 2 copy moveto - 2 copy vpt 180 270 arc closepath fill - vpt 0 360 arc } bind def -/C6 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 90 270 arc closepath fill - vpt 0 360 arc closepath } bind def -/C7 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 270 arc closepath fill - vpt 0 360 arc closepath } bind def -/C8 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 270 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C9 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 270 450 arc closepath fill - vpt 0 360 arc closepath } bind def -/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill - 2 copy moveto - 2 copy vpt 90 180 arc closepath fill - vpt 0 360 arc closepath } bind def -/C11 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 180 arc closepath fill - 2 copy moveto - 2 copy vpt 270 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C12 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 180 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C13 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 0 90 arc closepath fill - 2 copy moveto - 2 copy vpt 180 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/C14 { BL [] 0 setdash 2 copy moveto - 2 copy vpt 90 360 arc closepath fill - vpt 0 360 arc } bind def -/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill - vpt 0 360 arc closepath } bind def -/Rec { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto - neg 0 rlineto closepath } bind def -/Square { dup Rec } bind def -/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def -/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def -/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def -/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def -/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def -/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def -/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill - exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def -/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def -/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill - 2 copy vpt Square fill - Bsquare } bind def -/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def -/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def -/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill - Bsquare } bind def -/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill - Bsquare } bind def -/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def -/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill - 2 copy vpt Square fill Bsquare } bind def -/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill - 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def -/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def -/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def -/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def -/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def -/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def -/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def -/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def -/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def -/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def -/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def -/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def -/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def -/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def -/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def -/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def -/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def -/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def -/DiaE { stroke [] 0 setdash vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V closepath stroke } def -/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V closepath stroke } def -/TriUE { stroke [] 0 setdash vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V closepath stroke } def -/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V closepath stroke } def -/PentE { stroke [] 0 setdash gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - closepath stroke grestore } def -/CircE { stroke [] 0 setdash - hpt 0 360 arc stroke } def -/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def -/DiaW { stroke [] 0 setdash vpt add M - hpt neg vpt neg V hpt vpt neg V - hpt vpt V hpt neg vpt V Opaque stroke } def -/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M - 0 vpt2 neg V hpt2 0 V 0 vpt2 V - hpt2 neg 0 V Opaque stroke } def -/TriUW { stroke [] 0 setdash vpt 1.12 mul add M - hpt neg vpt -1.62 mul V - hpt 2 mul 0 V - hpt neg vpt 1.62 mul V Opaque stroke } def -/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M - hpt neg vpt 1.62 mul V - hpt 2 mul 0 V - hpt neg vpt -1.62 mul V Opaque stroke } def -/PentW { stroke [] 0 setdash gsave - translate 0 hpt M 4 {72 rotate 0 hpt L} repeat - Opaque stroke grestore } def -/CircW { stroke [] 0 setdash - hpt 0 360 arc Opaque stroke } def -/BoxFill { gsave Rec 1 setgray fill grestore } def -/BoxColFill { - gsave Rec - /Fillden exch def - currentrgbcolor - /ColB exch def /ColG exch def /ColR exch def - /ColR ColR Fillden mul Fillden sub 1 add def - /ColG ColG Fillden mul Fillden sub 1 add def - /ColB ColB Fillden mul Fillden sub 1 add def - ColR ColG ColB setrgbcolor - fill grestore } def -% -% PostScript Level 1 Pattern Fill routine -% Usage: x y w h s a XX PatternFill -% x,y = lower left corner of box to be filled -% w,h = width and height of box -% a = angle in degrees between lines and x-axis -% XX = 0/1 for no/yes cross-hatch -% -/PatternFill { gsave /PFa [ 9 2 roll ] def - PFa 0 get PFa 2 get 2 div add PFa 1 get PFa 3 get 2 div add translate - PFa 2 get -2 div PFa 3 get -2 div PFa 2 get PFa 3 get Rec - gsave 1 setgray fill grestore clip - currentlinewidth 0.5 mul setlinewidth - /PFs PFa 2 get dup mul PFa 3 get dup mul add sqrt def - 0 0 M PFa 5 get rotate PFs -2 div dup translate - 0 1 PFs PFa 4 get div 1 add floor cvi - { PFa 4 get mul 0 M 0 PFs V } for - 0 PFa 6 get ne { - 0 1 PFs PFa 4 get div 1 add floor cvi - { PFa 4 get mul 0 2 1 roll M PFs 0 V } for - } if - stroke grestore } def -% -/Symbol-Oblique /Symbol findfont [1 0 .167 1 0 0] makefont -dup length dict begin {1 index /FID eq {pop pop} {def} ifelse} forall -currentdict end definefont pop -end -%%EndProlog -gnudict begin -gsave -50 50 translate -0.050 0.050 scale -0 setgray -newpath -(Helvetica) findfont 140 scalefont setfont -1.000 UL -LTb -630 420 M -63 0 V -6269 0 R --63 0 V -546 420 M -(-40) Rshow -1.000 UL -LTb -630 1056 M -63 0 V -6269 0 R --63 0 V --6353 0 R -(-30) Rshow -1.000 UL -LTb -630 1692 M -63 0 V -6269 0 R --63 0 V --6353 0 R -(-20) Rshow -1.000 UL -LTb -630 2328 M -63 0 V -6269 0 R --63 0 V --6353 0 R -(-10) Rshow -1.000 UL -LTb -630 2964 M -63 0 V -6269 0 R --63 0 V --6353 0 R -( 0) Rshow -1.000 UL -LTb -630 3600 M -63 0 V -6269 0 R --63 0 V --6353 0 R -( 10) Rshow -1.000 UL -LTb -630 4236 M -63 0 V -6269 0 R --63 0 V --6353 0 R -( 20) Rshow -1.000 UL -LTb -630 4872 M -63 0 V -6269 0 R --63 0 V --6353 0 R -( 30) Rshow -1.000 UL -LTb -630 420 M -0 63 V -0 4389 R -0 -63 V -630 280 M -( 0) Cshow -1.000 UL -LTb -1421 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 500) Cshow -1.000 UL -LTb -2213 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 1000) Cshow -1.000 UL -LTb -3004 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 1500) Cshow -1.000 UL -LTb -3796 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 2000) Cshow -1.000 UL -LTb -4587 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 2500) Cshow -1.000 UL -LTb -5379 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 3000) Cshow -1.000 UL -LTb -6170 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 3500) Cshow -1.000 UL -LTb -6962 420 M -0 63 V -0 4389 R -0 -63 V -0 -4529 R -( 4000) Cshow -1.000 UL -LTb -1.000 UL -LTb -630 420 M -6332 0 V -0 4452 V --6332 0 V -630 420 L -LTb -140 2646 M -currentpoint gsave translate 90 rotate 0 0 M -(Response \(dB\)) Cshow -grestore -LTb -3796 70 M -(Frequency \(Hz\)) Cshow -1.000 UP -1.000 UL -LT0 -LTb -6311 4739 M -(Speech signal) Rshow -LT0 -6395 4739 M -399 0 V -630 1817 M -12 -132 V -13 -287 V -12 256 V -12 139 V -13 -127 V -12 -193 V -13 256 V -12 101 V -12 -189 V -13 -269 V -12 429 V -12 152 V -13 -102 V -12 -276 V -13 139 V -12 115 V -12 -205 V -13 -174 V -12 485 V -12 193 V -13 37 V -12 -17 V -12 41 V -13 230 V -12 242 V -13 107 V -12 190 V -12 513 V -13 436 V -12 323 V -12 236 V -13 168 V -12 110 V -12 58 V -13 9 V -12 -40 V -13 -90 V -12 -141 V -12 -197 V -13 -251 V -12 -289 V -12 -283 V -13 -247 V -12 -265 V -13 -324 V -12 -302 V -12 -231 V -13 -75 V -12 150 V -12 1 V -13 -298 V -1273 782 L -12 1103 V -13 76 V -12 -338 V -13 252 V -12 357 V -12 86 V -13 -118 V -12 -341 V -12 -20 V -13 364 V -12 243 V -12 212 V -13 214 V -12 208 V -13 180 V -12 136 V -12 82 V -13 23 V -12 -40 V -12 -107 V -13 -177 V -12 -240 V -13 -259 V -12 -215 V -12 -220 V -13 -297 V -12 -196 V -12 -128 V -13 -701 V -12 632 V -12 329 V -13 -25 V -12 -470 V -13 -54 V -12 538 V -12 70 V -13 -246 V -1743 551 L -12 1111 V -13 185 V -12 -159 V -1793 652 L -12 893 V -12 321 V -13 103 V -12 164 V -12 262 V -13 239 V -12 190 V -12 141 V -stroke -1891 2965 M -13 91 V -12 39 V -13 -13 V -12 -62 V -12 -97 V -13 -110 V -12 -120 V -12 -161 V -13 -265 V -12 -453 V -12 -215 V -13 139 V -12 -195 V -2062 420 L -5 0 R -10 961 V -12 135 V -13 -422 V -12 167 V -12 491 V -13 101 V -12 -169 V -13 -737 V -12 482 V -12 299 V -13 -48 V -12 -421 V -12 -151 V -13 434 V -12 -3 V -12 -378 V -13 -12 V -12 298 V -13 -187 V -12 -44 V -12 658 V -13 272 V -12 90 V -12 -49 V -13 -191 V -12 -370 V -13 -579 V -12 -329 V -12 385 V -13 444 V -12 172 V -12 -57 V -13 -407 V -12 -311 V -12 617 V -13 97 V -12 -198 V -13 -469 V -12 446 V -12 177 V -13 -114 V -12 -483 V -12 196 V -13 269 V -12 -74 V -12 -404 V -13 263 V -12 248 V -13 -37 V -12 -66 V -12 339 V -13 312 V -12 244 V -12 215 V -13 176 V -12 125 V -13 69 V -12 15 V -12 -30 V -13 -64 V -12 -85 V -12 -104 V -13 -138 V -12 -195 V -12 -278 V -13 -354 V -12 -257 V -13 -43 V -12 -20 V -12 -73 V -13 -202 V -12 -25 V -12 318 V -13 132 V -12 -73 V -12 -242 V -13 107 V -12 220 V -13 7 V -12 -277 V -9 -811 V -6 0 R -10 887 V -12 241 V -12 20 V -13 -14 V -12 241 V -13 323 V -12 262 V -stroke -3153 2380 M -12 197 V -13 138 V -12 86 V -12 36 V -13 -10 V -12 -54 V -12 -92 V -13 -116 V -12 -108 V -13 -73 V -12 -63 V -12 -107 V -13 -195 V -12 -267 V -12 -88 V -13 50 V -12 -97 V -13 -367 V -12 -285 V -12 374 V -13 3 V -12 -352 V -12 88 V -13 347 V -12 47 V -12 -192 V -13 -264 V -12 200 V -13 16 V -12 -421 V -12 296 V -13 398 V -12 65 V -12 -212 V -13 69 V -12 453 V -12 240 V -13 104 V -12 12 V -13 -52 V -12 -82 V -12 -69 V -13 -34 V -12 -25 V -12 -64 V -13 -158 V -12 -346 V -13 -166 V -12 375 V -12 139 V -13 -46 V -12 -207 V -12 -187 V -13 102 V -12 -14 V -12 -357 V -13 -271 V -12 601 V -13 119 V -12 -172 V -12 -486 V -13 521 V -12 256 V -12 10 V -13 -219 V -12 -294 V -13 446 V -12 285 V -12 167 V -13 137 V -12 152 V -12 161 V -13 144 V -12 106 V -12 58 V -13 7 V -12 -44 V -13 -87 V -12 -116 V -12 -119 V -13 -118 V -12 -152 V -12 -241 V -13 -363 V -12 -109 V -12 172 V -13 43 V -12 -75 V -13 -176 V -12 -313 V -12 -344 V -13 236 V -12 93 V -12 -169 V -13 -102 V -12 320 V -13 123 V -12 17 V -12 207 V -13 270 V -12 201 V -12 186 V -13 217 V -12 213 V -stroke -4439 2543 M -12 174 V -13 125 V -12 79 V -13 42 V -12 14 V -12 -3 V -13 -17 V -12 -34 V -12 -62 V -13 -102 V -12 -149 V -12 -182 V -13 -151 V -12 -70 V -13 -73 V -12 -146 V -12 -150 V -13 43 V -12 81 V -12 -27 V -13 -148 V -12 -213 V -13 -14 V -12 246 V -12 262 V -13 190 V -12 94 V -12 -7 V -13 -56 V -12 149 V -12 312 V -13 269 V -12 212 V -13 169 V -12 136 V -12 105 V -13 76 V -12 45 V -12 15 V -13 -15 V -12 -43 V -13 -66 V -12 -80 V -12 -83 V -13 -79 V -12 -80 V -12 -99 V -13 -136 V -12 -193 V -12 -274 V -13 -400 V -12 -462 V -13 173 V -12 148 V -12 -21 V -13 -198 V -12 -146 V -12 391 V -13 253 V -12 99 V -12 -38 V -13 -208 V -12 -260 V -13 418 V -12 330 V -12 210 V -13 153 V -12 123 V -12 105 V -13 88 V -12 68 V -13 47 V -12 24 V -12 1 V -13 -19 V -12 -38 V -12 -54 V -13 -67 V -12 -80 V -12 -93 V -13 -111 V -12 -132 V -13 -152 V -12 -167 V -12 -183 V -13 -211 V -12 -236 V -12 -139 V -13 15 V -12 -22 V -13 -164 V -12 -405 V -12 -211 V -13 440 V -12 230 V -12 152 V -13 96 V -12 29 V -12 -28 V -13 -10 V -12 81 V -13 96 V -12 29 V -12 -69 V -stroke -5725 2104 M -13 -186 V -12 -239 V -12 142 V -13 249 V -12 155 V -12 88 V -13 49 V -12 35 V -13 39 V -12 38 V -12 13 V -13 -34 V -12 -87 V -12 -112 V -13 -72 V -12 -35 V -13 -100 V -12 -269 V -12 -452 V -13 296 V -12 99 V -12 -312 V -13 242 V -12 513 V -12 237 V -13 88 V -12 -21 V -13 -82 V -12 -1 V -12 153 V -13 177 V -12 156 V -12 145 V -13 134 V -12 114 V -12 87 V -13 56 V -12 26 V -13 -3 V -12 -30 V -12 -52 V -13 -74 V -12 -93 V -12 -108 V -13 -121 V -12 -130 V -13 -129 V -12 -118 V -12 -100 V -13 -92 V -12 -105 V -12 -135 V -13 -172 V -12 -195 V -12 -222 V -13 -353 V -12 -548 V -13 682 V -12 273 V -12 79 V -13 -59 V -12 -188 V -12 -225 V -13 39 V -12 80 V -13 -43 V -12 -44 V -12 184 V -13 213 V -12 127 V -12 42 V -13 -37 V -12 -115 V -12 -182 V -13 -179 V -12 -53 V -13 12 V -12 6 V -12 20 V -13 10 V -12 -65 V -12 -195 V -13 -296 V -12 56 V -12 100 V -13 -118 V -12 -182 V -13 253 V -12 155 V -12 -50 V -13 -222 V -12 21 V -12 197 V -13 7 V -12 -194 V -13 -77 V -12 240 V -12 73 V -13 -132 V -1.000 UL -LT1 -LTb -6311 4599 M -(LPC synthesis filter) Rshow -LT1 -6395 4599 M -399 0 V -630 4034 M -12 0 V -13 0 V -12 1 V -12 1 V -13 1 V -12 1 V -13 1 V -12 2 V -12 2 V -13 3 V -12 2 V -12 4 V -13 3 V -12 5 V -13 4 V -12 6 V -12 6 V -13 7 V -12 8 V -12 8 V -13 10 V -12 11 V -12 11 V -13 13 V -12 15 V -13 16 V -12 17 V -12 19 V -13 21 V -12 23 V -12 25 V -13 27 V -12 29 V -12 31 V -13 32 V -12 33 V -13 33 V -12 30 V -12 26 V -13 16 V -12 4 V -12 -11 V -13 -26 V -12 -38 V -13 -49 V -12 -54 V -12 -56 V -13 -58 V -12 -57 V -12 -55 V -13 -53 V -12 -52 V -12 -49 V -13 -47 V -12 -45 V -13 -44 V -12 -41 V -12 -40 V -13 -38 V -12 -37 V -12 -35 V -13 -35 V -12 -33 V -12 -31 V -13 -31 V -12 -30 V -13 -29 V -12 -28 V -12 -27 V -13 -26 V -12 -26 V -12 -24 V -13 -25 V -12 -23 V -13 -23 V -12 -22 V -12 -22 V -13 -21 V -12 -20 V -12 -20 V -13 -20 V -12 -19 V -12 -19 V -13 -18 V -12 -17 V -13 -18 V -12 -17 V -12 -16 V -13 -16 V -12 -16 V -12 -15 V -13 -15 V -12 -15 V -13 -14 V -12 -14 V -12 -14 V -13 -13 V -12 -13 V -12 -13 V -13 -12 V -12 -13 V -12 -11 V -stroke -1891 2822 M -13 -12 V -12 -11 V -13 -11 V -12 -11 V -12 -11 V -13 -10 V -12 -10 V -12 -10 V -13 -10 V -12 -9 V -12 -9 V -13 -9 V -12 -8 V -13 -9 V -12 -8 V -12 -8 V -13 -8 V -12 -7 V -12 -8 V -13 -7 V -12 -7 V -13 -7 V -12 -6 V -12 -6 V -13 -7 V -12 -6 V -12 -5 V -13 -6 V -12 -5 V -12 -6 V -13 -5 V -12 -5 V -13 -4 V -12 -5 V -12 -4 V -13 -5 V -12 -4 V -12 -4 V -13 -3 V -12 -4 V -13 -3 V -12 -4 V -12 -3 V -13 -3 V -12 -2 V -12 -3 V -13 -3 V -12 -2 V -12 -2 V -13 -2 V -12 -2 V -13 -2 V -12 -2 V -12 -1 V -13 -2 V -12 -1 V -12 -1 V -13 -2 V -12 -1 V -12 0 V -13 -1 V -12 -1 V -13 0 V -12 -1 V -12 0 V -13 0 V -12 -1 V -12 0 V -13 0 V -12 0 V -13 0 V -12 1 V -12 0 V -13 0 V -12 1 V -12 0 V -13 1 V -12 0 V -12 1 V -13 1 V -12 0 V -13 1 V -12 1 V -12 1 V -13 0 V -12 1 V -12 1 V -13 1 V -12 1 V -12 0 V -13 1 V -12 1 V -13 1 V -12 0 V -12 1 V -13 1 V -12 0 V -12 1 V -13 1 V -12 0 V -13 1 V -12 0 V -12 0 V -13 1 V -stroke -3178 2508 M -12 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -13 0 V -12 0 V -12 -1 V -13 0 V -12 -1 V -12 0 V -13 -1 V -12 0 V -13 -1 V -12 -1 V -12 0 V -13 -1 V -12 -1 V -12 -1 V -13 -1 V -12 -1 V -12 0 V -13 -1 V -12 -1 V -13 -1 V -12 -1 V -12 -1 V -13 -1 V -12 -1 V -12 -1 V -13 -1 V -12 -1 V -12 0 V -13 -1 V -12 -1 V -13 -1 V -12 0 V -12 -1 V -13 0 V -12 -1 V -12 0 V -13 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 1 V -12 1 V -12 0 V -13 1 V -12 1 V -13 1 V -12 2 V -12 1 V -13 1 V -12 2 V -12 2 V -13 2 V -12 2 V -13 2 V -12 3 V -12 2 V -13 3 V -12 3 V -12 3 V -13 4 V -12 3 V -12 4 V -13 4 V -12 4 V -13 4 V -12 4 V -12 5 V -13 5 V -12 5 V -12 5 V -13 6 V -12 6 V -12 6 V -13 6 V -12 6 V -13 7 V -12 7 V -12 7 V -13 8 V -12 8 V -12 8 V -13 8 V -12 9 V -13 9 V -12 9 V -12 9 V -13 10 V -12 10 V -12 11 V -13 11 V -12 11 V -12 12 V -13 12 V -stroke -4464 2759 M -12 12 V -13 13 V -12 13 V -12 14 V -13 14 V -12 15 V -12 15 V -13 16 V -12 16 V -12 17 V -13 17 V -12 18 V -13 18 V -12 19 V -12 20 V -13 21 V -12 21 V -12 22 V -13 23 V -12 23 V -13 24 V -12 26 V -12 26 V -13 26 V -12 28 V -12 28 V -13 30 V -12 29 V -12 31 V -13 30 V -12 31 V -13 30 V -12 29 V -12 27 V -13 26 V -12 22 V -12 18 V -13 13 V -12 8 V -13 2 V -12 -3 V -12 -9 V -13 -13 V -12 -16 V -12 -20 V -13 -21 V -12 -23 V -12 -24 V -13 -23 V -12 -24 V -13 -23 V -12 -23 V -12 -22 V -13 -21 V -12 -21 V -12 -20 V -13 -18 V -12 -18 V -12 -17 V -13 -16 V -12 -16 V -13 -14 V -12 -14 V -12 -13 V -13 -13 V -12 -11 V -12 -11 V -13 -11 V -12 -10 V -13 -9 V -12 -8 V -12 -8 V -13 -8 V -12 -6 V -12 -7 V -13 -6 V -12 -5 V -12 -5 V -13 -4 V -12 -4 V -13 -4 V -12 -3 V -12 -3 V -13 -2 V -12 -2 V -12 -2 V -13 -1 V -12 -1 V -13 0 V -12 0 V -12 0 V -13 0 V -12 1 V -12 1 V -13 1 V -12 2 V -12 2 V -13 2 V -12 2 V -13 2 V -12 3 V -12 3 V -13 2 V -12 3 V -stroke -5750 3038 M -12 3 V -13 3 V -12 3 V -12 3 V -13 3 V -12 2 V -13 3 V -12 2 V -12 2 V -13 2 V -12 2 V -12 1 V -13 0 V -12 1 V -13 0 V -12 -1 V -12 -1 V -13 -2 V -12 -2 V -12 -3 V -13 -4 V -12 -4 V -12 -4 V -13 -6 V -12 -5 V -13 -7 V -12 -6 V -12 -8 V -13 -7 V -12 -9 V -12 -8 V -13 -9 V -12 -9 V -12 -10 V -13 -9 V -12 -10 V -13 -10 V -12 -10 V -12 -11 V -13 -10 V -12 -10 V -12 -11 V -13 -10 V -12 -10 V -13 -11 V -12 -10 V -12 -10 V -13 -10 V -12 -10 V -12 -9 V -13 -10 V -12 -10 V -12 -9 V -13 -9 V -12 -9 V -13 -9 V -12 -8 V -12 -8 V -13 -9 V -12 -8 V -12 -7 V -13 -8 V -12 -7 V -13 -7 V -12 -7 V -12 -7 V -13 -7 V -12 -6 V -12 -6 V -13 -6 V -12 -6 V -12 -5 V -13 -5 V -12 -5 V -13 -5 V -12 -5 V -12 -4 V -13 -4 V -12 -4 V -12 -4 V -13 -4 V -12 -3 V -12 -3 V -13 -3 V -12 -3 V -13 -2 V -12 -3 V -12 -2 V -13 -2 V -12 -2 V -12 -1 V -13 -1 V -12 -2 V -13 0 V -12 -1 V -12 -1 V -13 0 V -1.000 UL -LT2 -LTb -6311 4459 M -(Reference shaping) Rshow -LT2 -6395 4459 M -399 0 V -630 3487 M -12 0 V -13 0 V -12 1 V -12 0 V -13 1 V -12 1 V -13 1 V -12 2 V -12 1 V -13 2 V -12 2 V -12 2 V -13 2 V -12 2 V -13 3 V -12 2 V -12 3 V -13 3 V -12 3 V -12 2 V -13 4 V -12 3 V -12 3 V -13 3 V -12 3 V -13 2 V -12 3 V -12 3 V -13 2 V -12 2 V -12 1 V -13 1 V -12 1 V -12 0 V -13 0 V -12 -2 V -13 -2 V -12 -2 V -12 -4 V -13 -4 V -12 -6 V -12 -6 V -13 -7 V -12 -8 V -13 -8 V -12 -10 V -12 -10 V -13 -11 V -12 -12 V -12 -12 V -13 -13 V -12 -13 V -12 -14 V -13 -14 V -12 -14 V -13 -15 V -12 -15 V -12 -15 V -13 -15 V -12 -15 V -12 -15 V -13 -14 V -12 -15 V -12 -15 V -13 -15 V -12 -14 V -13 -14 V -12 -15 V -12 -13 V -13 -14 V -12 -14 V -12 -13 V -13 -13 V -12 -13 V -13 -12 V -12 -12 V -12 -12 V -13 -12 V -12 -12 V -12 -11 V -13 -11 V -12 -11 V -12 -10 V -13 -10 V -12 -10 V -13 -10 V -12 -10 V -12 -9 V -13 -9 V -12 -9 V -12 -9 V -13 -8 V -12 -8 V -13 -8 V -12 -8 V -12 -8 V -13 -7 V -12 -7 V -12 -7 V -13 -7 V -12 -6 V -12 -7 V -stroke -1891 2847 M -13 -6 V -12 -6 V -13 -6 V -12 -5 V -12 -6 V -13 -5 V -12 -5 V -12 -5 V -13 -5 V -12 -5 V -12 -4 V -13 -5 V -12 -4 V -13 -4 V -12 -4 V -12 -4 V -13 -4 V -12 -3 V -12 -4 V -13 -3 V -12 -3 V -13 -3 V -12 -3 V -12 -3 V -13 -2 V -12 -3 V -12 -2 V -13 -3 V -12 -2 V -12 -2 V -13 -2 V -12 -2 V -13 -2 V -12 -1 V -12 -2 V -13 -1 V -12 -2 V -12 -1 V -13 -1 V -12 -1 V -13 -2 V -12 0 V -12 -1 V -13 -1 V -12 -1 V -12 -1 V -13 0 V -12 -1 V -12 0 V -13 0 V -12 -1 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -12 1 V -13 0 V -12 0 V -13 1 V -12 0 V -12 0 V -13 1 V -12 0 V -12 1 V -13 1 V -12 0 V -13 1 V -12 1 V -12 0 V -13 1 V -12 1 V -12 1 V -13 0 V -12 1 V -12 1 V -13 1 V -12 1 V -13 1 V -12 0 V -12 1 V -13 1 V -12 1 V -12 1 V -13 1 V -12 1 V -12 0 V -13 1 V -12 1 V -13 1 V -12 0 V -12 1 V -13 1 V -12 1 V -12 0 V -13 1 V -12 1 V -13 0 V -12 1 V -12 0 V -13 1 V -stroke -3178 2736 M -12 0 V -12 1 V -13 0 V -12 1 V -12 0 V -13 0 V -12 1 V -13 0 V -12 0 V -12 0 V -13 1 V -12 0 V -12 0 V -13 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 -1 V -12 0 V -13 0 V -12 0 V -13 0 V -12 1 V -12 0 V -13 0 V -12 0 V -12 0 V -13 0 V -12 0 V -13 1 V -12 0 V -12 0 V -13 1 V -12 0 V -12 1 V -13 1 V -12 0 V -12 1 V -13 1 V -12 1 V -13 0 V -12 1 V -12 2 V -13 1 V -12 1 V -12 1 V -13 2 V -12 1 V -13 2 V -12 1 V -12 2 V -13 2 V -12 2 V -12 2 V -13 2 V -12 3 V -12 2 V -13 3 V -12 2 V -13 3 V -12 3 V -12 3 V -13 3 V -12 3 V -12 4 V -13 3 V -12 4 V -12 4 V -13 4 V -12 4 V -13 4 V -12 5 V -12 4 V -13 5 V -12 5 V -12 5 V -13 5 V -12 5 V -13 6 V -12 6 V -12 6 V -13 6 V -12 6 V -12 6 V -13 7 V -12 6 V -12 7 V -13 7 V -stroke -4464 2918 M -12 8 V -13 7 V -12 8 V -12 7 V -13 8 V -12 8 V -12 9 V -13 8 V -12 9 V -12 8 V -13 9 V -12 9 V -13 9 V -12 9 V -12 9 V -13 9 V -12 10 V -12 9 V -13 9 V -12 10 V -13 9 V -12 9 V -12 9 V -13 9 V -12 9 V -12 8 V -13 8 V -12 8 V -12 8 V -13 7 V -12 7 V -13 6 V -12 6 V -12 6 V -13 4 V -12 5 V -12 3 V -13 3 V -12 3 V -13 1 V -12 1 V -12 1 V -13 0 V -12 -1 V -12 -1 V -13 -2 V -12 -2 V -12 -3 V -13 -4 V -12 -3 V -13 -4 V -12 -5 V -12 -4 V -13 -5 V -12 -5 V -12 -5 V -13 -5 V -12 -6 V -12 -5 V -13 -6 V -12 -5 V -13 -6 V -12 -5 V -12 -5 V -13 -5 V -12 -6 V -12 -5 V -13 -5 V -12 -4 V -13 -5 V -12 -4 V -12 -5 V -13 -4 V -12 -4 V -12 -4 V -13 -3 V -12 -4 V -12 -3 V -13 -3 V -12 -3 V -13 -3 V -12 -3 V -12 -2 V -13 -2 V -12 -2 V -12 -2 V -13 -2 V -12 -2 V -13 -1 V -12 -2 V -12 -1 V -13 -1 V -12 -1 V -12 -1 V -13 -1 V -12 0 V -12 -1 V -13 -1 V -12 0 V -13 -1 V -12 0 V -12 0 V -13 -1 V -12 0 V -stroke -5750 3036 M -12 0 V -13 -1 V -12 0 V -12 0 V -13 -1 V -12 0 V -13 -1 V -12 0 V -12 -1 V -13 -1 V -12 0 V -12 -1 V -13 -1 V -12 -2 V -13 -1 V -12 -1 V -12 -2 V -13 -1 V -12 -2 V -12 -2 V -13 -2 V -12 -3 V -12 -2 V -13 -3 V -12 -2 V -13 -3 V -12 -3 V -12 -3 V -13 -4 V -12 -3 V -12 -4 V -13 -3 V -12 -4 V -12 -4 V -13 -4 V -12 -4 V -13 -4 V -12 -4 V -12 -5 V -13 -4 V -12 -4 V -12 -5 V -13 -4 V -12 -5 V -13 -4 V -12 -5 V -12 -5 V -13 -4 V -12 -5 V -12 -4 V -13 -5 V -12 -4 V -12 -4 V -13 -5 V -12 -4 V -13 -4 V -12 -5 V -12 -4 V -13 -4 V -12 -4 V -12 -4 V -13 -4 V -12 -4 V -13 -3 V -12 -4 V -12 -4 V -13 -3 V -12 -3 V -12 -4 V -13 -3 V -12 -3 V -12 -3 V -13 -3 V -12 -3 V -13 -2 V -12 -3 V -12 -2 V -13 -3 V -12 -2 V -12 -2 V -13 -2 V -12 -2 V -12 -2 V -13 -1 V -12 -2 V -13 -1 V -12 -2 V -12 -1 V -13 -1 V -12 -1 V -12 -1 V -13 -1 V -12 0 V -13 -1 V -12 0 V -12 0 V -13 -1 V -1.000 UL -LTb -630 420 M -6332 0 V -0 4452 V --6332 0 V -630 420 L -1.000 UP -stroke -grestore -end -showpage -%%Trailer -%%DocumentFonts: Helvetica diff --git a/speex/doc/sampledec.c b/speex/doc/sampledec.c deleted file mode 100644 index 8e89e12ce..000000000 --- a/speex/doc/sampledec.c +++ /dev/null @@ -1,65 +0,0 @@ -#include -#include - -/*The frame size in hardcoded for this sample code but it doesn't have to be*/ -#define FRAME_SIZE 160 -int main(int argc, char **argv) -{ - char *outFile; - FILE *fout; - /*Holds the audio that will be written to file (16 bits per sample)*/ - short out[FRAME_SIZE]; - /*Speex handle samples as float, so we need an array of floats*/ - float output[FRAME_SIZE]; - char cbits[200]; - int nbBytes; - /*Holds the state of the decoder*/ - void *state; - /*Holds bits so they can be read and written to by the Speex routines*/ - SpeexBits bits; - int i, tmp; - - /*Create a new decoder state in narrowband mode*/ - state = speex_decoder_init(&speex_nb_mode); - - /*Set the perceptual enhancement on*/ - tmp=1; - speex_decoder_ctl(state, SPEEX_SET_ENH, &tmp); - - outFile = argv[1]; - fout = fopen(outFile, "w"); - - /*Initialization of the structure that holds the bits*/ - speex_bits_init(&bits); - while (1) - { - /*Read the size encoded by sampleenc, this part will likely be - different in your application*/ - fread(&nbBytes, sizeof(int), 1, stdin); - fprintf (stderr, "nbBytes: %d\n", nbBytes); - if (feof(stdin)) - break; - - /*Read the "packet" encoded by sampleenc*/ - fread(cbits, 1, nbBytes, stdin); - /*Copy the data into the bit-stream struct*/ - speex_bits_read_from(&bits, cbits, nbBytes); - - /*Decode the data*/ - speex_decode(state, &bits, output); - - /*Copy from float to short (16 bits) for output*/ - for (i=0;i -#include - -/*The frame size in hardcoded for this sample code but it doesn't have to be*/ -#define FRAME_SIZE 160 -int main(int argc, char **argv) -{ - char *inFile; - FILE *fin; - short in[FRAME_SIZE]; - float input[FRAME_SIZE]; - char cbits[200]; - int nbBytes; - /*Holds the state of the encoder*/ - void *state; - /*Holds bits so they can be read and written to by the Speex routines*/ - SpeexBits bits; - int i, tmp; - - /*Create a new encoder state in narrowband mode*/ - state = speex_encoder_init(&speex_nb_mode); - - /*Set the quality to 8 (15 kbps)*/ - tmp=8; - speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp); - - inFile = argv[1]; - fin = fopen(inFile, "r"); - - /*Initialization of the structure that holds the bits*/ - speex_bits_init(&bits); - while (1) - { - /*Read a 16 bits/sample audio frame*/ - fread(in, sizeof(short), FRAME_SIZE, fin); - if (feof(fin)) - break; - /*Copy the 16 bits values to float so Speex can work on them*/ - for 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 diff --git a/speex/doc/speex_analysis.eps b/speex/doc/speex_analysis.eps deleted file mode 100644 index 5f34fc2d9..000000000 --- a/speex/doc/speex_analysis.eps +++ /dev/null @@ -1,744 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 0 0 465 180 -%%Pages: 0 -%%Creator: Sun Microsystems, Inc. -%%Title: none -%%CreationDate: none -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%BeginResource: SDRes -/b4_inc_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath -/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if -/bdef {bind def} bind def -/c {setgray} bdef -/l {neg lineto} bdef -/rl {neg rlineto} bdef -/lc {setlinecap} bdef -/lj {setlinejoin} bdef -/lw {setlinewidth} bdef -/ml {setmiterlimit} bdef -/ld {setdash} bdef -/m {neg moveto} bdef -/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef -/r {rotate} bdef -/t {neg translate} bdef -/s {scale} bdef -/sw {show} bdef -/gs {gsave} bdef -/gr {grestore} bdef -/f {findfont dup length dict begin -{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def -currentdict end /NFont exch definefont pop /NFont findfont} bdef -/p {closepath} bdef -/sf {scalefont setfont} bdef -/ef {eofill}bdef -/pc {closepath stroke}bdef -/ps {stroke}bdef -/pum {matrix currentmatrix}bdef -/pom {setmatrix}bdef -/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef -%%EndResource -%%EndProlog -%%BeginSetup -%%EndSetup -%%Page: 1 1 -%%BeginPageSetup -%%EndPageSetup -pum -0.02832 0.02831 s -0 -6358 t -/tm matrix currentmatrix def -tm setmatrix --700 -3000 t -1 1 s -50 lw 1 lj 0.000 c 3900 7000 m 3100 7000 l 3100 5500 l 4700 5500 l 4700 7000 l -3900 7000 l pc -gs -gs -pum -3293 6460 t -47 0 m 47 -455 l 107 -455 l 107 -54 l 330 -54 l 330 0 l 47 0 l p ef -400 0 m 400 0 400 0 400 -455 ct 400 -455 400 -455 571 -455 ct 602 -455 625 -454 641 -451 ct -663 -447 682 -440 697 -429 ct 712 -419 724 -404 733 -385 ct 742 -367 747 -346 747 -323 ct -747 -285 735 -252 710 -225 ct 685 -198 641 -185 577 -185 ct 577 -185 577 -185 460 -185 ct -460 -185 460 -185 460 0 ct 460 0 460 0 400 0 ct p -460 -239 m 460 -239 460 -239 578 -239 ct 617 -239 644 -246 660 -261 ct 677 -275 685 -295 685 -322 ct -685 -341 680 -357 671 -370 ct 661 -384 648 -393 633 -397 ct 622 -400 604 -401 576 -401 ct -576 -401 576 -401 460 -401 ct 460 -401 460 -401 460 -239 ct p ef -1149 -159 m 1149 -159 1149 -159 1209 -144 ct 1196 -95 1174 -57 1141 -31 ct -1108 -5 1068 8 1021 8 ct 972 8 932 -2 901 -22 ct 870 -42 847 -71 831 -109 ct 815 -147 807 -187 807 -231 ct -807 -278 816 -320 834 -355 ct 852 -390 878 -417 911 -436 ct 945 -454 981 -463 1022 -463 ct -1067 -463 1105 -451 1136 -428 ct 1167 -405 1189 -373 1201 -331 ct 1201 -331 1201 -331 1142 -317 ct -1131 -350 1116 -374 1096 -389 ct 1076 -404 1051 -412 1020 -412 ct 985 -412 956 -404 933 -387 ct -909 -370 893 -347 883 -319 ct 874 -291 869 -261 869 -231 ct 869 -192 875 -158 886 -129 ct -897 -101 915 -79 939 -65 ct 962 -50 988 -43 1016 -43 ct 1050 -43 1078 -53 1102 -72 ct -1125 -92 1141 -121 1149 -159 ct p ef -pom -gr -gr -gs -gs -pum -1170 3636 t -181 -260 m 181 -260 181 -260 181 -174 ct 181 -174 181 -174 171 -174 ct 164 -201 155 -220 145 -229 ct -134 -239 120 -244 103 -244 ct 91 -244 80 -241 73 -234 ct 65 -227 61 -219 61 -211 ct -61 -201 64 -192 70 -185 ct 75 -177 87 -169 104 -161 ct 104 -161 104 -161 144 -141 ct -181 -123 200 -99 200 -69 ct 200 -47 191 -28 174 -14 ct 157 0 138 7 116 7 ct 101 7 83 4 64 -1 ct -58 -2 53 -3 49 -3 ct 45 -3 41 -1 39 3 ct 39 3 39 3 29 3 ct 29 3 29 3 29 -87 ct 29 -87 29 -87 39 -87 ct -44 -61 54 -42 68 -29 ct 83 -16 99 -9 116 -9 ct 129 -9 139 -13 147 -20 ct 155 -28 159 -37 159 -47 ct -159 -60 155 -70 146 -79 ct 137 -88 119 -98 93 -111 ct 66 -124 48 -136 40 -147 ct -32 -157 28 -171 28 -187 ct 28 -208 35 -225 49 -239 ct 63 -253 82 -260 104 -260 ct -114 -260 126 -258 140 -254 ct 149 -251 155 -250 158 -250 ct 161 -250 164 -251 165 -252 ct -167 -253 169 -256 171 -260 ct 171 -260 171 -260 181 -260 ct p ef -220 -228 m 220 -228 220 -228 298 -259 ct 298 -259 298 -259 309 -259 ct 309 -259 309 -259 309 -201 ct -322 -223 335 -238 348 -247 ct 361 -256 375 -260 389 -260 ct 414 -260 435 -250 452 -230 ct -473 -206 483 -175 483 -136 ct 483 -92 471 -56 446 -28 ct 425 -5 400 7 369 7 ct -355 7 343 5 334 1 ct 326 -2 318 -7 309 -16 ct 309 -16 309 -16 309 63 ct 309 80 310 91 312 96 ct -314 100 318 104 323 107 ct 329 110 338 111 352 111 ct 352 111 352 111 352 121 ct -352 121 352 121 217 121 ct 217 121 217 121 217 111 ct 217 111 217 111 224 111 ct -234 111 243 109 251 105 ct 254 103 257 100 259 95 ct 261 91 262 79 262 61 ct 262 61 262 61 262 -179 ct -262 -195 261 -205 260 -209 ct 258 -213 256 -216 253 -219 ct 250 -221 245 -222 240 -222 ct -236 -222 230 -221 223 -218 ct 223 -218 223 -218 220 -228 ct p -309 -185 m 309 -185 309 -185 309 -90 ct 309 -70 310 -57 311 -50 ct 314 -40 320 -30 330 -22 ct -340 -14 353 -10 368 -10 ct 386 -10 401 -17 412 -31 ct 427 -50 434 -77 434 -111 ct -434 -149 426 -179 409 -200 ct 397 -214 383 -221 367 -221 ct 359 -221 350 -219 341 -214 ct -335 -211 324 -201 309 -185 ct p ef -564 -158 m 564 -121 573 -92 591 -71 ct 609 -50 630 -39 655 -39 ct 671 -39 686 -43 698 -52 ct -710 -61 720 -77 728 -99 ct 728 -99 728 -99 737 -94 ct 733 -68 722 -45 703 -24 ct -685 -3 662 7 634 7 ct 604 7 578 -5 556 -28 ct 535 -52 524 -83 524 -123 ct 524 -166 535 -200 557 -224 ct -579 -248 607 -260 640 -260 ct 668 -260 692 -251 710 -232 ct 728 -214 737 -189 737 -158 ct -737 -158 737 -158 564 -158 ct p -564 -174 m 564 -174 564 -174 680 -174 ct 679 -190 677 -201 674 -208 ct 670 -218 663 -226 654 -231 ct -645 -237 635 -240 626 -240 ct 610 -240 597 -234 585 -223 ct 573 -211 566 -195 564 -174 ct -p ef -814 -158 m 814 -121 823 -92 841 -71 ct 859 -50 880 -39 905 -39 ct 921 -39 936 -43 948 -52 ct -960 -61 970 -77 978 -99 ct 978 -99 978 -99 987 -94 ct 983 -68 972 -45 953 -24 ct -935 -3 912 7 884 7 ct 854 7 828 -5 806 -28 ct 785 -52 774 -83 774 -123 ct 774 -166 785 -200 807 -224 ct -829 -248 857 -260 890 -260 ct 918 -260 942 -251 960 -232 ct 978 -214 987 -189 987 -158 ct -987 -158 987 -158 814 -158 ct p -814 -174 m 814 -174 814 -174 930 -174 ct 929 -190 927 -201 924 -208 ct 920 -218 913 -226 904 -231 ct -895 -237 885 -240 876 -240 ct 860 -240 847 -234 835 -223 ct 823 -211 816 -195 814 -174 ct -p ef -1236 -95 m 1229 -62 1216 -37 1196 -19 ct 1176 -2 1154 7 1130 7 ct 1101 7 1076 -5 1055 -29 ct -1034 -53 1023 -85 1023 -126 ct 1023 -166 1035 -198 1058 -223 ct 1082 -248 1111 -260 1144 -260 ct -1169 -260 1189 -253 1205 -240 ct 1221 -227 1229 -214 1229 -199 ct 1229 -192 1227 -187 1222 -182 ct -1218 -178 1211 -176 1203 -176 ct 1193 -176 1185 -180 1179 -187 ct 1176 -190 1174 -198 1173 -209 ct -1172 -220 1168 -228 1161 -234 ct 1155 -239 1146 -242 1135 -242 ct 1116 -242 1102 -235 1090 -222 ct -1075 -204 1068 -180 1068 -150 ct 1068 -120 1075 -94 1090 -71 ct 1105 -48 1125 -36 1150 -36 ct -1168 -36 1184 -42 1199 -54 ct 1209 -62 1218 -77 1228 -99 ct 1228 -99 1228 -99 1236 -95 ct -p ef -1345 -392 m 1345 -392 1345 -392 1345 -208 ct 1365 -230 1381 -244 1393 -251 ct -1405 -257 1417 -260 1429 -260 ct 1443 -260 1456 -256 1466 -248 ct 1476 -240 1484 -228 1489 -211 ct -1492 -199 1494 -178 1494 -146 ct 1494 -146 1494 -146 1494 -57 ct 1494 -41 1495 -30 1498 -24 ct -1500 -20 1503 -16 1507 -14 ct 1511 -11 1519 -10 1531 -10 ct 1531 -10 1531 -10 1531 0 ct -1531 0 1531 0 1407 0 ct 1407 0 1407 0 1407 -10 ct 1407 -10 1407 -10 1413 -10 ct -1425 -10 1433 -12 1437 -15 ct 1442 -19 1445 -24 1447 -31 ct 1448 -34 1448 -43 1448 -57 ct -1448 -57 1448 -57 1448 -147 ct 1448 -174 1447 -192 1444 -201 ct 1441 -210 1436 -216 1430 -221 ct -1424 -225 1417 -227 1408 -227 ct 1399 -227 1389 -225 1380 -220 ct 1370 -215 1359 -205 1345 -191 ct -1345 -191 1345 -191 1345 -57 ct 1345 -40 1346 -29 1348 -25 ct 1350 -21 1353 -17 1359 -14 ct -1364 -11 1373 -10 1386 -10 ct 1386 -10 1386 -10 1386 0 ct 1386 0 1386 0 1262 0 ct -1262 0 1262 0 1262 -10 ct 1273 -10 1281 -12 1287 -15 ct 1291 -17 1294 -21 1296 -26 ct -1298 -31 1299 -41 1299 -57 ct 1299 -57 1299 -57 1299 -286 ct 1299 -314 1298 -332 1297 -338 ct -1296 -345 1294 -349 1291 -352 ct 1288 -354 1284 -355 1279 -355 ct 1276 -355 1269 -354 1261 -351 ct -1261 -351 1261 -351 1257 -361 ct 1257 -361 1257 -361 1332 -392 ct 1332 -392 1332 -392 1345 -392 ct -p ef -pom -gr -gs -pum -1286 4263 t -117 -233 m 117 -233 117 -233 117 -67 ct 117 -43 120 -28 125 -22 ct 132 -14 141 -10 152 -10 ct -152 -10 152 -10 175 -10 ct 175 -10 175 -10 175 0 ct 175 0 175 0 24 0 ct 24 0 24 0 24 -10 ct -24 -10 24 -10 35 -10 ct 43 -10 49 -12 55 -16 ct 61 -19 65 -24 68 -30 ct 70 -37 71 -49 71 -67 ct -71 -67 71 -67 71 -233 ct 71 -233 71 -233 22 -233 ct 22 -233 22 -233 22 -253 ct -22 -253 22 -253 71 -253 ct 71 -253 71 -253 71 -270 ct 71 -295 75 -316 83 -334 ct -91 -351 104 -365 120 -376 ct 137 -387 156 -392 177 -392 ct 196 -392 214 -386 230 -373 ct -241 -365 246 -355 246 -345 ct 246 -340 244 -334 239 -329 ct 234 -324 229 -322 223 -322 ct -219 -322 215 -324 210 -327 ct 205 -330 200 -336 193 -346 ct 186 -356 180 -363 174 -367 ct -168 -370 162 -372 155 -372 ct 147 -372 139 -370 134 -365 ct 128 -361 123 -354 121 -344 ct -118 -335 117 -310 117 -271 ct 117 -271 117 -271 117 -253 ct 117 -253 117 -253 182 -253 ct -182 -253 182 -253 182 -233 ct 182 -233 182 -233 117 -233 ct p ef -283 -260 m 283 -260 283 -260 283 -203 ct 304 -241 326 -260 348 -260 ct 358 -260 366 -257 373 -251 ct -380 -245 383 -238 383 -230 ct 383 -222 381 -216 376 -211 ct 371 -206 365 -204 359 -204 ct -352 -204 345 -207 337 -214 ct 329 -220 323 -223 319 -223 ct 316 -223 312 -221 309 -217 ct -300 -210 292 -198 283 -180 ct 283 -180 283 -180 283 -59 ct 283 -45 285 -34 288 -27 ct -291 -22 295 -18 301 -15 ct 307 -12 316 -10 328 -10 ct 328 -10 328 -10 328 0 ct -328 0 328 0 196 0 ct 196 0 196 0 196 -10 ct 209 -10 219 -12 226 -16 ct 230 -19 234 -24 236 -30 ct -237 -33 237 -42 237 -57 ct 237 -57 237 -57 237 -154 ct 237 -184 236 -201 235 -207 ct -234 -213 232 -217 229 -219 ct 226 -222 222 -223 217 -223 ct 211 -223 205 -222 198 -219 ct -198 -219 198 -219 195 -229 ct 195 -229 195 -229 271 -260 ct 271 -260 271 -260 283 -260 ct -p ef -538 -37 m 512 -17 496 -5 489 -2 ct 479 3 469 5 457 5 ct 440 5 425 -1 414 -13 ct -403 -25 397 -40 397 -60 ct 397 -72 400 -83 405 -92 ct 413 -104 426 -116 445 -127 ct -463 -138 495 -151 538 -167 ct 538 -167 538 -167 538 -177 ct 538 -202 534 -219 526 -228 ct -518 -237 507 -242 491 -242 ct 480 -242 471 -239 464 -233 ct 457 -226 453 -219 453 -211 ct -453 -211 453 -211 454 -195 ct 454 -187 452 -180 447 -176 ct 443 -171 437 -169 430 -169 ct -424 -169 418 -171 414 -176 ct 409 -181 407 -188 407 -196 ct 407 -212 415 -227 431 -240 ct -447 -253 470 -260 499 -260 ct 521 -260 540 -256 554 -249 ct 565 -243 573 -234 578 -222 ct -581 -214 583 -198 583 -174 ct 583 -174 583 -174 583 -89 ct 583 -65 583 -50 584 -45 ct -585 -39 587 -36 589 -34 ct 591 -32 593 -31 596 -31 ct 599 -31 602 -32 604 -33 ct -608 -35 615 -42 626 -53 ct 626 -53 626 -53 626 -38 ct 606 -10 586 4 568 4 ct 559 4 551 1 546 -5 ct -541 -11 538 -22 538 -37 ct p -538 -54 m 538 -54 538 -54 538 -149 ct 510 -138 492 -130 484 -126 ct 469 -118 459 -110 452 -101 ct -446 -92 443 -83 443 -72 ct 443 -59 447 -49 455 -40 ct 463 -31 472 -27 482 -27 ct -497 -27 515 -36 538 -54 ct p ef -720 -206 m 738 -225 749 -235 752 -238 ct 761 -245 769 -250 779 -254 ct 789 -258 798 -260 807 -260 ct -823 -260 837 -255 848 -246 ct 859 -237 867 -224 871 -206 ct 890 -228 906 -243 919 -250 ct -932 -257 945 -260 959 -260 ct 972 -260 984 -257 994 -250 ct 1005 -243 1013 -232 1019 -216 ct -1023 -205 1025 -188 1025 -166 ct 1025 -166 1025 -166 1025 -57 ct 1025 -41 1026 -30 1028 -25 ct -1030 -21 1034 -17 1038 -14 ct 1043 -11 1051 -10 1062 -10 ct 1062 -10 1062 -10 1062 0 ct -1062 0 1062 0 938 0 ct 938 0 938 0 938 -10 ct 938 -10 938 -10 943 -10 ct 954 -10 963 -12 969 -16 ct -973 -19 976 -24 978 -30 ct 979 -33 979 -42 979 -57 ct 979 -57 979 -57 979 -166 ct -979 -186 977 -201 972 -209 ct 964 -221 953 -227 937 -227 ct 928 -227 918 -225 908 -220 ct -898 -215 886 -206 873 -193 ct 873 -193 873 -193 872 -189 ct 872 -189 872 -189 873 -178 ct -873 -178 873 -178 873 -57 ct 873 -40 874 -29 876 -25 ct 878 -21 881 -17 887 -14 ct -892 -11 901 -10 914 -10 ct 914 -10 914 -10 914 0 ct 914 0 914 0 786 0 ct 786 0 786 0 786 -10 ct -800 -10 810 -12 815 -15 ct 820 -18 824 -23 826 -30 ct 827 -33 827 -42 827 -57 ct -827 -57 827 -57 827 -166 ct 827 -186 824 -201 818 -210 ct 810 -221 799 -227 784 -227 ct -774 -227 765 -224 755 -219 ct 740 -211 728 -202 720 -193 ct 720 -193 720 -193 720 -57 ct -720 -41 721 -30 723 -25 ct 726 -20 729 -16 734 -14 ct 738 -11 747 -10 761 -10 ct -761 -10 761 -10 761 0 ct 761 0 761 0 637 0 ct 637 0 637 0 637 -10 ct 648 -10 656 -11 660 -14 ct -665 -16 668 -20 671 -26 ct 673 -31 674 -41 674 -57 ct 674 -57 674 -57 674 -154 ct -674 -182 673 -199 672 -207 ct 670 -213 668 -217 666 -220 ct 663 -222 659 -223 654 -223 ct -649 -223 643 -222 636 -219 ct 636 -219 636 -219 632 -229 ct 632 -229 632 -229 708 -260 ct -708 -260 708 -260 720 -260 ct 720 -260 720 -260 720 -206 ct p ef -1114 -158 m 1114 -121 1123 -92 1141 -71 ct 1159 -50 1180 -39 1205 -39 ct 1221 -39 1236 -43 1248 -52 ct -1260 -61 1270 -77 1278 -99 ct 1278 -99 1278 -99 1287 -94 ct 1283 -68 1272 -45 1253 -24 ct -1235 -3 1212 7 1184 7 ct 1154 7 1128 -5 1106 -28 ct 1085 -52 1074 -83 1074 -123 ct -1074 -166 1085 -200 1107 -224 ct 1129 -248 1157 -260 1190 -260 ct 1218 -260 1242 -251 1260 -232 ct -1278 -214 1287 -189 1287 -158 ct 1287 -158 1287 -158 1114 -158 ct p -1114 -174 m 1114 -174 1114 -174 1230 -174 ct 1229 -190 1227 -201 1224 -208 ct -1220 -218 1213 -226 1204 -231 ct 1195 -237 1185 -240 1176 -240 ct 1160 -240 1147 -234 1135 -223 ct -1123 -211 1116 -195 1114 -174 ct p ef -pom -gr -gr -3100 6250 m 2538 6438 l 2538 6063 l 3100 6250 l p ef -1975 4500 m 1975 6250 l 1950 6250 l 1925 6250 l 1925 4500 l 1950 4500 l -1975 4500 l p ef -1950 6250 m 1950 6275 l 1946 6275 l 1941 6273 l 1938 6272 l 1934 6269 l -1931 6266 l 1928 6263 l 1927 6259 l 1925 6254 l 1925 6250 l 1925 6250 l -1950 6250 l p ef -1950 6225 m 2650 6225 l 2650 6250 l 2650 6275 l 1950 6275 l 1950 6250 l -1950 6225 l p ef -gs -4635 7681 m 6248 7681 l 6248 9206 l 4635 9206 l 4635 7681 l eoclip newpath -gs -tm setmatrix -3942 4683 t -1 1 s -gs -gs -0 0 m 1613 0 l 1613 1525 l 0 1525 l 0 0 l eoclip newpath -gs -pum -661 556 t -74 -379 m 74 -379 74 -379 176 -429 ct 176 -429 176 -429 186 -429 ct 186 -429 186 -429 186 -74 ct -186 -50 187 -36 189 -30 ct 191 -24 195 -19 201 -16 ct 207 -13 220 -11 239 -11 ct -239 -11 239 -11 239 0 ct 239 0 239 0 82 0 ct 82 0 82 0 82 -11 ct 101 -11 114 -13 120 -16 ct -125 -19 129 -23 132 -28 ct 134 -33 135 -49 135 -74 ct 135 -74 135 -74 135 -301 ct -135 -331 134 -351 132 -359 ct 130 -366 128 -371 124 -374 ct 120 -377 116 -379 110 -379 ct -103 -379 92 -375 79 -369 ct 79 -369 79 -369 74 -379 ct p ef -pom -gr -gs -132 741 m 1350 0 rl 0 31 rl 1350 neg 0 rl ef p ef - -gr -gs -pum -238 1376 t -328 -430 m 328 -430 328 -430 296 -80 ct 294 -64 294 -53 294 -48 ct 294 -40 295 -33 298 -29 ct -302 -23 307 -18 314 -15 ct 321 -12 332 -11 348 -11 ct 348 -11 348 -11 345 0 ct -345 0 345 0 180 0 ct 180 0 180 0 184 -11 ct 184 -11 184 -11 191 -11 ct 204 -11 215 -14 224 -20 ct -230 -24 234 -30 238 -39 ct 240 -46 242 -61 244 -85 ct 244 -85 244 -85 249 -138 ct -249 -138 249 -138 128 -138 ct 128 -138 128 -138 86 -80 ct 76 -67 70 -57 67 -52 ct -65 -46 64 -41 64 -36 ct 64 -29 66 -24 72 -19 ct 77 -14 86 -11 98 -11 ct 98 -11 98 -11 95 0 ct -95 0 95 0 -30 0 ct -30 0 -30 0 -27 -11 ct -12 -12 2 -17 14 -26 ct 25 -36 43 -57 66 -88 ct -66 -88 66 -88 317 -430 ct 317 -430 317 -430 328 -430 ct p -268 -327 m 144 -159 l 251 -159 l 268 -327 l p ef -pom -gr -gs -pum -661 1376 t -168 131 m 127 98 96 50 75 -12 ct 56 -66 47 -123 47 -183 ct 47 -241 56 -298 75 -354 ct -98 -419 128 -467 168 -497 ct 168 -497 168 -497 168 -481 ct 139 -454 116 -408 101 -342 ct -89 -290 83 -237 83 -183 ct 83 -129 89 -76 101 -24 ct 116 43 139 89 168 116 ct 168 116 168 116 168 131 ct -p ef -pom -gr -gs -pum -953 1376 t -54 -273 m 54 -273 54 -273 249 -273 ct 249 -273 249 -273 249 -265 ct 249 -265 249 -265 35 -42 ct -35 -42 35 -42 125 -42 ct 147 -42 161 -43 166 -44 ct 172 -46 178 -50 183 -55 ct -187 -60 193 -70 199 -84 ct 199 -84 199 -84 210 -84 ct 210 -84 210 -84 183 0 ct -183 0 183 0 -18 0 ct -18 0 -18 0 -18 -9 ct -18 -9 -18 -9 196 -232 ct 196 -232 196 -232 109 -232 ct -90 -232 78 -232 74 -231 ct 68 -229 63 -226 57 -221 ct 51 -216 45 -208 39 -196 ct -39 -196 39 -196 28 -196 ct 28 -196 28 -196 54 -273 ct p ef -pom -gr -gs -pum -1270 1376 t -33 116 m 61 90 82 46 97 -18 ct 110 -70 117 -120 117 -170 ct 117 -229 111 -284 100 -335 ct -86 -404 63 -453 33 -481 ct 33 -481 33 -481 33 -497 ct 72 -468 103 -421 125 -354 ct -143 -299 153 -241 153 -183 ct 153 -123 144 -66 125 -11 ct 103 54 72 102 33 131 ct -33 131 33 131 33 116 ct p ef -pom -gr -gr -gr -gr -gr -5400 9300 m 4400 9300 l 4400 7500 l 6400 7500 l 6400 9300 l 5400 9300 l -pc -7700 7000 m 6800 7000 l 6800 5500 l 8600 5500 l 8600 7000 l 7700 7000 l -pc -gs -gs -pum -7102 6460 t -47 0 m 47 -455 l 107 -455 l 107 -54 l 330 -54 l 330 0 l 47 0 l p ef -380 -146 m 380 -146 380 -146 437 -151 ct 440 -128 446 -110 456 -95 ct 465 -80 481 -69 501 -60 ct -522 -51 545 -46 571 -46 ct 593 -46 614 -49 631 -56 ct 649 -63 662 -72 670 -84 ct -679 -96 683 -109 683 -123 ct 683 -138 679 -150 670 -161 ct 662 -171 648 -180 629 -187 ct -617 -192 590 -200 549 -210 ct 507 -220 478 -229 461 -238 ct 440 -249 424 -264 413 -280 ct -402 -297 397 -316 397 -337 ct 397 -360 404 -382 416 -402 ct 429 -422 448 -437 473 -447 ct -498 -458 526 -463 557 -463 ct 590 -463 620 -458 646 -447 ct 671 -436 691 -420 705 -399 ct -719 -378 726 -354 727 -327 ct 727 -327 727 -327 669 -323 ct 666 -351 656 -373 638 -387 ct -620 -402 594 -409 559 -409 ct 523 -409 496 -402 480 -389 ct 463 -376 455 -360 455 -341 ct -455 -324 461 -311 473 -300 ct 484 -290 514 -279 563 -268 ct 611 -257 645 -247 663 -239 ct -690 -227 709 -211 722 -193 ct 735 -174 741 -153 741 -128 ct 741 -104 734 -81 720 -60 ct -706 -38 687 -22 661 -10 ct 635 2 606 8 573 8 ct 532 8 498 2 470 -10 ct 442 -22 421 -40 405 -64 ct -389 -88 381 -116 380 -146 ct p ef -824 0 m 824 0 824 0 824 -455 ct 824 -455 824 -455 995 -455 ct 1026 -455 1049 -454 1065 -451 ct -1087 -447 1106 -440 1121 -429 ct 1136 -419 1148 -404 1157 -385 ct 1166 -367 1171 -346 1171 -323 ct -1171 -285 1159 -252 1134 -225 ct 1109 -198 1065 -185 1001 -185 ct 1001 -185 1001 -185 884 -185 ct -884 -185 884 -185 884 0 ct 884 0 884 0 824 0 ct p -884 -239 m 884 -239 884 -239 1002 -239 ct 1041 -239 1068 -246 1084 -261 ct -1101 -275 1109 -295 1109 -322 ct 1109 -341 1104 -357 1095 -370 ct 1085 -384 1072 -393 1057 -397 ct -1046 -400 1028 -401 1000 -401 ct 1000 -401 1000 -401 884 -401 ct 884 -401 884 -401 884 -239 ct -p ef -pom -gr -gr -6800 6250 m 6238 6438 l 6238 6063 l 6800 6250 l p ef -4700 6225 m 6350 6225 l 6350 6275 l 4700 6275 l 4700 6225 l p ef -4400 8400 m 3988 8538 l 3988 8263 l 4400 8400 l p ef -4070 8425 m 1950 8425 l 1950 8400 l 1950 8375 l 4070 8375 l 4070 8400 l -4070 8425 l p ef -1950 8400 m 1950 8425 l 1946 8425 l 1941 8423 l 1938 8422 l 1934 8419 l -1931 8416 l 1928 8413 l 1927 8409 l 1925 8404 l 1925 8400 l 1925 8400 l -1950 8400 l p ef -1925 8400 m 1925 4500 l 1950 4500 l 1975 4500 l 1975 8400 l 1950 8400 l -1925 8400 l p ef -1950 4500 m 1950 4500 l 1950 4500 l 1950 4500 l 1950 4500 l 1950 4500 l -1950 4500 l p ef -5400 7500 m 5213 6938 l 5588 6938 l 5400 7500 l p ef -4700 6225 m 5400 6225 l 5400 6250 l 5400 6275 l 4700 6275 l 4700 6250 l -4700 6225 l p ef -5400 6250 m 5400 6225 l 5404 6225 l 5409 6227 l 5412 6228 l 5416 6231 l -5419 6234 l 5422 6237 l 5423 6241 l 5425 6246 l 5425 6250 l 5425 6250 l -5400 6250 l p ef -5425 6250 m 5425 7050 l 5400 7050 l 5375 7050 l 5375 6250 l 5400 6250 l -5425 6250 l p ef -10600 7000 m 9700 7000 l 9700 5500 l 11500 5500 l 11500 7000 l 10600 7000 l -pc -gs -gs -pum -10153 6460 t -178 0 m 178 0 178 0 2 -455 ct 2 -455 2 -455 67 -455 ct 67 -455 67 -455 186 -124 ct -195 -98 203 -73 210 -50 ct 217 -74 225 -99 234 -124 ct 234 -124 234 -124 357 -455 ct -357 -455 357 -455 419 -455 ct 419 -455 419 -455 241 0 ct 241 0 241 0 178 0 ct p ef -817 -48 m 845 -29 870 -15 894 -6 ct 894 -6 894 -6 876 36 ct 843 24 811 5 778 -21 ct -745 -2 707 8 667 8 ct 625 8 588 -2 555 -22 ct 521 -42 495 -70 477 -106 ct 459 -142 450 -182 450 -227 ct -450 -272 459 -313 477 -350 ct 496 -387 521 -415 555 -434 ct 589 -453 626 -463 668 -463 ct -710 -463 748 -453 781 -433 ct 815 -413 841 -385 858 -349 ct 876 -313 885 -273 885 -227 ct -885 -190 879 -156 868 -126 ct 857 -96 839 -70 817 -48 ct p -684 -125 m 719 -115 747 -101 770 -82 ct 805 -114 823 -162 823 -227 ct 823 -264 817 -296 804 -324 ct -792 -352 773 -373 749 -388 ct 725 -403 698 -411 668 -411 ct 623 -411 586 -396 556 -365 ct -527 -334 512 -288 512 -227 ct 512 -168 527 -122 556 -91 ct 585 -59 623 -43 668 -43 ct -690 -43 710 -47 729 -55 ct 710 -67 690 -76 669 -81 ct 669 -81 669 -81 684 -125 ct -p ef -pom -gr -gr -9700 6250 m 9138 6438 l 9138 6063 l 9700 6250 l p ef -8600 6225 m 9250 6225 l 9250 6275 l 8600 6275 l 8600 6225 l p ef -gs -8135 7931 m 9830 7931 l 9830 8806 l 8135 8806 l 8135 7931 l eoclip newpath -gs -tm setmatrix -7435 4921 t -1 1 s -gs -gs -0 0 m 1695 0 l 1695 875 l 0 875 l 0 0 l eoclip newpath -gs -pum -106 741 t -650 93 m 650 93 650 93 56 93 ct 56 93 56 93 56 76 ct 56 76 56 76 359 -301 ct 359 -301 359 -301 56 -670 ct -56 -670 56 -670 56 -687 ct 56 -687 56 -687 634 -687 ct 634 -687 634 -687 646 -534 ct -646 -534 646 -534 627 -534 ct 620 -611 582 -650 516 -650 ct 516 -650 516 -650 181 -650 ct -181 -650 181 -650 435 -339 ct 435 -339 435 -339 150 13 ct 150 13 150 13 520 13 ct -595 13 642 -24 661 -98 ct 661 -98 661 -98 679 -96 ct 679 -96 679 -96 650 93 ct -p ef -pom -gr -gs -pum -953 661 t -168 131 m 127 98 96 50 75 -12 ct 56 -66 47 -123 47 -183 ct 47 -241 56 -298 75 -354 ct -98 -419 128 -467 168 -497 ct 168 -497 168 -497 168 -481 ct 139 -454 116 -408 101 -342 ct -89 -290 83 -237 83 -183 ct 83 -129 89 -76 101 -24 ct 116 43 139 89 168 116 ct 168 116 168 116 168 131 ct -p ef -pom -gr -gs -pum -1217 661 t -33 116 m 61 90 82 46 97 -18 ct 110 -70 117 -120 117 -170 ct 117 -229 111 -284 100 -335 ct -86 -404 63 -453 33 -481 ct 33 -481 33 -481 33 -497 ct 72 -468 103 -421 125 -354 ct -143 -299 153 -241 153 -183 ct 153 -123 144 -66 125 -11 ct 103 54 72 102 33 131 ct -33 131 33 131 33 116 ct p ef -pom -gr -gs -pum -1402 344 t -175 -48 m 175 -48 175 -48 157 0 ct 157 0 157 0 8 0 ct 8 0 8 0 8 -7 ct 52 -47 83 -79 101 -105 ct -119 -130 128 -153 128 -174 ct 128 -190 123 -204 113 -214 ct 103 -225 91 -230 78 -230 ct -65 -230 54 -226 44 -219 ct 34 -212 27 -202 22 -188 ct 22 -188 22 -188 15 -188 ct -18 -211 26 -228 39 -240 ct 52 -252 68 -258 88 -258 ct 108 -258 125 -251 139 -238 ct -153 -225 160 -209 160 -191 ct 160 -179 157 -166 151 -153 ct 142 -133 127 -112 106 -89 ct -75 -55 55 -35 48 -28 ct 48 -28 48 -28 114 -28 ct 127 -28 137 -29 142 -29 ct 147 -30 152 -32 157 -36 ct -161 -39 165 -43 168 -48 ct 168 -48 168 -48 175 -48 ct p ef -pom -gr -gr -gr -gr -gr -8950 9100 m 7900 9100 l 7900 7700 l 10000 7700 l 10000 9100 l 8950 9100 l -pc -7900 8400 m 7338 8588 l 7338 8213 l 7900 8400 l p ef -6400 8375 m 7450 8375 l 7450 8425 l 6400 8425 l 6400 8375 l p ef -13350 9100 m 12300 9100 l 12300 7700 l 14400 7700 l 14400 9100 l 13350 9100 l -pc -gs -gs -pum -12395 8584 t -242 -260 m 242 -260 242 -260 242 64 ct 242 81 243 91 245 96 ct 248 101 251 104 256 107 ct -260 110 269 111 283 111 ct 283 111 283 111 283 121 ct 283 121 283 121 156 121 ct -156 121 156 121 156 111 ct 156 111 156 111 161 111 ct 172 111 179 109 185 106 ct -189 104 191 101 194 95 ct 196 90 197 79 197 64 ct 197 64 197 64 197 -45 ct 180 -25 166 -11 153 -4 ct -141 3 128 7 114 7 ct 90 7 68 -4 49 -26 ct 30 -48 20 -78 20 -115 ct 20 -158 33 -193 58 -220 ct -83 -247 114 -260 149 -260 ct 160 -260 170 -259 178 -256 ct 187 -253 195 -248 202 -243 ct -213 -248 223 -253 233 -260 ct 233 -260 233 -260 242 -260 ct p -197 -62 m 197 -62 197 -62 197 -180 ct 197 -194 195 -205 192 -213 ct 188 -221 182 -227 172 -233 ct -163 -238 153 -241 141 -241 ct 121 -241 103 -232 88 -215 ct 73 -197 66 -171 66 -136 ct -66 -102 74 -76 89 -58 ct 104 -41 122 -32 143 -32 ct 154 -32 163 -34 172 -39 ct -181 -44 189 -51 197 -62 ct p ef -523 -253 m 523 -253 523 -253 523 -99 ct 523 -70 524 -53 525 -47 ct 526 -40 529 -36 532 -33 ct -535 -31 538 -29 542 -29 ct 548 -29 554 -31 561 -34 ct 561 -34 561 -34 565 -24 ct -565 -24 565 -24 490 7 ct 490 7 490 7 478 7 ct 478 7 478 7 478 -46 ct 456 -23 440 -8 428 -2 ct -417 4 405 7 392 7 ct 378 7 365 3 355 -5 ct 344 -14 337 -24 333 -37 ct 329 -50 327 -68 327 -92 ct -327 -92 327 -92 327 -205 ct 327 -217 326 -225 323 -229 ct 321 -234 317 -237 312 -240 ct -307 -242 297 -243 284 -243 ct 284 -243 284 -243 284 -253 ct 284 -253 284 -253 373 -253 ct -373 -253 373 -253 373 -84 ct 373 -60 377 -44 385 -37 ct 394 -30 403 -26 415 -26 ct -423 -26 432 -28 442 -33 ct 452 -38 464 -48 478 -62 ct 478 -62 478 -62 478 -205 ct -478 -220 475 -230 470 -235 ct 465 -240 454 -243 437 -243 ct 437 -243 437 -243 437 -253 ct -437 -253 437 -253 523 -253 ct p ef -728 -37 m 702 -17 686 -5 679 -2 ct 669 3 659 5 647 5 ct 630 5 615 -1 604 -13 ct -593 -25 587 -40 587 -60 ct 587 -72 590 -83 595 -92 ct 603 -104 616 -116 635 -127 ct -653 -138 685 -151 728 -167 ct 728 -167 728 -167 728 -177 ct 728 -202 724 -219 716 -228 ct -708 -237 697 -242 681 -242 ct 670 -242 661 -239 654 -233 ct 647 -226 643 -219 643 -211 ct -643 -211 643 -211 644 -195 ct 644 -187 642 -180 637 -176 ct 633 -171 627 -169 620 -169 ct -614 -169 608 -171 604 -176 ct 599 -181 597 -188 597 -196 ct 597 -212 605 -227 621 -240 ct -637 -253 660 -260 689 -260 ct 711 -260 730 -256 744 -249 ct 755 -243 763 -234 768 -222 ct -771 -214 773 -198 773 -174 ct 773 -174 773 -174 773 -89 ct 773 -65 773 -50 774 -45 ct -775 -39 777 -36 779 -34 ct 781 -32 783 -31 786 -31 ct 789 -31 792 -32 794 -33 ct -798 -35 805 -42 816 -53 ct 816 -53 816 -53 816 -38 ct 796 -10 776 4 758 4 ct 749 4 741 1 736 -5 ct -731 -11 728 -22 728 -37 ct p -728 -54 m 728 -54 728 -54 728 -149 ct 700 -138 682 -130 674 -126 ct 659 -118 649 -110 642 -101 ct -636 -92 633 -83 633 -72 ct 633 -59 637 -49 645 -40 ct 653 -31 662 -27 672 -27 ct -687 -27 705 -36 728 -54 ct p ef -909 -207 m 938 -242 966 -260 993 -260 ct 1007 -260 1019 -257 1028 -250 ct 1038 -243 1046 -231 1052 -216 ct -1056 -205 1058 -188 1058 -165 ct 1058 -165 1058 -165 1058 -57 ct 1058 -41 1059 -30 1062 -25 ct -1064 -20 1067 -16 1071 -14 ct 1075 -11 1083 -10 1095 -10 ct 1095 -10 1095 -10 1095 0 ct -1095 0 1095 0 971 0 ct 971 0 971 0 971 -10 ct 971 -10 971 -10 976 -10 ct 988 -10 996 -12 1001 -15 ct -1006 -19 1009 -24 1011 -31 ct 1012 -34 1012 -43 1012 -57 ct 1012 -57 1012 -57 1012 -161 ct -1012 -184 1009 -201 1003 -211 ct 997 -222 987 -227 973 -227 ct 952 -227 930 -215 909 -191 ct -909 -191 909 -191 909 -57 ct 909 -40 910 -29 912 -25 ct 915 -20 918 -16 923 -14 ct -927 -11 936 -10 950 -10 ct 950 -10 950 -10 950 0 ct 950 0 950 0 826 0 ct 826 0 826 0 826 -10 ct -826 -10 826 -10 831 -10 ct 844 -10 852 -13 856 -20 ct 861 -26 863 -39 863 -57 ct -863 -57 863 -57 863 -151 ct 863 -181 862 -200 861 -206 ct 860 -213 858 -217 855 -220 ct -852 -222 848 -223 843 -223 ct 838 -223 832 -222 825 -219 ct 825 -219 825 -219 821 -229 ct -821 -229 821 -229 897 -260 ct 897 -260 897 -260 909 -260 ct 909 -260 909 -260 909 -207 ct -p ef -1192 -337 m 1192 -337 1192 -337 1192 -253 ct 1192 -253 1192 -253 1251 -253 ct -1251 -253 1251 -253 1251 -234 ct 1251 -234 1251 -234 1192 -234 ct 1192 -234 1192 -234 1192 -70 ct -1192 -53 1194 -42 1199 -37 ct 1204 -31 1210 -28 1217 -28 ct 1223 -28 1229 -30 1235 -34 ct -1240 -37 1245 -43 1248 -50 ct 1248 -50 1248 -50 1259 -50 ct 1253 -32 1243 -19 1232 -10 ct -1220 -1 1207 4 1195 4 ct 1186 4 1178 2 1170 -3 ct 1162 -8 1156 -14 1152 -23 ct -1148 -32 1146 -45 1146 -64 ct 1146 -64 1146 -64 1146 -234 ct 1146 -234 1146 -234 1106 -234 ct -1106 -234 1106 -234 1106 -243 ct 1116 -247 1126 -254 1137 -264 ct 1148 -273 1157 -285 1165 -298 ct -1170 -305 1175 -318 1183 -337 ct 1183 -337 1183 -337 1192 -337 ct p ef -1339 -392 m 1347 -392 1353 -389 1359 -384 ct 1364 -378 1367 -372 1367 -364 ct -1367 -356 1364 -350 1359 -344 ct 1353 -339 1347 -336 1339 -336 ct 1331 -336 1325 -339 1319 -344 ct -1314 -350 1311 -356 1311 -364 ct 1311 -372 1314 -378 1319 -384 ct 1325 -389 1331 -392 1339 -392 ct -p -1362 -260 m 1362 -260 1362 -260 1362 -57 ct 1362 -41 1363 -31 1365 -26 ct 1368 -20 1371 -16 1375 -14 ct -1380 -11 1387 -10 1399 -10 ct 1399 -10 1399 -10 1399 0 ct 1399 0 1399 0 1279 0 ct -1279 0 1279 0 1279 -10 ct 1291 -10 1299 -11 1303 -14 ct 1307 -16 1310 -20 1312 -25 ct -1315 -31 1316 -41 1316 -57 ct 1316 -57 1316 -57 1316 -154 ct 1316 -181 1315 -199 1314 -207 ct -1312 -213 1310 -217 1308 -220 ct 1305 -222 1301 -223 1296 -223 ct 1291 -223 1285 -222 1278 -219 ct -1278 -219 1278 -219 1274 -229 ct 1274 -229 1274 -229 1350 -260 ct 1350 -260 1350 -260 1362 -260 ct -p ef -1651 -77 m 1651 -77 1651 -77 1648 0 ct 1648 0 1648 0 1425 0 ct 1425 0 1425 0 1425 -10 ct -1425 -10 1425 -10 1594 -234 ct 1594 -234 1594 -234 1509 -234 ct 1491 -234 1480 -233 1474 -231 ct -1469 -228 1464 -224 1461 -217 ct 1456 -208 1453 -197 1452 -183 ct 1452 -183 1452 -183 1442 -183 ct -1442 -183 1442 -183 1443 -253 ct 1443 -253 1443 -253 1655 -253 ct 1655 -253 1655 -253 1655 -243 ct -1655 -243 1655 -243 1486 -18 ct 1486 -18 1486 -18 1578 -18 ct 1597 -18 1610 -20 1617 -23 ct -1624 -26 1629 -32 1634 -40 ct 1637 -46 1639 -58 1641 -77 ct 1641 -77 1641 -77 1651 -77 ct -p ef -1724 -158 m 1724 -121 1733 -92 1751 -71 ct 1769 -50 1790 -39 1815 -39 ct 1831 -39 1846 -43 1858 -52 ct -1870 -61 1880 -77 1888 -99 ct 1888 -99 1888 -99 1897 -94 ct 1893 -68 1882 -45 1863 -24 ct -1845 -3 1822 7 1794 7 ct 1764 7 1738 -5 1716 -28 ct 1695 -52 1684 -83 1684 -123 ct -1684 -166 1695 -200 1717 -224 ct 1739 -248 1767 -260 1800 -260 ct 1828 -260 1852 -251 1870 -232 ct -1888 -214 1897 -189 1897 -158 ct 1897 -158 1897 -158 1724 -158 ct p -1724 -174 m 1724 -174 1724 -174 1840 -174 ct 1839 -190 1837 -201 1834 -208 ct -1830 -218 1823 -226 1814 -231 ct 1805 -237 1795 -240 1786 -240 ct 1770 -240 1757 -234 1745 -223 ct -1733 -211 1726 -195 1724 -174 ct p ef -pom -gr -gr -12300 8400 m 11738 8588 l 11738 8213 l 12300 8400 l p ef -10000 8375 m 11850 8375 l 11850 8425 l 10000 8425 l 10000 8375 l p ef -gs -10100 7500 m 11689 7500 l 11689 8295 l 10100 8295 l 10100 7500 l eoclip newpath -gs -tm setmatrix -9393 4498 t -1 1 s -gs -gs -0 0 m 1589 0 l 1589 795 l 0 795 l 0 0 l eoclip newpath -gs -pum -159 556 t -331 -261 m 331 -261 331 -261 322 -229 ct 322 -229 322 -229 270 -229 ct 274 -218 276 -207 276 -198 ct -276 -170 264 -146 241 -124 ct 217 -103 185 -91 144 -89 ct 122 -82 106 -75 95 -65 ct -91 -62 89 -59 89 -55 ct 89 -51 91 -47 95 -44 ct 98 -40 108 -37 123 -33 ct 123 -33 123 -33 183 -20 ct -216 -12 238 -3 248 8 ct 259 19 264 31 264 46 ct 264 63 258 78 245 92 ct 233 106 215 117 190 125 ct -166 133 140 137 111 137 ct 85 137 62 134 41 128 ct 20 122 5 114 -4 103 ct -13 93 -18 82 -18 71 ct --18 63 -15 53 -9 44 ct -3 34 4 26 13 20 ct 19 16 35 7 61 -8 ct 52 -15 47 -23 47 -32 ct -47 -40 51 -49 59 -58 ct 67 -68 85 -78 111 -89 ct 89 -93 71 -103 58 -118 ct 45 -132 39 -149 39 -167 ct -39 -196 52 -222 78 -245 ct 104 -268 138 -280 181 -280 ct 196 -280 209 -278 219 -275 ct -229 -272 239 -268 248 -261 ct 248 -261 248 -261 331 -261 ct p -225 -211 m 225 -228 220 -240 211 -250 ct 201 -259 189 -264 173 -264 ct 149 -264 129 -252 114 -229 ct -98 -206 90 -182 90 -157 ct 90 -141 95 -128 105 -118 ct 115 -108 127 -103 142 -103 ct -153 -103 164 -106 174 -112 ct 185 -118 194 -126 201 -136 ct 209 -147 214 -160 219 -176 ct -223 -192 225 -204 225 -211 ct p -74 0 m 57 8 45 18 36 30 ct 27 42 23 53 23 65 ct 23 79 29 90 42 99 ct 59 112 85 118 120 118 ct -149 118 175 113 196 103 ct 217 93 227 80 227 64 ct 227 56 223 48 215 41 ct 208 34 193 28 170 24 ct -158 21 126 13 74 0 ct p ef -pom -gr -gs -pum -609 714 t -119 -164 m 119 -164 119 -164 116 -150 ct 116 -150 116 -150 88 -150 ct 88 -150 88 -150 65 -69 ct -55 -34 45 -6 36 13 ct 23 41 9 60 -6 70 ct -18 78 -29 82 -41 82 ct -49 82 -55 80 -60 75 ct --64 72 -66 68 -66 63 ct -66 59 -64 55 -61 52 ct -58 49 -54 48 -50 48 ct -46 48 -44 49 -41 51 ct --39 53 -38 56 -38 58 ct -38 61 -39 64 -41 66 ct -43 68 -44 69 -44 70 ct -44 71 -44 72 -43 73 ct --42 74 -40 74 -38 74 ct -32 74 -27 72 -21 69 ct -15 66 -10 61 -5 54 ct -1 48 3 38 8 26 ct -9 21 14 4 22 -25 ct 22 -25 22 -25 59 -150 ct 59 -150 59 -150 22 -150 ct 22 -150 22 -150 25 -164 ct -36 -164 44 -165 49 -166 ct 53 -168 57 -170 61 -174 ct 65 -178 70 -186 75 -197 ct -82 -212 89 -224 95 -232 ct 104 -243 113 -251 123 -257 ct 132 -262 142 -265 150 -265 ct -159 -265 166 -263 172 -258 ct 177 -253 180 -248 180 -242 ct 180 -238 179 -234 176 -231 ct -173 -228 169 -227 165 -227 ct 161 -227 158 -228 156 -230 ct 153 -233 152 -235 152 -238 ct -152 -240 153 -243 155 -245 ct 157 -248 158 -250 158 -251 ct 158 -253 157 -254 156 -255 ct -155 -256 153 -257 150 -257 ct 143 -257 136 -254 130 -249 ct 122 -242 115 -232 109 -217 ct -106 -210 100 -192 92 -164 ct 92 -164 92 -164 119 -164 ct p ef -125 -158 m 125 -158 125 -158 189 -168 ct 189 -168 189 -168 163 -78 ct 185 -115 204 -141 222 -155 ct -232 -164 240 -168 247 -168 ct 251 -168 254 -167 256 -164 ct 259 -162 260 -158 260 -154 ct -260 -146 258 -138 254 -130 ct 251 -125 247 -122 241 -122 ct 238 -122 236 -123 234 -125 ct -232 -127 230 -130 230 -134 ct 230 -136 229 -138 228 -138 ct 227 -139 226 -140 225 -140 ct -223 -140 221 -140 219 -139 ct 216 -137 211 -132 204 -124 ct 194 -112 183 -96 171 -77 ct -166 -68 161 -59 158 -49 ct 153 -35 150 -26 149 -23 ct 149 -23 149 -23 142 0 ct -142 0 142 0 114 0 ct 114 0 114 0 147 -116 ct 151 -129 153 -139 153 -144 ct 153 -146 153 -148 151 -150 ct -148 -152 145 -153 141 -153 ct 139 -153 134 -152 128 -151 ct 128 -151 128 -151 125 -158 ct -p ef -443 -166 m 443 -166 443 -166 406 -40 ct 406 -40 406 -40 402 -23 ct 402 -21 401 -20 401 -19 ct -401 -17 402 -15 403 -14 ct 403 -13 404 -13 405 -13 ct 406 -13 408 -13 409 -15 ct -413 -18 417 -26 423 -37 ct 423 -37 423 -37 429 -33 ct 422 -20 415 -11 407 -5 ct -399 1 392 4 386 4 ct 382 4 378 3 376 0 ct 373 -3 372 -6 372 -11 ct 372 -17 373 -25 376 -35 ct -376 -35 376 -35 380 -50 ct 362 -29 346 -14 331 -5 ct 320 1 309 4 299 4 ct 289 4 280 0 273 -7 ct -266 -14 262 -25 262 -38 ct 262 -57 268 -77 281 -99 ct 294 -120 311 -138 331 -151 ct -346 -161 361 -166 374 -166 ct 383 -166 390 -164 395 -160 ct 401 -157 405 -151 408 -142 ct -408 -142 408 -142 413 -162 ct 413 -162 413 -162 443 -166 ct p -373 -157 m 365 -157 356 -153 346 -146 ct 332 -136 320 -120 309 -100 ct 298 -80 293 -61 293 -45 ct -293 -37 295 -30 300 -25 ct 305 -20 310 -18 317 -18 ct 332 -18 349 -28 367 -47 ct -389 -73 399 -100 398 -128 ct 398 -138 396 -145 392 -150 ct 387 -155 381 -157 373 -157 ct -p ef -528 -168 m 528 -168 528 -168 504 -84 ct 515 -104 524 -119 532 -129 ct 544 -144 555 -155 567 -162 ct -573 -166 580 -168 588 -168 ct 594 -168 599 -166 603 -162 ct 607 -158 609 -153 609 -147 ct -609 -141 608 -133 605 -123 ct 605 -123 605 -123 591 -76 ct 612 -114 632 -140 652 -155 ct -662 -164 673 -168 683 -168 ct 689 -168 694 -166 698 -162 ct 702 -158 704 -151 704 -143 ct -704 -135 703 -128 700 -120 ct 700 -120 700 -120 677 -48 ct 672 -33 669 -24 669 -22 ct -669 -21 670 -19 671 -18 ct 672 -17 673 -17 674 -17 ct 675 -17 677 -18 680 -20 ct -686 -25 692 -33 698 -42 ct 698 -42 698 -42 704 -38 ct 701 -33 696 -26 688 -18 ct -681 -9 674 -3 669 0 ct 663 3 658 4 654 4 ct 650 4 646 3 643 0 ct 641 -3 639 -7 639 -11 ct -639 -17 642 -29 648 -47 ct 648 -47 648 -47 668 -106 ct 672 -120 674 -128 675 -129 ct -675 -132 675 -134 675 -136 ct 675 -139 675 -142 673 -143 ct 671 -145 670 -146 668 -146 ct -662 -146 656 -143 650 -138 ct 631 -122 613 -100 597 -72 ct 586 -53 576 -29 567 0 ct -567 0 567 0 540 0 ct 540 0 540 0 574 -112 ct 578 -124 580 -132 580 -136 ct 580 -140 579 -142 577 -144 ct -576 -145 574 -146 572 -146 ct 568 -146 564 -145 559 -142 ct 551 -137 542 -126 530 -111 ct -518 -95 508 -80 502 -65 ct 499 -59 491 -37 479 0 ct 479 0 479 0 452 0 ct 452 0 452 0 487 -120 ct -487 -120 487 -120 491 -136 ct 492 -138 493 -140 493 -141 ct 493 -144 491 -146 489 -148 ct -486 -150 483 -151 479 -151 ct 478 -151 473 -150 466 -149 ct 466 -149 466 -149 464 -156 ct -464 -156 464 -156 528 -168 ct p ef -763 -70 m 762 -64 762 -59 762 -55 ct 762 -44 766 -35 774 -27 ct 782 -20 792 -16 803 -16 ct -812 -16 821 -18 830 -21 ct 838 -25 851 -33 867 -45 ct 867 -45 867 -45 871 -40 ct -841 -11 813 4 786 4 ct 768 4 754 -2 745 -13 ct 736 -24 731 -37 731 -51 ct 731 -69 737 -88 748 -107 ct -760 -126 774 -141 792 -152 ct 809 -163 827 -168 845 -168 ct 858 -168 868 -165 874 -160 ct -881 -155 884 -148 884 -141 ct 884 -131 880 -121 871 -112 ct 860 -99 844 -89 823 -82 ct -809 -77 789 -73 763 -70 ct p -764 -79 m 783 -81 799 -85 811 -90 ct 826 -97 838 -105 846 -114 ct 854 -124 858 -133 858 -141 ct -858 -147 856 -151 853 -154 ct 850 -157 845 -159 838 -159 ct 825 -159 811 -152 797 -139 ct -782 -125 771 -105 764 -79 ct p ef -pom -gr -gr -gr -gr -gr -gs -14601 7501 m 16190 7501 l 16190 8296 l 14601 8296 l 14601 7501 l eoclip newpath -gs -tm setmatrix -13891 4498 t -1 1 s -gs -gs -0 0 m 1590 0 l 1590 795 l 0 795 l 0 0 l eoclip newpath -gs -pum -212 556 t -208 -345 m 197 -344 l 113 -410 l 25 -342 l 11 -345 l 113 -462 l 208 -345 l -p ef -pom -gr -gs -pum -159 556 t -331 -261 m 331 -261 331 -261 322 -229 ct 322 -229 322 -229 270 -229 ct 274 -218 276 -207 276 -198 ct -276 -170 264 -146 241 -124 ct 217 -103 185 -91 144 -89 ct 122 -82 106 -75 95 -65 ct -91 -62 89 -59 89 -55 ct 89 -51 91 -47 95 -44 ct 98 -40 108 -37 123 -33 ct 123 -33 123 -33 183 -20 ct -216 -12 238 -3 248 8 ct 259 19 264 31 264 46 ct 264 63 258 78 245 92 ct 233 106 215 117 190 125 ct -166 133 140 137 111 137 ct 85 137 62 134 41 128 ct 20 122 5 114 -4 103 ct -13 93 -18 82 -18 71 ct --18 63 -15 53 -9 44 ct -3 34 4 26 13 20 ct 19 16 35 7 61 -8 ct 52 -15 47 -23 47 -32 ct -47 -40 51 -49 59 -58 ct 67 -68 85 -78 111 -89 ct 89 -93 71 -103 58 -118 ct 45 -132 39 -149 39 -167 ct -39 -196 52 -222 78 -245 ct 104 -268 138 -280 181 -280 ct 196 -280 209 -278 219 -275 ct -229 -272 239 -268 248 -261 ct 248 -261 248 -261 331 -261 ct p -225 -211 m 225 -228 220 -240 211 -250 ct 201 -259 189 -264 173 -264 ct 149 -264 129 -252 114 -229 ct -98 -206 90 -182 90 -157 ct 90 -141 95 -128 105 -118 ct 115 -108 127 -103 142 -103 ct -153 -103 164 -106 174 -112 ct 185 -118 194 -126 201 -136 ct 209 -147 214 -160 219 -176 ct -223 -192 225 -204 225 -211 ct p -74 0 m 57 8 45 18 36 30 ct 27 42 23 53 23 65 ct 23 79 29 90 42 99 ct 59 112 85 118 120 118 ct -149 118 175 113 196 103 ct 217 93 227 80 227 64 ct 227 56 223 48 215 41 ct 208 34 193 28 170 24 ct -158 21 126 13 74 0 ct p ef -pom -gr -gs -pum -609 714 t -119 -164 m 119 -164 119 -164 116 -150 ct 116 -150 116 -150 88 -150 ct 88 -150 88 -150 65 -69 ct -55 -34 45 -6 36 13 ct 23 41 9 60 -6 70 ct -18 78 -29 82 -41 82 ct -49 82 -55 80 -60 75 ct --64 72 -66 68 -66 63 ct -66 59 -64 55 -61 52 ct -58 49 -54 48 -50 48 ct -46 48 -44 49 -41 51 ct --39 53 -38 56 -38 58 ct -38 61 -39 64 -41 66 ct -43 68 -44 69 -44 70 ct -44 71 -44 72 -43 73 ct --42 74 -40 74 -38 74 ct -32 74 -27 72 -21 69 ct -15 66 -10 61 -5 54 ct -1 48 3 38 8 26 ct -9 21 14 4 22 -25 ct 22 -25 22 -25 59 -150 ct 59 -150 59 -150 22 -150 ct 22 -150 22 -150 25 -164 ct -36 -164 44 -165 49 -166 ct 53 -168 57 -170 61 -174 ct 65 -178 70 -186 75 -197 ct -82 -212 89 -224 95 -232 ct 104 -243 113 -251 123 -257 ct 132 -262 142 -265 150 -265 ct -159 -265 166 -263 172 -258 ct 177 -253 180 -248 180 -242 ct 180 -238 179 -234 176 -231 ct -173 -228 169 -227 165 -227 ct 161 -227 158 -228 156 -230 ct 153 -233 152 -235 152 -238 ct -152 -240 153 -243 155 -245 ct 157 -248 158 -250 158 -251 ct 158 -253 157 -254 156 -255 ct -155 -256 153 -257 150 -257 ct 143 -257 136 -254 130 -249 ct 122 -242 115 -232 109 -217 ct -106 -210 100 -192 92 -164 ct 92 -164 92 -164 119 -164 ct p ef -125 -158 m 125 -158 125 -158 189 -168 ct 189 -168 189 -168 163 -78 ct 185 -115 204 -141 222 -155 ct -232 -164 240 -168 247 -168 ct 251 -168 254 -167 256 -164 ct 259 -162 260 -158 260 -154 ct -260 -146 258 -138 254 -130 ct 251 -125 247 -122 241 -122 ct 238 -122 236 -123 234 -125 ct -232 -127 230 -130 230 -134 ct 230 -136 229 -138 228 -138 ct 227 -139 226 -140 225 -140 ct -223 -140 221 -140 219 -139 ct 216 -137 211 -132 204 -124 ct 194 -112 183 -96 171 -77 ct -166 -68 161 -59 158 -49 ct 153 -35 150 -26 149 -23 ct 149 -23 149 -23 142 0 ct -142 0 142 0 114 0 ct 114 0 114 0 147 -116 ct 151 -129 153 -139 153 -144 ct 153 -146 153 -148 151 -150 ct -148 -152 145 -153 141 -153 ct 139 -153 134 -152 128 -151 ct 128 -151 128 -151 125 -158 ct -p ef -443 -166 m 443 -166 443 -166 406 -40 ct 406 -40 406 -40 402 -23 ct 402 -21 401 -20 401 -19 ct -401 -17 402 -15 403 -14 ct 403 -13 404 -13 405 -13 ct 406 -13 408 -13 409 -15 ct -413 -18 417 -26 423 -37 ct 423 -37 423 -37 429 -33 ct 422 -20 415 -11 407 -5 ct -399 1 392 4 386 4 ct 382 4 378 3 376 0 ct 373 -3 372 -6 372 -11 ct 372 -17 373 -25 376 -35 ct -376 -35 376 -35 380 -50 ct 362 -29 346 -14 331 -5 ct 320 1 309 4 299 4 ct 289 4 280 0 273 -7 ct -266 -14 262 -25 262 -38 ct 262 -57 268 -77 281 -99 ct 294 -120 311 -138 331 -151 ct -346 -161 361 -166 374 -166 ct 383 -166 390 -164 395 -160 ct 401 -157 405 -151 408 -142 ct -408 -142 408 -142 413 -162 ct 413 -162 413 -162 443 -166 ct p -373 -157 m 365 -157 356 -153 346 -146 ct 332 -136 320 -120 309 -100 ct 298 -80 293 -61 293 -45 ct -293 -37 295 -30 300 -25 ct 305 -20 310 -18 317 -18 ct 332 -18 349 -28 367 -47 ct -389 -73 399 -100 398 -128 ct 398 -138 396 -145 392 -150 ct 387 -155 381 -157 373 -157 ct -p ef -528 -168 m 528 -168 528 -168 504 -84 ct 515 -104 524 -119 532 -129 ct 544 -144 555 -155 567 -162 ct -573 -166 580 -168 588 -168 ct 594 -168 599 -166 603 -162 ct 607 -158 609 -153 609 -147 ct -609 -141 608 -133 605 -123 ct 605 -123 605 -123 591 -76 ct 612 -114 632 -140 652 -155 ct -662 -164 673 -168 683 -168 ct 689 -168 694 -166 698 -162 ct 702 -158 704 -151 704 -143 ct -704 -135 703 -128 700 -120 ct 700 -120 700 -120 677 -48 ct 672 -33 669 -24 669 -22 ct -669 -21 670 -19 671 -18 ct 672 -17 673 -17 674 -17 ct 675 -17 677 -18 680 -20 ct -686 -25 692 -33 698 -42 ct 698 -42 698 -42 704 -38 ct 701 -33 696 -26 688 -18 ct -681 -9 674 -3 669 0 ct 663 3 658 4 654 4 ct 650 4 646 3 643 0 ct 641 -3 639 -7 639 -11 ct -639 -17 642 -29 648 -47 ct 648 -47 648 -47 668 -106 ct 672 -120 674 -128 675 -129 ct -675 -132 675 -134 675 -136 ct 675 -139 675 -142 673 -143 ct 671 -145 670 -146 668 -146 ct -662 -146 656 -143 650 -138 ct 631 -122 613 -100 597 -72 ct 586 -53 576 -29 567 0 ct -567 0 567 0 540 0 ct 540 0 540 0 574 -112 ct 578 -124 580 -132 580 -136 ct 580 -140 579 -142 577 -144 ct -576 -145 574 -146 572 -146 ct 568 -146 564 -145 559 -142 ct 551 -137 542 -126 530 -111 ct -518 -95 508 -80 502 -65 ct 499 -59 491 -37 479 0 ct 479 0 479 0 452 0 ct 452 0 452 0 487 -120 ct -487 -120 487 -120 491 -136 ct 492 -138 493 -140 493 -141 ct 493 -144 491 -146 489 -148 ct -486 -150 483 -151 479 -151 ct 478 -151 473 -150 466 -149 ct 466 -149 466 -149 464 -156 ct -464 -156 464 -156 528 -168 ct p ef -763 -70 m 762 -64 762 -59 762 -55 ct 762 -44 766 -35 774 -27 ct 782 -20 792 -16 803 -16 ct -812 -16 821 -18 830 -21 ct 838 -25 851 -33 867 -45 ct 867 -45 867 -45 871 -40 ct -841 -11 813 4 786 4 ct 768 4 754 -2 745 -13 ct 736 -24 731 -37 731 -51 ct 731 -69 737 -88 748 -107 ct -760 -126 774 -141 792 -152 ct 809 -163 827 -168 845 -168 ct 858 -168 868 -165 874 -160 ct -881 -155 884 -148 884 -141 ct 884 -131 880 -121 871 -112 ct 860 -99 844 -89 823 -82 ct -809 -77 789 -73 763 -70 ct p -764 -79 m 783 -81 799 -85 811 -90 ct 826 -97 838 -105 846 -114 ct 854 -124 858 -133 858 -141 ct -858 -147 856 -151 853 -154 ct 850 -157 845 -159 838 -159 ct 825 -159 811 -152 797 -139 ct -782 -125 771 -105 764 -79 ct p ef -pom -gr -gr -gr -gr -gr -16800 8400 m 16238 8588 l 16238 8213 l 16800 8400 l p ef -14400 8375 m 16350 8375 l 16350 8425 l 14400 8425 l 14400 8375 l p ef -13028 6249 m 12578 6399 l 12578 6099 l 13028 6249 l p ef -1 lw 0 lj 11500 6250 m 12527 6250 l 12527 6249 l 12668 6249 l ps -tm setmatrix -0 0 t -1 1 s -0 6358 t -pom -count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore -%%PageTrailer -%%Trailer -%%EOF diff --git a/speex/doc/speex_analysis.odg b/speex/doc/speex_analysis.odg deleted file mode 100644 index 919945d89450558e75c9d34c977bf5e8cf37c318..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16581 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 diff --git a/speex/html/speex.png b/speex/html/speex.png deleted file mode 100644 index 4db28733e672a821351514567ed57c5850f6fbef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4470 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 IM6N<$f>hgE5&!@I diff --git a/speex/html/speex.webprj b/speex/html/speex.webprj deleted file mode 100644 index 23139f610..000000000 --- a/speex/html/speex.webprj +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/speex/html/speex.xcf b/speex/html/speex.xcf deleted file mode 100644 index e55471233e1036e51c63382676afeee2ed59bdac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24879 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 LmIJ!#XSx3m`tS;< diff --git a/speex/include/Makefile.am b/speex/include/Makefile.am deleted file mode 100644 index 09613b63a..000000000 --- a/speex/include/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ - -SUBDIRS = speex diff --git a/speex/include/speex/Makefile.am b/speex/include/speex/Makefile.am deleted file mode 100644 index 68789ac96..000000000 --- a/speex/include/speex/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -# Historically, these headers were part of the speex package, so in order to -# keep compatibility with existing software we need to keep installing them -# in the same place as they were found then. If new functionality, with new -# headers, are added later, some thought should be given as to whether they -# should instead go somewhere other than $prefix/include/speex. - -speexincludedir = $(includedir)/speex - -nodist_speexinclude_HEADERS = speexdsp_config_types.h - -speexinclude_HEADERS = speex_echo.h speex_jitter.h speex_preprocess.h speex_resampler.h \ - speexdsp_types.h - -noinst_HEADERS=speex_buffer.h - diff --git a/speex/include/speex/speex_buffer.h b/speex/include/speex/speex_buffer.h deleted file mode 100644 index 9e85cfcf0..000000000 --- a/speex/include/speex/speex_buffer.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: speex_buffer.h - This is a very simple ring buffer implementation. It is not thread-safe - so you need to do your own locking. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifndef SPEEX_BUFFER_H -#define SPEEX_BUFFER_H - -#include "speexdsp_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -struct SpeexBuffer_; -typedef struct SpeexBuffer_ SpeexBuffer; - -SpeexBuffer *speex_buffer_init(int size); - -void speex_buffer_destroy(SpeexBuffer *st); - -int speex_buffer_write(SpeexBuffer *st, void *data, int len); - -int speex_buffer_writezeros(SpeexBuffer *st, int len); - -int speex_buffer_read(SpeexBuffer *st, void *data, int len); - -int speex_buffer_get_available(SpeexBuffer *st); - -int speex_buffer_resize(SpeexBuffer *st, int len); - -#ifdef __cplusplus -} -#endif - -#endif - - - - diff --git a/speex/include/speex/speex_echo.h b/speex/include/speex/speex_echo.h deleted file mode 100644 index 4c1aa5a5f..000000000 --- a/speex/include/speex/speex_echo.h +++ /dev/null @@ -1,170 +0,0 @@ -/* Copyright (C) Jean-Marc Valin */ -/** - @file speex_echo.h - @brief Echo cancellation -*/ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifndef SPEEX_ECHO_H -#define SPEEX_ECHO_H -/** @defgroup SpeexEchoState SpeexEchoState: Acoustic echo canceller - * This is the acoustic echo canceller module. - * @{ - */ -#include "speexdsp_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Obtain frame size used by the AEC */ -#define SPEEX_ECHO_GET_FRAME_SIZE 3 - -/** Set sampling rate */ -#define SPEEX_ECHO_SET_SAMPLING_RATE 24 -/** Get sampling rate */ -#define SPEEX_ECHO_GET_SAMPLING_RATE 25 - -/* Can't set window sizes */ -/** Get size of impulse response (int32) */ -#define SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE 27 - -/* Can't set window content */ -/** Get impulse response (int32[]) */ -#define SPEEX_ECHO_GET_IMPULSE_RESPONSE 29 - -/** Internal echo canceller state. Should never be accessed directly. */ -struct SpeexEchoState_; - -/** @class SpeexEchoState - * This holds the state of the echo canceller. You need one per channel. -*/ - -/** Internal echo canceller state. Should never be accessed directly. */ -typedef struct SpeexEchoState_ SpeexEchoState; - -/** Creates a new echo canceller state - * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) - * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) - * @return Newly-created echo canceller state - */ -SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length); - -/** Creates a new multi-channel echo canceller state - * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms) - * @param filter_length Number of samples of echo to cancel (should generally correspond to 100-500 ms) - * @param nb_mic Number of microphone channels - * @param nb_speakers Number of speaker channels - * @return Newly-created echo canceller state - */ -SpeexEchoState *speex_echo_state_init_mc(int frame_size, int filter_length, int nb_mic, int nb_speakers); - -/** Destroys an echo canceller state - * @param st Echo canceller state -*/ -void speex_echo_state_destroy(SpeexEchoState *st); - -/** Performs echo cancellation a frame, based on the audio sent to the speaker (no delay is added - * to playback in this form) - * - * @param st Echo canceller state - * @param rec Signal from the microphone (near end + far end echo) - * @param play Signal played to the speaker (received from far end) - * @param out Returns near-end signal with echo removed - */ -void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out); - -/** Performs echo cancellation a frame (deprecated) */ -void speex_echo_cancel(SpeexEchoState *st, const spx_int16_t *rec, const spx_int16_t *play, spx_int16_t *out, spx_int32_t *Yout); - -/** Perform echo cancellation using internal playback buffer, which is delayed by two frames - * to account for the delay introduced by most soundcards (but it could be off!) - * @param st Echo canceller state - * @param rec Signal from the microphone (near end + far end echo) - * @param out Returns near-end signal with echo removed -*/ -void speex_echo_capture(SpeexEchoState *st, const spx_int16_t *rec, spx_int16_t *out); - -/** Let the echo canceller know that a frame was just queued to the soundcard - * @param st Echo canceller state - * @param play Signal played to the speaker (received from far end) -*/ -void speex_echo_playback(SpeexEchoState *st, const spx_int16_t *play); - -/** Reset the echo canceller to its original state - * @param st Echo canceller state - */ -void speex_echo_state_reset(SpeexEchoState *st); - -/** Used like the ioctl function to control the echo canceller parameters - * - * @param st Echo canceller state - * @param request ioctl-type request (one of the SPEEX_ECHO_* macros) - * @param ptr Data exchanged to-from function - * @return 0 if no error, -1 if request in unknown - */ -int speex_echo_ctl(SpeexEchoState *st, int request, void *ptr); - - - -struct SpeexDecorrState_; - -typedef struct SpeexDecorrState_ SpeexDecorrState; - - -/** Create a state for the channel decorrelation algorithm - This is useful for multi-channel echo cancellation only - * @param rate Sampling rate - * @param channels Number of channels (it's a bit pointless if you don't have at least 2) - * @param frame_size Size of the frame to process at ones (counting samples *per* channel) -*/ -SpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size); - -/** Remove correlation between the channels by modifying the phase and possibly - adding noise in a way that is not (or little) perceptible. - * @param st Decorrelator state - * @param in Input audio in interleaved format - * @param out Result of the decorrelation (out *may* alias in) - * @param strength How much alteration of the audio to apply from 0 to 100. -*/ -void speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength); - -/** Destroy a Decorrelation state - * @param st State to destroy -*/ -void speex_decorrelate_destroy(SpeexDecorrState *st); - - -#ifdef __cplusplus -} -#endif - - -/** @}*/ -#endif diff --git a/speex/include/speex/speex_jitter.h b/speex/include/speex/speex_jitter.h deleted file mode 100644 index 8fc8d7ec6..000000000 --- a/speex/include/speex/speex_jitter.h +++ /dev/null @@ -1,197 +0,0 @@ -/* Copyright (C) 2002 Jean-Marc Valin */ -/** - @file speex_jitter.h - @brief Adaptive jitter buffer for Speex -*/ -/* - 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. - -*/ - -#ifndef SPEEX_JITTER_H -#define SPEEX_JITTER_H -/** @defgroup JitterBuffer JitterBuffer: Adaptive jitter buffer - * This is the jitter buffer that reorders UDP/RTP packets and adjusts the buffer size - * to maintain good quality and low latency. - * @{ - */ - -#include "speexdsp_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** Generic adaptive jitter buffer state */ -struct JitterBuffer_; - -/** Generic adaptive jitter buffer state */ -typedef struct JitterBuffer_ JitterBuffer; - -/** Definition of an incoming packet */ -typedef struct _JitterBufferPacket JitterBufferPacket; - -/** Definition of an incoming packet */ -struct _JitterBufferPacket { - char *data; /**< Data bytes contained in the packet */ - spx_uint32_t len; /**< Length of the packet in bytes */ - spx_uint32_t timestamp; /**< Timestamp for the packet */ - spx_uint32_t span; /**< Time covered by the packet (same units as timestamp) */ - spx_uint16_t sequence; /**< RTP Sequence number if available (0 otherwise) */ - spx_uint32_t user_data; /**< Put whatever data you like here (it's ignored by the jitter buffer) */ -}; - -/** Packet has been retrieved */ -#define JITTER_BUFFER_OK 0 -/** Packet is lost or is late */ -#define JITTER_BUFFER_MISSING 1 -/** A "fake" packet is meant to be inserted here to increase buffering */ -#define JITTER_BUFFER_INSERTION 2 -/** There was an error in the jitter buffer */ -#define JITTER_BUFFER_INTERNAL_ERROR -1 -/** Invalid argument */ -#define JITTER_BUFFER_BAD_ARGUMENT -2 - - -/** Set minimum amount of extra buffering required (margin) */ -#define JITTER_BUFFER_SET_MARGIN 0 -/** Get minimum amount of extra buffering required (margin) */ -#define JITTER_BUFFER_GET_MARGIN 1 -/* JITTER_BUFFER_SET_AVAILABLE_COUNT wouldn't make sense */ - -/** Get the amount of available packets currently buffered */ -#define JITTER_BUFFER_GET_AVAILABLE_COUNT 3 -/** Included because of an early misspelling (will remove in next release) */ -#define JITTER_BUFFER_GET_AVALIABLE_COUNT 3 - -/** Assign a function to destroy unused packet. When setting that, the jitter - buffer no longer copies packet data. */ -#define JITTER_BUFFER_SET_DESTROY_CALLBACK 4 -/** */ -#define JITTER_BUFFER_GET_DESTROY_CALLBACK 5 - -/** Tell the jitter buffer to only adjust the delay in multiples of the step parameter provided */ -#define JITTER_BUFFER_SET_DELAY_STEP 6 -/** */ -#define JITTER_BUFFER_GET_DELAY_STEP 7 - -/** Tell the jitter buffer to only do concealment in multiples of the size parameter provided */ -#define JITTER_BUFFER_SET_CONCEALMENT_SIZE 8 -#define JITTER_BUFFER_GET_CONCEALMENT_SIZE 9 - -/** Absolute max amount of loss that can be tolerated regardless of the delay. Typical loss - should be half of that or less. */ -#define JITTER_BUFFER_SET_MAX_LATE_RATE 10 -#define JITTER_BUFFER_GET_MAX_LATE_RATE 11 - -/** Equivalent cost of one percent late packet in timestamp units */ -#define JITTER_BUFFER_SET_LATE_COST 12 -#define JITTER_BUFFER_GET_LATE_COST 13 - - -/** Initialises jitter buffer - * - * @param step_size Starting value for the size of concleanment packets and delay - adjustment steps. Can be changed at any time using JITTER_BUFFER_SET_DELAY_STEP - and JITTER_BUFFER_GET_CONCEALMENT_SIZE. - * @return Newly created jitter buffer state - */ -JitterBuffer *jitter_buffer_init(int step_size); - -/** Restores jitter buffer to its original state - * - * @param jitter Jitter buffer state - */ -void jitter_buffer_reset(JitterBuffer *jitter); - -/** Destroys jitter buffer - * - * @param jitter Jitter buffer state - */ -void jitter_buffer_destroy(JitterBuffer *jitter); - -/** Put one packet into the jitter buffer - * - * @param jitter Jitter buffer state - * @param packet Incoming packet -*/ -void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet); - -/** Get one packet from the jitter buffer - * - * @param jitter Jitter buffer state - * @param packet Returned packet - * @param desired_span Number of samples (or units) we wish to get from the buffer (no guarantee) - * @param current_timestamp Timestamp for the returned packet -*/ -int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset); - -/** Used right after jitter_buffer_get() to obtain another packet that would have the same timestamp. - * This is mainly useful for media where a single "frame" can be split into several packets. - * - * @param jitter Jitter buffer state - * @param packet Returned packet - */ -int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet); - -/** Get pointer timestamp of jitter buffer - * - * @param jitter Jitter buffer state -*/ -int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter); - -/** Advance by one tick - * - * @param jitter Jitter buffer state -*/ -void jitter_buffer_tick(JitterBuffer *jitter); - -/** Telling the jitter buffer about the remaining data in the application buffer - * @param jitter Jitter buffer state - * @param rem Amount of data buffered by the application (timestamp units) - */ -void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem); - -/** Used like the ioctl function to control the jitter buffer parameters - * - * @param jitter Jitter buffer state - * @param request ioctl-type request (one of the JITTER_BUFFER_* macros) - * @param ptr Data exchanged to-from function - * @return 0 if no error, -1 if request in unknown -*/ -int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr); - -int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset); - -/* @} */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/speex/include/speex/speex_preprocess.h b/speex/include/speex/speex_preprocess.h deleted file mode 100644 index a2e1210d4..000000000 --- a/speex/include/speex/speex_preprocess.h +++ /dev/null @@ -1,219 +0,0 @@ -/* Copyright (C) 2003 Epic Games - Written by Jean-Marc Valin */ -/** - * @file speex_preprocess.h - * @brief Speex preprocessor. The preprocess can do noise suppression, - * residual echo suppression (after using the echo canceller), automatic - * gain control (AGC) and voice activity detection (VAD). -*/ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifndef SPEEX_PREPROCESS_H -#define SPEEX_PREPROCESS_H -/** @defgroup SpeexPreprocessState SpeexPreprocessState: The Speex preprocessor - * This is the Speex preprocessor. The preprocess can do noise suppression, - * residual echo suppression (after using the echo canceller), automatic - * gain control (AGC) and voice activity detection (VAD). - * @{ - */ - -#include "speexdsp_types.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/** State of the preprocessor (one per channel). Should never be accessed directly. */ -struct SpeexPreprocessState_; - -/** State of the preprocessor (one per channel). Should never be accessed directly. */ -typedef struct SpeexPreprocessState_ SpeexPreprocessState; - - -/** Creates a new preprocessing state. You MUST create one state per channel processed. - * @param frame_size Number of samples to process at one time (should correspond to 10-20 ms). Must be - * the same value as that used for the echo canceller for residual echo cancellation to work. - * @param sampling_rate Sampling rate used for the input. - * @return Newly created preprocessor state -*/ -SpeexPreprocessState *speex_preprocess_state_init(int frame_size, int sampling_rate); - -/** Destroys a preprocessor state - * @param st Preprocessor state to destroy -*/ -void speex_preprocess_state_destroy(SpeexPreprocessState *st); - -/** Preprocess a frame - * @param st Preprocessor state - * @param x Audio sample vector (in and out). Must be same size as specified in speex_preprocess_state_init(). - * @return Bool value for voice activity (1 for speech, 0 for noise/silence), ONLY if VAD turned on. -*/ -int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x); - -/** Preprocess a frame (deprecated, use speex_preprocess_run() instead)*/ -int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo); - -/** Update preprocessor state, but do not compute the output - * @param st Preprocessor state - * @param x Audio sample vector (in only). Must be same size as specified in speex_preprocess_state_init(). -*/ -void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x); - -/** Used like the ioctl function to control the preprocessor parameters - * @param st Preprocessor state - * @param request ioctl-type request (one of the SPEEX_PREPROCESS_* macros) - * @param ptr Data exchanged to-from function - * @return 0 if no error, -1 if request in unknown -*/ -int speex_preprocess_ctl(SpeexPreprocessState *st, int request, void *ptr); - - - -/** Set preprocessor denoiser state */ -#define SPEEX_PREPROCESS_SET_DENOISE 0 -/** Get preprocessor denoiser state */ -#define SPEEX_PREPROCESS_GET_DENOISE 1 - -/** Set preprocessor Automatic Gain Control state */ -#define SPEEX_PREPROCESS_SET_AGC 2 -/** Get preprocessor Automatic Gain Control state */ -#define SPEEX_PREPROCESS_GET_AGC 3 - -/** Set preprocessor Voice Activity Detection state */ -#define SPEEX_PREPROCESS_SET_VAD 4 -/** Get preprocessor Voice Activity Detection state */ -#define SPEEX_PREPROCESS_GET_VAD 5 - -/** Set preprocessor Automatic Gain Control level (float) */ -#define SPEEX_PREPROCESS_SET_AGC_LEVEL 6 -/** Get preprocessor Automatic Gain Control level (float) */ -#define SPEEX_PREPROCESS_GET_AGC_LEVEL 7 - -/** Set preprocessor dereverb state */ -#define SPEEX_PREPROCESS_SET_DEREVERB 8 -/** Get preprocessor dereverb state */ -#define SPEEX_PREPROCESS_GET_DEREVERB 9 - -/** Set preprocessor dereverb level */ -#define SPEEX_PREPROCESS_SET_DEREVERB_LEVEL 10 -/** Get preprocessor dereverb level */ -#define SPEEX_PREPROCESS_GET_DEREVERB_LEVEL 11 - -/** Set preprocessor dereverb decay */ -#define SPEEX_PREPROCESS_SET_DEREVERB_DECAY 12 -/** Get preprocessor dereverb decay */ -#define SPEEX_PREPROCESS_GET_DEREVERB_DECAY 13 - -/** Set probability required for the VAD to go from silence to voice */ -#define SPEEX_PREPROCESS_SET_PROB_START 14 -/** Get probability required for the VAD to go from silence to voice */ -#define SPEEX_PREPROCESS_GET_PROB_START 15 - -/** Set probability required for the VAD to stay in the voice state (integer percent) */ -#define SPEEX_PREPROCESS_SET_PROB_CONTINUE 16 -/** Get probability required for the VAD to stay in the voice state (integer percent) */ -#define SPEEX_PREPROCESS_GET_PROB_CONTINUE 17 - -/** Set maximum attenuation of the noise in dB (negative number) */ -#define SPEEX_PREPROCESS_SET_NOISE_SUPPRESS 18 -/** Get maximum attenuation of the noise in dB (negative number) */ -#define SPEEX_PREPROCESS_GET_NOISE_SUPPRESS 19 - -/** Set maximum attenuation of the residual echo in dB (negative number) */ -#define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS 20 -/** Get maximum attenuation of the residual echo in dB (negative number) */ -#define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS 21 - -/** Set maximum attenuation of the residual echo in dB when near end is active (negative number) */ -#define SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE 22 -/** Get maximum attenuation of the residual echo in dB when near end is active (negative number) */ -#define SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE 23 - -/** Set the corresponding echo canceller state so that residual echo suppression can be performed (NULL for no residual echo suppression) */ -#define SPEEX_PREPROCESS_SET_ECHO_STATE 24 -/** Get the corresponding echo canceller state */ -#define SPEEX_PREPROCESS_GET_ECHO_STATE 25 - -/** Set maximal gain increase in dB/second (int32) */ -#define SPEEX_PREPROCESS_SET_AGC_INCREMENT 26 - -/** Get maximal gain increase in dB/second (int32) */ -#define SPEEX_PREPROCESS_GET_AGC_INCREMENT 27 - -/** Set maximal gain decrease in dB/second (int32) */ -#define SPEEX_PREPROCESS_SET_AGC_DECREMENT 28 - -/** Get maximal gain decrease in dB/second (int32) */ -#define SPEEX_PREPROCESS_GET_AGC_DECREMENT 29 - -/** Set maximal gain in dB (int32) */ -#define SPEEX_PREPROCESS_SET_AGC_MAX_GAIN 30 - -/** Get maximal gain in dB (int32) */ -#define SPEEX_PREPROCESS_GET_AGC_MAX_GAIN 31 - -/* Can't set loudness */ -/** Get loudness */ -#define SPEEX_PREPROCESS_GET_AGC_LOUDNESS 33 - -/* Can't set gain */ -/** Get current gain (int32 percent) */ -#define SPEEX_PREPROCESS_GET_AGC_GAIN 35 - -/* Can't set spectrum size */ -/** Get spectrum size for power spectrum (int32) */ -#define SPEEX_PREPROCESS_GET_PSD_SIZE 37 - -/* Can't set power spectrum */ -/** Get power spectrum (int32[] of squared values) */ -#define SPEEX_PREPROCESS_GET_PSD 39 - -/* Can't set noise size */ -/** Get spectrum size for noise estimate (int32) */ -#define SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE 41 - -/* Can't set noise estimate */ -/** Get noise estimate (int32[] of squared values) */ -#define SPEEX_PREPROCESS_GET_NOISE_PSD 43 - -/* Can't set speech probability */ -/** Get speech probability in last frame (int32). */ -#define SPEEX_PREPROCESS_GET_PROB 45 - -/** Set preprocessor Automatic Gain Control level (int32) */ -#define SPEEX_PREPROCESS_SET_AGC_TARGET 46 -/** Get preprocessor Automatic Gain Control level (int32) */ -#define SPEEX_PREPROCESS_GET_AGC_TARGET 47 - -#ifdef __cplusplus -} -#endif - -/** @}*/ -#endif diff --git a/speex/include/speex/speex_resampler.h b/speex/include/speex/speex_resampler.h deleted file mode 100644 index 901de37b3..000000000 --- a/speex/include/speex/speex_resampler.h +++ /dev/null @@ -1,343 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: speex_resampler.h - Resampling code - - The design goals of this code are: - - Very fast algorithm - - Low memory requirement - - Good *perceptual* quality (and not best SNR) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - - -#ifndef SPEEX_RESAMPLER_H -#define SPEEX_RESAMPLER_H - -#ifdef OUTSIDE_SPEEX - -/********* WARNING: MENTAL SANITY ENDS HERE *************/ - -/* If the resampler is defined outside of Speex, we change the symbol names so that - there won't be any clash if linking with Speex later on. */ - -/* #define RANDOM_PREFIX your software name here */ -#ifndef RANDOM_PREFIX -#error "Please define RANDOM_PREFIX (above) to something specific to your project to prevent symbol name clashes" -#endif - -#define CAT_PREFIX2(a,b) a ## b -#define CAT_PREFIX(a,b) CAT_PREFIX2(a, b) - -#define speex_resampler_init CAT_PREFIX(RANDOM_PREFIX,_resampler_init) -#define speex_resampler_init_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_init_frac) -#define speex_resampler_destroy CAT_PREFIX(RANDOM_PREFIX,_resampler_destroy) -#define speex_resampler_process_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_float) -#define speex_resampler_process_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_int) -#define speex_resampler_process_interleaved_float CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_float) -#define speex_resampler_process_interleaved_int CAT_PREFIX(RANDOM_PREFIX,_resampler_process_interleaved_int) -#define speex_resampler_set_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate) -#define speex_resampler_get_rate CAT_PREFIX(RANDOM_PREFIX,_resampler_get_rate) -#define speex_resampler_set_rate_frac CAT_PREFIX(RANDOM_PREFIX,_resampler_set_rate_frac) -#define speex_resampler_get_ratio CAT_PREFIX(RANDOM_PREFIX,_resampler_get_ratio) -#define speex_resampler_set_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_set_quality) -#define speex_resampler_get_quality CAT_PREFIX(RANDOM_PREFIX,_resampler_get_quality) -#define speex_resampler_set_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_input_stride) -#define speex_resampler_get_input_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_stride) -#define speex_resampler_set_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_set_output_stride) -#define speex_resampler_get_output_stride CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_stride) -#define speex_resampler_get_input_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_input_latency) -#define speex_resampler_get_output_latency CAT_PREFIX(RANDOM_PREFIX,_resampler_get_output_latency) -#define speex_resampler_skip_zeros CAT_PREFIX(RANDOM_PREFIX,_resampler_skip_zeros) -#define speex_resampler_reset_mem CAT_PREFIX(RANDOM_PREFIX,_resampler_reset_mem) -#define speex_resampler_strerror CAT_PREFIX(RANDOM_PREFIX,_resampler_strerror) - -#define spx_int16_t short -#define spx_int32_t int -#define spx_uint16_t unsigned short -#define spx_uint32_t unsigned int - -#define speex_assert(cond) - -#else /* OUTSIDE_SPEEX */ - -#include "speexdsp_types.h" - -#endif /* OUTSIDE_SPEEX */ - -#ifdef __cplusplus -extern "C" { -#endif - -#define SPEEX_RESAMPLER_QUALITY_MAX 10 -#define SPEEX_RESAMPLER_QUALITY_MIN 0 -#define SPEEX_RESAMPLER_QUALITY_DEFAULT 4 -#define SPEEX_RESAMPLER_QUALITY_VOIP 3 -#define SPEEX_RESAMPLER_QUALITY_DESKTOP 5 - -enum { - RESAMPLER_ERR_SUCCESS = 0, - RESAMPLER_ERR_ALLOC_FAILED = 1, - RESAMPLER_ERR_BAD_STATE = 2, - RESAMPLER_ERR_INVALID_ARG = 3, - RESAMPLER_ERR_PTR_OVERLAP = 4, - RESAMPLER_ERR_OVERFLOW = 5, - - RESAMPLER_ERR_MAX_ERROR -}; - -struct SpeexResamplerState_; -typedef struct SpeexResamplerState_ SpeexResamplerState; - -/** Create a new resampler with integer input and output rates. - * @param nb_channels Number of channels to be processed - * @param in_rate Input sampling rate (integer number of Hz). - * @param out_rate Output sampling rate (integer number of Hz). - * @param quality Resampling quality between 0 and 10, where 0 has poor quality - * and 10 has very high quality. - * @return Newly created resampler state - * @retval NULL Error: not enough memory - */ -SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, - spx_uint32_t in_rate, - spx_uint32_t out_rate, - int quality, - int *err); - -/** Create a new resampler with fractional input/output rates. The sampling - * rate ratio is an arbitrary rational number with both the numerator and - * denominator being 32-bit integers. - * @param nb_channels Number of channels to be processed - * @param ratio_num Numerator of the sampling rate ratio - * @param ratio_den Denominator of the sampling rate ratio - * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). - * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). - * @param quality Resampling quality between 0 and 10, where 0 has poor quality - * and 10 has very high quality. - * @return Newly created resampler state - * @retval NULL Error: not enough memory - */ -SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, - spx_uint32_t ratio_num, - spx_uint32_t ratio_den, - spx_uint32_t in_rate, - spx_uint32_t out_rate, - int quality, - int *err); - -/** Destroy a resampler state. - * @param st Resampler state - */ -void speex_resampler_destroy(SpeexResamplerState *st); - -/** Resample a float array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param channel_index Index of the channel to process for the multi-channel - * base (0 otherwise) - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the - * number of samples processed - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written - */ -int speex_resampler_process_float(SpeexResamplerState *st, - spx_uint32_t channel_index, - const float *in, - spx_uint32_t *in_len, - float *out, - spx_uint32_t *out_len); - -/** Resample an int array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param channel_index Index of the channel to process for the multi-channel - * base (0 otherwise) - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the number - * of samples processed - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written - */ -int speex_resampler_process_int(SpeexResamplerState *st, - spx_uint32_t channel_index, - const spx_int16_t *in, - spx_uint32_t *in_len, - spx_int16_t *out, - spx_uint32_t *out_len); - -/** Resample an interleaved float array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the number - * of samples processed. This is all per-channel. - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written. - * This is all per-channel. - */ -int speex_resampler_process_interleaved_float(SpeexResamplerState *st, - const float *in, - spx_uint32_t *in_len, - float *out, - spx_uint32_t *out_len); - -/** Resample an interleaved int array. The input and output buffers must *not* overlap. - * @param st Resampler state - * @param in Input buffer - * @param in_len Number of input samples in the input buffer. Returns the number - * of samples processed. This is all per-channel. - * @param out Output buffer - * @param out_len Size of the output buffer. Returns the number of samples written. - * This is all per-channel. - */ -int speex_resampler_process_interleaved_int(SpeexResamplerState *st, - const spx_int16_t *in, - spx_uint32_t *in_len, - spx_int16_t *out, - spx_uint32_t *out_len); - -/** Set (change) the input/output sampling rates (integer value). - * @param st Resampler state - * @param in_rate Input sampling rate (integer number of Hz). - * @param out_rate Output sampling rate (integer number of Hz). - */ -int speex_resampler_set_rate(SpeexResamplerState *st, - spx_uint32_t in_rate, - spx_uint32_t out_rate); - -/** Get the current input/output sampling rates (integer value). - * @param st Resampler state - * @param in_rate Input sampling rate (integer number of Hz) copied. - * @param out_rate Output sampling rate (integer number of Hz) copied. - */ -void speex_resampler_get_rate(SpeexResamplerState *st, - spx_uint32_t *in_rate, - spx_uint32_t *out_rate); - -/** Set (change) the input/output sampling rates and resampling ratio - * (fractional values in Hz supported). - * @param st Resampler state - * @param ratio_num Numerator of the sampling rate ratio - * @param ratio_den Denominator of the sampling rate ratio - * @param in_rate Input sampling rate rounded to the nearest integer (in Hz). - * @param out_rate Output sampling rate rounded to the nearest integer (in Hz). - */ -int speex_resampler_set_rate_frac(SpeexResamplerState *st, - spx_uint32_t ratio_num, - spx_uint32_t ratio_den, - spx_uint32_t in_rate, - spx_uint32_t out_rate); - -/** Get the current resampling ratio. This will be reduced to the least - * common denominator. - * @param st Resampler state - * @param ratio_num Numerator of the sampling rate ratio copied - * @param ratio_den Denominator of the sampling rate ratio copied - */ -void speex_resampler_get_ratio(SpeexResamplerState *st, - spx_uint32_t *ratio_num, - spx_uint32_t *ratio_den); - -/** Set (change) the conversion quality. - * @param st Resampler state - * @param quality Resampling quality between 0 and 10, where 0 has poor - * quality and 10 has very high quality. - */ -int speex_resampler_set_quality(SpeexResamplerState *st, - int quality); - -/** Get the conversion quality. - * @param st Resampler state - * @param quality Resampling quality between 0 and 10, where 0 has poor - * quality and 10 has very high quality. - */ -void speex_resampler_get_quality(SpeexResamplerState *st, - int *quality); - -/** Set (change) the input stride. - * @param st Resampler state - * @param stride Input stride - */ -void speex_resampler_set_input_stride(SpeexResamplerState *st, - spx_uint32_t stride); - -/** Get the input stride. - * @param st Resampler state - * @param stride Input stride copied - */ -void speex_resampler_get_input_stride(SpeexResamplerState *st, - spx_uint32_t *stride); - -/** Set (change) the output stride. - * @param st Resampler state - * @param stride Output stride - */ -void speex_resampler_set_output_stride(SpeexResamplerState *st, - spx_uint32_t stride); - -/** Get the output stride. - * @param st Resampler state copied - * @param stride Output stride - */ -void speex_resampler_get_output_stride(SpeexResamplerState *st, - spx_uint32_t *stride); - -/** Get the latency introduced by the resampler measured in input samples. - * @param st Resampler state - */ -int speex_resampler_get_input_latency(SpeexResamplerState *st); - -/** Get the latency introduced by the resampler measured in output samples. - * @param st Resampler state - */ -int speex_resampler_get_output_latency(SpeexResamplerState *st); - -/** Make sure that the first samples to go out of the resamplers don't have - * leading zeros. This is only useful before starting to use a newly created - * resampler. It is recommended to use that when resampling an audio file, as - * it will generate a file with the same length. For real-time processing, - * it is probably easier not to use this call (so that the output duration - * is the same for the first frame). - * @param st Resampler state - */ -int speex_resampler_skip_zeros(SpeexResamplerState *st); - -/** Reset a resampler so a new (unrelated) stream can be processed. - * @param st Resampler state - */ -int speex_resampler_reset_mem(SpeexResamplerState *st); - -/** Returns the English meaning for an error code - * @param err Error code - * @return English string - */ -const char *speex_resampler_strerror(int err); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/speex/include/speex/speexdsp_config_types.h b/speex/include/speex/speexdsp_config_types.h deleted file mode 100644 index ca1f5a3c2..000000000 --- a/speex/include/speex/speexdsp_config_types.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef __SPEEX_TYPES_H__ -#define __SPEEX_TYPES_H__ - -#include - -typedef int16_t spx_int16_t; -typedef uint16_t spx_uint16_t; -typedef int32_t spx_int32_t; -typedef uint32_t spx_uint32_t; - -#endif - diff --git a/speex/include/speex/speexdsp_types.h b/speex/include/speex/speexdsp_types.h deleted file mode 100644 index 4b4a76a47..000000000 --- a/speex/include/speex/speexdsp_types.h +++ /dev/null @@ -1,126 +0,0 @@ -/* speexdsp_types.h taken from libogg */ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * - * by the Xiph.Org Foundation http://www.xiph.org/ * - * * - ******************************************************************** - - function: #ifdef jail to whip a few platforms into the UNIX ideal. - last mod: $Id: os_types.h 7524 2004-08-11 04:20:36Z conrad $ - - ********************************************************************/ -/** - @file speexdsp_types.h - @brief Speex types -*/ -#ifndef _SPEEX_TYPES_H -#define _SPEEX_TYPES_H - -#if defined(_WIN32) - -# if defined(__CYGWIN__) -# include <_G_config.h> - typedef _G_int32_t spx_int32_t; - typedef _G_uint32_t spx_uint32_t; - typedef _G_int16_t spx_int16_t; - typedef _G_uint16_t spx_uint16_t; -# elif defined(__MINGW32__) - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; -# elif defined(__MWERKS__) - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; -# else - /* MSVC/Borland */ - typedef __int32 spx_int32_t; - typedef unsigned __int32 spx_uint32_t; - typedef __int16 spx_int16_t; - typedef unsigned __int16 spx_uint16_t; -# endif - -#elif defined(__MACOS__) - -# include - typedef SInt16 spx_int16_t; - typedef UInt16 spx_uint16_t; - typedef SInt32 spx_int32_t; - typedef UInt32 spx_uint32_t; - -#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */ - -# include - typedef int16_t spx_int16_t; - typedef u_int16_t spx_uint16_t; - typedef int32_t spx_int32_t; - typedef u_int32_t spx_uint32_t; - -#elif defined(__BEOS__) - - /* Be */ -# include - typedef int16_t spx_int16_t; - typedef u_int16_t spx_uint16_t; - typedef int32_t spx_int32_t; - typedef u_int32_t spx_uint32_t; - -#elif defined (__EMX__) - - /* OS/2 GCC */ - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#elif defined (DJGPP) - - /* DJGPP */ - typedef short spx_int16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#elif defined(R5900) - - /* PS2 EE */ - typedef int spx_int32_t; - typedef unsigned spx_uint32_t; - typedef short spx_int16_t; - -#elif defined(__SYMBIAN32__) - - /* Symbian GCC */ - typedef signed short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef signed int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) - - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef long spx_int32_t; - typedef unsigned long spx_uint32_t; - -#elif defined(CONFIG_TI_C6X) - - typedef short spx_int16_t; - typedef unsigned short spx_uint16_t; - typedef int spx_int32_t; - typedef unsigned int spx_uint32_t; - -#else - -#include "speexdsp_config_types.h" - -#endif - -#endif /* _SPEEX_TYPES_H */ diff --git a/speex/libspeexdsp/.cvsignore b/speex/libspeexdsp/.cvsignore deleted file mode 100644 index 09a90ac75..000000000 --- a/speex/libspeexdsp/.cvsignore +++ /dev/null @@ -1,11 +0,0 @@ -.deps -.libs -*.la -*.lo -*.o -Makefile -Makefile.in -testdenoise -testenc -testenc_uwb -testenc_wb diff --git a/speex/libspeexdsp/Makefile.am b/speex/libspeexdsp/Makefile.am deleted file mode 100644 index bed1cc8e3..000000000 --- a/speex/libspeexdsp/Makefile.am +++ /dev/null @@ -1,46 +0,0 @@ -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST=echo_diagnostic.m - -AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include/speex -I$(top_builddir) @FFT_CFLAGS@ - -lib_LTLIBRARIES = libspeexdsp.la - -# Sources for compilation in the library -if BUILD_KISS_FFT - FFTSRC=kiss_fft.c _kiss_fft_guts.h kiss_fft.h kiss_fftr.c kiss_fftr.h -else -if BUILD_SMALLFT - FFTSRC=smallft.c -else - FFTSRC= -endif -endif - -libspeexdsp_la_SOURCES = preprocess.c jitter.c mdf.c fftwrap.c filterbank.c resample.c buffer.c scal.c $(FFTSRC) - -noinst_HEADERS = arch.h bfin.h \ - fixed_arm4.h \ - fixed_arm5e.h fixed_bfin.h fixed_debug.h \ - math_approx.h misc_bfin.h \ - stack_alloc.h fftwrap.h \ - filterbank.h fixed_generic.h os_support.h \ - pseudofloat.h smallft.h vorbis_psy.h resample_sse.h resample_neon.h - -libspeexdsp_la_LDFLAGS = -no-undefined -version-info @SPEEXDSP_LT_CURRENT@:@SPEEXDSP_LT_REVISION@:@SPEEXDSP_LT_AGE@ -libspeexdsp_la_LIBADD = $(LIBM) - -if BUILD_EXAMPLES -noinst_PROGRAMS = testdenoise testecho testjitter testresample testresample2 -testdenoise_SOURCES = testdenoise.c -testdenoise_LDADD = libspeexdsp.la @FFT_LIBS@ -testecho_SOURCES = testecho.c -testecho_LDADD = libspeexdsp.la @FFT_LIBS@ -testjitter_SOURCES = testjitter.c -testjitter_LDADD = libspeexdsp.la @FFT_LIBS@ -testresample_SOURCES = testresample.c -testresample_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ -testresample2_SOURCES = testresample2.c -testresample2_LDADD = libspeexdsp.la @FFT_LIBS@ @LIBM@ -endif diff --git a/speex/libspeexdsp/_kiss_fft_guts.h b/speex/libspeexdsp/_kiss_fft_guts.h deleted file mode 100644 index f5f2a5fd7..000000000 --- a/speex/libspeexdsp/_kiss_fft_guts.h +++ /dev/null @@ -1,160 +0,0 @@ -/* -Copyright (c) 2003-2004, Mark Borgerding - -All rights reserved. - -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 author nor the names of any 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 COPYRIGHT OWNER 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. -*/ - -#define MIN(a,b) ((a)<(b) ? (a):(b)) -#define MAX(a,b) ((a)>(b) ? (a):(b)) - -/* kiss_fft.h - defines kiss_fft_scalar as either short or a float type - and defines - typedef struct { kiss_fft_scalar r; kiss_fft_scalar i; }kiss_fft_cpx; */ -#include "kiss_fft.h" -#include "math_approx.h" - -#define MAXFACTORS 32 -/* e.g. an fft of length 128 has 4 factors - as far as kissfft is concerned - 4*4*4*2 - */ - -struct kiss_fft_state{ - int nfft; - int inverse; - int factors[2*MAXFACTORS]; - kiss_fft_cpx twiddles[1]; -}; - -/* - Explanation of macros dealing with complex math: - - C_MUL(m,a,b) : m = a*b - C_FIXDIV( c , div ) : if a fixed point impl., c /= div. noop otherwise - C_SUB( res, a,b) : res = a - b - C_SUBFROM( res , a) : res -= a - C_ADDTO( res , a) : res += a - * */ -#ifdef FIXED_POINT -#include "arch.h" -# define FRACBITS 15 -# define SAMPPROD spx_int32_t -#define SAMP_MAX 32767 - -#define SAMP_MIN -SAMP_MAX - -#if defined(CHECK_OVERFLOW) -# define CHECK_OVERFLOW_OP(a,op,b) \ - if ( (SAMPPROD)(a) op (SAMPPROD)(b) > SAMP_MAX || (SAMPPROD)(a) op (SAMPPROD)(b) < SAMP_MIN ) { \ - fprintf(stderr,"WARNING:overflow @ " __FILE__ "(%d): (%d " #op" %d) = %ld\n",__LINE__,(a),(b),(SAMPPROD)(a) op (SAMPPROD)(b) ); } -#endif - - -# define smul(a,b) ( (SAMPPROD)(a)*(b) ) -# define sround( x ) (kiss_fft_scalar)( ( (x) + (1<<(FRACBITS-1)) ) >> FRACBITS ) - -# define S_MUL(a,b) sround( smul(a,b) ) - -# define C_MUL(m,a,b) \ - do{ (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ - (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }while(0) - -# define C_MUL4(m,a,b) \ - do{ (m).r = PSHR32( smul((a).r,(b).r) - smul((a).i,(b).i),17 ); \ - (m).i = PSHR32( smul((a).r,(b).i) + smul((a).i,(b).r),17 ); }while(0) - -# define DIVSCALAR(x,k) \ - (x) = sround( smul( x, SAMP_MAX/k ) ) - -# define C_FIXDIV(c,div) \ - do { DIVSCALAR( (c).r , div); \ - DIVSCALAR( (c).i , div); }while (0) - -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r = sround( smul( (c).r , s ) ) ;\ - (c).i = sround( smul( (c).i , s ) ) ; }while(0) - -#else /* not FIXED_POINT*/ - -# define S_MUL(a,b) ( (a)*(b) ) -#define C_MUL(m,a,b) \ - do{ (m).r = (a).r*(b).r - (a).i*(b).i;\ - (m).i = (a).r*(b).i + (a).i*(b).r; }while(0) - -#define C_MUL4(m,a,b) C_MUL(m,a,b) - -# define C_FIXDIV(c,div) /* NOOP */ -# define C_MULBYSCALAR( c, s ) \ - do{ (c).r *= (s);\ - (c).i *= (s); }while(0) -#endif - -#ifndef CHECK_OVERFLOW_OP -# define CHECK_OVERFLOW_OP(a,op,b) /* noop */ -#endif - -#define C_ADD( res, a,b)\ - do { \ - CHECK_OVERFLOW_OP((a).r,+,(b).r)\ - CHECK_OVERFLOW_OP((a).i,+,(b).i)\ - (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ - }while(0) -#define C_SUB( res, a,b)\ - do { \ - CHECK_OVERFLOW_OP((a).r,-,(b).r)\ - CHECK_OVERFLOW_OP((a).i,-,(b).i)\ - (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ - }while(0) -#define C_ADDTO( res , a)\ - do { \ - CHECK_OVERFLOW_OP((res).r,+,(a).r)\ - CHECK_OVERFLOW_OP((res).i,+,(a).i)\ - (res).r += (a).r; (res).i += (a).i;\ - }while(0) - -#define C_SUBFROM( res , a)\ - do {\ - CHECK_OVERFLOW_OP((res).r,-,(a).r)\ - CHECK_OVERFLOW_OP((res).i,-,(a).i)\ - (res).r -= (a).r; (res).i -= (a).i; \ - }while(0) - - -#ifdef FIXED_POINT -# define KISS_FFT_COS(phase) floor(MIN(32767,MAX(-32767,.5+32768 * cos (phase)))) -# define KISS_FFT_SIN(phase) floor(MIN(32767,MAX(-32767,.5+32768 * sin (phase)))) -# define HALF_OF(x) ((x)>>1) -#elif defined(USE_SIMD) -# define KISS_FFT_COS(phase) _mm_set1_ps( cos(phase) ) -# define KISS_FFT_SIN(phase) _mm_set1_ps( sin(phase) ) -# define HALF_OF(x) ((x)*_mm_set1_ps(.5)) -#else -# define KISS_FFT_COS(phase) (kiss_fft_scalar) cos(phase) -# define KISS_FFT_SIN(phase) (kiss_fft_scalar) sin(phase) -# define HALF_OF(x) ((x)*.5) -#endif - -#define kf_cexp(x,phase) \ - do{ \ - (x)->r = KISS_FFT_COS(phase);\ - (x)->i = KISS_FFT_SIN(phase);\ - }while(0) -#define kf_cexp2(x,phase) \ - do{ \ - (x)->r = spx_cos_norm((phase));\ - (x)->i = spx_cos_norm((phase)-32768);\ -}while(0) - - -/* a debugging function */ -#define pcpx(c)\ - fprintf(stderr,"%g + %gi\n",(double)((c)->r),(double)((c)->i) ) diff --git a/speex/libspeexdsp/arch.h b/speex/libspeexdsp/arch.h deleted file mode 100644 index 3ec968907..000000000 --- a/speex/libspeexdsp/arch.h +++ /dev/null @@ -1,237 +0,0 @@ -/* Copyright (C) 2003 Jean-Marc Valin */ -/** - @file arch.h - @brief Various architecture definitions Speex -*/ -/* - 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. -*/ - -#ifndef ARCH_H -#define ARCH_H - -#define FLOATING_POINT - -/* A couple test to catch stupid option combinations */ -#ifdef FIXED_POINT - -#ifdef FLOATING_POINT -#error You cannot compile as floating point and fixed point at the same time -#endif -#ifdef USE_SSE -#error SSE is only for floating-point -#endif -#if ((defined (ARM4_ASM)||defined (ARM4_ASM)) && defined(BFIN_ASM)) || (defined (ARM4_ASM)&&defined(ARM5E_ASM)) -#error Make up your mind. What CPU do you have? -#endif -#ifdef VORBIS_PSYCHO -#error Vorbis-psy model currently not implemented in fixed-point -#endif - -#else - -#ifndef FLOATING_POINT -#error You now need to define either FIXED_POINT or FLOATING_POINT -#endif -#if defined (ARM4_ASM) || defined(ARM5E_ASM) || defined(BFIN_ASM) -#error I suppose you can have a [ARM4/ARM5E/Blackfin] that has float instructions? -#endif -#ifdef FIXED_POINT_DEBUG -#error "Don't you think enabling fixed-point is a good thing to do if you want to debug that?" -#endif - - -#endif - -#ifndef OUTSIDE_SPEEX -#include "speex/speexdsp_types.h" -#endif - -#define ABS(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute integer value. */ -#define ABS16(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 16-bit value. */ -#define MIN16(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 16-bit value. */ -#define MAX16(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 16-bit value. */ -#define ABS32(x) ((x) < 0 ? (-(x)) : (x)) /**< Absolute 32-bit value. */ -#define MIN32(a,b) ((a) < (b) ? (a) : (b)) /**< Maximum 32-bit value. */ -#define MAX32(a,b) ((a) > (b) ? (a) : (b)) /**< Maximum 32-bit value. */ - -#ifdef FIXED_POINT - -typedef spx_int16_t spx_word16_t; -typedef spx_int32_t spx_word32_t; -typedef spx_word32_t spx_mem_t; -typedef spx_word16_t spx_coef_t; -typedef spx_word16_t spx_lsp_t; -typedef spx_word32_t spx_sig_t; - -#define Q15ONE 32767 - -#define LPC_SCALING 8192 -#define SIG_SCALING 16384 -#define LSP_SCALING 8192. -#define GAMMA_SCALING 32768. -#define GAIN_SCALING 64 -#define GAIN_SCALING_1 0.015625 - -#define LPC_SHIFT 13 -#define LSP_SHIFT 13 -#define SIG_SHIFT 14 -#define GAIN_SHIFT 6 - -#define WORD2INT(x) ((x) < -32767 ? -32768 : ((x) > 32766 ? 32767 : (x))) - -#define VERY_SMALL 0 -#define VERY_LARGE32 ((spx_word32_t)2147483647) -#define VERY_LARGE16 ((spx_word16_t)32767) -#define Q15_ONE ((spx_word16_t)32767) - - -#ifdef FIXED_DEBUG -#include "fixed_debug.h" -#else - -#include "fixed_generic.h" - -#ifdef ARM5E_ASM -#include "fixed_arm5e.h" -#elif defined (ARM4_ASM) -#include "fixed_arm4.h" -#elif defined (BFIN_ASM) -#include "fixed_bfin.h" -#endif - -#endif - - -#else - -typedef float spx_mem_t; -typedef float spx_coef_t; -typedef float spx_lsp_t; -typedef float spx_sig_t; -typedef float spx_word16_t; -typedef float spx_word32_t; - -#define Q15ONE 1.0f -#define LPC_SCALING 1.f -#define SIG_SCALING 1.f -#define LSP_SCALING 1.f -#define GAMMA_SCALING 1.f -#define GAIN_SCALING 1.f -#define GAIN_SCALING_1 1.f - - -#define VERY_SMALL 1e-15f -#define VERY_LARGE32 1e15f -#define VERY_LARGE16 1e15f -#define Q15_ONE ((spx_word16_t)1.f) - -#define QCONST16(x,bits) (x) -#define QCONST32(x,bits) (x) - -#define NEG16(x) (-(x)) -#define NEG32(x) (-(x)) -#define EXTRACT16(x) (x) -#define EXTEND32(x) (x) -#define SHR16(a,shift) (a) -#define SHL16(a,shift) (a) -#define SHR32(a,shift) (a) -#define SHL32(a,shift) (a) -#define PSHR16(a,shift) (a) -#define PSHR32(a,shift) (a) -#define VSHR32(a,shift) (a) -#define SATURATE16(x,a) (x) -#define SATURATE32(x,a) (x) -#define SATURATE32PSHR(x,shift,a) (x) - -#define PSHR(a,shift) (a) -#define SHR(a,shift) (a) -#define SHL(a,shift) (a) -#define SATURATE(x,a) (x) - -#define ADD16(a,b) ((a)+(b)) -#define SUB16(a,b) ((a)-(b)) -#define ADD32(a,b) ((a)+(b)) -#define SUB32(a,b) ((a)-(b)) -#define MULT16_16_16(a,b) ((a)*(b)) -#define MULT16_16(a,b) ((spx_word32_t)(a)*(spx_word32_t)(b)) -#define MAC16_16(c,a,b) ((c)+(spx_word32_t)(a)*(spx_word32_t)(b)) - -#define MULT16_32_Q11(a,b) ((a)*(b)) -#define MULT16_32_Q13(a,b) ((a)*(b)) -#define MULT16_32_Q14(a,b) ((a)*(b)) -#define MULT16_32_Q15(a,b) ((a)*(b)) -#define MULT16_32_P15(a,b) ((a)*(b)) - -#define MAC16_32_Q11(c,a,b) ((c)+(a)*(b)) -#define MAC16_32_Q15(c,a,b) ((c)+(a)*(b)) - -#define MAC16_16_Q11(c,a,b) ((c)+(a)*(b)) -#define MAC16_16_Q13(c,a,b) ((c)+(a)*(b)) -#define MAC16_16_P13(c,a,b) ((c)+(a)*(b)) -#define MULT16_16_Q11_32(a,b) ((a)*(b)) -#define MULT16_16_Q13(a,b) ((a)*(b)) -#define MULT16_16_Q14(a,b) ((a)*(b)) -#define MULT16_16_Q15(a,b) ((a)*(b)) -#define MULT16_16_P15(a,b) ((a)*(b)) -#define MULT16_16_P13(a,b) ((a)*(b)) -#define MULT16_16_P14(a,b) ((a)*(b)) - -#define DIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) -#define PDIV32_16(a,b) (((spx_word32_t)(a))/(spx_word16_t)(b)) -#define DIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) -#define PDIV32(a,b) (((spx_word32_t)(a))/(spx_word32_t)(b)) - -#define WORD2INT(x) ((x) < -32767.5f ? -32768 : \ - ((x) > 32766.5f ? 32767 : (spx_int16_t)floor(.5 + (x)))) -#endif - - -#if defined (CONFIG_TI_C54X) || defined (CONFIG_TI_C55X) - -/* 2 on TI C5x DSP */ -#define BYTES_PER_CHAR 2 -#define BITS_PER_CHAR 16 -#define LOG2_BITS_PER_CHAR 4 - -#else - -#define BYTES_PER_CHAR 1 -#define BITS_PER_CHAR 8 -#define LOG2_BITS_PER_CHAR 3 - -#endif - - - -#ifdef FIXED_DEBUG -extern long long spx_mips; -#endif - - -#endif diff --git a/speex/libspeexdsp/bfin.h b/speex/libspeexdsp/bfin.h deleted file mode 100644 index b934cf2f1..000000000 --- a/speex/libspeexdsp/bfin.h +++ /dev/null @@ -1,15 +0,0 @@ -/* Common Blackfin assembly defines - * - * Copyright (C) 2005-2009 Analog Devices - */ - -#if __GNUC__ <= 3 -/* GCC-3.4 and older did not use hardware loops and thus did not have - * register constraints for declaring clobbers. - */ -# define BFIN_HWLOOP0_REGS -# define BFIN_HWLOOP1_REGS -#else -# define BFIN_HWLOOP0_REGS , "LB0", "LT0", "LC0" -# define BFIN_HWLOOP1_REGS , "LB1", "LT1", "LC1" -#endif diff --git a/speex/libspeexdsp/buffer.c b/speex/libspeexdsp/buffer.c deleted file mode 100644 index b06a15543..000000000 --- a/speex/libspeexdsp/buffer.c +++ /dev/null @@ -1,176 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: buffer.c - This is a very simple ring buffer implementation. It is not thread-safe - so you need to do your own locking. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -#include "os_support.h" -#include "arch.h" -#include "speex/speex_buffer.h" - -struct SpeexBuffer_ { - char *data; - int size; - int read_ptr; - int write_ptr; - int available; -}; - -EXPORT SpeexBuffer *speex_buffer_init(int size) -{ - SpeexBuffer *st = speex_alloc(sizeof(SpeexBuffer)); - st->data = speex_alloc(size); - st->size = size; - st->read_ptr = 0; - st->write_ptr = 0; - st->available = 0; - return st; -} - -EXPORT void speex_buffer_destroy(SpeexBuffer *st) -{ - speex_free(st->data); - speex_free(st); -} - -EXPORT int speex_buffer_write(SpeexBuffer *st, void *_data, int len) -{ - int end; - int end1; - char *data = _data; - if (len > st->size) - { - data += len-st->size; - len = st->size; - } - end = st->write_ptr + len; - end1 = end; - if (end1 > st->size) - end1 = st->size; - SPEEX_COPY(st->data + st->write_ptr, data, end1 - st->write_ptr); - if (end > st->size) - { - end -= st->size; - SPEEX_COPY(st->data, data+end1 - st->write_ptr, end); - } - st->available += len; - if (st->available > st->size) - { - st->available = st->size; - st->read_ptr = st->write_ptr; - } - st->write_ptr += len; - if (st->write_ptr > st->size) - st->write_ptr -= st->size; - return len; -} - -EXPORT int speex_buffer_writezeros(SpeexBuffer *st, int len) -{ - /* This is almost the same as for speex_buffer_write() but using - SPEEX_MEMSET() instead of SPEEX_COPY(). Update accordingly. */ - int end; - int end1; - if (len > st->size) - { - len = st->size; - } - end = st->write_ptr + len; - end1 = end; - if (end1 > st->size) - end1 = st->size; - SPEEX_MEMSET(st->data + st->write_ptr, 0, end1 - st->write_ptr); - if (end > st->size) - { - end -= st->size; - SPEEX_MEMSET(st->data, 0, end); - } - st->available += len; - if (st->available > st->size) - { - st->available = st->size; - st->read_ptr = st->write_ptr; - } - st->write_ptr += len; - if (st->write_ptr > st->size) - st->write_ptr -= st->size; - return len; -} - -EXPORT int speex_buffer_read(SpeexBuffer *st, void *_data, int len) -{ - int end, end1; - char *data = _data; - if (len > st->available) - { - SPEEX_MEMSET(data+st->available, 0, len - st->available); - len = st->available; - } - end = st->read_ptr + len; - end1 = end; - if (end1 > st->size) - end1 = st->size; - SPEEX_COPY(data, st->data + st->read_ptr, end1 - st->read_ptr); - - if (end > st->size) - { - end -= st->size; - SPEEX_COPY(data+end1 - st->read_ptr, st->data, end); - } - st->available -= len; - st->read_ptr += len; - if (st->read_ptr > st->size) - st->read_ptr -= st->size; - return len; -} - -EXPORT int speex_buffer_get_available(SpeexBuffer *st) -{ - return st->available; -} - -EXPORT int speex_buffer_resize(SpeexBuffer *st, int len) -{ - int old_len = st->size; - if (len > old_len) - { - st->data = speex_realloc(st->data, len); - /* FIXME: move data/pointers properly for growing the buffer */ - } else { - /* FIXME: move data/pointers properly for shrinking the buffer */ - st->data = speex_realloc(st->data, len); - } - return len; -} diff --git a/speex/libspeexdsp/echo_diagnostic.m b/speex/libspeexdsp/echo_diagnostic.m deleted file mode 100644 index aebf39067..000000000 --- a/speex/libspeexdsp/echo_diagnostic.m +++ /dev/null @@ -1,72 +0,0 @@ -% Attempts to diagnose AEC problems from recorded samples -% -% out = echo_diagnostic(rec_file, play_file, out_file, tail_length) -% -% Computes the full matrix inversion to cancel echo from the -% recording 'rec_file' using the far end signal 'play_file' using -% a filter length of 'tail_length'. The output is saved to 'out_file'. -function out = echo_diagnostic(rec_file, play_file, out_file, tail_length) - -F=fopen(rec_file,'rb'); -rec=fread(F,Inf,'short'); -fclose (F); -F=fopen(play_file,'rb'); -play=fread(F,Inf,'short'); -fclose (F); - -rec = [rec; zeros(1024,1)]; -play = [play; zeros(1024,1)]; - -N = length(rec); -corr = real(ifft(fft(rec).*conj(fft(play)))); -acorr = real(ifft(fft(play).*conj(fft(play)))); - -[a,b] = max(corr); - -if b > N/2 - b = b-N; -end -printf ("Far end to near end delay is %d samples\n", b); -if (b > .3*tail_length) - printf ('This is too much delay, try delaying the far-end signal a bit\n'); -else if (b < 0) - printf ('You have a negative delay, the echo canceller has no chance to cancel anything!\n'); - else - printf ('Delay looks OK.\n'); - end - end -end -N2 = round(N/2); -corr1 = real(ifft(fft(rec(1:N2)).*conj(fft(play(1:N2))))); -corr2 = real(ifft(fft(rec(N2+1:end)).*conj(fft(play(N2+1:end))))); - -[a,b1] = max(corr1); -if b1 > N2/2 - b1 = b1-N2; -end -[a,b2] = max(corr2); -if b2 > N2/2 - b2 = b2-N2; -end -drift = (b1-b2)/N2; -printf ('Drift estimate is %f%% (%d samples)\n', 100*drift, b1-b2); -if abs(b1-b2) < 10 - printf ('A drift of a few (+-10) samples is normal.\n'); -else - if abs(b1-b2) < 30 - printf ('There may be (not sure) excessive clock drift. Is the capture and playback done on the same soundcard?\n'); - else - printf ('Your clock is drifting! No way the AEC will be able to do anything with that. Most likely, you''re doing capture and playback from two different cards.\n'); - end - end -end -acorr(1) = .001+1.00001*acorr(1); -AtA = toeplitz(acorr(1:tail_length)); -bb = corr(1:tail_length); -h = AtA\bb; - -out = (rec - filter(h, 1, play)); - -F=fopen(out_file,'w'); -fwrite(F,out,'short'); -fclose (F); diff --git a/speex/libspeexdsp/fftwrap.c b/speex/libspeexdsp/fftwrap.c deleted file mode 100644 index 4573479d0..000000000 --- a/speex/libspeexdsp/fftwrap.c +++ /dev/null @@ -1,448 +0,0 @@ -/* Copyright (C) 2005-2006 Jean-Marc Valin - File: fftwrap.c - - Wrapper for various FFTs - - 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. - -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "arch.h" -#include "os_support.h" - -#define MAX_FFT_SIZE 2048 - -#ifdef FIXED_POINT -static int maximize_range(spx_word16_t *in, spx_word16_t *out, spx_word16_t bound, int len) -{ - int i, shift; - spx_word16_t max_val = 0; - for (i=0;imax_val) - max_val = in[i]; - if (-in[i]>max_val) - max_val = -in[i]; - } - shift=0; - while (max_val <= (bound>>1) && max_val != 0) - { - max_val <<= 1; - shift++; - } - for (i=0;i - -void *spx_fft_init(int size) -{ - struct drft_lookup *table; - table = speex_alloc(sizeof(struct drft_lookup)); - spx_drft_init((struct drft_lookup *)table, size); - return (void*)table; -} - -void spx_fft_destroy(void *table) -{ - spx_drft_clear(table); - speex_free(table); -} - -void spx_fft(void *table, float *in, float *out) -{ - if (in==out) - { - int i; - float scale = 1./((struct drft_lookup *)table)->n; - speex_warning("FFT should not be done in-place"); - for (i=0;i<((struct drft_lookup *)table)->n;i++) - out[i] = scale*in[i]; - } else { - int i; - float scale = 1./((struct drft_lookup *)table)->n; - for (i=0;i<((struct drft_lookup *)table)->n;i++) - out[i] = scale*in[i]; - } - spx_drft_forward((struct drft_lookup *)table, out); -} - -void spx_ifft(void *table, float *in, float *out) -{ - if (in==out) - { - speex_warning("FFT should not be done in-place"); - } else { - int i; - for (i=0;i<((struct drft_lookup *)table)->n;i++) - out[i] = in[i]; - } - spx_drft_backward((struct drft_lookup *)table, out); -} - -#elif defined(USE_INTEL_MKL) -#include - -struct mkl_config { - DFTI_DESCRIPTOR_HANDLE desc; - int N; -}; - -void *spx_fft_init(int size) -{ - struct mkl_config *table = (struct mkl_config *) speex_alloc(sizeof(struct mkl_config)); - table->N = size; - DftiCreateDescriptor(&table->desc, DFTI_SINGLE, DFTI_REAL, 1, size); - DftiSetValue(table->desc, DFTI_PACKED_FORMAT, DFTI_PACK_FORMAT); - DftiSetValue(table->desc, DFTI_PLACEMENT, DFTI_NOT_INPLACE); - DftiSetValue(table->desc, DFTI_FORWARD_SCALE, 1.0f / size); - DftiCommitDescriptor(table->desc); - return table; -} - -void spx_fft_destroy(void *table) -{ - struct mkl_config *t = (struct mkl_config *) table; - DftiFreeDescriptor(t->desc); - speex_free(table); -} - -void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - struct mkl_config *t = (struct mkl_config *) table; - DftiComputeForward(t->desc, in, out); -} - -void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - struct mkl_config *t = (struct mkl_config *) table; - DftiComputeBackward(t->desc, in, out); -} - -#elif defined(USE_INTEL_IPP) - -#include - -struct ipp_fft_config -{ - IppsDFTSpec_R_32f *dftSpec; - Ipp8u *buffer; -}; - -void *spx_fft_init(int size) -{ - int bufferSize = 0; - int hint; - struct ipp_fft_config *table; - - table = (struct ipp_fft_config *)speex_alloc(sizeof(struct ipp_fft_config)); - - /* there appears to be no performance difference between ippAlgHintFast and - ippAlgHintAccurate when using the with the floating point version - of the fft. */ - hint = ippAlgHintAccurate; - - ippsDFTInitAlloc_R_32f(&table->dftSpec, size, IPP_FFT_DIV_FWD_BY_N, hint); - - ippsDFTGetBufSize_R_32f(table->dftSpec, &bufferSize); - table->buffer = ippsMalloc_8u(bufferSize); - - return table; -} - -void spx_fft_destroy(void *table) -{ - struct ipp_fft_config *t = (struct ipp_fft_config *)table; - ippsFree(t->buffer); - ippsDFTFree_R_32f(t->dftSpec); - speex_free(t); -} - -void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - struct ipp_fft_config *t = (struct ipp_fft_config *)table; - ippsDFTFwd_RToPack_32f(in, out, t->dftSpec, t->buffer); -} - -void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - struct ipp_fft_config *t = (struct ipp_fft_config *)table; - ippsDFTInv_PackToR_32f(in, out, t->dftSpec, t->buffer); -} - -#elif defined(USE_GPL_FFTW3) - -#include - -struct fftw_config { - float *in; - float *out; - fftwf_plan fft; - fftwf_plan ifft; - int N; -}; - -void *spx_fft_init(int size) -{ - struct fftw_config *table = (struct fftw_config *) speex_alloc(sizeof(struct fftw_config)); - table->in = fftwf_malloc(sizeof(float) * (size+2)); - table->out = fftwf_malloc(sizeof(float) * (size+2)); - - table->fft = fftwf_plan_dft_r2c_1d(size, table->in, (fftwf_complex *) table->out, FFTW_PATIENT); - table->ifft = fftwf_plan_dft_c2r_1d(size, (fftwf_complex *) table->in, table->out, FFTW_PATIENT); - - table->N = size; - return table; -} - -void spx_fft_destroy(void *table) -{ - struct fftw_config *t = (struct fftw_config *) table; - fftwf_destroy_plan(t->fft); - fftwf_destroy_plan(t->ifft); - fftwf_free(t->in); - fftwf_free(t->out); - speex_free(table); -} - - -void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - int i; - struct fftw_config *t = (struct fftw_config *) table; - const int N = t->N; - float *iptr = t->in; - float *optr = t->out; - const float m = 1.0 / N; - for(i=0;ifft); - - out[0] = optr[0]; - for(i=1;iN; - float *iptr = t->in; - float *optr = t->out; - - iptr[0] = in[0]; - iptr[1] = 0.0f; - for(i=1;iifft); - - for(i=0;iforward = kiss_fftr_alloc(size,0,NULL,NULL); - table->backward = kiss_fftr_alloc(size,1,NULL,NULL); - table->N = size; - return table; -} - -void spx_fft_destroy(void *table) -{ - struct kiss_config *t = (struct kiss_config *)table; - kiss_fftr_free(t->forward); - kiss_fftr_free(t->backward); - speex_free(table); -} - -#ifdef FIXED_POINT - -void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - int shift; - struct kiss_config *t = (struct kiss_config *)table; - shift = maximize_range(in, in, 32000, t->N); - kiss_fftr2(t->forward, in, out); - renorm_range(in, in, shift, t->N); - renorm_range(out, out, shift, t->N); -} - -#else - -void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - int i; - float scale; - struct kiss_config *t = (struct kiss_config *)table; - scale = 1./t->N; - kiss_fftr2(t->forward, in, out); - for (i=0;iN;i++) - out[i] *= scale; -} -#endif - -void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out) -{ - struct kiss_config *t = (struct kiss_config *)table; - kiss_fftri2(t->backward, in, out); -} - - -#else - -#error No other FFT implemented - -#endif - - -#ifdef FIXED_POINT -/*#include "smallft.h"*/ - - -void spx_fft_float(void *table, float *in, float *out) -{ - int i; -#ifdef USE_SMALLFT - int N = ((struct drft_lookup *)table)->n; -#elif defined(USE_KISS_FFT) - int N = ((struct kiss_config *)table)->N; -#else -#endif -#ifdef VAR_ARRAYS - spx_word16_t _in[N]; - spx_word16_t _out[N]; -#else - spx_word16_t _in[MAX_FFT_SIZE]; - spx_word16_t _out[MAX_FFT_SIZE]; -#endif - for (i=0;iN); - scale = 1./((struct kiss_config *)table)->N; - for (i=0;i<((struct kiss_config *)table)->N;i++) - out[i] = scale*in[i]; - spx_drft_forward(&t, out); - spx_drft_clear(&t); - } -#endif -} - -void spx_ifft_float(void *table, float *in, float *out) -{ - int i; -#ifdef USE_SMALLFT - int N = ((struct drft_lookup *)table)->n; -#elif defined(USE_KISS_FFT) - int N = ((struct kiss_config *)table)->N; -#else -#endif -#ifdef VAR_ARRAYS - spx_word16_t _in[N]; - spx_word16_t _out[N]; -#else - spx_word16_t _in[MAX_FFT_SIZE]; - spx_word16_t _out[MAX_FFT_SIZE]; -#endif - for (i=0;iN); - for (i=0;i<((struct kiss_config *)table)->N;i++) - out[i] = in[i]; - spx_drft_backward(&t, out); - spx_drft_clear(&t); - } -#endif -} - -#else - -void spx_fft_float(void *table, float *in, float *out) -{ - spx_fft(table, in, out); -} -void spx_ifft_float(void *table, float *in, float *out) -{ - spx_ifft(table, in, out); -} - -#endif diff --git a/speex/libspeexdsp/fftwrap.h b/speex/libspeexdsp/fftwrap.h deleted file mode 100644 index 2c0742559..000000000 --- a/speex/libspeexdsp/fftwrap.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Copyright (C) 2005 Jean-Marc Valin - File: fftwrap.h - - Wrapper for various FFTs - - 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. - -*/ - -#ifndef FFTWRAP_H -#define FFTWRAP_H - -#include "arch.h" - -/** Compute tables for an FFT */ -void *spx_fft_init(int size); - -/** Destroy tables for an FFT */ -void spx_fft_destroy(void *table); - -/** Forward (real to half-complex) transform */ -void spx_fft(void *table, spx_word16_t *in, spx_word16_t *out); - -/** Backward (half-complex to real) transform */ -void spx_ifft(void *table, spx_word16_t *in, spx_word16_t *out); - -/** Forward (real to half-complex) transform of float data */ -void spx_fft_float(void *table, float *in, float *out); - -/** Backward (half-complex to real) transform of float data */ -void spx_ifft_float(void *table, float *in, float *out); - -#endif diff --git a/speex/libspeexdsp/filterbank.c b/speex/libspeexdsp/filterbank.c deleted file mode 100644 index c8fdd7a2a..000000000 --- a/speex/libspeexdsp/filterbank.c +++ /dev/null @@ -1,227 +0,0 @@ -/* Copyright (C) 2006 Jean-Marc Valin */ -/** - @file filterbank.c - @brief Converting between psd and filterbank - */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "filterbank.h" -#include "arch.h" -#include -#include "math_approx.h" -#include "os_support.h" - -#ifdef FIXED_POINT - -#define toBARK(n) (MULT16_16(26829,spx_atan(SHR32(MULT16_16(97,n),2))) + MULT16_16(4588,spx_atan(MULT16_32_Q15(20,MULT16_16(n,n)))) + MULT16_16(3355,n)) - -#else -#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) -#endif - -#define toMEL(n) (2595.f*log10(1.f+(n)/700.f)) - -FilterBank *filterbank_new(int banks, spx_word32_t sampling, int len, int type) -{ - FilterBank *bank; - spx_word32_t df; - spx_word32_t max_mel, mel_interval; - int i; - int id1; - int id2; - df = DIV32(SHL32(sampling,15),MULT16_16(2,len)); - max_mel = toBARK(EXTRACT16(sampling/2)); - mel_interval = PDIV32(max_mel,banks-1); - - bank = (FilterBank*)speex_alloc(sizeof(FilterBank)); - bank->nb_banks = banks; - bank->len = len; - bank->bank_left = (int*)speex_alloc(len*sizeof(int)); - bank->bank_right = (int*)speex_alloc(len*sizeof(int)); - bank->filter_left = (spx_word16_t*)speex_alloc(len*sizeof(spx_word16_t)); - bank->filter_right = (spx_word16_t*)speex_alloc(len*sizeof(spx_word16_t)); - /* Think I can safely disable normalisation that for fixed-point (and probably float as well) */ -#ifndef FIXED_POINT - bank->scaling = (float*)speex_alloc(banks*sizeof(float)); -#endif - for (i=0;i max_mel) - break; -#ifdef FIXED_POINT - id1 = DIV32(mel,mel_interval); -#else - id1 = (int)(floor(mel/mel_interval)); -#endif - if (id1>banks-2) - { - id1 = banks-2; - val = Q15_ONE; - } else { - val = DIV32_16(mel - id1*mel_interval,EXTRACT16(PSHR32(mel_interval,15))); - } - id2 = id1+1; - bank->bank_left[i] = id1; - bank->filter_left[i] = SUB16(Q15_ONE,val); - bank->bank_right[i] = id2; - bank->filter_right[i] = val; - } - - /* Think I can safely disable normalisation for fixed-point (and probably float as well) */ -#ifndef FIXED_POINT - for (i=0;inb_banks;i++) - bank->scaling[i] = 0; - for (i=0;ilen;i++) - { - int id = bank->bank_left[i]; - bank->scaling[id] += bank->filter_left[i]; - id = bank->bank_right[i]; - bank->scaling[id] += bank->filter_right[i]; - } - for (i=0;inb_banks;i++) - bank->scaling[i] = Q15_ONE/(bank->scaling[i]); -#endif - return bank; -} - -void filterbank_destroy(FilterBank *bank) -{ - speex_free(bank->bank_left); - speex_free(bank->bank_right); - speex_free(bank->filter_left); - speex_free(bank->filter_right); -#ifndef FIXED_POINT - speex_free(bank->scaling); -#endif - speex_free(bank); -} - -void filterbank_compute_bank32(FilterBank *bank, spx_word32_t *ps, spx_word32_t *mel) -{ - int i; - for (i=0;inb_banks;i++) - mel[i] = 0; - - for (i=0;ilen;i++) - { - int id; - id = bank->bank_left[i]; - mel[id] += MULT16_32_P15(bank->filter_left[i],ps[i]); - id = bank->bank_right[i]; - mel[id] += MULT16_32_P15(bank->filter_right[i],ps[i]); - } - /* Think I can safely disable normalisation that for fixed-point (and probably float as well) */ -#ifndef FIXED_POINT - /*for (i=0;inb_banks;i++) - mel[i] = MULT16_32_P15(Q15(bank->scaling[i]),mel[i]); - */ -#endif -} - -void filterbank_compute_psd16(FilterBank *bank, spx_word16_t *mel, spx_word16_t *ps) -{ - int i; - for (i=0;ilen;i++) - { - spx_word32_t tmp; - int id1, id2; - id1 = bank->bank_left[i]; - id2 = bank->bank_right[i]; - tmp = MULT16_16(mel[id1],bank->filter_left[i]); - tmp += MULT16_16(mel[id2],bank->filter_right[i]); - ps[i] = EXTRACT16(PSHR32(tmp,15)); - } -} - - -#ifndef FIXED_POINT -void filterbank_compute_bank(FilterBank *bank, float *ps, float *mel) -{ - int i; - for (i=0;inb_banks;i++) - mel[i] = 0; - - for (i=0;ilen;i++) - { - int id = bank->bank_left[i]; - mel[id] += bank->filter_left[i]*ps[i]; - id = bank->bank_right[i]; - mel[id] += bank->filter_right[i]*ps[i]; - } - for (i=0;inb_banks;i++) - mel[i] *= bank->scaling[i]; -} - -void filterbank_compute_psd(FilterBank *bank, float *mel, float *ps) -{ - int i; - for (i=0;ilen;i++) - { - int id = bank->bank_left[i]; - ps[i] = mel[id]*bank->filter_left[i]; - id = bank->bank_right[i]; - ps[i] += mel[id]*bank->filter_right[i]; - } -} - -void filterbank_psy_smooth(FilterBank *bank, float *ps, float *mask) -{ - /* Low freq slope: 14 dB/Bark*/ - /* High freq slope: 9 dB/Bark*/ - /* Noise vs tone: 5 dB difference */ - /* FIXME: Temporary kludge */ - float bark[100]; - int i; - /* Assumes 1/3 Bark resolution */ - float decay_low = 0.34145f; - float decay_high = 0.50119f; - filterbank_compute_bank(bank, ps, bark); - for (i=1;inb_banks;i++) - { - /*float decay_high = 13-1.6*log10(bark[i-1]); - decay_high = pow(10,(-decay_high/30.f));*/ - bark[i] = bark[i] + decay_high*bark[i-1]; - } - for (i=bank->nb_banks-2;i>=0;i--) - { - bark[i] = bark[i] + decay_low*bark[i+1]; - } - filterbank_compute_psd(bank, bark, mask); -} - -#endif diff --git a/speex/libspeexdsp/filterbank.h b/speex/libspeexdsp/filterbank.h deleted file mode 100644 index 3e889a22f..000000000 --- a/speex/libspeexdsp/filterbank.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (C) 2006 Jean-Marc Valin */ -/** - @file filterbank.h - @brief Converting between psd and filterbank - */ -/* - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifndef FILTERBANK_H -#define FILTERBANK_H - -#include "arch.h" - -typedef struct { - int *bank_left; - int *bank_right; - spx_word16_t *filter_left; - spx_word16_t *filter_right; -#ifndef FIXED_POINT - float *scaling; -#endif - int nb_banks; - int len; -} FilterBank; - - -FilterBank *filterbank_new(int banks, spx_word32_t sampling, int len, int type); - -void filterbank_destroy(FilterBank *bank); - -void filterbank_compute_bank32(FilterBank *bank, spx_word32_t *ps, spx_word32_t *mel); - -void filterbank_compute_psd16(FilterBank *bank, spx_word16_t *mel, spx_word16_t *psd); - -#ifndef FIXED_POINT -void filterbank_compute_bank(FilterBank *bank, float *psd, float *mel); -void filterbank_compute_psd(FilterBank *bank, float *mel, float *psd); -#endif - - -#endif diff --git a/speex/libspeexdsp/fixed_arm4.h b/speex/libspeexdsp/fixed_arm4.h deleted file mode 100644 index 223478c90..000000000 --- a/speex/libspeexdsp/fixed_arm4.h +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (C) 2004 Jean-Marc Valin */ -/** - @file fixed_arm4.h - @brief ARM4 fixed-point operations -*/ -/* - 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. -*/ - -#ifndef FIXED_ARM4_H -#define FIXED_ARM4_H - -#undef MULT16_32_Q14 -static inline spx_word32_t MULT16_32_Q14(spx_word16_t x, spx_word32_t y) { - int res; - int dummy; - asm ( - "smull %0,%1,%2,%3 \n\t" - "mov %0, %0, lsr #14 \n\t" - "add %0, %0, %1, lsl #18 \n\t" - : "=&r"(res), "=&r" (dummy) - : "r"(y),"r"((int)x)); - return(res); -} - -#undef MULT16_32_Q15 -static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { - int res; - int dummy; - asm ( - "smull %0,%1,%2,%3 \n\t" - "mov %0, %0, lsr #15 \n\t" - "add %0, %0, %1, lsl #17 \n\t" - : "=&r"(res), "=&r" (dummy) - : "r"(y),"r"((int)x)); - return(res); -} - -#undef DIV32_16 -static inline short DIV32_16(int a, int b) -{ - int res=0; - int dead1, dead2, dead3, dead4, dead5; - __asm__ __volatile__ ( - "\teor %5, %0, %1\n" - "\tmovs %4, %0\n" - "\trsbmi %0, %0, #0 \n" - "\tmovs %4, %1\n" - "\trsbmi %1, %1, #0 \n" - "\tmov %4, #1\n" - - "\tsubs %3, %0, %1, asl #14 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #14 \n" - - "\tsubs %3, %0, %1, asl #13 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #13 \n" - - "\tsubs %3, %0, %1, asl #12 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #12 \n" - - "\tsubs %3, %0, %1, asl #11 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #11 \n" - - "\tsubs %3, %0, %1, asl #10 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #10 \n" - - "\tsubs %3, %0, %1, asl #9 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #9 \n" - - "\tsubs %3, %0, %1, asl #8 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #8 \n" - - "\tsubs %3, %0, %1, asl #7 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #7 \n" - - "\tsubs %3, %0, %1, asl #6 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #6 \n" - - "\tsubs %3, %0, %1, asl #5 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #5 \n" - - "\tsubs %3, %0, %1, asl #4 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #4 \n" - - "\tsubs %3, %0, %1, asl #3 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #3 \n" - - "\tsubs %3, %0, %1, asl #2 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #2 \n" - - "\tsubs %3, %0, %1, asl #1 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4, asl #1 \n" - - "\tsubs %3, %0, %1 \n" - "\tmovpl %0, %3 \n" - "\torrpl %2, %2, %4 \n" - - "\tmovs %5, %5, lsr #31 \n" - "\trsbne %2, %2, #0 \n" - : "=r" (dead1), "=r" (dead2), "=r" (res), - "=r" (dead3), "=r" (dead4), "=r" (dead5) - : "0" (a), "1" (b), "2" (res) - : "cc" - ); - return res; -} - - -#endif diff --git a/speex/libspeexdsp/fixed_arm5e.h b/speex/libspeexdsp/fixed_arm5e.h deleted file mode 100644 index aa565efc3..000000000 --- a/speex/libspeexdsp/fixed_arm5e.h +++ /dev/null @@ -1,178 +0,0 @@ -/* Copyright (C) 2003 Jean-Marc Valin */ -/** - @file fixed_arm5e.h - @brief ARM-tuned fixed-point operations -*/ -/* - 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. -*/ - -#ifndef FIXED_ARM5E_H -#define FIXED_ARM5E_H - -#undef MULT16_16 -static inline spx_word32_t MULT16_16(spx_word16_t x, spx_word16_t y) { - int res; - asm ("smulbb %0,%1,%2;\n" - : "=&r"(res) - : "%r"(x),"r"(y)); - return(res); -} - -#undef MAC16_16 -static inline spx_word32_t MAC16_16(spx_word32_t a, spx_word16_t x, spx_word32_t y) { - int res; - asm ("smlabb %0,%1,%2,%3;\n" - : "=&r"(res) - : "%r"(x),"r"(y),"r"(a)); - return(res); -} - -#undef MULT16_32_Q15 -static inline spx_word32_t MULT16_32_Q15(spx_word16_t x, spx_word32_t y) { - int res; - asm ("smulwb %0,%1,%2;\n" - : "=&r"(res) - : "%r"(y<<1),"r"(x)); - return(res); -} - -#undef MAC16_32_Q15 -static inline spx_word32_t MAC16_32_Q15(spx_word32_t a, spx_word16_t x, spx_word32_t y) { - int res; - asm ("smlawb %0,%1,%2,%3;\n" - : "=&r"(res) - : "%r"(y<<1),"r"(x),"r"(a)); - return(res); -} - -#undef MULT16_32_Q11 -static inline spx_word32_t MULT16_32_Q11(spx_word16_t x, spx_word32_t y) { - int res; - asm ("smulwb %0,%1,%2;\n" - : "=&r"(res) - : "%r"(y<<5),"r"(x)); - return(res); -} - -#undef MAC16_32_Q11 -static inline spx_word32_t MAC16_32_Q11(spx_word32_t a, spx_word16_t x, spx_word32_t y) { - int res; - asm ("smlawb %0,%1,%2,%3;\n" - : "=&r"(res) - : "%r"(y<<5),"r"(x),"r"(a)); - return(res); -} - -#undef DIV32_16 -static inline short DIV32_16(int a, int b) -{ - int res=0; - int dead1, dead2, dead3, dead4, dead5; - __asm__ __volatile__ ( - "\teor %5, %0, %1\n" - "\tmovs %4, %0\n" - "\trsbmi %0, %0, #0 \n" - "\tmovs %4, %1\n" - "\trsbmi %1, %1, #0 \n" - "\tmov %4, #1\n" - - "\tsubs %3, %0, %1, asl #14 \n" - "\torrpl %2, %2, %4, asl #14 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #13 \n" - "\torrpl %2, %2, %4, asl #13 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #12 \n" - "\torrpl %2, %2, %4, asl #12 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #11 \n" - "\torrpl %2, %2, %4, asl #11 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #10 \n" - "\torrpl %2, %2, %4, asl #10 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #9 \n" - "\torrpl %2, %2, %4, asl #9 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #8 \n" - "\torrpl %2, %2, %4, asl #8 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #7 \n" - "\torrpl %2, %2, %4, asl #7 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #6 \n" - "\torrpl %2, %2, %4, asl #6 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #5 \n" - "\torrpl %2, %2, %4, asl #5 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #4 \n" - "\torrpl %2, %2, %4, asl #4 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #3 \n" - "\torrpl %2, %2, %4, asl #3 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #2 \n" - "\torrpl %2, %2, %4, asl #2 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1, asl #1 \n" - "\torrpl %2, %2, %4, asl #1 \n" - "\tmovpl %0, %3 \n" - - "\tsubs %3, %0, %1 \n" - "\torrpl %2, %2, %4 \n" - "\tmovpl %0, %3 \n" - - "\tmovs %5, %5, lsr #31 \n" - "\trsbne %2, %2, #0 \n" - : "=r" (dead1), "=r" (dead2), "=r" (res), - "=r" (dead3), "=r" (dead4), "=r" (dead5) - : "0" (a), "1" (b), "2" (res) - : "memory", "cc" - ); - return res; -} - - - - -#endif diff --git a/speex/libspeexdsp/fixed_bfin.h b/speex/libspeexdsp/fixed_bfin.h deleted file mode 100644 index 646a48375..000000000 --- a/speex/libspeexdsp/fixed_bfin.h +++ /dev/null @@ -1,176 +0,0 @@ -/* Copyright (C) 2005 Analog Devices - Author: Jean-Marc Valin */ -/** - @file fixed_bfin.h - @brief Blackfin fixed-point operations -*/ -/* - 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. -*/ - -#ifndef FIXED_BFIN_H -#define FIXED_BFIN_H - -#include "bfin.h" - -#undef PDIV32_16 -static inline spx_word16_t PDIV32_16(spx_word32_t a, spx_word16_t b) -{ - spx_word32_t res, bb; - bb = b; - a += b>>1; - __asm__ ( - "P0 = 15;\n\t" - "R0 = %1;\n\t" - "R1 = %2;\n\t" - //"R0 = R0 + R1;\n\t" - "R0 <<= 1;\n\t" - "DIVS (R0, R1);\n\t" - "LOOP divide%= LC0 = P0;\n\t" - "LOOP_BEGIN divide%=;\n\t" - "DIVQ (R0, R1);\n\t" - "LOOP_END divide%=;\n\t" - "R0 = R0.L;\n\t" - "%0 = R0;\n\t" - : "=m" (res) - : "m" (a), "m" (bb) - : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS); - return res; -} - -#undef DIV32_16 -static inline spx_word16_t DIV32_16(spx_word32_t a, spx_word16_t b) -{ - spx_word32_t res, bb; - bb = b; - /* Make the roundinf consistent with the C version - (do we need to do that?)*/ - if (a<0) - a += (b-1); - __asm__ ( - "P0 = 15;\n\t" - "R0 = %1;\n\t" - "R1 = %2;\n\t" - "R0 <<= 1;\n\t" - "DIVS (R0, R1);\n\t" - "LOOP divide%= LC0 = P0;\n\t" - "LOOP_BEGIN divide%=;\n\t" - "DIVQ (R0, R1);\n\t" - "LOOP_END divide%=;\n\t" - "R0 = R0.L;\n\t" - "%0 = R0;\n\t" - : "=m" (res) - : "m" (a), "m" (bb) - : "P0", "R0", "R1", "ASTAT" BFIN_HWLOOP0_REGS); - return res; -} - -#undef MAX16 -static inline spx_word16_t MAX16(spx_word16_t a, spx_word16_t b) -{ - spx_word32_t res; - __asm__ ( - "%1 = %1.L (X);\n\t" - "%2 = %2.L (X);\n\t" - "%0 = MAX(%1,%2);" - : "=d" (res) - : "%d" (a), "d" (b) - : "ASTAT" - ); - return res; -} - -#undef MULT16_32_Q15 -static inline spx_word32_t MULT16_32_Q15(spx_word16_t a, spx_word32_t b) -{ - spx_word32_t res; - __asm__ - ( - "A1 = %2.L*%1.L (M);\n\t" - "A1 = A1 >>> 15;\n\t" - "%0 = (A1 += %2.L*%1.H) ;\n\t" - : "=&W" (res), "=&d" (b) - : "d" (a), "1" (b) - : "A1", "ASTAT" - ); - return res; -} - -#undef MAC16_32_Q15 -static inline spx_word32_t MAC16_32_Q15(spx_word32_t c, spx_word16_t a, spx_word32_t b) -{ - spx_word32_t res; - __asm__ - ( - "A1 = %2.L*%1.L (M);\n\t" - "A1 = A1 >>> 15;\n\t" - "%0 = (A1 += %2.L*%1.H);\n\t" - "%0 = %0 + %4;\n\t" - : "=&W" (res), "=&d" (b) - : "d" (a), "1" (b), "d" (c) - : "A1", "ASTAT" - ); - return res; -} - -#undef MULT16_32_Q14 -static inline spx_word32_t MULT16_32_Q14(spx_word16_t a, spx_word32_t b) -{ - spx_word32_t res; - __asm__ - ( - "%2 <<= 1;\n\t" - "A1 = %1.L*%2.L (M);\n\t" - "A1 = A1 >>> 15;\n\t" - "%0 = (A1 += %1.L*%2.H);\n\t" - : "=W" (res), "=d" (a), "=d" (b) - : "1" (a), "2" (b) - : "A1", "ASTAT" - ); - return res; -} - -#undef MAC16_32_Q14 -static inline spx_word32_t MAC16_32_Q14(spx_word32_t c, spx_word16_t a, spx_word32_t b) -{ - spx_word32_t res; - __asm__ - ( - "%1 <<= 1;\n\t" - "A1 = %2.L*%1.L (M);\n\t" - "A1 = A1 >>> 15;\n\t" - "%0 = (A1 += %2.L*%1.H);\n\t" - "%0 = %0 + %4;\n\t" - : "=&W" (res), "=&d" (b) - : "d" (a), "1" (b), "d" (c) - : "A1", "ASTAT" - ); - return res; -} - -#endif diff --git a/speex/libspeexdsp/fixed_debug.h b/speex/libspeexdsp/fixed_debug.h deleted file mode 100644 index 4d5fe1111..000000000 --- a/speex/libspeexdsp/fixed_debug.h +++ /dev/null @@ -1,487 +0,0 @@ -/* Copyright (C) 2003 Jean-Marc Valin */ -/** - @file fixed_debug.h - @brief Fixed-point operations with debugging -*/ -/* - 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. -*/ - -#ifndef FIXED_DEBUG_H -#define FIXED_DEBUG_H - -#include - -extern long long spx_mips; -#define MIPS_INC spx_mips++, - -#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) -#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) - - -#define VERIFY_SHORT(x) ((x)<=32767&&(x)>=-32768) -#define VERIFY_INT(x) ((x)<=2147483647LL&&(x)>=-2147483648LL) - -static inline short NEG16(int x) -{ - int res; - if (!VERIFY_SHORT(x)) - { - fprintf (stderr, "NEG16: input is not short: %d\n", (int)x); - } - res = -x; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "NEG16: output is not short: %d\n", (int)res); - spx_mips++; - return res; -} -static inline int NEG32(long long x) -{ - long long res; - if (!VERIFY_INT(x)) - { - fprintf (stderr, "NEG16: input is not int: %d\n", (int)x); - } - res = -x; - if (!VERIFY_INT(res)) - fprintf (stderr, "NEG16: output is not int: %d\n", (int)res); - spx_mips++; - return res; -} - -#define EXTRACT16(x) _EXTRACT16(x, __FILE__, __LINE__) -static inline short _EXTRACT16(int x, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(x)) - { - fprintf (stderr, "EXTRACT16: input is not short: %d in %s: line %d\n", x, file, line); - } - res = x; - spx_mips++; - return res; -} - -#define EXTEND32(x) _EXTEND32(x, __FILE__, __LINE__) -static inline int _EXTEND32(int x, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(x)) - { - fprintf (stderr, "EXTEND32: input is not short: %d in %s: line %d\n", x, file, line); - } - res = x; - spx_mips++; - return res; -} - -#define SHR16(a, shift) _SHR16(a, shift, __FILE__, __LINE__) -static inline short _SHR16(int a, int shift, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) - { - fprintf (stderr, "SHR16: inputs are not short: %d >> %d in %s: line %d\n", a, shift, file, line); - } - res = a>>shift; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "SHR16: output is not short: %d in %s: line %d\n", res, file, line); - spx_mips++; - return res; -} -#define SHL16(a, shift) _SHL16(a, shift, __FILE__, __LINE__) -static inline short _SHL16(int a, int shift, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(shift)) - { - fprintf (stderr, "SHL16: inputs are not short: %d %d in %s: line %d\n", a, shift, file, line); - } - res = a<>shift; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "SHR32: output is not int: %d\n", (int)res); - } - spx_mips++; - return res; -} -static inline int SHL32(long long a, int shift) -{ - long long res; - if (!VERIFY_INT(a) || !VERIFY_SHORT(shift)) - { - fprintf (stderr, "SHL32: inputs are not int: %d %d\n", (int)a, shift); - } - res = a<>1))),shift)) -#define PSHR32(a,shift) (SHR32(ADD32((a),((EXTEND32(1)<<((shift))>>1))),shift)) -#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) - -#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) -#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) - -//#define SHR(a,shift) ((a) >> (shift)) -//#define SHL(a,shift) ((a) << (shift)) - -#define ADD16(a, b) _ADD16(a, b, __FILE__, __LINE__) -static inline short _ADD16(int a, int b, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "ADD16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); - } - res = a+b; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "ADD16: output is not short: %d+%d=%d in %s: line %d\n", a,b,res, file, line); - } - spx_mips++; - return res; -} - -#define SUB16(a, b) _SUB16(a, b, __FILE__, __LINE__) -static inline short _SUB16(int a, int b, char *file, int line) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "SUB16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); - } - res = a-b; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "SUB16: output is not short: %d in %s: line %d\n", res, file, line); - spx_mips++; - return res; -} - -#define ADD32(a, b) _ADD32(a, b, __FILE__, __LINE__) -static inline int _ADD32(long long a, long long b, char *file, int line) -{ - long long res; - if (!VERIFY_INT(a) || !VERIFY_INT(b)) - { - fprintf (stderr, "ADD32: inputs are not int: %d %d in %s: line %d\n", (int)a, (int)b, file, line); - } - res = a+b; - if (!VERIFY_INT(res)) - { - fprintf (stderr, "ADD32: output is not int: %d in %s: line %d\n", (int)res, file, line); - } - spx_mips++; - return res; -} - -static inline int SUB32(long long a, long long b) -{ - long long res; - if (!VERIFY_INT(a) || !VERIFY_INT(b)) - { - fprintf (stderr, "SUB32: inputs are not int: %d %d\n", (int)a, (int)b); - } - res = a-b; - if (!VERIFY_INT(res)) - fprintf (stderr, "SUB32: output is not int: %d\n", (int)res); - spx_mips++; - return res; -} - -#define ADD64(a,b) (MIPS_INC(a)+(b)) - -/* result fits in 16 bits */ -static inline short MULT16_16_16(int a, int b) -{ - int res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_16: inputs are not short: %d %d\n", a, b); - } - res = a*b; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "MULT16_16_16: output is not short: %d\n", res); - spx_mips++; - return res; -} - -#define MULT16_16(a, b) _MULT16_16(a, b, __FILE__, __LINE__) -static inline int _MULT16_16(int a, int b, char *file, int line) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16: inputs are not short: %d %d in %s: line %d\n", a, b, file, line); - } - res = ((long long)a)*b; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_16: output is not int: %d in %s: line %d\n", (int)res, file, line); - spx_mips++; - return res; -} - -#define MAC16_16(c,a,b) (spx_mips--,ADD32((c),MULT16_16((a),(b)))) -#define MAC16_16_Q11(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),11))))) -#define MAC16_16_Q13(c,a,b) (EXTRACT16(ADD16((c),EXTRACT16(SHR32(MULT16_16((a),(b)),13))))) -#define MAC16_16_P13(c,a,b) (EXTRACT16(ADD32((c),SHR32(ADD32(4096,MULT16_16((a),(b))),13)))) - - -#define MULT16_32_QX(a, b, Q) _MULT16_32_QX(a, b, Q, __FILE__, __LINE__) -static inline int _MULT16_32_QX(int a, long long b, int Q, char *file, int line) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) - { - fprintf (stderr, "MULT16_32_Q%d: inputs are not short+int: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); - } - if (ABS32(b)>=(EXTEND32(1)<<(15+Q))) - fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d in %s: line %d\n", Q, (int)a, (int)b, file, line); - res = (((long long)a)*(long long)b) >> Q; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_32_Q%d: output is not int: %d*%d=%d in %s: line %d\n", Q, (int)a, (int)b,(int)res, file, line); - spx_mips+=5; - return res; -} - -static inline int MULT16_32_PX(int a, long long b, int Q) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_INT(b)) - { - fprintf (stderr, "MULT16_32_P%d: inputs are not short+int: %d %d\n", Q, (int)a, (int)b); - } - if (ABS32(b)>=(EXTEND32(1)<<(15+Q))) - fprintf (stderr, "MULT16_32_Q%d: second operand too large: %d %d\n", Q, (int)a, (int)b); - res = ((((long long)a)*(long long)b) + ((EXTEND32(1)<>1))>> Q; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_32_P%d: output is not int: %d*%d=%d\n", Q, (int)a, (int)b,(int)res); - spx_mips+=5; - return res; -} - - -#define MULT16_32_Q11(a,b) MULT16_32_QX(a,b,11) -#define MAC16_32_Q11(c,a,b) ADD32((c),MULT16_32_Q11((a),(b))) -#define MULT16_32_Q12(a,b) MULT16_32_QX(a,b,12) -#define MULT16_32_Q13(a,b) MULT16_32_QX(a,b,13) -#define MULT16_32_Q14(a,b) MULT16_32_QX(a,b,14) -#define MULT16_32_Q15(a,b) MULT16_32_QX(a,b,15) -#define MULT16_32_P15(a,b) MULT16_32_PX(a,b,15) -#define MAC16_32_Q15(c,a,b) ADD32((c),MULT16_32_Q15((a),(b))) - -static inline int SATURATE(int a, int b) -{ - if (a>b) - a=b; - if (a<-b) - a = -b; - return a; -} - -static inline int MULT16_16_Q11_32(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_Q11: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res >>= 11; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_16_Q11: output is not short: %d*%d=%d\n", (int)a, (int)b, (int)res); - spx_mips+=3; - return res; -} -static inline short MULT16_16_Q13(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_Q13: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res >>= 13; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "MULT16_16_Q13: output is not short: %d*%d=%d\n", a, b, (int)res); - spx_mips+=3; - return res; -} -static inline short MULT16_16_Q14(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_Q14: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res >>= 14; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "MULT16_16_Q14: output is not short: %d\n", (int)res); - spx_mips+=3; - return res; -} -static inline short MULT16_16_Q15(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_Q15: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res >>= 15; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "MULT16_16_Q15: output is not short: %d\n", (int)res); - } - spx_mips+=3; - return res; -} - -static inline short MULT16_16_P13(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_P13: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res += 4096; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_16_P13: overflow: %d*%d=%d\n", a, b, (int)res); - res >>= 13; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "MULT16_16_P13: output is not short: %d*%d=%d\n", a, b, (int)res); - spx_mips+=4; - return res; -} -static inline short MULT16_16_P14(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_P14: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res += 8192; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_16_P14: overflow: %d*%d=%d\n", a, b, (int)res); - res >>= 14; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "MULT16_16_P14: output is not short: %d*%d=%d\n", a, b, (int)res); - spx_mips+=4; - return res; -} -static inline short MULT16_16_P15(int a, int b) -{ - long long res; - if (!VERIFY_SHORT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "MULT16_16_P15: inputs are not short: %d %d\n", a, b); - } - res = ((long long)a)*b; - res += 16384; - if (!VERIFY_INT(res)) - fprintf (stderr, "MULT16_16_P15: overflow: %d*%d=%d\n", a, b, (int)res); - res >>= 15; - if (!VERIFY_SHORT(res)) - fprintf (stderr, "MULT16_16_P15: output is not short: %d*%d=%d\n", a, b, (int)res); - spx_mips+=4; - return res; -} - -#define DIV32_16(a, b) _DIV32_16(a, b, __FILE__, __LINE__) - -static inline int _DIV32_16(long long a, long long b, char *file, int line) -{ - long long res; - if (b==0) - { - fprintf(stderr, "DIV32_16: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); - return 0; - } - if (!VERIFY_INT(a) || !VERIFY_SHORT(b)) - { - fprintf (stderr, "DIV32_16: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); - } - res = a/b; - if (!VERIFY_SHORT(res)) - { - fprintf (stderr, "DIV32_16: output is not short: %d / %d = %d in %s: line %d\n", (int)a,(int)b,(int)res, file, line); - if (res>32767) - res = 32767; - if (res<-32768) - res = -32768; - } - spx_mips+=20; - return res; -} - -#define DIV32(a, b) _DIV32(a, b, __FILE__, __LINE__) -static inline int _DIV32(long long a, long long b, char *file, int line) -{ - long long res; - if (b==0) - { - fprintf(stderr, "DIV32: divide by zero: %d/%d in %s: line %d\n", (int)a, (int)b, file, line); - return 0; - } - - if (!VERIFY_INT(a) || !VERIFY_INT(b)) - { - fprintf (stderr, "DIV32: inputs are not int/short: %d %d in %s: line %d\n", (int)a, (int)b, file, line); - } - res = a/b; - if (!VERIFY_INT(res)) - fprintf (stderr, "DIV32: output is not int: %d in %s: line %d\n", (int)res, file, line); - spx_mips+=36; - return res; -} -#define PDIV32(a,b) DIV32(ADD32((a),(b)>>1),b) -#define PDIV32_16(a,b) DIV32_16(ADD32((a),(b)>>1),b) - -#endif diff --git a/speex/libspeexdsp/fixed_generic.h b/speex/libspeexdsp/fixed_generic.h deleted file mode 100644 index 12d27aac5..000000000 --- a/speex/libspeexdsp/fixed_generic.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright (C) 2003 Jean-Marc Valin */ -/** - @file fixed_generic.h - @brief Generic fixed-point operations -*/ -/* - 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. -*/ - -#ifndef FIXED_GENERIC_H -#define FIXED_GENERIC_H - -#define QCONST16(x,bits) ((spx_word16_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) -#define QCONST32(x,bits) ((spx_word32_t)(.5+(x)*(((spx_word32_t)1)<<(bits)))) - -#define NEG16(x) (-(x)) -#define NEG32(x) (-(x)) -#define EXTRACT16(x) ((spx_word16_t)(x)) -#define EXTEND32(x) ((spx_word32_t)(x)) -#define SHR16(a,shift) ((a) >> (shift)) -#define SHL16(a,shift) ((a) << (shift)) -#define SHR32(a,shift) ((a) >> (shift)) -#define SHL32(a,shift) ((a) << (shift)) -#define PSHR16(a,shift) (SHR16((a)+((1<<((shift))>>1)),shift)) -#define PSHR32(a,shift) (SHR32((a)+((EXTEND32(1)<<((shift))>>1)),shift)) -#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift))) -#define SATURATE16(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) -#define SATURATE32(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) - -#define SATURATE32PSHR(x,shift,a) (((x)>=(SHL32(a,shift))) ? (a) : \ - (x)<=-(SHL32(a,shift)) ? -(a) : \ - (PSHR32(x, shift))) - -#define SHR(a,shift) ((a) >> (shift)) -#define SHL(a,shift) ((spx_word32_t)(a) << (shift)) -#define PSHR(a,shift) (SHR((a)+((EXTEND32(1)<<((shift))>>1)),shift)) -#define SATURATE(x,a) (((x)>(a) ? (a) : (x)<-(a) ? -(a) : (x))) - - -#define ADD16(a,b) ((spx_word16_t)((spx_word16_t)(a)+(spx_word16_t)(b))) -#define SUB16(a,b) ((spx_word16_t)(a)-(spx_word16_t)(b)) -#define ADD32(a,b) ((spx_word32_t)(a)+(spx_word32_t)(b)) -#define SUB32(a,b) ((spx_word32_t)(a)-(spx_word32_t)(b)) - - -/* result fits in 16 bits */ -#define MULT16_16_16(a,b) ((((spx_word16_t)(a))*((spx_word16_t)(b)))) - -/* (spx_word32_t)(spx_word16_t) gives TI compiler a hint that it's 16x16->32 multiply */ -#define MULT16_16(a,b) (((spx_word32_t)(spx_word16_t)(a))*((spx_word32_t)(spx_word16_t)(b))) - -#define MAC16_16(c,a,b) (ADD32((c),MULT16_16((a),(b)))) -#define MULT16_32_Q12(a,b) ADD32(MULT16_16((a),SHR((b),12)), SHR(MULT16_16((a),((b)&0x00000fff)),12)) -#define MULT16_32_Q13(a,b) ADD32(MULT16_16((a),SHR((b),13)), SHR(MULT16_16((a),((b)&0x00001fff)),13)) -#define MULT16_32_Q14(a,b) ADD32(MULT16_16((a),SHR((b),14)), SHR(MULT16_16((a),((b)&0x00003fff)),14)) - -#define MULT16_32_Q11(a,b) ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11)) -#define MAC16_32_Q11(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),11)), SHR(MULT16_16((a),((b)&0x000007ff)),11))) - -#define MULT16_32_P15(a,b) ADD32(MULT16_16((a),SHR((b),15)), PSHR(MULT16_16((a),((b)&0x00007fff)),15)) -#define MULT16_32_Q15(a,b) ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15)) -#define MAC16_32_Q15(c,a,b) ADD32(c,ADD32(MULT16_16((a),SHR((b),15)), SHR(MULT16_16((a),((b)&0x00007fff)),15))) - - -#define MAC16_16_Q11(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),11))) -#define MAC16_16_Q13(c,a,b) (ADD32((c),SHR(MULT16_16((a),(b)),13))) -#define MAC16_16_P13(c,a,b) (ADD32((c),SHR(ADD32(4096,MULT16_16((a),(b))),13))) - -#define MULT16_16_Q11_32(a,b) (SHR(MULT16_16((a),(b)),11)) -#define MULT16_16_Q13(a,b) (SHR(MULT16_16((a),(b)),13)) -#define MULT16_16_Q14(a,b) (SHR(MULT16_16((a),(b)),14)) -#define MULT16_16_Q15(a,b) (SHR(MULT16_16((a),(b)),15)) - -#define MULT16_16_P13(a,b) (SHR(ADD32(4096,MULT16_16((a),(b))),13)) -#define MULT16_16_P14(a,b) (SHR(ADD32(8192,MULT16_16((a),(b))),14)) -#define MULT16_16_P15(a,b) (SHR(ADD32(16384,MULT16_16((a),(b))),15)) - -#define MUL_16_32_R15(a,bh,bl) ADD32(MULT16_16((a),(bh)), SHR(MULT16_16((a),(bl)),15)) - -#define DIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a))/((spx_word16_t)(b)))) -#define PDIV32_16(a,b) ((spx_word16_t)(((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word16_t)(b)))) -#define DIV32(a,b) (((spx_word32_t)(a))/((spx_word32_t)(b))) -#define PDIV32(a,b) (((spx_word32_t)(a)+((spx_word16_t)(b)>>1))/((spx_word32_t)(b))) - -#endif diff --git a/speex/libspeexdsp/jitter.c b/speex/libspeexdsp/jitter.c deleted file mode 100644 index a9c0dd31e..000000000 --- a/speex/libspeexdsp/jitter.c +++ /dev/null @@ -1,839 +0,0 @@ -/* Copyright (C) 2002 Jean-Marc Valin - File: speex_jitter.h - - Adaptive jitter buffer for Speex - - 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. - -*/ - -/* -TODO: -- Add short-term estimate -- Defensive programming - + warn when last returned < last desired (begative buffering) - + warn if update_delay not called between get() and tick() or is called twice in a row -- Linked list structure for holding the packets instead of the current fixed-size array - + return memory to a pool - + allow pre-allocation of the pool - + optional max number of elements -- Statistics - + drift - + loss - + late - + jitter - + buffering delay -*/ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - -#include "arch.h" -#include "speex/speex_jitter.h" -#include "os_support.h" - -#ifndef NULL -#define NULL 0 -#endif - -#define SPEEX_JITTER_MAX_BUFFER_SIZE 200 /**< Maximum number of packets in jitter buffer */ - -#define TSUB(a,b) ((spx_int32_t)((a)-(b))) - -#define GT32(a,b) (((spx_int32_t)((a)-(b)))>0) -#define GE32(a,b) (((spx_int32_t)((a)-(b)))>=0) -#define LT32(a,b) (((spx_int32_t)((a)-(b)))<0) -#define LE32(a,b) (((spx_int32_t)((a)-(b)))<=0) - -#define ROUND_DOWN(x, step) ((x)<0 ? ((x)-(step)+1)/(step)*(step) : (x)/(step)*(step)) - -#define MAX_TIMINGS 40 -#define MAX_BUFFERS 3 -#define TOP_DELAY 40 - -/** Buffer that keeps the time of arrival of the latest packets */ -struct TimingBuffer { - int filled; /**< Number of entries occupied in "timing" and "counts"*/ - int curr_count; /**< Number of packet timings we got (including those we discarded) */ - spx_int32_t timing[MAX_TIMINGS]; /**< Sorted list of all timings ("latest" packets first) */ - spx_int16_t counts[MAX_TIMINGS]; /**< Order the packets were put in (will be used for short-term estimate) */ -}; - -static void tb_init(struct TimingBuffer *tb) -{ - tb->filled = 0; - tb->curr_count = 0; -} - -/* Add the timing of a new packet to the TimingBuffer */ -static void tb_add(struct TimingBuffer *tb, spx_int16_t timing) -{ - int pos; - /* Discard packet that won't make it into the list because they're too early */ - if (tb->filled >= MAX_TIMINGS && timing >= tb->timing[tb->filled-1]) - { - tb->curr_count++; - return; - } - - /* Find where the timing info goes in the sorted list */ - pos = 0; - /* FIXME: Do bisection instead of linear search */ - while (posfilled && timing >= tb->timing[pos]) - { - pos++; - } - - speex_assert(pos <= tb->filled && pos < MAX_TIMINGS); - - /* Shift everything so we can perform the insertion */ - if (pos < tb->filled) - { - int move_size = tb->filled-pos; - if (tb->filled == MAX_TIMINGS) - move_size -= 1; - SPEEX_MOVE(&tb->timing[pos+1], &tb->timing[pos], move_size); - SPEEX_MOVE(&tb->counts[pos+1], &tb->counts[pos], move_size); - } - /* Insert */ - tb->timing[pos] = timing; - tb->counts[pos] = tb->curr_count; - - tb->curr_count++; - if (tb->filledfilled++; -} - - - -/** Jitter buffer structure */ -struct JitterBuffer_ { - spx_uint32_t pointer_timestamp; /**< Timestamp of what we will *get* next */ - spx_uint32_t last_returned_timestamp; /**< Useful for getting the next packet with the same timestamp (for fragmented media) */ - spx_uint32_t next_stop; /**< Estimated time the next get() will be called */ - - spx_int32_t buffered; /**< Amount of data we think is still buffered by the application (timestamp units)*/ - - JitterBufferPacket packets[SPEEX_JITTER_MAX_BUFFER_SIZE]; /**< Packets stored in the buffer */ - spx_uint32_t arrival[SPEEX_JITTER_MAX_BUFFER_SIZE]; /**< Packet arrival time (0 means it was late, even though it's a valid timestamp) */ - - void (*destroy) (void *); /**< Callback for destroying a packet */ - - spx_int32_t delay_step; /**< Size of the steps when adjusting buffering (timestamp units) */ - spx_int32_t concealment_size; /**< Size of the packet loss concealment "units" */ - int reset_state; /**< True if state was just reset */ - int buffer_margin; /**< How many frames we want to keep in the buffer (lower bound) */ - int late_cutoff; /**< How late must a packet be for it not to be considered at all */ - int interp_requested; /**< An interpolation is requested by speex_jitter_update_delay() */ - int auto_adjust; /**< Whether to automatically adjust the delay at any time */ - - struct TimingBuffer _tb[MAX_BUFFERS]; /**< Don't use those directly */ - struct TimingBuffer *timeBuffers[MAX_BUFFERS]; /**< Storing arrival time of latest frames so we can compute some stats */ - int window_size; /**< Total window over which the late frames are counted */ - int subwindow_size; /**< Sub-window size for faster computation */ - int max_late_rate; /**< Absolute maximum amount of late packets tolerable (in percent) */ - int latency_tradeoff; /**< Latency equivalent of losing one percent of packets */ - int auto_tradeoff; /**< Latency equivalent of losing one percent of packets (automatic default) */ - - int lost_count; /**< Number of consecutive lost packets */ -}; - -/** Based on available data, this computes the optimal delay for the jitter buffer. - The optimised function is in timestamp units and is: - cost = delay + late_factor*[number of frames that would be late if we used that delay] - @param tb Array of buffers - @param late_factor Equivalent cost of a late frame (in timestamp units) - */ -static spx_int16_t compute_opt_delay(JitterBuffer *jitter) -{ - int i; - spx_int16_t opt=0; - spx_int32_t best_cost=0x7fffffff; - int late = 0; - int pos[MAX_BUFFERS]; - int tot_count; - float late_factor; - int penalty_taken = 0; - int best = 0; - int worst = 0; - spx_int32_t deltaT; - struct TimingBuffer *tb; - - tb = jitter->_tb; - - /* Number of packet timings we have received (including those we didn't keep) */ - tot_count = 0; - for (i=0;ilatency_tradeoff != 0) - late_factor = jitter->latency_tradeoff * 100.0f / tot_count; - else - late_factor = jitter->auto_tradeoff * jitter->window_size/tot_count; - - /*fprintf(stderr, "late_factor = %f\n", late_factor);*/ - for (i=0;idelay_step); - pos[next]++; - - /* Actual cost function that tells us how bad using this delay would be */ - cost = -latest + late_factor*late; - /*fprintf(stderr, "cost %d = %d + %f * %d\n", cost, -latest, late_factor, late);*/ - if (cost < best_cost) - { - best_cost = cost; - opt = latest; - } - } else { - break; - } - - /* For the next timing we will consider, there will be one more late packet to count */ - late++; - /* Two-frame penalty if we're going to increase the amount of late frames (hysteresis) */ - if (latest >= 0 && !penalty_taken) - { - penalty_taken = 1; - late+=4; - } - } - - deltaT = best-worst; - /* This is a default "automatic latency tradeoff" when none is provided */ - jitter->auto_tradeoff = 1 + deltaT/TOP_DELAY; - /*fprintf(stderr, "auto_tradeoff = %d (%d %d %d)\n", jitter->auto_tradeoff, best, worst, i);*/ - - /* FIXME: Compute a short-term estimate too and combine with the long-term one */ - - /* Prevents reducing the buffer size when we haven't really had much data */ - if (tot_count < TOP_DELAY && opt > 0) - return 0; - return opt; -} - - -/** Initialise jitter buffer */ -EXPORT JitterBuffer *jitter_buffer_init(int step_size) -{ - JitterBuffer *jitter = (JitterBuffer*)speex_alloc(sizeof(JitterBuffer)); - if (jitter) - { - int i; - spx_int32_t tmp; - for (i=0;ipackets[i].data=NULL; - jitter->delay_step = step_size; - jitter->concealment_size = step_size; - /*FIXME: Should this be 0 or 1?*/ - jitter->buffer_margin = 0; - jitter->late_cutoff = 50; - jitter->destroy = NULL; - jitter->latency_tradeoff = 0; - jitter->auto_adjust = 1; - tmp = 4; - jitter_buffer_ctl(jitter, JITTER_BUFFER_SET_MAX_LATE_RATE, &tmp); - jitter_buffer_reset(jitter); - } - return jitter; -} - -/** Reset jitter buffer */ -EXPORT void jitter_buffer_reset(JitterBuffer *jitter) -{ - int i; - for (i=0;ipackets[i].data) - { - if (jitter->destroy) - jitter->destroy(jitter->packets[i].data); - else - speex_free(jitter->packets[i].data); - jitter->packets[i].data = NULL; - } - } - /* Timestamp is actually undefined at this point */ - jitter->pointer_timestamp = 0; - jitter->next_stop = 0; - jitter->reset_state = 1; - jitter->lost_count = 0; - jitter->buffered = 0; - jitter->auto_tradeoff = 32000; - - for (i=0;i_tb[i]); - jitter->timeBuffers[i] = &jitter->_tb[i]; - } - /*fprintf (stderr, "reset\n");*/ -} - -/** Destroy jitter buffer */ -EXPORT void jitter_buffer_destroy(JitterBuffer *jitter) -{ - jitter_buffer_reset(jitter); - speex_free(jitter); -} - -/** Take the following timing into consideration for future calculations */ -static void update_timings(JitterBuffer *jitter, spx_int32_t timing) -{ - if (timing < -32767) - timing = -32767; - if (timing > 32767) - timing = 32767; - /* If the current sub-window is full, perform a rotation and discard oldest sub-widow */ - if (jitter->timeBuffers[0]->curr_count >= jitter->subwindow_size) - { - int i; - /*fprintf(stderr, "Rotate buffer\n");*/ - struct TimingBuffer *tmp = jitter->timeBuffers[MAX_BUFFERS-1]; - for (i=MAX_BUFFERS-1;i>=1;i--) - jitter->timeBuffers[i] = jitter->timeBuffers[i-1]; - jitter->timeBuffers[0] = tmp; - tb_init(jitter->timeBuffers[0]); - } - tb_add(jitter->timeBuffers[0], timing); -} - -/** Compensate all timings when we do an adjustment of the buffering */ -static void shift_timings(JitterBuffer *jitter, spx_int16_t amount) -{ - int i, j; - for (i=0;itimeBuffers[i]->filled;j++) - jitter->timeBuffers[i]->timing[j] += amount; - } -} - - -/** Put one packet into the jitter buffer */ -EXPORT void jitter_buffer_put(JitterBuffer *jitter, const JitterBufferPacket *packet) -{ - int i,j; - int late; - /*fprintf (stderr, "put packet %d %d\n", timestamp, span);*/ - - /* Cleanup buffer (remove old packets that weren't played) */ - if (!jitter->reset_state) - { - for (i=0;ipackets[i].data && LE32(jitter->packets[i].timestamp + jitter->packets[i].span, jitter->pointer_timestamp)) - { - /*fprintf (stderr, "cleaned (not played)\n");*/ - if (jitter->destroy) - jitter->destroy(jitter->packets[i].data); - else - speex_free(jitter->packets[i].data); - jitter->packets[i].data = NULL; - } - } - } - - /*fprintf(stderr, "arrival: %d %d %d\n", packet->timestamp, jitter->next_stop, jitter->pointer_timestamp);*/ - /* Check if packet is late (could still be useful though) */ - if (!jitter->reset_state && LT32(packet->timestamp, jitter->next_stop)) - { - update_timings(jitter, ((spx_int32_t)packet->timestamp) - ((spx_int32_t)jitter->next_stop) - jitter->buffer_margin); - late = 1; - } else { - late = 0; - } - - /* For some reason, the consumer has failed the last 20 fetches. Make sure this packet is - * used to resync. */ - if (jitter->lost_count>20) - { - jitter_buffer_reset(jitter); - } - - /* Only insert the packet if it's not hopelessly late (i.e. totally useless) */ - if (jitter->reset_state || GE32(packet->timestamp+packet->span+jitter->delay_step, jitter->pointer_timestamp)) - { - - /*Find an empty slot in the buffer*/ - for (i=0;ipackets[i].data==NULL) - break; - } - - /*No place left in the buffer, need to make room for it by discarding the oldest packet */ - if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) - { - int earliest=jitter->packets[0].timestamp; - i=0; - for (j=1;jpackets[i].data || LT32(jitter->packets[j].timestamp,earliest)) - { - earliest = jitter->packets[j].timestamp; - i=j; - } - } - if (jitter->destroy) - jitter->destroy(jitter->packets[i].data); - else - speex_free(jitter->packets[i].data); - jitter->packets[i].data=NULL; - /*fprintf (stderr, "Buffer is full, discarding earliest frame %d (currently at %d)\n", timestamp, jitter->pointer_timestamp);*/ - } - - /* Copy packet in buffer */ - if (jitter->destroy) - { - jitter->packets[i].data = packet->data; - } else { - jitter->packets[i].data=(char*)speex_alloc(packet->len); - for (j=0;jlen;j++) - jitter->packets[i].data[j]=packet->data[j]; - } - jitter->packets[i].timestamp=packet->timestamp; - jitter->packets[i].span=packet->span; - jitter->packets[i].len=packet->len; - jitter->packets[i].sequence=packet->sequence; - jitter->packets[i].user_data=packet->user_data; - if (jitter->reset_state || late) - jitter->arrival[i] = 0; - else - jitter->arrival[i] = jitter->next_stop; - } - - -} - -/** Get one packet from the jitter buffer */ -EXPORT int jitter_buffer_get(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t desired_span, spx_int32_t *start_offset) -{ - int i; - unsigned int j; - spx_int16_t opt; - - if (start_offset != NULL) - *start_offset = 0; - - /* Syncing on the first call */ - if (jitter->reset_state) - { - int found = 0; - /* Find the oldest packet */ - spx_uint32_t oldest=0; - for (i=0;ipackets[i].data && (!found || LT32(jitter->packets[i].timestamp,oldest))) - { - oldest = jitter->packets[i].timestamp; - found = 1; - } - } - if (found) - { - jitter->reset_state=0; - jitter->pointer_timestamp = oldest; - jitter->next_stop = oldest; - } else { - packet->timestamp = 0; - packet->span = jitter->interp_requested; - return JITTER_BUFFER_MISSING; - } - } - - - jitter->last_returned_timestamp = jitter->pointer_timestamp; - - if (jitter->interp_requested != 0) - { - packet->timestamp = jitter->pointer_timestamp; - packet->span = jitter->interp_requested; - - /* Increment the pointer because it got decremented in the delay update */ - jitter->pointer_timestamp += jitter->interp_requested; - packet->len = 0; - /*fprintf (stderr, "Deferred interpolate\n");*/ - - jitter->interp_requested = 0; - - jitter->buffered = packet->span - desired_span; - - return JITTER_BUFFER_INSERTION; - } - - /* Searching for the packet that fits best */ - - /* Search the buffer for a packet with the right timestamp and spanning the whole current chunk */ - for (i=0;ipackets[i].data && jitter->packets[i].timestamp==jitter->pointer_timestamp && GE32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp+desired_span)) - break; - } - - /* If no match, try for an "older" packet that still spans (fully) the current chunk */ - if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) - { - for (i=0;ipackets[i].data && LE32(jitter->packets[i].timestamp, jitter->pointer_timestamp) && GE32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp+desired_span)) - break; - } - } - - /* If still no match, try for an "older" packet that spans part of the current chunk */ - if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) - { - for (i=0;ipackets[i].data && LE32(jitter->packets[i].timestamp, jitter->pointer_timestamp) && GT32(jitter->packets[i].timestamp+jitter->packets[i].span,jitter->pointer_timestamp)) - break; - } - } - - /* If still no match, try for earliest packet possible */ - if (i==SPEEX_JITTER_MAX_BUFFER_SIZE) - { - int found = 0; - spx_uint32_t best_time=0; - int best_span=0; - int besti=0; - for (i=0;ipackets[i].data && LT32(jitter->packets[i].timestamp,jitter->pointer_timestamp+desired_span) && GE32(jitter->packets[i].timestamp,jitter->pointer_timestamp)) - { - if (!found || LT32(jitter->packets[i].timestamp,best_time) || (jitter->packets[i].timestamp==best_time && GT32(jitter->packets[i].span,best_span))) - { - best_time = jitter->packets[i].timestamp; - best_span = jitter->packets[i].span; - besti = i; - found = 1; - } - } - } - if (found) - { - i=besti; - /*fprintf (stderr, "incomplete: %d %d %d %d\n", jitter->packets[i].timestamp, jitter->pointer_timestamp, chunk_size, jitter->packets[i].span);*/ - } - } - - /* If we find something */ - if (i!=SPEEX_JITTER_MAX_BUFFER_SIZE) - { - spx_int32_t offset; - - /* We (obviously) haven't lost this packet */ - jitter->lost_count = 0; - - /* In this case, 0 isn't as a valid timestamp */ - if (jitter->arrival[i] != 0) - { - update_timings(jitter, ((spx_int32_t)jitter->packets[i].timestamp) - ((spx_int32_t)jitter->arrival[i]) - jitter->buffer_margin); - } - - - /* Copy packet */ - if (jitter->destroy) - { - packet->data = jitter->packets[i].data; - packet->len = jitter->packets[i].len; - } else { - if (jitter->packets[i].len > packet->len) - { - speex_warning_int("jitter_buffer_get(): packet too large to fit. Size is", jitter->packets[i].len); - } else { - packet->len = jitter->packets[i].len; - } - for (j=0;jlen;j++) - packet->data[j] = jitter->packets[i].data[j]; - /* Remove packet */ - speex_free(jitter->packets[i].data); - } - jitter->packets[i].data = NULL; - /* Set timestamp and span (if requested) */ - offset = (spx_int32_t)jitter->packets[i].timestamp-(spx_int32_t)jitter->pointer_timestamp; - if (start_offset != NULL) - *start_offset = offset; - else if (offset != 0) - speex_warning_int("jitter_buffer_get() discarding non-zero start_offset", offset); - - packet->timestamp = jitter->packets[i].timestamp; - jitter->last_returned_timestamp = packet->timestamp; - - packet->span = jitter->packets[i].span; - packet->sequence = jitter->packets[i].sequence; - packet->user_data = jitter->packets[i].user_data; - /* Point to the end of the current packet */ - jitter->pointer_timestamp = jitter->packets[i].timestamp+jitter->packets[i].span; - - jitter->buffered = packet->span - desired_span; - - if (start_offset != NULL) - jitter->buffered += *start_offset; - - return JITTER_BUFFER_OK; - } - - - /* If we haven't found anything worth returning */ - - /*fprintf (stderr, "not found\n");*/ - jitter->lost_count++; - /*fprintf (stderr, "m");*/ - /*fprintf (stderr, "lost_count = %d\n", jitter->lost_count);*/ - - opt = compute_opt_delay(jitter); - - /* Should we force an increase in the buffer or just do normal interpolation? */ - if (opt < 0) - { - /* Need to increase buffering */ - - /* Shift histogram to compensate */ - shift_timings(jitter, -opt); - - packet->timestamp = jitter->pointer_timestamp; - packet->span = -opt; - /* Don't move the pointer_timestamp forward */ - packet->len = 0; - - jitter->buffered = packet->span - desired_span; - return JITTER_BUFFER_INSERTION; - /*jitter->pointer_timestamp -= jitter->delay_step;*/ - /*fprintf (stderr, "Forced to interpolate\n");*/ - } else { - /* Normal packet loss */ - packet->timestamp = jitter->pointer_timestamp; - - desired_span = ROUND_DOWN(desired_span, jitter->concealment_size); - packet->span = desired_span; - jitter->pointer_timestamp += desired_span; - packet->len = 0; - - jitter->buffered = packet->span - desired_span; - return JITTER_BUFFER_MISSING; - /*fprintf (stderr, "Normal loss\n");*/ - } - - -} - -EXPORT int jitter_buffer_get_another(JitterBuffer *jitter, JitterBufferPacket *packet) -{ - int i, j; - for (i=0;ipackets[i].data && jitter->packets[i].timestamp==jitter->last_returned_timestamp) - break; - } - if (i!=SPEEX_JITTER_MAX_BUFFER_SIZE) - { - /* Copy packet */ - packet->len = jitter->packets[i].len; - if (jitter->destroy) - { - packet->data = jitter->packets[i].data; - } else { - for (j=0;jlen;j++) - packet->data[j] = jitter->packets[i].data[j]; - /* Remove packet */ - speex_free(jitter->packets[i].data); - } - jitter->packets[i].data = NULL; - packet->timestamp = jitter->packets[i].timestamp; - packet->span = jitter->packets[i].span; - packet->sequence = jitter->packets[i].sequence; - packet->user_data = jitter->packets[i].user_data; - return JITTER_BUFFER_OK; - } else { - packet->data = NULL; - packet->len = 0; - packet->span = 0; - return JITTER_BUFFER_MISSING; - } -} - -/* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */ -static int _jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset) -{ - spx_int16_t opt = compute_opt_delay(jitter); - /*fprintf(stderr, "opt adjustment is %d ", opt);*/ - - if (opt < 0) - { - shift_timings(jitter, -opt); - - jitter->pointer_timestamp += opt; - jitter->interp_requested = -opt; - /*fprintf (stderr, "Decision to interpolate %d samples\n", -opt);*/ - } else if (opt > 0) - { - shift_timings(jitter, -opt); - jitter->pointer_timestamp += opt; - /*fprintf (stderr, "Decision to drop %d samples\n", opt);*/ - } - - return opt; -} - -/* Let the jitter buffer know it's the right time to adjust the buffering delay to the network conditions */ -EXPORT int jitter_buffer_update_delay(JitterBuffer *jitter, JitterBufferPacket *packet, spx_int32_t *start_offset) -{ - /* If the programmer calls jitter_buffer_update_delay() directly, - automatically disable auto-adjustment */ - jitter->auto_adjust = 0; - - return _jitter_buffer_update_delay(jitter, packet, start_offset); -} - -/** Get pointer timestamp of jitter buffer */ -EXPORT int jitter_buffer_get_pointer_timestamp(JitterBuffer *jitter) -{ - return jitter->pointer_timestamp; -} - -EXPORT void jitter_buffer_tick(JitterBuffer *jitter) -{ - /* Automatically-adjust the buffering delay if requested */ - if (jitter->auto_adjust) - _jitter_buffer_update_delay(jitter, NULL, NULL); - - if (jitter->buffered >= 0) - { - jitter->next_stop = jitter->pointer_timestamp - jitter->buffered; - } else { - jitter->next_stop = jitter->pointer_timestamp; - speex_warning_int("jitter buffer sees negative buffering, your code might be broken. Value is ", jitter->buffered); - } - jitter->buffered = 0; -} - -EXPORT void jitter_buffer_remaining_span(JitterBuffer *jitter, spx_uint32_t rem) -{ - /* Automatically-adjust the buffering delay if requested */ - if (jitter->auto_adjust) - _jitter_buffer_update_delay(jitter, NULL, NULL); - - if (jitter->buffered < 0) - speex_warning_int("jitter buffer sees negative buffering, your code might be broken. Value is ", jitter->buffered); - jitter->next_stop = jitter->pointer_timestamp - rem; -} - - -/* Used like the ioctl function to control the jitter buffer parameters */ -EXPORT int jitter_buffer_ctl(JitterBuffer *jitter, int request, void *ptr) -{ - int count, i; - switch(request) - { - case JITTER_BUFFER_SET_MARGIN: - jitter->buffer_margin = *(spx_int32_t*)ptr; - break; - case JITTER_BUFFER_GET_MARGIN: - *(spx_int32_t*)ptr = jitter->buffer_margin; - break; - case JITTER_BUFFER_GET_AVALIABLE_COUNT: - count = 0; - for (i=0;ipackets[i].data && LE32(jitter->pointer_timestamp, jitter->packets[i].timestamp)) - { - count++; - } - } - *(spx_int32_t*)ptr = count; - break; - case JITTER_BUFFER_SET_DESTROY_CALLBACK: - jitter->destroy = (void (*) (void *))ptr; - break; - case JITTER_BUFFER_GET_DESTROY_CALLBACK: - *(void (**) (void *))ptr = jitter->destroy; - break; - case JITTER_BUFFER_SET_DELAY_STEP: - jitter->delay_step = *(spx_int32_t*)ptr; - break; - case JITTER_BUFFER_GET_DELAY_STEP: - *(spx_int32_t*)ptr = jitter->delay_step; - break; - case JITTER_BUFFER_SET_CONCEALMENT_SIZE: - jitter->concealment_size = *(spx_int32_t*)ptr; - break; - case JITTER_BUFFER_GET_CONCEALMENT_SIZE: - *(spx_int32_t*)ptr = jitter->concealment_size; - break; - case JITTER_BUFFER_SET_MAX_LATE_RATE: - jitter->max_late_rate = *(spx_int32_t*)ptr; - jitter->window_size = 100*TOP_DELAY/jitter->max_late_rate; - jitter->subwindow_size = jitter->window_size/MAX_BUFFERS; - break; - case JITTER_BUFFER_GET_MAX_LATE_RATE: - *(spx_int32_t*)ptr = jitter->max_late_rate; - break; - case JITTER_BUFFER_SET_LATE_COST: - jitter->latency_tradeoff = *(spx_int32_t*)ptr; - break; - case JITTER_BUFFER_GET_LATE_COST: - *(spx_int32_t*)ptr = jitter->latency_tradeoff; - break; - default: - speex_warning_int("Unknown jitter_buffer_ctl request: ", request); - return -1; - } - return 0; -} - diff --git a/speex/libspeexdsp/kiss_fft.c b/speex/libspeexdsp/kiss_fft.c deleted file mode 100644 index 285e55798..000000000 --- a/speex/libspeexdsp/kiss_fft.c +++ /dev/null @@ -1,523 +0,0 @@ -/* -Copyright (c) 2003-2004, Mark Borgerding -Copyright (c) 2005-2007, Jean-Marc Valin - -All rights reserved. - -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 author nor the names of any 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 COPYRIGHT OWNER 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. -*/ - - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "_kiss_fft_guts.h" -#include "arch.h" -#include "os_support.h" - -/* The guts header contains all the multiplication and addition macros that are defined for - fixed or floating point complex numbers. It also delares the kf_ internal functions. - */ - -static void kf_bfly2( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m, - int N, - int mm - ) -{ - kiss_fft_cpx * Fout2; - kiss_fft_cpx * tw1; - kiss_fft_cpx t; - if (!st->inverse) { - int i,j; - kiss_fft_cpx * Fout_beg = Fout; - for (i=0;itwiddles; - for(j=0;jr , tw1->r),MULT16_16(Fout2->i , tw1->i)), 1); - ti = SHR32(ADD32(MULT16_16(Fout2->i , tw1->r),MULT16_16(Fout2->r , tw1->i)), 1); - tw1 += fstride; - Fout2->r = PSHR32(SUB32(SHL32(EXTEND32(Fout->r), 14), tr), 15); - Fout2->i = PSHR32(SUB32(SHL32(EXTEND32(Fout->i), 14), ti), 15); - Fout->r = PSHR32(ADD32(SHL32(EXTEND32(Fout->r), 14), tr), 15); - Fout->i = PSHR32(ADD32(SHL32(EXTEND32(Fout->i), 14), ti), 15); - ++Fout2; - ++Fout; - } - } - } else { - int i,j; - kiss_fft_cpx * Fout_beg = Fout; - for (i=0;itwiddles; - for(j=0;jinverse) - { - kiss_fft_cpx * Fout_beg = Fout; - for (i=0;itwiddles; - for (j=0;jtwiddles; - for (j=0;jr = PSHR16(Fout->r, 2); - Fout->i = PSHR16(Fout->i, 2); - C_SUB( scratch[5] , *Fout, scratch[1] ); - C_ADDTO(*Fout, scratch[1]); - C_ADD( scratch[3] , scratch[0] , scratch[2] ); - C_SUB( scratch[4] , scratch[0] , scratch[2] ); - Fout[m2].r = PSHR16(Fout[m2].r, 2); - Fout[m2].i = PSHR16(Fout[m2].i, 2); - C_SUB( Fout[m2], *Fout, scratch[3] ); - tw1 += fstride; - tw2 += fstride*2; - tw3 += fstride*3; - C_ADDTO( *Fout , scratch[3] ); - - Fout[m].r = scratch[5].r + scratch[4].i; - Fout[m].i = scratch[5].i - scratch[4].r; - Fout[m3].r = scratch[5].r - scratch[4].i; - Fout[m3].i = scratch[5].i + scratch[4].r; - ++Fout; - } - } - } -} - -static void kf_bfly3( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - size_t m - ) -{ - size_t k=m; - const size_t m2 = 2*m; - kiss_fft_cpx *tw1,*tw2; - kiss_fft_cpx scratch[5]; - kiss_fft_cpx epi3; - epi3 = st->twiddles[fstride*m]; - - tw1=tw2=st->twiddles; - - do{ - if (!st->inverse) { - C_FIXDIV(*Fout,3); C_FIXDIV(Fout[m],3); C_FIXDIV(Fout[m2],3); - } - - C_MUL(scratch[1],Fout[m] , *tw1); - C_MUL(scratch[2],Fout[m2] , *tw2); - - C_ADD(scratch[3],scratch[1],scratch[2]); - C_SUB(scratch[0],scratch[1],scratch[2]); - tw1 += fstride; - tw2 += fstride*2; - - Fout[m].r = Fout->r - HALF_OF(scratch[3].r); - Fout[m].i = Fout->i - HALF_OF(scratch[3].i); - - C_MULBYSCALAR( scratch[0] , epi3.i ); - - C_ADDTO(*Fout,scratch[3]); - - Fout[m2].r = Fout[m].r + scratch[0].i; - Fout[m2].i = Fout[m].i - scratch[0].r; - - Fout[m].r -= scratch[0].i; - Fout[m].i += scratch[0].r; - - ++Fout; - }while(--k); -} - -static void kf_bfly5( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m - ) -{ - kiss_fft_cpx *Fout0,*Fout1,*Fout2,*Fout3,*Fout4; - int u; - kiss_fft_cpx scratch[13]; - kiss_fft_cpx * twiddles = st->twiddles; - kiss_fft_cpx *tw; - kiss_fft_cpx ya,yb; - ya = twiddles[fstride*m]; - yb = twiddles[fstride*2*m]; - - Fout0=Fout; - Fout1=Fout0+m; - Fout2=Fout0+2*m; - Fout3=Fout0+3*m; - Fout4=Fout0+4*m; - - tw=st->twiddles; - for ( u=0; uinverse) { - C_FIXDIV( *Fout0,5); C_FIXDIV( *Fout1,5); C_FIXDIV( *Fout2,5); C_FIXDIV( *Fout3,5); C_FIXDIV( *Fout4,5); - } - scratch[0] = *Fout0; - - C_MUL(scratch[1] ,*Fout1, tw[u*fstride]); - C_MUL(scratch[2] ,*Fout2, tw[2*u*fstride]); - C_MUL(scratch[3] ,*Fout3, tw[3*u*fstride]); - C_MUL(scratch[4] ,*Fout4, tw[4*u*fstride]); - - C_ADD( scratch[7],scratch[1],scratch[4]); - C_SUB( scratch[10],scratch[1],scratch[4]); - C_ADD( scratch[8],scratch[2],scratch[3]); - C_SUB( scratch[9],scratch[2],scratch[3]); - - Fout0->r += scratch[7].r + scratch[8].r; - Fout0->i += scratch[7].i + scratch[8].i; - - scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r); - scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r); - - scratch[6].r = S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i); - scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); - - C_SUB(*Fout1,scratch[5],scratch[6]); - C_ADD(*Fout4,scratch[5],scratch[6]); - - scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r); - scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r); - scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i); - scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); - - C_ADD(*Fout2,scratch[11],scratch[12]); - C_SUB(*Fout3,scratch[11],scratch[12]); - - ++Fout0;++Fout1;++Fout2;++Fout3;++Fout4; - } -} - -/* perform the butterfly for one stage of a mixed radix FFT */ -static void kf_bfly_generic( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m, - int p - ) -{ - int u,k,q1,q; - kiss_fft_cpx * twiddles = st->twiddles; - kiss_fft_cpx t; - kiss_fft_cpx scratchbuf[17]; - int Norig = st->nfft; - - /*CHECKBUF(scratchbuf,nscratchbuf,p);*/ - if (p>17) - speex_fatal("KissFFT: max radix supported is 17"); - - for ( u=0; uinverse) { - C_FIXDIV(scratchbuf[q1],p); - } - k += m; - } - - k=u; - for ( q1=0 ; q1

=Norig) twidx-=Norig; - C_MUL(t,scratchbuf[q] , twiddles[twidx] ); - C_ADDTO( Fout[ k ] ,t); - } - k += m; - } - } -} - -static -void kf_shuffle( - kiss_fft_cpx * Fout, - const kiss_fft_cpx * f, - const size_t fstride, - int in_stride, - int * factors, - const kiss_fft_cfg st - ) -{ - const int p=*factors++; /* the radix */ - const int m=*factors++; /* stage's fft length/p */ - - /*printf ("fft %d %d %d %d %d %d\n", p*m, m, p, s2, fstride*in_stride, N);*/ - if (m==1) - { - int j; - for (j=0;j32000 || (spx_int32_t)p*(spx_int32_t)p > n) - p = n; /* no more factors, skip to end */ - } - n /= p; - *facbuf++ = p; - *facbuf++ = n; - } while (n > 1); -} -/* - * - * User-callable function to allocate all necessary storage space for the fft. - * - * The return value is a contiguous block of memory, allocated with malloc. As such, - * It can be freed with free(), rather than a kiss_fft-specific function. - * */ -kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem ) -{ - kiss_fft_cfg st=NULL; - size_t memneeded = sizeof(struct kiss_fft_state) - + sizeof(kiss_fft_cpx)*(nfft-1); /* twiddle factors*/ - - if ( lenmem==NULL ) { - st = ( kiss_fft_cfg)KISS_FFT_MALLOC( memneeded ); - }else{ - if (mem != NULL && *lenmem >= memneeded) - st = (kiss_fft_cfg)mem; - *lenmem = memneeded; - } - if (st) { - int i; - st->nfft=nfft; - st->inverse = inverse_fft; -#ifdef FIXED_POINT - for (i=0;iinverse) - phase = -phase; - kf_cexp2(st->twiddles+i, DIV32(SHL32(phase,17),nfft)); - } -#else - for (i=0;iinverse) - phase *= -1; - kf_cexp(st->twiddles+i, phase ); - } -#endif - kf_factor(nfft,st->factors); - } - return st; -} - - - - -void kiss_fft_stride(kiss_fft_cfg st,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int in_stride) -{ - if (fin == fout) - { - speex_fatal("In-place FFT not supported"); - /*CHECKBUF(tmpbuf,ntmpbuf,st->nfft); - kf_work(tmpbuf,fin,1,in_stride, st->factors,st); - SPEEX_MOVE(fout,tmpbuf,st->nfft);*/ - } else { - kf_shuffle( fout, fin, 1,in_stride, st->factors,st); - kf_work( fout, fin, 1,in_stride, st->factors,st, 1, in_stride, 1); - } -} - -void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout) -{ - kiss_fft_stride(cfg,fin,fout,1); -} - diff --git a/speex/libspeexdsp/kiss_fft.h b/speex/libspeexdsp/kiss_fft.h deleted file mode 100644 index bb19eadbd..000000000 --- a/speex/libspeexdsp/kiss_fft.h +++ /dev/null @@ -1,108 +0,0 @@ -#ifndef KISS_FFT_H -#define KISS_FFT_H - -#include -#include -#include "arch.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* - ATTENTION! - If you would like a : - -- a utility that will handle the caching of fft objects - -- real-only (no imaginary time component ) FFT - -- a multi-dimensional FFT - -- a command-line utility to perform ffts - -- a command-line utility to perform fast-convolution filtering - - Then see kfc.h kiss_fftr.h kiss_fftnd.h fftutil.c kiss_fastfir.c - in the tools/ directory. -*/ - -#ifdef USE_SIMD -# include -# define kiss_fft_scalar __m128 -#define KISS_FFT_MALLOC(nbytes) memalign(16,nbytes) -#else -#define KISS_FFT_MALLOC speex_alloc -#endif - - -#ifdef FIXED_POINT -#include "arch.h" -# define kiss_fft_scalar spx_int16_t -#else -# ifndef kiss_fft_scalar -/* default is float */ -# define kiss_fft_scalar float -# endif -#endif - -typedef struct { - kiss_fft_scalar r; - kiss_fft_scalar i; -}kiss_fft_cpx; - -typedef struct kiss_fft_state* kiss_fft_cfg; - -/* - * kiss_fft_alloc - * - * Initialize a FFT (or IFFT) algorithm's cfg/state buffer. - * - * typical usage: kiss_fft_cfg mycfg=kiss_fft_alloc(1024,0,NULL,NULL); - * - * The return value from fft_alloc is a cfg buffer used internally - * by the fft routine or NULL. - * - * If lenmem is NULL, then kiss_fft_alloc will allocate a cfg buffer using malloc. - * The returned value should be free()d when done to avoid memory leaks. - * - * The state can be placed in a user supplied buffer 'mem': - * If lenmem is not NULL and mem is not NULL and *lenmem is large enough, - * then the function places the cfg in mem and the size used in *lenmem - * and returns mem. - * - * If lenmem is not NULL and ( mem is NULL or *lenmem is not large enough), - * then the function returns NULL and places the minimum cfg - * buffer size in *lenmem. - * */ - -kiss_fft_cfg kiss_fft_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem); - -/* - * kiss_fft(cfg,in_out_buf) - * - * Perform an FFT on a complex input buffer. - * for a forward FFT, - * fin should be f[0] , f[1] , ... ,f[nfft-1] - * fout will be F[0] , F[1] , ... ,F[nfft-1] - * Note that each element is complex and can be accessed like - f[k].r and f[k].i - * */ -void kiss_fft(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout); - -/* - A more generic version of the above function. It reads its input from every Nth sample. - * */ -void kiss_fft_stride(kiss_fft_cfg cfg,const kiss_fft_cpx *fin,kiss_fft_cpx *fout,int fin_stride); - -/* If kiss_fft_alloc allocated a buffer, it is one contiguous - buffer and can be simply free()d when no longer needed*/ -#define kiss_fft_free speex_free - -/* - Cleans up some memory that gets managed internally. Not necessary to call, but it might clean up - your compiler output to call this before you exit. -*/ -void kiss_fft_cleanup(void); - - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/speex/libspeexdsp/kiss_fftr.c b/speex/libspeexdsp/kiss_fftr.c deleted file mode 100644 index 827e0b14d..000000000 --- a/speex/libspeexdsp/kiss_fftr.c +++ /dev/null @@ -1,297 +0,0 @@ -/* -Copyright (c) 2003-2004, Mark Borgerding - -All rights reserved. - -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 author nor the names of any 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 COPYRIGHT OWNER 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. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "os_support.h" -#include "kiss_fftr.h" -#include "_kiss_fft_guts.h" - -struct kiss_fftr_state{ - kiss_fft_cfg substate; - kiss_fft_cpx * tmpbuf; - kiss_fft_cpx * super_twiddles; -#ifdef USE_SIMD - long pad; -#endif -}; - -kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem,size_t * lenmem) -{ - int i; - kiss_fftr_cfg st = NULL; - size_t subsize, memneeded; - - if (nfft & 1) { - speex_warning("Real FFT optimization must be even.\n"); - return NULL; - } - nfft >>= 1; - - kiss_fft_alloc (nfft, inverse_fft, NULL, &subsize); - memneeded = sizeof(struct kiss_fftr_state) + subsize + sizeof(kiss_fft_cpx) * ( nfft * 2); - - if (lenmem == NULL) { - st = (kiss_fftr_cfg) KISS_FFT_MALLOC (memneeded); - } else { - if (*lenmem >= memneeded) - st = (kiss_fftr_cfg) mem; - *lenmem = memneeded; - } - if (!st) - return NULL; - - st->substate = (kiss_fft_cfg) (st + 1); /*just beyond kiss_fftr_state struct */ - st->tmpbuf = (kiss_fft_cpx *) (((char *) st->substate) + subsize); - st->super_twiddles = st->tmpbuf + nfft; - kiss_fft_alloc(nfft, inverse_fft, st->substate, &subsize); - -#ifdef FIXED_POINT - for (i=0;i>1); - if (!inverse_fft) - phase = -phase; - kf_cexp2(st->super_twiddles+i, DIV32(SHL32(phase,16),nfft)); - } -#else - for (i=0;isuper_twiddles+i, phase ); - } -#endif - return st; -} - -void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata) -{ - /* input buffer timedata is stored row-wise */ - int k,ncfft; - kiss_fft_cpx fpnk,fpk,f1k,f2k,tw,tdc; - - if ( st->substate->inverse) { - speex_fatal("kiss fft usage error: improper alloc\n"); - } - - ncfft = st->substate->nfft; - - /*perform the parallel fft of two real signals packed in real,imag*/ - kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); - /* The real part of the DC element of the frequency spectrum in st->tmpbuf - * contains the sum of the even-numbered elements of the input time sequence - * The imag part is the sum of the odd-numbered elements - * - * The sum of tdc.r and tdc.i is the sum of the input time sequence. - * yielding DC of input time sequence - * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... - * yielding Nyquist bin of input time sequence - */ - - tdc.r = st->tmpbuf[0].r; - tdc.i = st->tmpbuf[0].i; - C_FIXDIV(tdc,2); - CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); - CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); - freqdata[0].r = tdc.r + tdc.i; - freqdata[ncfft].r = tdc.r - tdc.i; -#ifdef USE_SIMD - freqdata[ncfft].i = freqdata[0].i = _mm_set1_ps(0); -#else - freqdata[ncfft].i = freqdata[0].i = 0; -#endif - - for ( k=1;k <= ncfft/2 ; ++k ) { - fpk = st->tmpbuf[k]; - fpnk.r = st->tmpbuf[ncfft-k].r; - fpnk.i = - st->tmpbuf[ncfft-k].i; - C_FIXDIV(fpk,2); - C_FIXDIV(fpnk,2); - - C_ADD( f1k, fpk , fpnk ); - C_SUB( f2k, fpk , fpnk ); - C_MUL( tw , f2k , st->super_twiddles[k]); - - freqdata[k].r = HALF_OF(f1k.r + tw.r); - freqdata[k].i = HALF_OF(f1k.i + tw.i); - freqdata[ncfft-k].r = HALF_OF(f1k.r - tw.r); - freqdata[ncfft-k].i = HALF_OF(tw.i - f1k.i); - } -} - -void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx *freqdata, kiss_fft_scalar *timedata) -{ - /* input buffer timedata is stored row-wise */ - int k, ncfft; - - if (st->substate->inverse == 0) { - speex_fatal("kiss fft usage error: improper alloc\n"); - } - - ncfft = st->substate->nfft; - - st->tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; - st->tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; - /*C_FIXDIV(st->tmpbuf[0],2);*/ - - for (k = 1; k <= ncfft / 2; ++k) { - kiss_fft_cpx fk, fnkc, fek, fok, tmp; - fk = freqdata[k]; - fnkc.r = freqdata[ncfft - k].r; - fnkc.i = -freqdata[ncfft - k].i; - /*C_FIXDIV( fk , 2 ); - C_FIXDIV( fnkc , 2 );*/ - - C_ADD (fek, fk, fnkc); - C_SUB (tmp, fk, fnkc); - C_MUL (fok, tmp, st->super_twiddles[k]); - C_ADD (st->tmpbuf[k], fek, fok); - C_SUB (st->tmpbuf[ncfft - k], fek, fok); -#ifdef USE_SIMD - st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); -#else - st->tmpbuf[ncfft - k].i *= -1; -#endif - } - kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); -} - -void kiss_fftr2(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata) -{ - /* input buffer timedata is stored row-wise */ - int k,ncfft; - kiss_fft_cpx f2k,tdc; - spx_word32_t f1kr, f1ki, twr, twi; - - if ( st->substate->inverse) { - speex_fatal("kiss fft usage error: improper alloc\n"); - } - - ncfft = st->substate->nfft; - - /*perform the parallel fft of two real signals packed in real,imag*/ - kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf ); - /* The real part of the DC element of the frequency spectrum in st->tmpbuf - * contains the sum of the even-numbered elements of the input time sequence - * The imag part is the sum of the odd-numbered elements - * - * The sum of tdc.r and tdc.i is the sum of the input time sequence. - * yielding DC of input time sequence - * The difference of tdc.r - tdc.i is the sum of the input (dot product) [1,-1,1,-1... - * yielding Nyquist bin of input time sequence - */ - - tdc.r = st->tmpbuf[0].r; - tdc.i = st->tmpbuf[0].i; - C_FIXDIV(tdc,2); - CHECK_OVERFLOW_OP(tdc.r ,+, tdc.i); - CHECK_OVERFLOW_OP(tdc.r ,-, tdc.i); - freqdata[0] = tdc.r + tdc.i; - freqdata[2*ncfft-1] = tdc.r - tdc.i; - - for ( k=1;k <= ncfft/2 ; ++k ) - { - /*fpk = st->tmpbuf[k]; - fpnk.r = st->tmpbuf[ncfft-k].r; - fpnk.i = - st->tmpbuf[ncfft-k].i; - C_FIXDIV(fpk,2); - C_FIXDIV(fpnk,2); - - C_ADD( f1k, fpk , fpnk ); - C_SUB( f2k, fpk , fpnk ); - - C_MUL( tw , f2k , st->super_twiddles[k]); - - freqdata[2*k-1] = HALF_OF(f1k.r + tw.r); - freqdata[2*k] = HALF_OF(f1k.i + tw.i); - freqdata[2*(ncfft-k)-1] = HALF_OF(f1k.r - tw.r); - freqdata[2*(ncfft-k)] = HALF_OF(tw.i - f1k.i); - */ - - /*f1k.r = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); - f1k.i = PSHR32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); - f2k.r = PSHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); - f2k.i = SHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); - - C_MUL( tw , f2k , st->super_twiddles[k]); - - freqdata[2*k-1] = HALF_OF(f1k.r + tw.r); - freqdata[2*k] = HALF_OF(f1k.i + tw.i); - freqdata[2*(ncfft-k)-1] = HALF_OF(f1k.r - tw.r); - freqdata[2*(ncfft-k)] = HALF_OF(tw.i - f1k.i); - */ - f2k.r = SHR32(SUB32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),1); - f2k.i = PSHR32(ADD32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),1); - - f1kr = SHL32(ADD32(EXTEND32(st->tmpbuf[k].r), EXTEND32(st->tmpbuf[ncfft-k].r)),13); - f1ki = SHL32(SUB32(EXTEND32(st->tmpbuf[k].i), EXTEND32(st->tmpbuf[ncfft-k].i)),13); - - twr = SHR32(SUB32(MULT16_16(f2k.r,st->super_twiddles[k].r),MULT16_16(f2k.i,st->super_twiddles[k].i)), 1); - twi = SHR32(ADD32(MULT16_16(f2k.i,st->super_twiddles[k].r),MULT16_16(f2k.r,st->super_twiddles[k].i)), 1); - -#ifdef FIXED_POINT - freqdata[2*k-1] = PSHR32(f1kr + twr, 15); - freqdata[2*k] = PSHR32(f1ki + twi, 15); - freqdata[2*(ncfft-k)-1] = PSHR32(f1kr - twr, 15); - freqdata[2*(ncfft-k)] = PSHR32(twi - f1ki, 15); -#else - freqdata[2*k-1] = .5f*(f1kr + twr); - freqdata[2*k] = .5f*(f1ki + twi); - freqdata[2*(ncfft-k)-1] = .5f*(f1kr - twr); - freqdata[2*(ncfft-k)] = .5f*(twi - f1ki); - -#endif - } -} - -void kiss_fftri2(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata,kiss_fft_scalar *timedata) -{ - /* input buffer timedata is stored row-wise */ - int k, ncfft; - - if (st->substate->inverse == 0) { - speex_fatal ("kiss fft usage error: improper alloc\n"); - } - - ncfft = st->substate->nfft; - - st->tmpbuf[0].r = freqdata[0] + freqdata[2*ncfft-1]; - st->tmpbuf[0].i = freqdata[0] - freqdata[2*ncfft-1]; - /*C_FIXDIV(st->tmpbuf[0],2);*/ - - for (k = 1; k <= ncfft / 2; ++k) { - kiss_fft_cpx fk, fnkc, fek, fok, tmp; - fk.r = freqdata[2*k-1]; - fk.i = freqdata[2*k]; - fnkc.r = freqdata[2*(ncfft - k)-1]; - fnkc.i = -freqdata[2*(ncfft - k)]; - /*C_FIXDIV( fk , 2 ); - C_FIXDIV( fnkc , 2 );*/ - - C_ADD (fek, fk, fnkc); - C_SUB (tmp, fk, fnkc); - C_MUL (fok, tmp, st->super_twiddles[k]); - C_ADD (st->tmpbuf[k], fek, fok); - C_SUB (st->tmpbuf[ncfft - k], fek, fok); -#ifdef USE_SIMD - st->tmpbuf[ncfft - k].i *= _mm_set1_ps(-1.0); -#else - st->tmpbuf[ncfft - k].i *= -1; -#endif - } - kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); -} diff --git a/speex/libspeexdsp/kiss_fftr.h b/speex/libspeexdsp/kiss_fftr.h deleted file mode 100644 index 8cfeda138..000000000 --- a/speex/libspeexdsp/kiss_fftr.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef KISS_FTR_H -#define KISS_FTR_H - -#include "kiss_fft.h" -#ifdef __cplusplus -extern "C" { -#endif - - -/* - - Real optimized version can save about 45% cpu time vs. complex fft of a real seq. - - - - */ - -typedef struct kiss_fftr_state *kiss_fftr_cfg; - - -kiss_fftr_cfg kiss_fftr_alloc(int nfft,int inverse_fft,void * mem, size_t * lenmem); -/* - nfft must be even - - If you don't care to allocate space, use mem = lenmem = NULL -*/ - - -void kiss_fftr(kiss_fftr_cfg cfg,const kiss_fft_scalar *timedata,kiss_fft_cpx *freqdata); -/* - input timedata has nfft scalar points - output freqdata has nfft/2+1 complex points -*/ - -void kiss_fftr2(kiss_fftr_cfg st,const kiss_fft_scalar *timedata,kiss_fft_scalar *freqdata); - -void kiss_fftri(kiss_fftr_cfg cfg,const kiss_fft_cpx *freqdata,kiss_fft_scalar *timedata); - -void kiss_fftri2(kiss_fftr_cfg st,const kiss_fft_scalar *freqdata, kiss_fft_scalar *timedata); - -/* - input freqdata has nfft/2+1 complex points - output timedata has nfft scalar points -*/ - -#define kiss_fftr_free speex_free - -#ifdef __cplusplus -} -#endif -#endif diff --git a/speex/libspeexdsp/math_approx.h b/speex/libspeexdsp/math_approx.h deleted file mode 100644 index 596dfdc1b..000000000 --- a/speex/libspeexdsp/math_approx.h +++ /dev/null @@ -1,332 +0,0 @@ -/* Copyright (C) 2002 Jean-Marc Valin */ -/** - @file math_approx.h - @brief Various math approximation functions for Speex -*/ -/* - 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. -*/ - -#ifndef MATH_APPROX_H -#define MATH_APPROX_H - -#include "arch.h" - -#ifndef FIXED_POINT - -#define spx_sqrt sqrt -#define spx_acos acos -#define spx_exp exp -#define spx_cos_norm(x) (cos((.5f*M_PI)*(x))) -#define spx_atan atan - -/** Generate a pseudo-random number */ -static inline spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed) -{ - const unsigned int jflone = 0x3f800000; - const unsigned int jflmsk = 0x007fffff; - union {int i; float f;} ran; - *seed = 1664525 * *seed + 1013904223; - ran.i = jflone | (jflmsk & *seed); - ran.f -= 1.5; - return 3.4642*std*ran.f; -} - - -#endif - - -static inline spx_int16_t spx_ilog2(spx_uint32_t x) -{ - int r=0; - if (x>=(spx_int32_t)65536) - { - x >>= 16; - r += 16; - } - if (x>=256) - { - x >>= 8; - r += 8; - } - if (x>=16) - { - x >>= 4; - r += 4; - } - if (x>=4) - { - x >>= 2; - r += 2; - } - if (x>=2) - { - r += 1; - } - return r; -} - -static inline spx_int16_t spx_ilog4(spx_uint32_t x) -{ - int r=0; - if (x>=(spx_int32_t)65536) - { - x >>= 16; - r += 8; - } - if (x>=256) - { - x >>= 8; - r += 4; - } - if (x>=16) - { - x >>= 4; - r += 2; - } - if (x>=4) - { - r += 1; - } - return r; -} - -#ifdef FIXED_POINT - -/** Generate a pseudo-random number */ -static inline spx_word16_t speex_rand(spx_word16_t std, spx_int32_t *seed) -{ - spx_word32_t res; - *seed = 1664525 * *seed + 1013904223; - res = MULT16_16(EXTRACT16(SHR32(*seed,16)),std); - return EXTRACT16(PSHR32(SUB32(res, SHR32(res, 3)),14)); -} - -/* sqrt(x) ~= 0.22178 + 1.29227*x - 0.77070*x^2 + 0.25723*x^3 (for .25 < x < 1) */ -/*#define C0 3634 -#define C1 21173 -#define C2 -12627 -#define C3 4215*/ - -/* sqrt(x) ~= 0.22178 + 1.29227*x - 0.77070*x^2 + 0.25659*x^3 (for .25 < x < 1) */ -#define C0 3634 -#define C1 21173 -#define C2 -12627 -#define C3 4204 - -static inline spx_word16_t spx_sqrt(spx_word32_t x) -{ - int k; - spx_word32_t rt; - k = spx_ilog4(x)-6; - x = VSHR32(x, (k<<1)); - rt = ADD16(C0, MULT16_16_Q14(x, ADD16(C1, MULT16_16_Q14(x, ADD16(C2, MULT16_16_Q14(x, (C3))))))); - rt = VSHR32(rt,7-k); - return rt; -} - -/* log(x) ~= -2.18151 + 4.20592*x - 2.88938*x^2 + 0.86535*x^3 (for .5 < x < 1) */ - - -#define A1 16469 -#define A2 2242 -#define A3 1486 - -static inline spx_word16_t spx_acos(spx_word16_t x) -{ - int s=0; - spx_word16_t ret; - spx_word16_t sq; - if (x<0) - { - s=1; - x = NEG16(x); - } - x = SUB16(16384,x); - - x = x >> 1; - sq = MULT16_16_Q13(x, ADD16(A1, MULT16_16_Q13(x, ADD16(A2, MULT16_16_Q13(x, (A3)))))); - ret = spx_sqrt(SHL32(EXTEND32(sq),13)); - - /*ret = spx_sqrt(67108864*(-1.6129e-04 + 2.0104e+00*f + 2.7373e-01*f*f + 1.8136e-01*f*f*f));*/ - if (s) - ret = SUB16(25736,ret); - return ret; -} - - -#define K1 8192 -#define K2 -4096 -#define K3 340 -#define K4 -10 - -static inline spx_word16_t spx_cos(spx_word16_t x) -{ - spx_word16_t x2; - - if (x<12868) - { - x2 = MULT16_16_P13(x,x); - return ADD32(K1, MULT16_16_P13(x2, ADD32(K2, MULT16_16_P13(x2, ADD32(K3, MULT16_16_P13(K4, x2)))))); - } else { - x = SUB16(25736,x); - x2 = MULT16_16_P13(x,x); - return SUB32(-K1, MULT16_16_P13(x2, ADD32(K2, MULT16_16_P13(x2, ADD32(K3, MULT16_16_P13(K4, x2)))))); - } -} - -#define L1 32767 -#define L2 -7651 -#define L3 8277 -#define L4 -626 - -static inline spx_word16_t _spx_cos_pi_2(spx_word16_t x) -{ - spx_word16_t x2; - - x2 = MULT16_16_P15(x,x); - return ADD16(1,MIN16(32766,ADD32(SUB16(L1,x2), MULT16_16_P15(x2, ADD32(L2, MULT16_16_P15(x2, ADD32(L3, MULT16_16_P15(L4, x2)))))))); -} - -static inline spx_word16_t spx_cos_norm(spx_word32_t x) -{ - x = x&0x0001ffff; - if (x>SHL32(EXTEND32(1), 16)) - x = SUB32(SHL32(EXTEND32(1), 17),x); - if (x&0x00007fff) - { - if (x14) - return 0x7fffffff; - else if (integer < -15) - return 0; - frac = SHL16(x-SHL16(integer,11),3); - frac = ADD16(D0, MULT16_16_Q14(frac, ADD16(D1, MULT16_16_Q14(frac, ADD16(D2 , MULT16_16_Q14(D3,frac)))))); - return VSHR32(EXTEND32(frac), -integer-2); -} - -/* Input in Q11 format, output in Q16 */ -static inline spx_word32_t spx_exp(spx_word16_t x) -{ - if (x>21290) - return 0x7fffffff; - else if (x<-21290) - return 0; - else - return spx_exp2(MULT16_16_P14(23637,x)); -} -#define M1 32767 -#define M2 -21 -#define M3 -11943 -#define M4 4936 - -static inline spx_word16_t spx_atan01(spx_word16_t x) -{ - return MULT16_16_P15(x, ADD32(M1, MULT16_16_P15(x, ADD32(M2, MULT16_16_P15(x, ADD32(M3, MULT16_16_P15(M4, x))))))); -} - -#undef M1 -#undef M2 -#undef M3 -#undef M4 - -/* Input in Q15, output in Q14 */ -static inline spx_word16_t spx_atan(spx_word32_t x) -{ - if (x <= 32767) - { - return SHR16(spx_atan01(x),1); - } else { - int e = spx_ilog2(x); - if (e>=29) - return 25736; - x = DIV32_16(SHL32(EXTEND32(32767),29-e), EXTRACT16(SHR32(x, e-14))); - return SUB16(25736, SHR16(spx_atan01(x),1)); - } -} -#else - -#ifndef M_PI -#define M_PI 3.14159265358979323846 /* pi */ -#endif - -#define C1 0.9999932946f -#define C2 -0.4999124376f -#define C3 0.0414877472f -#define C4 -0.0012712095f - - -#define SPX_PI_2 1.5707963268 -static inline spx_word16_t spx_cos(spx_word16_t x) -{ - if (x>16) - -#else - -static const spx_float_t MIN_LEAK = .005f; - -/* Constants for the two-path filter */ -static const spx_float_t VAR1_SMOOTH = .36f; -static const spx_float_t VAR2_SMOOTH = .7225f; -static const spx_float_t VAR1_UPDATE = .5f; -static const spx_float_t VAR2_UPDATE = .25f; -static const spx_float_t VAR_BACKTRACK = 4.f; -#define TOP16(x) (x) -#endif - - -#define PLAYBACK_DELAY 2 - -void speex_echo_get_residual(SpeexEchoState *st, spx_word32_t *Yout, int len); - - -/** Speex echo cancellation state. */ -struct SpeexEchoState_ { - int frame_size; /**< Number of samples processed each time */ - int window_size; - int M; - int cancel_count; - int adapted; - int saturated; - int screwed_up; - int C; /** Number of input channels (microphones) */ - int K; /** Number of output channels (loudspeakers) */ - spx_int32_t sampling_rate; - spx_word16_t spec_average; - spx_word16_t beta0; - spx_word16_t beta_max; - spx_word32_t sum_adapt; - spx_word16_t leak_estimate; - - spx_word16_t *e; /* scratch */ - spx_word16_t *x; /* Far-end input buffer (2N) */ - spx_word16_t *X; /* Far-end buffer (M+1 frames) in frequency domain */ - spx_word16_t *input; /* scratch */ - spx_word16_t *y; /* scratch */ - spx_word16_t *last_y; - spx_word16_t *Y; /* scratch */ - spx_word16_t *E; - spx_word32_t *PHI; /* scratch */ - spx_word32_t *W; /* (Background) filter weights */ -#ifdef TWO_PATH - spx_word16_t *foreground; /* Foreground filter weights */ - spx_word32_t Davg1; /* 1st recursive average of the residual power difference */ - spx_word32_t Davg2; /* 2nd recursive average of the residual power difference */ - spx_float_t Dvar1; /* Estimated variance of 1st estimator */ - spx_float_t Dvar2; /* Estimated variance of 2nd estimator */ -#endif - spx_word32_t *power; /* Power of the far-end signal */ - spx_float_t *power_1;/* Inverse power of far-end */ - spx_word16_t *wtmp; /* scratch */ -#ifdef FIXED_POINT - spx_word16_t *wtmp2; /* scratch */ -#endif - spx_word32_t *Rf; /* scratch */ - spx_word32_t *Yf; /* scratch */ - spx_word32_t *Xf; /* scratch */ - spx_word32_t *Eh; - spx_word32_t *Yh; - spx_float_t Pey; - spx_float_t Pyy; - spx_word16_t *window; - spx_word16_t *prop; - void *fft_table; - spx_word16_t *memX, *memD, *memE; - spx_word16_t preemph; - spx_word16_t notch_radius; - spx_mem_t *notch_mem; - - /* NOTE: If you only use speex_echo_cancel() and want to save some memory, remove this */ - spx_int16_t *play_buf; - int play_buf_pos; - int play_buf_started; -}; - -static inline void filter_dc_notch16(const spx_int16_t *in, spx_word16_t radius, spx_word16_t *out, int len, spx_mem_t *mem, int stride) -{ - int i; - spx_word16_t den2; -#ifdef FIXED_POINT - den2 = MULT16_16_Q15(radius,radius) + MULT16_16_Q15(QCONST16(.7,15),MULT16_16_Q15(32767-radius,32767-radius)); -#else - den2 = radius*radius + .7*(1-radius)*(1-radius); -#endif - /*printf ("%d %d %d %d %d %d\n", num[0], num[1], num[2], den[0], den[1], den[2]);*/ - for (i=0;i>= 1; - while(len--) - { - spx_word32_t part=0; - part = MAC16_16(part,*x++,*y++); - part = MAC16_16(part,*x++,*y++); - /* HINT: If you had a 40-bit accumulator, you could shift only at the end */ - sum = ADD32(sum,SHR32(part,6)); - } - return sum; -} - -/** Compute power spectrum of a half-complex (packed) vector */ -static inline void power_spectrum(const spx_word16_t *X, spx_word32_t *ps, int N) -{ - int i, j; - ps[0]=MULT16_16(X[0],X[0]); - for (i=1,j=1;i max_sum) - max_sum = prop[i]; - } - for (i=0;i -static FILE *rFile=NULL, *pFile=NULL, *oFile=NULL; - -static void dump_audio(const spx_int16_t *rec, const spx_int16_t *play, const spx_int16_t *out, int len) -{ - if (!(rFile && pFile && oFile)) - { - speex_fatal("Dump files not open"); - } - fwrite(rec, sizeof(spx_int16_t), len, rFile); - fwrite(play, sizeof(spx_int16_t), len, pFile); - fwrite(out, sizeof(spx_int16_t), len, oFile); -} -#endif - -/** Creates a new echo canceller state */ -EXPORT SpeexEchoState *speex_echo_state_init(int frame_size, int filter_length) -{ - return speex_echo_state_init_mc(frame_size, filter_length, 1, 1); -} - -EXPORT SpeexEchoState *speex_echo_state_init_mc(int frame_size, int filter_length, int nb_mic, int nb_speakers) -{ - int i,N,M, C, K; - SpeexEchoState *st = (SpeexEchoState *)speex_alloc(sizeof(SpeexEchoState)); - - st->K = nb_speakers; - st->C = nb_mic; - C=st->C; - K=st->K; -#ifdef DUMP_ECHO_CANCEL_DATA - if (rFile || pFile || oFile) - speex_fatal("Opening dump files twice"); - rFile = fopen("aec_rec.sw", "wb"); - pFile = fopen("aec_play.sw", "wb"); - oFile = fopen("aec_out.sw", "wb"); -#endif - - st->frame_size = frame_size; - st->window_size = 2*frame_size; - N = st->window_size; - M = st->M = (filter_length+st->frame_size-1)/frame_size; - st->cancel_count=0; - st->sum_adapt = 0; - st->saturated = 0; - st->screwed_up = 0; - /* This is the default sampling rate */ - st->sampling_rate = 8000; - st->spec_average = DIV32_16(SHL32(EXTEND32(st->frame_size), 15), st->sampling_rate); -#ifdef FIXED_POINT - st->beta0 = DIV32_16(SHL32(EXTEND32(st->frame_size), 16), st->sampling_rate); - st->beta_max = DIV32_16(SHL32(EXTEND32(st->frame_size), 14), st->sampling_rate); -#else - st->beta0 = (2.0f*st->frame_size)/st->sampling_rate; - st->beta_max = (.5f*st->frame_size)/st->sampling_rate; -#endif - st->leak_estimate = 0; - - st->fft_table = spx_fft_init(N); - - st->e = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); - st->x = (spx_word16_t*)speex_alloc(K*N*sizeof(spx_word16_t)); - st->input = (spx_word16_t*)speex_alloc(C*st->frame_size*sizeof(spx_word16_t)); - st->y = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); - st->last_y = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); - st->Yf = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); - st->Rf = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); - st->Xf = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); - st->Yh = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); - st->Eh = (spx_word32_t*)speex_alloc((st->frame_size+1)*sizeof(spx_word32_t)); - - st->X = (spx_word16_t*)speex_alloc(K*(M+1)*N*sizeof(spx_word16_t)); - st->Y = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); - st->E = (spx_word16_t*)speex_alloc(C*N*sizeof(spx_word16_t)); - st->W = (spx_word32_t*)speex_alloc(C*K*M*N*sizeof(spx_word32_t)); -#ifdef TWO_PATH - st->foreground = (spx_word16_t*)speex_alloc(M*N*C*K*sizeof(spx_word16_t)); -#endif - st->PHI = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); - st->power = (spx_word32_t*)speex_alloc((frame_size+1)*sizeof(spx_word32_t)); - st->power_1 = (spx_float_t*)speex_alloc((frame_size+1)*sizeof(spx_float_t)); - st->window = (spx_word16_t*)speex_alloc(N*sizeof(spx_word16_t)); - st->prop = (spx_word16_t*)speex_alloc(M*sizeof(spx_word16_t)); - st->wtmp = (spx_word16_t*)speex_alloc(N*sizeof(spx_word16_t)); -#ifdef FIXED_POINT - st->wtmp2 = (spx_word16_t*)speex_alloc(N*sizeof(spx_word16_t)); - for (i=0;i>1;i++) - { - st->window[i] = (16383-SHL16(spx_cos(DIV32_16(MULT16_16(25736,i<<1),N)),1)); - st->window[N-i-1] = st->window[i]; - } -#else - for (i=0;iwindow[i] = .5-.5*cos(2*M_PI*i/N); -#endif - for (i=0;i<=st->frame_size;i++) - st->power_1[i] = FLOAT_ONE; - for (i=0;iW[i] = 0; - { - spx_word32_t sum = 0; - /* Ratio of ~10 between adaptation rate of first and last block */ - spx_word16_t decay = SHR32(spx_exp(NEG16(DIV32_16(QCONST16(2.4,11),M))),1); - st->prop[0] = QCONST16(.7, 15); - sum = EXTEND32(st->prop[0]); - for (i=1;iprop[i] = MULT16_16_Q15(st->prop[i-1], decay); - sum = ADD32(sum, EXTEND32(st->prop[i])); - } - for (i=M-1;i>=0;i--) - { - st->prop[i] = DIV32(MULT16_16(QCONST16(.8f,15), st->prop[i]),sum); - } - } - - st->memX = (spx_word16_t*)speex_alloc(K*sizeof(spx_word16_t)); - st->memD = (spx_word16_t*)speex_alloc(C*sizeof(spx_word16_t)); - st->memE = (spx_word16_t*)speex_alloc(C*sizeof(spx_word16_t)); - st->preemph = QCONST16(.9,15); - if (st->sampling_rate<12000) - st->notch_radius = QCONST16(.9, 15); - else if (st->sampling_rate<24000) - st->notch_radius = QCONST16(.982, 15); - else - st->notch_radius = QCONST16(.992, 15); - - st->notch_mem = (spx_mem_t*)speex_alloc(2*C*sizeof(spx_mem_t)); - st->adapted = 0; - st->Pey = st->Pyy = FLOAT_ONE; - -#ifdef TWO_PATH - st->Davg1 = st->Davg2 = 0; - st->Dvar1 = st->Dvar2 = FLOAT_ZERO; -#endif - - st->play_buf = (spx_int16_t*)speex_alloc(K*(PLAYBACK_DELAY+1)*st->frame_size*sizeof(spx_int16_t)); - st->play_buf_pos = PLAYBACK_DELAY*st->frame_size; - st->play_buf_started = 0; - - return st; -} - -/** Resets echo canceller state */ -EXPORT void speex_echo_state_reset(SpeexEchoState *st) -{ - int i, M, N, C, K; - st->cancel_count=0; - st->screwed_up = 0; - N = st->window_size; - M = st->M; - C=st->C; - K=st->K; - for (i=0;iW[i] = 0; -#ifdef TWO_PATH - for (i=0;iforeground[i] = 0; -#endif - for (i=0;iX[i] = 0; - for (i=0;i<=st->frame_size;i++) - { - st->power[i] = 0; - st->power_1[i] = FLOAT_ONE; - st->Eh[i] = 0; - st->Yh[i] = 0; - } - for (i=0;iframe_size;i++) - { - st->last_y[i] = 0; - } - for (i=0;iE[i] = 0; - } - for (i=0;ix[i] = 0; - } - for (i=0;i<2*C;i++) - st->notch_mem[i] = 0; - for (i=0;imemD[i]=st->memE[i]=0; - for (i=0;imemX[i]=0; - - st->saturated = 0; - st->adapted = 0; - st->sum_adapt = 0; - st->Pey = st->Pyy = FLOAT_ONE; -#ifdef TWO_PATH - st->Davg1 = st->Davg2 = 0; - st->Dvar1 = st->Dvar2 = FLOAT_ZERO; -#endif - for (i=0;i<3*st->frame_size;i++) - st->play_buf[i] = 0; - st->play_buf_pos = PLAYBACK_DELAY*st->frame_size; - st->play_buf_started = 0; - -} - -/** Destroys an echo canceller state */ -EXPORT void speex_echo_state_destroy(SpeexEchoState *st) -{ - spx_fft_destroy(st->fft_table); - - speex_free(st->e); - speex_free(st->x); - speex_free(st->input); - speex_free(st->y); - speex_free(st->last_y); - speex_free(st->Yf); - speex_free(st->Rf); - speex_free(st->Xf); - speex_free(st->Yh); - speex_free(st->Eh); - - speex_free(st->X); - speex_free(st->Y); - speex_free(st->E); - speex_free(st->W); -#ifdef TWO_PATH - speex_free(st->foreground); -#endif - speex_free(st->PHI); - speex_free(st->power); - speex_free(st->power_1); - speex_free(st->window); - speex_free(st->prop); - speex_free(st->wtmp); -#ifdef FIXED_POINT - speex_free(st->wtmp2); -#endif - speex_free(st->memX); - speex_free(st->memD); - speex_free(st->memE); - speex_free(st->notch_mem); - - speex_free(st->play_buf); - speex_free(st); - -#ifdef DUMP_ECHO_CANCEL_DATA - fclose(rFile); - fclose(pFile); - fclose(oFile); - rFile = pFile = oFile = NULL; -#endif -} - -EXPORT void speex_echo_capture(SpeexEchoState *st, const spx_int16_t *rec, spx_int16_t *out) -{ - int i; - /*speex_warning_int("capture with fill level ", st->play_buf_pos/st->frame_size);*/ - st->play_buf_started = 1; - if (st->play_buf_pos>=st->frame_size) - { - speex_echo_cancellation(st, rec, st->play_buf, out); - st->play_buf_pos -= st->frame_size; - for (i=0;iplay_buf_pos;i++) - st->play_buf[i] = st->play_buf[i+st->frame_size]; - } else { - speex_warning("No playback frame available (your application is buggy and/or got xruns)"); - if (st->play_buf_pos!=0) - { - speex_warning("internal playback buffer corruption?"); - st->play_buf_pos = 0; - } - for (i=0;iframe_size;i++) - out[i] = rec[i]; - } -} - -EXPORT void speex_echo_playback(SpeexEchoState *st, const spx_int16_t *play) -{ - /*speex_warning_int("playback with fill level ", st->play_buf_pos/st->frame_size);*/ - if (!st->play_buf_started) - { - speex_warning("discarded first playback frame"); - return; - } - if (st->play_buf_pos<=PLAYBACK_DELAY*st->frame_size) - { - int i; - for (i=0;iframe_size;i++) - st->play_buf[st->play_buf_pos+i] = play[i]; - st->play_buf_pos += st->frame_size; - if (st->play_buf_pos <= (PLAYBACK_DELAY-1)*st->frame_size) - { - speex_warning("Auto-filling the buffer (your application is buggy and/or got xruns)"); - for (i=0;iframe_size;i++) - st->play_buf[st->play_buf_pos+i] = play[i]; - st->play_buf_pos += st->frame_size; - } - } else { - speex_warning("Had to discard a playback frame (your application is buggy and/or got xruns)"); - } -} - -/** Performs echo cancellation on a frame (deprecated, last arg now ignored) */ -EXPORT void speex_echo_cancel(SpeexEchoState *st, const spx_int16_t *in, const spx_int16_t *far_end, spx_int16_t *out, spx_int32_t *Yout) -{ - speex_echo_cancellation(st, in, far_end, out); -} - -/** Performs echo cancellation on a frame */ -EXPORT void speex_echo_cancellation(SpeexEchoState *st, const spx_int16_t *in, const spx_int16_t *far_end, spx_int16_t *out) -{ - int i,j, chan, speak; - int N,M, C, K; - spx_word32_t Syy,See,Sxx,Sdd, Sff; -#ifdef TWO_PATH - spx_word32_t Dbf; - int update_foreground; -#endif - spx_word32_t Sey; - spx_word16_t ss, ss_1; - spx_float_t Pey = FLOAT_ONE, Pyy=FLOAT_ONE; - spx_float_t alpha, alpha_1; - spx_word16_t RER; - spx_word32_t tmp32; - - N = st->window_size; - M = st->M; - C = st->C; - K = st->K; - - st->cancel_count++; -#ifdef FIXED_POINT - ss=DIV32_16(11469,M); - ss_1 = SUB16(32767,ss); -#else - ss=.35/M; - ss_1 = 1-ss; -#endif - - for (chan = 0; chan < C; chan++) - { - /* Apply a notch filter to make sure DC doesn't end up causing problems */ - filter_dc_notch16(in+chan, st->notch_radius, st->input+chan*st->frame_size, st->frame_size, st->notch_mem+2*chan, C); - /* Copy input data to buffer and apply pre-emphasis */ - /* Copy input data to buffer */ - for (i=0;iframe_size;i++) - { - spx_word32_t tmp32; - /* FIXME: This core has changed a bit, need to merge properly */ - tmp32 = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(MULT16_16_P15(st->preemph, st->memD[chan]))); -#ifdef FIXED_POINT - if (tmp32 > 32767) - { - tmp32 = 32767; - if (st->saturated == 0) - st->saturated = 1; - } - if (tmp32 < -32767) - { - tmp32 = -32767; - if (st->saturated == 0) - st->saturated = 1; - } -#endif - st->memD[chan] = st->input[chan*st->frame_size+i]; - st->input[chan*st->frame_size+i] = EXTRACT16(tmp32); - } - } - - for (speak = 0; speak < K; speak++) - { - for (i=0;iframe_size;i++) - { - spx_word32_t tmp32; - st->x[speak*N+i] = st->x[speak*N+i+st->frame_size]; - tmp32 = SUB32(EXTEND32(far_end[i*K+speak]), EXTEND32(MULT16_16_P15(st->preemph, st->memX[speak]))); -#ifdef FIXED_POINT - /*FIXME: If saturation occurs here, we need to freeze adaptation for M frames (not just one) */ - if (tmp32 > 32767) - { - tmp32 = 32767; - st->saturated = M+1; - } - if (tmp32 < -32767) - { - tmp32 = -32767; - st->saturated = M+1; - } -#endif - st->x[speak*N+i+st->frame_size] = EXTRACT16(tmp32); - st->memX[speak] = far_end[i*K+speak]; - } - } - - for (speak = 0; speak < K; speak++) - { - /* Shift memory: this could be optimized eventually*/ - for (j=M-1;j>=0;j--) - { - for (i=0;iX[(j+1)*N*K+speak*N+i] = st->X[j*N*K+speak*N+i]; - } - /* Convert x (echo input) to frequency domain */ - spx_fft(st->fft_table, st->x+speak*N, &st->X[speak*N]); - } - - Sxx = 0; - for (speak = 0; speak < K; speak++) - { - Sxx += mdf_inner_prod(st->x+speak*N+st->frame_size, st->x+speak*N+st->frame_size, st->frame_size); - power_spectrum_accum(st->X+speak*N, st->Xf, N); - } - - Sff = 0; - for (chan = 0; chan < C; chan++) - { -#ifdef TWO_PATH - /* Compute foreground filter */ - spectral_mul_accum16(st->X, st->foreground+chan*N*K*M, st->Y+chan*N, N, M*K); - spx_ifft(st->fft_table, st->Y+chan*N, st->e+chan*N); - for (i=0;iframe_size;i++) - st->e[chan*N+i] = SUB16(st->input[chan*st->frame_size+i], st->e[chan*N+i+st->frame_size]); - Sff += mdf_inner_prod(st->e+chan*N, st->e+chan*N, st->frame_size); -#endif - } - - /* Adjust proportional adaption rate */ - /* FIXME: Adjust that for C, K*/ - if (st->adapted) - mdf_adjust_prop (st->W, N, M, C*K, st->prop); - /* Compute weight gradient */ - if (st->saturated == 0) - { - for (chan = 0; chan < C; chan++) - { - for (speak = 0; speak < K; speak++) - { - for (j=M-1;j>=0;j--) - { - weighted_spectral_mul_conj(st->power_1, FLOAT_SHL(PSEUDOFLOAT(st->prop[j]),-15), &st->X[(j+1)*N*K+speak*N], st->E+chan*N, st->PHI, N); - for (i=0;iW[chan*N*K*M + j*N*K + speak*N + i] += st->PHI[i]; - } - } - } - } else { - st->saturated--; - } - - /* FIXME: MC conversion required */ - /* Update weight to prevent circular convolution (MDF / AUMDF) */ - for (chan = 0; chan < C; chan++) - { - for (speak = 0; speak < K; speak++) - { - for (j=0;jcancel_count%(M-1) == j-1) - { -#ifdef FIXED_POINT - for (i=0;iwtmp2[i] = EXTRACT16(PSHR32(st->W[chan*N*K*M + j*N*K + speak*N + i],NORMALIZE_SCALEDOWN+16)); - spx_ifft(st->fft_table, st->wtmp2, st->wtmp); - for (i=0;iframe_size;i++) - { - st->wtmp[i]=0; - } - for (i=st->frame_size;iwtmp[i]=SHL16(st->wtmp[i],NORMALIZE_SCALEUP); - } - spx_fft(st->fft_table, st->wtmp, st->wtmp2); - /* The "-1" in the shift is a sort of kludge that trades less efficient update speed for decrease noise */ - for (i=0;iW[chan*N*K*M + j*N*K + speak*N + i] -= SHL32(EXTEND32(st->wtmp2[i]),16+NORMALIZE_SCALEDOWN-NORMALIZE_SCALEUP-1); -#else - spx_ifft(st->fft_table, &st->W[chan*N*K*M + j*N*K + speak*N], st->wtmp); - for (i=st->frame_size;iwtmp[i]=0; - } - spx_fft(st->fft_table, st->wtmp, &st->W[chan*N*K*M + j*N*K + speak*N]); -#endif - } - } - } - } - - /* So we can use power_spectrum_accum */ - for (i=0;i<=st->frame_size;i++) - st->Rf[i] = st->Yf[i] = st->Xf[i] = 0; - - Dbf = 0; - See = 0; -#ifdef TWO_PATH - /* Difference in response, this is used to estimate the variance of our residual power estimate */ - for (chan = 0; chan < C; chan++) - { - spectral_mul_accum(st->X, st->W+chan*N*K*M, st->Y+chan*N, N, M*K); - spx_ifft(st->fft_table, st->Y+chan*N, st->y+chan*N); - for (i=0;iframe_size;i++) - st->e[chan*N+i] = SUB16(st->e[chan*N+i+st->frame_size], st->y[chan*N+i+st->frame_size]); - Dbf += 10+mdf_inner_prod(st->e+chan*N, st->e+chan*N, st->frame_size); - for (i=0;iframe_size;i++) - st->e[chan*N+i] = SUB16(st->input[chan*st->frame_size+i], st->y[chan*N+i+st->frame_size]); - See += mdf_inner_prod(st->e+chan*N, st->e+chan*N, st->frame_size); - } -#endif - -#ifndef TWO_PATH - Sff = See; -#endif - -#ifdef TWO_PATH - /* Logic for updating the foreground filter */ - - /* For two time windows, compute the mean of the energy difference, as well as the variance */ - st->Davg1 = ADD32(MULT16_32_Q15(QCONST16(.6f,15),st->Davg1), MULT16_32_Q15(QCONST16(.4f,15),SUB32(Sff,See))); - st->Davg2 = ADD32(MULT16_32_Q15(QCONST16(.85f,15),st->Davg2), MULT16_32_Q15(QCONST16(.15f,15),SUB32(Sff,See))); - st->Dvar1 = FLOAT_ADD(FLOAT_MULT(VAR1_SMOOTH, st->Dvar1), FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.4f,15),Sff), MULT16_32_Q15(QCONST16(.4f,15),Dbf))); - st->Dvar2 = FLOAT_ADD(FLOAT_MULT(VAR2_SMOOTH, st->Dvar2), FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.15f,15),Sff), MULT16_32_Q15(QCONST16(.15f,15),Dbf))); - - /* Equivalent float code: - st->Davg1 = .6*st->Davg1 + .4*(Sff-See); - st->Davg2 = .85*st->Davg2 + .15*(Sff-See); - st->Dvar1 = .36*st->Dvar1 + .16*Sff*Dbf; - st->Dvar2 = .7225*st->Dvar2 + .0225*Sff*Dbf; - */ - - update_foreground = 0; - /* Check if we have a statistically significant reduction in the residual echo */ - /* Note that this is *not* Gaussian, so we need to be careful about the longer tail */ - if (FLOAT_GT(FLOAT_MUL32U(SUB32(Sff,See),ABS32(SUB32(Sff,See))), FLOAT_MUL32U(Sff,Dbf))) - update_foreground = 1; - else if (FLOAT_GT(FLOAT_MUL32U(st->Davg1, ABS32(st->Davg1)), FLOAT_MULT(VAR1_UPDATE,(st->Dvar1)))) - update_foreground = 1; - else if (FLOAT_GT(FLOAT_MUL32U(st->Davg2, ABS32(st->Davg2)), FLOAT_MULT(VAR2_UPDATE,(st->Dvar2)))) - update_foreground = 1; - - /* Do we update? */ - if (update_foreground) - { - st->Davg1 = st->Davg2 = 0; - st->Dvar1 = st->Dvar2 = FLOAT_ZERO; - /* Copy background filter to foreground filter */ - for (i=0;iforeground[i] = EXTRACT16(PSHR32(st->W[i],16)); - /* Apply a smooth transition so as to not introduce blocking artifacts */ - for (chan = 0; chan < C; chan++) - for (i=0;iframe_size;i++) - st->e[chan*N+i+st->frame_size] = MULT16_16_Q15(st->window[i+st->frame_size],st->e[chan*N+i+st->frame_size]) + MULT16_16_Q15(st->window[i],st->y[chan*N+i+st->frame_size]); - } else { - int reset_background=0; - /* Otherwise, check if the background filter is significantly worse */ - if (FLOAT_GT(FLOAT_MUL32U(NEG32(SUB32(Sff,See)),ABS32(SUB32(Sff,See))), FLOAT_MULT(VAR_BACKTRACK,FLOAT_MUL32U(Sff,Dbf)))) - reset_background = 1; - if (FLOAT_GT(FLOAT_MUL32U(NEG32(st->Davg1), ABS32(st->Davg1)), FLOAT_MULT(VAR_BACKTRACK,st->Dvar1))) - reset_background = 1; - if (FLOAT_GT(FLOAT_MUL32U(NEG32(st->Davg2), ABS32(st->Davg2)), FLOAT_MULT(VAR_BACKTRACK,st->Dvar2))) - reset_background = 1; - if (reset_background) - { - /* Copy foreground filter to background filter */ - for (i=0;iW[i] = SHL32(EXTEND32(st->foreground[i]),16); - /* We also need to copy the output so as to get correct adaptation */ - for (chan = 0; chan < C; chan++) - { - for (i=0;iframe_size;i++) - st->y[chan*N+i+st->frame_size] = st->e[chan*N+i+st->frame_size]; - for (i=0;iframe_size;i++) - st->e[chan*N+i] = SUB16(st->input[chan*st->frame_size+i], st->y[chan*N+i+st->frame_size]); - } - See = Sff; - st->Davg1 = st->Davg2 = 0; - st->Dvar1 = st->Dvar2 = FLOAT_ZERO; - } - } -#endif - - Sey = Syy = Sdd = 0; - for (chan = 0; chan < C; chan++) - { - /* Compute error signal (for the output with de-emphasis) */ - for (i=0;iframe_size;i++) - { - spx_word32_t tmp_out; -#ifdef TWO_PATH - tmp_out = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(st->e[chan*N+i+st->frame_size])); -#else - tmp_out = SUB32(EXTEND32(st->input[chan*st->frame_size+i]), EXTEND32(st->y[chan*N+i+st->frame_size])); -#endif - tmp_out = ADD32(tmp_out, EXTEND32(MULT16_16_P15(st->preemph, st->memE[chan]))); - /* This is an arbitrary test for saturation in the microphone signal */ - if (in[i*C+chan] <= -32000 || in[i*C+chan] >= 32000) - { - if (st->saturated == 0) - st->saturated = 1; - } - out[i*C+chan] = WORD2INT(tmp_out); - st->memE[chan] = tmp_out; - } - -#ifdef DUMP_ECHO_CANCEL_DATA - dump_audio(in, far_end, out, st->frame_size); -#endif - - /* Compute error signal (filter update version) */ - for (i=0;iframe_size;i++) - { - st->e[chan*N+i+st->frame_size] = st->e[chan*N+i]; - st->e[chan*N+i] = 0; - } - - /* Compute a bunch of correlations */ - /* FIXME: bad merge */ - Sey += mdf_inner_prod(st->e+chan*N+st->frame_size, st->y+chan*N+st->frame_size, st->frame_size); - Syy += mdf_inner_prod(st->y+chan*N+st->frame_size, st->y+chan*N+st->frame_size, st->frame_size); - Sdd += mdf_inner_prod(st->input+chan*st->frame_size, st->input+chan*st->frame_size, st->frame_size); - - /* Convert error to frequency domain */ - spx_fft(st->fft_table, st->e+chan*N, st->E+chan*N); - for (i=0;iframe_size;i++) - st->y[i+chan*N] = 0; - spx_fft(st->fft_table, st->y+chan*N, st->Y+chan*N); - - /* Compute power spectrum of echo (X), error (E) and filter response (Y) */ - power_spectrum_accum(st->E+chan*N, st->Rf, N); - power_spectrum_accum(st->Y+chan*N, st->Yf, N); - - } - - /*printf ("%f %f %f %f\n", Sff, See, Syy, Sdd, st->update_cond);*/ - - /* Do some sanity check */ - if (!(Syy>=0 && Sxx>=0 && See >= 0) -#ifndef FIXED_POINT - || !(Sff < N*1e9 && Syy < N*1e9 && Sxx < N*1e9) -#endif - ) - { - /* Things have gone really bad */ - st->screwed_up += 50; - for (i=0;iframe_size*C;i++) - out[i] = 0; - } else if (SHR32(Sff, 2) > ADD32(Sdd, SHR32(MULT16_16(N, 10000),6))) - { - /* AEC seems to add lots of echo instead of removing it, let's see if it will improve */ - st->screwed_up++; - } else { - /* Everything's fine */ - st->screwed_up=0; - } - if (st->screwed_up>=50) - { - speex_warning("The echo canceller started acting funny and got slapped (reset). It swears it will behave now."); - speex_echo_state_reset(st); - return; - } - - /* Add a small noise floor to make sure not to have problems when dividing */ - See = MAX32(See, SHR32(MULT16_16(N, 100),6)); - - for (speak = 0; speak < K; speak++) - { - Sxx += mdf_inner_prod(st->x+speak*N+st->frame_size, st->x+speak*N+st->frame_size, st->frame_size); - power_spectrum_accum(st->X+speak*N, st->Xf, N); - } - - - /* Smooth far end energy estimate over time */ - for (j=0;j<=st->frame_size;j++) - st->power[j] = MULT16_32_Q15(ss_1,st->power[j]) + 1 + MULT16_32_Q15(ss,st->Xf[j]); - - /* Compute filtered spectra and (cross-)correlations */ - for (j=st->frame_size;j>=0;j--) - { - spx_float_t Eh, Yh; - Eh = PSEUDOFLOAT(st->Rf[j] - st->Eh[j]); - Yh = PSEUDOFLOAT(st->Yf[j] - st->Yh[j]); - Pey = FLOAT_ADD(Pey,FLOAT_MULT(Eh,Yh)); - Pyy = FLOAT_ADD(Pyy,FLOAT_MULT(Yh,Yh)); -#ifdef FIXED_POINT - st->Eh[j] = MAC16_32_Q15(MULT16_32_Q15(SUB16(32767,st->spec_average),st->Eh[j]), st->spec_average, st->Rf[j]); - st->Yh[j] = MAC16_32_Q15(MULT16_32_Q15(SUB16(32767,st->spec_average),st->Yh[j]), st->spec_average, st->Yf[j]); -#else - st->Eh[j] = (1-st->spec_average)*st->Eh[j] + st->spec_average*st->Rf[j]; - st->Yh[j] = (1-st->spec_average)*st->Yh[j] + st->spec_average*st->Yf[j]; -#endif - } - - Pyy = FLOAT_SQRT(Pyy); - Pey = FLOAT_DIVU(Pey,Pyy); - - /* Compute correlation updatete rate */ - tmp32 = MULT16_32_Q15(st->beta0,Syy); - if (tmp32 > MULT16_32_Q15(st->beta_max,See)) - tmp32 = MULT16_32_Q15(st->beta_max,See); - alpha = FLOAT_DIV32(tmp32, See); - alpha_1 = FLOAT_SUB(FLOAT_ONE, alpha); - /* Update correlations (recursive average) */ - st->Pey = FLOAT_ADD(FLOAT_MULT(alpha_1,st->Pey) , FLOAT_MULT(alpha,Pey)); - st->Pyy = FLOAT_ADD(FLOAT_MULT(alpha_1,st->Pyy) , FLOAT_MULT(alpha,Pyy)); - if (FLOAT_LT(st->Pyy, FLOAT_ONE)) - st->Pyy = FLOAT_ONE; - /* We don't really hope to get better than 33 dB (MIN_LEAK-3dB) attenuation anyway */ - if (FLOAT_LT(st->Pey, FLOAT_MULT(MIN_LEAK,st->Pyy))) - st->Pey = FLOAT_MULT(MIN_LEAK,st->Pyy); - if (FLOAT_GT(st->Pey, st->Pyy)) - st->Pey = st->Pyy; - /* leak_estimate is the linear regression result */ - st->leak_estimate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIVU(st->Pey, st->Pyy),14)); - /* This looks like a stupid bug, but it's right (because we convert from Q14 to Q15) */ - if (st->leak_estimate > 16383) - st->leak_estimate = 32767; - else - st->leak_estimate = SHL16(st->leak_estimate,1); - /*printf ("%f\n", st->leak_estimate);*/ - - /* Compute Residual to Error Ratio */ -#ifdef FIXED_POINT - tmp32 = MULT16_32_Q15(st->leak_estimate,Syy); - tmp32 = ADD32(SHR32(Sxx,13), ADD32(tmp32, SHL32(tmp32,1))); - /* Check for y in e (lower bound on RER) */ - { - spx_float_t bound = PSEUDOFLOAT(Sey); - bound = FLOAT_DIVU(FLOAT_MULT(bound, bound), PSEUDOFLOAT(ADD32(1,Syy))); - if (FLOAT_GT(bound, PSEUDOFLOAT(See))) - tmp32 = See; - else if (tmp32 < FLOAT_EXTRACT32(bound)) - tmp32 = FLOAT_EXTRACT32(bound); - } - if (tmp32 > SHR32(See,1)) - tmp32 = SHR32(See,1); - RER = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32,See),15)); -#else - RER = (.0001*Sxx + 3.*MULT16_32_Q15(st->leak_estimate,Syy)) / See; - /* Check for y in e (lower bound on RER) */ - if (RER < Sey*Sey/(1+See*Syy)) - RER = Sey*Sey/(1+See*Syy); - if (RER > .5) - RER = .5; -#endif - - /* We consider that the filter has had minimal adaptation if the following is true*/ - if (!st->adapted && st->sum_adapt > SHL32(EXTEND32(M),15) && MULT16_32_Q15(st->leak_estimate,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy)) - { - st->adapted = 1; - } - - if (st->adapted) - { - /* Normal learning rate calculation once we're past the minimal adaptation phase */ - for (i=0;i<=st->frame_size;i++) - { - spx_word32_t r, e; - /* Compute frequency-domain adaptation mask */ - r = MULT16_32_Q15(st->leak_estimate,SHL32(st->Yf[i],3)); - e = SHL32(st->Rf[i],3)+1; -#ifdef FIXED_POINT - if (r>SHR32(e,1)) - r = SHR32(e,1); -#else - if (r>.5*e) - r = .5*e; -#endif - r = MULT16_32_Q15(QCONST16(.7,15),r) + MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e))); - /*st->power_1[i] = adapt_rate*r/(e*(1+st->power[i]));*/ - st->power_1[i] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,st->power[i]+10)),WEIGHT_SHIFT+16); - } - } else { - /* Temporary adaption rate if filter is not yet adapted enough */ - spx_word16_t adapt_rate=0; - - if (Sxx > SHR32(MULT16_16(N, 1000),6)) - { - tmp32 = MULT16_32_Q15(QCONST16(.25f, 15), Sxx); -#ifdef FIXED_POINT - if (tmp32 > SHR32(See,2)) - tmp32 = SHR32(See,2); -#else - if (tmp32 > .25*See) - tmp32 = .25*See; -#endif - adapt_rate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32, See),15)); - } - for (i=0;i<=st->frame_size;i++) - st->power_1[i] = FLOAT_SHL(FLOAT_DIV32(EXTEND32(adapt_rate),ADD32(st->power[i],10)),WEIGHT_SHIFT+1); - - - /* How much have we adapted so far? */ - st->sum_adapt = ADD32(st->sum_adapt,adapt_rate); - } - - /* FIXME: MC conversion required */ - for (i=0;iframe_size;i++) - st->last_y[i] = st->last_y[st->frame_size+i]; - if (st->adapted) - { - /* If the filter is adapted, take the filtered echo */ - for (i=0;iframe_size;i++) - st->last_y[st->frame_size+i] = in[i]-out[i]; - } else { - /* If filter isn't adapted yet, all we can do is take the far end signal directly */ - /* moved earlier: for (i=0;ilast_y[i] = st->x[i];*/ - } - -} - -/* Compute spectrum of estimated echo for use in an echo post-filter */ -void speex_echo_get_residual(SpeexEchoState *st, spx_word32_t *residual_echo, int len) -{ - int i; - spx_word16_t leak2; - int N; - - N = st->window_size; - - /* Apply hanning window (should pre-compute it)*/ - for (i=0;iy[i] = MULT16_16_Q15(st->window[i],st->last_y[i]); - - /* Compute power spectrum of the echo */ - spx_fft(st->fft_table, st->y, st->Y); - power_spectrum(st->Y, residual_echo, N); - -#ifdef FIXED_POINT - if (st->leak_estimate > 16383) - leak2 = 32767; - else - leak2 = SHL16(st->leak_estimate, 1); -#else - if (st->leak_estimate>.5) - leak2 = 1; - else - leak2 = 2*st->leak_estimate; -#endif - /* Estimate residual echo */ - for (i=0;i<=st->frame_size;i++) - residual_echo[i] = (spx_int32_t)MULT16_32_Q15(leak2,residual_echo[i]); - -} - -EXPORT int speex_echo_ctl(SpeexEchoState *st, int request, void *ptr) -{ - switch(request) - { - - case SPEEX_ECHO_GET_FRAME_SIZE: - (*(int*)ptr) = st->frame_size; - break; - case SPEEX_ECHO_SET_SAMPLING_RATE: - st->sampling_rate = (*(int*)ptr); - st->spec_average = DIV32_16(SHL32(EXTEND32(st->frame_size), 15), st->sampling_rate); -#ifdef FIXED_POINT - st->beta0 = DIV32_16(SHL32(EXTEND32(st->frame_size), 16), st->sampling_rate); - st->beta_max = DIV32_16(SHL32(EXTEND32(st->frame_size), 14), st->sampling_rate); -#else - st->beta0 = (2.0f*st->frame_size)/st->sampling_rate; - st->beta_max = (.5f*st->frame_size)/st->sampling_rate; -#endif - if (st->sampling_rate<12000) - st->notch_radius = QCONST16(.9, 15); - else if (st->sampling_rate<24000) - st->notch_radius = QCONST16(.982, 15); - else - st->notch_radius = QCONST16(.992, 15); - break; - case SPEEX_ECHO_GET_SAMPLING_RATE: - (*(int*)ptr) = st->sampling_rate; - break; - case SPEEX_ECHO_GET_IMPULSE_RESPONSE_SIZE: - /*FIXME: Implement this for multiple channels */ - *((spx_int32_t *)ptr) = st->M * st->frame_size; - break; - case SPEEX_ECHO_GET_IMPULSE_RESPONSE: - { - int M = st->M, N = st->window_size, n = st->frame_size, i, j; - spx_int32_t *filt = (spx_int32_t *) ptr; - for(j=0;jwtmp2[i] = EXTRACT16(PSHR32(st->W[j*N+i],16+NORMALIZE_SCALEDOWN)); - spx_ifft(st->fft_table, st->wtmp2, st->wtmp); -#else - spx_ifft(st->fft_table, &st->W[j*N], st->wtmp); -#endif - for(i=0;iwtmp[i]), WEIGHT_SHIFT-NORMALIZE_SCALEDOWN); - } - } - break; - default: - speex_warning_int("Unknown speex_echo_ctl request: ", request); - return -1; - } - return 0; -} diff --git a/speex/libspeexdsp/misc_bfin.h b/speex/libspeexdsp/misc_bfin.h deleted file mode 100644 index 4e27681c9..000000000 --- a/speex/libspeexdsp/misc_bfin.h +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2005 Analog Devices */ -/** - @file misc_bfin.h - @author Jean-Marc Valin - @brief Various compatibility routines for Speex (Blackfin version) -*/ -/* - 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. -*/ - -#include "bfin.h" - -#define OVERRIDE_SPEEX_MOVE -void *speex_move (void *dest, void *src, int n) -{ - __asm__ __volatile__ - ( - "L0 = 0;\n\t" - "I0 = %0;\n\t" - "R0 = [I0++];\n\t" - "LOOP move%= LC0 = %2;\n\t" - "LOOP_BEGIN move%=;\n\t" - "[%1++] = R0 || R0 = [I0++];\n\t" - "LOOP_END move%=;\n\t" - "[%1++] = R0;\n\t" - : "=a" (src), "=a" (dest) - : "a" ((n>>2)-1), "0" (src), "1" (dest) - : "R0", "I0", "L0", "memory" BFIN_HWLOOP0_REGS - ); - return dest; -} diff --git a/speex/libspeexdsp/os_support.h b/speex/libspeexdsp/os_support.h deleted file mode 100644 index 0db31a61d..000000000 --- a/speex/libspeexdsp/os_support.h +++ /dev/null @@ -1,169 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: os_support.h - This is the (tiny) OS abstraction layer. Aside from math.h, this is the - only place where system headers are allowed. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifndef OS_SUPPORT_H -#define OS_SUPPORT_H - -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif -#ifdef OS_SUPPORT_CUSTOM -#include "os_support_custom.h" -#endif - -/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_free - NOTE: speex_alloc needs to CLEAR THE MEMORY */ -#ifndef OVERRIDE_SPEEX_ALLOC -static inline void *speex_alloc (int size) -{ - /* WARNING: this is not equivalent to malloc(). If you want to use malloc() - or your own allocator, YOU NEED TO CLEAR THE MEMORY ALLOCATED. Otherwise - you will experience strange bugs */ - return calloc(size,1); -} -#endif - -/** Same as speex_alloc, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ -#ifndef OVERRIDE_SPEEX_ALLOC_SCRATCH -static inline void *speex_alloc_scratch (int size) -{ - /* Scratch space doesn't need to be cleared */ - return calloc(size,1); -} -#endif - -/** Speex wrapper for realloc. To do your own dynamic allocation, all you need to do is replace this function, speex_alloc and speex_free */ -#ifndef OVERRIDE_SPEEX_REALLOC -static inline void *speex_realloc (void *ptr, int size) -{ - return realloc(ptr, size); -} -#endif - -/** Speex wrapper for calloc. To do your own dynamic allocation, all you need to do is replace this function, speex_realloc and speex_alloc */ -#ifndef OVERRIDE_SPEEX_FREE -static inline void speex_free (void *ptr) -{ - free(ptr); -} -#endif - -/** Same as speex_free, except that the area is only needed inside a Speex call (might cause problem with wideband though) */ -#ifndef OVERRIDE_SPEEX_FREE_SCRATCH -static inline void speex_free_scratch (void *ptr) -{ - free(ptr); -} -#endif - -/** Copy n elements from src to dst. The 0* term provides compile-time type checking */ -#ifndef OVERRIDE_SPEEX_COPY -#define SPEEX_COPY(dst, src, n) (memcpy((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) -#endif - -/** Copy n elements from src to dst, allowing overlapping regions. The 0* term - provides compile-time type checking */ -#ifndef OVERRIDE_SPEEX_MOVE -#define SPEEX_MOVE(dst, src, n) (memmove((dst), (src), (n)*sizeof(*(dst)) + 0*((dst)-(src)) )) -#endif - -/** For n elements worth of memory, set every byte to the value of c, starting at address dst */ -#ifndef OVERRIDE_SPEEX_MEMSET -#define SPEEX_MEMSET(dst, c, n) (memset((dst), (c), (n)*sizeof(*(dst)))) -#endif - - -#ifndef OVERRIDE_SPEEX_FATAL -static inline void _speex_fatal(const char *str, const char *file, int line) -{ - fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str); - exit(1); -} -#endif - -#ifndef OVERRIDE_SPEEX_WARNING -static inline void speex_warning(const char *str) -{ -#ifndef DISABLE_WARNINGS - fprintf (stderr, "warning: %s\n", str); -#endif -} -#endif - -#ifndef OVERRIDE_SPEEX_WARNING_INT -static inline void speex_warning_int(const char *str, int val) -{ -#ifndef DISABLE_WARNINGS - fprintf (stderr, "warning: %s %d\n", str, val); -#endif -} -#endif - -#ifndef OVERRIDE_SPEEX_NOTIFY -static inline void speex_notify(const char *str) -{ -#ifndef DISABLE_NOTIFICATIONS - fprintf (stderr, "notification: %s\n", str); -#endif -} -#endif - -#ifndef OVERRIDE_SPEEX_PUTC -/** Speex wrapper for putc */ -static inline void _speex_putc(int ch, void *file) -{ - FILE *f = (FILE *)file; - fprintf(f, "%c", ch); -} -#endif - -#define speex_fatal(str) _speex_fatal(str, __FILE__, __LINE__); -#define speex_assert(cond) {if (!(cond)) {speex_fatal("assertion failed: " #cond);}} - -#ifndef RELEASE -static inline void print_vec(float *vec, int len, char *name) -{ - int i; - printf ("%s ", name); - for (i=0;i -#include "speex/speex_preprocess.h" -#include "speex/speex_echo.h" -#include "arch.h" -#include "fftwrap.h" -#include "filterbank.h" -#include "math_approx.h" -#include "os_support.h" - -#define LOUDNESS_EXP 5.f -#define AMP_SCALE .001f -#define AMP_SCALE_1 1000.f - -#define NB_BANDS 24 - -#define SPEECH_PROB_START_DEFAULT QCONST16(0.35f,15) -#define SPEECH_PROB_CONTINUE_DEFAULT QCONST16(0.20f,15) -#define NOISE_SUPPRESS_DEFAULT -15 -#define ECHO_SUPPRESS_DEFAULT -40 -#define ECHO_SUPPRESS_ACTIVE_DEFAULT -15 - -#ifndef NULL -#define NULL 0 -#endif - -#define SQR(x) ((x)*(x)) -#define SQR16(x) (MULT16_16((x),(x))) -#define SQR16_Q15(x) (MULT16_16_Q15((x),(x))) - -#ifdef FIXED_POINT -static inline spx_word16_t DIV32_16_Q8(spx_word32_t a, spx_word32_t b) -{ - if (SHR32(a,7) >= b) - { - return 32767; - } else { - if (b>=QCONST32(1,23)) - { - a = SHR32(a,8); - b = SHR32(b,8); - } - if (b>=QCONST32(1,19)) - { - a = SHR32(a,4); - b = SHR32(b,4); - } - if (b>=QCONST32(1,15)) - { - a = SHR32(a,4); - b = SHR32(b,4); - } - a = SHL32(a,8); - return PDIV32_16(a,b); - } - -} -static inline spx_word16_t DIV32_16_Q15(spx_word32_t a, spx_word32_t b) -{ - if (SHR32(a,15) >= b) - { - return 32767; - } else { - if (b>=QCONST32(1,23)) - { - a = SHR32(a,8); - b = SHR32(b,8); - } - if (b>=QCONST32(1,19)) - { - a = SHR32(a,4); - b = SHR32(b,4); - } - if (b>=QCONST32(1,15)) - { - a = SHR32(a,4); - b = SHR32(b,4); - } - a = SHL32(a,15)-a; - return DIV32_16(a,b); - } -} -#define SNR_SCALING 256.f -#define SNR_SCALING_1 0.0039062f -#define SNR_SHIFT 8 - -#define FRAC_SCALING 32767.f -#define FRAC_SCALING_1 3.0518e-05 -#define FRAC_SHIFT 1 - -#define EXPIN_SCALING 2048.f -#define EXPIN_SCALING_1 0.00048828f -#define EXPIN_SHIFT 11 -#define EXPOUT_SCALING_1 1.5259e-05 - -#define NOISE_SHIFT 7 - -#else - -#define DIV32_16_Q8(a,b) ((a)/(b)) -#define DIV32_16_Q15(a,b) ((a)/(b)) -#define SNR_SCALING 1.f -#define SNR_SCALING_1 1.f -#define SNR_SHIFT 0 -#define FRAC_SCALING 1.f -#define FRAC_SCALING_1 1.f -#define FRAC_SHIFT 0 -#define NOISE_SHIFT 0 - -#define EXPIN_SCALING 1.f -#define EXPIN_SCALING_1 1.f -#define EXPOUT_SCALING_1 1.f - -#endif - -/** Speex pre-processor state. */ -struct SpeexPreprocessState_ { - /* Basic info */ - int frame_size; /**< Number of samples processed each time */ - int ps_size; /**< Number of points in the power spectrum */ - int sampling_rate; /**< Sampling rate of the input/output */ - int nbands; - FilterBank *bank; - - /* Parameters */ - int denoise_enabled; - int vad_enabled; - int dereverb_enabled; - spx_word16_t reverb_decay; - spx_word16_t reverb_level; - spx_word16_t speech_prob_start; - spx_word16_t speech_prob_continue; - int noise_suppress; - int echo_suppress; - int echo_suppress_active; - SpeexEchoState *echo_state; - - spx_word16_t speech_prob; /**< Probability last frame was speech */ - - /* DSP-related arrays */ - spx_word16_t *frame; /**< Processing frame (2*ps_size) */ - spx_word16_t *ft; /**< Processing frame in freq domain (2*ps_size) */ - spx_word32_t *ps; /**< Current power spectrum */ - spx_word16_t *gain2; /**< Adjusted gains */ - spx_word16_t *gain_floor; /**< Minimum gain allowed */ - spx_word16_t *window; /**< Analysis/Synthesis window */ - spx_word32_t *noise; /**< Noise estimate */ - spx_word32_t *reverb_estimate; /**< Estimate of reverb energy */ - spx_word32_t *old_ps; /**< Power spectrum for last frame */ - spx_word16_t *gain; /**< Ephraim Malah gain */ - spx_word16_t *prior; /**< A-priori SNR */ - spx_word16_t *post; /**< A-posteriori SNR */ - - spx_word32_t *S; /**< Smoothed power spectrum */ - spx_word32_t *Smin; /**< See Cohen paper */ - spx_word32_t *Stmp; /**< See Cohen paper */ - int *update_prob; /**< Probability of speech presence for noise update */ - - spx_word16_t *zeta; /**< Smoothed a priori SNR */ - spx_word32_t *echo_noise; - spx_word32_t *residual_echo; - - /* Misc */ - spx_word16_t *inbuf; /**< Input buffer (overlapped analysis) */ - spx_word16_t *outbuf; /**< Output buffer (for overlap and add) */ - - /* AGC stuff, only for floating point for now */ -#ifndef FIXED_POINT - int agc_enabled; - float agc_level; - float loudness_accum; - float *loudness_weight; /**< Perceptual loudness curve */ - float loudness; /**< Loudness estimate */ - float agc_gain; /**< Current AGC gain */ - float max_gain; /**< Maximum gain allowed */ - float max_increase_step; /**< Maximum increase in gain from one frame to another */ - float max_decrease_step; /**< Maximum decrease in gain from one frame to another */ - float prev_loudness; /**< Loudness of previous frame */ - float init_max; /**< Current gain limit during initialisation */ -#endif - int nb_adapt; /**< Number of frames used for adaptation so far */ - int was_speech; - int min_count; /**< Number of frames processed so far */ - void *fft_lookup; /**< Lookup table for the FFT */ -#ifdef FIXED_POINT - int frame_shift; -#endif -}; - - -static void conj_window(spx_word16_t *w, int len) -{ - int i; - for (i=0;i19) - return ADD32(EXTEND32(Q15_ONE),EXTEND32(DIV32_16(QCONST32(.1296,23), SHR32(xx,EXPIN_SHIFT-SNR_SHIFT)))); - frac = SHL32(xx-SHL32(ind,10),5); - return SHL32(DIV32_16(PSHR32(MULT16_16(Q15_ONE-frac,table[ind]) + MULT16_16(frac,table[ind+1]),7),(spx_sqrt(SHL32(xx,15)+6711))),7); -} - -static inline spx_word16_t qcurve(spx_word16_t x) -{ - x = MAX16(x, 1); - return DIV32_16(SHL32(EXTEND32(32767),9),ADD16(512,MULT16_16_Q15(QCONST16(.60f,15),DIV32_16(32767,x)))); -} - -/* Compute the gain floor based on different floors for the background noise and residual echo */ -static void compute_gain_floor(int noise_suppress, int effective_echo_suppress, spx_word32_t *noise, spx_word32_t *echo, spx_word16_t *gain_floor, int len) -{ - int i; - - if (noise_suppress > effective_echo_suppress) - { - spx_word16_t noise_gain, gain_ratio; - noise_gain = EXTRACT16(MIN32(Q15_ONE,SHR32(spx_exp(MULT16_16(QCONST16(0.11513,11),noise_suppress)),1))); - gain_ratio = EXTRACT16(MIN32(Q15_ONE,SHR32(spx_exp(MULT16_16(QCONST16(.2302585f,11),effective_echo_suppress-noise_suppress)),1))); - - /* gain_floor = sqrt [ (noise*noise_floor + echo*echo_floor) / (noise+echo) ] */ - for (i=0;i19) - return FRAC_SCALING*(1+.1296/x); - frac = 2*x-integer; - return FRAC_SCALING*((1-frac)*table[ind] + frac*table[ind+1])/sqrt(x+.0001f); -} - -static inline spx_word16_t qcurve(spx_word16_t x) -{ - return 1.f/(1.f+.15f/(SNR_SCALING_1*x)); -} - -static void compute_gain_floor(int noise_suppress, int effective_echo_suppress, spx_word32_t *noise, spx_word32_t *echo, spx_word16_t *gain_floor, int len) -{ - int i; - float echo_floor; - float noise_floor; - - noise_floor = exp(.2302585f*noise_suppress); - echo_floor = exp(.2302585f*effective_echo_suppress); - - /* Compute the gain floor based on different floors for the background noise and residual echo */ - for (i=0;iframe_size = frame_size; - - /* Round ps_size down to the nearest power of two */ -#if 0 - i=1; - st->ps_size = st->frame_size; - while(1) - { - if (st->ps_size & ~i) - { - st->ps_size &= ~i; - i<<=1; - } else { - break; - } - } - - - if (st->ps_size < 3*st->frame_size/4) - st->ps_size = st->ps_size * 3 / 2; -#else - st->ps_size = st->frame_size; -#endif - - N = st->ps_size; - N3 = 2*N - st->frame_size; - N4 = st->frame_size - N3; - - st->sampling_rate = sampling_rate; - st->denoise_enabled = 1; - st->vad_enabled = 0; - st->dereverb_enabled = 0; - st->reverb_decay = 0; - st->reverb_level = 0; - st->noise_suppress = NOISE_SUPPRESS_DEFAULT; - st->echo_suppress = ECHO_SUPPRESS_DEFAULT; - st->echo_suppress_active = ECHO_SUPPRESS_ACTIVE_DEFAULT; - - st->speech_prob_start = SPEECH_PROB_START_DEFAULT; - st->speech_prob_continue = SPEECH_PROB_CONTINUE_DEFAULT; - - st->echo_state = NULL; - - st->nbands = NB_BANDS; - M = st->nbands; - st->bank = filterbank_new(M, sampling_rate, N, 1); - - st->frame = (spx_word16_t*)speex_alloc(2*N*sizeof(spx_word16_t)); - st->window = (spx_word16_t*)speex_alloc(2*N*sizeof(spx_word16_t)); - st->ft = (spx_word16_t*)speex_alloc(2*N*sizeof(spx_word16_t)); - - st->ps = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); - st->noise = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); - st->echo_noise = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); - st->residual_echo = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); - st->reverb_estimate = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); - st->old_ps = (spx_word32_t*)speex_alloc((N+M)*sizeof(spx_word32_t)); - st->prior = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); - st->post = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); - st->gain = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); - st->gain2 = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); - st->gain_floor = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); - st->zeta = (spx_word16_t*)speex_alloc((N+M)*sizeof(spx_word16_t)); - - st->S = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); - st->Smin = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); - st->Stmp = (spx_word32_t*)speex_alloc(N*sizeof(spx_word32_t)); - st->update_prob = (int*)speex_alloc(N*sizeof(int)); - - st->inbuf = (spx_word16_t*)speex_alloc(N3*sizeof(spx_word16_t)); - st->outbuf = (spx_word16_t*)speex_alloc(N3*sizeof(spx_word16_t)); - - conj_window(st->window, 2*N3); - for (i=2*N3;i<2*st->ps_size;i++) - st->window[i]=Q15_ONE; - - if (N4>0) - { - for (i=N3-1;i>=0;i--) - { - st->window[i+N3+N4]=st->window[i+N3]; - st->window[i+N3]=1; - } - } - for (i=0;inoise[i]=QCONST32(1.f,NOISE_SHIFT); - st->reverb_estimate[i]=0; - st->old_ps[i]=1; - st->gain[i]=Q15_ONE; - st->post[i]=SHL16(1, SNR_SHIFT); - st->prior[i]=SHL16(1, SNR_SHIFT); - } - - for (i=0;iupdate_prob[i] = 1; - for (i=0;iinbuf[i]=0; - st->outbuf[i]=0; - } -#ifndef FIXED_POINT - st->agc_enabled = 0; - st->agc_level = 8000; - st->loudness_weight = (float*)speex_alloc(N*sizeof(float)); - for (i=0;iloudness_weight[i] = .5f*(1.f/(1.f+ff/8000.f))+1.f*exp(-.5f*(ff-3800.f)*(ff-3800.f)/9e5f);*/ - st->loudness_weight[i] = .35f-.35f*ff/16000.f+.73f*exp(-.5f*(ff-3800)*(ff-3800)/9e5f); - if (st->loudness_weight[i]<.01f) - st->loudness_weight[i]=.01f; - st->loudness_weight[i] *= st->loudness_weight[i]; - } - /*st->loudness = pow(AMP_SCALE*st->agc_level,LOUDNESS_EXP);*/ - st->loudness = 1e-15; - st->agc_gain = 1; - st->max_gain = 30; - st->max_increase_step = exp(0.11513f * 12.*st->frame_size / st->sampling_rate); - st->max_decrease_step = exp(-0.11513f * 40.*st->frame_size / st->sampling_rate); - st->prev_loudness = 1; - st->init_max = 1; -#endif - st->was_speech = 0; - - st->fft_lookup = spx_fft_init(2*N); - - st->nb_adapt=0; - st->min_count=0; - return st; -} - -EXPORT void speex_preprocess_state_destroy(SpeexPreprocessState *st) -{ - speex_free(st->frame); - speex_free(st->ft); - speex_free(st->ps); - speex_free(st->gain2); - speex_free(st->gain_floor); - speex_free(st->window); - speex_free(st->noise); - speex_free(st->reverb_estimate); - speex_free(st->old_ps); - speex_free(st->gain); - speex_free(st->prior); - speex_free(st->post); -#ifndef FIXED_POINT - speex_free(st->loudness_weight); -#endif - speex_free(st->echo_noise); - speex_free(st->residual_echo); - - speex_free(st->S); - speex_free(st->Smin); - speex_free(st->Stmp); - speex_free(st->update_prob); - speex_free(st->zeta); - - speex_free(st->inbuf); - speex_free(st->outbuf); - - spx_fft_destroy(st->fft_lookup); - filterbank_destroy(st->bank); - speex_free(st); -} - -/* FIXME: The AGC doesn't work yet with fixed-point*/ -#ifndef FIXED_POINT -static void speex_compute_agc(SpeexPreprocessState *st, spx_word16_t Pframe, spx_word16_t *ft) -{ - int i; - int N = st->ps_size; - float target_gain; - float loudness=1.f; - float rate; - - for (i=2;ips[i]* st->loudness_weight[i]; - } - loudness=sqrt(loudness); - /*if (loudness < 2*pow(st->loudness, 1.0/LOUDNESS_EXP) && - loudness*2 > pow(st->loudness, 1.0/LOUDNESS_EXP))*/ - if (Pframe>.3f) - { - /*rate=2.0f*Pframe*Pframe/(1+st->nb_loudness_adapt);*/ - rate = .03*Pframe*Pframe; - st->loudness = (1-rate)*st->loudness + (rate)*pow(AMP_SCALE*loudness, LOUDNESS_EXP); - st->loudness_accum = (1-rate)*st->loudness_accum + rate; - if (st->init_max < st->max_gain && st->nb_adapt > 20) - st->init_max *= 1.f + .1f*Pframe*Pframe; - } - /*printf ("%f %f %f %f\n", Pframe, loudness, pow(st->loudness, 1.0f/LOUDNESS_EXP), st->loudness2);*/ - - target_gain = AMP_SCALE*st->agc_level*pow(st->loudness/(1e-4+st->loudness_accum), -1.0f/LOUDNESS_EXP); - - if ((Pframe>.5 && st->nb_adapt > 20) || target_gain < st->agc_gain) - { - if (target_gain > st->max_increase_step*st->agc_gain) - target_gain = st->max_increase_step*st->agc_gain; - if (target_gain < st->max_decrease_step*st->agc_gain && loudness < 10*st->prev_loudness) - target_gain = st->max_decrease_step*st->agc_gain; - if (target_gain > st->max_gain) - target_gain = st->max_gain; - if (target_gain > st->init_max) - target_gain = st->init_max; - - st->agc_gain = target_gain; - } - /*fprintf (stderr, "%f %f %f\n", loudness, (float)AMP_SCALE_1*pow(st->loudness, 1.0f/LOUDNESS_EXP), st->agc_gain);*/ - - for (i=0;i<2*N;i++) - ft[i] *= st->agc_gain; - st->prev_loudness = loudness; -} -#endif - -static void preprocess_analysis(SpeexPreprocessState *st, spx_int16_t *x) -{ - int i; - int N = st->ps_size; - int N3 = 2*N - st->frame_size; - int N4 = st->frame_size - N3; - spx_word32_t *ps=st->ps; - - /* 'Build' input frame */ - for (i=0;iframe[i]=st->inbuf[i]; - for (i=0;iframe_size;i++) - st->frame[N3+i]=x[i]; - - /* Update inbuf */ - for (i=0;iinbuf[i]=x[N4+i]; - - /* Windowing */ - for (i=0;i<2*N;i++) - st->frame[i] = MULT16_16_Q15(st->frame[i], st->window[i]); - -#ifdef FIXED_POINT - { - spx_word16_t max_val=0; - for (i=0;i<2*N;i++) - max_val = MAX16(max_val, ABS16(st->frame[i])); - st->frame_shift = 14-spx_ilog2(EXTEND32(max_val)); - for (i=0;i<2*N;i++) - st->frame[i] = SHL16(st->frame[i], st->frame_shift); - } -#endif - - /* Perform FFT */ - spx_fft(st->fft_lookup, st->frame, st->ft); - - /* Power spectrum */ - ps[0]=MULT16_16(st->ft[0],st->ft[0]); - for (i=1;ift[2*i-1],st->ft[2*i-1]) + MULT16_16(st->ft[2*i],st->ft[2*i]); - for (i=0;ips[i] = PSHR32(st->ps[i], 2*st->frame_shift); - - filterbank_compute_bank32(st->bank, ps, ps+N); -} - -static void update_noise_prob(SpeexPreprocessState *st) -{ - int i; - int min_range; - int N = st->ps_size; - - for (i=1;iS[i] = MULT16_32_Q15(QCONST16(.8f,15),st->S[i]) + MULT16_32_Q15(QCONST16(.05f,15),st->ps[i-1]) - + MULT16_32_Q15(QCONST16(.1f,15),st->ps[i]) + MULT16_32_Q15(QCONST16(.05f,15),st->ps[i+1]); - st->S[0] = MULT16_32_Q15(QCONST16(.8f,15),st->S[0]) + MULT16_32_Q15(QCONST16(.2f,15),st->ps[0]); - st->S[N-1] = MULT16_32_Q15(QCONST16(.8f,15),st->S[N-1]) + MULT16_32_Q15(QCONST16(.2f,15),st->ps[N-1]); - - if (st->nb_adapt==1) - { - for (i=0;iSmin[i] = st->Stmp[i] = 0; - } - - if (st->nb_adapt < 100) - min_range = 15; - else if (st->nb_adapt < 1000) - min_range = 50; - else if (st->nb_adapt < 10000) - min_range = 150; - else - min_range = 300; - if (st->min_count > min_range) - { - st->min_count = 0; - for (i=0;iSmin[i] = MIN32(st->Stmp[i], st->S[i]); - st->Stmp[i] = st->S[i]; - } - } else { - for (i=0;iSmin[i] = MIN32(st->Smin[i], st->S[i]); - st->Stmp[i] = MIN32(st->Stmp[i], st->S[i]); - } - } - for (i=0;iS[i]) > st->Smin[i]) - st->update_prob[i] = 1; - else - st->update_prob[i] = 0; - /*fprintf (stderr, "%f ", st->S[i]/st->Smin[i]);*/ - /*fprintf (stderr, "%f ", st->update_prob[i]);*/ - } - -} - -#define NOISE_OVERCOMPENS 1. - -void speex_echo_get_residual(SpeexEchoState *st, spx_word32_t *Yout, int len); - -EXPORT int speex_preprocess(SpeexPreprocessState *st, spx_int16_t *x, spx_int32_t *echo) -{ - return speex_preprocess_run(st, x); -} - -EXPORT int speex_preprocess_run(SpeexPreprocessState *st, spx_int16_t *x) -{ - int i; - int M; - int N = st->ps_size; - int N3 = 2*N - st->frame_size; - int N4 = st->frame_size - N3; - spx_word32_t *ps=st->ps; - spx_word32_t Zframe; - spx_word16_t Pframe; - spx_word16_t beta, beta_1; - spx_word16_t effective_echo_suppress; - - st->nb_adapt++; - if (st->nb_adapt>20000) - st->nb_adapt = 20000; - st->min_count++; - - beta = MAX16(QCONST16(.03,15),DIV32_16(Q15_ONE,st->nb_adapt)); - beta_1 = Q15_ONE-beta; - M = st->nbands; - /* Deal with residual echo if provided */ - if (st->echo_state) - { - speex_echo_get_residual(st->echo_state, st->residual_echo, N); -#ifndef FIXED_POINT - /* If there are NaNs or ridiculous values, it'll show up in the DC and we just reset everything to zero */ - if (!(st->residual_echo[0] >=0 && st->residual_echo[0]residual_echo[i] = 0; - } -#endif - for (i=0;iecho_noise[i] = MAX32(MULT16_32_Q15(QCONST16(.6f,15),st->echo_noise[i]), st->residual_echo[i]); - filterbank_compute_bank32(st->bank, st->echo_noise, st->echo_noise+N); - } else { - for (i=0;iecho_noise[i] = 0; - } - preprocess_analysis(st, x); - - update_noise_prob(st); - - /* Noise estimation always updated for the 10 first frames */ - /*if (st->nb_adapt<10) - { - for (i=1;iupdate_prob[i] = 0; - } - */ - - /* Update the noise estimate for the frequencies where it can be */ - for (i=0;iupdate_prob[i] || st->ps[i] < PSHR32(st->noise[i], NOISE_SHIFT)) - st->noise[i] = MAX32(EXTEND32(0),MULT16_32_Q15(beta_1,st->noise[i]) + MULT16_32_Q15(beta,SHL32(st->ps[i],NOISE_SHIFT))); - } - filterbank_compute_bank32(st->bank, st->noise, st->noise+N); - - /* Special case for first frame */ - if (st->nb_adapt==1) - for (i=0;iold_ps[i] = ps[i]; - - /* Compute a posteriori SNR */ - for (i=0;inoise[i],NOISE_SHIFT)) , st->echo_noise[i]) , st->reverb_estimate[i]); - - /* A posteriori SNR = ps/noise - 1*/ - st->post[i] = SUB16(DIV32_16_Q8(ps[i],tot_noise), QCONST16(1.f,SNR_SHIFT)); - st->post[i]=MIN16(st->post[i], QCONST16(100.f,SNR_SHIFT)); - - /* Computing update gamma = .1 + .9*(old/(old+noise))^2 */ - gamma = QCONST16(.1f,15)+MULT16_16_Q15(QCONST16(.89f,15),SQR16_Q15(DIV32_16_Q15(st->old_ps[i],ADD32(st->old_ps[i],tot_noise)))); - - /* A priori SNR update = gamma*max(0,post) + (1-gamma)*old/noise */ - st->prior[i] = EXTRACT16(PSHR32(ADD32(MULT16_16(gamma,MAX16(0,st->post[i])), MULT16_16(Q15_ONE-gamma,DIV32_16_Q8(st->old_ps[i],tot_noise))), 15)); - st->prior[i]=MIN16(st->prior[i], QCONST16(100.f,SNR_SHIFT)); - } - - /*print_vec(st->post, N+M, "");*/ - - /* Recursive average of the a priori SNR. A bit smoothed for the psd components */ - st->zeta[0] = PSHR32(ADD32(MULT16_16(QCONST16(.7f,15),st->zeta[0]), MULT16_16(QCONST16(.3f,15),st->prior[0])),15); - for (i=1;izeta[i] = PSHR32(ADD32(ADD32(ADD32(MULT16_16(QCONST16(.7f,15),st->zeta[i]), MULT16_16(QCONST16(.15f,15),st->prior[i])), - MULT16_16(QCONST16(.075f,15),st->prior[i-1])), MULT16_16(QCONST16(.075f,15),st->prior[i+1])),15); - for (i=N-1;izeta[i] = PSHR32(ADD32(MULT16_16(QCONST16(.7f,15),st->zeta[i]), MULT16_16(QCONST16(.3f,15),st->prior[i])),15); - - /* Speech probability of presence for the entire frame is based on the average filterbank a priori SNR */ - Zframe = 0; - for (i=N;izeta[i])); - Pframe = QCONST16(.1f,15)+MULT16_16_Q15(QCONST16(.899f,15),qcurve(DIV32_16(Zframe,st->nbands))); - - effective_echo_suppress = EXTRACT16(PSHR32(ADD32(MULT16_16(SUB16(Q15_ONE,Pframe), st->echo_suppress), MULT16_16(Pframe, st->echo_suppress_active)),15)); - - compute_gain_floor(st->noise_suppress, effective_echo_suppress, st->noise+N, st->echo_noise+N, st->gain_floor+N, M); - - /* Compute Ephraim & Malah gain speech probability of presence for each critical band (Bark scale) - Technically this is actually wrong because the EM gaim assumes a slightly different probability - distribution */ - for (i=N;iprior[i]), 15), ADD16(st->prior[i], SHL32(1,SNR_SHIFT))); - theta = MULT16_32_P15(prior_ratio, QCONST32(1.f,EXPIN_SHIFT)+SHL32(EXTEND32(st->post[i]),EXPIN_SHIFT-SNR_SHIFT)); - - MM = hypergeom_gain(theta); - /* Gain with bound */ - st->gain[i] = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM))); - /* Save old Bark power spectrum */ - st->old_ps[i] = MULT16_32_P15(QCONST16(.2f,15),st->old_ps[i]) + MULT16_32_P15(MULT16_16_P15(QCONST16(.8f,15),SQR16_Q15(st->gain[i])),ps[i]); - - P1 = QCONST16(.199f,15)+MULT16_16_Q15(QCONST16(.8f,15),qcurve (st->zeta[i])); - q = Q15_ONE-MULT16_16_Q15(Pframe,P1); -#ifdef FIXED_POINT - theta = MIN32(theta, EXTEND32(32767)); -/*Q8*/tmp = MULT16_16_Q15((SHL32(1,SNR_SHIFT)+st->prior[i]),EXTRACT16(MIN32(Q15ONE,SHR32(spx_exp(-EXTRACT16(theta)),1)))); - tmp = MIN16(QCONST16(3.,SNR_SHIFT), tmp); /* Prevent overflows in the next line*/ -/*Q8*/tmp = EXTRACT16(PSHR32(MULT16_16(PDIV32_16(SHL32(EXTEND32(q),8),(Q15_ONE-q)),tmp),8)); - st->gain2[i]=DIV32_16(SHL32(EXTEND32(32767),SNR_SHIFT), ADD16(256,tmp)); -#else - st->gain2[i]=1/(1.f + (q/(1.f-q))*(1+st->prior[i])*exp(-theta)); -#endif - } - /* Convert the EM gains and speech prob to linear frequency */ - filterbank_compute_psd16(st->bank,st->gain2+N, st->gain2); - filterbank_compute_psd16(st->bank,st->gain+N, st->gain); - - /* Use 1 for linear gain resolution (best) or 0 for Bark gain resolution (faster) */ - if (1) - { - filterbank_compute_psd16(st->bank,st->gain_floor+N, st->gain_floor); - - /* Compute gain according to the Ephraim-Malah algorithm -- linear frequency */ - for (i=0;iprior[i]), 15), ADD16(st->prior[i], SHL32(1,SNR_SHIFT))); - theta = MULT16_32_P15(prior_ratio, QCONST32(1.f,EXPIN_SHIFT)+SHL32(EXTEND32(st->post[i]),EXPIN_SHIFT-SNR_SHIFT)); - - /* Optimal estimator for loudness domain */ - MM = hypergeom_gain(theta); - /* EM gain with bound */ - g = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM))); - /* Interpolated speech probability of presence */ - p = st->gain2[i]; - - /* Constrain the gain to be close to the Bark scale gain */ - if (MULT16_16_Q15(QCONST16(.333f,15),g) > st->gain[i]) - g = MULT16_16(3,st->gain[i]); - st->gain[i] = g; - - /* Save old power spectrum */ - st->old_ps[i] = MULT16_32_P15(QCONST16(.2f,15),st->old_ps[i]) + MULT16_32_P15(MULT16_16_P15(QCONST16(.8f,15),SQR16_Q15(st->gain[i])),ps[i]); - - /* Apply gain floor */ - if (st->gain[i] < st->gain_floor[i]) - st->gain[i] = st->gain_floor[i]; - - /* Exponential decay model for reverberation (unused) */ - /*st->reverb_estimate[i] = st->reverb_decay*st->reverb_estimate[i] + st->reverb_decay*st->reverb_level*st->gain[i]*st->gain[i]*st->ps[i];*/ - - /* Take into account speech probability of presence (loudness domain MMSE estimator) */ - /* gain2 = [p*sqrt(gain)+(1-p)*sqrt(gain _floor) ]^2 */ - tmp = MULT16_16_P15(p,spx_sqrt(SHL32(EXTEND32(st->gain[i]),15))) + MULT16_16_P15(SUB16(Q15_ONE,p),spx_sqrt(SHL32(EXTEND32(st->gain_floor[i]),15))); - st->gain2[i]=SQR16_Q15(tmp); - - /* Use this if you want a log-domain MMSE estimator instead */ - /*st->gain2[i] = pow(st->gain[i], p) * pow(st->gain_floor[i],1.f-p);*/ - } - } else { - for (i=N;igain2[i]; - st->gain[i] = MAX16(st->gain[i], st->gain_floor[i]); - tmp = MULT16_16_P15(p,spx_sqrt(SHL32(EXTEND32(st->gain[i]),15))) + MULT16_16_P15(SUB16(Q15_ONE,p),spx_sqrt(SHL32(EXTEND32(st->gain_floor[i]),15))); - st->gain2[i]=SQR16_Q15(tmp); - } - filterbank_compute_psd16(st->bank,st->gain2+N, st->gain2); - } - - /* If noise suppression is off, don't apply the gain (but then why call this in the first place!) */ - if (!st->denoise_enabled) - { - for (i=0;igain2[i]=Q15_ONE; - } - - /* Apply computed gain */ - for (i=1;ift[2*i-1] = MULT16_16_P15(st->gain2[i],st->ft[2*i-1]); - st->ft[2*i] = MULT16_16_P15(st->gain2[i],st->ft[2*i]); - } - st->ft[0] = MULT16_16_P15(st->gain2[0],st->ft[0]); - st->ft[2*N-1] = MULT16_16_P15(st->gain2[N-1],st->ft[2*N-1]); - - /*FIXME: This *will* not work for fixed-point */ -#ifndef FIXED_POINT - if (st->agc_enabled) - speex_compute_agc(st, Pframe, st->ft); -#endif - - /* Inverse FFT with 1/N scaling */ - spx_ifft(st->fft_lookup, st->ft, st->frame); - /* Scale back to original (lower) amplitude */ - for (i=0;i<2*N;i++) - st->frame[i] = PSHR16(st->frame[i], st->frame_shift); - - /*FIXME: This *will* not work for fixed-point */ -#ifndef FIXED_POINT - if (st->agc_enabled) - { - float max_sample=0; - for (i=0;i<2*N;i++) - if (fabs(st->frame[i])>max_sample) - max_sample = fabs(st->frame[i]); - if (max_sample>28000.f) - { - float damp = 28000.f/max_sample; - for (i=0;i<2*N;i++) - st->frame[i] *= damp; - } - } -#endif - - /* Synthesis window (for WOLA) */ - for (i=0;i<2*N;i++) - st->frame[i] = MULT16_16_Q15(st->frame[i], st->window[i]); - - /* Perform overlap and add */ - for (i=0;ioutbuf[i]), EXTEND32(st->frame[i]))); - for (i=0;iframe[N3+i]; - - /* Update outbuf */ - for (i=0;ioutbuf[i] = st->frame[st->frame_size+i]; - - /* FIXME: This VAD is a kludge */ - st->speech_prob = Pframe; - if (st->vad_enabled) - { - if (st->speech_prob > st->speech_prob_start || (st->was_speech && st->speech_prob > st->speech_prob_continue)) - { - st->was_speech=1; - return 1; - } else - { - st->was_speech=0; - return 0; - } - } else { - return 1; - } -} - -EXPORT void speex_preprocess_estimate_update(SpeexPreprocessState *st, spx_int16_t *x) -{ - int i; - int N = st->ps_size; - int N3 = 2*N - st->frame_size; - int M; - spx_word32_t *ps=st->ps; - - M = st->nbands; - st->min_count++; - - preprocess_analysis(st, x); - - update_noise_prob(st); - - for (i=1;iupdate_prob[i] || st->ps[i] < PSHR32(st->noise[i],NOISE_SHIFT)) - { - st->noise[i] = MULT16_32_Q15(QCONST16(.95f,15),st->noise[i]) + MULT16_32_Q15(QCONST16(.05f,15),SHL32(st->ps[i],NOISE_SHIFT)); - } - } - - for (i=0;ioutbuf[i] = MULT16_16_Q15(x[st->frame_size-N3+i],st->window[st->frame_size+i]); - - /* Save old power spectrum */ - for (i=0;iold_ps[i] = ps[i]; - - for (i=0;ireverb_estimate[i] = MULT16_32_Q15(st->reverb_decay, st->reverb_estimate[i]); -} - - -EXPORT int speex_preprocess_ctl(SpeexPreprocessState *state, int request, void *ptr) -{ - int i; - SpeexPreprocessState *st; - st=(SpeexPreprocessState*)state; - switch(request) - { - case SPEEX_PREPROCESS_SET_DENOISE: - st->denoise_enabled = (*(spx_int32_t*)ptr); - break; - case SPEEX_PREPROCESS_GET_DENOISE: - (*(spx_int32_t*)ptr) = st->denoise_enabled; - break; -#ifndef FIXED_POINT - case SPEEX_PREPROCESS_SET_AGC: - st->agc_enabled = (*(spx_int32_t*)ptr); - break; - case SPEEX_PREPROCESS_GET_AGC: - (*(spx_int32_t*)ptr) = st->agc_enabled; - break; -#ifndef DISABLE_FLOAT_API - case SPEEX_PREPROCESS_SET_AGC_LEVEL: - st->agc_level = (*(float*)ptr); - if (st->agc_level<1) - st->agc_level=1; - if (st->agc_level>32768) - st->agc_level=32768; - break; - case SPEEX_PREPROCESS_GET_AGC_LEVEL: - (*(float*)ptr) = st->agc_level; - break; -#endif /* #ifndef DISABLE_FLOAT_API */ - case SPEEX_PREPROCESS_SET_AGC_INCREMENT: - st->max_increase_step = exp(0.11513f * (*(spx_int32_t*)ptr)*st->frame_size / st->sampling_rate); - break; - case SPEEX_PREPROCESS_GET_AGC_INCREMENT: - (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->max_increase_step)*st->sampling_rate/st->frame_size); - break; - case SPEEX_PREPROCESS_SET_AGC_DECREMENT: - st->max_decrease_step = exp(0.11513f * (*(spx_int32_t*)ptr)*st->frame_size / st->sampling_rate); - break; - case SPEEX_PREPROCESS_GET_AGC_DECREMENT: - (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->max_decrease_step)*st->sampling_rate/st->frame_size); - break; - case SPEEX_PREPROCESS_SET_AGC_MAX_GAIN: - st->max_gain = exp(0.11513f * (*(spx_int32_t*)ptr)); - break; - case SPEEX_PREPROCESS_GET_AGC_MAX_GAIN: - (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->max_gain)); - break; -#endif - case SPEEX_PREPROCESS_SET_VAD: - speex_warning("The VAD has been replaced by a hack pending a complete rewrite"); - st->vad_enabled = (*(spx_int32_t*)ptr); - break; - case SPEEX_PREPROCESS_GET_VAD: - (*(spx_int32_t*)ptr) = st->vad_enabled; - break; - - case SPEEX_PREPROCESS_SET_DEREVERB: - st->dereverb_enabled = (*(spx_int32_t*)ptr); - for (i=0;ips_size;i++) - st->reverb_estimate[i]=0; - break; - case SPEEX_PREPROCESS_GET_DEREVERB: - (*(spx_int32_t*)ptr) = st->dereverb_enabled; - break; - - case SPEEX_PREPROCESS_SET_DEREVERB_LEVEL: - /* FIXME: Re-enable when de-reverberation is actually enabled again */ - /*st->reverb_level = (*(float*)ptr);*/ - break; - case SPEEX_PREPROCESS_GET_DEREVERB_LEVEL: - /* FIXME: Re-enable when de-reverberation is actually enabled again */ - /*(*(float*)ptr) = st->reverb_level;*/ - break; - - case SPEEX_PREPROCESS_SET_DEREVERB_DECAY: - /* FIXME: Re-enable when de-reverberation is actually enabled again */ - /*st->reverb_decay = (*(float*)ptr);*/ - break; - case SPEEX_PREPROCESS_GET_DEREVERB_DECAY: - /* FIXME: Re-enable when de-reverberation is actually enabled again */ - /*(*(float*)ptr) = st->reverb_decay;*/ - break; - - case SPEEX_PREPROCESS_SET_PROB_START: - *(spx_int32_t*)ptr = MIN32(100,MAX32(0, *(spx_int32_t*)ptr)); - st->speech_prob_start = DIV32_16(MULT16_16(Q15ONE,*(spx_int32_t*)ptr), 100); - break; - case SPEEX_PREPROCESS_GET_PROB_START: - (*(spx_int32_t*)ptr) = MULT16_16_Q15(st->speech_prob_start, 100); - break; - - case SPEEX_PREPROCESS_SET_PROB_CONTINUE: - *(spx_int32_t*)ptr = MIN32(100,MAX32(0, *(spx_int32_t*)ptr)); - st->speech_prob_continue = DIV32_16(MULT16_16(Q15ONE,*(spx_int32_t*)ptr), 100); - break; - case SPEEX_PREPROCESS_GET_PROB_CONTINUE: - (*(spx_int32_t*)ptr) = MULT16_16_Q15(st->speech_prob_continue, 100); - break; - - case SPEEX_PREPROCESS_SET_NOISE_SUPPRESS: - st->noise_suppress = -ABS(*(spx_int32_t*)ptr); - break; - case SPEEX_PREPROCESS_GET_NOISE_SUPPRESS: - (*(spx_int32_t*)ptr) = st->noise_suppress; - break; - case SPEEX_PREPROCESS_SET_ECHO_SUPPRESS: - st->echo_suppress = -ABS(*(spx_int32_t*)ptr); - break; - case SPEEX_PREPROCESS_GET_ECHO_SUPPRESS: - (*(spx_int32_t*)ptr) = st->echo_suppress; - break; - case SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE: - st->echo_suppress_active = -ABS(*(spx_int32_t*)ptr); - break; - case SPEEX_PREPROCESS_GET_ECHO_SUPPRESS_ACTIVE: - (*(spx_int32_t*)ptr) = st->echo_suppress_active; - break; - case SPEEX_PREPROCESS_SET_ECHO_STATE: - st->echo_state = (SpeexEchoState*)ptr; - break; - case SPEEX_PREPROCESS_GET_ECHO_STATE: - (*(SpeexEchoState**)ptr) = (SpeexEchoState*)st->echo_state; - break; -#ifndef FIXED_POINT - case SPEEX_PREPROCESS_GET_AGC_LOUDNESS: - (*(spx_int32_t*)ptr) = pow(st->loudness, 1.0/LOUDNESS_EXP); - break; - case SPEEX_PREPROCESS_GET_AGC_GAIN: - (*(spx_int32_t*)ptr) = floor(.5+8.6858*log(st->agc_gain)); - break; -#endif - case SPEEX_PREPROCESS_GET_PSD_SIZE: - case SPEEX_PREPROCESS_GET_NOISE_PSD_SIZE: - (*(spx_int32_t*)ptr) = st->ps_size; - break; - case SPEEX_PREPROCESS_GET_PSD: - for(i=0;ips_size;i++) - ((spx_int32_t *)ptr)[i] = (spx_int32_t) st->ps[i]; - break; - case SPEEX_PREPROCESS_GET_NOISE_PSD: - for(i=0;ips_size;i++) - ((spx_int32_t *)ptr)[i] = (spx_int32_t) PSHR32(st->noise[i], NOISE_SHIFT); - break; - case SPEEX_PREPROCESS_GET_PROB: - (*(spx_int32_t*)ptr) = MULT16_16_Q15(st->speech_prob, 100); - break; -#ifndef FIXED_POINT - case SPEEX_PREPROCESS_SET_AGC_TARGET: - st->agc_level = (*(spx_int32_t*)ptr); - if (st->agc_level<1) - st->agc_level=1; - if (st->agc_level>32768) - st->agc_level=32768; - break; - case SPEEX_PREPROCESS_GET_AGC_TARGET: - (*(spx_int32_t*)ptr) = st->agc_level; - break; -#endif - default: - speex_warning_int("Unknown speex_preprocess_ctl request: ", request); - return -1; - } - return 0; -} - -#ifdef FIXED_DEBUG -long long spx_mips=0; -#endif - diff --git a/speex/libspeexdsp/pseudofloat.h b/speex/libspeexdsp/pseudofloat.h deleted file mode 100644 index ed5ab14b0..000000000 --- a/speex/libspeexdsp/pseudofloat.h +++ /dev/null @@ -1,379 +0,0 @@ -/* Copyright (C) 2005 Jean-Marc Valin */ -/** - @file pseudofloat.h - @brief Pseudo-floating point - * This header file provides a lightweight floating point type for - * use on fixed-point platforms when a large dynamic range is - * required. The new type is not compatible with the 32-bit IEEE format, - * it is not even remotely as accurate as 32-bit floats, and is not - * even guaranteed to produce even remotely correct results for code - * other than Speex. It makes all kinds of shortcuts that are acceptable - * for Speex, but may not be acceptable for your application. You're - * quite welcome to reuse this code and improve it, but don't assume - * it works out of the box. Most likely, it doesn't. - */ -/* - 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. -*/ - -#ifndef PSEUDOFLOAT_H -#define PSEUDOFLOAT_H - -#include "arch.h" -#include "os_support.h" -#include "math_approx.h" -#include - -#ifdef FIXED_POINT - -typedef struct { - spx_int16_t m; - spx_int16_t e; -} spx_float_t; - -static const spx_float_t FLOAT_ZERO = {0,0}; -static const spx_float_t FLOAT_ONE = {16384,-14}; -static const spx_float_t FLOAT_HALF = {16384,-15}; - -#define MIN(a,b) ((a)<(b)?(a):(b)) -static inline spx_float_t PSEUDOFLOAT(spx_int32_t x) -{ - int e=0; - int sign=0; - if (x<0) - { - sign = 1; - x = -x; - } - if (x==0) - { - spx_float_t r = {0,0}; - return r; - } - e = spx_ilog2(ABS32(x))-14; - x = VSHR32(x, e); - if (sign) - { - spx_float_t r; - r.m = -x; - r.e = e; - return r; - } - else - { - spx_float_t r; - r.m = x; - r.e = e; - return r; - } -} - - -static inline spx_float_t FLOAT_ADD(spx_float_t a, spx_float_t b) -{ - spx_float_t r; - if (a.m==0) - return b; - else if (b.m==0) - return a; - if ((a).e > (b).e) - { - r.m = ((a).m>>1) + ((b).m>>MIN(15,(a).e-(b).e+1)); - r.e = (a).e+1; - } - else - { - r.m = ((b).m>>1) + ((a).m>>MIN(15,(b).e-(a).e+1)); - r.e = (b).e+1; - } - if (r.m>0) - { - if (r.m<16384) - { - r.m<<=1; - r.e-=1; - } - } else { - if (r.m>-16384) - { - r.m<<=1; - r.e-=1; - } - } - /*printf ("%f + %f = %f\n", REALFLOAT(a), REALFLOAT(b), REALFLOAT(r));*/ - return r; -} - -static inline spx_float_t FLOAT_SUB(spx_float_t a, spx_float_t b) -{ - spx_float_t r; - if (a.m==0) - return b; - else if (b.m==0) - return a; - if ((a).e > (b).e) - { - r.m = ((a).m>>1) - ((b).m>>MIN(15,(a).e-(b).e+1)); - r.e = (a).e+1; - } - else - { - r.m = ((a).m>>MIN(15,(b).e-(a).e+1)) - ((b).m>>1); - r.e = (b).e+1; - } - if (r.m>0) - { - if (r.m<16384) - { - r.m<<=1; - r.e-=1; - } - } else { - if (r.m>-16384) - { - r.m<<=1; - r.e-=1; - } - } - /*printf ("%f + %f = %f\n", REALFLOAT(a), REALFLOAT(b), REALFLOAT(r));*/ - return r; -} - -static inline int FLOAT_LT(spx_float_t a, spx_float_t b) -{ - if (a.m==0) - return b.m>0; - else if (b.m==0) - return a.m<0; - if ((a).e > (b).e) - return ((a).m>>1) < ((b).m>>MIN(15,(a).e-(b).e+1)); - else - return ((b).m>>1) > ((a).m>>MIN(15,(b).e-(a).e+1)); - -} - -static inline int FLOAT_GT(spx_float_t a, spx_float_t b) -{ - return FLOAT_LT(b,a); -} - -static inline spx_float_t FLOAT_MULT(spx_float_t a, spx_float_t b) -{ - spx_float_t r; - r.m = (spx_int16_t)((spx_int32_t)(a).m*(b).m>>15); - r.e = (a).e+(b).e+15; - if (r.m>0) - { - if (r.m<16384) - { - r.m<<=1; - r.e-=1; - } - } else { - if (r.m>-16384) - { - r.m<<=1; - r.e-=1; - } - } - /*printf ("%f * %f = %f\n", REALFLOAT(a), REALFLOAT(b), REALFLOAT(r));*/ - return r; -} - -static inline spx_float_t FLOAT_AMULT(spx_float_t a, spx_float_t b) -{ - spx_float_t r; - r.m = (spx_int16_t)((spx_int32_t)(a).m*(b).m>>15); - r.e = (a).e+(b).e+15; - return r; -} - - -static inline spx_float_t FLOAT_SHL(spx_float_t a, int b) -{ - spx_float_t r; - r.m = a.m; - r.e = a.e+b; - return r; -} - -static inline spx_int16_t FLOAT_EXTRACT16(spx_float_t a) -{ - if (a.e<0) - return EXTRACT16((EXTEND32(a.m)+(EXTEND32(1)<<(-a.e-1)))>>-a.e); - else - return a.m<>-a.e; - else - return EXTEND32(a.m)<=SHL32(EXTEND32(b.m-1),15)) - { - a >>= 1; - e++; - } - r.m = DIV32_16(a,b.m); - r.e = e-b.e; - return r; -} - - -/* Do NOT attempt to divide by a negative number */ -static inline spx_float_t FLOAT_DIV32(spx_word32_t a, spx_word32_t b) -{ - int e0=0,e=0; - spx_float_t r; - if (a==0) - { - return FLOAT_ZERO; - } - if (b>32767) - { - e0 = spx_ilog2(b)-14; - b = VSHR32(b, e0); - e0 = -e0; - } - e = spx_ilog2(ABS32(a))-spx_ilog2(b-1)-15; - a = VSHR32(a, e); - if (ABS32(a)>=SHL32(EXTEND32(b-1),15)) - { - a >>= 1; - e++; - } - e += e0; - r.m = DIV32_16(a,b); - r.e = e; - return r; -} - -/* Do NOT attempt to divide by a negative number */ -static inline spx_float_t FLOAT_DIVU(spx_float_t a, spx_float_t b) -{ - int e=0; - spx_int32_t num; - spx_float_t r; - if (b.m<=0) - { - speex_warning_int("Attempted to divide by", b.m); - return FLOAT_ONE; - } - num = a.m; - a.m = ABS16(a.m); - while (a.m >= b.m) - { - e++; - a.m >>= 1; - } - num = num << (15-e); - r.m = DIV32_16(num,b.m); - r.e = a.e-b.e-15+e; - return r; -} - -static inline spx_float_t FLOAT_SQRT(spx_float_t a) -{ - spx_float_t r; - spx_int32_t m; - m = SHL32(EXTEND32(a.m), 14); - r.e = a.e - 14; - if (r.e & 1) - { - r.e -= 1; - m <<= 1; - } - r.e >>= 1; - r.m = spx_sqrt(m); - return r; -} - -#else - -#define spx_float_t float -#define FLOAT_ZERO 0.f -#define FLOAT_ONE 1.f -#define FLOAT_HALF 0.5f -#define PSEUDOFLOAT(x) (x) -#define FLOAT_MULT(a,b) ((a)*(b)) -#define FLOAT_AMULT(a,b) ((a)*(b)) -#define FLOAT_MUL32(a,b) ((a)*(b)) -#define FLOAT_DIV32(a,b) ((a)/(b)) -#define FLOAT_EXTRACT16(a) (a) -#define FLOAT_EXTRACT32(a) (a) -#define FLOAT_ADD(a,b) ((a)+(b)) -#define FLOAT_SUB(a,b) ((a)-(b)) -#define REALFLOAT(x) (x) -#define FLOAT_DIV32_FLOAT(a,b) ((a)/(b)) -#define FLOAT_MUL32U(a,b) ((a)*(b)) -#define FLOAT_SHL(a,b) (a) -#define FLOAT_LT(a,b) ((a)<(b)) -#define FLOAT_GT(a,b) ((a)>(b)) -#define FLOAT_DIVU(a,b) ((a)/(b)) -#define FLOAT_SQRT(a) (spx_sqrt(a)) - -#endif - -#endif diff --git a/speex/libspeexdsp/resample.c b/speex/libspeexdsp/resample.c deleted file mode 100644 index cd0601c1b..000000000 --- a/speex/libspeexdsp/resample.c +++ /dev/null @@ -1,1241 +0,0 @@ -/* Copyright (C) 2007-2008 Jean-Marc Valin - Copyright (C) 2008 Thorvald Natvig - - File: resample.c - Arbitrary resampling code - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -/* - The design goals of this code are: - - Very fast algorithm - - SIMD-friendly algorithm - - Low memory requirement - - Good *perceptual* quality (and not best SNR) - - Warning: This resampler is relatively new. Although I think I got rid of - all the major bugs and I don't expect the API to change anymore, there - may be something I've missed. So use with caution. - - This algorithm is based on this original resampling algorithm: - Smith, Julius O. Digital Audio Resampling Home Page - Center for Computer Research in Music and Acoustics (CCRMA), - Stanford University, 2007. - Web published at https://ccrma.stanford.edu/~jos/resample/. - - There is one main difference, though. This resampler uses cubic - interpolation instead of linear interpolation in the above paper. This - makes the table much smaller and makes it possible to compute that table - on a per-stream basis. In turn, being able to tweak the table for each - stream makes it possible to both reduce complexity on simple ratios - (e.g. 2/3), and get rid of the rounding operations in the inner loop. - The latter both reduces CPU time and makes the algorithm more SIMD-friendly. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef OUTSIDE_SPEEX -#include -static void *speex_alloc(int size) {return calloc(size,1);} -static void *speex_realloc(void *ptr, int size) {return realloc(ptr, size);} -static void speex_free(void *ptr) {free(ptr);} -#ifndef EXPORT -#define EXPORT -#endif -#include "speex_resampler.h" -#include "arch.h" -#else /* OUTSIDE_SPEEX */ - -#include "speex/speex_resampler.h" -#include "arch.h" -#include "os_support.h" -#endif /* OUTSIDE_SPEEX */ - -#include -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif - -#define IMAX(a,b) ((a) > (b) ? (a) : (b)) -#define IMIN(a,b) ((a) < (b) ? (a) : (b)) - -#ifndef NULL -#define NULL 0 -#endif - -#ifndef UINT32_MAX -#define UINT32_MAX 4294967295U -#endif - -#ifdef USE_SSE -#include "resample_sse.h" -#endif - -#ifdef USE_NEON -#include "resample_neon.h" -#endif - -/* Numer of elements to allocate on the stack */ -#ifdef VAR_ARRAYS -#define FIXED_STACK_ALLOC 8192 -#else -#define FIXED_STACK_ALLOC 1024 -#endif - -#define EXPORT __attribute__((visibility("default"))) - -typedef int (*resampler_basic_func)(SpeexResamplerState *, spx_uint32_t , const spx_word16_t *, spx_uint32_t *, spx_word16_t *, spx_uint32_t *); - -struct SpeexResamplerState_ { - spx_uint32_t in_rate; - spx_uint32_t out_rate; - spx_uint32_t num_rate; - spx_uint32_t den_rate; - - int quality; - spx_uint32_t nb_channels; - spx_uint32_t filt_len; - spx_uint32_t mem_alloc_size; - spx_uint32_t buffer_size; - int int_advance; - int frac_advance; - float cutoff; - spx_uint32_t oversample; - int initialised; - int started; - - /* These are per-channel */ - spx_int32_t *last_sample; - spx_uint32_t *samp_frac_num; - spx_uint32_t *magic_samples; - - spx_word16_t *mem; - spx_word16_t *sinc_table; - spx_uint32_t sinc_table_length; - resampler_basic_func resampler_ptr; - - int in_stride; - int out_stride; -} ; - -static const double kaiser12_table[68] = { - 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076, - 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014, - 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601, - 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014, - 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490, - 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546, - 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178, - 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947, - 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058, - 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438, - 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734, - 0.00001000, 0.00000000}; -/* -static const double kaiser12_table[36] = { - 0.99440475, 1.00000000, 0.99440475, 0.97779076, 0.95066529, 0.91384741, - 0.86843014, 0.81573067, 0.75723148, 0.69451601, 0.62920216, 0.56287762, - 0.49704014, 0.43304576, 0.37206735, 0.31506490, 0.26276832, 0.21567274, - 0.17404546, 0.13794294, 0.10723616, 0.08164178, 0.06075685, 0.04409466, - 0.03111947, 0.02127838, 0.01402878, 0.00886058, 0.00531256, 0.00298291, - 0.00153438, 0.00069463, 0.00025272, 0.0000527734, 0.00000500, 0.00000000}; -*/ -static const double kaiser10_table[36] = { - 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446, - 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347, - 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962, - 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451, - 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739, - 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000}; - -static const double kaiser8_table[36] = { - 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200, - 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126, - 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272, - 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758, - 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490, - 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000}; - -static const double kaiser6_table[36] = { - 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003, - 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565, - 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561, - 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058, - 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600, - 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000}; - -struct FuncDef { - const double *table; - int oversample; -}; - -static const struct FuncDef kaiser12_funcdef = {kaiser12_table, 64}; -#define KAISER12 (&kaiser12_funcdef) -static const struct FuncDef kaiser10_funcdef = {kaiser10_table, 32}; -#define KAISER10 (&kaiser10_funcdef) -static const struct FuncDef kaiser8_funcdef = {kaiser8_table, 32}; -#define KAISER8 (&kaiser8_funcdef) -static const struct FuncDef kaiser6_funcdef = {kaiser6_table, 32}; -#define KAISER6 (&kaiser6_funcdef) - -struct QualityMapping { - int base_length; - int oversample; - float downsample_bandwidth; - float upsample_bandwidth; - const struct FuncDef *window_func; -}; - - -/* This table maps conversion quality to internal parameters. There are two - reasons that explain why the up-sampling bandwidth is larger than the - down-sampling bandwidth: - 1) When up-sampling, we can assume that the spectrum is already attenuated - close to the Nyquist rate (from an A/D or a previous resampling filter) - 2) Any aliasing that occurs very close to the Nyquist rate will be masked - by the sinusoids/noise just below the Nyquist rate (guaranteed only for - up-sampling). -*/ -static const struct QualityMapping quality_map[11] = { - { 8, 4, 0.830f, 0.860f, KAISER6 }, /* Q0 */ - { 16, 4, 0.850f, 0.880f, KAISER6 }, /* Q1 */ - { 32, 4, 0.882f, 0.910f, KAISER6 }, /* Q2 */ /* 82.3% cutoff ( ~60 dB stop) 6 */ - { 48, 8, 0.895f, 0.917f, KAISER8 }, /* Q3 */ /* 84.9% cutoff ( ~80 dB stop) 8 */ - { 64, 8, 0.921f, 0.940f, KAISER8 }, /* Q4 */ /* 88.7% cutoff ( ~80 dB stop) 8 */ - { 80, 16, 0.922f, 0.940f, KAISER10}, /* Q5 */ /* 89.1% cutoff (~100 dB stop) 10 */ - { 96, 16, 0.940f, 0.945f, KAISER10}, /* Q6 */ /* 91.5% cutoff (~100 dB stop) 10 */ - {128, 16, 0.950f, 0.950f, KAISER10}, /* Q7 */ /* 93.1% cutoff (~100 dB stop) 10 */ - {160, 16, 0.960f, 0.960f, KAISER10}, /* Q8 */ /* 94.5% cutoff (~100 dB stop) 10 */ - {192, 32, 0.968f, 0.968f, KAISER12}, /* Q9 */ /* 95.5% cutoff (~100 dB stop) 10 */ - {256, 32, 0.975f, 0.975f, KAISER12}, /* Q10 */ /* 96.6% cutoff (~100 dB stop) 10 */ -}; -/*8,24,40,56,80,104,128,160,200,256,320*/ -static double compute_func(float x, const struct FuncDef *func) -{ - float y, frac; - double interp[4]; - int ind; - y = x*func->oversample; - ind = (int)floor(y); - frac = (y-ind); - /* CSE with handle the repeated powers */ - interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac); - interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac); - /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ - interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac); - /* Just to make sure we don't have rounding problems */ - interp[1] = 1.f-interp[3]-interp[2]-interp[0]; - - /*sum = frac*accum[1] + (1-frac)*accum[2];*/ - return interp[0]*func->table[ind] + interp[1]*func->table[ind+1] + interp[2]*func->table[ind+2] + interp[3]*func->table[ind+3]; -} - -#if 0 -#include -int main(int argc, char **argv) -{ - int i; - for (i=0;i<256;i++) - { - printf ("%f\n", compute_func(i/256., KAISER12)); - } - return 0; -} -#endif - -#ifdef FIXED_POINT -/* The slow way of computing a sinc for the table. Should improve that some day */ -static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func) -{ - /*fprintf (stderr, "%f ", x);*/ - float xx = x * cutoff; - if (fabs(x)<1e-6f) - return WORD2INT(32768.*cutoff); - else if (fabs(x) > .5f*N) - return 0; - /*FIXME: Can it really be any slower than this? */ - return WORD2INT(32768.*cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func)); -} -#else -/* The slow way of computing a sinc for the table. Should improve that some day */ -static spx_word16_t sinc(float cutoff, float x, int N, const struct FuncDef *window_func) -{ - /*fprintf (stderr, "%f ", x);*/ - float xx = x * cutoff; - if (fabs(x)<1e-6) - return cutoff; - else if (fabs(x) > .5*N) - return 0; - /*FIXME: Can it really be any slower than this? */ - return cutoff*sin(M_PI*xx)/(M_PI*xx) * compute_func(fabs(2.*x/N), window_func); -} -#endif - -#ifdef FIXED_POINT -static void cubic_coef(spx_word16_t x, spx_word16_t interp[4]) -{ - /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation - but I know it's MMSE-optimal on a sinc */ - spx_word16_t x2, x3; - x2 = MULT16_16_P15(x, x); - x3 = MULT16_16_P15(x, x2); - interp[0] = PSHR32(MULT16_16(QCONST16(-0.16667f, 15),x) + MULT16_16(QCONST16(0.16667f, 15),x3),15); - interp[1] = EXTRACT16(EXTEND32(x) + SHR32(SUB32(EXTEND32(x2),EXTEND32(x3)),1)); - interp[3] = PSHR32(MULT16_16(QCONST16(-0.33333f, 15),x) + MULT16_16(QCONST16(.5f,15),x2) - MULT16_16(QCONST16(0.16667f, 15),x3),15); - /* Just to make sure we don't have rounding problems */ - interp[2] = Q15_ONE-interp[0]-interp[1]-interp[3]; - if (interp[2]<32767) - interp[2]+=1; -} -#else -static void cubic_coef(spx_word16_t frac, spx_word16_t interp[4]) -{ - /* Compute interpolation coefficients. I'm not sure whether this corresponds to cubic interpolation - but I know it's MMSE-optimal on a sinc */ - interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac; - interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac; - /*interp[2] = 1.f - 0.5f*frac - frac*frac + 0.5f*frac*frac*frac;*/ - interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac; - /* Just to make sure we don't have rounding problems */ - interp[2] = 1.-interp[0]-interp[1]-interp[3]; -} -#endif - -static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const spx_word16_t *sinc_table = st->sinc_table; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - spx_word32_t sum; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *sinct = & sinc_table[samp_frac_num*N]; - const spx_word16_t *iptr = & in[last_sample]; - -#ifndef OVERRIDE_INNER_PRODUCT_SINGLE - int j; - sum = 0; - for(j=0;j= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} - -#ifdef FIXED_POINT -#else -/* This is the same as the previous function, except with a double-precision accumulator */ -static int resampler_basic_direct_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const spx_word16_t *sinc_table = st->sinc_table; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - double sum; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *sinct = & sinc_table[samp_frac_num*N]; - const spx_word16_t *iptr = & in[last_sample]; - -#ifndef OVERRIDE_INNER_PRODUCT_DOUBLE - int j; - double accum[4] = {0,0,0,0}; - - for(j=0;j= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} -#endif - -static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - spx_word32_t sum; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *iptr = & in[last_sample]; - - const int offset = samp_frac_num*st->oversample/st->den_rate; -#ifdef FIXED_POINT - const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); -#else - const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; -#endif - spx_word16_t interp[4]; - - -#ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE - int j; - spx_word32_t accum[4] = {0,0,0,0}; - - for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); - accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); - accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); - accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); - } - - cubic_coef(frac, interp); - sum = MULT16_32_Q15(interp[0],SHR32(accum[0], 1)) + MULT16_32_Q15(interp[1],SHR32(accum[1], 1)) + MULT16_32_Q15(interp[2],SHR32(accum[2], 1)) + MULT16_32_Q15(interp[3],SHR32(accum[3], 1)); - sum = SATURATE32PSHR(sum, 15, 32767); -#else - cubic_coef(frac, interp); - sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); -#endif - - out[out_stride * out_sample++] = sum; - last_sample += int_advance; - samp_frac_num += frac_advance; - if (samp_frac_num >= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} - -#ifdef FIXED_POINT -#else -/* This is the same as the previous function, except with a double-precision accumulator */ -static int resampler_basic_interpolate_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - const int N = st->filt_len; - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - spx_word32_t sum; - - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - const spx_word16_t *iptr = & in[last_sample]; - - const int offset = samp_frac_num*st->oversample/st->den_rate; -#ifdef FIXED_POINT - const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate); -#else - const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate; -#endif - spx_word16_t interp[4]; - - -#ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE - int j; - double accum[4] = {0,0,0,0}; - - for(j=0;jsinc_table[4+(j+1)*st->oversample-offset-2]); - accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]); - accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]); - accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]); - } - - cubic_coef(frac, interp); - sum = MULT16_32_Q15(interp[0],accum[0]) + MULT16_32_Q15(interp[1],accum[1]) + MULT16_32_Q15(interp[2],accum[2]) + MULT16_32_Q15(interp[3],accum[3]); -#else - cubic_coef(frac, interp); - sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp); -#endif - - out[out_stride * out_sample++] = PSHR32(sum,15); - last_sample += int_advance; - samp_frac_num += frac_advance; - if (samp_frac_num >= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} -#endif - -/* This resampler is used to produce zero output in situations where memory - for the filter could not be allocated. The expected numbers of input and - output samples are still processed so that callers failing to check error - codes are not surprised, possibly getting into infinite loops. */ -static int resampler_basic_zero(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - int out_sample = 0; - int last_sample = st->last_sample[channel_index]; - spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index]; - const int out_stride = st->out_stride; - const int int_advance = st->int_advance; - const int frac_advance = st->frac_advance; - const spx_uint32_t den_rate = st->den_rate; - - (void)in; - while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len)) - { - out[out_stride * out_sample++] = 0; - last_sample += int_advance; - samp_frac_num += frac_advance; - if (samp_frac_num >= den_rate) - { - samp_frac_num -= den_rate; - last_sample++; - } - } - - st->last_sample[channel_index] = last_sample; - st->samp_frac_num[channel_index] = samp_frac_num; - return out_sample; -} - -static int multiply_frac(spx_uint32_t *result, spx_uint32_t value, spx_uint32_t num, spx_uint32_t den) -{ - spx_uint32_t major = value / den; - spx_uint32_t remain = value % den; - /* TODO: Could use 64 bits operation to check for overflow. But only guaranteed in C99+ */ - if (remain > UINT32_MAX / num || major > UINT32_MAX / num - || major * num > UINT32_MAX - remain * num / den) - return RESAMPLER_ERR_OVERFLOW; - *result = remain * num / den + major * num; - return RESAMPLER_ERR_SUCCESS; -} - -static int update_filter(SpeexResamplerState *st) -{ - spx_uint32_t old_length = st->filt_len; - spx_uint32_t old_alloc_size = st->mem_alloc_size; - int use_direct; - spx_uint32_t min_sinc_table_length; - spx_uint32_t min_alloc_size; - - st->int_advance = st->num_rate/st->den_rate; - st->frac_advance = st->num_rate%st->den_rate; - st->oversample = quality_map[st->quality].oversample; - st->filt_len = quality_map[st->quality].base_length; - - if (st->num_rate > st->den_rate) - { - /* down-sampling */ - st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate; - if (multiply_frac(&st->filt_len,st->filt_len,st->num_rate,st->den_rate) != RESAMPLER_ERR_SUCCESS) - goto fail; - /* Round up to make sure we have a multiple of 8 for SSE */ - st->filt_len = ((st->filt_len-1)&(~0x7))+8; - if (2*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (4*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (8*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (16*st->den_rate < st->num_rate) - st->oversample >>= 1; - if (st->oversample < 1) - st->oversample = 1; - } else { - /* up-sampling */ - st->cutoff = quality_map[st->quality].upsample_bandwidth; - } - -#ifdef RESAMPLE_FULL_SINC_TABLE - use_direct = 1; - if (INT_MAX/sizeof(spx_word16_t)/st->den_rate < st->filt_len) - goto fail; -#else - /* Choose the resampling type that requires the least amount of memory */ - use_direct = st->filt_len*st->den_rate <= st->filt_len*st->oversample+8 - && INT_MAX/sizeof(spx_word16_t)/st->den_rate >= st->filt_len; -#endif - if (use_direct) - { - min_sinc_table_length = st->filt_len*st->den_rate; - } else { - if ((INT_MAX/sizeof(spx_word16_t)-8)/st->oversample < st->filt_len) - goto fail; - - min_sinc_table_length = st->filt_len*st->oversample+8; - } - if (st->sinc_table_length < min_sinc_table_length) - { - spx_word16_t *sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,min_sinc_table_length*sizeof(spx_word16_t)); - if (!sinc_table) - goto fail; - - st->sinc_table = sinc_table; - st->sinc_table_length = min_sinc_table_length; - } - if (use_direct) - { - spx_uint32_t i; - for (i=0;iden_rate;i++) - { - spx_int32_t j; - for (j=0;jfilt_len;j++) - { - st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); - } - } -#ifdef FIXED_POINT - st->resampler_ptr = resampler_basic_direct_single; -#else - if (st->quality>8) - st->resampler_ptr = resampler_basic_direct_double; - else - st->resampler_ptr = resampler_basic_direct_single; -#endif - /*fprintf (stderr, "resampler uses direct sinc table and normalised cutoff %f\n", cutoff);*/ - } else { - spx_int32_t i; - for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++) - st->sinc_table[i+4] = sinc(st->cutoff,(i/(float)st->oversample - st->filt_len/2), st->filt_len, quality_map[st->quality].window_func); -#ifdef FIXED_POINT - st->resampler_ptr = resampler_basic_interpolate_single; -#else - if (st->quality>8) - st->resampler_ptr = resampler_basic_interpolate_double; - else - st->resampler_ptr = resampler_basic_interpolate_single; -#endif - /*fprintf (stderr, "resampler uses interpolated sinc table and normalised cutoff %f\n", cutoff);*/ - } - - /* Here's the place where we update the filter memory to take into account - the change in filter length. It's probably the messiest part of the code - due to handling of lots of corner cases. */ - - /* Adding buffer_size to filt_len won't overflow here because filt_len - could be multiplied by sizeof(spx_word16_t) above. */ - min_alloc_size = st->filt_len-1 + st->buffer_size; - if (min_alloc_size > st->mem_alloc_size) - { - spx_word16_t *mem; - if (INT_MAX/sizeof(spx_word16_t)/st->nb_channels < min_alloc_size) - goto fail; - else if (!(mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*min_alloc_size * sizeof(*mem)))) - goto fail; - - st->mem = mem; - st->mem_alloc_size = min_alloc_size; - } - if (!st->started) - { - spx_uint32_t i; - for (i=0;inb_channels*st->mem_alloc_size;i++) - st->mem[i] = 0; - /*speex_warning("reinit filter");*/ - } else if (st->filt_len > old_length) - { - spx_uint32_t i; - /* Increase the filter length */ - /*speex_warning("increase filter size");*/ - for (i=st->nb_channels;i--;) - { - spx_uint32_t j; - spx_uint32_t olen = old_length; - /*if (st->magic_samples[i])*/ - { - /* Try and remove the magic samples as if nothing had happened */ - - /* FIXME: This is wrong but for now we need it to avoid going over the array bounds */ - olen = old_length + 2*st->magic_samples[i]; - for (j=old_length-1+st->magic_samples[i];j--;) - st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j]; - for (j=0;jmagic_samples[i];j++) - st->mem[i*st->mem_alloc_size+j] = 0; - st->magic_samples[i] = 0; - } - if (st->filt_len > olen) - { - /* If the new filter length is still bigger than the "augmented" length */ - /* Copy data going backward */ - for (j=0;jmem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)]; - /* Then put zeros for lack of anything better */ - for (;jfilt_len-1;j++) - st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0; - /* Adjust last_sample */ - st->last_sample[i] += (st->filt_len - olen)/2; - } else { - /* Put back some of the magic! */ - st->magic_samples[i] = (olen - st->filt_len)/2; - for (j=0;jfilt_len-1+st->magic_samples[i];j++) - st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; - } - } - } else if (st->filt_len < old_length) - { - spx_uint32_t i; - /* Reduce filter length, this a bit tricky. We need to store some of the memory as "magic" - samples so they can be used directly as input the next time(s) */ - for (i=0;inb_channels;i++) - { - spx_uint32_t j; - spx_uint32_t old_magic = st->magic_samples[i]; - st->magic_samples[i] = (old_length - st->filt_len)/2; - /* We must copy some of the memory that's no longer used */ - /* Copy data going backward */ - for (j=0;jfilt_len-1+st->magic_samples[i]+old_magic;j++) - st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]]; - st->magic_samples[i] += old_magic; - } - } - return RESAMPLER_ERR_SUCCESS; - -fail: - st->resampler_ptr = resampler_basic_zero; - /* st->mem may still contain consumed input samples for the filter. - Restore filt_len so that filt_len - 1 still points to the position after - the last of these samples. */ - st->filt_len = old_length; - return RESAMPLER_ERR_ALLOC_FAILED; -} - -EXPORT SpeexResamplerState *speex_resampler_init(spx_uint32_t nb_channels, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) -{ - return speex_resampler_init_frac(nb_channels, in_rate, out_rate, in_rate, out_rate, quality, err); -} - -EXPORT SpeexResamplerState *speex_resampler_init_frac(spx_uint32_t nb_channels, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate, int quality, int *err) -{ - SpeexResamplerState *st; - int filter_err; - - if (nb_channels == 0 || ratio_num == 0 || ratio_den == 0 || quality > 10 || quality < 0) - { - if (err) - *err = RESAMPLER_ERR_INVALID_ARG; - return NULL; - } - st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState)); - if (!st) - { - if (err) - *err = RESAMPLER_ERR_ALLOC_FAILED; - return NULL; - } - st->initialised = 0; - st->started = 0; - st->in_rate = 0; - st->out_rate = 0; - st->num_rate = 0; - st->den_rate = 0; - st->quality = -1; - st->sinc_table_length = 0; - st->mem_alloc_size = 0; - st->filt_len = 0; - st->mem = 0; - st->resampler_ptr = 0; - - st->cutoff = 1.f; - st->nb_channels = nb_channels; - st->in_stride = 1; - st->out_stride = 1; - - st->buffer_size = 160; - - /* Per channel data */ - if (!(st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(spx_int32_t)))) - goto fail; - if (!(st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t)))) - goto fail; - if (!(st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t)))) - goto fail; - - speex_resampler_set_quality(st, quality); - speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate); - - filter_err = update_filter(st); - if (filter_err == RESAMPLER_ERR_SUCCESS) - { - st->initialised = 1; - } else { - speex_resampler_destroy(st); - st = NULL; - } - if (err) - *err = filter_err; - - return st; - -fail: - if (err) - *err = RESAMPLER_ERR_ALLOC_FAILED; - speex_resampler_destroy(st); - return NULL; -} - -EXPORT void speex_resampler_destroy(SpeexResamplerState *st) -{ - speex_free(st->mem); - speex_free(st->sinc_table); - speex_free(st->last_sample); - speex_free(st->magic_samples); - speex_free(st->samp_frac_num); - speex_free(st); -} - -static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len) -{ - int j=0; - const int N = st->filt_len; - int out_sample = 0; - spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; - spx_uint32_t ilen; - - st->started = 1; - - /* Call the right resampler through the function ptr */ - out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len); - - if (st->last_sample[channel_index] < (spx_int32_t)*in_len) - *in_len = st->last_sample[channel_index]; - *out_len = out_sample; - st->last_sample[channel_index] -= *in_len; - - ilen = *in_len; - - for(j=0;jmagic_samples[channel_index]; - spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size; - const int N = st->filt_len; - - speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len); - - st->magic_samples[channel_index] -= tmp_in_len; - - /* If we couldn't process all "magic" input samples, save the rest for next time */ - if (st->magic_samples[channel_index]) - { - spx_uint32_t i; - for (i=0;imagic_samples[channel_index];i++) - mem[N-1+i]=mem[N-1+i+tmp_in_len]; - } - *out += out_len*st->out_stride; - return out_len; -} - -#ifdef FIXED_POINT -EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) -#else -EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) -#endif -{ - int j; - spx_uint32_t ilen = *in_len; - spx_uint32_t olen = *out_len; - spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; - const int filt_offs = st->filt_len - 1; - const spx_uint32_t xlen = st->mem_alloc_size - filt_offs; - const int istride = st->in_stride; - - if (st->magic_samples[channel_index]) - olen -= speex_resampler_magic(st, channel_index, &out, olen); - if (! st->magic_samples[channel_index]) { - while (ilen && olen) { - spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; - spx_uint32_t ochunk = olen; - - if (in) { - for(j=0;jout_stride; - if (in) - in += ichunk * istride; - } - } - *in_len -= ilen; - *out_len -= olen; - return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; -} - -#ifdef FIXED_POINT -EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) -#else -EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) -#endif -{ - int j; - const int istride_save = st->in_stride; - const int ostride_save = st->out_stride; - spx_uint32_t ilen = *in_len; - spx_uint32_t olen = *out_len; - spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size; - const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1); -#ifdef VAR_ARRAYS - const unsigned int ylen = (olen < FIXED_STACK_ALLOC) ? olen : FIXED_STACK_ALLOC; - spx_word16_t ystack[ylen]; -#else - const unsigned int ylen = FIXED_STACK_ALLOC; - spx_word16_t ystack[FIXED_STACK_ALLOC]; -#endif - - st->out_stride = 1; - - while (ilen && olen) { - spx_word16_t *y = ystack; - spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen; - spx_uint32_t ochunk = (olen > ylen) ? ylen : olen; - spx_uint32_t omagic = 0; - - if (st->magic_samples[channel_index]) { - omagic = speex_resampler_magic(st, channel_index, &y, ochunk); - ochunk -= omagic; - olen -= omagic; - } - if (! st->magic_samples[channel_index]) { - if (in) { - for(j=0;jfilt_len-1]=WORD2INT(in[j*istride_save]); -#else - x[j+st->filt_len-1]=in[j*istride_save]; -#endif - } else { - for(j=0;jfilt_len-1]=0; - } - - speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk); - } else { - ichunk = 0; - ochunk = 0; - } - - for (j=0;jout_stride = ostride_save; - *in_len -= ilen; - *out_len -= olen; - - return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len) -{ - spx_uint32_t i; - int istride_save, ostride_save; - spx_uint32_t bak_out_len = *out_len; - spx_uint32_t bak_in_len = *in_len; - istride_save = st->in_stride; - ostride_save = st->out_stride; - st->in_stride = st->out_stride = st->nb_channels; - for (i=0;inb_channels;i++) - { - *out_len = bak_out_len; - *in_len = bak_in_len; - if (in != NULL) - speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len); - else - speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len); - } - st->in_stride = istride_save; - st->out_stride = ostride_save; - return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len) -{ - spx_uint32_t i; - int istride_save, ostride_save; - spx_uint32_t bak_out_len = *out_len; - spx_uint32_t bak_in_len = *in_len; - istride_save = st->in_stride; - ostride_save = st->out_stride; - st->in_stride = st->out_stride = st->nb_channels; - for (i=0;inb_channels;i++) - { - *out_len = bak_out_len; - *in_len = bak_in_len; - if (in != NULL) - speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len); - else - speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len); - } - st->in_stride = istride_save; - st->out_stride = ostride_save; - return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate) -{ - return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate); -} - -EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate) -{ - *in_rate = st->in_rate; - *out_rate = st->out_rate; -} - -static inline spx_uint32_t compute_gcd(spx_uint32_t a, spx_uint32_t b) -{ - while (b != 0) - { - spx_uint32_t temp = a; - - a = b; - b = temp % b; - } - return a; -} - -EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate) -{ - spx_uint32_t fact; - spx_uint32_t old_den; - spx_uint32_t i; - - if (ratio_num == 0 || ratio_den == 0) - return RESAMPLER_ERR_INVALID_ARG; - - if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den) - return RESAMPLER_ERR_SUCCESS; - - old_den = st->den_rate; - st->in_rate = in_rate; - st->out_rate = out_rate; - st->num_rate = ratio_num; - st->den_rate = ratio_den; - - fact = compute_gcd(st->num_rate, st->den_rate); - - st->num_rate /= fact; - st->den_rate /= fact; - - if (old_den > 0) - { - for (i=0;inb_channels;i++) - { - if (multiply_frac(&st->samp_frac_num[i],st->samp_frac_num[i],st->den_rate,old_den) != RESAMPLER_ERR_SUCCESS) - return RESAMPLER_ERR_OVERFLOW; - /* Safety net */ - if (st->samp_frac_num[i] >= st->den_rate) - st->samp_frac_num[i] = st->den_rate-1; - } - } - - if (st->initialised) - return update_filter(st); - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den) -{ - *ratio_num = st->num_rate; - *ratio_den = st->den_rate; -} - -EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality) -{ - if (quality > 10 || quality < 0) - return RESAMPLER_ERR_INVALID_ARG; - if (st->quality == quality) - return RESAMPLER_ERR_SUCCESS; - st->quality = quality; - if (st->initialised) - return update_filter(st); - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality) -{ - *quality = st->quality; -} - -EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride) -{ - st->in_stride = stride; -} - -EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride) -{ - *stride = st->in_stride; -} - -EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride) -{ - st->out_stride = stride; -} - -EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride) -{ - *stride = st->out_stride; -} - -EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st) -{ - return st->filt_len / 2; -} - -EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st) -{ - return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate; -} - -EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st) -{ - spx_uint32_t i; - for (i=0;inb_channels;i++) - st->last_sample[i] = st->filt_len/2; - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st) -{ - spx_uint32_t i; - for (i=0;inb_channels;i++) - { - st->last_sample[i] = 0; - st->magic_samples[i] = 0; - st->samp_frac_num[i] = 0; - } - for (i=0;inb_channels*st->mem_alloc_size;i++) - st->mem[i] = 0; - return RESAMPLER_ERR_SUCCESS; -} - -EXPORT const char *speex_resampler_strerror(int err) -{ - switch (err) - { - case RESAMPLER_ERR_SUCCESS: - return "Success."; - case RESAMPLER_ERR_ALLOC_FAILED: - return "Memory allocation failed."; - case RESAMPLER_ERR_BAD_STATE: - return "Bad resampler state."; - case RESAMPLER_ERR_INVALID_ARG: - return "Invalid argument."; - case RESAMPLER_ERR_PTR_OVERLAP: - return "Input and output buffers overlap."; - default: - return "Unknown error. Bad error code or strange version mismatch."; - } -} diff --git a/speex/libspeexdsp/resample_neon.h b/speex/libspeexdsp/resample_neon.h deleted file mode 100644 index e14ffe197..000000000 --- a/speex/libspeexdsp/resample_neon.h +++ /dev/null @@ -1,339 +0,0 @@ -/* Copyright (C) 2007-2008 Jean-Marc Valin - * Copyright (C) 2008 Thorvald Natvig - * Copyright (C) 2011 Texas Instruments - * author Jyri Sarha - */ -/** - @file resample_neon.h - @brief Resampler functions (NEON version) -*/ -/* - 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. -*/ - -#ifdef FIXED_POINT -#if defined(__aarch64__) -static inline int32_t saturate_32bit_to_16bit(int32_t a) { - int32_t ret; - asm ("fmov s0, %w[a]\n" - "sqxtn h0, s0\n" - "sxtl v0.4s, v0.4h\n" - "fmov %w[ret], s0\n" - : [ret] "=r" (ret) - : [a] "r" (a) - : "v0" ); - return ret; -} -#elif defined(__thumb2__) -static inline int32_t saturate_32bit_to_16bit(int32_t a) { - int32_t ret; - asm ("ssat %[ret], #16, %[a]" - : [ret] "=r" (ret) - : [a] "r" (a) - : ); - return ret; -} -#else -static inline int32_t saturate_32bit_to_16bit(int32_t a) { - int32_t ret; - asm ("vmov.s32 d0[0], %[a]\n" - "vqmovn.s32 d0, q0\n" - "vmov.s16 %[ret], d0[0]\n" - : [ret] "=r" (ret) - : [a] "r" (a) - : "q0"); - return ret; -} -#endif -#undef WORD2INT -#define WORD2INT(x) (saturate_32bit_to_16bit(x)) - -#define OVERRIDE_INNER_PRODUCT_SINGLE -/* Only works when len % 4 == 0 and len >= 4 */ -#if defined(__aarch64__) -static inline int32_t inner_product_single(const int16_t *a, const int16_t *b, unsigned int len) -{ - int32_t ret; - uint32_t remainder = len % 16; - len = len - remainder; - - asm volatile (" cmp %w[len], #0\n" - " b.ne 1f\n" - " ld1 {v16.4h}, [%[b]], #8\n" - " ld1 {v20.4h}, [%[a]], #8\n" - " subs %w[remainder], %w[remainder], #4\n" - " smull v0.4s, v16.4h, v20.4h\n" - " b.ne 4f\n" - " b 5f\n" - "1:" - " ld1 {v16.4h, v17.4h, v18.4h, v19.4h}, [%[b]], #32\n" - " ld1 {v20.4h, v21.4h, v22.4h, v23.4h}, [%[a]], #32\n" - " subs %w[len], %w[len], #16\n" - " smull v0.4s, v16.4h, v20.4h\n" - " smlal v0.4s, v17.4h, v21.4h\n" - " smlal v0.4s, v18.4h, v22.4h\n" - " smlal v0.4s, v19.4h, v23.4h\n" - " b.eq 3f\n" - "2:" - " ld1 {v16.4h, v17.4h, v18.4h, v19.4h}, [%[b]], #32\n" - " ld1 {v20.4h, v21.4h, v22.4h, v23.4h}, [%[a]], #32\n" - " subs %w[len], %w[len], #16\n" - " smlal v0.4s, v16.4h, v20.4h\n" - " smlal v0.4s, v17.4h, v21.4h\n" - " smlal v0.4s, v18.4h, v22.4h\n" - " smlal v0.4s, v19.4h, v23.4h\n" - " b.ne 2b\n" - "3:" - " cmp %w[remainder], #0\n" - " b.eq 5f\n" - "4:" - " ld1 {v18.4h}, [%[b]], #8\n" - " ld1 {v22.4h}, [%[a]], #8\n" - " subs %w[remainder], %w[remainder], #4\n" - " smlal v0.4s, v18.4h, v22.4h\n" - " b.ne 4b\n" - "5:" - " saddlv d0, v0.4s\n" - " sqxtn s0, d0\n" - " sqrshrn h0, s0, #15\n" - " sxtl v0.4s, v0.4h\n" - " fmov %w[ret], s0\n" - : [ret] "=r" (ret), [a] "+r" (a), [b] "+r" (b), - [len] "+r" (len), [remainder] "+r" (remainder) - : - : "cc", "v0", - "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23"); - return ret; -} -#else -static inline int32_t inner_product_single(const int16_t *a, const int16_t *b, unsigned int len) -{ - int32_t ret; - uint32_t remainder = len % 16; - len = len - remainder; - - asm volatile (" cmp %[len], #0\n" - " bne 1f\n" - " vld1.16 {d16}, [%[b]]!\n" - " vld1.16 {d20}, [%[a]]!\n" - " subs %[remainder], %[remainder], #4\n" - " vmull.s16 q0, d16, d20\n" - " beq 5f\n" - " b 4f\n" - "1:" - " vld1.16 {d16, d17, d18, d19}, [%[b]]!\n" - " vld1.16 {d20, d21, d22, d23}, [%[a]]!\n" - " subs %[len], %[len], #16\n" - " vmull.s16 q0, d16, d20\n" - " vmlal.s16 q0, d17, d21\n" - " vmlal.s16 q0, d18, d22\n" - " vmlal.s16 q0, d19, d23\n" - " beq 3f\n" - "2:" - " vld1.16 {d16, d17, d18, d19}, [%[b]]!\n" - " vld1.16 {d20, d21, d22, d23}, [%[a]]!\n" - " subs %[len], %[len], #16\n" - " vmlal.s16 q0, d16, d20\n" - " vmlal.s16 q0, d17, d21\n" - " vmlal.s16 q0, d18, d22\n" - " vmlal.s16 q0, d19, d23\n" - " bne 2b\n" - "3:" - " cmp %[remainder], #0\n" - " beq 5f\n" - "4:" - " vld1.16 {d16}, [%[b]]!\n" - " vld1.16 {d20}, [%[a]]!\n" - " subs %[remainder], %[remainder], #4\n" - " vmlal.s16 q0, d16, d20\n" - " bne 4b\n" - "5:" - " vaddl.s32 q0, d0, d1\n" - " vadd.s64 d0, d0, d1\n" - " vqmovn.s64 d0, q0\n" - " vqrshrn.s32 d0, q0, #15\n" - " vmov.s16 %[ret], d0[0]\n" - : [ret] "=r" (ret), [a] "+r" (a), [b] "+r" (b), - [len] "+r" (len), [remainder] "+r" (remainder) - : - : "cc", "q0", - "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23"); - - return ret; -} -#endif // !defined(__aarch64__) - -#elif defined(FLOATING_POINT) -#if defined(__aarch64__) -static inline int32_t saturate_float_to_16bit(float a) { - int32_t ret; - asm ("fcvtas s1, %s[a]\n" - "sqxtn h1, s1\n" - "sxtl v1.4s, v1.4h\n" - "fmov %w[ret], s1\n" - : [ret] "=r" (ret) - : [a] "w" (a) - : "v1"); - return ret; -} -#else -static inline int32_t saturate_float_to_16bit(float a) { - int32_t ret; - asm ("vmov.f32 d0[0], %[a]\n" - "vcvt.s32.f32 d0, d0, #15\n" - "vqrshrn.s32 d0, q0, #15\n" - "vmov.s16 %[ret], d0[0]\n" - : [ret] "=r" (ret) - : [a] "r" (a) - : "q0"); - return ret; -} -#endif - -#undef WORD2INT -#define WORD2INT(x) (saturate_float_to_16bit(x)) - -#define OVERRIDE_INNER_PRODUCT_SINGLE -/* Only works when len % 4 == 0 and len >= 4 */ -#if defined(__aarch64__) -static inline float inner_product_single(const float *a, const float *b, unsigned int len) -{ - float ret; - uint32_t remainder = len % 16; - len = len - remainder; - - asm volatile (" cmp %w[len], #0\n" - " b.ne 1f\n" - " ld1 {v16.4s}, [%[b]], #16\n" - " ld1 {v20.4s}, [%[a]], #16\n" - " subs %w[remainder], %w[remainder], #4\n" - " fmul v1.4s, v16.4s, v20.4s\n" - " b.ne 4f\n" - " b 5f\n" - "1:" - " ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [%[b]], #64\n" - " ld1 {v20.4s, v21.4s, v22.4s, v23.4s}, [%[a]], #64\n" - " subs %w[len], %w[len], #16\n" - " fmul v1.4s, v16.4s, v20.4s\n" - " fmul v2.4s, v17.4s, v21.4s\n" - " fmul v3.4s, v18.4s, v22.4s\n" - " fmul v4.4s, v19.4s, v23.4s\n" - " b.eq 3f\n" - "2:" - " ld1 {v16.4s, v17.4s, v18.4s, v19.4s}, [%[b]], #64\n" - " ld1 {v20.4s, v21.4s, v22.4s, v23.4s}, [%[a]], #64\n" - " subs %w[len], %w[len], #16\n" - " fmla v1.4s, v16.4s, v20.4s\n" - " fmla v2.4s, v17.4s, v21.4s\n" - " fmla v3.4s, v18.4s, v22.4s\n" - " fmla v4.4s, v19.4s, v23.4s\n" - " b.ne 2b\n" - "3:" - " fadd v16.4s, v1.4s, v2.4s\n" - " fadd v17.4s, v3.4s, v4.4s\n" - " cmp %w[remainder], #0\n" - " fadd v1.4s, v16.4s, v17.4s\n" - " b.eq 5f\n" - "4:" - " ld1 {v18.4s}, [%[b]], #16\n" - " ld1 {v22.4s}, [%[a]], #16\n" - " subs %w[remainder], %w[remainder], #4\n" - " fmla v1.4s, v18.4s, v22.4s\n" - " b.ne 4b\n" - "5:" - " faddp v1.4s, v1.4s, v1.4s\n" - " faddp %[ret].4s, v1.4s, v1.4s\n" - : [ret] "=w" (ret), [a] "+r" (a), [b] "+r" (b), - [len] "+r" (len), [remainder] "+r" (remainder) - : - : "cc", "v1", "v2", "v3", "v4", - "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23"); - return ret; -} -#else -static inline float inner_product_single(const float *a, const float *b, unsigned int len) -{ - float ret; - uint32_t remainder = len % 16; - len = len - remainder; - - asm volatile (" cmp %[len], #0\n" - " bne 1f\n" - " vld1.32 {q4}, [%[b]]!\n" - " vld1.32 {q8}, [%[a]]!\n" - " subs %[remainder], %[remainder], #4\n" - " vmul.f32 q0, q4, q8\n" - " bne 4f\n" - " b 5f\n" - "1:" - " vld1.32 {q4, q5}, [%[b]]!\n" - " vld1.32 {q8, q9}, [%[a]]!\n" - " vld1.32 {q6, q7}, [%[b]]!\n" - " vld1.32 {q10, q11}, [%[a]]!\n" - " subs %[len], %[len], #16\n" - " vmul.f32 q0, q4, q8\n" - " vmul.f32 q1, q5, q9\n" - " vmul.f32 q2, q6, q10\n" - " vmul.f32 q3, q7, q11\n" - " beq 3f\n" - "2:" - " vld1.32 {q4, q5}, [%[b]]!\n" - " vld1.32 {q8, q9}, [%[a]]!\n" - " vld1.32 {q6, q7}, [%[b]]!\n" - " vld1.32 {q10, q11}, [%[a]]!\n" - " subs %[len], %[len], #16\n" - " vmla.f32 q0, q4, q8\n" - " vmla.f32 q1, q5, q9\n" - " vmla.f32 q2, q6, q10\n" - " vmla.f32 q3, q7, q11\n" - " bne 2b\n" - "3:" - " vadd.f32 q4, q0, q1\n" - " vadd.f32 q5, q2, q3\n" - " cmp %[remainder], #0\n" - " vadd.f32 q0, q4, q5\n" - " beq 5f\n" - "4:" - " vld1.32 {q6}, [%[b]]!\n" - " vld1.32 {q10}, [%[a]]!\n" - " subs %[remainder], %[remainder], #4\n" - " vmla.f32 q0, q6, q10\n" - " bne 4b\n" - "5:" - " vadd.f32 d0, d0, d1\n" - " vpadd.f32 d0, d0, d0\n" - " vmov.f32 %[ret], d0[0]\n" - : [ret] "=r" (ret), [a] "+r" (a), [b] "+r" (b), - [len] "+l" (len), [remainder] "+l" (remainder) - : - : "cc", "q0", "q1", "q2", "q3", - "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11"); - return ret; -} -#endif // defined(__aarch64__) -#endif diff --git a/speex/libspeexdsp/resample_sse.h b/speex/libspeexdsp/resample_sse.h deleted file mode 100644 index 00dc29465..000000000 --- a/speex/libspeexdsp/resample_sse.h +++ /dev/null @@ -1,128 +0,0 @@ -/* Copyright (C) 2007-2008 Jean-Marc Valin - * Copyright (C) 2008 Thorvald Natvig - */ -/** - @file resample_sse.h - @brief Resampler functions (SSE version) -*/ -/* - 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. -*/ - -#include - -#define OVERRIDE_INNER_PRODUCT_SINGLE -static inline float inner_product_single(const float *a, const float *b, unsigned int len) -{ - int i; - float ret; - __m128 sum = _mm_setzero_ps(); - for (i=0;i -#define OVERRIDE_INNER_PRODUCT_DOUBLE - -static inline double inner_product_double(const float *a, const float *b, unsigned int len) -{ - int i; - double ret; - __m128d sum = _mm_setzero_pd(); - __m128 t; - for (i=0;i -#include - -#ifndef M_PI -#define M_PI 3.14159265358979323846 /* pi */ -#endif - -#define ALLPASS_ORDER 20 - -struct SpeexDecorrState_ { - int rate; - int channels; - int frame_size; -#ifdef VORBIS_PSYCHO - VorbisPsy *psy; - struct drft_lookup lookup; - float *wola_mem; - float *curve; -#endif - float *vorbis_win; - int seed; - float *y; - - /* Per-channel stuff */ - float *buff; - float (*ring)[ALLPASS_ORDER]; - int *ringID; - int *order; - float *alpha; -}; - - - -EXPORT SpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size) -{ - int i, ch; - SpeexDecorrState *st = speex_alloc(sizeof(SpeexDecorrState)); - st->rate = rate; - st->channels = channels; - st->frame_size = frame_size; -#ifdef VORBIS_PSYCHO - st->psy = vorbis_psy_init(rate, 2*frame_size); - spx_drft_init(&st->lookup, 2*frame_size); - st->wola_mem = speex_alloc(frame_size*sizeof(float)); - st->curve = speex_alloc(frame_size*sizeof(float)); -#endif - st->y = speex_alloc(frame_size*sizeof(float)); - - st->buff = speex_alloc(channels*2*frame_size*sizeof(float)); - st->ringID = speex_alloc(channels*sizeof(int)); - st->order = speex_alloc(channels*sizeof(int)); - st->alpha = speex_alloc(channels*sizeof(float)); - st->ring = speex_alloc(channels*ALLPASS_ORDER*sizeof(float)); - - /*FIXME: The +20 is there only as a kludge for ALL_PASS_OLA*/ - st->vorbis_win = speex_alloc((2*frame_size+20)*sizeof(float)); - for (i=0;i<2*frame_size;i++) - st->vorbis_win[i] = sin(.5*M_PI* sin(M_PI*i/(2*frame_size))*sin(M_PI*i/(2*frame_size)) ); - st->seed = rand(); - - for (ch=0;chring[ch][i] = 0; - st->ringID[ch] = 0; - st->alpha[ch] = 0; - st->order[ch] = 10; - } - return st; -} - -static float uni_rand(int *seed) -{ - const unsigned int jflone = 0x3f800000; - const unsigned int jflmsk = 0x007fffff; - union {int i; float f;} ran; - *seed = 1664525 * *seed + 1013904223; - ran.i = jflone | (jflmsk & *seed); - ran.f -= 1.5; - return 2*ran.f; -} - -static unsigned int irand(int *seed) -{ - *seed = 1664525 * *seed + 1013904223; - return ((unsigned int)*seed)>>16; -} - - -EXPORT void speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength) -{ - int ch; - float amount; - - if (strength<0) - strength = 0; - if (strength>100) - strength = 100; - - amount = .01*strength; - for (ch=0;chchannels;ch++) - { - int i; - int N=2*st->frame_size; - float beta, beta2; - float *x; - float max_alpha = 0; - - float *buff; - float *ring; - int ringID; - int order; - float alpha; - - buff = st->buff+ch*2*st->frame_size; - ring = st->ring[ch]; - ringID = st->ringID[ch]; - order = st->order[ch]; - alpha = st->alpha[ch]; - - for (i=0;iframe_size;i++) - buff[i] = buff[i+st->frame_size]; - for (i=0;iframe_size;i++) - buff[i+st->frame_size] = in[i*st->channels+ch]; - - x = buff+st->frame_size; - - if (amount>1) - beta = 1-sqrt(.4*amount); - else - beta = 1-0.63246*amount; - if (beta<0) - beta = 0; - - beta2 = beta; - for (i=0;iframe_size;i++) - { - st->y[i] = alpha*(x[i-ALLPASS_ORDER+order]-beta*x[i-ALLPASS_ORDER+order-1])*st->vorbis_win[st->frame_size+i+order] - + x[i-ALLPASS_ORDER]*st->vorbis_win[st->frame_size+i] - - alpha*(ring[ringID] - - beta*ring[ringID+1>=order?0:ringID+1]); - ring[ringID++]=st->y[i]; - st->y[i] *= st->vorbis_win[st->frame_size+i]; - if (ringID>=order) - ringID=0; - } - order = order+(irand(&st->seed)%3)-1; - if (order < 5) - order = 5; - if (order > 10) - order = 10; - /*order = 5+(irand(&st->seed)%6);*/ - max_alpha = pow(.96+.04*(amount-1),order); - if (max_alpha > .98/(1.+beta2)) - max_alpha = .98/(1.+beta2); - - alpha = alpha + .4*uni_rand(&st->seed); - if (alpha > max_alpha) - alpha = max_alpha; - if (alpha < -max_alpha) - alpha = -max_alpha; - for (i=0;iframe_size;i++) - { - float tmp = alpha*(x[i-ALLPASS_ORDER+order]-beta*x[i-ALLPASS_ORDER+order-1])*st->vorbis_win[i+order] - + x[i-ALLPASS_ORDER]*st->vorbis_win[i] - - alpha*(ring[ringID] - - beta*ring[ringID+1>=order?0:ringID+1]); - ring[ringID++]=tmp; - tmp *= st->vorbis_win[i]; - if (ringID>=order) - ringID=0; - st->y[i] += tmp; - } - -#ifdef VORBIS_PSYCHO - float frame[N]; - float scale = 1./N; - for (i=0;i<2*st->frame_size;i++) - frame[i] = buff[i]; - //float coef = .5*0.78130; - float coef = M_PI*0.075063 * 0.93763 * amount * .8 * 0.707; - compute_curve(st->psy, buff, st->curve); - for (i=1;iframe_size;i++) - { - float x1,x2; - float gain; - do { - x1 = uni_rand(&st->seed); - x2 = uni_rand(&st->seed); - } while (x1*x1+x2*x2 > 1.); - gain = coef*sqrt(.1+st->curve[i]); - frame[2*i-1] = gain*x1; - frame[2*i] = gain*x2; - } - frame[0] = coef*uni_rand(&st->seed)*sqrt(.1+st->curve[0]); - frame[2*st->frame_size-1] = coef*uni_rand(&st->seed)*sqrt(.1+st->curve[st->frame_size-1]); - spx_drft_backward(&st->lookup,frame); - for (i=0;i<2*st->frame_size;i++) - frame[i] *= st->vorbis_win[i]; -#endif - - for (i=0;iframe_size;i++) - { -#ifdef VORBIS_PSYCHO - float tmp = st->y[i] + frame[i] + st->wola_mem[i]; - st->wola_mem[i] = frame[i+st->frame_size]; -#else - float tmp = st->y[i]; -#endif - if (tmp>32767) - tmp = 32767; - if (tmp < -32767) - tmp = -32767; - out[i*st->channels+ch] = tmp; - } - - st->ringID[ch] = ringID; - st->order[ch] = order; - st->alpha[ch] = alpha; - - } -} - -EXPORT void speex_decorrelate_destroy(SpeexDecorrState *st) -{ -#ifdef VORBIS_PSYCHO - vorbis_psy_destroy(st->psy); - speex_free(st->wola_mem); - speex_free(st->curve); -#endif - speex_free(st->buff); - speex_free(st->ring); - speex_free(st->ringID); - speex_free(st->alpha); - speex_free(st->vorbis_win); - speex_free(st->order); - speex_free(st->y); - speex_free(st); -} diff --git a/speex/libspeexdsp/smallft.c b/speex/libspeexdsp/smallft.c deleted file mode 100644 index 82c3b0a4a..000000000 --- a/speex/libspeexdsp/smallft.c +++ /dev/null @@ -1,1261 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the XIPHOPHORUS Company http://www.xiph.org/ * - * * - ******************************************************************** - - function: *unnormalized* fft transform - last mod: $Id: smallft.c,v 1.19 2003/10/08 05:12:37 jm Exp $ - - ********************************************************************/ - -/* FFT implementation from OggSquish, minus cosine transforms, - * minus all but radix 2/4 case. In Vorbis we only need this - * cut-down version. - * - * To do more than just power-of-two sized vectors, see the full - * version I wrote for NetLib. - * - * Note that the packing is a little strange; rather than the FFT r/i - * packing following R_0, I_n, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, - * it follows R_0, R_1, I_1, R_2, I_2 ... R_n-1, I_n-1, I_n like the - * FORTRAN version - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "smallft.h" -#include "arch.h" -#include "os_support.h" - -static void drfti1(int n, float *wa, int *ifac){ - static int ntryh[4] = { 4,2,3,5 }; - static float tpi = 6.28318530717958648f; - float arg,argh,argld,fi; - int ntry=0,i,j=-1; - int k1, l1, l2, ib; - int ld, ii, ip, is, nq, nr; - int ido, ipm, nfm1; - int nl=n; - int nf=0; - - L101: - j++; - if (j < 4) - ntry=ntryh[j]; - else - ntry+=2; - - L104: - nq=nl/ntry; - nr=nl-ntry*nq; - if (nr!=0) goto L101; - - nf++; - ifac[nf+1]=ntry; - nl=nq; - if(ntry!=2)goto L107; - if(nf==1)goto L107; - - for (i=1;i>1; - ipp2=ip; - idp2=ido; - nbd=(ido-1)>>1; - t0=l1*ido; - t10=ip*ido; - - if(ido==1)goto L119; - for(ik=0;ikl1){ - for(j=1;j>1; - ipp2=ip; - ipph=(ip+1)>>1; - if(idol1)goto L139; - - is= -ido-1; - t1=0; - for(j=1;jn==1)return; - drftf1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); -} - -void spx_drft_backward(struct drft_lookup *l,float *data){ - if (l->n==1)return; - drftb1(l->n,data,l->trigcache,l->trigcache+l->n,l->splitcache); -} - -void spx_drft_init(struct drft_lookup *l,int n) -{ - l->n=n; - l->trigcache=(float*)speex_alloc(3*n*sizeof(*l->trigcache)); - l->splitcache=(int*)speex_alloc(32*sizeof(*l->splitcache)); - fdrffti(n, l->trigcache, l->splitcache); -} - -void spx_drft_clear(struct drft_lookup *l) -{ - if(l) - { - if(l->trigcache) - speex_free(l->trigcache); - if(l->splitcache) - speex_free(l->splitcache); - } -} diff --git a/speex/libspeexdsp/smallft.h b/speex/libspeexdsp/smallft.h deleted file mode 100644 index 446e2f65b..000000000 --- a/speex/libspeexdsp/smallft.h +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************** - * * - * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * - * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * - * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * - * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * - * * - * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * - * by the XIPHOPHORUS Company http://www.xiph.org/ * - * * - ******************************************************************** - - function: fft transform - last mod: $Id: smallft.h,v 1.3 2003/09/16 18:35:45 jm Exp $ - - ********************************************************************/ -/** - @file smallft.h - @brief Discrete Rotational Fourier Transform (DRFT) -*/ - -#ifndef _V_SMFT_H_ -#define _V_SMFT_H_ - - -#ifdef __cplusplus -extern "C" { -#endif - -/** Discrete Rotational Fourier Transform lookup */ -struct drft_lookup{ - int n; - float *trigcache; - int *splitcache; -}; - -extern void spx_drft_forward(struct drft_lookup *l,float *data); -extern void spx_drft_backward(struct drft_lookup *l,float *data); -extern void spx_drft_init(struct drft_lookup *l,int n); -extern void spx_drft_clear(struct drft_lookup *l); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/speex/libspeexdsp/stack_alloc.h b/speex/libspeexdsp/stack_alloc.h deleted file mode 100644 index 6c56334f8..000000000 --- a/speex/libspeexdsp/stack_alloc.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (C) 2002 Jean-Marc Valin */ -/** - @file stack_alloc.h - @brief Temporary memory allocation on stack -*/ -/* - 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. -*/ - -#ifndef STACK_ALLOC_H -#define STACK_ALLOC_H - -#ifdef USE_ALLOCA -# ifdef WIN32 -# include -# else -# ifdef HAVE_ALLOCA_H -# include -# else -# include -# endif -# endif -#endif - -/** - * @def ALIGN(stack, size) - * - * Aligns the stack to a 'size' boundary - * - * @param stack Stack - * @param size New size boundary - */ - -/** - * @def PUSH(stack, size, type) - * - * Allocates 'size' elements of type 'type' on the stack - * - * @param stack Stack - * @param size Number of elements - * @param type Type of element - */ - -/** - * @def VARDECL(var) - * - * Declare variable on stack - * - * @param var Variable to declare - */ - -/** - * @def ALLOC(var, size, type) - * - * Allocate 'size' elements of 'type' on stack - * - * @param var Name of variable to allocate - * @param size Number of elements - * @param type Type of element - */ - -#ifdef ENABLE_VALGRIND - -#include - -#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) - -#define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) - -#else - -#define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1)) - -#define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type)))) - -#endif - -#if defined(VAR_ARRAYS) -#define VARDECL(var) -#define ALLOC(var, size, type) type var[size] -#elif defined(USE_ALLOCA) -#define VARDECL(var) var -#define ALLOC(var, size, type) var = alloca(sizeof(type)*(size)) -#else -#define VARDECL(var) var -#define ALLOC(var, size, type) var = PUSH(stack, size, type) -#endif - - -#endif diff --git a/speex/libspeexdsp/testdenoise.c b/speex/libspeexdsp/testdenoise.c deleted file mode 100644 index adebe941e..000000000 --- a/speex/libspeexdsp/testdenoise.c +++ /dev/null @@ -1,44 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "speex/speex_preprocess.h" -#include - -#define NN 160 - -int main() -{ - short in[NN]; - int i; - SpeexPreprocessState *st; - int count=0; - float f; - - st = speex_preprocess_state_init(NN, 8000); - i=1; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DENOISE, &i); - i=0; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC, &i); - i=8000; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_AGC_LEVEL, &i); - i=0; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB, &i); - f=.0; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB_DECAY, &f); - f=.0; - speex_preprocess_ctl(st, SPEEX_PREPROCESS_SET_DEREVERB_LEVEL, &f); - while (1) - { - int vad; - fread(in, sizeof(short), NN, stdin); - if (feof(stdin)) - break; - vad = speex_preprocess_run(st, in); - /*fprintf (stderr, "%d\n", vad);*/ - fwrite(in, sizeof(short), NN, stdout); - count++; - } - speex_preprocess_state_destroy(st); - return 0; -} diff --git a/speex/libspeexdsp/testecho.c b/speex/libspeexdsp/testecho.c deleted file mode 100644 index 1624dc2a3..000000000 --- a/speex/libspeexdsp/testecho.c +++ /dev/null @@ -1,53 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "speex/speex_echo.h" -#include "speex/speex_preprocess.h" -#include -#include -#include -#include -#include - - -#define NN 128 -#define TAIL 1024 - -int main(int argc, char **argv) -{ - FILE *echo_fd, *ref_fd, *e_fd; - short echo_buf[NN], ref_buf[NN], e_buf[NN]; - SpeexEchoState *st; - SpeexPreprocessState *den; - int sampleRate = 8000; - - if (argc != 4) - { - fprintf(stderr, "testecho mic_signal.sw speaker_signal.sw output.sw\n"); - exit(1); - } - echo_fd = fopen(argv[2], "rb"); - ref_fd = fopen(argv[1], "rb"); - e_fd = fopen(argv[3], "wb"); - - st = speex_echo_state_init(NN, TAIL); - den = speex_preprocess_state_init(NN, sampleRate); - speex_echo_ctl(st, SPEEX_ECHO_SET_SAMPLING_RATE, &sampleRate); - speex_preprocess_ctl(den, SPEEX_PREPROCESS_SET_ECHO_STATE, st); - - while (!feof(ref_fd) && !feof(echo_fd)) - { - fread(ref_buf, sizeof(short), NN, ref_fd); - fread(echo_buf, sizeof(short), NN, echo_fd); - speex_echo_cancellation(st, ref_buf, echo_buf, e_buf); - speex_preprocess_run(den, e_buf); - fwrite(e_buf, sizeof(short), NN, e_fd); - } - speex_echo_state_destroy(st); - speex_preprocess_state_destroy(den); - fclose(e_fd); - fclose(echo_fd); - fclose(ref_fd); - return 0; -} diff --git a/speex/libspeexdsp/testjitter.c b/speex/libspeexdsp/testjitter.c deleted file mode 100644 index 399dfe956..000000000 --- a/speex/libspeexdsp/testjitter.c +++ /dev/null @@ -1,75 +0,0 @@ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "speex/speex_jitter.h" -#include - -union jbpdata { - unsigned int idx; - unsigned char data[4]; -}; - -void synthIn(JitterBufferPacket *in, int idx, int span) { - union jbpdata d; - d.idx = idx; - - in->data = d.data; - in->len = sizeof(d); - in->timestamp = idx * 10; - in->span = span * 10; - in->sequence = idx; - in->user_data = 0; -} - -void jitterFill(JitterBuffer *jb) { - char buffer[65536]; - JitterBufferPacket in, out; - int i; - - out.data = buffer; - - jitter_buffer_reset(jb); - - for(i=0;i<100;++i) { - synthIn(&in, i, 1); - jitter_buffer_put(jb, &in); - - out.len = 65536; - if (jitter_buffer_get(jb, &out, 10, NULL) != JITTER_BUFFER_OK) { - printf("Fill test failed iteration %d\n", i); - } - if (out.timestamp != i * 10) { - printf("Fill test expected %d got %d\n", i*10, out.timestamp); - } - jitter_buffer_tick(jb); - } -} - -int main() -{ - char buffer[65536]; - JitterBufferPacket in, out; - int i; - - JitterBuffer *jb = jitter_buffer_init(10); - - out.data = buffer; - - /* Frozen sender case */ - jitterFill(jb); - for(i=0;i<100;++i) { - out.len = 65536; - jitter_buffer_get(jb, &out, 10, NULL); - jitter_buffer_tick(jb); - } - synthIn(&in, 100, 1); - jitter_buffer_put(jb, &in); - out.len = 65536; - if (jitter_buffer_get(jb, &out, 10, NULL) != JITTER_BUFFER_OK) { - printf("Failed frozen sender resynchronize\n"); - } else { - printf("Frozen sender: Jitter %d\n", out.timestamp - 100*10); - } - return 0; -} diff --git a/speex/libspeexdsp/testresample.c b/speex/libspeexdsp/testresample.c deleted file mode 100644 index 7ed866756..000000000 --- a/speex/libspeexdsp/testresample.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Copyright (C) 2007 Jean-Marc Valin - - File: testresample.c - Testing the resampling code - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. 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. - - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. -*/ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "speex/speex_resampler.h" -#include -#include -#include - -#define NN 256 - -int main() -{ - spx_uint32_t i; - short *in; - short *out; - float *fin, *fout; - int count = 0; - SpeexResamplerState *st = speex_resampler_init(1, 8000, 12000, 10, NULL); - speex_resampler_set_rate(st, 96000, 44100); - speex_resampler_skip_zeros(st); - - in = malloc(NN*sizeof(short)); - out = malloc(2*NN*sizeof(short)); - fin = malloc(NN*sizeof(float)); - fout = malloc(2*NN*sizeof(float)); - while (1) - { - spx_uint32_t in_len; - spx_uint32_t out_len; - fread(in, sizeof(short), NN, stdin); - if (feof(stdin)) - break; - for (i=0;i -#include -#include - -#define PERIOD 32 -#define INBLOCK 1024 -#define RATE 48000 - -int main() -{ - spx_uint32_t i; - float *fin, *fout; - int rate = 1000, off = 0, avail = INBLOCK; - SpeexResamplerState *st = speex_resampler_init(1, RATE, RATE, 4, NULL); - speex_resampler_set_rate(st, RATE, rate); - speex_resampler_skip_zeros(st); - - fin = malloc(INBLOCK*2*sizeof(float)); - for (i=0; i ", rate, off, in_len, out_len); - - speex_resampler_process_float(st, 0, fin + off, &in_len, fout, &out_len); - - fprintf (stderr, "%d %d\n", in_len, out_len); - off += in_len; - avail = avail - in_len + INBLOCK; - - if (off >= INBLOCK) - off -= INBLOCK; - - fwrite(fout, sizeof(float), out_len, stdout); - - rate += 100; - if (rate > 128000) - break; - - speex_resampler_set_rate(st, RATE, rate); - } - speex_resampler_destroy(st); - free(fin); - free(fout); - return 0; -} - diff --git a/speex/libspeexdsp/vorbis_psy.h b/speex/libspeexdsp/vorbis_psy.h deleted file mode 100644 index 19ea9c3cf..000000000 --- a/speex/libspeexdsp/vorbis_psy.h +++ /dev/null @@ -1,97 +0,0 @@ -/* Copyright (C) 2005 Jean-Marc Valin, CSIRO, Christopher Montgomery - File: vorbis_psy.h - - 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. -*/ - -#ifndef VORBIS_PSY_H -#define VORBIS_PSY_H - -#ifdef VORBIS_PSYCHO - -#include "smallft.h" -#define P_BANDS 17 /* 62Hz to 16kHz */ -#define NOISE_COMPAND_LEVELS 40 - - -#define todB(x) ((x)>1e-13?log((x)*(x))*4.34294480f:-30) -#define fromdB(x) (exp((x)*.11512925f)) - -/* The bark scale equations are approximations, since the original - table was somewhat hand rolled. The below are chosen to have the - best possible fit to the rolled tables, thus their somewhat odd - appearance (these are more accurate and over a longer range than - the oft-quoted bark equations found in the texts I have). The - approximations are valid from 0 - 30kHz (nyquist) or so. - - all f in Hz, z in Bark */ - -#define toBARK(n) (13.1f*atan(.00074f*(n))+2.24f*atan((n)*(n)*1.85e-8f)+1e-4f*(n)) -#define fromBARK(z) (102.f*(z)-2.f*pow(z,2.f)+.4f*pow(z,3.f)+pow(1.46f,z)-1.f) - -/* Frequency to octave. We arbitrarily declare 63.5 Hz to be octave - 0.0 */ - -#define toOC(n) (log(n)*1.442695f-5.965784f) -#define fromOC(o) (exp(((o)+5.965784f)*.693147f)) - - -typedef struct { - - float noisewindowlo; - float noisewindowhi; - int noisewindowlomin; - int noisewindowhimin; - int noisewindowfixed; - float noiseoff[P_BANDS]; - float noisecompand[NOISE_COMPAND_LEVELS]; - -} VorbisPsyInfo; - - - -typedef struct { - int n; - int rate; - struct drft_lookup lookup; - VorbisPsyInfo *vi; - - float *window; - float *noiseoffset; - long *bark; - -} VorbisPsy; - - -VorbisPsy *vorbis_psy_init(int rate, int size); -void vorbis_psy_destroy(VorbisPsy *psy); -void compute_curve(VorbisPsy *psy, float *audio, float *curve); -void curve_to_lpc(VorbisPsy *psy, float *curve, float *awk1, float *awk2, int ord); - -#endif -#endif diff --git a/speex/macosx/English.lproj/InfoPlist.strings b/speex/macosx/English.lproj/InfoPlist.strings deleted file mode 100644 index 2f37a321a..000000000 --- a/speex/macosx/English.lproj/InfoPlist.strings +++ /dev/null @@ -1,3 +0,0 @@ -/* Localized versions of Info.plist keys */ - -CFBundleName = "Speex"; diff --git a/speex/macosx/Info.plist b/speex/macosx/Info.plist deleted file mode 100644 index 1d1c47c81..000000000 --- a/speex/macosx/Info.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleExecutable - Speex - CFBundleGetInfoString - Speex framework 1.1.12svn, Copyright © 2002-2006 Xiph.Org Foundation - CFBundleIconFile - - CFBundleIdentifier - org.xiph.speex - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.1.12svn - CFBundleSignature - ???? - CFBundleVersion - 1.1.12d1 - NSHumanReadableCopyright - Speex framework 1.1.12svn, Copyright © 2002-2006 Xiph.Org Foundation - CSResourcesFileMapped - - - diff --git a/speex/macosx/Speex.xcodeproj/project.pbxproj b/speex/macosx/Speex.xcodeproj/project.pbxproj deleted file mode 100644 index 8a04da26c..000000000 --- a/speex/macosx/Speex.xcodeproj/project.pbxproj +++ /dev/null @@ -1,538 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 42; - objects = { - -/* Begin PBXBuildFile section */ - 37CA8DF00DD73408005C8CB6 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DED0DD73408005C8CB6 /* buffer.c */; }; - 37CA8DF10DD73408005C8CB6 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DEE0DD73408005C8CB6 /* resample.c */; }; - 37CA8DF30DD73408005C8CB6 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DED0DD73408005C8CB6 /* buffer.c */; }; - 37CA8DF40DD73408005C8CB6 /* resample.c in Sources */ = {isa = PBXBuildFile; fileRef = 37CA8DEE0DD73408005C8CB6 /* resample.c */; }; - 37CA8DF60DD73424005C8CB6 /* resample_sse.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DEF0DD73408005C8CB6 /* resample_sse.h */; }; - 37CA8DF90DD7347D005C8CB6 /* speex_buffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DF70DD7347D005C8CB6 /* speex_buffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37CA8DFA0DD7347D005C8CB6 /* speex_resampler.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DF80DD7347D005C8CB6 /* speex_resampler.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37CA8E000DD7352A005C8CB6 /* os_support.h in Headers */ = {isa = PBXBuildFile; fileRef = 37CA8DFF0DD7352A005C8CB6 /* os_support.h */; }; - 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF30907FB8200C478FC /* speex_echo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B000907FB8200C478FC /* speex_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF40907FB8200C478FC /* speex_header.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B010907FB8200C478FC /* speex_jitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF50907FB8200C478FC /* speex_jitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF60907FB8200C478FC /* speex_preprocess.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B030907FB8200C478FC /* speex_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF70907FB8200C478FC /* speex_stereo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B040907FB8200C478FC /* speex_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF80907FB8200C478FC /* speex_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF10907FB8200C478FC /* speex_callbacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B750907FC9900C478FC /* jitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B280907FC9900C478FC /* jitter.c */; }; - 73814B8E0907FC9900C478FC /* preprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B410907FC9900C478FC /* preprocess.c */; }; - 73814B930907FC9900C478FC /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; - 738837440B1934D0005C7A69 /* mdf.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B390907FC9900C478FC /* mdf.c */; }; - 738837540B193581005C7A69 /* _kiss_fft_guts.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837460B193581005C7A69 /* _kiss_fft_guts.h */; }; - 738837550B193581005C7A69 /* fftwrap.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837470B193581005C7A69 /* fftwrap.c */; }; - 738837560B193581005C7A69 /* fftwrap.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837480B193581005C7A69 /* fftwrap.h */; }; - 738837570B193581005C7A69 /* filterbank.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837490B193581005C7A69 /* filterbank.c */; }; - 738837580B193581005C7A69 /* filterbank.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374A0B193581005C7A69 /* filterbank.h */; }; - 738837590B193581005C7A69 /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374B0B193581005C7A69 /* kiss_fft.c */; }; - 7388375A0B193581005C7A69 /* kiss_fft.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374C0B193581005C7A69 /* kiss_fft.h */; }; - 7388375B0B193581005C7A69 /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374D0B193581005C7A69 /* kiss_fftr.c */; }; - 7388375C0B193581005C7A69 /* kiss_fftr.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374E0B193581005C7A69 /* kiss_fftr.h */; }; - 7388375D0B193581005C7A69 /* lsp_bfin.h in Headers */ = {isa = PBXBuildFile; fileRef = 7388374F0B193581005C7A69 /* lsp_bfin.h */; }; - 7388375E0B193581005C7A69 /* pseudofloat.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837500B193581005C7A69 /* pseudofloat.h */; }; - 7388375F0B193581005C7A69 /* quant_lsp_bfin.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837510B193581005C7A69 /* quant_lsp_bfin.h */; }; - 738837600B193581005C7A69 /* vorbis_psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837520B193581005C7A69 /* vorbis_psy.c */; }; - 738837610B193581005C7A69 /* vorbis_psy.h in Headers */ = {isa = PBXBuildFile; fileRef = 738837530B193581005C7A69 /* vorbis_psy.h */; }; - 738837830B193791005C7A69 /* fftwrap.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837470B193581005C7A69 /* fftwrap.c */; }; - 738837840B193792005C7A69 /* filterbank.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837490B193581005C7A69 /* filterbank.c */; }; - 7388378B0B1937A0005C7A69 /* jitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B280907FC9900C478FC /* jitter.c */; }; - 7388378C0B1937A4005C7A69 /* kiss_fft.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374B0B193581005C7A69 /* kiss_fft.c */; }; - 7388378D0B1937A9005C7A69 /* kiss_fftr.c in Sources */ = {isa = PBXBuildFile; fileRef = 7388374D0B193581005C7A69 /* kiss_fftr.c */; }; - 738837940B1937BB005C7A69 /* mdf.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B390907FC9900C478FC /* mdf.c */; }; - 738837980B1937C2005C7A69 /* preprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B410907FC9900C478FC /* preprocess.c */; }; - 7388379B0B1937C9005C7A69 /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; - 738837A10B1937DD005C7A69 /* vorbis_psy.c in Sources */ = {isa = PBXBuildFile; fileRef = 738837520B193581005C7A69 /* vorbis_psy.c */; }; - 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speex_Prefix.pch; sourceTree = ""; }; - 37CA8DED0DD73408005C8CB6 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = ../libspeex/buffer.c; sourceTree = SOURCE_ROOT; }; - 37CA8DEE0DD73408005C8CB6 /* resample.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = resample.c; path = ../libspeex/resample.c; sourceTree = SOURCE_ROOT; }; - 37CA8DEF0DD73408005C8CB6 /* resample_sse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resample_sse.h; path = ../libspeex/resample_sse.h; sourceTree = SOURCE_ROOT; }; - 37CA8DF70DD7347D005C8CB6 /* speex_buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speex_buffer.h; sourceTree = ""; }; - 37CA8DF80DD7347D005C8CB6 /* speex_resampler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = speex_resampler.h; sourceTree = ""; }; - 37CA8DFF0DD7352A005C8CB6 /* os_support.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os_support.h; path = ../libspeex/os_support.h; sourceTree = SOURCE_ROOT; }; - 73814AEF0907FB8200C478FC /* speex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex.h; sourceTree = ""; }; - 73814AF10907FB8200C478FC /* speex_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_callbacks.h; sourceTree = ""; }; - 73814AF30907FB8200C478FC /* speex_echo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_echo.h; sourceTree = ""; }; - 73814AF40907FB8200C478FC /* speex_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_header.h; sourceTree = ""; }; - 73814AF50907FB8200C478FC /* speex_jitter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_jitter.h; sourceTree = ""; }; - 73814AF60907FB8200C478FC /* speex_preprocess.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_preprocess.h; sourceTree = ""; }; - 73814AF70907FB8200C478FC /* speex_stereo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_stereo.h; sourceTree = ""; }; - 73814AF80907FB8200C478FC /* speex_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_types.h; sourceTree = ""; }; - 73814B0C0907FC9900C478FC /* arch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../libspeex/arch.h; sourceTree = SOURCE_ROOT; }; - 73814B1E0907FC9900C478FC /* fixed_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm4.h; path = ../libspeex/fixed_arm4.h; sourceTree = SOURCE_ROOT; }; - 73814B1F0907FC9900C478FC /* fixed_arm5e.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm5e.h; path = ../libspeex/fixed_arm5e.h; sourceTree = SOURCE_ROOT; }; - 73814B200907FC9900C478FC /* fixed_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_bfin.h; path = ../libspeex/fixed_bfin.h; sourceTree = SOURCE_ROOT; }; - 73814B210907FC9900C478FC /* fixed_debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_debug.h; path = ../libspeex/fixed_debug.h; sourceTree = SOURCE_ROOT; }; - 73814B220907FC9900C478FC /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_generic.h; path = ../libspeex/fixed_generic.h; sourceTree = SOURCE_ROOT; }; - 73814B280907FC9900C478FC /* jitter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jitter.c; path = ../libspeex/jitter.c; sourceTree = SOURCE_ROOT; }; - 73814B380907FC9900C478FC /* math_approx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = math_approx.h; path = ../libspeex/math_approx.h; sourceTree = SOURCE_ROOT; }; - 73814B390907FC9900C478FC /* mdf.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mdf.c; path = ../libspeex/mdf.c; sourceTree = SOURCE_ROOT; }; - 73814B3A0907FC9900C478FC /* misc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc_bfin.h; path = ../libspeex/misc_bfin.h; sourceTree = SOURCE_ROOT; }; - 73814B410907FC9900C478FC /* preprocess.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = preprocess.c; path = ../libspeex/preprocess.c; sourceTree = SOURCE_ROOT; }; - 73814B460907FC9900C478FC /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = ../libspeex/smallft.c; sourceTree = SOURCE_ROOT; }; - 73814B470907FC9900C478FC /* smallft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = ../libspeex/smallft.h; sourceTree = SOURCE_ROOT; }; - 73814B4B0907FC9900C478FC /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stack_alloc.h; path = ../libspeex/stack_alloc.h; sourceTree = SOURCE_ROOT; }; - 73814B4D0907FC9900C478FC /* testdenoise.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testdenoise.c; path = ../libspeex/testdenoise.c; sourceTree = SOURCE_ROOT; }; - 73814B4E0907FC9900C478FC /* testecho.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testecho.c; path = ../libspeex/testecho.c; sourceTree = SOURCE_ROOT; }; - 738837460B193581005C7A69 /* _kiss_fft_guts.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = _kiss_fft_guts.h; path = ../libspeex/_kiss_fft_guts.h; sourceTree = SOURCE_ROOT; }; - 738837470B193581005C7A69 /* fftwrap.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = fftwrap.c; path = ../libspeex/fftwrap.c; sourceTree = SOURCE_ROOT; }; - 738837480B193581005C7A69 /* fftwrap.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fftwrap.h; path = ../libspeex/fftwrap.h; sourceTree = SOURCE_ROOT; }; - 738837490B193581005C7A69 /* filterbank.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = filterbank.c; path = ../libspeex/filterbank.c; sourceTree = SOURCE_ROOT; }; - 7388374A0B193581005C7A69 /* filterbank.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = filterbank.h; path = ../libspeex/filterbank.h; sourceTree = SOURCE_ROOT; }; - 7388374B0B193581005C7A69 /* kiss_fft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = kiss_fft.c; path = ../libspeex/kiss_fft.c; sourceTree = SOURCE_ROOT; }; - 7388374C0B193581005C7A69 /* kiss_fft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = kiss_fft.h; path = ../libspeex/kiss_fft.h; sourceTree = SOURCE_ROOT; }; - 7388374D0B193581005C7A69 /* kiss_fftr.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = kiss_fftr.c; path = ../libspeex/kiss_fftr.c; sourceTree = SOURCE_ROOT; }; - 7388374E0B193581005C7A69 /* kiss_fftr.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = kiss_fftr.h; path = ../libspeex/kiss_fftr.h; sourceTree = SOURCE_ROOT; }; - 7388374F0B193581005C7A69 /* lsp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = lsp_bfin.h; path = ../libspeex/lsp_bfin.h; sourceTree = SOURCE_ROOT; }; - 738837500B193581005C7A69 /* pseudofloat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = pseudofloat.h; path = ../libspeex/pseudofloat.h; sourceTree = SOURCE_ROOT; }; - 738837510B193581005C7A69 /* quant_lsp_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = quant_lsp_bfin.h; path = ../libspeex/quant_lsp_bfin.h; sourceTree = SOURCE_ROOT; }; - 738837520B193581005C7A69 /* vorbis_psy.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = vorbis_psy.c; path = ../libspeex/vorbis_psy.c; sourceTree = SOURCE_ROOT; }; - 738837530B193581005C7A69 /* vorbis_psy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = vorbis_psy.h; path = ../libspeex/vorbis_psy.h; sourceTree = SOURCE_ROOT; }; - 738837770B193667005C7A69 /* libspeex.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libspeex.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D07F2C80486CC7A007CD1D0 /* Speex.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Speex.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 738837750B193667005C7A69 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DDFF38A45A11DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 8D07F2C80486CC7A007CD1D0 /* Speex.framework */, - 738837770B193667005C7A69 /* libspeex.a */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Speex */ = { - isa = PBXGroup; - children = ( - 08FB77ACFE841707C02AAC07 /* Source */, - 73814AEB0907FB6400C478FC /* Headers */, - 089C1665FE841158C02AAC07 /* Resources */, - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, - 034768DDFF38A45A11DB9C8B /* Products */, - ); - name = Speex; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = "External Frameworks and Libraries"; - sourceTree = ""; - }; - 089C1665FE841158C02AAC07 /* Resources */ = { - isa = PBXGroup; - children = ( - 8D07F2C70486CC7A007CD1D0 /* Info.plist */, - 089C1666FE841158C02AAC07 /* InfoPlist.strings */, - ); - name = Resources; - sourceTree = ""; - }; - 08FB77ACFE841707C02AAC07 /* Source */ = { - isa = PBXGroup; - children = ( - 37CA8DFF0DD7352A005C8CB6 /* os_support.h */, - 37CA8DED0DD73408005C8CB6 /* buffer.c */, - 37CA8DEE0DD73408005C8CB6 /* resample.c */, - 37CA8DEF0DD73408005C8CB6 /* resample_sse.h */, - 738837460B193581005C7A69 /* _kiss_fft_guts.h */, - 738837470B193581005C7A69 /* fftwrap.c */, - 738837480B193581005C7A69 /* fftwrap.h */, - 738837490B193581005C7A69 /* filterbank.c */, - 7388374A0B193581005C7A69 /* filterbank.h */, - 7388374B0B193581005C7A69 /* kiss_fft.c */, - 7388374C0B193581005C7A69 /* kiss_fft.h */, - 7388374D0B193581005C7A69 /* kiss_fftr.c */, - 7388374E0B193581005C7A69 /* kiss_fftr.h */, - 738837500B193581005C7A69 /* pseudofloat.h */, - 738837520B193581005C7A69 /* vorbis_psy.c */, - 738837530B193581005C7A69 /* vorbis_psy.h */, - 73814B0C0907FC9900C478FC /* arch.h */, - 73814B1E0907FC9900C478FC /* fixed_arm4.h */, - 73814B1F0907FC9900C478FC /* fixed_arm5e.h */, - 73814B200907FC9900C478FC /* fixed_bfin.h */, - 73814B210907FC9900C478FC /* fixed_debug.h */, - 73814B220907FC9900C478FC /* fixed_generic.h */, - 73814B280907FC9900C478FC /* jitter.c */, - 73814B380907FC9900C478FC /* math_approx.h */, - 73814B390907FC9900C478FC /* mdf.c */, - 73814B3A0907FC9900C478FC /* misc_bfin.h */, - 73814B410907FC9900C478FC /* preprocess.c */, - 73814B460907FC9900C478FC /* smallft.c */, - 73814B470907FC9900C478FC /* smallft.h */, - 73814B4B0907FC9900C478FC /* stack_alloc.h */, - 73814B4D0907FC9900C478FC /* testdenoise.c */, - 73814B4E0907FC9900C478FC /* testecho.c */, - 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */, - ); - name = Source; - sourceTree = ""; - }; - 73814AEB0907FB6400C478FC /* Headers */ = { - isa = PBXGroup; - children = ( - 73814AEC0907FB8200C478FC /* speex */, - ); - name = Headers; - sourceTree = ""; - }; - 73814AEC0907FB8200C478FC /* speex */ = { - isa = PBXGroup; - children = ( - 73814AEF0907FB8200C478FC /* speex.h */, - 37CA8DF70DD7347D005C8CB6 /* speex_buffer.h */, - 73814AF30907FB8200C478FC /* speex_echo.h */, - 73814AF40907FB8200C478FC /* speex_header.h */, - 73814AF50907FB8200C478FC /* speex_jitter.h */, - 73814AF60907FB8200C478FC /* speex_preprocess.h */, - 37CA8DF80DD7347D005C8CB6 /* speex_resampler.h */, - 73814AF80907FB8200C478FC /* speex_types.h */, - ); - name = speex; - path = ../include/speex; - sourceTree = SOURCE_ROOT; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 738837730B193667005C7A69 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */, - 73814B000907FB8200C478FC /* speex_header.h in Headers */, - 73814B010907FB8200C478FC /* speex_jitter.h in Headers */, - 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */, - 73814B030907FB8200C478FC /* speex_stereo.h in Headers */, - 73814B040907FB8200C478FC /* speex_types.h in Headers */, - 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */, - 73814B080907FBAE00C478FC /* speex.h in Headers */, - 738837540B193581005C7A69 /* _kiss_fft_guts.h in Headers */, - 738837560B193581005C7A69 /* fftwrap.h in Headers */, - 738837580B193581005C7A69 /* filterbank.h in Headers */, - 7388375A0B193581005C7A69 /* kiss_fft.h in Headers */, - 7388375C0B193581005C7A69 /* kiss_fftr.h in Headers */, - 7388375D0B193581005C7A69 /* lsp_bfin.h in Headers */, - 7388375E0B193581005C7A69 /* pseudofloat.h in Headers */, - 7388375F0B193581005C7A69 /* quant_lsp_bfin.h in Headers */, - 738837610B193581005C7A69 /* vorbis_psy.h in Headers */, - 37CA8DF60DD73424005C8CB6 /* resample_sse.h in Headers */, - 37CA8DF90DD7347D005C8CB6 /* speex_buffer.h in Headers */, - 37CA8DFA0DD7347D005C8CB6 /* speex_resampler.h in Headers */, - 37CA8E000DD7352A005C8CB6 /* os_support.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 738837760B193667005C7A69 /* libspeex (static) */ = { - isa = PBXNativeTarget; - buildConfigurationList = 738837780B193687005C7A69 /* Build configuration list for PBXNativeTarget "libspeex (static)" */; - buildPhases = ( - 738837730B193667005C7A69 /* Headers */, - 738837740B193667005C7A69 /* Sources */, - 738837750B193667005C7A69 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libspeex (static)"; - productName = speex; - productReference = 738837770B193667005C7A69 /* libspeex.a */; - productType = "com.apple.product-type.library.static"; - }; - 8D07F2BC0486CC7A007CD1D0 /* Speex */ = { - isa = PBXNativeTarget; - buildConfigurationList = 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */; - buildPhases = ( - 8D07F2BD0486CC7A007CD1D0 /* Headers */, - 8D07F2BF0486CC7A007CD1D0 /* Resources */, - 8D07F2C10486CC7A007CD1D0 /* Sources */, - 8D07F2C30486CC7A007CD1D0 /* Frameworks */, - 8D07F2C50486CC7A007CD1D0 /* Rez */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Speex; - productInstallPath = "$(HOME)/Library/Frameworks"; - productName = Speex; - productReference = 8D07F2C80486CC7A007CD1D0 /* Speex.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - buildConfigurationList = 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex" */; - compatibilityVersion = "Xcode 2.4"; - hasScannedForEncodings = 1; - mainGroup = 0867D691FE84028FC02AAC07 /* Speex */; - productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; - projectDirPath = ""; - projectRoot = ..; - targets = ( - 8D07F2BC0486CC7A007CD1D0 /* Speex */, - 738837760B193667005C7A69 /* libspeex (static) */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXRezBuildPhase section */ - 8D07F2C50486CC7A007CD1D0 /* Rez */ = { - isa = PBXRezBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXRezBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 738837740B193667005C7A69 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 738837830B193791005C7A69 /* fftwrap.c in Sources */, - 738837840B193792005C7A69 /* filterbank.c in Sources */, - 7388378B0B1937A0005C7A69 /* jitter.c in Sources */, - 7388378C0B1937A4005C7A69 /* kiss_fft.c in Sources */, - 7388378D0B1937A9005C7A69 /* kiss_fftr.c in Sources */, - 738837940B1937BB005C7A69 /* mdf.c in Sources */, - 738837980B1937C2005C7A69 /* preprocess.c in Sources */, - 7388379B0B1937C9005C7A69 /* smallft.c in Sources */, - 738837A10B1937DD005C7A69 /* vorbis_psy.c in Sources */, - 37CA8DF30DD73408005C8CB6 /* buffer.c in Sources */, - 37CA8DF40DD73408005C8CB6 /* resample.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8D07F2C10486CC7A007CD1D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 73814B750907FC9900C478FC /* jitter.c in Sources */, - 73814B8E0907FC9900C478FC /* preprocess.c in Sources */, - 73814B930907FC9900C478FC /* smallft.c in Sources */, - 738837440B1934D0005C7A69 /* mdf.c in Sources */, - 738837550B193581005C7A69 /* fftwrap.c in Sources */, - 738837570B193581005C7A69 /* filterbank.c in Sources */, - 738837590B193581005C7A69 /* kiss_fft.c in Sources */, - 7388375B0B193581005C7A69 /* kiss_fftr.c in Sources */, - 738837600B193581005C7A69 /* vorbis_psy.c in Sources */, - 37CA8DF00DD73408005C8CB6 /* buffer.c in Sources */, - 37CA8DF10DD73408005C8CB6 /* resample.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 089C1667FE841158C02AAC07 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 73814AE00907FB1E00C478FC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Speex_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Library/Frameworks; - LIBRARY_STYLE = DYNAMIC; - MACH_O_TYPE = mh_dylib; - PRODUCT_NAME = Speex; - WRAPPER_EXTENSION = framework; - ZERO_LINK = YES; - }; - name = Debug; - }; - 73814AE10907FB1E00C478FC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Speex_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Library/Frameworks; - LIBRARY_STYLE = DYNAMIC; - MACH_O_TYPE = mh_dylib; - PRODUCT_NAME = Speex; - WRAPPER_EXTENSION = framework; - ZERO_LINK = NO; - }; - name = Release; - }; - 73814AE40907FB1E00C478FC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - __MACOSX__, - FLOATING_POINT, - "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1)", - ); - GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1 = "EXPORT=__attribute__((visibility(\\\"default\\\")))"; - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; - }; - name = Debug; - }; - 73814AE50907FB1E00C478FC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - ppc, - i386, - ); - GCC_OPTIMIZATION_LEVEL = 3; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - __MACOSX__, - FLOATING_POINT, - "$(GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1)", - ); - GCC_PREPROCESSOR_DEFINITIONS_QUOTED_FOR_PROJECT_1 = "EXPORT=__attribute__((visibility(\\\"default\\\")))"; - OTHER_CFLAGS = ( - "$(OTHER_CFLAGS)", - "-falign-loops=16", - ); - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; - }; - name = Release; - }; - 738837790B193687005C7A69 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - INSTALL_PATH = /usr/local/lib; - PREBINDING = NO; - PRODUCT_NAME = speex; - ZERO_LINK = YES; - }; - name = Debug; - }; - 7388377A0B193687005C7A69 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - INSTALL_PATH = /usr/local/lib; - PREBINDING = NO; - PRODUCT_NAME = speex; - ZERO_LINK = NO; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 73814AE00907FB1E00C478FC /* Debug */, - 73814AE10907FB1E00C478FC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 73814AE40907FB1E00C478FC /* Debug */, - 73814AE50907FB1E00C478FC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 738837780B193687005C7A69 /* Build configuration list for PBXNativeTarget "libspeex (static)" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 738837790B193687005C7A69 /* Debug */, - 7388377A0B193687005C7A69 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/speex/macosx/Speex_Prefix.pch b/speex/macosx/Speex_Prefix.pch deleted file mode 100644 index 13abf5e41..000000000 --- a/speex/macosx/Speex_Prefix.pch +++ /dev/null @@ -1,5 +0,0 @@ -// -// Prefix header for all source files of the 'Speex' target in the 'Speex' project. -// - -#include diff --git a/speex/macosx/Speex_UB.xcodeproj/project.pbxproj b/speex/macosx/Speex_UB.xcodeproj/project.pbxproj deleted file mode 100644 index 1cd5f2e41..000000000 --- a/speex/macosx/Speex_UB.xcodeproj/project.pbxproj +++ /dev/null @@ -1,435 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 42; - objects = { - -/* Begin PBXBuildFile section */ - 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF30907FB8200C478FC /* speex_echo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B000907FB8200C478FC /* speex_header.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF40907FB8200C478FC /* speex_header.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B010907FB8200C478FC /* speex_jitter.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF50907FB8200C478FC /* speex_jitter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF60907FB8200C478FC /* speex_preprocess.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B030907FB8200C478FC /* speex_stereo.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF70907FB8200C478FC /* speex_stereo.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B040907FB8200C478FC /* speex_types.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF80907FB8200C478FC /* speex_types.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF10907FB8200C478FC /* speex_callbacks.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B070907FBAD00C478FC /* speex_bits.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AF00907FB8200C478FC /* speex_bits.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B080907FBAE00C478FC /* speex.h in Headers */ = {isa = PBXBuildFile; fileRef = 73814AEF0907FB8200C478FC /* speex.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 73814B750907FC9900C478FC /* jitter.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B280907FC9900C478FC /* jitter.c */; }; - 73814B840907FC9900C478FC /* math_approx.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B370907FC9900C478FC /* math_approx.c */; }; - 73814B880907FC9900C478FC /* misc.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B3B0907FC9900C478FC /* misc.c */; }; - 73814B8E0907FC9900C478FC /* preprocess.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B410907FC9900C478FC /* preprocess.c */; }; - 73814B930907FC9900C478FC /* smallft.c in Sources */ = {isa = PBXBuildFile; fileRef = 73814B460907FC9900C478FC /* smallft.c */; }; - 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; }; -/* End PBXBuildFile section */ - -/* Begin PBXBuildStyle section */ - 4F0BB7EC011F40E904CA0E50 /* Development */ = { - isa = PBXBuildStyle; - buildSettings = { - COPY_PHASE_STRIP = NO; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - ZERO_LINK = YES; - }; - name = Development; - }; - 4F0BB7ED011F40E904CA0E50 /* Deployment */ = { - isa = PBXBuildStyle; - buildSettings = { - COPY_PHASE_STRIP = YES; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - ZERO_LINK = NO; - }; - name = Deployment; - }; -/* End PBXBuildStyle section */ - -/* Begin PBXFileReference section */ - 089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; - 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Speex_Prefix.pch; sourceTree = ""; }; - 73814AEF0907FB8200C478FC /* speex.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex.h; sourceTree = ""; }; - 73814AF00907FB8200C478FC /* speex_bits.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_bits.h; sourceTree = ""; }; - 73814AF10907FB8200C478FC /* speex_callbacks.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_callbacks.h; sourceTree = ""; }; - 73814AF30907FB8200C478FC /* speex_echo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_echo.h; sourceTree = ""; }; - 73814AF40907FB8200C478FC /* speex_header.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_header.h; sourceTree = ""; }; - 73814AF50907FB8200C478FC /* speex_jitter.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_jitter.h; sourceTree = ""; }; - 73814AF60907FB8200C478FC /* speex_preprocess.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_preprocess.h; sourceTree = ""; }; - 73814AF70907FB8200C478FC /* speex_stereo.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_stereo.h; sourceTree = ""; }; - 73814AF80907FB8200C478FC /* speex_types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = speex_types.h; sourceTree = ""; }; - 73814B0C0907FC9900C478FC /* arch.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = arch.h; path = ../libspeex/arch.h; sourceTree = SOURCE_ROOT; }; - 73814B1E0907FC9900C478FC /* fixed_arm4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm4.h; path = ../libspeex/fixed_arm4.h; sourceTree = SOURCE_ROOT; }; - 73814B1F0907FC9900C478FC /* fixed_arm5e.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_arm5e.h; path = ../libspeex/fixed_arm5e.h; sourceTree = SOURCE_ROOT; }; - 73814B200907FC9900C478FC /* fixed_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_bfin.h; path = ../libspeex/fixed_bfin.h; sourceTree = SOURCE_ROOT; }; - 73814B210907FC9900C478FC /* fixed_debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_debug.h; path = ../libspeex/fixed_debug.h; sourceTree = SOURCE_ROOT; }; - 73814B220907FC9900C478FC /* fixed_generic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = fixed_generic.h; path = ../libspeex/fixed_generic.h; sourceTree = SOURCE_ROOT; }; - 73814B280907FC9900C478FC /* jitter.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = jitter.c; path = ../libspeex/jitter.c; sourceTree = SOURCE_ROOT; }; - 73814B370907FC9900C478FC /* math_approx.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = math_approx.c; path = ../libspeex/math_approx.c; sourceTree = SOURCE_ROOT; }; - 73814B380907FC9900C478FC /* math_approx.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = math_approx.h; path = ../libspeex/math_approx.h; sourceTree = SOURCE_ROOT; }; - 73814B390907FC9900C478FC /* mdf.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = mdf.c; path = ../libspeex/mdf.c; sourceTree = SOURCE_ROOT; }; - 73814B3A0907FC9900C478FC /* misc_bfin.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc_bfin.h; path = ../libspeex/misc_bfin.h; sourceTree = SOURCE_ROOT; }; - 73814B3B0907FC9900C478FC /* misc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = misc.c; path = ../libspeex/misc.c; sourceTree = SOURCE_ROOT; }; - 73814B3C0907FC9900C478FC /* misc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = misc.h; path = ../libspeex/misc.h; sourceTree = SOURCE_ROOT; }; - 73814B3E0907FC9900C478FC /* modes.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = modes.h; path = ../libspeex/modes.h; sourceTree = SOURCE_ROOT; }; - 73814B410907FC9900C478FC /* preprocess.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = preprocess.c; path = ../libspeex/preprocess.c; sourceTree = SOURCE_ROOT; }; - 73814B460907FC9900C478FC /* smallft.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = smallft.c; path = ../libspeex/smallft.c; sourceTree = SOURCE_ROOT; }; - 73814B470907FC9900C478FC /* smallft.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = smallft.h; path = ../libspeex/smallft.h; sourceTree = SOURCE_ROOT; }; - 73814B4B0907FC9900C478FC /* stack_alloc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = stack_alloc.h; path = ../libspeex/stack_alloc.h; sourceTree = SOURCE_ROOT; }; - 73814B4D0907FC9900C478FC /* testdenoise.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testdenoise.c; path = ../libspeex/testdenoise.c; sourceTree = SOURCE_ROOT; }; - 73814B4E0907FC9900C478FC /* testecho.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = testecho.c; path = ../libspeex/testecho.c; sourceTree = SOURCE_ROOT; }; - 8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; - 8D07F2C80486CC7A007CD1D0 /* Speex.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Speex.framework; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 8D07F2C30486CC7A007CD1D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 034768DDFF38A45A11DB9C8B /* Products */ = { - isa = PBXGroup; - children = ( - 8D07F2C80486CC7A007CD1D0 /* Speex.framework */, - ); - name = Products; - sourceTree = ""; - }; - 0867D691FE84028FC02AAC07 /* Speex */ = { - isa = PBXGroup; - children = ( - 08FB77ACFE841707C02AAC07 /* Source */, - 73814AEB0907FB6400C478FC /* Headers */, - 089C1665FE841158C02AAC07 /* Resources */, - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */, - 034768DDFF38A45A11DB9C8B /* Products */, - ); - name = Speex; - sourceTree = ""; - }; - 0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = { - isa = PBXGroup; - children = ( - ); - name = "External Frameworks and Libraries"; - sourceTree = ""; - }; - 089C1665FE841158C02AAC07 /* Resources */ = { - isa = PBXGroup; - children = ( - 8D07F2C70486CC7A007CD1D0 /* Info.plist */, - 089C1666FE841158C02AAC07 /* InfoPlist.strings */, - ); - name = Resources; - sourceTree = ""; - }; - 08FB77ACFE841707C02AAC07 /* Source */ = { - isa = PBXGroup; - children = ( - 73814B0C0907FC9900C478FC /* arch.h */, - 73814B1E0907FC9900C478FC /* fixed_arm4.h */, - 73814B1F0907FC9900C478FC /* fixed_arm5e.h */, - 73814B200907FC9900C478FC /* fixed_bfin.h */, - 73814B210907FC9900C478FC /* fixed_debug.h */, - 73814B220907FC9900C478FC /* fixed_generic.h */, - 73814B280907FC9900C478FC /* jitter.c */, - 73814B370907FC9900C478FC /* math_approx.c */, - 73814B380907FC9900C478FC /* math_approx.h */, - 73814B390907FC9900C478FC /* mdf.c */, - 73814B3A0907FC9900C478FC /* misc_bfin.h */, - 73814B3B0907FC9900C478FC /* misc.c */, - 73814B3C0907FC9900C478FC /* misc.h */, - 73814B410907FC9900C478FC /* preprocess.c */, - 73814B460907FC9900C478FC /* smallft.c */, - 73814B470907FC9900C478FC /* smallft.h */, - 73814B4B0907FC9900C478FC /* stack_alloc.h */, - 73814B4D0907FC9900C478FC /* testdenoise.c */, - 73814B4E0907FC9900C478FC /* testecho.c */, - 32BAE0B70371A74B00C91783 /* Speex_Prefix.pch */, - ); - name = Source; - sourceTree = ""; - }; - 73814AEB0907FB6400C478FC /* Headers */ = { - isa = PBXGroup; - children = ( - 73814AEC0907FB8200C478FC /* speex */, - ); - name = Headers; - sourceTree = ""; - }; - 73814AEC0907FB8200C478FC /* speex */ = { - isa = PBXGroup; - children = ( - 73814AEF0907FB8200C478FC /* speex.h */, - 73814AF00907FB8200C478FC /* speex_bits.h */, - 73814AF10907FB8200C478FC /* speex_callbacks.h */, - 73814AF30907FB8200C478FC /* speex_echo.h */, - 73814AF40907FB8200C478FC /* speex_header.h */, - 73814AF50907FB8200C478FC /* speex_jitter.h */, - 73814AF60907FB8200C478FC /* speex_preprocess.h */, - 73814AF70907FB8200C478FC /* speex_stereo.h */, - 73814AF80907FB8200C478FC /* speex_types.h */, - ); - name = speex; - path = ../include/speex; - sourceTree = SOURCE_ROOT; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 8D07F2BD0486CC7A007CD1D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 73814AFF0907FB8200C478FC /* speex_echo.h in Headers */, - 73814B000907FB8200C478FC /* speex_header.h in Headers */, - 73814B010907FB8200C478FC /* speex_jitter.h in Headers */, - 73814B020907FB8200C478FC /* speex_preprocess.h in Headers */, - 73814B030907FB8200C478FC /* speex_stereo.h in Headers */, - 73814B040907FB8200C478FC /* speex_types.h in Headers */, - 73814B060907FBAB00C478FC /* speex_callbacks.h in Headers */, - 73814B070907FBAD00C478FC /* speex_bits.h in Headers */, - 73814B080907FBAE00C478FC /* speex.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 8D07F2BC0486CC7A007CD1D0 /* Speex */ = { - isa = PBXNativeTarget; - buildConfigurationList = 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */; - buildPhases = ( - 8D07F2BD0486CC7A007CD1D0 /* Headers */, - 8D07F2BF0486CC7A007CD1D0 /* Resources */, - 8D07F2C10486CC7A007CD1D0 /* Sources */, - 8D07F2C30486CC7A007CD1D0 /* Frameworks */, - 8D07F2C50486CC7A007CD1D0 /* Rez */, - ); - buildRules = ( - ); - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Speex_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = "$(HOME)/Library/Frameworks"; - LIBRARY_STYLE = DYNAMIC; - PRODUCT_NAME = Speex; - WRAPPER_EXTENSION = framework; - }; - dependencies = ( - ); - name = Speex; - productInstallPath = "$(HOME)/Library/Frameworks"; - productName = Speex; - productReference = 8D07F2C80486CC7A007CD1D0 /* Speex.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0867D690FE84028FC02AAC07 /* Project object */ = { - isa = PBXProject; - buildConfigurationList = 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex_UB" */; - buildSettings = { - }; - buildStyles = ( - 4F0BB7EC011F40E904CA0E50 /* Development */, - 4F0BB7ED011F40E904CA0E50 /* Deployment */, - ); - hasScannedForEncodings = 1; - mainGroup = 0867D691FE84028FC02AAC07 /* Speex */; - productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */; - projectDirPath = ""; - targets = ( - 8D07F2BC0486CC7A007CD1D0 /* Speex */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 8D07F2BF0486CC7A007CD1D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXRezBuildPhase section */ - 8D07F2C50486CC7A007CD1D0 /* Rez */ = { - isa = PBXRezBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXRezBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8D07F2C10486CC7A007CD1D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 73814B750907FC9900C478FC /* jitter.c in Sources */, - 73814B840907FC9900C478FC /* math_approx.c in Sources */, - 73814B880907FC9900C478FC /* misc.c in Sources */, - 73814B8E0907FC9900C478FC /* preprocess.c in Sources */, - 73814B930907FC9900C478FC /* smallft.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 089C1666FE841158C02AAC07 /* InfoPlist.strings */ = { - isa = PBXVariantGroup; - children = ( - 089C1667FE841158C02AAC07 /* English */, - ); - name = InfoPlist.strings; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 73814AE00907FB1E00C478FC /* Development */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_GENERATE_DEBUGGING_SYMBOLS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Speex_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Library/Frameworks; - LIBRARY_STYLE = DYNAMIC; - MACH_O_TYPE = mh_dylib; - PRODUCT_NAME = Speex; - WRAPPER_EXTENSION = framework; - ZERO_LINK = YES; - }; - name = Development; - }; - 73814AE10907FB1E00C478FC /* Deployment */ = { - isa = XCBuildConfiguration; - buildSettings = { - COPY_PHASE_STRIP = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Speex_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Library/Frameworks; - LIBRARY_STYLE = DYNAMIC; - MACH_O_TYPE = mh_dylib; - PRODUCT_NAME = Speex; - WRAPPER_EXTENSION = framework; - ZERO_LINK = NO; - }; - name = Deployment; - }; - 73814AE20907FB1E00C478FC /* Default */ = { - isa = XCBuildConfiguration; - buildSettings = { - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - FRAMEWORK_VERSION = A; - GCC_GENERATE_DEBUGGING_SYMBOLS = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = Speex_Prefix.pch; - INFOPLIST_FILE = Info.plist; - INSTALL_PATH = /Library/Frameworks; - LIBRARY_STYLE = DYNAMIC; - MACH_O_TYPE = mh_dylib; - PRODUCT_NAME = Speex; - WRAPPER_EXTENSION = framework; - }; - name = Default; - }; - 73814AE40907FB1E00C478FC /* Development */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - ppc, - i386, - ); - GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; - }; - name = Development; - }; - 73814AE50907FB1E00C478FC /* Deployment */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - ppc, - i386, - ); - GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; - }; - name = Deployment; - }; - 73814AE60907FB1E00C478FC /* Default */ = { - isa = XCBuildConfiguration; - buildSettings = { - ARCHS = ( - ppc, - i386, - ); - GCC_PREPROCESSOR_DEFINITIONS = __MACOSX__; - SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; - }; - name = Default; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 73814ADF0907FB1E00C478FC /* Build configuration list for PBXNativeTarget "Speex" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 73814AE00907FB1E00C478FC /* Development */, - 73814AE10907FB1E00C478FC /* Deployment */, - 73814AE20907FB1E00C478FC /* Default */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Default; - }; - 73814AE30907FB1E00C478FC /* Build configuration list for PBXProject "Speex_UB" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 73814AE40907FB1E00C478FC /* Development */, - 73814AE50907FB1E00C478FC /* Deployment */, - 73814AE60907FB1E00C478FC /* Default */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Default; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0867D690FE84028FC02AAC07 /* Project object */; -} diff --git a/speex/regression-fixes/1-resampler_unsigned_fix.patch b/speex/regression-fixes/1-resampler_unsigned_fix.patch deleted file mode 100644 index 99a4c8a6d..000000000 --- a/speex/regression-fixes/1-resampler_unsigned_fix.patch +++ /dev/null @@ -1,17 +0,0 @@ -diff --git a/libspeex/resample.c b/libspeex/resample.c -index 4403f78..48ffcef 100644 ---- a/libspeex/resample.c -+++ b/libspeex/resample.c -@@ -561,10 +561,10 @@ static void update_filter(SpeexResamplerState *st) - } - for (i=0;iden_rate;i++) - { -- spx_uint32_t j; -+ spx_int32_t j; - for (j=0;jfilt_len;j++) - { -- st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); -+ st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func); - } - } - #ifdef FIXED_POINT diff --git a/speex/regressions b/speex/regressions deleted file mode 100644 index 2a1763172..000000000 --- a/speex/regressions +++ /dev/null @@ -1,4 +0,0 @@ -1: 723f644e09333a0230383eae4af1f3aa3e46e1c3 (r12736): broke resampler badly -Changed the sign of a bunch of parameters in the API. Tons of signed/unsigned changes in the code as a consequence of that. Hopefully this will be the last change to the API. -Fixed: 2007-08-11 - diff --git a/speex/speexdsp.pc.in b/speex/speexdsp.pc.in deleted file mode 100644 index 6c6d26f3a..000000000 --- a/speex/speexdsp.pc.in +++ /dev/null @@ -1,15 +0,0 @@ -# libspeexdsp pkg-config source file - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -includedir=@includedir@ - -Name: speexdsp -Description: Speexdsp is a speech processing library that goes along with the Speex codec -Version: @PACKAGE_VERSION@ -Requires: @FFT_PKGCONFIG@ -Conflicts: -Libs: -L${libdir} -lspeexdsp -Libs.private: @LIBM@ -Cflags: -I${includedir} diff --git a/speex/symbian/Makefile.am b/speex/symbian/Makefile.am deleted file mode 100644 index 6cdaf24b4..000000000 --- a/speex/symbian/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = bld.inf config.h speex.mmp diff --git a/speex/symbian/bld.inf b/speex/symbian/bld.inf deleted file mode 100644 index da5ef4875..000000000 --- a/speex/symbian/bld.inf +++ /dev/null @@ -1,49 +0,0 @@ -/* - Copyright (C) 2003 Commonwealth Scientific and Industrial Research - Organisation (CSIRO) Australia - - 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 CSIRO Australia 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 ORGANISATION 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. -*/ - -PRJ_EXPORTS - -..\include\speex\speex_bits.h \epoc32\include\speex\speex_bits.h -..\include\speex\speex_callbacks.h \epoc32\include\speex\speex_callbacks.h -..\include\speex\speex_config_types.h \epoc32\include\speex\speex_config_types.h -..\include\speex\speex_echo.h \epoc32\include\speex\speex_echo.h -..\include\speex\speex.h \epoc32\include\speex\speex.h -..\include\speex\speex_header.h \epoc32\include\speex\speex_header.h -..\include\speex\speex_jitter.h \epoc32\include\speex\speex_jitter.h -..\include\speex\speex_preprocess.h \epoc32\include\speex\speex_preprocess.h -..\include\speex\speex_stereo.h \epoc32\include\speex\speex_stereo.h -..\include\speex\speex_types.h \epoc32\include\speex\speex_types.h - - -PRJ_MMPFILES - -speex.mmp diff --git a/speex/symbian/speex.mmp b/speex/symbian/speex.mmp deleted file mode 100644 index 6274e4dea..000000000 --- a/speex/symbian/speex.mmp +++ /dev/null @@ -1,40 +0,0 @@ -/* - Copyright (C) 2003 Commonwealth Scientific and Industrial Research - Organisation (CSIRO) Australia - - 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 CSIRO Australia 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 ORGANISATION 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. -*/ - -TARGET speex.lib -TARGETTYPE lib -UID 0 -MACRO HAVE_CONFIG_H -SOURCEPATH ..\libspeex -SOURCE buffer.c fftwrap.c filterbank.c jitter.c kiss_fft.c kiss_fftr.c mdf.c preprocess.c resample.c scal.c smallft.c -USERINCLUDE . ..\include\speex -SYSTEMINCLUDE \epoc32\include \epoc32\include\libc ..\include diff --git a/speex/ti/Makefile.am b/speex/ti/Makefile.am deleted file mode 100644 index fd3c49624..000000000 --- a/speex/ti/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -SUBDIRS = speex_C54_test speex_C55_test speex_C64_test - -EXTRA_DIST = config.h os_support_custom.h - diff --git a/speex/ti/os_support_custom.h b/speex/ti/os_support_custom.h deleted file mode 100644 index 8f832cf64..000000000 --- a/speex/ti/os_support_custom.h +++ /dev/null @@ -1,128 +0,0 @@ -/* Copyright (C) 2007 Psi Systems, Inc. - Author: Jean-Marc Valin - File: os_support_custom.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. -*/ - -#ifdef MANUAL_ALLOC - -/* To avoid changing the Speex call model, this file relies on four static variables - The user main creates two linear buffers, and initializes spxGlobalHeap/ScratchPtr - to point to the start of the two buffers, and initializes spxGlobalHeap/ScratchEnd - to point to the first address following the last byte of the two buffers. - - This mechanism allows, for example, data caching for multichannel applications, - where the Speex state is swapped from a large slow memory to a small fast memory - each time the codec runs. - - Persistent data is allocated in spxGlobalHeap (instead of calloc), while scratch - data is allocated in spxGlobalScratch. -*/ - -extern char *spxGlobalHeapPtr, *spxGlobalHeapEnd; -extern char *spxGlobalScratchPtr, *spxGlobalScratchEnd; - -/* Make sure that all structures are aligned to largest type */ -#define BLOCK_MASK (sizeof(long double)-1) -extern inline void speex_warning(const char *str); - -#define OVERRIDE_SPEEX_ALLOC -static inline void *speex_alloc (int size) -{ - void *ptr; - - ptr = (void *) (((int)spxGlobalHeapPtr + BLOCK_MASK) & ~BLOCK_MASK); //Start on 8 boundary - - spxGlobalHeapPtr = (char *)((int)ptr + size); // Update pointer to next free location - - if (spxGlobalHeapPtr > spxGlobalHeapEnd ) - { -#ifdef VERBOSE_ALLOC - fprintf (stderr, "insufficient space for persistent alloc request %d bytes\n", size); -#endif - return 0; - } - -#ifdef VERBOSE_ALLOC - fprintf (stderr, "Persist Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalHeapEnd - (int)spxGlobalHeapPtr)); -#endif - memset(ptr, 0, size); - return ptr; -} - -#define OVERRIDE_SPEEX_ALLOC_SCRATCH -static inline void *speex_alloc_scratch (int size) -{ - void *ptr; - - ptr = (void *) (((int)spxGlobalScratchPtr + BLOCK_MASK) & ~BLOCK_MASK); //Start on 8 boundary - - spxGlobalScratchPtr = (char *)((int)ptr + size); // Update pointer to next free location - - if (spxGlobalScratchPtr > spxGlobalScratchEnd ) - { -#ifdef VERBOSE_ALLOC - fprintf (stderr, "insufficient space for scratch alloc request %d bytes\n", size); -#endif - return 0; - } - -#ifdef VERBOSE_ALLOC - fprintf (stderr, "Scratch Allocated %d chars at %x, %d remaining\n", size, ptr, ((int)spxGlobalScratchEnd - (int)spxGlobalScratchPtr)); -#endif - memset(ptr, 0, size); - return ptr; -} - -#define OVERRIDE_SPEEX_REALLOC -static inline void *speex_realloc (void *ptr, int size) -{ -#ifdef VERBOSE_ALLOC - speex_warning("realloc attempted, not allowed"); -#endif - return 0; -} - -#define OVERRIDE_SPEEX_FREE -static inline void speex_free (void *ptr) -{ -#ifdef VERBOSE_ALLOC - speex_warning("at speex_free"); -#endif -} -#define OVERRIDE_SPEEX_FREE_SCRATCH -static inline void speex_free_scratch (void *ptr) -{ -#ifdef VERBOSE_ALLOC - speex_warning("at speex_free_scratch"); -#endif -} - -#endif /* !MANUAL_ALLOC */ diff --git a/speex/ti/speex_C54_test/Makefile.am b/speex/ti/speex_C54_test/Makefile.am deleted file mode 100644 index f7b10bc4c..000000000 --- a/speex/ti/speex_C54_test/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = speex_C54_test.cmd speex_C54_test.pjt - - diff --git a/speex/ti/speex_C54_test/speex_C54_test.cmd b/speex/ti/speex_C54_test/speex_C54_test.cmd deleted file mode 100644 index 4989a35f7..000000000 --- a/speex/ti/speex_C54_test/speex_C54_test.cmd +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (C) 2005 Psi Systems, Inc. - File: speex_C54_test.cmd - Linker command file with memory allocation for TI TMS320VC5416 processor - 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. -*/ - --c --stack 0x2000 --heap 0x1000 /* If private memory allocation is used for Speex */ -/*-heap 0x6000 /* If calloc is used for Speex */ --lrts_ext.lib - -MEMORY -{ -/* PAGE 0: P_DARAM03: origin = 0x80, len = 0x7f00*/ - PAGE 0: P_DARAM03: origin = 0x5000, len = 0x2f80 - PAGE 0: VECT: origin = 0x7f80, len = 0x80 - PAGE 0: P_DARAM47: origin = 0x18000, len = 0x8000 - PAGE 0: SARAM03: origin = 0x28000, len = 0x8000 - PAGE 0: SARAM47: origin = 0x38000, len = 0x8000 - - PAGE 1: USERREGS: origin = 0x60, len = 0x1a - PAGE 1: BIOSREGS: origin = 0x7c, len = 0x4 - PAGE 1: CSLREGS: origin = 0x7a, len = 0x2 - D_DARAM03: origin = 0x80, len = 0x4f80 - D_DARAM47: origin = 0x8000, len = 0x8000 -} - -SECTIONS -{ - .vectors: {} > VECT PAGE 0 - .bootmem: {rts_ext.lib (.text)} > P_DARAM03 PAGE 0 -/* .bootmem: {} > P_DARAM03 PAGE 0 */ - .text: {} > SARAM03 PAGE 0 - .cinit: {} > SARAM03 PAGE 0 - .switch: {} > SARAM03 PAGE 0 - .bss: {} > D_DARAM03 | D_DARAM47 PAGE 1 - .far: {} > D_DARAM03 | D_DARAM47 PAGE 1 - .const: {} > D_DARAM03 | D_DARAM47 PAGE 1 - .sysmem: {} > D_DARAM47 PAGE 1 - .cio: {} > D_DARAM03 | D_DARAM47 PAGE 1 - .stack: {} > D_DARAM03 | D_DARAM47 PAGE 1 - .myheap: {} > D_DARAM47 PAGE 1 -} diff --git a/speex/ti/speex_C54_test/speex_C54_test.pjt b/speex/ti/speex_C54_test/speex_C54_test.pjt deleted file mode 100644 index e74bb1ba0..000000000 --- a/speex/ti/speex_C54_test/speex_C54_test.pjt +++ /dev/null @@ -1,44 +0,0 @@ -; Code Composer Project File, Version 2.0 (do not modify or remove this line) - -[Project Settings] -ProjectDir="C:\Speex\speex_14274\ti\speex_C54_test\" -ProjectType=Executable -CPUFamily=TMS320C54XX -Tool="Compiler" -Tool="CustomBuilder" -Tool="DspBiosBuilder" -Tool="Linker" -Config="Debug" -Config="Release" - -[Source Files] -Source="..\..\libspeexdsp\buffer.c" -Source="..\..\libspeexdsp\fftwrap.c" -Source="..\..\libspeexdsp\filterbank.c" -Source="..\..\libspeexdsp\jitter.c" -Source="..\..\libspeexdsp\kiss_fft.c" -Source="..\..\libspeexdsp\kiss_fftr.c" -Source="..\..\libspeexdsp\mdf.c" -Source="..\..\libspeexdsp\preprocess.c" -Source="..\..\libspeexdsp\resample.c" -Source="..\..\libspeexdsp\scal.c" -Source="speex_C54_test.cmd" - -["Compiler" Settings: "Debug"] -Options=-g -q -o3 -fr"..\ti\speex_C54_test\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms - -["Compiler" Settings: "Release"] -Options=-q -o2 -fr"..\ti\speex_C54_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C54X" -d"HAVE_CONFIG_H" -d"NO_LONGLONG" -mf -ms - -["DspBiosBuilder" Settings: "Debug"] -Options=-v54 - -["DspBiosBuilder" Settings: "Release"] -Options=-v54 - -["Linker" Settings: "Debug"] -Options=-q -c -heap4096 -m".\Debug\speex_C54_test.map" -o".\Debug\speex_C54_test.out" -stack4096 -w -x - -["Linker" Settings: "Release"] -Options=-q -c -m".\Release\speex_C54_test.map" -o".\Release\speex_C54_test.out" -w -x - diff --git a/speex/ti/speex_C55_test/Makefile.am b/speex/ti/speex_C55_test/Makefile.am deleted file mode 100644 index 6c89ed7c1..000000000 --- a/speex/ti/speex_C55_test/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = speex_C55_test.cmd speex_C55_test.pjt diff --git a/speex/ti/speex_C55_test/speex_C55_test.cmd b/speex/ti/speex_C55_test/speex_C55_test.cmd deleted file mode 100644 index 17cbf01dc..000000000 --- a/speex/ti/speex_C55_test/speex_C55_test.cmd +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright (C) 2005 Psi Systems, Inc. - File: speex_C55_test.cmd - Linker command file with memory allocation for TI TMS320VC5509A processor - 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. -*/ - --c --stack 0x1c00 --heap 0x1000 /* If private memory allocation is used for Speex */ -/*-heap 0x6000 / * If calloc is used for Speex */ --sysstack 0x200 --lrts55.lib - -MEMORY -{ - DARAM: origin = 0x200, len = 0x7e00 - DARAM_B: origin = 0x8000, len = 0x8000 - VECT: origin = 0x100, len = 0x100 - SARAM_A: origin = 0x10000, len = 0x10000 - SARAM_B: origin = 0x20000, len = 0x20000 -} - -SECTIONS -{ - .vectors: {} > VECT - .bootmem: {} > DARAM - .text: {} > SARAM_B - .cinit: {} > SARAM_B - .switch: {} > SARAM_B - .bss: {} > DARAM -/* .far: {} > DARAM*/ - .const: {} > DARAM - .sysmem: {} > DARAM_B - .cio: {} > DARAM - .stack: {} > DARAM - .sysstack: {} > DARAM - .myheap: {} > SARAM_A -} diff --git a/speex/ti/speex_C55_test/speex_C55_test.pjt b/speex/ti/speex_C55_test/speex_C55_test.pjt deleted file mode 100644 index a4e0cd5ff..000000000 --- a/speex/ti/speex_C55_test/speex_C55_test.pjt +++ /dev/null @@ -1,44 +0,0 @@ -; Code Composer Project File, Version 2.0 (do not modify or remove this line) - -[Project Settings] -ProjectDir="C:\Speex\speex_14274\ti\speex_C55_test\" -ProjectType=Executable -CPUFamily=TMS320C55XX -Tool="Compiler" -Tool="CustomBuilder" -Tool="DspBiosBuilder" -Tool="Linker" -Config="Debug" -Config="Release" - -[Source Files] -Source="..\..\libspeexdsp\buffer.c" -Source="..\..\libspeexdsp\fftwrap.c" -Source="..\..\libspeexdsp\filterbank.c" -Source="..\..\libspeexdsp\jitter.c" -Source="..\..\libspeexdsp\kiss_fft.c" -Source="..\..\libspeexdsp\kiss_fftr.c" -Source="..\..\libspeexdsp\mdf.c" -Source="..\..\libspeexdsp\preprocess.c" -Source="..\..\libspeexdsp\resample.c" -Source="..\..\libspeexdsp\scal.c" -Source="speex_C55_test.cmd" - -["Compiler" Settings: "Debug"] -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 - -["Compiler" Settings: "Release"] -Options=-q -o2 -fr"..\ti\speex_C55_test\Release" -i"..\ti" -i"..\include" -d"CONFIG_TI_C55X" -d"HAVE_CONFIG_H" -mn - -["DspBiosBuilder" Settings: "Debug"] -Options=-v55 - -["DspBiosBuilder" Settings: "Release"] -Options=-v55 - -["Linker" Settings: "Debug"] -Options=-q -c -m".\Debug\speex_C55_test.map" -o".\Debug\speex_C55_test.out" -w -x - -["Linker" Settings: "Release"] -Options=-q -c -m".\Release\speex_C55_test.map" -o".\Release\speex_C55_test.out" -w -x - diff --git a/speex/ti/speex_C64_test/Makefile.am b/speex/ti/speex_C64_test/Makefile.am deleted file mode 100644 index 14ea2baae..000000000 --- a/speex/ti/speex_C64_test/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = speex_C64_test.cmd speex_C64_test.pjt diff --git a/speex/ti/speex_C64_test/speex_C64_test.cmd b/speex/ti/speex_C64_test/speex_C64_test.cmd deleted file mode 100644 index 1e023db65..000000000 --- a/speex/ti/speex_C64_test/speex_C64_test.cmd +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2005 Psi Systems, Inc. - File: speex_C64_test.cmd - Linker command file with memory allocation for TI TMS320C6415 processor - 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. -*/ - --stack 0x10000 --heap 0x10000 - - -MEMORY -{ - VECRAM : origin = 0x0, len = 0x200 - IPRAM : origin = 0x200, len = 0x40000 - IDRAM : origin = 0x80000, len = 0x70000 -} - -SECTIONS -{ - .vectors > VECRAM - .text > IPRAM - - .bss > IDRAM - .cinit > IDRAM - .const > IDRAM - .far > IDRAM - .stack > IDRAM - .cio > IDRAM - .sysmem > IDRAM - .switch > IDRAM - .myheap > IDRAM -} diff --git a/speex/ti/speex_C64_test/speex_C64_test.pjt b/speex/ti/speex_C64_test/speex_C64_test.pjt deleted file mode 100644 index f4767d068..000000000 --- a/speex/ti/speex_C64_test/speex_C64_test.pjt +++ /dev/null @@ -1,45 +0,0 @@ -; Code Composer Project File, Version 2.0 (do not modify or remove this line) - -[Project Settings] -ProjectDir="C:\Speex\speex_14274\ti\speex_C64_test\" -ProjectType=Executable -CPUFamily=TMS320C64XX -Tool="Compiler" -Tool="CustomBuilder" -Tool="DspBiosBuilder" -Tool="Linker" -Config="Debug" -Config="Release" - -[Source Files] -Source="..\..\..\..\CCStudio_v3.1\C6000\cgtools\lib\rts6400.lib" -Source="..\..\libspeexdsp\buffer.c" -Source="..\..\libspeexdsp\fftwrap.c" -Source="..\..\libspeexdsp\filterbank.c" -Source="..\..\libspeexdsp\jitter.c" -Source="..\..\libspeexdsp\kiss_fft.c" -Source="..\..\libspeexdsp\kiss_fftr.c" -Source="..\..\libspeexdsp\mdf.c" -Source="..\..\libspeexdsp\preprocess.c" -Source="..\..\libspeexdsp\resample.c" -Source="..\..\libspeexdsp\scal.c" -Source="speex_C64_test.cmd" - -["Compiler" Settings: "Debug"] -Options=-g -o3 -fr"$(Proj_dir)\Debug" -i"..\ti" -i"..\include" -d"_DEBUG" -d"CONFIG_TI_C6X" -d"HAVE_CONFIG_H" -mv6400 - -["Compiler" Settings: "Release"] -Options=-o3 -fr"$(Proj_dir)\Release" -i"..\ti" -i"..\include" -d"HAVE_CONFIG_H" -mv6400 - -["DspBiosBuilder" Settings: "Debug"] -Options=-v6x - -["DspBiosBuilder" Settings: "Release"] -Options=-v6x - -["Linker" Settings: "Debug"] -Options=-c -m".\Debug\speex_C64_test.map" -o".\Debug\speex_C64_test.out" -w -x - -["Linker" Settings: "Release"] -Options=-c -m".\Release\speex_C64_test.map" -o".\Release\speex_C64_test.out" -w -x - diff --git a/speex/tmv/_kiss_fft_guts_tm.h b/speex/tmv/_kiss_fft_guts_tm.h deleted file mode 100644 index 55c304905..000000000 --- a/speex/tmv/_kiss_fft_guts_tm.h +++ /dev/null @@ -1,188 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file _kiss_fft_guts_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ - -#ifndef _KISS_FFT_GUTS_TM_ -#define _KISS_FFT_GUTS_TM_ - -#ifdef TM_ASM - -#include - -#ifdef FIXED_POINT - -#undef sround -#define sround(x) sex16(((x) + (1<<(FRACBITS-1)) ) >> FRACBITS) - -#undef MIN -#undef MAX -#define MIN(a,b) imin(a,b) -#define MAX(a,b) imax(a,b) - -#define TM_MUL(res,a,b) \ - { register int a0, a1, b0, b1; \ - \ - a0 = sex16((a)); \ - a1 = asri(16,(a)); \ - b0 = sex16((b)); \ - b1 = asri(16,(b)); \ - (res)= pack16lsb( \ - sround(ifir16((a),funshift2((b),(b)))), \ - sround(a0*b0-a1*b1)); \ - } \ - -#define TM_ADD(res,a,b) \ - { (res)=dspidualadd((a),(b)); \ - } \ - -#define TM_SUB(res,a,b) \ - { (res)=dspidualsub((a),(b)); \ - } \ - -#define TM_SHR(res,a,shift) \ - { (res)=dualasr((a),(shift)); \ - } \ - -#define TM_DIV(res,c,frac) \ - { register int c1, c0; \ - \ - c1 = asri(16,(c)); \ - c0 = sex16((c)); \ - (res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\ - } \ - -#define TM_NEGMSB(res, a) \ - { (res) = pack16lsb((ineg(asri(16,(a)))), (a)); \ - } \ - -#else - -#undef MIN -#undef MAX -#define MIN(a,b) fmin(a,b) -#define MAX(a,b) fmax(a,b) - -#endif -#endif - -#undef CHECKBUF -#define CHECKBUF(buf,nbuf,n) \ - { \ - if ( nbuf < (size_t)(n) ) { \ - speex_free(buf); \ - buf = (kiss_fft_cpx*)KISS_FFT_MALLOC(sizeof(kiss_fft_cpx)*(n)); \ - nbuf = (size_t)(n); \ - } \ - } \ - -#undef C_ADD -#define C_ADD( res, a,b) \ - { \ - CHECK_OVERFLOW_OP((a).r,+,(b).r) \ - CHECK_OVERFLOW_OP((a).i,+,(b).i) \ - (res).r=(a).r+(b).r; (res).i=(a).i+(b).i; \ - } \ - - -#undef C_SUB -#define C_SUB( res, a,b) \ - { \ - CHECK_OVERFLOW_OP((a).r,-,(b).r) \ - CHECK_OVERFLOW_OP((a).i,-,(b).i) \ - (res).r=(a).r-(b).r; (res).i=(a).i-(b).i; \ - } \ - -#undef C_ADDTO -#define C_ADDTO( res , a) \ - { \ - CHECK_OVERFLOW_OP((res).r,+,(a).r) \ - CHECK_OVERFLOW_OP((res).i,+,(a).i) \ - (res).r += (a).r; (res).i += (a).i; \ - } \ - -#undef C_SUBFROM -#define C_SUBFROM( res, a) \ - { \ - CHECK_OVERFLOW_OP((res).r,-,(a).r) \ - CHECK_OVERFLOW_OP((res).i,-,(a).i) \ - (res).r -= (a).r; (res).i -= (a).i; \ - } \ - -#undef kf_cexp -#define kf_cexp(x,phase) \ - { (x)->r = KISS_FFT_COS(phase); \ - (x)->i = KISS_FFT_SIN(phase); } \ - -#undef kf_cexp2 -#define kf_cexp2(x,phase) \ - { (x)->r = spx_cos_norm((phase)); \ - (x)->i = spx_cos_norm((phase)-32768); } \ - - -#ifdef FIXED_POINT - -#undef C_MUL -#define C_MUL(m,a,b) \ - { (m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) ); \ - (m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); } \ - -#undef C_FIXDIV -#define C_FIXDIV(c,div) \ - { DIVSCALAR( (c).r , div); \ - DIVSCALAR( (c).i , div); } \ - -#undef C_MULBYSCALAR -#define C_MULBYSCALAR( c, s ) \ - { (c).r = sround( smul( (c).r , s ) ) ; \ - (c).i = sround( smul( (c).i , s ) ) ; } \ - -#else - -#undef C_MUL -#define C_MUL(m,a,b) \ - { (m).r = (a).r*(b).r - (a).i*(b).i; \ - (m).i = (a).r*(b).i + (a).i*(b).r; } \ - - -#undef C_MULBYSCALAR -#define C_MULBYSCALAR( c, s ) \ - { (c).r *= (s); \ - (c).i *= (s); } \ - - - -#endif - -#endif - diff --git a/speex/tmv/fftwrap_tm.h b/speex/tmv/fftwrap_tm.h deleted file mode 100644 index ac1564fe4..000000000 --- a/speex/tmv/fftwrap_tm.h +++ /dev/null @@ -1,233 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file fftwrap_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ -#include -#include "profile_tm.h" - -#ifdef FIXED_POINT - -#define OVERRIDE_MAXIMIZE_RANGE -static int maximize_range(Int16 *in, Int16 *out, int bound, int len) -{ - register int max_val=0; - register int shift=0; - register int i, j; - - TMDEBUG_ALIGNMEM(in); - TMDEBUG_ALIGNMEM(out); - - MAXIMIZERANGE_START(); - - len >>= 1; - - for ( i=0 ; i>1) && max_val != 0 ) - { max_val <<= 1; - shift++; - } - - if ( shift != 0 ) - { - for ( i=0,j=0 ; i>1); - s = pack16lsb(s,s); - - len >>= 1; - l = len & (int)0xFFFFFFFE; - - for ( i=0,j=0 ; i>= 1; - - for( i=1 ; i -#include "profile_tm.h" - -#ifdef FIXED_POINT - -#define OVERRIDE_FILTERBANK_COMPUTE_BANK32 -void filterbank_compute_bank32(FilterBank * restrict bank, spx_word32_t * restrict ps, spx_word32_t * restrict mel) -{ - register int i, j, k, banks, len, zero, s; - register int * restrict left; - register int * restrict right; - register int * restrict bleft; - register int * restrict bright; - - left = (int*)bank->filter_left; - right = (int*)bank->filter_right; - bleft = (int*)bank->bank_left; - bright = (int*)bank->bank_right; - - TMDEBUG_ALIGNMEM(ps); - TMDEBUG_ALIGNMEM(mel); - TMDEBUG_ALIGNMEM(left); - TMDEBUG_ALIGNMEM(right); - TMDEBUG_ALIGNMEM(bleft); - TMDEBUG_ALIGNMEM(bright); - - FILTERBANKCOMPUTEBANK32_START(); - - banks = bank->nb_banks << 2; - zero = 0; - len = bank->len; - s = (1<<((15))>>1); - -#if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) -#pragma TCS_unroll=2 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i> 15; - ps0_lsb = ps0 & 0x00007fff; - left0 = sex16(left10); - right0 = sex16(right10); - - _mel += left0 * ps0_msb + ((left0 * ps0_lsb + s ) >> 15); - mel[il0]= _mel; - _mel = ld32x(mel,ir0); - _mel += right0 * ps0_msb + ((right0 * ps0_lsb + s ) >> 15); - mel[ir0]= _mel; - - ps1 = ld32x(ps,j); - il1 = ld32x(bleft,j); - _mel = ld32x(mel,il1); - ir1 = ld32x(bright,j); - - left1 = asri(16,left10); - right1 = asri(16,right10); - ps1_msb = ps1 >> 15; - ps1_lsb = ps1 & 0x00007fff; - - _mel += left1 * ps1_msb + ((left1 * ps1_lsb + s ) >> 15); - mel[il1]= _mel; - _mel = ld32x(mel,ir1); - _mel += right1 * ps1_msb + ((right1 * ps1_lsb + s ) >> 15); - mel[ir1]= _mel; - } -#if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - FILTERBANKCOMPUTEBANK32_STOP(); -} - -#define OVERRIDE_FILTERBANK_COMPUTE_PSD16 -void filterbank_compute_psd16(FilterBank * restrict bank, spx_word16_t * restrict mel, spx_word16_t * restrict ps) -{ - register int i, j, k, len, s; - register int * restrict left; - register int * restrict right; - register int * restrict bleft; - register int * restrict bright; - - left = (int*)bank->filter_left; - right = (int*)bank->filter_right; - bleft = (int*)bank->bank_left; - bright = (int*)bank->bank_right; - - TMDEBUG_ALIGNMEM(ps); - TMDEBUG_ALIGNMEM(mel); - TMDEBUG_ALIGNMEM(left); - TMDEBUG_ALIGNMEM(right); - TMDEBUG_ALIGNMEM(bleft); - TMDEBUG_ALIGNMEM(bright); - - FILTERBANKCOMPUTEPSD16_START(); - - len = bank->len; - s = (1<<((15))>>1); - -#if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) -#pragma TCS_unroll=2 -#pragma TCS_unrollexact=1 -#endif - for ( i=0,j=0,k=0 ; i>= 15; - - il1 = ld32x(bleft, i+1); - ir1 = ld32x(bright,i+1); - mell1 = mel[il1]; - melr1 = mel[ir1]; - mel1 = pack16lsb(mell1, melr1); - lr1 = pack16msb(left10, right10); - - acc1 += ifir16(mel1, lr1); - acc1 >>= 15; - - ps10 = pack16lsb(acc1, acc0); - - st32d(j, ps, ps10); - } -#if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - FILTERBANKCOMPUTEPSD16_STOP(); -} - -#else - -#define OVERRIDE_FILTERBANK_COMPUTE_BANK32 -void filterbank_compute_bank32(FilterBank * restrict bank, float * restrict ps, float * restrict mel) -{ - register int i, banks, len; - register int * restrict bleft, * restrict bright; - register float * restrict left, * restrict right; - - banks = bank->nb_banks; - len = bank->len; - bleft = bank->bank_left; - bright= bank->bank_right; - left = bank->filter_left; - right = bank->filter_right; - - FILTERBANKCOMPUTEBANK32_START(); - - memset(mel, 0, banks * sizeof(float)); - -#if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEBANK32) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; ilen; - bleft = bank->bank_left; - bright= bank->bank_right; - left = bank->filter_left; - right = bank->filter_right; - - FILTERBANKCOMPUTEPSD16_START(); - -#if (TM_UNROLL && TM_UNROLL_FILTERBANKCOMPUTEPSD16) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i - - -#undef SATURATE -#undef SATURATE16 -#undef SATURATE32 -#define SATURATE(x,a) iclipi(x,a) -#define SATURATE16(x,a) iclipi(x,a) -#define SATURATE32(x,a) iclipi(x,a) - -#undef EXTEND32 -#define EXTEND32(x) sex16(x) - -#undef NEG16 -#undef NEG32 -#define NEG16(x) ineg((int)(x)) -#define NEG32(x) ineg(x) - -#undef ABS -#undef ABS16 -#undef ABS32 -#define ABS(x) iabs(x) -#define ABS32(x) iabs(x) -#define ABS16(x) iabs((int)(x)) - -#undef MIN16 -#undef MIN32 -#define MIN16(a,b) imin((int)(a),(int)(b)) -#define MIN32(a,b) imin(a,b) - -#undef MAX16 -#undef MAX32 -#define MAX16(a,b) imax((int)(a),(int)(b)) -#define MAX32(a,b) imax(a,b) - -#undef ADD16 -#undef SUB16 -#undef ADD32 -#undef SUB32 -#undef MULT16_16 -#undef MULT16_16_16 - -#define ADD16(a,b) ((int)(a) + (int)(b)) -#define SUB16(a,b) ((int)(a) - (int)(b)) -#define ADD32(a,b) ((int)(a) + (int)(b)) -#define SUB32(a,b) ((int)(a) - (int)(b)) -#define MULT16_16_16(a,b) ((int)(a) * (int)(b)) -#define MULT16_16(a,b) ((int)(a) * (int)(b)) - -#if TM_DEBUGMEM_ALIGNNMENT -#include -#define TMDEBUG_ALIGNMEM(x) \ - { if( ((int)(x) & (int)(0x00000003)) != 0 ) \ - { printf("memory not align. file: %s, line: %d\n", __FILE__, __LINE__); \ - } \ - } - -#else -#define TMDEBUG_ALIGNMEM(x) -#endif - -#endif - diff --git a/speex/tmv/kiss_fft_tm.h b/speex/tmv/kiss_fft_tm.h deleted file mode 100644 index 5390bac19..000000000 --- a/speex/tmv/kiss_fft_tm.h +++ /dev/null @@ -1,599 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file kiss_fft_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ - -#include "_kiss_fft_guts_tm.h" - -#ifdef TM_ASM - -#include "profile_tm.h" - -#ifdef FIXED_POINT - -#define OVERRIDE_KFBFLY2 -static void kf_bfly2( - kiss_fft_cpx *Fout, - const int fstride, - const kiss_fft_cfg st, - int m - ) -{ - register int * restrict Fout2; - register int * restrict tw1 = (int*)st->twiddles; - register int i, j; - register int _inv = !st->inverse; - - Fout2 = (int*)Fout + m; - - for ( i=0,j=0 ; iinverse; - - tw3 = tw2 = tw1 = (int*)st->twiddles; - fstride2 = fstride << 1; - fstride3 = fstride * 3; - - Fout1 = (int*)Fout + m; - Fout2 = (int*)Fout + (m << 1); - Fout3 = (int*)Fout + (m * 3); - - - for ( i=0,j=0 ; iinverse; - - tw1 = tw2 = (int*)st->twiddles; - Fout1 = (int*)Fout + m; - Fout2 = (int*)Fout + (m << 1); - epi = tw1[fstride*m]; - epi = pack16lsb(epi,epi); - fstride2 = fstride << 1; - - for ( i=0,j=0 ; iinverse; - - - Fout1=(int*)Fout+m; - Fout2=(int*)Fout+(m<<1); - Fout3=(int*)Fout+(3 *m); - Fout4=(int*)Fout+(m<<2); - - tw1 = tw2 = tw3 = tw4 = (int*)st->twiddles; - - i = tw1[fstride*m]; - yab_lsb = tw1[fstride*(m<<1)]; - yab_msb = pack16msb(i, yab_lsb); - yab_lsb = pack16lsb(i, yab_lsb); - yba_msb = funshift2(-sex16(yab_msb), yab_msb); - yba_lsb = funshift2(yab_lsb, yab_lsb); - - fstride2 = fstride << 1; - fstride3 = fstride * 3; - fstride4 = fstride << 2; - - for ( i=0,j=0 ; iinverse; - register int i, j, k, l; - register int * restrict twiddles = (int*)st->twiddles; - register int Norig = st->nfft; - - CHECKBUF(scratchbuf,nscratchbuf,p); - - for ( i=0; i=Norig ) - { twidx -= Norig; - } - - sc = ld32x(scratchbuf,l); - tw = ld32x(twiddles,twidx); - - TM_MUL(sc, sc, tw); - TM_ADD(f10, f10, sc); - } - st32d(k<<2, Fout, f10); - } - } -} - -#else - -#define OVERRIDE_KFBFLY2 -static void kf_bfly2( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m - ) -{ - register kiss_fft_cpx * restrict Fout2; - register kiss_fft_cpx * restrict tw1 = st->twiddles; - - Fout2 = Fout + m; - - do - { - register kiss_fft_cpx _fout2, _fout, t; - - _fout2 = *Fout2; - _fout = *Fout; - - C_MUL ( t, _fout2, *tw1); - C_SUB (_fout2, _fout, t); - C_ADD (_fout, _fout, t); - - *Fout2 = _fout2; - *Fout = _fout; - - tw1 += fstride; - ++Fout2; - ++Fout; - - } while ( --m ); -} - -#define OVERRIDE_KFBFLY4 -static void kf_bfly4( - kiss_fft_cpx * Fout, - const int fstride, - const kiss_fft_cfg st, - int m - ) -{ - register kiss_fft_cpx * restrict tw1,* restrict tw2,* restrict tw3; - register kiss_fft_cpx * restrict Fout1, * restrict Fout2, * restrict Fout3; - register int _inv = !st->inverse; - - tw3 = tw2 = tw1 = st->twiddles; - - Fout1 = Fout + m; - Fout2 = Fout + (m << 1); - Fout3 = Fout + (m * 3); - - do { - - register kiss_fft_cpx _fout; - register kiss_fft_cpx sc0, sc1, sc2, sc3, sc4, sc5; - - _fout = *Fout; - - C_MUL( sc0,*Fout1, *tw1); - C_MUL( sc1,*Fout2, *tw2); - C_MUL( sc2,*Fout3, *tw3); - C_SUB( sc5, _fout, sc1); - C_ADD( _fout, _fout, sc1); - C_ADD( sc3, sc0, sc2); - C_SUB( sc4, sc0, sc2); - C_SUB(*Fout2, _fout, sc3); - C_ADD( *Fout, _fout, sc3); - - tw1 += fstride; - tw2 += (fstride << 1); - tw3 += (fstride * 3); - - if ( _inv ) - { - Fout1->r = sc5.r + sc4.i; - Fout1->i = sc5.i - sc4.r; - Fout3->r = sc5.r - sc4.i; - Fout3->i = sc5.i + sc4.r; - } - else - { Fout1->r = sc5.r - sc4.i; - Fout1->i = sc5.i + sc4.r; - Fout3->r = sc5.r + sc4.i; - Fout3->i = sc5.i - sc4.r; - } - - - ++Fout; ++Fout1; ++Fout2; ++Fout3; - - } while(--m); -} - -#define OVERRIDE_KFBFLY3 -static void kf_bfly3( - kiss_fft_cpx * Fout, - const int fstride, - const kiss_fft_cfg st, - int m - ) -{ - register kiss_fft_cpx * restrict Fout1, * restrict Fout2; - register kiss_fft_cpx * restrict tw1,* restrict tw2; - register float epi; - - tw1 = tw2 = st->twiddles; - epi = st->twiddles[fstride*m].i; - Fout1 = Fout + m; - Fout2 = Fout + (m << 1); - - do { - - register kiss_fft_cpx _fout; - register kiss_fft_cpx sc0, sc1, sc2, sc3; - - _fout = *Fout; - - C_MUL( sc1, *Fout1, *tw1); - C_MUL( sc2, *Fout2, *tw2); - C_ADD( sc3, sc1, sc2); - C_SUB( sc0, sc1, sc2); - tw1 += fstride; - tw2 += (fstride << 1); - - sc1.r = _fout.r - HALF_OF(sc3.r); - sc1.i = _fout.i - HALF_OF(sc3.i); - - C_MULBYSCALAR(sc0, epi); - C_ADD(*Fout, _fout, sc3); - - Fout2->r = sc1.r + sc0.i; - Fout2->i = sc1.i - sc0.r; - - Fout1->r = sc1.i - sc0.i; - Fout1->i = sc1.r + sc0.r; - - ++Fout; ++Fout1; ++Fout2; - - } while(--m); -} - -#define OVERRIDE_KFBFLY5 -static void kf_bfly5( - kiss_fft_cpx * Fout, - const size_t fstride, - const kiss_fft_cfg st, - int m - ) -{ - register kiss_fft_cpx * restrict Fout1,* restrict Fout2,* restrict Fout3,* restrict Fout4; - register int u; - register kiss_fft_cpx *tw; - register float yar, yai, ybr, ybi; - - Fout1=Fout+m; - Fout2=Fout+(m<<1); - Fout3=Fout+(m*3); - Fout4=Fout+(m<<2); - - tw = st->twiddles; - yar = tw[fstride*m].r; - yai = tw[fstride*m].i; - ybr = tw[fstride*2*m].r; - ybi = tw[fstride*2*m].i; - - for ( u=0; ur = sc0.r + sc7.r + sc8.r; - Fout->i = sc0.i + sc7.i + sc8.i; - - sc5.r = sc0.r + S_MUL(sc7.r,yar) + S_MUL(sc8.r,ybr); - sc5.i = sc0.i + S_MUL(sc7.i,yar) + S_MUL(sc8.i,ybr); - - sc6.r = S_MUL(sc10.i,yai) + S_MUL(sc9.i,ybi); - sc6.i = -S_MUL(sc10.r,yai) - S_MUL(sc9.r,ybi); - - C_SUB(*Fout1,sc5,sc6); - C_ADD(*Fout4,sc5,sc6); - - sc11.r = sc0.r + S_MUL(sc7.r,ybr) + S_MUL(sc8.r,yar); - sc11.i = sc0.i + S_MUL(sc7.i,ybr) + S_MUL(sc8.i,yar); - sc12.r = - S_MUL(sc10.i,ybi) + S_MUL(sc9.i,yai); - sc12.i = S_MUL(sc10.r,ybi) - S_MUL(sc9.r,yai); - C_ADD(*Fout2,sc11,sc12); - C_SUB(*Fout3,sc11,sc12); - - ++Fout1; ++Fout2; ++Fout3; ++Fout4; - } -} - - -#endif - -#endif diff --git a/speex/tmv/kiss_fftr_tm.h b/speex/tmv/kiss_fftr_tm.h deleted file mode 100644 index 8faf10e5d..000000000 --- a/speex/tmv/kiss_fftr_tm.h +++ /dev/null @@ -1,235 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file kiss_fftr_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ -#include "_kiss_fft_guts_tm.h" - -#ifdef TM_ASM - -#include "profile_tm.h" - -#ifdef FIXED_POINT - -#define TM_NDIV(res,c,frac) \ - { register int c1, c0; \ - \ - c1 = -asri(16,(c)); \ - c0 = sex16((c)); \ - (res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\ - } - - -#define OVERRIDE_KISS_FFTR -void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata, kiss_fft_cpx * restrict freqdata) -{ - register int ncfft, ncfft2, k; - register int * restrict tmpbuf; - register int * restrict twiddles; - - ncfft = st->substate->nfft; - ncfft2 = ncfft >> 1; - tmpbuf = (int*)st->tmpbuf; - twiddles = (int*)st->super_twiddles; - - TMDEBUG_ALIGNMEM(timedata); - TMDEBUG_ALIGNMEM(freqdata); - TMDEBUG_ALIGNMEM(tmpbuf); - TMDEBUG_ALIGNMEM(twiddles); - - kiss_fft(st->substate , (const kiss_fft_cpx*)timedata, st->tmpbuf); - - { - register int tdcr, tdci; - tdcr = sround(st->tmpbuf[0].r * (32767/2)); - tdci = sround(st->tmpbuf[0].i * (32767/2)); - - freqdata[0].r = tdcr + tdci; - freqdata[ncfft].r = tdcr - tdci; - freqdata[ncfft].i = freqdata[0].i = 0; - } - - for ( k=1 ; k <= ncfft2 ; ++k ) - { - register int fpk, fpnk, i, tw, f1k, f2k; - register int fq1, fq2; - - i = ncfft-k; - - fpk = ld32x(tmpbuf,k); - tw = ld32x(twiddles,k); - fpnk = ld32x(tmpbuf,i); - - TM_DIV(fpk, fpk, 2); - TM_NDIV(fpnk,fpnk,2); - - TM_ADD( f1k, fpk , fpnk ); - TM_SUB( f2k, fpk , fpnk ); - TM_MUL( tw , f2k, tw ); - TM_ADD( fq1, f1k, tw ); - TM_SHR( fq1, fq1, 1 ); - TM_SUB( fq2, f1k, tw ); - TM_NEGMSB( fq2, fq2 ); - TM_SHR( fq2, fq2, 1 ); - - - st32d( k<<2, freqdata, fq1 ); - st32d( i<<2, freqdata, fq2 ); - } -} - -#define OVERRIDE_KISS_FFTRI -void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata) -{ - register int k, ncfft, ncfft2; - register int * restrict tmpbuf; - register int * restrict twiddles; - - ncfft = st->substate->nfft; - ncfft2 = ncfft >> 1; - tmpbuf = (int*)st->tmpbuf; - twiddles = (int*)st->super_twiddles; - - TMDEBUG_ALIGNMEM(freqdata); - TMDEBUG_ALIGNMEM(timedata); - TMDEBUG_ALIGNMEM(tmpbuf); - TMDEBUG_ALIGNMEM(twiddles); - - { - register int fqr, fqnr; - - fqr = freqdata[0].r; - fqnr = freqdata[ncfft].r; - - st->tmpbuf[0].r = fqr + fqnr; - st->tmpbuf[0].i = fqr - fqnr; - } - - for ( k=1 ; k <= ncfft2 ; ++k ) - { - register int fk, fnkc, i, tw, fek, fok, tmp; - register int tbk, tbn; - - i = ncfft-k; - - fk = ld32x(freqdata,k); - tw = ld32x(twiddles,k); - fnkc = pack16lsb(-freqdata[i].i, freqdata[i].r); - - TM_ADD (fek, fk, fnkc); - TM_SUB (tmp, fk, fnkc); - TM_MUL (fok, tmp, tw ); - TM_ADD (tbk, fek, fok); - TM_SUB (tbn, fek, fok); - TM_NEGMSB(tbn, tbn); - - st32d(k<<2, tmpbuf, tbk); - st32d(i<<2, tmpbuf, tbn); - } - kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); -} - -#else - -#define OVERRIDE_KISS_FFTR -void kiss_fftr(kiss_fftr_cfg st,const kiss_fft_scalar * restrict timedata,kiss_fft_cpx * restrict freqdata) -{ - register kiss_fft_cpx fpnk, fpk, f1k, f2k, twk; - register int k, ncfft; - register kiss_fft_cpx * restrict tmpbuf, * restrict tw; - register float tdcr, tdci; - - ncfft = st->substate->nfft; - tmpbuf= st->tmpbuf; - tw = st->super_twiddles; - - kiss_fft( st->substate , (const kiss_fft_cpx*)timedata, tmpbuf ); - - tdcr = tmpbuf[0].r; - tdci = tmpbuf[0].i; - - freqdata[0].r = tdcr + tdci; - freqdata[ncfft].r = tdcr - tdci; - freqdata[ncfft].i = freqdata[0].i = 0; - - for ( k=1;k <= ncfft/2 ; ++k ) - { - fpk = tmpbuf[k]; - fpnk.r = tmpbuf[ncfft-k].r; - fpnk.i = -tmpbuf[ncfft-k].i; - - C_ADD( f1k, fpk , fpnk ); - C_SUB( f2k, fpk , fpnk ); - C_MUL( twk, f2k , tw[k]); - - freqdata[k].r = HALF_OF(f1k.r + twk.r); - freqdata[k].i = HALF_OF(f1k.i + twk.i); - freqdata[ncfft-k].r = HALF_OF(f1k.r - twk.r); - freqdata[ncfft-k].i = HALF_OF(twk.i - f1k.i); - } -} - -#define OVERRIDE_KISS_FFTRI -void kiss_fftri(kiss_fftr_cfg st,const kiss_fft_cpx * restrict freqdata,kiss_fft_scalar * restrict timedata) -{ - register int k, ncfft; - register kiss_fft_cpx * restrict tmpbuf, * restrict tw; - - - ncfft = st->substate->nfft; - tmpbuf= st->tmpbuf; - tw = st->super_twiddles; - - tmpbuf[0].r = freqdata[0].r + freqdata[ncfft].r; - tmpbuf[0].i = freqdata[0].r - freqdata[ncfft].r; - - for (k = 1; k <= ncfft / 2; ++k) - { - register kiss_fft_cpx fk, fnkc, fek, fok, tmp; - fk = freqdata[k]; - fnkc.r = freqdata[ncfft - k].r; - fnkc.i = -freqdata[ncfft - k].i; - - C_ADD (fek, fk, fnkc); - C_SUB (tmp, fk, fnkc); - C_MUL (fok,tmp,tw[k]); - C_ADD (tmpbuf[k],fek, fok); - C_SUB (tmp, fek, fok); - tmpbuf[ncfft - k].r = tmp.r; - tmpbuf[ncfft - k].i = -tmp.i; - } - kiss_fft (st->substate, st->tmpbuf, (kiss_fft_cpx *) timedata); -} - -#endif -#endif - diff --git a/speex/tmv/mdf_tm.h b/speex/tmv/mdf_tm.h deleted file mode 100644 index e7430be16..000000000 --- a/speex/tmv/mdf_tm.h +++ /dev/null @@ -1,1192 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file mdf_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ -#include -#include "profile_tm.h" - -// shifted power spectrum to fftwrap.c so that optimisation can be shared between mdf.c and preprocess.c -#define OVERRIDE_POWER_SPECTRUM - -#ifdef FIXED_POINT - -#else - -#define OVERRIDE_FILTER_DC_NOTCH16 -void filter_dc_notch16( - const spx_int16_t * restrict in, - float radius, - float * restrict out, - int len, - float * restrict mem -) -{ - register int i; - register float den2, r1; - register float mem0, mem1; - - FILTERDCNOTCH16_START(); - - r1 = 1 - radius; - den2 = (radius * radius) + (0.7 * r1 * r1); - mem0 = mem[0]; - mem1 = mem[1]; - -#if (TM_UNROLL && TM_UNROLL_FILTERDCNOTCH16) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i>= 1; - -#if (TM_UNROLL && TM_UNROLL_MDFINNERPRODUCT) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - while(len--) - { - register float acc0, acc1; - - acc0 = (*x++) * (*y++); - acc1 = (*x++) * (*y++); - - sum += acc0 + acc1; - } -#if (TM_UNROLL && TM_UNROLL_MDFINNERPRODUCT) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - MDFINNERPROD_STOP(); - - return sum; -} - -#define OVERRIDE_SPECTRAL_MUL_ACCUM -void spectral_mul_accum( - const float * restrict X, - const float * restrict Y, - float * restrict acc, - int N, int M -) -{ - register int i, j; - register float Xi, Yi, Xii, Yii; - register int _N; - - SPECTRALMULACCUM_START(); - - acc[0] = X[0] * Y[0]; - _N = N-1; - - for ( i=1 ; i<_N ; i+=2 ) - { - Xi = X[i]; - Yi = Y[i]; - Xii = X[i+1]; - Yii = Y[i+1]; - - acc[i] = (Xi * Yi - Xii * Yii); - acc[i+1]= (Xii * Yi + Xi * Yii); - } - - acc[_N] = X[_N] * Y[_N]; - - for ( j=1,X+=N,Y+=N ; j max_sum, propi, max_sum); - } - - for ( i=0 ; iwindow; - last_y = st->last_y; - y = st->y; - N = st->window_size; - - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOGETRESIDUAL) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;ifft_table, st->y, st->Y); - power_spectrum(st->Y, residual_echo, N); - - leake = st->leak_estimate; - leak2 = fmux(leake > .5, 1, 2 * leake); - N = st->frame_size; - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOGETRESIDUAL) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; ipreemph; - register spx_word16_t memX = st->memX; - register spx_word16_t memD = st->memD; - register spx_word16_t * restrict input = st->input; - register int i; -#ifdef FIXED_POINT - register int saturated = st->saturated; -#endif - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i 32767, M+1, saturated); - tmp32 = iclipi(tmp32,32767); -#endif - - x[i] = EXTRACT16(tmp32); - memX = far_endi; - tmp32 = SUB32(EXTEND32(inputi), EXTEND32(MULT16_16_P15(preemph, memD))); - -#ifdef FIXED_POINT - saturated = mux( ((tmp32 > 32767) && (saturated == 0)), 1, - mux( ((tmp32 <-32767) && (saturated == 0)), 1, saturated )); - tmp32 = iclipi(tmp32,32767); -#endif - memD = inputi; - input[i] = tmp32; - } -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - st->memD = memD; - st->memX = memX; - -#ifdef FIXED_POINT - st->saturated = saturated; -#endif -} - -void mdf_sub( - spx_word16_t * restrict dest, - const spx_word16_t * restrict src1, - const spx_word16_t * restrict src2, - int framesize -) -{ - register int i; - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - -#ifdef FIXED_POINT - for ( i=0,framesize<<=1 ; iPHI; - - for (j=M-1;j>=0;j--) - { - register spx_word32_t * restrict W = &(st->W[j*N]); - - weighted_spectral_mul_conj( - st->power_1, - FLOAT_SHL(PSEUDOFLOAT(st->prop[j]),-15), - &X[(j+1)*N], - st->E, - st->PHI, - N); -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;icancel_count; - register spx_word16_t * restrict wtmp = st->wtmp; -#ifdef FIXED_POINT - register spx_word16_t * restrict wtmp2 = st->wtmp2; - register int i; -#endif - - for ( j=0 ; jW[j*N]); - - if (j==0 || cancel_count%(M-1) == j-1) - { -#ifdef FIXED_POINT - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; ifft_table, wtmp2, wtmp); - memset(wtmp, 0, framesize * sizeof(spx_word16_t)); - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (j=framesize; jfft_table, wtmp, wtmp2); - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;ifft_table, W, wtmp); - memset(&wtmp[framesize], 0, (N-framesize) * sizeof(spx_word16_t)); - spx_fft(st->fft_table, wtmp, W); -#endif - } - } -} - -#ifdef TWO_PATH -// first four parameters is passed by registers -// generate faster performance with 4 parameters functions -spx_word32_t mdf_update_foreground( - SpeexEchoState * restrict st, - spx_word32_t Dbf, - spx_word32_t Sff, - spx_word32_t See -) -{ - register spx_word32_t Davg1 = st->Davg1; - register spx_word32_t Davg2 = st->Davg2; - register spx_word32_t Dvar1 = st->Dvar1; - register spx_word32_t Dvar2 = st->Dvar2; - register spx_word16_t * restrict input = st->input; - register int framesize = st->frame_size; - register spx_word16_t * restrict xx = st->x + framesize; - register spx_word16_t * restrict y = st->y + framesize; - register spx_word16_t * restrict ee = st->e + framesize; - register int update_foreground; - register int i; - register int N = st->window_size; - register int M = st->M; - -#ifdef FIXED_POINT - register spx_word32_t sc0 = SUB32(Sff,See); - register spx_float_t sc1 = FLOAT_MUL32U(Sff,Dbf); - - Davg1 = ADD32(MULT16_32_Q15(QCONST16(.6f,15),Davg1), MULT16_32_Q15(QCONST16(.4f,15),sc0)); - Davg2 = ADD32(MULT16_32_Q15(QCONST16(.85f,15),Davg2), MULT16_32_Q15(QCONST16(.15f,15),sc0)); - Dvar1 = FLOAT_ADD( - FLOAT_MULT(VAR1_SMOOTH,Dvar1), - FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.4f,15),Sff), - MULT16_32_Q15(QCONST16(.4f,15),Dbf))); - Dvar2 = FLOAT_ADD( - FLOAT_MULT(VAR2_SMOOTH,Dvar2), - FLOAT_MUL32U(MULT16_32_Q15(QCONST16(.15f,15),Sff), - MULT16_32_Q15(QCONST16(.15f,15),Dbf))); -#else - register spx_word32_t sc0 = Sff - See; - register spx_word32_t sc1 = Sff * Dbf; - - Davg1 = .6*Davg1 + .4*sc0; - Davg2 = .85*Davg2 + .15*sc0; - Dvar1 = VAR1_SMOOTH*Dvar1 + .16*sc1; - Dvar2 = VAR2_SMOOTH*Dvar2 + .0225*sc1; -#endif - - update_foreground = - mux( FLOAT_GT(FLOAT_MUL32U(sc0, VABS(sc0)), sc1), 1, - mux( FLOAT_GT(FLOAT_MUL32U(Davg1, VABS(Davg1)), FLOAT_MULT(VAR1_UPDATE,(Dvar1))), 1, - mux( FLOAT_GT(FLOAT_MUL32U(Davg2, VABS(Davg2)), FLOAT_MULT(VAR2_UPDATE,(Dvar2))), 1, 0))); - - if ( update_foreground ) - { - register spx_word16_t * restrict windowf = st->window + framesize; - register spx_word16_t * restrict window = st->window; - - st->Davg1 = st->Davg2 = 0; - st->Dvar1 = st->Dvar2 = FLOAT_ZERO; - - memcpy(st->foreground, st->W, N*M*sizeof(spx_word32_t)); - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iW, st->foreground, N*M*sizeof(spx_word32_t)); - memcpy(y, ee, framesize * sizeof(spx_word16_t)); - mdf_sub(xx,input,y,framesize); - See = Sff; - st->Davg1 = st->Davg2 = 0; - st->Dvar1 = st->Dvar2 = FLOAT_ZERO; - } else - { - st->Davg1 = Davg1; - st->Davg2 = Davg2; - st->Dvar1 = Dvar1; - st->Dvar2 = Dvar2; - } - } - - return See; -} -#endif - -void mdf_compute_error_signal( - SpeexEchoState * restrict st, - const spx_int16_t * restrict in, - spx_int16_t * restrict out, - int framesize -) -{ - register spx_word16_t preemph = st->preemph; - register spx_word16_t memE = st->memE; - register int saturated = st->saturated; - register spx_word16_t * restrict e = st->e; - register spx_word16_t * restrict ee = st->e + framesize; - register spx_word16_t * restrict input = st->input; - register spx_word16_t * restrict xx = st->x + framesize; - register int i; - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i 32767, 32767, - fmux( tmp_out < -32768, -32768, tmp_out)); -#endif - - tmp_out = ADD32(tmp_out, EXTEND32(MULT16_16_P15(preemph,memE))); - flg = iabs(ini) >= 32000; - tmp_out = VMUX( flg, 0, tmp_out); - saturated = mux( flg && (saturated == 0), 1, saturated); - - out[i] = (spx_int16_t)tmp_out; - memE = tmp_out; - } -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - st->memE = memE; - st->saturated = saturated; - memset(e, 0, framesize * sizeof(spx_word16_t)); - memcpy(ee, xx, framesize * sizeof(spx_word16_t)); -} - -inline int mdf_check( - SpeexEchoState * restrict st, - spx_int16_t * out, - spx_word32_t Syy, - spx_word32_t Sxx, - spx_word32_t See, - spx_word32_t Sff, - spx_word32_t Sdd -) -{ - register int N = st->window_size; - register spx_word32_t N1e9 = N * 1e9; - register int screwed_up = st->screwed_up; - register int framesize = st->frame_size; - - if (!(Syy>=0 && Sxx>=0 && See >= 0) -#ifndef FIXED_POINT - || !(Sff < N1e9 && Syy < N1e9 && Sxx < N1e9 ) -#endif - ) - { - screwed_up += 50; - memset(out, 0, framesize * sizeof(spx_int16_t)); - - } else - { screwed_up = mux( SHR32(Sff, 2) > ADD32(Sdd, SHR32(MULT16_16(N, 10000),6)), screwed_up+1, 0); - } - - st->screwed_up = screwed_up; - - return screwed_up; -} - -void mdf_smooth( - spx_word32_t * restrict power, - spx_word32_t * restrict Xf, - int framesize, - int M -) -{ - register spx_word16_t ss, ss_1, pf, xff; - register int j; - -#ifdef FIXED_POINT - ss=DIV32_16(11469,M); - ss_1 = SUB16(32767,ss); -#else - ss=.35/M; - ss_1 = 1-ss; -#endif - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( j=0 ; jspec_average; - register spx_word32_t * restrict pRf = st->Rf; - register spx_word32_t * restrict pYf = st->Yf; - register spx_word32_t * restrict pEh = st->Eh; - register spx_word32_t * restrict pYh = st->Yh; - register spx_word16_t beta0 = st->beta0; - register spx_word16_t beta_max = st->beta_max; - register spx_float_t alpha, alpha_1; - register spx_word32_t tmp32, tmpx; - register spx_float_t sPey = st->Pey; - register spx_float_t sPyy = st->Pyy; - register spx_float_t tmp; - register spx_word16_t leak_estimate; - register int j; - register spx_float_t Eh, Yh; - register spx_word32_t _Ehj, _Rfj, _Yfj, _Yhj; - -#ifdef FIXED_POINT - register spx_word16_t spec_average1 = SUB16(32767,spec_average); -#else - register spx_word16_t spec_average1 = 1 - spec_average; -#endif - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (j=framesize; j>0 ; --j) - { - _Ehj = pEh[j]; - _Rfj = pRf[j]; - _Yfj = pYf[j]; - _Yhj = pYh[j]; - - Eh = PSEUDOFLOAT(_Rfj - _Ehj); - Yh = PSEUDOFLOAT(_Yfj - _Yhj); - - Pey = FLOAT_ADD(Pey,FLOAT_MULT(Eh,Yh)); - Pyy = FLOAT_ADD(Pyy,FLOAT_MULT(Yh,Yh)); - - pEh[j] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Ehj), spec_average, _Rfj); - pYh[j] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Yhj), spec_average, _Yfj); - } -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - _Ehj = pEh[0]; - _Rfj = pRf[0]; - _Yfj = pYf[0]; - _Yhj = pYh[0]; - - Eh = PSEUDOFLOAT(_Rfj - _Ehj); - Yh = PSEUDOFLOAT(_Yfj - _Yhj); - - Pey = FLOAT_ADD(Pey,FLOAT_MULT(Eh,Yh)); - Pyy = FLOAT_ADD(Pyy,FLOAT_MULT(Yh,Yh)); - - pEh[0] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Ehj), spec_average, _Rfj); - pYh[0] = MAC16_32_Q15(MULT16_32_Q15(spec_average1, _Yhj), spec_average, _Yfj); - - Pyy = FLOAT_SQRT(Pyy); - Pey = FLOAT_DIVU(Pey,Pyy); - - tmp32 = MULT16_32_Q15(beta0,Syy); - tmpx = MULT16_32_Q15(beta_max,See); - tmp32 = VMUX(tmp32 > tmpx, tmpx, tmp32); - alpha = FLOAT_DIV32(tmp32, See); - alpha_1 = FLOAT_SUB(FLOAT_ONE, alpha); - - sPey = FLOAT_ADD(FLOAT_MULT(alpha_1,sPey) , FLOAT_MULT(alpha,Pey)); - sPyy = FLOAT_ADD(FLOAT_MULT(alpha_1,sPyy) , FLOAT_MULT(alpha,Pyy)); - tmp = FLOAT_MULT(MIN_LEAK,sPyy); - -#ifndef FIXED_POINT - sPyy = VMUX(FLOAT_LT(sPyy, FLOAT_ONE), FLOAT_ONE, sPyy); - sPey = VMUX(FLOAT_LT(sPey, tmp), tmp, sPey); - sPey = VMUX(FLOAT_LT(sPey, sPyy), sPey, sPyy); -#else - sPyy = FLOAT_LT(sPyy, FLOAT_ONE) ? FLOAT_ONE : sPyy; - sPey = FLOAT_LT(sPey, tmp) ? tmp : sPey; - sPey = FLOAT_LT(sPey, sPyy) ? sPey : sPyy; -#endif - - leak_estimate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIVU(sPey, sPyy),14)); - - leak_estimate = VMUX( leak_estimate > 16383, 32767, SHL16(leak_estimate,1)); - st->Pey = sPey; - st->Pyy = sPyy; - st->leak_estimate = leak_estimate; -} - -inline spx_word16_t mdf_compute_RER( - spx_word32_t See, - spx_word32_t Syy, - spx_word32_t Sey, - spx_word32_t Sxx, - spx_word16_t leake -) -{ - register spx_word16_t RER; - -#ifdef FIXED_POINT - register spx_word32_t tmp32; - register spx_word32_t tmp; - spx_float_t bound = PSEUDOFLOAT(Sey); - - tmp32 = MULT16_32_Q15(leake,Syy); - tmp32 = ADD32(SHR32(Sxx,13), ADD32(tmp32, SHL32(tmp32,1))); - - bound = FLOAT_DIVU(FLOAT_MULT(bound, bound), PSEUDOFLOAT(ADD32(1,Syy))); - tmp = FLOAT_EXTRACT32(bound); - tmp32 = imux( FLOAT_GT(bound, PSEUDOFLOAT(See)), See, - imux( tmp32 < tmp, tmp, tmp32)); - - tmp = SHR32(See,1); - tmp32 = imux(tmp32 > tmp, tmp, tmp32); - RER = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32,See),15)); -#else - register spx_word32_t r0; - - r0 = (Sey * Sey)/(1 + See * Syy); - - RER = (.0001*Sxx + 3.* MULT16_32_Q15(leake,Syy)) / See; - RER = fmux( RER < r0, r0, RER); - RER = fmux( RER > .5, .5, RER); -#endif - - return RER; -} - -void mdf_adapt( - SpeexEchoState * restrict st, - spx_word16_t RER, - spx_word32_t Syy, - spx_word32_t See, - spx_word32_t Sxx -) -{ - register spx_float_t * restrict power_1 = st->power_1; - register spx_word32_t * restrict power = st->power; - register int adapted = st->adapted; - register spx_word32_t sum_adapt = st->sum_adapt; - register spx_word16_t leake = st->leak_estimate; - register int framesize = st->frame_size; - register int i; - register int M = st->M; - - adapted = mux( !adapted && sum_adapt > QCONST32(M,15) && - MULT16_32_Q15(leake,Syy) > MULT16_32_Q15(QCONST16(.03f,15),Syy), 1, adapted); - - if ( adapted ) - { register spx_word32_t * restrict Yf = st->Yf; - register spx_word32_t * restrict Rf = st->Rf; - register spx_word32_t r, e, e2; - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i e2, e2, r); -#else - e2 = e * .5; - r = fmux( r > e2, e2, r); -#endif - - r = MULT16_32_Q15(QCONST16(.7,15),r) + - MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e))); - - power_1[i] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,power[i]+10)),WEIGHT_SHIFT+16); - } -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - r = SHL32(Yf[framesize],3); - r = MULT16_32_Q15(leake,r); - e = SHL32(Rf[framesize],3)+1; - -#ifdef FIXED_POINT - e2 = SHR32(e,1); - r = mux( r > e2, e2, r); -#else - e2 = e * .5; - r = fmux( r > e2, e2, r); -#endif - - r = MULT16_32_Q15(QCONST16(.7,15),r) + - MULT16_32_Q15(QCONST16(.3,15),(spx_word32_t)(MULT16_32_Q15(RER,e))); - - power_1[framesize] = FLOAT_SHL(FLOAT_DIV32_FLOAT(r,FLOAT_MUL32U(e,power[framesize]+10)),WEIGHT_SHIFT+16); - - } else - { - register spx_word16_t adapt_rate=0; - register int N = st->window_size; - - if ( Sxx > SHR32(MULT16_16(N, 1000),6) ) - { register spx_word32_t tmp32, tmp32q; - - tmp32 = MULT16_32_Q15(QCONST16(.25f, 15), Sxx); -#ifdef FIXED_POINT - tmp32q = SHR32(See,2); - tmp32 = mux(tmp32 > tmp32q, tmp32q, tmp32); -#else - tmp32q = 0.25 * See; - tmp32 = fmux(tmp32 > tmp32q, tmp32q, tmp32); -#endif - adapt_rate = FLOAT_EXTRACT16(FLOAT_SHL(FLOAT_DIV32(tmp32, See),15)); - } - -#if (TM_UNROLL && TM_UNROLL_SPEEXECHOCANCELLATION) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;isum_adapt = sum_adapt; - st->adapted = adapted; -} - -#define OVERRIDE_ECHO_CANCELLATION -void speex_echo_cancellation( - SpeexEchoState * restrict st, - const spx_int16_t * restrict in, - const spx_int16_t * restrict far_end, - spx_int16_t * restrict out -) -{ - register int framesize = st->frame_size; - register spx_word16_t * restrict x = st->x; - register spx_word16_t * restrict xx = st->x + framesize; - register spx_word16_t * restrict yy = st->y + framesize; - register spx_word16_t * restrict ee = st->e + framesize; - register spx_word32_t Syy, See, Sxx, Sdd, Sff; - register spx_word16_t RER; - register spx_word32_t Sey; - register int j; - register int N,M; -#ifdef TWO_PATH - register spx_word32_t Dbf; -#endif - - N = st->window_size; - M = st->M; - st->cancel_count++; - - filter_dc_notch16(in, st->notch_radius, st->input, framesize, st->notch_mem); - mdf_preemph(st, xx, far_end, framesize); - - { - - register spx_word16_t * restrict X = st->X; - - for ( j=M-1 ; j>=0 ; j-- ) - { register spx_word16_t * restrict Xdes = &(X[(j+1)*N]); - register spx_word16_t * restrict Xsrc = &(X[j*N]); - - memcpy(Xdes, Xsrc, N * sizeof(spx_word16_t)); - } - - spx_fft(st->fft_table, x, X); - memcpy(st->last_y, st->x, N * sizeof(spx_word16_t)); - Sxx = mdf_inner_prod(xx, xx, framesize); - memcpy(x, xx, framesize * sizeof(spx_word16_t)); - -#ifdef TWO_PATH - spectral_mul_accum(st->X, st->foreground, st->Y, N, M); - spx_ifft(st->fft_table, st->Y, st->e); - mdf_sub(xx, st->input, ee, framesize); - Sff = mdf_inner_prod(xx, xx, framesize); -#endif - - mdf_adjust_prop (st->W, N, M, st->prop); - - if (st->saturated == 0) - { mdf_compute_weight_gradient(st, X, N, M); - } else - { st->saturated--; - } - } - - mdf_update_weight(st, N, M, framesize); - spectral_mul_accum(st->X, st->W, st->Y, N, M); - spx_ifft(st->fft_table, st->Y, st->y); - -#ifdef TWO_PATH - mdf_sub(xx, ee, yy, framesize); - Dbf = 10+mdf_inner_prod(xx, xx, framesize); -#endif - - mdf_sub(xx, st->input, yy, framesize); - See = mdf_inner_prod(xx, xx, framesize); - -#ifndef TWO_PATH - Sff = See; -#else - See = mdf_update_foreground(st,Dbf,Sff,See); -#endif - - - mdf_compute_error_signal(st, in, out, framesize); - Sey = mdf_inner_prod(ee, yy, framesize); - Syy = mdf_inner_prod(yy, yy, framesize); - Sdd = mdf_inner_prod(st->input, st->input, framesize); - - if ( mdf_check(st,out,Syy,Sxx,See,Sff,Sdd) >= 50 ) - { speex_warning("The echo canceller started acting funny and got slapped (reset). It swears it will behave now."); - speex_echo_state_reset(st); - return; - } - - See = MAX32(See, SHR32(MULT16_16(N, 100),6)); - spx_fft(st->fft_table, st->e, st->E); - memset(st->y, 0, framesize * sizeof(spx_word16_t)); - spx_fft(st->fft_table, st->y, st->Y); - power_spectrum(st->E, st->Rf, N); - power_spectrum(st->Y, st->Yf, N); - power_spectrum(st->X, st->Xf, N); - - mdf_smooth(st->power,st->Xf,framesize, M); - mdf_compute_filtered_spectra_crosscorrelations(st,Syy,See,framesize); - RER = mdf_compute_RER(See,Syy,Sey,Sxx,st->leak_estimate); - mdf_adapt(st, RER, Syy, See, Sxx); - - if ( st->adapted ) - { register spx_word16_t * restrict last_yy = st->last_y + framesize; - - memcpy(st->last_y, last_yy, framesize * sizeof(spx_word16_t)); - mdf_sub_int(last_yy, in, out, framesize); - - } -} - - - diff --git a/speex/tmv/misc_tm.h b/speex/tmv/misc_tm.h deleted file mode 100644 index 181ea8073..000000000 --- a/speex/tmv/misc_tm.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file misc_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ -#include - - -#if TM_PROFILE -int __profile_begin; -int __profile_end; -#endif - -#define OVERRIDE_SPEEX_ALLOC -void *speex_alloc (int size) -{ - void *ptr; - - if ( tmmlMalloc(0, size, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) - { return NULL; - } - - return ptr; -} - - -#define OVERRIDE_SPEEX_ALLOC_SCRATCH -void *speex_alloc_scratch (int size) -{ - void *ptr; - - if ( tmmlMalloc(0, size, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) - { return NULL; - } - - return ptr; -} - - -#define OVERRIDE_SPEEX_REALLOC -void *speex_realloc (void *ptr, int size) -{ - if ( tmmlRealloc(0, size, (pVoid)ptr, (pVoid*)&ptr, tmmlMallocCacheAligned | tmmlMallocCleared) != TM_OK ) - { return NULL; - } - - return ptr; -} - - -#define OVERRIDE_SPEEX_FREE -void speex_free (void *ptr) -{ - tmmlFree(ptr); -} - - -#define OVERRIDE_SPEEX_FREE_SCRATCH -void speex_free_scratch (void *ptr) -{ - tmmlFree(ptr); -} - diff --git a/speex/tmv/preprocess_tm.h b/speex/tmv/preprocess_tm.h deleted file mode 100644 index acbf2cffa..000000000 --- a/speex/tmv/preprocess_tm.h +++ /dev/null @@ -1,1135 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file preprocess_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ -#include -#include "profile_tm.h" - -#ifdef FIXED_POINT -#define OVERRIDE_PREPROCESS_ANALYSIS -static void preprocess_analysis(SpeexPreprocessState * restrict st, spx_int16_t * restrict x) -{ - register int i, j, framesize = st->frame_size; - register int N = st->ps_size; - register int N3 = 2*N - framesize; - register int N4 = framesize - N3; - register int * restrict ps = st->ps; - register int * restrict frame; - register int * restrict inbuf; - register int * restrict ptr; - register int max_val; - - frame = (int*)(st->frame); - inbuf = (int*)(st->inbuf); - ptr = (int*)(st->frame+N3); - - TMDEBUG_ALIGNMEM(x); - TMDEBUG_ALIGNMEM(frame); - TMDEBUG_ALIGNMEM(inbuf); - - PREPROCESSANAYLSIS_START(); - - N3 >>= 1; - framesize >>= 1; - max_val = 0; - - for ( i=0,j=0 ; iwindow ; i> 15; - r1 = (asri(16,f10) * asri(16,w10)) >> 15; - - max_val = imax(iabs(sex16(r0)), max_val); - max_val = imax(iabs(sex16(r1)), max_val); - - r0 = pack16lsb(r1, r0); - st32d(j, frame, r0); - } -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - max_val = 14 - spx_ilog2(max_val); - st->frame_shift = max_val; - - if ( max_val != 0 ) - { -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0,j=0 ; ifft_lookup, st->frame, st->ft); - power_spectrum(st->ft, ps, N << 1); - -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0,ptr=(int*)st->ps,max_val<<=1,j=((1<<((max_val))>>1)) ;i> max_val; - } -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - filterbank_compute_bank32(st->bank, ps, ps+N); - - PREPROCESSANAYLSIS_STOP(); -} - -#define _MULT16_32_Q15(a,b,c) ADD32(MULT16_16((a),(b)), SHR(MULT16_16((a),(c)),15)) - -#define OVERRIDE_UPDATE_NOISE_PROB -static void update_noise_prob(SpeexPreprocessState * restrict st) -{ - register int i; - register int min_range, nb_adapt; - register int N = st->ps_size; - register int * restrict Smin = (int*)st->Smin; - register int * restrict Stmp = (int*)st->Stmp; - register int * restrict S = (int*)st->S; - - UPDATENOISEPROB_START(); - - { - register int psi_lsb, psi_msb, ips_lsb, ips_msb, psii_lsb, psii_msb; - register int psiii_lsb, psiii_msb; - register int q8, q05, q2, q1; - register int *ps = (int*)st->ps; - register int si_lsb, si_msb, sii_lsb, sii_msb; - - q8 = QCONST16(.8f,15); - q05 = QCONST16(.05f,15); - q2 = QCONST16(.2f,15); - q1 = QCONST16(.1f,15); - - ips_lsb = ps[0]; - psi_lsb = ps[1]; - si_lsb = S[0]; - ips_msb = ips_lsb >> 15; - psi_msb = psi_lsb >> 15; - si_msb = si_lsb >> 15; - - ips_lsb &= 0x00007fff; - psi_lsb &= 0x00007fff; - si_lsb &= 0x00007fff; - - S[0] = _MULT16_32_Q15(q8,si_msb,si_lsb) + _MULT16_32_Q15(q2,ips_msb,ips_lsb); - - for ( i=1 ; i> 15; - si_msb = si_lsb >> 15; - si_lsb &= 0x00007fff; - psii_lsb &= 0x00007fff; - - S[i]= _MULT16_32_Q15(q8,si_msb,si_lsb) + - _MULT16_32_Q15(q05,ips_msb,ips_lsb) + - _MULT16_32_Q15(q1,psi_msb,psi_lsb) + - _MULT16_32_Q15(q05,psii_msb,psii_lsb); - - psiii_lsb = ps[i+2]; - sii_lsb = S[i+1]; - - sii_msb = sii_lsb >> 15; - psiii_msb= psiii_lsb >> 15; - sii_lsb &= 0x00007fff; - psiii_lsb&= 0x00007fff; - - S[i+1]= _MULT16_32_Q15(q8,sii_msb,sii_lsb) + - _MULT16_32_Q15(q05,psi_msb,psi_lsb) + - _MULT16_32_Q15(q1,psii_msb,psii_lsb) + - _MULT16_32_Q15(q05,psiii_msb,psiii_lsb); - - ips_lsb = psii_lsb; - ips_msb = psii_msb; - psi_lsb = psiii_lsb; - psi_msb = psiii_msb; - } - - S[N-1] = MULT16_32_Q15(q8,S[N-1]) + MULT16_32_Q15(q2,ps[N-1]); - } - - nb_adapt = st->nb_adapt; - - if ( nb_adapt==1 ) - { for ( i=0 ; imin_count > min_range ) - { - st->min_count = 0; - -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unroll=2 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iupdate_prob; - - q4 = QCONST16(.4f,15); - -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i ADD32(smini,20), 1, 0); - } -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - } - - UPDATENOISEPROB_STOP(); -} - -#else - -#define OVERRIDE_PREPROCESS_ANALYSIS -static void preprocess_analysis(SpeexPreprocessState * restrict st, spx_int16_t * restrict x) -{ - register int i; - register int framesize = st->frame_size; - register int N = st->ps_size; - register int N3 = 2*N - framesize; - register int N4 = framesize - N3; - register float * restrict ps = st->ps; - register float * restrict frame = st->frame; - register float * restrict inbuf = st->inbuf; - - PREPROCESSANAYLSIS_START(); - -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iwindow; - -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i<2*N ; ++i ) - { - frame[i] = frame[i] * inbuf[i]; - } -#if (TM_UNROLL && TM_UNROLL_PREPROCESSANALYSIS) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - spx_fft(st->fft_lookup, frame, st->ft); - power_spectrum(st->ft, ps, N << 1); - filterbank_compute_bank32(st->bank, ps, ps+N); - - PREPROCESSANAYLSIS_STOP(); -} - - -#define OVERRIDE_UPDATE_NOISE_PROB -static void update_noise_prob(SpeexPreprocessState * restrict st) -{ - - register float * restrict S = st->S; - register float * restrict ps = st->ps; - register int N = st->ps_size; - register int min_range; - register int i; - register int nb_adapt; - register float * restrict Smin = st->Smin; - register float * restrict Stmp = st->Stmp; - - UPDATENOISEPROB_START(); - - { - register float ips, psi; - - ips = ps[0]; - psi = ps[1]; - - S[0] = .8f * S[0] + .2f * ips; - - for ( i=1 ; inb_adapt; - - if ( nb_adapt==1 ) - { - for (i=0;iStmp[i] = 0; - } - - min_range = mux(nb_adapt < 100, 15, - mux(nb_adapt < 1000, 50, - mux(nb_adapt < 10000, 150, 300))); - - - if ( st->min_count > min_range ) - { - st->min_count = 0; -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iSmin; - -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iupdate_prob; - -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;i (smini + 20.f), 1, 0); - - } -#if (TM_UNROLL && TM_UNROLL_UPDATENOISEPROB) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - } - - UPDATENOISEPROB_STOP(); -} - - -#define OVERRIDE_COMPUTE_GAIN_FLOOR -static void compute_gain_floor( - int noise_suppress, - int effective_echo_suppress, - float * restrict noise, - float * restrict echo, - float * gain_floor, - int len -) -{ - register int i; - register float echo_floor; - register float noise_floor; - - COMPUTEGAINFLOOR_START(); - - noise_floor = exp(.2302585f*noise_suppress); - echo_floor = exp(.2302585f*effective_echo_suppress); - -#if (TM_UNROLL && TM_UNROLL_COMPUTEGAINFLOOR) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;iecho_state) - { - register spx_word32_t * restrict r_echo = st->residual_echo; - register spx_word32_t * restrict e_noise = st->echo_noise; - register int i; - -#ifndef FIXED_POINT - register spx_word32_t r; -#endif - - speex_echo_get_residual(st->echo_state, r_echo, N); - -#ifndef FIXED_POINT - r = r_echo[0]; - if (!(r >=0 && r < N*1e9f) ) - { - memset(r_echo, 0, N * sizeof(spx_word32_t)); - } -#endif - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;ibank, e_noise, e_noise+N); - - } else - { memset(st->echo_noise, 0, (NM) * sizeof(spx_word32_t)); - } -} - -void preprocess_update_noise( - SpeexPreprocessState * restrict st, - spx_word32_t * restrict ps, - int N -) -{ - register spx_word16_t beta, beta_1; - register int * restrict up = st->update_prob; - register spx_word32_t * restrict noise = st->noise; - register int i; - - beta = MAX16(QCONST16(.03,15),DIV32_16(Q15_ONE,st->nb_adapt)); - beta_1 = Q15_ONE-beta; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;ibank, noise, noise+N); -} - -void preprocess_compute_SNR( - SpeexPreprocessState * restrict st, - spx_word32_t * restrict ps, - int NM -) -{ - register spx_word32_t * restrict noise = st->noise; - register spx_word32_t * restrict echo = st->echo_noise; - register spx_word32_t * restrict reverb = st->reverb_estimate; - register spx_word16_t * restrict post = st->post; - register spx_word32_t * restrict old_ps = st->old_ps; - register spx_word16_t * restrict prior = st->prior; - register int i; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; izeta; - register spx_word16_t * restrict prior = st->prior; - register spx_word32_t Zframe; - register spx_word16_t iprior, priori; - register int _N = N-1; - register int i; - - iprior = prior[0]; - priori = prior[1]; - zeta[0] = PSHR32(ADD32(MULT16_16(QCONST16(.7f,15),zeta[0]), MULT16_16(QCONST16(.3f,15),iprior)),15); - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=2 -#pragma TCS_unrollexact=1 -#endif - for ( i=1 ; i<_N ; i++) - { register spx_word16_t zetai = zeta[i]; - register spx_word16_t priorii = prior[i+1]; - - zeta[i] = PSHR32(ADD32(ADD32(ADD32(MULT16_16(QCONST16(.7f,15),zetai), MULT16_16(QCONST16(.15f,15),priori)), - MULT16_16(QCONST16(.075f,15),iprior)), MULT16_16(QCONST16(.075f,15),priorii)),15); - - iprior = priori; - priori = priorii; - } -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - for (i=_N; izeta; - register spx_word16_t * restrict prior = st->prior; - register spx_word16_t * restrict gain = st->gain; - register spx_word32_t * restrict old_ps = st->old_ps; - register spx_word16_t * restrict post = st->post; - register spx_word16_t * restrict gain2 = st->gain2; - register int i; - register int N=st->ps_size; - - for ( i=N ; ibank,gain2+N, gain2); - filterbank_compute_psd16(st->bank,gain+N, gain); -} - -void preprocess_compute_linear_gain( - SpeexPreprocessState * restrict st, - spx_word32_t * restrict ps, - int N -) -{ - register spx_word16_t * restrict gain_floor = st->gain_floor; - register spx_word16_t * restrict prior = st->prior; - register spx_word16_t * restrict gain = st->gain; - register spx_word32_t * restrict old_ps = st->old_ps; - register spx_word16_t * restrict post = st->post; - register spx_word16_t * restrict gain2 = st->gain2; - register int i; - - filterbank_compute_psd16(st->bank,gain_floor+N,gain_floor); - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;iprior[i]), 15), ADD16(prior[i], SHL32(1,SNR_SHIFT))); - theta = MULT16_32_P15(prior_ratio, QCONST32(1.f,EXPIN_SHIFT)+SHL32(EXTEND32(post[i]),EXPIN_SHIFT-SNR_SHIFT)); - MM = hypergeom_gain(theta); - - g = EXTRACT16(MIN32(Q15_ONE, MULT16_32_Q15(prior_ratio, MM))); - p = gain2[i]; - - g = VMUX( MULT16_16_Q15(QCONST16(.333f,15),g) > gain[i], MULT16_16(3,gain[i]), g); - - old_ps[i]= MULT16_32_P15(QCONST16(.2f,15),old_ps[i]) + - MULT16_32_P15(MULT16_16_P15(QCONST16(.8f,15),SQR16_Q15(g)),ps[i]); - - g = VMUX( g < gfi, gfi, g ); - gain[i] = g; - - tmp = MULT16_16_P15(p,spx_sqrt(SHL32(EXTEND32(g),15))) + - MULT16_16_P15(SUB16(Q15_ONE,p),spx_sqrt(SHL32(EXTEND32(gfi),15))); - - gain2[i]=SQR16_Q15(tmp); - - /* Use this if you want a log-domain MMSE estimator instead */ - /* gain2[i] = pow(g, p) * pow(gfi,1.f-p);*/ - } -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif -} - - -#if 0 -void preprocess_compute_bark_gain( - SpeexPreprocessState * restrict st, - int N, - int NM -) -{ - register spx_word16_t * restrict gain_floor = st->gain_floor; - register spx_word16_t * restrict gain = st->gain; - register spx_word16_t * restrict gain2 = st->gain2; - register int i; - - for (i=N;ibank,gain2+N, gain2); -} -#endif - -void preprocess_apply_gain( - SpeexPreprocessState * restrict st, - int N -) -{ - register spx_word16_t * restrict ft = st->ft; - register spx_word16_t * restrict gain2 = st->gain2; - register int j, i; - - ft[0] = MULT16_16_P15(gain2[0],ft[0]); - - for (i=1,j=1; iframe; - register int shift = st->frame_shift; - register int i; - register int N2 = N << 1; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iframe; - register int i; - register int N2 = N << 1; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for (i=0;i max_sample, framei, max_sample); - } -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - - if ( max_sample > 28000.f ) - { - float damp = 28000.f/max_sample; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; i< N2 ; i++ ) - { frame[i] *= damp; - } -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unrollexact=0 -#pragma TCS_unroll=0 -#endif - } -} -#endif - - -void preprocess_update( - SpeexPreprocessState * restrict st, - spx_int16_t * restrict x, - int N -) -{ - register spx_word16_t * restrict frame = st->frame; - register spx_word16_t * restrict window = st->window; - register spx_word16_t * restrict outbuf = st->outbuf; - register int framesize = st->frame_size; - register int N2 = N << 1; - register int N3 = N2 - framesize; - register int N4 = (framesize) - N3; - register int i; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; ips; - register spx_word32_t Zframe; - register spx_word16_t Pframe; - - st->nb_adapt++; - st->min_count++; - N = st->ps_size; - M = st->nbands; - NM = N + M; - - preprocess_residue_echo(st, N, NM); - preprocess_analysis(st, x); - update_noise_prob(st); - preprocess_update_noise(st, ps, N); - - if ( st->nb_adapt == 1 ) - { memcpy(st->old_ps, ps, (NM) * sizeof(spx_word32_t)); - } - - preprocess_compute_SNR(st, ps, NM); - Zframe = preprocess_smooth_SNR(st, N, NM); - - - { - register spx_word16_t effective_echo_suppress; - - Pframe = QCONST16(.1f,15)+MULT16_16_Q15(QCONST16(.899f,15),qcurve(DIV32_16(Zframe,M))); - effective_echo_suppress = EXTRACT16(PSHR32(ADD32(MULT16_16(SUB16(Q15_ONE,Pframe), st->echo_suppress), - MULT16_16(Pframe, st->echo_suppress_active)),15)); - compute_gain_floor(st->noise_suppress, effective_echo_suppress, st->noise+N, st->echo_noise+N, st->gain_floor+N, M); - - } - - preprocess_compute_emgain(st, ps, Pframe, NM); - preprocess_compute_linear_gain(st, ps, N); - - - if (!st->denoise_enabled) - { - register spx_word16_t * restrict gain2 = st->gain2; - -#if (TM_UNROLL && TM_UNROLL_SPEEXPREPROCESSRUN) -#pragma TCS_unroll=4 -#pragma TCS_unrollexact=1 -#endif - for ( i=0 ; iagc_enabled) - { speex_compute_agc(st, Pframe, st->ft); - } -#endif - - - spx_ifft(st->fft_lookup, st->ft, st->frame); - -#ifdef FIXED_POINT - preprocess_scale(st, N); -#endif - -#ifndef FIXED_POINT - if ( st->agc_enabled ) - { preprocess_apply_agc(st, N); - } -#endif - - preprocess_update(st, x, N); - - if ( st->vad_enabled ) - { - if (Pframe > st->speech_prob_start || (st->was_speech && Pframe > st->speech_prob_continue)) - { st->was_speech=1; - return 1; - - } else - { st->was_speech=0; - return 0; - } - } else - { return 1; - } -} diff --git a/speex/tmv/profile_tm.h b/speex/tmv/profile_tm.h deleted file mode 100644 index f93ab6e6c..000000000 --- a/speex/tmv/profile_tm.h +++ /dev/null @@ -1,407 +0,0 @@ -/* Copyright (C) 2007 Hong Zhiqian */ -/** - @file profile_tm.h - @author Hong Zhiqian - @brief Various compatibility routines for Speex (TriMedia version) -*/ -/* - 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. -*/ -/** -* @remarks This file provide some capabilities to measure clock cycles. -* Use this if unable to compile with TriMedia profile options -*/ - -extern int __profile_begin; -extern int __profile_end; - -#if TM_PROFILE -#define PROFILE_START() \ - { \ - __profile_begin = cycles(); \ - } \ - -#define PROFILE_STOP() \ - { \ - __profile_end = cycles(); \ - printf("%s\t%d\n", __FUNCTION__, end - begin); \ - } \ - -#else -#define PROFILE_START() -#define PROFILE_STOP() -#endif - -#if TM_PROFILE_SPXAUTOCORR -#define _SPX_AUTOCORR_START() PROFILE_START() -#define _SPX_AUTOCORR_STOP() PROFILE_STOP() -#else -#define _SPX_AUTOCORR_START() -#define _SPX_AUTOCORR_STOP() -#endif - -#if TM_PROFILE_INNERPROD -#define INNERPROD_START() PROFILE_START() -#define INNERPROD_STOP() PROFILE_STOP() -#else -#define INNERPROD_START() -#define INNERPROD_STOP() -#endif - -#if TM_PROFILE_PITCHXCORR -#define PITCHXCORR_START() PROFILE_START() -#define PITCHXCORR_STOP() PROFILE_STOP() -#else -#define PITCHXCORR_START() -#define PITCHXCORR_STOP() -#endif - -#if TM_PROFILE_COMPUTEPITCHERROR -#define COMPUTEPITCHERROR_START() PROFILE_START() -#define COMPUTEPITCHERROR_STOP() PROFILE_STOP() -#else -#define COMPUTEPITCHERROR_START() -#define COMPUTEPITCHERROR_STOP() -#endif - -#if TM_PROFILE_PITCHGAINSEARCH3TAPVQ -#define PITCHGAINSEARCH3TAPVQ_START() PROFILE_START() -#define PITCHGAINSEARCH3TAPVQ_STOP() PROFILE_STOP() -#else -#define PITCHGAINSEARCH3TAPVQ_START() -#define PITCHGAINSEARCH3TAPVQ_STOP() -#endif - -#if TM_PROFILE_OPENLOOPNBESTPITCH -#define OPENLOOPNBESTPITCH_START() PROFILE_START() -#define OPENLOOPNBESTPITCH_STOP() PROFILE_STOP() -#else -#define OPENLOOPNBESTPITCH_START() -#define OPENLOOPNBESTPITCH_STOP() -#endif - - -#if TM_PROFILE_LSP_INTERPOLATE -#define LSPINTERPOLATE_START() PROFILE_START() -#define LSPINTERPOLATE_STOP() PROFILE_STOP() -#else -#define LSPINTERPOLATE_START() -#define LSPINTERPOLATE_STOP() -#endif - -#if TM_PROFILE_CHEBPOLYEVA -#define CHEBPOLYEVA_START() PROFILE_START() -#define CHEBPOLYEVA_STOP() PROFILE_STOP() -#else -#define CHEBPOLYEVA_START() -#define CHEBPOLYEVA_STOP() -#endif - - -#if TM_PROFILE_COMPUTEQUANTWEIGHTS -#define COMPUTEQUANTWEIGHTS_START() PROFILE_START() -#define COMPUTEQUANTWEIGHTS_STOP() PROFILE_STOP() -#else -#define COMPUTEQUANTWEIGHTS_START() -#define COMPUTEQUANTWEIGHTS_STOP() -#endif - -#if TM_PROFILE_LSPQUANT -#define LSPQUANT_START() PROFILE_START() -#define LSPQUANT_STOP() PROFILE_STOP() -#else -#define LSPQUANT_START() -#define LSPQUANT_STOP() -#endif - -#if TM_PROFILE_LSPWEIGHTQUANT -#define LSPWEIGHTQUANT_START() PROFILE_START() -#define LSPWEIGHTQUANT_STOP() PROFILE_STOP() -#else -#define LSPWEIGHTQUANT_START() -#define LSPWEIGHTQUANT_STOP() -#endif - -#if TM_PROFILE_FIRMEM16 -#define FIRMEM16_START() PROFILE_START() -#define FIRMEM16_STOP() PROFILE_STOP() -#else -#define FIRMEM16_START() -#define FIRMEM16_STOP() -#endif - -#if TM_PROFILE_IIRMEM16 -#define IIRMEM16_START() PROFILE_START() -#define IIRMEM16_STOP() PROFILE_STOP() -#else -#define IIRMEM16_START() -#define IIRMEM16_STOP() -#endif - -#if TM_PROFILE_FILTERMEM16 -#define FILTERMEM16_START() PROFILE_START() -#define FILTERMEM16_STOP() PROFILE_STOP() -#else -#define FILTERMEM16_START() -#define FILTERMEM16_STOP() -#endif - -#if TM_PROFILE_COMPUTERMS16 -#define COMPUTERMS16_START() PROFILE_START() -#define COMPUTERMS16_STOP() PROFILE_STOP() -#else -#define COMPUTERMS16_START() -#define COMPUTERMS16_STOP() -#endif - -#if TM_PROFILE_NORMALIZE16 -#define NORMALIZE16_START() PROFILE_START() -#define NORMALIZE16_STOP() PROFILE_STOP() -#else -#define NORMALIZE16_START() -#define NORMALIZE16_STOP() -#endif - -#if TM_PROFILE_BWLPC -#define BWLPC_START() PROFILE_START() -#define BWLPC_STOP() PROFILE_STOP() -#else -#define BWLPC_START() -#define BWLPC_STOP() -#endif - -#if TM_PROFILE_HIGHPASS -#define HIGHPASS_START() PROFILE_START() -#define HIGHPASS_STOP() PROFILE_STOP() -#else -#define HIGHPASS_START() -#define HIGHPASS_STOP() -#endif - -#if TM_PROFILE_SIGNALMUL -#define SIGNALMUL_START() PROFILE_START() -#define SIGNALMUL_STOP() PROFILE_STOP() -#else -#define SIGNALMUL_START() -#define SIGNALMUL_STOP() -#endif - -#if TM_PROFILE_SIGNALDIV -#define SIGNALDIV_START() PROFILE_START() -#define SIGNALDIV_STOP() PROFILE_STOP() -#else -#define SIGNALDIV_START() -#define SIGNALDIV_STOP() -#endif - -#if TM_PROFILE_COMPUTEIMPULSERESPONSE -#define COMPUTEIMPULSERESPONSE_START() PROFILE_START() -#define COMPUTEIMPULSERESPONSE_STOP() PROFILE_STOP() -#else -#define COMPUTEIMPULSERESPONSE_START() -#define COMPUTEIMPULSERESPONSE_STOP() -#endif - -#if TM_PROFILE_COMPUTEWEIGHTEDCODEBOOK -#define COMPUTEWEIGHTEDCODEBOOK_START() PROFILE_START() -#define COMPUTEWEIGHTEDCODEBOOK_STOP() PROFILE_STOP() -#else -#define COMPUTEWEIGHTEDCODEBOOK_START() -#define COMPUTEWEIGHTEDCODEBOOK_STOP() -#endif - -#if TM_PROFILE_TARGETUPDATE -#define TARGETUPDATE_START() PROFILE_START() -#define TARGETUPDATE_STOP() PROFILE_STOP() -#else -#define TARGETUPDATE_START() -#define TARGETUPDATE_STOP() -#endif - - -#if TM_PROFILE_VQNBEST -#define VQNBEST_START() PROFILE_START() -#define VQNBEST_STOP() PROFILE_STOP() -#else -#define VQNBEST_START() -#define VQNBEST_STOP() -#endif - -#if TM_PROFILE_VQNBESTSIGN -#define VQNBESTSIGN_START() PROFILE_START() -#define VQNBESTSIGN_STOP() PROFILE_STOP() -#else -#define VQNBESTSIGN_START() -#define VQNBESTSIGN_STOP() -#endif - -#if TM_PROFILE_PREPROCESSANALYSIS -#define PREPROCESSANAYLSIS_START() PROFILE_START() -#define PREPROCESSANAYLSIS_STOP() PROFILE_STOP() -#else -#define PREPROCESSANAYLSIS_START() -#define PREPROCESSANAYLSIS_STOP() -#endif - -#if TM_PROFILE_UPDATENOISEPROB -#define UPDATENOISEPROB_START() PROFILE_START() -#define UPDATENOISEPROB_STOP() PROFILE_STOP() -#else -#define UPDATENOISEPROB_START() -#define UPDATENOISEPROB_STOP() -#endif - -#if TM_PROFILE_COMPUTEGAINFLOOR -#define COMPUTEGAINFLOOR_START() PROFILE_START() -#define COMPUTEGAINFLOOR_STOP() PROFILE_STOP() -#else -#define COMPUTEGAINFLOOR_START() -#define COMPUTEGAINFLOOR_STOP() -#endif - -#if TM_PROFILE_FILTERDCNOTCH16 -#define FILTERDCNOTCH16_START() PROFILE_START() -#define FILTERDCNOTCH16_STOP() PROFILE_STOP() -#else -#define FILTERDCNOTCH16_START() -#define FILTERDCNOTCH16_STOP() -#endif - -#if TM_PROFILE_MDFINNERPROD -#define MDFINNERPROD_START() PROFILE_START() -#define MDFINNERPROD_STOP() PROFILE_STOP() -#else -#define MDFINNERPROD_START() -#define MDFINNERPROD_STOP() -#endif - -#if TM_PROFILE_SPECTRALMULACCUM -#define SPECTRALMULACCUM_START() PROFILE_START() -#define SPECTRALMULACCUM_STOP() PROFILE_STOP() -#else -#define SPECTRALMULACCUM_START() -#define SPECTRALMULACCUM_STOP() -#endif - -#if TM_PROFILE_WEIGHTEDSPECTRALMULCONJ -#define WEIGHTEDSPECTRALMULCONJ_START() PROFILE_START() -#define WEIGHTEDSPECTRALMULCONJ_STOP() PROFILE_STOP() -#else -#define WEIGHTEDSPECTRALMULCONJ_START() -#define WEIGHTEDSPECTRALMULCONJ_STOP() -#endif - -#if TM_PROFILE_MDFADJUSTPROP -#define MDFADJUSTPROP_START() PROFILE_START() -#define MDFADJUSTPROP_STOP() PROFILE_STOP() -#else -#define MDFADJUSTPROP_START() -#define MDFADJUSTPROP_STOP() -#endif - -#if TM_PROFILE_SPEEXECHOGETRESIDUAL -#define SPEEXECHOGETRESIDUAL_START() PROFILE_START() -#define SPEEXECHOGETRESIDUAL_STOP() PROFILE_STOP() -#else -#define SPEEXECHOGETRESIDUAL_START() -#define SPEEXECHOGETRESIDUAL_STOP() -#endif - -#if TM_PROFILE_LSPENFORCEMARGIN -#define LSPENFORCEMARGIN_START() PROFILE_START() -#define LSPENFORCEMARGIN_STOP() PROFILE_STOP() -#else -#define LSPENFORCEMARGIN_START() -#define LSPENFORCEMARGIN_STOP() -#endif - -#if TM_PROFILE_LSPTOLPC -#define LSPTOLPC_START() PROFILE_START() -#define LSPTOLPC_STOP() PROFILE_STOP() -#else -#define LSPTOLPC_START() -#define LSPTOLPC_STOP() -#endif - -#if TM_PROFILE_MAXIMIZERANGE -#define MAXIMIZERANGE_START() PROFILE_START() -#define MAXIMIZERANGE_STOP() PROFILE_STOP() -#else -#define MAXIMIZERANGE_START() -#define MAXIMIZERANGE_STOP() -#endif - -#if TM_PROFILE_RENORMRANGE -#define RENORMRANGE_START() PROFILE_START() -#define RENORMRANGE_STOP() PROFILE_STOP() -#else -#define RENORMRANGE_START() -#define RENORMRANGE_STOP() -#endif - -#if TM_PROFILE_POWERSPECTRUM -#define POWERSPECTRUM_START() PROFILE_START() -#define POWERSPECTRUM_STOP() PROFILE_STOP() -#else -#define POWERSPECTRUM_START() -#define POWERSPECTRUM_STOP() -#endif - -#if TM_PROFILE_QMFSYNTH -#define QMFSYNTH_START() PROFILE_START() -#define QMFSYNTH_STOP() PROFILE_STOP() -#else -#define QMFSYNTH_START() -#define QMFSYNTH_STOP() -#endif - -#if TM_PROFILE_QMFDECOMP -#define QMFDECOMP_START() PROFILE_START() -#define QMFDECOMP_STOP() PROFILE_STOP() -#else -#define QMFDECOMP_START() -#define QMFDECOMP_STOP() -#endif - -#if TM_PROFILE_FILTERBANKCOMPUTEBANK32 -#define FILTERBANKCOMPUTEBANK32_START() PROFILE_START() -#define FILTERBANKCOMPUTEBANK32_STOP() PROFILE_STOP() -#else -#define FILTERBANKCOMPUTEBANK32_START() -#define FILTERBANKCOMPUTEBANK32_STOP() -#endif - -#if TM_PROFILE_FILTERBANKCOMPUTEPSD16 -#define FILTERBANKCOMPUTEPSD16_START() PROFILE_START() -#define FILTERBANKCOMPUTEPSD16_STOP() PROFILE_STOP() -#else -#define FILTERBANKCOMPUTEPSD16_START() -#define FILTERBANKCOMPUTEPSD16_STOP() -#endif - - diff --git a/speex/tmv/speex_config_types.h b/speex/tmv/speex_config_types.h deleted file mode 100644 index 3166f6c14..000000000 --- a/speex/tmv/speex_config_types.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __SPEEX_TYPES_H__ -#define __SPEEX_TYPES_H__ - -#ifdef __TCS__ - -#include - - - -typedef Int16 spx_int16_t; -typedef UInt16 spx_uint16_t; -typedef Int32 spx_int32_t; -typedef UInt32 spx_uint32_t; - -#ifdef FIXED_POINT -#define VMUX(a,b,c) mux((a),(b),(c)) -#define VABS(a) iabs((a)) -#define VMAX(a,b) imax((a),(b)) -#define VMIN(a,b) imin((a),(b)) -#else -#define VMUX(a,b,c) fmux((a),(b),(c)) -#define VABS(a) fabs((a)) -#define VMAX(a,b) fmax((a),(b)) -#define VMIN(a,b) fmin((a),(b)) -#endif - -#endif - - -#endif - diff --git a/speex/win32/Makefile.am b/speex/win32/Makefile.am deleted file mode 100644 index 63388316d..000000000 --- a/speex/win32/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -SUBDIRS = libspeexdsp VS2003 VS2005 VS2008 - -EXTRA_DIST = speex.iss config.h libspeexdsp.def diff --git a/speex/win32/VS2003/Makefile.am b/speex/win32/VS2003/Makefile.am deleted file mode 100644 index 02f81d7bc..000000000 --- a/speex/win32/VS2003/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -SUBDIRS = libspeexdsp tests - -EXTRA_DIST = libspeexdsp.sln diff --git a/speex/win32/VS2003/libspeexdsp.sln b/speex/win32/VS2003/libspeexdsp.sln deleted file mode 100644 index 7697f7497..000000000 --- a/speex/win32/VS2003/libspeexdsp.sln +++ /dev/null @@ -1,116 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" - ProjectSection(ProjectDependencies) = postProject - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" - ProjectSection(ProjectDependencies) = postProject - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" - ProjectSection(ProjectDependencies) = postProject - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - Release_Dynamic_SSE = Release_Dynamic_SSE - Release_Static_SSE = Release_Static_SSE - EndGlobalSection - GlobalSection(ProjectDependencies) = postSolution - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug.ActiveCfg = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug.Build.0 = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release.ActiveCfg = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release.Build.0 = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE.ActiveCfg = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE.Build.0 = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE.ActiveCfg = Release_Static_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE.Build.0 = Release_Static_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE.Build.0 = Release_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug.ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug.Build.0 = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release.ActiveCfg = Release|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release.Build.0 = Release|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE.ActiveCfg = Release_Dynamic_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE.Build.0 = Release_Dynamic_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE.ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE.Build.0 = Release_Static_SSE|Win32 - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/speex/win32/VS2003/libspeexdsp/Makefile.am b/speex/win32/VS2003/libspeexdsp/Makefile.am deleted file mode 100644 index 9f72976dc..000000000 --- a/speex/win32/VS2003/libspeexdsp/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = libspeexdsp.vcproj - - diff --git a/speex/win32/VS2003/libspeexdsp/libspeexdsp.vcproj b/speex/win32/VS2003/libspeexdsp/libspeexdsp.vcproj deleted file mode 100644 index 7010455b4..000000000 --- a/speex/win32/VS2003/libspeexdsp/libspeexdsp.vcproj +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2003/tests/Makefile.am b/speex/win32/VS2003/tests/Makefile.am deleted file mode 100644 index 38caed807..000000000 --- a/speex/win32/VS2003/tests/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = testdenoise.vcproj testecho.vcproj testresample.vcproj - - diff --git a/speex/win32/VS2003/tests/testdenoise.vcproj b/speex/win32/VS2003/tests/testdenoise.vcproj deleted file mode 100644 index 82cfa41c2..000000000 --- a/speex/win32/VS2003/tests/testdenoise.vcproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2003/tests/testecho.vcproj b/speex/win32/VS2003/tests/testecho.vcproj deleted file mode 100644 index 4405f24ac..000000000 --- a/speex/win32/VS2003/tests/testecho.vcproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2003/tests/testresample.vcproj b/speex/win32/VS2003/tests/testresample.vcproj deleted file mode 100644 index f512ca647..000000000 --- a/speex/win32/VS2003/tests/testresample.vcproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2005/Makefile.am b/speex/win32/VS2005/Makefile.am deleted file mode 100644 index 02f81d7bc..000000000 --- a/speex/win32/VS2005/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -SUBDIRS = libspeexdsp tests - -EXTRA_DIST = libspeexdsp.sln diff --git a/speex/win32/VS2005/libspeexdsp.sln b/speex/win32/VS2005/libspeexdsp.sln deleted file mode 100644 index 7bcc08af5..000000000 --- a/speex/win32/VS2005/libspeexdsp.sln +++ /dev/null @@ -1,231 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{E42FDC95-7243-4219-9EA4-ACCE4AB97197}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" - ProjectSection(ProjectDependencies) = postProject - {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" - ProjectSection(ProjectDependencies) = postProject - {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" - ProjectSection(ProjectDependencies) = postProject - {E42FDC95-7243-4219-9EA4-ACCE4AB97197} = {E42FDC95-7243-4219-9EA4-ACCE4AB97197} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_RTL_dll|Win32 = Debug_RTL_dll|Win32 - Debug_WM5_PPC_ARM|Win32 = Debug_WM5_PPC_ARM|Win32 - Debug|Win32 = Debug|Win32 - Release_Dynamic_SSE|Win32 = Release_Dynamic_SSE|Win32 - Release_Dynamic|Win32 = Release_Dynamic|Win32 - Release_RTL_dll|Win32 = Release_RTL_dll|Win32 - Release_SSE|Win32 = Release_SSE|Win32 - Release_SSE2|Win32 = Release_SSE2|Win32 - Release_WM5_PPC_ARM|Win32 = Release_WM5_PPC_ARM|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug|Win32.ActiveCfg = Debug|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Debug|Win32.Build.0 = Debug|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release_WM5_PPC_ARM|Win32.Build.0 = Release|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release|Win32.ActiveCfg = Release|Win32 - {E42FDC95-7243-4219-9EA4-ACCE4AB97197}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.Build.0 = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.Build.0 = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.ActiveCfg = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/speex/win32/VS2005/libspeexdsp/Makefile.am b/speex/win32/VS2005/libspeexdsp/Makefile.am deleted file mode 100644 index 9f72976dc..000000000 --- a/speex/win32/VS2005/libspeexdsp/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = libspeexdsp.vcproj - - diff --git a/speex/win32/VS2005/libspeexdsp/libspeexdsp.vcproj b/speex/win32/VS2005/libspeexdsp/libspeexdsp.vcproj deleted file mode 100644 index aef817b52..000000000 --- a/speex/win32/VS2005/libspeexdsp/libspeexdsp.vcproj +++ /dev/null @@ -1,1628 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2005/tests/Makefile.am b/speex/win32/VS2005/tests/Makefile.am deleted file mode 100644 index 38caed807..000000000 --- a/speex/win32/VS2005/tests/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = testdenoise.vcproj testecho.vcproj testresample.vcproj - - diff --git a/speex/win32/VS2005/tests/testdenoise.vcproj b/speex/win32/VS2005/tests/testdenoise.vcproj deleted file mode 100644 index dfab1a241..000000000 --- a/speex/win32/VS2005/tests/testdenoise.vcproj +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2005/tests/testecho.vcproj b/speex/win32/VS2005/tests/testecho.vcproj deleted file mode 100644 index f2e7240db..000000000 --- a/speex/win32/VS2005/tests/testecho.vcproj +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2005/tests/testresample.vcproj b/speex/win32/VS2005/tests/testresample.vcproj deleted file mode 100644 index 9bb7c28f1..000000000 --- a/speex/win32/VS2005/tests/testresample.vcproj +++ /dev/null @@ -1,307 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2008/Makefile.am b/speex/win32/VS2008/Makefile.am deleted file mode 100644 index 02f81d7bc..000000000 --- a/speex/win32/VS2008/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -SUBDIRS = libspeexdsp tests - -EXTRA_DIST = libspeexdsp.sln diff --git a/speex/win32/VS2008/libspeexdsp.sln b/speex/win32/VS2008/libspeexdsp.sln deleted file mode 100644 index f1c70cb7f..000000000 --- a/speex/win32/VS2008/libspeexdsp.sln +++ /dev/null @@ -1,411 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testdenoise", "tests\testdenoise.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}" - ProjectSection(ProjectDependencies) = postProject - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testecho", "tests\testecho.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}" - ProjectSection(ProjectDependencies) = postProject - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testresample", "tests\testresample.vcproj", "{961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}" - ProjectSection(ProjectDependencies) = postProject - {03207781-0D1C-4DB3-A71D-45C608F28DBD} = {03207781-0D1C-4DB3-A71D-45C608F28DBD} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libspeexdsp", "libspeexdsp\libspeexdsp.vcproj", "{03207781-0D1C-4DB3-A71D-45C608F28DBD}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug_RTL_dll|Win32 = Debug_RTL_dll|Win32 - Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Debug_WM5_PPC_ARM|Win32 = Debug_WM5_PPC_ARM|Win32 - Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Debug|Win32 = Debug|Win32 - Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_Dynamic_SSE|Win32 = Release_Dynamic_SSE|Win32 - Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_Dynamic|Win32 = Release_Dynamic|Win32 - Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_RTL_dll|Win32 = Release_RTL_dll|Win32 - Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_SSE|Win32 = Release_SSE|Win32 - Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_SSE2|Win32 = Release_SSE2|Win32 - Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_Static_SSE|Win32 = Release_Static_SSE|Win32 - Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release_WM5_PPC_ARM|Win32 = Release_WM5_PPC_ARM|Win32 - Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - Release|Win32 = Release|Win32 - Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.ActiveCfg = Debug_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Win32.Build.0 = Debug_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.ActiveCfg = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Win32.Build.0 = Debug|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Win32.Build.0 = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Dynamic_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Win32.Build.0 = Release_Dynamic|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.ActiveCfg = Release_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Win32.Build.0 = Release_RTL_dll|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Win32.Build.0 = Release_Static_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_Static_SSE|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_WM5_PPC_ARM|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Deploy.0 = Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.ActiveCfg = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Win32.Build.0 = Release|Win32 - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {E972C52F-9E85-4D65-B19C-031E511E9DB4}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I) - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Win32.Build.0 = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Win32.Build.0 = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA8}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Win32.ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Win32.Build.0 = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Win32.Build.0 = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Win32.Build.0 = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE2|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Win32.ActiveCfg = Release|Win32 - {CD6043D1-D5E7-46D0-854F-00BB1BC308FC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DA9}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAA}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAE}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAC}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Win32.Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Debug|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Win32.Build.0 = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_SSE|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Win32.Build.0 = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - {961B8359-1393-4EF7-B8E0-67B6FE1C6DAB}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).Build.0 = Release|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_RTL_dll|Win32.ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_WM5_PPC_ARM|Win32.ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Win32.ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Debug|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Debug|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic|Win32.ActiveCfg = Release_Dynamic_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Dynamic|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Dynamic_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_RTL_dll|Win32.ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_RTL_dll|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE2|Win32.ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_SSE2|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE|Win32.ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_Static_SSE|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_WM5_PPC_ARM|Win32.ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release_WM5_PPC_ARM|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release_Static_SSE|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Win32.ActiveCfg = Release|Win32 - {03207781-0D1C-4DB3-A71D-45C608F28DBD}.Release|Windows Mobile 5.0 Pocket PC SDK (ARMV4I).ActiveCfg = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/speex/win32/VS2008/libspeexdsp/Makefile.am b/speex/win32/VS2008/libspeexdsp/Makefile.am deleted file mode 100644 index 9f72976dc..000000000 --- a/speex/win32/VS2008/libspeexdsp/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = libspeexdsp.vcproj - - diff --git a/speex/win32/VS2008/libspeexdsp/libspeexdsp.vcproj b/speex/win32/VS2008/libspeexdsp/libspeexdsp.vcproj deleted file mode 100644 index 6349872cf..000000000 --- a/speex/win32/VS2008/libspeexdsp/libspeexdsp.vcproj +++ /dev/null @@ -1,474 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2008/tests/Makefile.am b/speex/win32/VS2008/tests/Makefile.am deleted file mode 100644 index 38caed807..000000000 --- a/speex/win32/VS2008/tests/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = testdenoise.vcproj testecho.vcproj testresample.vcproj - - diff --git a/speex/win32/VS2008/tests/testdenoise.vcproj b/speex/win32/VS2008/tests/testdenoise.vcproj deleted file mode 100644 index c344ae8b3..000000000 --- a/speex/win32/VS2008/tests/testdenoise.vcproj +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2008/tests/testecho.vcproj b/speex/win32/VS2008/tests/testecho.vcproj deleted file mode 100644 index cdd4f98a4..000000000 --- a/speex/win32/VS2008/tests/testecho.vcproj +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/VS2008/tests/testresample.vcproj b/speex/win32/VS2008/tests/testresample.vcproj deleted file mode 100644 index 52f1e4cc4..000000000 --- a/speex/win32/VS2008/tests/testresample.vcproj +++ /dev/null @@ -1,305 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/speex/win32/libspeexdsp.def b/speex/win32/libspeexdsp.def deleted file mode 100644 index 45fc69d9d..000000000 --- a/speex/win32/libspeexdsp.def +++ /dev/null @@ -1,76 +0,0 @@ -LIBRARY libspeexdsp -EXPORTS - - -; -; speex_buffer.h -; -speex_buffer_init -speex_buffer_destroy -speex_buffer_write -speex_buffer_writezeros -speex_buffer_read -speex_buffer_get_available -speex_buffer_resize - -; -; speex_echo.h -; -speex_echo_state_init -speex_echo_state_init_mc -speex_echo_state_destroy -speex_echo_cancellation -speex_echo_cancel -speex_echo_capture -speex_echo_playback -speex_echo_state_reset -speex_echo_ctl -speex_decorrelate_new -speex_decorrelate -speex_decorrelate_destroy - -; -; speex_jitter.h -; -jitter_buffer_init -jitter_buffer_reset -jitter_buffer_destroy -jitter_buffer_put -jitter_buffer_get -jitter_buffer_get_pointer_timestamp -jitter_buffer_tick -jitter_buffer_update_delay - -; -; speex_preprocess.h -; -speex_preprocess_state_init -speex_preprocess_state_destroy -speex_preprocess_run -speex_preprocess -speex_preprocess_estimate_update -speex_preprocess_ctl - -; -; speex_resampler.h -; -speex_resampler_init -speex_resampler_init_frac -speex_resampler_destroy -speex_resampler_process_float -speex_resampler_process_int -speex_resampler_process_interleaved_float -speex_resampler_process_interleaved_int -speex_resampler_set_rate -speex_resampler_get_rate -speex_resampler_set_rate_frac -speex_resampler_get_ratio -speex_resampler_set_quality -speex_resampler_get_quality -speex_resampler_set_input_stride -speex_resampler_get_input_stride -speex_resampler_set_output_stride -speex_resampler_get_output_stride -speex_resampler_skip_zeros -speex_resampler_reset_mem -speex_resampler_strerror diff --git a/speex/win32/libspeexdsp/Makefile.am b/speex/win32/libspeexdsp/Makefile.am deleted file mode 100644 index b35b4685d..000000000 --- a/speex/win32/libspeexdsp/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -## Process this file with automake to produce Makefile.in. -*-Makefile-*- - -# Disable automatic dependency tracking if using other tools than gcc and gmake -#AUTOMAKE_OPTIONS = no-dependencies - -EXTRA_DIST = libspeexdsp.dsw libspeexdsp.dsp libspeexdsp_dynamic.dsp diff --git a/speex/win32/libspeexdsp/libspeexdsp.dsp b/speex/win32/libspeexdsp/libspeexdsp.dsp deleted file mode 100644 index 10f2c1aa0..000000000 --- a/speex/win32/libspeexdsp/libspeexdsp.dsp +++ /dev/null @@ -1,228 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libspeexdsp" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=libspeexdsp - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libspeexdsp.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libspeexdsp.mak" CFG="libspeexdsp - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libspeexdsp - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "libspeexdsp - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libspeexdsp - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -F90=df.exe -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c -# ADD CPP /nologo /MD /W1 /GX- /O2 /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x419 /d "NDEBUG" -# ADD RSC /l 0x809 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\lib\libspeexdsp.lib" - -!ELSEIF "$(CFG)" == "libspeexdsp - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "libspeexdsp___Win32_Debug" -# PROP BASE Intermediate_Dir "libspeexdsp___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "libspeexdsp___Win32_Debug" -# PROP Intermediate_Dir "libspeexdsp___Win32_Debug" -# PROP Target_Dir "" -F90=df.exe -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm- /GX- /Zi /Od /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x419 /d "_DEBUG" -# ADD RSC /l 0x809 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo /out:"..\..\lib\libspeexdsp.lib" - -!ENDIF - -# Begin Target - -# Name "libspeexdsp - Win32 Release" -# Name "libspeexdsp - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\libspeex\buffer.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fftwrap.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\filterbank.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\jitter.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fft.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fftr.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\mdf.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\preprocess.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\resample.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\scal.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\smallft.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\libspeex\_kiss_fft_guts.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\arch.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fftwrap.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\filterbank.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fixed_debug.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fixed_generic.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fft.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fftr.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\math_approx.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\os_support.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\pseudofloat.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\smallft.h -# End Source File -# End Group -# Begin Group "Public Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\include\speex\speex.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_bits.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_buffer.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_echo.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_jitter.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_preprocess.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_resampler.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_types.h -# End Source File -# End Group -# Begin Source File - -SOURCE=..\config.h -# End Source File -# End Target -# End Project diff --git a/speex/win32/libspeexdsp/libspeexdsp.dsw b/speex/win32/libspeexdsp/libspeexdsp.dsw deleted file mode 100644 index 814f2ae9c..000000000 --- a/speex/win32/libspeexdsp/libspeexdsp.dsw +++ /dev/null @@ -1,41 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "libspeexdsp"=.\libspeexdsp.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Project: "libspeexdsp_dynamic"=.\libspeexdsp_dynamic.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/speex/win32/libspeexdsp/libspeexdsp_dynamic.dsp b/speex/win32/libspeexdsp/libspeexdsp_dynamic.dsp deleted file mode 100644 index 28096619b..000000000 --- a/speex/win32/libspeexdsp/libspeexdsp_dynamic.dsp +++ /dev/null @@ -1,237 +0,0 @@ -# Microsoft Developer Studio Project File - Name="libspeexdsp_dynamic" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=libspeexdsp_dynamic - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "libspeexdsp_dynamic.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "libspeexdsp_dynamic.mak" CFG="libspeexdsp_dynamic - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "libspeexdsp_dynamic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "libspeexdsp_dynamic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "libspeexdsp_dynamic - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "libspeexdsp_dynamic___Win32_Release" -# PROP BASE Intermediate_Dir "libspeexdsp_dynamic___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Dynamic_Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBSPEEX_DYNAMIC_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /O2 /I "../../include" /I "../" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HAVE_CONFIG_H" /FD /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"..\..\bin\libspeexdsp.dll" /implib:"..\..\lib\libspeexdsp.lib" - -!ELSEIF "$(CFG)" == "libspeexdsp_dynamic - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "libspeexdsp_dynamic___Win32_Debug" -# PROP BASE Intermediate_Dir "libspeexdsp_dynamic___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Dynamic_Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBSPEEX_DYNAMIC_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "../../include" /I "../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "HAVE_CONFIG_H" /FD /GZ /c -# SUBTRACT CPP /YX -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"..\..\bin\libspeexdsp.dll" /implib:"..\..\lib\libspeexdsp.lib" /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "libspeexdsp_dynamic - Win32 Release" -# Name "libspeexdsp_dynamic - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=..\..\libspeex\buffer.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fftwrap.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\filterbank.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\jitter.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fft.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fftr.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\mdf.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\preprocess.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\resample.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\scal.c -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\smallft.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=..\..\libspeex\_kiss_fft_guts.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\arch.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fftwrap.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\filterbank.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fixed_debug.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\fixed_generic.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fft.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\kiss_fftr.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\math_approx.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\os_support.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\pseudofloat.h -# End Source File -# Begin Source File - -SOURCE=..\..\libspeex\smallft.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_buffer.h -# End Source File -# End Group -# Begin Group "Public Header Files" - -# PROP Default_Filter "" -# Begin Source File - -SOURCE=..\..\include\speex\speex.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_bits.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_echo.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_jitter.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_preprocess.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_resampler.h -# End Source File -# Begin Source File - -SOURCE=..\..\include\speex\speex_types.h -# End Source File -# End Group -# Begin Source File - -SOURCE=..\config.h -# End Source File -# Begin Source File - -SOURCE=..\libspeexdsp.def -# End Source File -# End Target -# End Project diff --git a/speex/win32/speex.iss b/speex/win32/speex.iss deleted file mode 100644 index 6700cfe28..000000000 --- a/speex/win32/speex.iss +++ /dev/null @@ -1,47 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -[Setup] -AppName=Speex -AppVerName=Speex V1.1.6 -AppPublisherURL=http://www.speex.org -AppSupportURL=http://www.speex.org -AppUpdatesURL=http://www.speex.org -DefaultDirName={pf}\Speex -DefaultGroupName=Speex -AllowNoIcons=yes -LicenseFile=..\COPYING -InfoAfterFile=..\README -OutputDir=. -OutputBaseFilename=speex_win32_1.1.6_setup -; uncomment the following line if you want your installation to run on NT 3.51 too. -; MinVersion=4,3.51 - -[Tasks] -;Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"; MinVersion: 4,4 - -[Dirs] -Name: "{app}" -Name: "{app}\doc" -Name: "{app}\html" -Name: "{app}\libspeex" -Name: "{app}\libspeex\include" - -[Files] -Source: "speexdec\Release\speexdec.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "speexenc\Release\speexenc.exe"; DestDir: "{app}"; Flags: ignoreversion -Source: "libspeex\Release\libspeex.lib"; DestDir: "{app}\libspeex"; Flags: ignoreversion -Source: "libspeex\Release\libspeex.exp"; DestDir: "{app}\libspeex"; Flags: ignoreversion -Source: "libspeex\Release\libspeex.dll"; DestDir: "{app}\libspeex"; Flags: ignoreversion -Source: "..\include\speex\speex.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_bits.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_callbacks.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_echo.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_header.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_jitter.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_preprocess.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\include\speex\speex_stereo.h"; DestDir: "{app}\libspeex\include"; Flags: ignoreversion -Source: "..\doc\manual.pdf"; DestDir: "{app}\doc"; Flags: ignoreversion - -[Run] - -- Gitee From e8c9baddc1b790f9c7682eea5d16d4fe556f794c Mon Sep 17 00:00:00 2001 From: magekkkk Date: Mon, 28 Apr 2025 09:44:32 +0000 Subject: [PATCH 2/2] remove bundle info Signed-off-by: magekkkk --- bundle.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/bundle.json b/bundle.json index 5332a58fb..b6c3e6d27 100644 --- a/bundle.json +++ b/bundle.json @@ -71,15 +71,6 @@ ] }, "name": "//third_party/pulseaudio/sonic:sonic" - }, - { - "header": { - "header_base": "//third_party/pulseaudio/speex/include/speex", - "header_files": [ - "speex_resampler.h" - ] - }, - "name": "//third_party/pulseaudio/speex:speexresampler" } ], "test": [] -- Gitee