From 745e491e8dfb1f524de18958249642baff061cae Mon Sep 17 00:00:00 2001 From: llea <llea> Date: Thu, 10 Feb 2005 17:16:14 +0000 Subject: [PATCH] Add gsm audio codec support. Add notification incoming call. --- CHANGES | 14 +- Makefile | 2 + gsm/COPYRIGHT | 16 + gsm/ChangeLog | 80 +++ gsm/INSTALL | 99 ++++ gsm/MACHINES | 11 + gsm/MANIFEST | 59 +++ gsm/Makefile | 36 ++ gsm/README | 37 ++ gsm/add.c | 235 +++++++++ gsm/code.c | 101 ++++ gsm/config.h | 37 ++ gsm/debug.c | 76 +++ gsm/decode.c | 63 +++ gsm/gsm.h | 71 +++ gsm/gsm_create.c | 45 ++ gsm/gsm_decode.c | 361 +++++++++++++ gsm/gsm_destroy.c | 26 + gsm/gsm_encode.c | 451 +++++++++++++++++ gsm/gsm_explode.c | 417 +++++++++++++++ gsm/gsm_implode.c | 515 +++++++++++++++++++ gsm/gsm_option.c | 69 +++ gsm/gsm_print.c | 167 ++++++ gsm/long_term.c | 949 +++++++++++++++++++++++++++++++++++ gsm/lpc.c | 341 +++++++++++++ gsm/preprocess.c | 113 +++++ gsm/private.h | 268 ++++++++++ gsm/proto.h | 65 +++ gsm/rpe.c | 488 ++++++++++++++++++ gsm/short_term.c | 429 ++++++++++++++++ gsm/table.c | 63 +++ gsm/toast.c | 800 +++++++++++++++++++++++++++++ gsm/toast.h | 109 ++++ gsm/toast_alaw.c | 334 ++++++++++++ gsm/toast_audio.c | 113 +++++ gsm/toast_lin.c | 24 + gsm/toast_ulaw.c | 621 +++++++++++++++++++++++ gsm/unproto.h | 23 + src/Makefile | 17 +- src/audiocodec.cpp | 82 +-- src/audiocodec.h | 4 + src/audiortp.cpp | 23 +- src/audiortp.h | 2 +- src/configurationpanel.ui | 27 +- src/configurationpanelui.cpp | 599 +++++++++++----------- src/configurationpanelui.h | 2 +- src/manager.cpp | 18 +- src/manager.h | 1 + src/phonebookui.cpp | 2 +- src/phonebookui.h | 2 +- src/sip.cpp | 10 +- src/tonegenerator.cpp | 29 +- src/tonegenerator.h | 13 +- src/url_inputui.cpp | 2 +- src/url_inputui.h | 2 +- 55 files changed, 8190 insertions(+), 373 deletions(-) create mode 100644 gsm/COPYRIGHT create mode 100644 gsm/ChangeLog create mode 100644 gsm/INSTALL create mode 100644 gsm/MACHINES create mode 100644 gsm/MANIFEST create mode 100644 gsm/Makefile create mode 100644 gsm/README create mode 100644 gsm/add.c create mode 100644 gsm/code.c create mode 100644 gsm/config.h create mode 100644 gsm/debug.c create mode 100644 gsm/decode.c create mode 100644 gsm/gsm.h create mode 100644 gsm/gsm_create.c create mode 100644 gsm/gsm_decode.c create mode 100644 gsm/gsm_destroy.c create mode 100644 gsm/gsm_encode.c create mode 100644 gsm/gsm_explode.c create mode 100644 gsm/gsm_implode.c create mode 100644 gsm/gsm_option.c create mode 100644 gsm/gsm_print.c create mode 100644 gsm/long_term.c create mode 100644 gsm/lpc.c create mode 100644 gsm/preprocess.c create mode 100644 gsm/private.h create mode 100644 gsm/proto.h create mode 100644 gsm/rpe.c create mode 100644 gsm/short_term.c create mode 100644 gsm/table.c create mode 100644 gsm/toast.c create mode 100644 gsm/toast.h create mode 100644 gsm/toast_alaw.c create mode 100644 gsm/toast_audio.c create mode 100644 gsm/toast_lin.c create mode 100644 gsm/toast_ulaw.c create mode 100644 gsm/unproto.h diff --git a/CHANGES b/CHANGES index 48a68870aa..ca20a29e07 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,14 @@ -SFLPhone (0.2) / 2005-01-18 +SFLphone (0.3) / 2005-02-10 + * ALSA driver support added (not yet operationnal) + * GSM audio codec support added + * Rings support (just ulaw format) added + * Notification incoming call added + * Apply skin feature added + * Volume control added + * Registration manually added + * Config-file in home directory changed to ".sflphone" + +SFLphone (0.2) / 2005-01-18 * Lines management updated * Blocking bug fixed * Configuration tree, made from a config file, added for setup @@ -7,5 +17,5 @@ SFLPhone (0.2) / 2005-01-18 * Apply feature updated * Non-network or request failure cases updated -SFLPhone (0.1a) / 2004-12-22 +SFLphone (0.1a) / 2004-12-22 * First release diff --git a/Makefile b/Makefile index 181081847c..a035b8fb96 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ # Author: Laurielle Lea (laurielle.lea@savoirfairelinux.com) # all: + cd gsm ; make cd src; make install: @@ -14,4 +15,5 @@ uninstall: clean: cd src; make clean + cd gsm ; make clean diff --git a/gsm/COPYRIGHT b/gsm/COPYRIGHT new file mode 100644 index 0000000000..eba0e523bb --- /dev/null +++ b/gsm/COPYRIGHT @@ -0,0 +1,16 @@ +Copyright 1992, 1993, 1994 by Jutta Degener and Carsten Bormann, +Technische Universitaet Berlin + +Any use of this software is permitted provided that this notice is not +removed and that neither the authors nor the Technische Universitaet Berlin +are deemed to have made any representations as to the suitability of this +software for any purpose nor are held responsible for any defects of +this software. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + +As a matter of courtesy, the authors request to be informed about uses +this software has found, about bugs in this software, and about any +improvements that may be of general interest. + +Berlin, 28.11.1994 +Jutta Degener +Carsten Bormann diff --git a/gsm/ChangeLog b/gsm/ChangeLog new file mode 100644 index 0000000000..4cf467d091 --- /dev/null +++ b/gsm/ChangeLog @@ -0,0 +1,80 @@ + +Fri Jul 5 19:26:37 1996 Jutta Degener (jutta@cs.tu-berlin.de) + + * Release 1.0 Patchlevel 10 + src/toast_alaw.c: exchanged A-law tables for something + slightly more A-law. + +Tue Jul 2 12:18:20 1996 Jutta Degener (jutta@cs.tu-berlin.de) + + * Release 1.0 Patchlevel 9 + src/long_term.c: in FLOAT_MUL mode, an array was accessed past its end + src/gsm_option.c: three options related to WAV #49 packing + src/gsm_encode.c: support WAV #49-style encoding. + src/gsm_decode.c: support WAV #49-style decoding. + tls/sour.c: generate the WAV bit shifting code, encode + tls/ginger.c: generate the WAV bit shifting code, decode + The WAV code goes back to an inofficial patch #8 that + Jeff Chilton sent us (hence the jump from 7 to 9). + src/toast.c: add _fsetmode() calls to set stdin/stdout to + binary (from an OS/2 port by Arnd Gronenberg.) + +Tue Mar 7 01:55:10 1995 Jutta Degener (jutta@cs.tu-berlin.de) + + * Release 1.0 Patchlevel 7 + src/long_term.c: Yet another 16-bit overflow + src/toast.c: -C option to toast, cuts LPC time + src/gsm_option.c: corresponding LPC_CUT option to GSM library + +Fri Dec 30 23:33:50 1994 Jutta Degener (jutta@cs.tu-berlin.de) + + * Release 1.0 Patchlevel 6 + src/lpc.c: fixed 16-bit addition overflow in Autocorrelation code + src/add.c: gsm_L_asl should fall back on gsm_L_asr, not gsm_asr + +Mon Nov 28 20:49:57 1994 Jutta Degener (jutta@cs.tu-berlin.de) + + * Release 1.0 Patchlevel 5 + src/toast_audio.c: initialization should return -1 on error + src/gsm_destroy.c: #include configuration header file + src/add.c: gsm_sub should cast its parameters to longword + man/*: bug reports to {jutta,cabo}@cs.tu-berlin.de, not to toast@tub + inc/private.h: longword long by default, not int + inc/toast.h: read/write fopen modes "rb" and "wb", not just "r" + src/toast.c: better (or different, anyway) error handling in process() + +Tue May 10 19:41:34 1994 Jutta Degener (jutta at kugelbus) + + * Release 1.0 Patchlevel 4 + inc/private.h: GSM_ADD should cast to ulongword, not to unsigned. + src/long_term.c: missing cast to longword. + add-test/add_test.c: Test macros too, not only functions, + thanks to Simao Ferraz de Campos Neto, simao@dragon.cpqd.ansp.br + General cleanup: remove unused variables, add function prototypes. + +Tue Jan 25 22:53:40 1994 Jutta Degener (jutta at kugelbus) + + * Release 1.0 Patchlevel 3 + changed rpe.c's STEP macro to work with 16-bit integers, + thanks to Dr Alex Lee (alexlee@solomon.technet.sg); + removed non-fatal bugs from add-test.dta, private.h + and toast_audio.c, thanks to P. Emanuelsson. + +Fri Jan 29 19:02:12 1993 Jutta Degener (jutta at kraftbus) + + * Release 1.0 Patchlevel 2 + fixed L_add(0,-1) in src/add.c and inc/private.h, + thanks to Raphael Trommer at AT&T Bell Laboratories; + various other ANSI C compatibility details + +Fri Oct 30 17:58:54 1992 Jutta Degener (jutta at kraftbus) + + * Release 1.0 Patchlevel 1 + Switched uid/gid in toast's [f]chown calls. + +Wed Oct 28 14:12:35 1992 Carsten Bormann (cabo at kubus) + + * Release 1.0: released + Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + Universitaet Berlin. See the accompanying file "COPYRIGHT" for + details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. diff --git a/gsm/INSTALL b/gsm/INSTALL new file mode 100644 index 0000000000..5850304f8b --- /dev/null +++ b/gsm/INSTALL @@ -0,0 +1,99 @@ +How to get started: + + Edit the Makefile. + + You should configure a few machine-dependencies and what + compiler you want to use. + + The code works both with ANSI and K&R-C. Use + -DNeedFunctionPrototypes to compile with, or + -UNeedFunctionPrototypes to compile without, function + prototypes in the header files. + + Make addtst + + The "add" program that will be compiled and run checks whether + the basic math functions of the gsm library work with your + compiler. If it prints anything to stderr, complain (to us). + + Edit inc/config.h. + + Make + + Local versions of the gsm library and the "compress"-like filters + toast, untoast and tcat will be generated. + + If the compilation aborts because of a missing function, + declaration, or header file, see if there's something in + inc/config.h to work around it. If not, complain. + + Try it + + Grab an audio file from somewhere (raw u-law or Sun .au is fine, + linear 16-bit in host byte order will do), copy it, toast it, + untoast it, and listen to the result. + + The GSM-encoded and -decoded audio should have the quality + of a good phone line. If the resulting audio is noisier than + your original, or if you hear compression artifacts, complain; + that's a bug in our software, not a bug in the GSM encoding + standard itself. + +Installation + + You can install the gsm library interface, or the toast binaries, + or both. + + Edit the Makefile + + Fill in the directories where you want to install the + library, header files, manual pages, and binaries. + + Turn off the installation of one half of the distribution + (i.e., gsm library or toast binaries) by not setting the + corresponding directory root Makefile macro. + + make install + + will install the programs "toast" with two links named + "tcat" and "untoast", and the gsm library "libgsm.a" with + a "gsm.h" header file, and their respective manual pages. + + +Optimizing + + This code was developed on a machine without an integer + multiplication instruction, where we obtained the fastest result by + replacing some of the integer multiplications with floating point + multiplications. + + If your machine does multiply integers fast enough, + leave USE_FLOAT_MUL undefined. The results should be the + same in both cases. + + On machines with fast floating point arithmetic, defining + both USE_FLOAT_MUL and FAST makes a run-time library + option available that will (in a few crucial places) use + ``native'' floating point operations rather than the bit-by-bit + defined ones of the GSM standard. If you use this fast + option, the outcome will not be bitwise identical to the + results prescribed by the standard, but it is compatible with + the standard encoding, and a user is unlikely to notice a + difference. + + +Bug Reports + + Please direct bug reports, questions, and comments to + jutta@cs.tu-berlin.de and cabo@informatik.uni-bremen.de. + + +Good luck, + + Jutta Degener, + Carsten Bormann + +-- +Copyright 1992, 1993, 1994, by Jutta Degener and Carsten Bormann, +Technische Universitaet Berlin. See the accompanying file "COPYRIGHT" +for details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. diff --git a/gsm/MACHINES b/gsm/MACHINES new file mode 100644 index 0000000000..4adafd24fa --- /dev/null +++ b/gsm/MACHINES @@ -0,0 +1,11 @@ +The gsm library has been tested successfully on the following platforms: + +- Various Sun4's running SunOS 4.1.2 +- SPARC1 (SunOS 4.1.1) +- Integrated Solutions 68k Optimum running 4.3BSD UNIX with a Green Hills cc +- NeXTstation running NeXT-OS/Mach 3.0 +- No-name AT/386 with Xenix 2.3.2 (using -DSTUPID_COMPILER) +- RS/6000-350 running AIX 3.2.0 +- RS/6000-320 running AIX 3.1.5 +- Alliant FX80 (Concentrix 5.7) +- SGI Indigo XS4000 (IRIX 4.0.5F) diff --git a/gsm/MANIFEST b/gsm/MANIFEST new file mode 100644 index 0000000000..6db3b2a3e3 --- /dev/null +++ b/gsm/MANIFEST @@ -0,0 +1,59 @@ +gsm-1.0/COPYRIGHT +gsm-1.0/ChangeLog +gsm-1.0/INSTALL +gsm-1.0/MACHINES +gsm-1.0/MANIFEST +gsm-1.0/Makefile +gsm-1.0/README +gsm-1.0/add-test/add_test.c +gsm-1.0/add-test/add_test.dta +gsm-1.0/inc/gsm.h +gsm-1.0/inc/proto.h +gsm-1.0/inc/unproto.h +gsm-1.0/inc/config.h +gsm-1.0/inc/private.h +gsm-1.0/inc/toast.h +gsm-1.0/man/bitter.1 +gsm-1.0/man/gsm.3 +gsm-1.0/man/gsm_explode.3 +gsm-1.0/man/gsm_print.3 +gsm-1.0/man/gsm_option.3 +gsm-1.0/man/toast.1 +gsm-1.0/src/add.c +gsm-1.0/src/code.c +gsm-1.0/src/debug.c +gsm-1.0/src/decode.c +gsm-1.0/src/gsm_destroy.c +gsm-1.0/src/gsm_decode.c +gsm-1.0/src/gsm_encode.c +gsm-1.0/src/gsm_explode.c +gsm-1.0/src/gsm_implode.c +gsm-1.0/src/gsm_create.c +gsm-1.0/src/gsm_print.c +gsm-1.0/src/gsm_option.c +gsm-1.0/src/long_term.c +gsm-1.0/src/lpc.c +gsm-1.0/src/preprocess.c +gsm-1.0/src/rpe.c +gsm-1.0/src/short_term.c +gsm-1.0/src/table.c +gsm-1.0/src/toast.c +gsm-1.0/src/toast_alaw.c +gsm-1.0/src/toast_audio.c +gsm-1.0/src/toast_lin.c +gsm-1.0/src/toast_ulaw.c +gsm-1.0/tls/bitter.c +gsm-1.0/tls/bitter.dta +gsm-1.0/tls/taste.c +gsm-1.0/tls/taste.h +gsm-1.0/tls/sweet.c +gsm-1.0/tls/sour.c +gsm-1.0/tls/sour1.dta +gsm-1.0/tls/sour2.dta +gsm-1.0/tls/ginger.c +gsm-1.0/tst/cod2lin.c +gsm-1.0/tst/cod2txt.c +gsm-1.0/tst/gsm2cod.c +gsm-1.0/tst/lin2cod.c +gsm-1.0/tst/lin2txt.c +gsm-1.0/tst/run diff --git a/gsm/Makefile b/gsm/Makefile new file mode 100644 index 0000000000..140b7ed3cc --- /dev/null +++ b/gsm/Makefile @@ -0,0 +1,36 @@ +CC=g++ + +CFLAGS=-Wall -g -O3 -I. -I.. -DHAVE_CONFIG_H + +AR=ar + +OBJS = add.o\ + gsm_create.o\ + gsm_explode.o\ + long_term.o\ + short_term.o\ + code.o\ + gsm_decode.o\ + gsm_implode.o\ + lpc.o\ + table.o\ + debug.o\ + gsm_destroy.o\ + gsm_option.o\ + preprocess.o\ + decode.o\ + gsm_encode.o\ + gsm_print.o\ + rpe.o + +all: libgsm.a + +.c.o: + $(CC) $(CFLAGS) -c -o $@ $< + +clean: + rm -f *.o *.a *~ *.moc.cpp *.bak + +libgsm.a: $(OBJS) + $(AR) rcs $@ $(OBJS) + diff --git a/gsm/README b/gsm/README new file mode 100644 index 0000000000..cb6af85cf0 --- /dev/null +++ b/gsm/README @@ -0,0 +1,37 @@ + +GSM 06.10 13 kbit/s RPE/LTP speech compression available +-------------------------------------------------------- + +The Communications and Operating Systems Research Group (KBS) at the +Technische Universitaet Berlin is currently working on a set of +UNIX-based tools for computer-mediated telecooperation that will be +made freely available. + +As part of this effort we are publishing an implementation of the +European GSM 06.10 provisional standard for full-rate speech +transcoding, prI-ETS 300 036, which uses RPE/LTP (residual pulse +excitation/long term prediction) coding at 13 kbit/s. + +GSM 06.10 compresses frames of 160 13-bit samples (8 kHz sampling +rate, i.e. a frame rate of 50 Hz) into 260 bits; for compatibility +with typical UNIX applications, our implementation turns frames of 160 +16-bit linear samples into 33-byte frames (1650 Bytes/s). +The quality of the algorithm is good enough for reliable speaker +recognition; even music often survives transcoding in recognizable +form (given the bandwidth limitations of 8 kHz sampling rate). + +The interfaces offered are a front end modelled after compress(1), and +a library API. Compression and decompression run faster than realtime +on most SPARCstations. The implementation has been verified against the +ETSI standard test patterns. + +Jutta Degener (jutta@cs.tu-berlin.de) +Carsten Bormann (cabo@cs.tu-berlin.de) + +Communications and Operating Systems Research Group, TU Berlin +Fax: +49.30.31425156, Phone: +49.30.31424315 + +-- +Copyright 1992 by Jutta Degener and Carsten Bormann, Technische +Universitaet Berlin. See the accompanying file "COPYRIGHT" for +details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. diff --git a/gsm/add.c b/gsm/add.c new file mode 100644 index 0000000000..21ccfabe7b --- /dev/null +++ b/gsm/add.c @@ -0,0 +1,235 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +/* + * See private.h for the more commonly used macro versions. + */ + +#include <stdio.h> +#include <assert.h> + +#include "private.h" +#include "gsm.h" +#include "proto.h" + +#define saturate(x) \ + ((x) < MIN_WORD ? MIN_WORD : (x) > MAX_WORD ? MAX_WORD: (x)) + +word gsm_add P2((a,b), word a, word b) +{ + longword sum = (longword)a + (longword)b; + return saturate(sum); +} + +word gsm_sub P2((a,b), word a, word b) +{ + longword diff = (longword)a - (longword)b; + return saturate(diff); +} + +word gsm_mult P2((a,b), word a, word b) +{ + if (a == MIN_WORD && b == MIN_WORD) return MAX_WORD; + else return SASR( (longword)a * (longword)b, 15 ); +} + +word gsm_mult_r P2((a,b), word a, word b) +{ + if (b == MIN_WORD && a == MIN_WORD) return MAX_WORD; + else { + longword prod = (longword)a * (longword)b + 16384; + prod >>= 15; + return prod & 0xFFFF; + } +} + +word gsm_abs P1((a), word a) +{ + return a < 0 ? (a == MIN_WORD ? MAX_WORD : -a) : a; +} + +longword gsm_L_mult P2((a,b),word a, word b) +{ + assert( a != MIN_WORD || b != MIN_WORD ); + return ((longword)a * (longword)b) << 1; +} + +longword gsm_L_add P2((a,b), longword a, longword b) +{ + if (a < 0) { + if (b >= 0) return a + b; + else { + ulongword A = (ulongword)-(a + 1) + (ulongword)-(b + 1); + return A >= MAX_LONGWORD ? MIN_LONGWORD :-(longword)A-2; + } + } + else if (b <= 0) return a + b; + else { + ulongword A = (ulongword)a + (ulongword)b; + return A > MAX_LONGWORD ? MAX_LONGWORD : A; + } +} + +longword gsm_L_sub P2((a,b), longword a, longword b) +{ + if (a >= 0) { + if (b >= 0) return a - b; + else { + /* a>=0, b<0 */ + + ulongword A = (ulongword)a + -(b + 1); + return A >= MAX_LONGWORD ? MAX_LONGWORD : (A + 1); + } + } + else if (b <= 0) return a - b; + else { + /* a<0, b>0 */ + + ulongword A = (ulongword)-(a + 1) + b; + return A >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)A - 1; + } +} + +static unsigned char const bitoff[ 256 ] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; + +word gsm_norm P1((a), longword a ) +/* + * the number of left shifts needed to normalize the 32 bit + * variable L_var1 for positive values on the interval + * + * with minimum of + * minimum of 1073741824 (01000000000000000000000000000000) and + * maximum of 2147483647 (01111111111111111111111111111111) + * + * + * and for negative values on the interval with + * minimum of -2147483648 (-10000000000000000000000000000000) and + * maximum of -1073741824 ( -1000000000000000000000000000000). + * + * in order to normalize the result, the following + * operation must be done: L_norm_var1 = L_var1 << norm( L_var1 ); + * + * (That's 'ffs', only from the left, not the right..) + */ +{ + assert(a != 0); + + if (a < 0) { + if (a <= -1073741824) return 0; + a = ~a; + } + + return a & 0xffff0000 + ? ( a & 0xff000000 + ? -1 + bitoff[ 0xFF & (a >> 24) ] + : 7 + bitoff[ 0xFF & (a >> 16) ] ) + : ( a & 0xff00 + ? 15 + bitoff[ 0xFF & (a >> 8) ] + : 23 + bitoff[ 0xFF & a ] ); +} + +longword gsm_L_asl P2((a,n), longword a, int n) +{ + if (n >= 32) return 0; + if (n <= -32) return -(a < 0); + if (n < 0) return gsm_L_asr(a, -n); + return a << n; +} + +word gsm_asl P2((a,n), word a, int n) +{ + if (n >= 16) return 0; + if (n <= -16) return -(a < 0); + if (n < 0) return gsm_asr(a, -n); + return a << n; +} + +longword gsm_L_asr P2((a,n), longword a, int n) +{ + if (n >= 32) return -(a < 0); + if (n <= -32) return 0; + if (n < 0) return a << -n; + +# ifdef SASR + return a >> n; +# else + if (a >= 0) return a >> n; + else return -(longword)( -(ulongword)a >> n ); +# endif +} + +word gsm_asr P2((a,n), word a, int n) +{ + if (n >= 16) return -(a < 0); + if (n <= -16) return 0; + if (n < 0) return a << -n; + +# ifdef SASR + return a >> n; +# else + if (a >= 0) return a >> n; + else return -(word)( -(uword)a >> n ); +# endif +} + +/* + * (From p. 46, end of section 4.2.5) + * + * NOTE: The following lines gives [sic] one correct implementation + * of the div(num, denum) arithmetic operation. Compute div + * which is the integer division of num by denum: with denum + * >= num > 0 + */ + +word gsm_div P2((num,denum), word num, word denum) +{ + longword L_num = num; + longword L_denum = denum; + word div = 0; + int k = 15; + + /* The parameter num sometimes becomes zero. + * Although this is explicitly guarded against in 4.2.5, + * we assume that the result should then be zero as well. + */ + + /* assert(num != 0); */ + + assert(num >= 0 && denum >= num); + if (num == 0) + return 0; + + while (k--) { + div <<= 1; + L_num <<= 1; + + if (L_num >= L_denum) { + L_num -= L_denum; + div++; + } + } + + return div; +} diff --git a/gsm/code.c b/gsm/code.c new file mode 100644 index 0000000000..b7f8a236d1 --- /dev/null +++ b/gsm/code.c @@ -0,0 +1,101 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "config.h" + + +//#ifdef HAS_STDLIB_H +//#include <stdlib.h> +#ifdef HAS_STRING_H +#include <string.h> +#else +# include "proto.h" + extern char * memcpy P((char *, char *, int)); +#endif + +#include "private.h" +#include "gsm.h" +#include "proto.h" + +/* + * 4.2 FIXED POINT IMPLEMENTATION OF THE RPE-LTP CODER + */ + +void Gsm_Coder P8((S,s,LARc,Nc,bc,Mc,xmaxc,xMc), + + struct gsm_state * S, + + word * s, /* [0..159] samples IN */ + +/* + * The RPE-LTD coder works on a frame by frame basis. The length of + * the frame is equal to 160 samples. Some computations are done + * once per frame to produce at the output of the coder the + * LARc[1..8] parameters which are the coded LAR coefficients and + * also to realize the inverse filtering operation for the entire + * frame (160 samples of signal d[0..159]). These parts produce at + * the output of the coder: + */ + + word * LARc, /* [0..7] LAR coefficients OUT */ + +/* + * Procedure 4.2.11 to 4.2.18 are to be executed four times per + * frame. That means once for each sub-segment RPE-LTP analysis of + * 40 samples. These parts produce at the output of the coder: + */ + + word * Nc, /* [0..3] LTP lag OUT */ + word * bc, /* [0..3] coded LTP gain OUT */ + word * Mc, /* [0..3] RPE grid selection OUT */ + word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ + word * xMc /* [13*4] normalized RPE samples OUT */ +) +{ + int k; + word * dp = S->dp0 + 120; /* [ -120...-1 ] */ + word * dpp = dp; /* [ 0...39 ] */ + + static word e[50]; + + word so[160]; + + Gsm_Preprocess (S, s, so); + Gsm_LPC_Analysis (S, so, LARc); + Gsm_Short_Term_Analysis_Filter (S, LARc, so); + + for (k = 0; k <= 3; k++, xMc += 13) { + + Gsm_Long_Term_Predictor ( S, + so+k*40, /* d [0..39] IN */ + dp, /* dp [-120..-1] IN */ + e + 5, /* e [0..39] OUT */ + dpp, /* dpp [0..39] OUT */ + Nc++, + bc++); + + Gsm_RPE_Encoding ( S, + e + 5, /* e ][0..39][ IN/OUT */ + xmaxc++, Mc++, xMc ); + /* + * Gsm_Update_of_reconstructed_short_time_residual_signal + * ( dpp, e + 5, dp ); + */ + + { register int i; + register longword ltmp; + for (i = 0; i <= 39; i++) + dp[ i ] = GSM_ADD( e[5 + i], dpp[i] ); + } + dp += 40; + dpp += 40; + + } + (void)memcpy( (char *)S->dp0, (char *)(S->dp0 + 160), + 120 * sizeof(*S->dp0) ); +} diff --git a/gsm/config.h b/gsm/config.h new file mode 100644 index 0000000000..ad57d91faf --- /dev/null +++ b/gsm/config.h @@ -0,0 +1,37 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/*$Header$*/ + +#ifndef CONFIG_H +#define CONFIG_H + +/*efine SIGHANDLER_T int */ /* signal handlers are void */ +/*efine HAS_SYSV_SIGNAL 1 */ /* sigs not blocked/reset? */ + +#define HAS_STDLIB_H 1 /* /usr/include/stdlib.h */ +/*efine HAS_LIMITS_H 1 */ /* /usr/include/limits.h */ +#define HAS_FCNTL_H 1 /* /usr/include/fcntl.h */ +/*efine HAS_ERRNO_DECL 1 */ /* errno.h declares errno */ + +#define HAS_FSTAT 1 /* fstat syscall */ +#define HAS_FCHMOD 1 /* fchmod syscall */ +#define HAS_CHMOD 1 /* chmod syscall */ +#define HAS_FCHOWN 1 /* fchown syscall */ +#define HAS_CHOWN 1 /* chown syscall */ +/*efine HAS__FSETMODE 1 */ /* _fsetmode -- set file mode */ + +#define HAS_STRING_H 1 /* /usr/include/string.h */ +/*efine HAS_STRINGS_H 1 */ /* /usr/include/strings.h */ + +#define HAS_UNISTD_H 1 /* /usr/include/unistd.h */ +#define HAS_UTIME 1 /* POSIX utime(path, times) */ +/*efine HAS_UTIMES 1 */ /* use utimes() syscall instead */ +#define HAS_UTIME_H 1 /* UTIME header file */ +/*efine HAS_UTIMBUF 1 */ /* struct utimbuf */ +/*efine HAS_UTIMEUSEC 1*/ /* microseconds in utimbuf? */ + +#endif /* CONFIG_H */ diff --git a/gsm/debug.c b/gsm/debug.c new file mode 100644 index 0000000000..e05210428f --- /dev/null +++ b/gsm/debug.c @@ -0,0 +1,76 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "private.h" + +#ifndef NDEBUG + +/* If NDEBUG _is_ defined and no debugging should be performed, + * calls to functions in this module are #defined to nothing + * in private.h. + */ + +#include <stdio.h> +#include "proto.h" + +void gsm_debug_words P4( (name, from, to, ptr), + char * name, + int from, + int to, + word * ptr) +{ + int nprinted = 0; + + fprintf( stderr, "%s [%d .. %d]: ", name, from, to ); + while (from <= to) { + fprintf(stderr, "%d ", ptr[ from ] ); + from++; + if (nprinted++ >= 7) { + nprinted = 0; + if (from < to) putc('\n', stderr); + } + } + putc('\n', stderr); +} + +void gsm_debug_longwords P4( (name, from, to, ptr), + char * name, + int from, + int to, + longword * ptr) +{ + int nprinted = 0; + + fprintf( stderr, "%s [%d .. %d]: ", name, from, to ); + while (from <= to) { + + fprintf(stderr, "%ld ", ptr[ from ] ); + from++; + if (nprinted++ >= 7) { + nprinted = 0; + if (from < to) putc('\n', stderr); + } + } + putc('\n', stderr); +} + +void gsm_debug_longword P2( (name, value), + char * name, + longword value ) +{ + fprintf(stderr, "%s: %ld\n", name, (long)value ); +} + +void gsm_debug_word P2( (name, value), + char * name, + word value ) +{ + fprintf(stderr, "%s: %ld\n", name, (long)value); +} + +#endif diff --git a/gsm/decode.c b/gsm/decode.c new file mode 100644 index 0000000000..34e5586633 --- /dev/null +++ b/gsm/decode.c @@ -0,0 +1,63 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> + +#include "private.h" +#include "gsm.h" +#include "proto.h" + +/* + * 4.3 FIXED POINT IMPLEMENTATION OF THE RPE-LTP DECODER + */ + +static void Postprocessing P2((S,s), + struct gsm_state * S, + register word * s) +{ + register int k; + register word msr = S->msr; + register longword ltmp; /* for GSM_ADD */ + register word tmp; + + for (k = 160; k--; s++) { + tmp = GSM_MULT_R( msr, 28180 ); + msr = GSM_ADD(*s, tmp); /* Deemphasis */ + *s = GSM_ADD(msr, msr) & 0xFFF8; /* Truncation & Upscaling */ + } + S->msr = msr; +} + +void Gsm_Decoder P8((S,LARcr, Ncr,bcr,Mcr,xmaxcr,xMcr,s), + struct gsm_state * S, + + word * LARcr, /* [0..7] IN */ + + word * Ncr, /* [0..3] IN */ + word * bcr, /* [0..3] IN */ + word * Mcr, /* [0..3] IN */ + word * xmaxcr, /* [0..3] IN */ + word * xMcr, /* [0..13*4] IN */ + + word * s) /* [0..159] OUT */ +{ + int j, k; + word erp[40], wt[160]; + word * drp = S->dp0 + 120; + + for (j=0; j <= 3; j++, xmaxcr++, bcr++, Ncr++, Mcr++, xMcr += 13) { + + Gsm_RPE_Decoding( S, *xmaxcr, *Mcr, xMcr, erp ); + Gsm_Long_Term_Synthesis_Filtering( S, *Ncr, *bcr, erp, drp ); + + for (k = 0; k <= 39; k++) wt[ j * 40 + k ] = drp[ k ]; + } + + Gsm_Short_Term_Synthesis_Filter( S, LARcr, wt, s ); + Postprocessing(S, s); +} diff --git a/gsm/gsm.h b/gsm/gsm.h new file mode 100644 index 0000000000..81065e5129 --- /dev/null +++ b/gsm/gsm.h @@ -0,0 +1,71 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/*$Header$*/ + +#ifndef GSM_H +#define GSM_H + +#ifdef __cplusplus +# define NeedFunctionPrototypes 1 +#endif + +#if __STDC__ +# define NeedFunctionPrototypes 1 +#endif + +#ifdef _NO_PROTO +# undef NeedFunctionPrototypes +#endif + +#ifdef NeedFunctionPrototypes +# include <stdio.h> /* for FILE * */ +#endif + +#undef GSM_P +#if NeedFunctionPrototypes +# define GSM_P( protos ) protos +#else +# define GSM_P( protos ) ( /* protos */ ) +#endif + +/* + * Interface + */ + +typedef struct gsm_state * gsm; +typedef short gsm_signal; /* signed 16 bit */ +typedef unsigned char gsm_byte; +typedef gsm_byte gsm_frame[33]; /* 33 * 8 bits */ + +#define GSM_MAGIC 0xD /* 13 kbit/s RPE-LTP */ + +#define GSM_PATCHLEVEL 10 +#define GSM_MINOR 0 +#define GSM_MAJOR 1 + +#define GSM_OPT_VERBOSE 1 +#define GSM_OPT_FAST 2 +#define GSM_OPT_LTP_CUT 3 +#define GSM_OPT_WAV49 4 +#define GSM_OPT_FRAME_INDEX 5 +#define GSM_OPT_FRAME_CHAIN 6 + +extern gsm gsm_create GSM_P((void)); +extern void gsm_destroy GSM_P((gsm)); + +extern int gsm_print GSM_P((FILE *, gsm, gsm_byte *)); +extern int gsm_option GSM_P((gsm, int, int *)); + +extern void gsm_encode GSM_P((gsm, gsm_signal *, gsm_byte *)); +extern int gsm_decode GSM_P((gsm, gsm_byte *, gsm_signal *)); + +extern int gsm_explode GSM_P((gsm, gsm_byte *, gsm_signal *)); +extern void gsm_implode GSM_P((gsm, gsm_signal *, gsm_byte *)); + +#undef GSM_P + +#endif /* GSM_H */ diff --git a/gsm/gsm_create.c b/gsm/gsm_create.c new file mode 100644 index 0000000000..a59aa2f2a3 --- /dev/null +++ b/gsm/gsm_create.c @@ -0,0 +1,45 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +static char const ident[] = "$Header$"; + +#include "config.h" + +#ifdef HAS_STRING_H +#include <string.h> +#else +# include "proto.h" + extern char * memset P((char *, int, int)); +#endif + +#ifdef HAS_STDLIB_H +# include <stdlib.h> +#else +# ifdef HAS_MALLOC_H +# include <malloc.h> +# else + extern char * malloc(); +# endif +#endif + +#include <stdio.h> + +#include "gsm.h" +#include "private.h" +#include "proto.h" + +gsm gsm_create P0() +{ + gsm r; + + r = (gsm)malloc(sizeof(struct gsm_state)); + if (!r) return r; + + memset((char *)r, 0, sizeof(*r)); + r->nrp = 40; + + return r; +} diff --git a/gsm/gsm_decode.c b/gsm/gsm_decode.c new file mode 100644 index 0000000000..7318ba2d4d --- /dev/null +++ b/gsm/gsm_decode.c @@ -0,0 +1,361 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) +{ + word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; + +#ifdef WAV49 + if (s->wav_fmt) { + + uword sr = 0; + + s->frame_index = !s->frame_index; + if (s->frame_index) { + + sr = *c++; + LARc[0] = sr & 0x3f; sr >>= 6; + sr |= (uword)*c++ << 2; + LARc[1] = sr & 0x3f; sr >>= 6; + sr |= (uword)*c++ << 4; + LARc[2] = sr & 0x1f; sr >>= 5; + LARc[3] = sr & 0x1f; sr >>= 5; + sr |= (uword)*c++ << 2; + LARc[4] = sr & 0xf; sr >>= 4; + LARc[5] = sr & 0xf; sr >>= 4; + sr |= (uword)*c++ << 2; /* 5 */ + LARc[6] = sr & 0x7; sr >>= 3; + LARc[7] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[0] = sr & 0x7f; sr >>= 7; + bc[0] = sr & 0x3; sr >>= 2; + Mc[0] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[0] = sr & 0x3f; sr >>= 6; + xmc[0] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[1] = sr & 0x7; sr >>= 3; + xmc[2] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[3] = sr & 0x7; sr >>= 3; + xmc[4] = sr & 0x7; sr >>= 3; + xmc[5] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 10 */ + xmc[6] = sr & 0x7; sr >>= 3; + xmc[7] = sr & 0x7; sr >>= 3; + xmc[8] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[9] = sr & 0x7; sr >>= 3; + xmc[10] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[11] = sr & 0x7; sr >>= 3; + xmc[12] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[1] = sr & 0x7f; sr >>= 7; + bc[1] = sr & 0x3; sr >>= 2; + Mc[1] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[1] = sr & 0x3f; sr >>= 6; + xmc[13] = sr & 0x7; sr >>= 3; + sr = *c++; /* 15 */ + xmc[14] = sr & 0x7; sr >>= 3; + xmc[15] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[16] = sr & 0x7; sr >>= 3; + xmc[17] = sr & 0x7; sr >>= 3; + xmc[18] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[19] = sr & 0x7; sr >>= 3; + xmc[20] = sr & 0x7; sr >>= 3; + xmc[21] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[22] = sr & 0x7; sr >>= 3; + xmc[23] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[24] = sr & 0x7; sr >>= 3; + xmc[25] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; /* 20 */ + Nc[2] = sr & 0x7f; sr >>= 7; + bc[2] = sr & 0x3; sr >>= 2; + Mc[2] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[2] = sr & 0x3f; sr >>= 6; + xmc[26] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[27] = sr & 0x7; sr >>= 3; + xmc[28] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[29] = sr & 0x7; sr >>= 3; + xmc[30] = sr & 0x7; sr >>= 3; + xmc[31] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[32] = sr & 0x7; sr >>= 3; + xmc[33] = sr & 0x7; sr >>= 3; + xmc[34] = sr & 0x7; sr >>= 3; + sr = *c++; /* 25 */ + xmc[35] = sr & 0x7; sr >>= 3; + xmc[36] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[37] = sr & 0x7; sr >>= 3; + xmc[38] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[3] = sr & 0x7f; sr >>= 7; + bc[3] = sr & 0x3; sr >>= 2; + Mc[3] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[3] = sr & 0x3f; sr >>= 6; + xmc[39] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[40] = sr & 0x7; sr >>= 3; + xmc[41] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; /* 30 */ + xmc[42] = sr & 0x7; sr >>= 3; + xmc[43] = sr & 0x7; sr >>= 3; + xmc[44] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[45] = sr & 0x7; sr >>= 3; + xmc[46] = sr & 0x7; sr >>= 3; + xmc[47] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[48] = sr & 0x7; sr >>= 3; + xmc[49] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[50] = sr & 0x7; sr >>= 3; + xmc[51] = sr & 0x7; sr >>= 3; + + s->frame_chain = sr & 0xf; + } + else { + sr = s->frame_chain; + sr |= (uword)*c++ << 4; /* 1 */ + LARc[0] = sr & 0x3f; sr >>= 6; + LARc[1] = sr & 0x3f; sr >>= 6; + sr = *c++; + LARc[2] = sr & 0x1f; sr >>= 5; + sr |= (uword)*c++ << 3; + LARc[3] = sr & 0x1f; sr >>= 5; + LARc[4] = sr & 0xf; sr >>= 4; + sr |= (uword)*c++ << 2; + LARc[5] = sr & 0xf; sr >>= 4; + LARc[6] = sr & 0x7; sr >>= 3; + LARc[7] = sr & 0x7; sr >>= 3; + sr = *c++; /* 5 */ + Nc[0] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[0] = sr & 0x3; sr >>= 2; + Mc[0] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[0] = sr & 0x3f; sr >>= 6; + xmc[0] = sr & 0x7; sr >>= 3; + xmc[1] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[2] = sr & 0x7; sr >>= 3; + xmc[3] = sr & 0x7; sr >>= 3; + xmc[4] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[5] = sr & 0x7; sr >>= 3; + xmc[6] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; /* 10 */ + xmc[7] = sr & 0x7; sr >>= 3; + xmc[8] = sr & 0x7; sr >>= 3; + xmc[9] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[10] = sr & 0x7; sr >>= 3; + xmc[11] = sr & 0x7; sr >>= 3; + xmc[12] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[1] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[1] = sr & 0x3; sr >>= 2; + Mc[1] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[1] = sr & 0x3f; sr >>= 6; + xmc[13] = sr & 0x7; sr >>= 3; + xmc[14] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 15 */ + xmc[15] = sr & 0x7; sr >>= 3; + xmc[16] = sr & 0x7; sr >>= 3; + xmc[17] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[18] = sr & 0x7; sr >>= 3; + xmc[19] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[20] = sr & 0x7; sr >>= 3; + xmc[21] = sr & 0x7; sr >>= 3; + xmc[22] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[23] = sr & 0x7; sr >>= 3; + xmc[24] = sr & 0x7; sr >>= 3; + xmc[25] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[2] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; /* 20 */ + bc[2] = sr & 0x3; sr >>= 2; + Mc[2] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[2] = sr & 0x3f; sr >>= 6; + xmc[26] = sr & 0x7; sr >>= 3; + xmc[27] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[28] = sr & 0x7; sr >>= 3; + xmc[29] = sr & 0x7; sr >>= 3; + xmc[30] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[31] = sr & 0x7; sr >>= 3; + xmc[32] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[33] = sr & 0x7; sr >>= 3; + xmc[34] = sr & 0x7; sr >>= 3; + xmc[35] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 25 */ + xmc[36] = sr & 0x7; sr >>= 3; + xmc[37] = sr & 0x7; sr >>= 3; + xmc[38] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[3] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[3] = sr & 0x3; sr >>= 2; + Mc[3] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[3] = sr & 0x3f; sr >>= 6; + xmc[39] = sr & 0x7; sr >>= 3; + xmc[40] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[41] = sr & 0x7; sr >>= 3; + xmc[42] = sr & 0x7; sr >>= 3; + xmc[43] = sr & 0x7; sr >>= 3; + sr = *c++; /* 30 */ + xmc[44] = sr & 0x7; sr >>= 3; + xmc[45] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[46] = sr & 0x7; sr >>= 3; + xmc[47] = sr & 0x7; sr >>= 3; + xmc[48] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[49] = sr & 0x7; sr >>= 3; + xmc[50] = sr & 0x7; sr >>= 3; + xmc[51] = sr & 0x7; sr >>= 3; + } + } + else +#endif + { + /* GSM_MAGIC = (*c >> 4) & 0xF; */ + + if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; + + LARc[0] = (*c++ & 0xF) << 2; /* 1 */ + LARc[0] |= (*c >> 6) & 0x3; + LARc[1] = *c++ & 0x3F; + LARc[2] = (*c >> 3) & 0x1F; + LARc[3] = (*c++ & 0x7) << 2; + LARc[3] |= (*c >> 6) & 0x3; + LARc[4] = (*c >> 2) & 0xF; + LARc[5] = (*c++ & 0x3) << 2; + LARc[5] |= (*c >> 6) & 0x3; + LARc[6] = (*c >> 3) & 0x7; + LARc[7] = *c++ & 0x7; + Nc[0] = (*c >> 1) & 0x7F; + bc[0] = (*c++ & 0x1) << 1; + bc[0] |= (*c >> 7) & 0x1; + Mc[0] = (*c >> 5) & 0x3; + xmaxc[0] = (*c++ & 0x1F) << 1; + xmaxc[0] |= (*c >> 7) & 0x1; + xmc[0] = (*c >> 4) & 0x7; + xmc[1] = (*c >> 1) & 0x7; + xmc[2] = (*c++ & 0x1) << 2; + xmc[2] |= (*c >> 6) & 0x3; + xmc[3] = (*c >> 3) & 0x7; + xmc[4] = *c++ & 0x7; + xmc[5] = (*c >> 5) & 0x7; + xmc[6] = (*c >> 2) & 0x7; + xmc[7] = (*c++ & 0x3) << 1; /* 10 */ + xmc[7] |= (*c >> 7) & 0x1; + xmc[8] = (*c >> 4) & 0x7; + xmc[9] = (*c >> 1) & 0x7; + xmc[10] = (*c++ & 0x1) << 2; + xmc[10] |= (*c >> 6) & 0x3; + xmc[11] = (*c >> 3) & 0x7; + xmc[12] = *c++ & 0x7; + Nc[1] = (*c >> 1) & 0x7F; + bc[1] = (*c++ & 0x1) << 1; + bc[1] |= (*c >> 7) & 0x1; + Mc[1] = (*c >> 5) & 0x3; + xmaxc[1] = (*c++ & 0x1F) << 1; + xmaxc[1] |= (*c >> 7) & 0x1; + xmc[13] = (*c >> 4) & 0x7; + xmc[14] = (*c >> 1) & 0x7; + xmc[15] = (*c++ & 0x1) << 2; + xmc[15] |= (*c >> 6) & 0x3; + xmc[16] = (*c >> 3) & 0x7; + xmc[17] = *c++ & 0x7; + xmc[18] = (*c >> 5) & 0x7; + xmc[19] = (*c >> 2) & 0x7; + xmc[20] = (*c++ & 0x3) << 1; + xmc[20] |= (*c >> 7) & 0x1; + xmc[21] = (*c >> 4) & 0x7; + xmc[22] = (*c >> 1) & 0x7; + xmc[23] = (*c++ & 0x1) << 2; + xmc[23] |= (*c >> 6) & 0x3; + xmc[24] = (*c >> 3) & 0x7; + xmc[25] = *c++ & 0x7; + Nc[2] = (*c >> 1) & 0x7F; + bc[2] = (*c++ & 0x1) << 1; /* 20 */ + bc[2] |= (*c >> 7) & 0x1; + Mc[2] = (*c >> 5) & 0x3; + xmaxc[2] = (*c++ & 0x1F) << 1; + xmaxc[2] |= (*c >> 7) & 0x1; + xmc[26] = (*c >> 4) & 0x7; + xmc[27] = (*c >> 1) & 0x7; + xmc[28] = (*c++ & 0x1) << 2; + xmc[28] |= (*c >> 6) & 0x3; + xmc[29] = (*c >> 3) & 0x7; + xmc[30] = *c++ & 0x7; + xmc[31] = (*c >> 5) & 0x7; + xmc[32] = (*c >> 2) & 0x7; + xmc[33] = (*c++ & 0x3) << 1; + xmc[33] |= (*c >> 7) & 0x1; + xmc[34] = (*c >> 4) & 0x7; + xmc[35] = (*c >> 1) & 0x7; + xmc[36] = (*c++ & 0x1) << 2; + xmc[36] |= (*c >> 6) & 0x3; + xmc[37] = (*c >> 3) & 0x7; + xmc[38] = *c++ & 0x7; + Nc[3] = (*c >> 1) & 0x7F; + bc[3] = (*c++ & 0x1) << 1; + bc[3] |= (*c >> 7) & 0x1; + Mc[3] = (*c >> 5) & 0x3; + xmaxc[3] = (*c++ & 0x1F) << 1; + xmaxc[3] |= (*c >> 7) & 0x1; + xmc[39] = (*c >> 4) & 0x7; + xmc[40] = (*c >> 1) & 0x7; + xmc[41] = (*c++ & 0x1) << 2; + xmc[41] |= (*c >> 6) & 0x3; + xmc[42] = (*c >> 3) & 0x7; + xmc[43] = *c++ & 0x7; /* 30 */ + xmc[44] = (*c >> 5) & 0x7; + xmc[45] = (*c >> 2) & 0x7; + xmc[46] = (*c++ & 0x3) << 1; + xmc[46] |= (*c >> 7) & 0x1; + xmc[47] = (*c >> 4) & 0x7; + xmc[48] = (*c >> 1) & 0x7; + xmc[49] = (*c++ & 0x1) << 2; + xmc[49] |= (*c >> 6) & 0x3; + xmc[50] = (*c >> 3) & 0x7; + xmc[51] = *c & 0x7; /* 33 */ + } + + Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target); + + return 0; +} diff --git a/gsm/gsm_destroy.c b/gsm/gsm_destroy.c new file mode 100644 index 0000000000..4807c0acdd --- /dev/null +++ b/gsm/gsm_destroy.c @@ -0,0 +1,26 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "gsm.h" +#include "config.h" +#include "proto.h" + +#ifdef HAS_STDLIB_H +# include <stdlib.h> +#else +# ifdef HAS_MALLOC_H +# include <malloc.h> +# else + extern void free(); +# endif +#endif + +void gsm_destroy P1((S), gsm S) +{ + if (S) free((char *)S); +} diff --git a/gsm/gsm_encode.c b/gsm/gsm_encode.c new file mode 100644 index 0000000000..62338300ee --- /dev/null +++ b/gsm/gsm_encode.c @@ -0,0 +1,451 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "private.h" +#include "gsm.h" +#include "proto.h" + +void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) +{ + word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; + + Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); + + + /* variable size + + GSM_MAGIC 4 + + LARc[0] 6 + LARc[1] 6 + LARc[2] 5 + LARc[3] 5 + LARc[4] 4 + LARc[5] 4 + LARc[6] 3 + LARc[7] 3 + + Nc[0] 7 + bc[0] 2 + Mc[0] 2 + xmaxc[0] 6 + xmc[0] 3 + xmc[1] 3 + xmc[2] 3 + xmc[3] 3 + xmc[4] 3 + xmc[5] 3 + xmc[6] 3 + xmc[7] 3 + xmc[8] 3 + xmc[9] 3 + xmc[10] 3 + xmc[11] 3 + xmc[12] 3 + + Nc[1] 7 + bc[1] 2 + Mc[1] 2 + xmaxc[1] 6 + xmc[13] 3 + xmc[14] 3 + xmc[15] 3 + xmc[16] 3 + xmc[17] 3 + xmc[18] 3 + xmc[19] 3 + xmc[20] 3 + xmc[21] 3 + xmc[22] 3 + xmc[23] 3 + xmc[24] 3 + xmc[25] 3 + + Nc[2] 7 + bc[2] 2 + Mc[2] 2 + xmaxc[2] 6 + xmc[26] 3 + xmc[27] 3 + xmc[28] 3 + xmc[29] 3 + xmc[30] 3 + xmc[31] 3 + xmc[32] 3 + xmc[33] 3 + xmc[34] 3 + xmc[35] 3 + xmc[36] 3 + xmc[37] 3 + xmc[38] 3 + + Nc[3] 7 + bc[3] 2 + Mc[3] 2 + xmaxc[3] 6 + xmc[39] 3 + xmc[40] 3 + xmc[41] 3 + xmc[42] 3 + xmc[43] 3 + xmc[44] 3 + xmc[45] 3 + xmc[46] 3 + xmc[47] 3 + xmc[48] 3 + xmc[49] 3 + xmc[50] 3 + xmc[51] 3 + */ + +#ifdef WAV49 + + if (s->wav_fmt) { + s->frame_index = !s->frame_index; + if (s->frame_index) { + + uword sr; + + sr = 0; + sr = sr >> 6 | LARc[0] << 10; + sr = sr >> 6 | LARc[1] << 10; + *c++ = sr >> 4; + sr = sr >> 5 | LARc[2] << 11; + *c++ = sr >> 7; + sr = sr >> 5 | LARc[3] << 11; + sr = sr >> 4 | LARc[4] << 12; + *c++ = sr >> 6; + sr = sr >> 4 | LARc[5] << 12; + sr = sr >> 3 | LARc[6] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | LARc[7] << 13; + sr = sr >> 7 | Nc[0] << 9; + *c++ = sr >> 5; + sr = sr >> 2 | bc[0] << 14; + sr = sr >> 2 | Mc[0] << 14; + sr = sr >> 6 | xmaxc[0] << 10; + *c++ = sr >> 3; + sr = sr >> 3 | xmc[0] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[1] << 13; + sr = sr >> 3 | xmc[2] << 13; + sr = sr >> 3 | xmc[3] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[4] << 13; + sr = sr >> 3 | xmc[5] << 13; + sr = sr >> 3 | xmc[6] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[7] << 13; + sr = sr >> 3 | xmc[8] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[9] << 13; + sr = sr >> 3 | xmc[10] << 13; + sr = sr >> 3 | xmc[11] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[12] << 13; + sr = sr >> 7 | Nc[1] << 9; + *c++ = sr >> 5; + sr = sr >> 2 | bc[1] << 14; + sr = sr >> 2 | Mc[1] << 14; + sr = sr >> 6 | xmaxc[1] << 10; + *c++ = sr >> 3; + sr = sr >> 3 | xmc[13] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[14] << 13; + sr = sr >> 3 | xmc[15] << 13; + sr = sr >> 3 | xmc[16] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[17] << 13; + sr = sr >> 3 | xmc[18] << 13; + sr = sr >> 3 | xmc[19] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[20] << 13; + sr = sr >> 3 | xmc[21] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[22] << 13; + sr = sr >> 3 | xmc[23] << 13; + sr = sr >> 3 | xmc[24] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[25] << 13; + sr = sr >> 7 | Nc[2] << 9; + *c++ = sr >> 5; + sr = sr >> 2 | bc[2] << 14; + sr = sr >> 2 | Mc[2] << 14; + sr = sr >> 6 | xmaxc[2] << 10; + *c++ = sr >> 3; + sr = sr >> 3 | xmc[26] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[27] << 13; + sr = sr >> 3 | xmc[28] << 13; + sr = sr >> 3 | xmc[29] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[30] << 13; + sr = sr >> 3 | xmc[31] << 13; + sr = sr >> 3 | xmc[32] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[33] << 13; + sr = sr >> 3 | xmc[34] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[35] << 13; + sr = sr >> 3 | xmc[36] << 13; + sr = sr >> 3 | xmc[37] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[38] << 13; + sr = sr >> 7 | Nc[3] << 9; + *c++ = sr >> 5; + sr = sr >> 2 | bc[3] << 14; + sr = sr >> 2 | Mc[3] << 14; + sr = sr >> 6 | xmaxc[3] << 10; + *c++ = sr >> 3; + sr = sr >> 3 | xmc[39] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[40] << 13; + sr = sr >> 3 | xmc[41] << 13; + sr = sr >> 3 | xmc[42] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[43] << 13; + sr = sr >> 3 | xmc[44] << 13; + sr = sr >> 3 | xmc[45] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[46] << 13; + sr = sr >> 3 | xmc[47] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[48] << 13; + sr = sr >> 3 | xmc[49] << 13; + sr = sr >> 3 | xmc[50] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[51] << 13; + sr = sr >> 4; + *c = sr >> 8; + s->frame_chain = *c; + } + else { + uword sr; + + sr = 0; + sr = sr >> 4 | s->frame_chain << 12; + sr = sr >> 6 | LARc[0] << 10; + *c++ = sr >> 6; + sr = sr >> 6 | LARc[1] << 10; + *c++ = sr >> 8; + sr = sr >> 5 | LARc[2] << 11; + sr = sr >> 5 | LARc[3] << 11; + *c++ = sr >> 6; + sr = sr >> 4 | LARc[4] << 12; + sr = sr >> 4 | LARc[5] << 12; + *c++ = sr >> 6; + sr = sr >> 3 | LARc[6] << 13; + sr = sr >> 3 | LARc[7] << 13; + *c++ = sr >> 8; + sr = sr >> 7 | Nc[0] << 9; + sr = sr >> 2 | bc[0] << 14; + *c++ = sr >> 7; + sr = sr >> 2 | Mc[0] << 14; + sr = sr >> 6 | xmaxc[0] << 10; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[0] << 13; + sr = sr >> 3 | xmc[1] << 13; + sr = sr >> 3 | xmc[2] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[3] << 13; + sr = sr >> 3 | xmc[4] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[5] << 13; + sr = sr >> 3 | xmc[6] << 13; + sr = sr >> 3 | xmc[7] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[8] << 13; + sr = sr >> 3 | xmc[9] << 13; + sr = sr >> 3 | xmc[10] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[11] << 13; + sr = sr >> 3 | xmc[12] << 13; + *c++ = sr >> 8; + sr = sr >> 7 | Nc[1] << 9; + sr = sr >> 2 | bc[1] << 14; + *c++ = sr >> 7; + sr = sr >> 2 | Mc[1] << 14; + sr = sr >> 6 | xmaxc[1] << 10; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[13] << 13; + sr = sr >> 3 | xmc[14] << 13; + sr = sr >> 3 | xmc[15] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[16] << 13; + sr = sr >> 3 | xmc[17] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[18] << 13; + sr = sr >> 3 | xmc[19] << 13; + sr = sr >> 3 | xmc[20] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[21] << 13; + sr = sr >> 3 | xmc[22] << 13; + sr = sr >> 3 | xmc[23] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[24] << 13; + sr = sr >> 3 | xmc[25] << 13; + *c++ = sr >> 8; + sr = sr >> 7 | Nc[2] << 9; + sr = sr >> 2 | bc[2] << 14; + *c++ = sr >> 7; + sr = sr >> 2 | Mc[2] << 14; + sr = sr >> 6 | xmaxc[2] << 10; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[26] << 13; + sr = sr >> 3 | xmc[27] << 13; + sr = sr >> 3 | xmc[28] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[29] << 13; + sr = sr >> 3 | xmc[30] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[31] << 13; + sr = sr >> 3 | xmc[32] << 13; + sr = sr >> 3 | xmc[33] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[34] << 13; + sr = sr >> 3 | xmc[35] << 13; + sr = sr >> 3 | xmc[36] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[37] << 13; + sr = sr >> 3 | xmc[38] << 13; + *c++ = sr >> 8; + sr = sr >> 7 | Nc[3] << 9; + sr = sr >> 2 | bc[3] << 14; + *c++ = sr >> 7; + sr = sr >> 2 | Mc[3] << 14; + sr = sr >> 6 | xmaxc[3] << 10; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[39] << 13; + sr = sr >> 3 | xmc[40] << 13; + sr = sr >> 3 | xmc[41] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[42] << 13; + sr = sr >> 3 | xmc[43] << 13; + *c++ = sr >> 8; + sr = sr >> 3 | xmc[44] << 13; + sr = sr >> 3 | xmc[45] << 13; + sr = sr >> 3 | xmc[46] << 13; + *c++ = sr >> 7; + sr = sr >> 3 | xmc[47] << 13; + sr = sr >> 3 | xmc[48] << 13; + sr = sr >> 3 | xmc[49] << 13; + *c++ = sr >> 6; + sr = sr >> 3 | xmc[50] << 13; + sr = sr >> 3 | xmc[51] << 13; + *c++ = sr >> 8; + } + } + + else + +#endif /* WAV49 */ + { + + *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ + | ((LARc[0] >> 2) & 0xF); + *c++ = ((LARc[0] & 0x3) << 6) + | (LARc[1] & 0x3F); + *c++ = ((LARc[2] & 0x1F) << 3) + | ((LARc[3] >> 2) & 0x7); + *c++ = ((LARc[3] & 0x3) << 6) + | ((LARc[4] & 0xF) << 2) + | ((LARc[5] >> 2) & 0x3); + *c++ = ((LARc[5] & 0x3) << 6) + | ((LARc[6] & 0x7) << 3) + | (LARc[7] & 0x7); + *c++ = ((Nc[0] & 0x7F) << 1) + | ((bc[0] >> 1) & 0x1); + *c++ = ((bc[0] & 0x1) << 7) + | ((Mc[0] & 0x3) << 5) + | ((xmaxc[0] >> 1) & 0x1F); + *c++ = ((xmaxc[0] & 0x1) << 7) + | ((xmc[0] & 0x7) << 4) + | ((xmc[1] & 0x7) << 1) + | ((xmc[2] >> 2) & 0x1); + *c++ = ((xmc[2] & 0x3) << 6) + | ((xmc[3] & 0x7) << 3) + | (xmc[4] & 0x7); + *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ + | ((xmc[6] & 0x7) << 2) + | ((xmc[7] >> 1) & 0x3); + *c++ = ((xmc[7] & 0x1) << 7) + | ((xmc[8] & 0x7) << 4) + | ((xmc[9] & 0x7) << 1) + | ((xmc[10] >> 2) & 0x1); + *c++ = ((xmc[10] & 0x3) << 6) + | ((xmc[11] & 0x7) << 3) + | (xmc[12] & 0x7); + *c++ = ((Nc[1] & 0x7F) << 1) + | ((bc[1] >> 1) & 0x1); + *c++ = ((bc[1] & 0x1) << 7) + | ((Mc[1] & 0x3) << 5) + | ((xmaxc[1] >> 1) & 0x1F); + *c++ = ((xmaxc[1] & 0x1) << 7) + | ((xmc[13] & 0x7) << 4) + | ((xmc[14] & 0x7) << 1) + | ((xmc[15] >> 2) & 0x1); + *c++ = ((xmc[15] & 0x3) << 6) + | ((xmc[16] & 0x7) << 3) + | (xmc[17] & 0x7); + *c++ = ((xmc[18] & 0x7) << 5) + | ((xmc[19] & 0x7) << 2) + | ((xmc[20] >> 1) & 0x3); + *c++ = ((xmc[20] & 0x1) << 7) + | ((xmc[21] & 0x7) << 4) + | ((xmc[22] & 0x7) << 1) + | ((xmc[23] >> 2) & 0x1); + *c++ = ((xmc[23] & 0x3) << 6) + | ((xmc[24] & 0x7) << 3) + | (xmc[25] & 0x7); + *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ + | ((bc[2] >> 1) & 0x1); + *c++ = ((bc[2] & 0x1) << 7) + | ((Mc[2] & 0x3) << 5) + | ((xmaxc[2] >> 1) & 0x1F); + *c++ = ((xmaxc[2] & 0x1) << 7) + | ((xmc[26] & 0x7) << 4) + | ((xmc[27] & 0x7) << 1) + | ((xmc[28] >> 2) & 0x1); + *c++ = ((xmc[28] & 0x3) << 6) + | ((xmc[29] & 0x7) << 3) + | (xmc[30] & 0x7); + *c++ = ((xmc[31] & 0x7) << 5) + | ((xmc[32] & 0x7) << 2) + | ((xmc[33] >> 1) & 0x3); + *c++ = ((xmc[33] & 0x1) << 7) + | ((xmc[34] & 0x7) << 4) + | ((xmc[35] & 0x7) << 1) + | ((xmc[36] >> 2) & 0x1); + *c++ = ((xmc[36] & 0x3) << 6) + | ((xmc[37] & 0x7) << 3) + | (xmc[38] & 0x7); + *c++ = ((Nc[3] & 0x7F) << 1) + | ((bc[3] >> 1) & 0x1); + *c++ = ((bc[3] & 0x1) << 7) + | ((Mc[3] & 0x3) << 5) + | ((xmaxc[3] >> 1) & 0x1F); + *c++ = ((xmaxc[3] & 0x1) << 7) + | ((xmc[39] & 0x7) << 4) + | ((xmc[40] & 0x7) << 1) + | ((xmc[41] >> 2) & 0x1); + *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ + | ((xmc[42] & 0x7) << 3) + | (xmc[43] & 0x7); + *c++ = ((xmc[44] & 0x7) << 5) + | ((xmc[45] & 0x7) << 2) + | ((xmc[46] >> 1) & 0x3); + *c++ = ((xmc[46] & 0x1) << 7) + | ((xmc[47] & 0x7) << 4) + | ((xmc[48] & 0x7) << 1) + | ((xmc[49] >> 2) & 0x1); + *c++ = ((xmc[49] & 0x3) << 6) + | ((xmc[50] & 0x7) << 3) + | (xmc[51] & 0x7); + + } +} diff --git a/gsm/gsm_explode.c b/gsm/gsm_explode.c new file mode 100644 index 0000000000..a906fc2ed8 --- /dev/null +++ b/gsm/gsm_explode.c @@ -0,0 +1,417 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "private.h" +#include "gsm.h" +#include "proto.h" + +int gsm_explode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) +{ +# define LARc target +# define Nc *((gsm_signal (*) [17])(target + 8)) +# define bc *((gsm_signal (*) [17])(target + 9)) +# define Mc *((gsm_signal (*) [17])(target + 10)) +# define xmaxc *((gsm_signal (*) [17])(target + 11)) + + +#ifdef WAV49 + if (s->wav_fmt) { + + uword sr = 0; + + if (s->frame_index == 1) { + + sr = *c++; + LARc[0] = sr & 0x3f; sr >>= 6; + sr |= (uword)*c++ << 2; + LARc[1] = sr & 0x3f; sr >>= 6; + sr |= (uword)*c++ << 4; + LARc[2] = sr & 0x1f; sr >>= 5; + LARc[3] = sr & 0x1f; sr >>= 5; + sr |= (uword)*c++ << 2; + LARc[4] = sr & 0xf; sr >>= 4; + LARc[5] = sr & 0xf; sr >>= 4; + sr |= (uword)*c++ << 2; /* 5 */ + LARc[6] = sr & 0x7; sr >>= 3; + LARc[7] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[0] = sr & 0x7f; sr >>= 7; + bc[0] = sr & 0x3; sr >>= 2; + Mc[0] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[0] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (target + 12) + xmc[0] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[1] = sr & 0x7; sr >>= 3; + xmc[2] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[3] = sr & 0x7; sr >>= 3; + xmc[4] = sr & 0x7; sr >>= 3; + xmc[5] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 10 */ + xmc[6] = sr & 0x7; sr >>= 3; + xmc[7] = sr & 0x7; sr >>= 3; + xmc[8] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[9] = sr & 0x7; sr >>= 3; + xmc[10] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[11] = sr & 0x7; sr >>= 3; + xmc[12] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[1] = sr & 0x7f; sr >>= 7; + bc[1] = sr & 0x3; sr >>= 2; + Mc[1] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[1] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (target + 29 - 13) + + xmc[13] = sr & 0x7; sr >>= 3; + sr = *c++; /* 15 */ + xmc[14] = sr & 0x7; sr >>= 3; + xmc[15] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[16] = sr & 0x7; sr >>= 3; + xmc[17] = sr & 0x7; sr >>= 3; + xmc[18] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[19] = sr & 0x7; sr >>= 3; + xmc[20] = sr & 0x7; sr >>= 3; + xmc[21] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[22] = sr & 0x7; sr >>= 3; + xmc[23] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[24] = sr & 0x7; sr >>= 3; + xmc[25] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; /* 20 */ + Nc[2] = sr & 0x7f; sr >>= 7; + bc[2] = sr & 0x3; sr >>= 2; + Mc[2] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[2] = sr & 0x3f; sr >>= 6; + +#undef xmc +#define xmc (target + 46 - 26) + + xmc[26] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[27] = sr & 0x7; sr >>= 3; + xmc[28] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[29] = sr & 0x7; sr >>= 3; + xmc[30] = sr & 0x7; sr >>= 3; + xmc[31] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[32] = sr & 0x7; sr >>= 3; + xmc[33] = sr & 0x7; sr >>= 3; + xmc[34] = sr & 0x7; sr >>= 3; + sr = *c++; /* 25 */ + xmc[35] = sr & 0x7; sr >>= 3; + xmc[36] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[37] = sr & 0x7; sr >>= 3; + xmc[38] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[3] = sr & 0x7f; sr >>= 7; + bc[3] = sr & 0x3; sr >>= 2; + Mc[3] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[3] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (target + 63 - 39) + + xmc[39] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[40] = sr & 0x7; sr >>= 3; + xmc[41] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; /* 30 */ + xmc[42] = sr & 0x7; sr >>= 3; + xmc[43] = sr & 0x7; sr >>= 3; + xmc[44] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[45] = sr & 0x7; sr >>= 3; + xmc[46] = sr & 0x7; sr >>= 3; + xmc[47] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[48] = sr & 0x7; sr >>= 3; + xmc[49] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[50] = sr & 0x7; sr >>= 3; + xmc[51] = sr & 0x7; sr >>= 3; + + s->frame_chain = sr & 0xf; + } + else { + sr = s->frame_chain; + sr |= (uword)*c++ << 4; /* 1 */ + LARc[0] = sr & 0x3f; sr >>= 6; + LARc[1] = sr & 0x3f; sr >>= 6; + sr = *c++; + LARc[2] = sr & 0x1f; sr >>= 5; + sr |= (uword)*c++ << 3; + LARc[3] = sr & 0x1f; sr >>= 5; + LARc[4] = sr & 0xf; sr >>= 4; + sr |= (uword)*c++ << 2; + LARc[5] = sr & 0xf; sr >>= 4; + LARc[6] = sr & 0x7; sr >>= 3; + LARc[7] = sr & 0x7; sr >>= 3; + sr = *c++; /* 5 */ + Nc[0] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[0] = sr & 0x3; sr >>= 2; + Mc[0] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[0] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (target + 12) + xmc[0] = sr & 0x7; sr >>= 3; + xmc[1] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[2] = sr & 0x7; sr >>= 3; + xmc[3] = sr & 0x7; sr >>= 3; + xmc[4] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[5] = sr & 0x7; sr >>= 3; + xmc[6] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; /* 10 */ + xmc[7] = sr & 0x7; sr >>= 3; + xmc[8] = sr & 0x7; sr >>= 3; + xmc[9] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[10] = sr & 0x7; sr >>= 3; + xmc[11] = sr & 0x7; sr >>= 3; + xmc[12] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[1] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[1] = sr & 0x3; sr >>= 2; + Mc[1] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[1] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (target + 29 - 13) + + xmc[13] = sr & 0x7; sr >>= 3; + xmc[14] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 15 */ + xmc[15] = sr & 0x7; sr >>= 3; + xmc[16] = sr & 0x7; sr >>= 3; + xmc[17] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[18] = sr & 0x7; sr >>= 3; + xmc[19] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[20] = sr & 0x7; sr >>= 3; + xmc[21] = sr & 0x7; sr >>= 3; + xmc[22] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[23] = sr & 0x7; sr >>= 3; + xmc[24] = sr & 0x7; sr >>= 3; + xmc[25] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[2] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; /* 20 */ + bc[2] = sr & 0x3; sr >>= 2; + Mc[2] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[2] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (target + 46 - 26) + xmc[26] = sr & 0x7; sr >>= 3; + xmc[27] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[28] = sr & 0x7; sr >>= 3; + xmc[29] = sr & 0x7; sr >>= 3; + xmc[30] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[31] = sr & 0x7; sr >>= 3; + xmc[32] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[33] = sr & 0x7; sr >>= 3; + xmc[34] = sr & 0x7; sr >>= 3; + xmc[35] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 25 */ + xmc[36] = sr & 0x7; sr >>= 3; + xmc[37] = sr & 0x7; sr >>= 3; + xmc[38] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[3] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[3] = sr & 0x3; sr >>= 2; + Mc[3] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[3] = sr & 0x3f; sr >>= 6; + +#undef xmc +#define xmc (target + 63 - 39) + + xmc[39] = sr & 0x7; sr >>= 3; + xmc[40] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[41] = sr & 0x7; sr >>= 3; + xmc[42] = sr & 0x7; sr >>= 3; + xmc[43] = sr & 0x7; sr >>= 3; + sr = *c++; /* 30 */ + xmc[44] = sr & 0x7; sr >>= 3; + xmc[45] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[46] = sr & 0x7; sr >>= 3; + xmc[47] = sr & 0x7; sr >>= 3; + xmc[48] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[49] = sr & 0x7; sr >>= 3; + xmc[50] = sr & 0x7; sr >>= 3; + xmc[51] = sr & 0x7; sr >>= 3; + } + } + else +#endif + { + /* GSM_MAGIC = (*c >> 4) & 0xF; */ + + if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; + + LARc[0] = (*c++ & 0xF) << 2; /* 1 */ + LARc[0] |= (*c >> 6) & 0x3; + LARc[1] = *c++ & 0x3F; + LARc[2] = (*c >> 3) & 0x1F; + LARc[3] = (*c++ & 0x7) << 2; + LARc[3] |= (*c >> 6) & 0x3; + LARc[4] = (*c >> 2) & 0xF; + LARc[5] = (*c++ & 0x3) << 2; + LARc[5] |= (*c >> 6) & 0x3; + LARc[6] = (*c >> 3) & 0x7; + LARc[7] = *c++ & 0x7; + + Nc[0] = (*c >> 1) & 0x7F; + + bc[0] = (*c++ & 0x1) << 1; + bc[0] |= (*c >> 7) & 0x1; + + Mc[0] = (*c >> 5) & 0x3; + + xmaxc[0] = (*c++ & 0x1F) << 1; + xmaxc[0] |= (*c >> 7) & 0x1; + +#undef xmc +#define xmc (target + 12) + + xmc[0] = (*c >> 4) & 0x7; + xmc[1] = (*c >> 1) & 0x7; + xmc[2] = (*c++ & 0x1) << 2; + xmc[2] |= (*c >> 6) & 0x3; + xmc[3] = (*c >> 3) & 0x7; + xmc[4] = *c++ & 0x7; + xmc[5] = (*c >> 5) & 0x7; + xmc[6] = (*c >> 2) & 0x7; + xmc[7] = (*c++ & 0x3) << 1; /* 10 */ + xmc[7] |= (*c >> 7) & 0x1; + xmc[8] = (*c >> 4) & 0x7; + xmc[9] = (*c >> 1) & 0x7; + xmc[10] = (*c++ & 0x1) << 2; + xmc[10] |= (*c >> 6) & 0x3; + xmc[11] = (*c >> 3) & 0x7; + xmc[12] = *c++ & 0x7; + + Nc[1] = (*c >> 1) & 0x7F; + + bc[1] = (*c++ & 0x1) << 1; + bc[1] |= (*c >> 7) & 0x1; + + Mc[1] = (*c >> 5) & 0x3; + + xmaxc[1] = (*c++ & 0x1F) << 1; + xmaxc[1] |= (*c >> 7) & 0x1; + +#undef xmc +#define xmc (target + 29 - 13) + + xmc[13] = (*c >> 4) & 0x7; + xmc[14] = (*c >> 1) & 0x7; + xmc[15] = (*c++ & 0x1) << 2; + xmc[15] |= (*c >> 6) & 0x3; + xmc[16] = (*c >> 3) & 0x7; + xmc[17] = *c++ & 0x7; + xmc[18] = (*c >> 5) & 0x7; + xmc[19] = (*c >> 2) & 0x7; + xmc[20] = (*c++ & 0x3) << 1; + xmc[20] |= (*c >> 7) & 0x1; + xmc[21] = (*c >> 4) & 0x7; + xmc[22] = (*c >> 1) & 0x7; + xmc[23] = (*c++ & 0x1) << 2; + xmc[23] |= (*c >> 6) & 0x3; + xmc[24] = (*c >> 3) & 0x7; + xmc[25] = *c++ & 0x7; + + Nc[2] = (*c >> 1) & 0x7F; + + bc[2] = (*c++ & 0x1) << 1; /* 20 */ + bc[2] |= (*c >> 7) & 0x1; + + Mc[2] = (*c >> 5) & 0x3; + + xmaxc[2] = (*c++ & 0x1F) << 1; + xmaxc[2] |= (*c >> 7) & 0x1; + +#undef xmc +#define xmc (target + 46 - 26) + + xmc[26] = (*c >> 4) & 0x7; + xmc[27] = (*c >> 1) & 0x7; + xmc[28] = (*c++ & 0x1) << 2; + xmc[28] |= (*c >> 6) & 0x3; + xmc[29] = (*c >> 3) & 0x7; + xmc[30] = *c++ & 0x7; + xmc[31] = (*c >> 5) & 0x7; + xmc[32] = (*c >> 2) & 0x7; + xmc[33] = (*c++ & 0x3) << 1; + xmc[33] |= (*c >> 7) & 0x1; + xmc[34] = (*c >> 4) & 0x7; + xmc[35] = (*c >> 1) & 0x7; + xmc[36] = (*c++ & 0x1) << 2; + xmc[36] |= (*c >> 6) & 0x3; + xmc[37] = (*c >> 3) & 0x7; + xmc[38] = *c++ & 0x7; + + Nc[3] = (*c >> 1) & 0x7F; + + bc[3] = (*c++ & 0x1) << 1; + bc[3] |= (*c >> 7) & 0x1; + + Mc[3] = (*c >> 5) & 0x3; + + xmaxc[3] = (*c++ & 0x1F) << 1; + xmaxc[3] |= (*c >> 7) & 0x1; + +#undef xmc +#define xmc (target + 63 - 39) + + xmc[39] = (*c >> 4) & 0x7; + xmc[40] = (*c >> 1) & 0x7; + xmc[41] = (*c++ & 0x1) << 2; + xmc[41] |= (*c >> 6) & 0x3; + xmc[42] = (*c >> 3) & 0x7; + xmc[43] = *c++ & 0x7; /* 30 */ + xmc[44] = (*c >> 5) & 0x7; + xmc[45] = (*c >> 2) & 0x7; + xmc[46] = (*c++ & 0x3) << 1; + xmc[46] |= (*c >> 7) & 0x1; + xmc[47] = (*c >> 4) & 0x7; + xmc[48] = (*c >> 1) & 0x7; + xmc[49] = (*c++ & 0x1) << 2; + xmc[49] |= (*c >> 6) & 0x3; + xmc[50] = (*c >> 3) & 0x7; + xmc[51] = *c & 0x7; /* 33 */ + } + + return 0; +} diff --git a/gsm/gsm_implode.c b/gsm/gsm_implode.c new file mode 100644 index 0000000000..453b8cf390 --- /dev/null +++ b/gsm/gsm_implode.c @@ -0,0 +1,515 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) +{ + /* variable size index + + GSM_MAGIC 4 - + + LARc[0] 6 0 + LARc[1] 6 1 + LARc[2] 5 2 + LARc[3] 5 3 + LARc[4] 4 4 + LARc[5] 4 5 + LARc[6] 3 6 + LARc[7] 3 7 + + Nc[0] 7 8 + bc[0] 2 9 + Mc[0] 2 10 + xmaxc[0] 6 11 + xmc[0] 3 12 + xmc[1] 3 13 + xmc[2] 3 14 + xmc[3] 3 15 + xmc[4] 3 16 + xmc[5] 3 17 + xmc[6] 3 18 + xmc[7] 3 19 + xmc[8] 3 20 + xmc[9] 3 21 + xmc[10] 3 22 + xmc[11] 3 23 + xmc[12] 3 24 + + Nc[1] 7 25 + bc[1] 2 26 + Mc[1] 2 27 + xmaxc[1] 6 28 + xmc[13] 3 29 + xmc[14] 3 30 + xmc[15] 3 31 + xmc[16] 3 32 + xmc[17] 3 33 + xmc[18] 3 34 + xmc[19] 3 35 + xmc[20] 3 36 + xmc[21] 3 37 + xmc[22] 3 38 + xmc[23] 3 39 + xmc[24] 3 40 + xmc[25] 3 41 + + Nc[2] 7 42 + bc[2] 2 43 + Mc[2] 2 44 + xmaxc[2] 6 45 + xmc[26] 3 46 + xmc[27] 3 47 + xmc[28] 3 48 + xmc[29] 3 49 + xmc[30] 3 50 + xmc[31] 3 51 + xmc[32] 3 52 + xmc[33] 3 53 + xmc[34] 3 54 + xmc[35] 3 55 + xmc[36] 3 56 + xmc[37] 3 57 + xmc[38] 3 58 + + Nc[3] 7 59 + bc[3] 2 60 + Mc[3] 2 61 + xmaxc[3] 6 62 + xmc[39] 3 63 + xmc[40] 3 64 + xmc[41] 3 65 + xmc[42] 3 66 + xmc[43] 3 67 + xmc[44] 3 68 + xmc[45] 3 69 + xmc[46] 3 70 + xmc[47] 3 71 + xmc[48] 3 72 + xmc[49] 3 73 + xmc[50] 3 74 + xmc[51] 3 75 + */ + + /* There are 76 parameters per frame. The first eight are + * unique. The remaining 68 are four identical subframes of + * 17 parameters each. gsm_implode converts from a representation + * of these parameters as values in one array of signed words + * to the "packed" version of a GSM frame. + */ + +# define LARc source +# define Nc *((gsm_signal (*) [17])(source + 8)) +# define bc *((gsm_signal (*) [17])(source + 9)) +# define Mc *((gsm_signal (*) [17])(source + 10)) +# define xmaxc *((gsm_signal (*) [17])(source + 11)) + +#ifdef WAV49 + if (s->wav_fmt) { + + uword sr = 0; + if (s->frame_index == 0) { + + sr = *c++; + LARc[0] = sr & 0x3f; sr >>= 6; + sr |= (uword)*c++ << 2; + LARc[1] = sr & 0x3f; sr >>= 6; + sr |= (uword)*c++ << 4; + LARc[2] = sr & 0x1f; sr >>= 5; + LARc[3] = sr & 0x1f; sr >>= 5; + sr |= (uword)*c++ << 2; + LARc[4] = sr & 0xf; sr >>= 4; + LARc[5] = sr & 0xf; sr >>= 4; + sr |= (uword)*c++ << 2; /* 5 */ + LARc[6] = sr & 0x7; sr >>= 3; + LARc[7] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[0] = sr & 0x7f; sr >>= 7; + bc[0] = sr & 0x3; sr >>= 2; + Mc[0] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[0] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 12) + xmc[0] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[1] = sr & 0x7; sr >>= 3; + xmc[2] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[3] = sr & 0x7; sr >>= 3; + xmc[4] = sr & 0x7; sr >>= 3; + xmc[5] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 10 */ + xmc[6] = sr & 0x7; sr >>= 3; + xmc[7] = sr & 0x7; sr >>= 3; + xmc[8] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[9] = sr & 0x7; sr >>= 3; + xmc[10] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[11] = sr & 0x7; sr >>= 3; + xmc[12] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[1] = sr & 0x7f; sr >>= 7; + bc[1] = sr & 0x3; sr >>= 2; + Mc[1] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[1] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 29 - 13) + xmc[13] = sr & 0x7; sr >>= 3; + sr = *c++; /* 15 */ + xmc[14] = sr & 0x7; sr >>= 3; + xmc[15] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[16] = sr & 0x7; sr >>= 3; + xmc[17] = sr & 0x7; sr >>= 3; + xmc[18] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[19] = sr & 0x7; sr >>= 3; + xmc[20] = sr & 0x7; sr >>= 3; + xmc[21] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[22] = sr & 0x7; sr >>= 3; + xmc[23] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[24] = sr & 0x7; sr >>= 3; + xmc[25] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; /* 20 */ + Nc[2] = sr & 0x7f; sr >>= 7; + bc[2] = sr & 0x3; sr >>= 2; + Mc[2] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[2] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 46 - 26) + xmc[26] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[27] = sr & 0x7; sr >>= 3; + xmc[28] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[29] = sr & 0x7; sr >>= 3; + xmc[30] = sr & 0x7; sr >>= 3; + xmc[31] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[32] = sr & 0x7; sr >>= 3; + xmc[33] = sr & 0x7; sr >>= 3; + xmc[34] = sr & 0x7; sr >>= 3; + sr = *c++; /* 25 */ + xmc[35] = sr & 0x7; sr >>= 3; + xmc[36] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[37] = sr & 0x7; sr >>= 3; + xmc[38] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 4; + Nc[3] = sr & 0x7f; sr >>= 7; + bc[3] = sr & 0x3; sr >>= 2; + Mc[3] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 1; + xmaxc[3] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 63 - 39) + + xmc[39] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[40] = sr & 0x7; sr >>= 3; + xmc[41] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; /* 30 */ + xmc[42] = sr & 0x7; sr >>= 3; + xmc[43] = sr & 0x7; sr >>= 3; + xmc[44] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[45] = sr & 0x7; sr >>= 3; + xmc[46] = sr & 0x7; sr >>= 3; + xmc[47] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[48] = sr & 0x7; sr >>= 3; + xmc[49] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[50] = sr & 0x7; sr >>= 3; + xmc[51] = sr & 0x7; sr >>= 3; + + s->frame_chain = sr & 0xf; + } + else { + sr = s->frame_chain; + sr |= (uword)*c++ << 4; /* 1 */ + LARc[0] = sr & 0x3f; sr >>= 6; + LARc[1] = sr & 0x3f; sr >>= 6; + sr = *c++; + LARc[2] = sr & 0x1f; sr >>= 5; + sr |= (uword)*c++ << 3; + LARc[3] = sr & 0x1f; sr >>= 5; + LARc[4] = sr & 0xf; sr >>= 4; + sr |= (uword)*c++ << 2; + LARc[5] = sr & 0xf; sr >>= 4; + LARc[6] = sr & 0x7; sr >>= 3; + LARc[7] = sr & 0x7; sr >>= 3; + sr = *c++; /* 5 */ + Nc[0] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[0] = sr & 0x3; sr >>= 2; + Mc[0] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[0] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 12) + xmc[0] = sr & 0x7; sr >>= 3; + xmc[1] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[2] = sr & 0x7; sr >>= 3; + xmc[3] = sr & 0x7; sr >>= 3; + xmc[4] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[5] = sr & 0x7; sr >>= 3; + xmc[6] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; /* 10 */ + xmc[7] = sr & 0x7; sr >>= 3; + xmc[8] = sr & 0x7; sr >>= 3; + xmc[9] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[10] = sr & 0x7; sr >>= 3; + xmc[11] = sr & 0x7; sr >>= 3; + xmc[12] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[1] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[1] = sr & 0x3; sr >>= 2; + Mc[1] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[1] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 29 - 13) + xmc[13] = sr & 0x7; sr >>= 3; + xmc[14] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 15 */ + xmc[15] = sr & 0x7; sr >>= 3; + xmc[16] = sr & 0x7; sr >>= 3; + xmc[17] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[18] = sr & 0x7; sr >>= 3; + xmc[19] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[20] = sr & 0x7; sr >>= 3; + xmc[21] = sr & 0x7; sr >>= 3; + xmc[22] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[23] = sr & 0x7; sr >>= 3; + xmc[24] = sr & 0x7; sr >>= 3; + xmc[25] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[2] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; /* 20 */ + bc[2] = sr & 0x3; sr >>= 2; + Mc[2] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[2] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 46 - 26) + xmc[26] = sr & 0x7; sr >>= 3; + xmc[27] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[28] = sr & 0x7; sr >>= 3; + xmc[29] = sr & 0x7; sr >>= 3; + xmc[30] = sr & 0x7; sr >>= 3; + sr = *c++; + xmc[31] = sr & 0x7; sr >>= 3; + xmc[32] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[33] = sr & 0x7; sr >>= 3; + xmc[34] = sr & 0x7; sr >>= 3; + xmc[35] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; /* 25 */ + xmc[36] = sr & 0x7; sr >>= 3; + xmc[37] = sr & 0x7; sr >>= 3; + xmc[38] = sr & 0x7; sr >>= 3; + sr = *c++; + Nc[3] = sr & 0x7f; sr >>= 7; + sr |= (uword)*c++ << 1; + bc[3] = sr & 0x3; sr >>= 2; + Mc[3] = sr & 0x3; sr >>= 2; + sr |= (uword)*c++ << 5; + xmaxc[3] = sr & 0x3f; sr >>= 6; +#undef xmc +#define xmc (source + 63 - 39) + + xmc[39] = sr & 0x7; sr >>= 3; + xmc[40] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[41] = sr & 0x7; sr >>= 3; + xmc[42] = sr & 0x7; sr >>= 3; + xmc[43] = sr & 0x7; sr >>= 3; + sr = *c++; /* 30 */ + xmc[44] = sr & 0x7; sr >>= 3; + xmc[45] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 2; + xmc[46] = sr & 0x7; sr >>= 3; + xmc[47] = sr & 0x7; sr >>= 3; + xmc[48] = sr & 0x7; sr >>= 3; + sr |= (uword)*c++ << 1; + xmc[49] = sr & 0x7; sr >>= 3; + xmc[50] = sr & 0x7; sr >>= 3; + xmc[51] = sr & 0x7; sr >>= 3; + } + } + else +#endif + { + + *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ + | ((LARc[0] >> 2) & 0xF); + *c++ = ((LARc[0] & 0x3) << 6) + | (LARc[1] & 0x3F); + *c++ = ((LARc[2] & 0x1F) << 3) + | ((LARc[3] >> 2) & 0x7); + *c++ = ((LARc[3] & 0x3) << 6) + | ((LARc[4] & 0xF) << 2) + | ((LARc[5] >> 2) & 0x3); + *c++ = ((LARc[5] & 0x3) << 6) + | ((LARc[6] & 0x7) << 3) + | (LARc[7] & 0x7); + + + *c++ = ((Nc[0] & 0x7F) << 1) + + + | ((bc[0] >> 1) & 0x1); + *c++ = ((bc[0] & 0x1) << 7) + + + | ((Mc[0] & 0x3) << 5) + + | ((xmaxc[0] >> 1) & 0x1F); + *c++ = ((xmaxc[0] & 0x1) << 7) + +#undef xmc +#define xmc (source + 12) + + | ((xmc[0] & 0x7) << 4) + | ((xmc[1] & 0x7) << 1) + | ((xmc[2] >> 2) & 0x1); + *c++ = ((xmc[2] & 0x3) << 6) + | ((xmc[3] & 0x7) << 3) + | (xmc[4] & 0x7); + *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ + | ((xmc[6] & 0x7) << 2) + | ((xmc[7] >> 1) & 0x3); + *c++ = ((xmc[7] & 0x1) << 7) + | ((xmc[8] & 0x7) << 4) + | ((xmc[9] & 0x7) << 1) + | ((xmc[10] >> 2) & 0x1); + *c++ = ((xmc[10] & 0x3) << 6) + | ((xmc[11] & 0x7) << 3) + | (xmc[12] & 0x7); + + + *c++ = ((Nc[1] & 0x7F) << 1) + + + | ((bc[1] >> 1) & 0x1); + *c++ = ((bc[1] & 0x1) << 7) + + + | ((Mc[1] & 0x3) << 5) + + + | ((xmaxc[1] >> 1) & 0x1F); + *c++ = ((xmaxc[1] & 0x1) << 7) + +#undef xmc +#define xmc (source + 29 - 13) + + | ((xmc[13] & 0x7) << 4) + | ((xmc[14] & 0x7) << 1) + | ((xmc[15] >> 2) & 0x1); + *c++ = ((xmc[15] & 0x3) << 6) + | ((xmc[16] & 0x7) << 3) + | (xmc[17] & 0x7); + *c++ = ((xmc[18] & 0x7) << 5) + | ((xmc[19] & 0x7) << 2) + | ((xmc[20] >> 1) & 0x3); + *c++ = ((xmc[20] & 0x1) << 7) + | ((xmc[21] & 0x7) << 4) + | ((xmc[22] & 0x7) << 1) + | ((xmc[23] >> 2) & 0x1); + *c++ = ((xmc[23] & 0x3) << 6) + | ((xmc[24] & 0x7) << 3) + | (xmc[25] & 0x7); + + + *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ + + + | ((bc[2] >> 1) & 0x1); + *c++ = ((bc[2] & 0x1) << 7) + + + | ((Mc[2] & 0x3) << 5) + + + | ((xmaxc[2] >> 1) & 0x1F); + *c++ = ((xmaxc[2] & 0x1) << 7) + +#undef xmc +#define xmc (source + 46 - 26) + + | ((xmc[26] & 0x7) << 4) + | ((xmc[27] & 0x7) << 1) + | ((xmc[28] >> 2) & 0x1); + *c++ = ((xmc[28] & 0x3) << 6) + | ((xmc[29] & 0x7) << 3) + | (xmc[30] & 0x7); + *c++ = ((xmc[31] & 0x7) << 5) + | ((xmc[32] & 0x7) << 2) + | ((xmc[33] >> 1) & 0x3); + *c++ = ((xmc[33] & 0x1) << 7) + | ((xmc[34] & 0x7) << 4) + | ((xmc[35] & 0x7) << 1) + | ((xmc[36] >> 2) & 0x1); + *c++ = ((xmc[36] & 0x3) << 6) + | ((xmc[37] & 0x7) << 3) + | (xmc[38] & 0x7); + + + *c++ = ((Nc[3] & 0x7F) << 1) + + + | ((bc[3] >> 1) & 0x1); + *c++ = ((bc[3] & 0x1) << 7) + + + | ((Mc[3] & 0x3) << 5) + + + | ((xmaxc[3] >> 1) & 0x1F); + *c++ = ((xmaxc[3] & 0x1) << 7) + +#undef xmc +#define xmc (source + 63 - 39) + + | ((xmc[39] & 0x7) << 4) + | ((xmc[40] & 0x7) << 1) + | ((xmc[41] >> 2) & 0x1); + *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ + | ((xmc[42] & 0x7) << 3) + | (xmc[43] & 0x7); + *c++ = ((xmc[44] & 0x7) << 5) + | ((xmc[45] & 0x7) << 2) + | ((xmc[46] >> 1) & 0x3); + *c++ = ((xmc[46] & 0x1) << 7) + | ((xmc[47] & 0x7) << 4) + | ((xmc[48] & 0x7) << 1) + | ((xmc[49] >> 2) & 0x1); + *c++ = ((xmc[49] & 0x3) << 6) + | ((xmc[50] & 0x7) << 3) + | (xmc[51] & 0x7); + } +} diff --git a/gsm/gsm_option.c b/gsm/gsm_option.c new file mode 100644 index 0000000000..2807801328 --- /dev/null +++ b/gsm/gsm_option.c @@ -0,0 +1,69 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +int gsm_option P3((r, opt, val), gsm r, int opt, int * val) +{ + int result = -1; + + switch (opt) { + case GSM_OPT_LTP_CUT: +#ifdef LTP_CUT + result = r->ltp_cut; + if (val) r->ltp_cut = *val; +#endif + break; + + case GSM_OPT_VERBOSE: +#ifndef NDEBUG + result = r->verbose; + if (val) r->verbose = *val; +#endif + break; + + case GSM_OPT_FAST: + +#if defined(FAST) && defined(USE_FLOAT_MUL) + result = r->fast; + if (val) r->fast = !!*val; +#endif + break; + + case GSM_OPT_FRAME_CHAIN: + +#ifdef WAV49 + result = r->frame_chain; + if (val) r->frame_chain = *val; +#endif + break; + + case GSM_OPT_FRAME_INDEX: + +#ifdef WAV49 + result = r->frame_index; + if (val) r->frame_index = *val; +#endif + break; + + case GSM_OPT_WAV49: + +#ifdef WAV49 + result = r->wav_fmt; + if (val) r->wav_fmt = !!*val; +#endif + break; + + default: + break; + } + return result; +} diff --git a/gsm/gsm_print.c b/gsm/gsm_print.c new file mode 100644 index 0000000000..af745bc48a --- /dev/null +++ b/gsm/gsm_print.c @@ -0,0 +1,167 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +int gsm_print P3((f, s, c), FILE * f, gsm s, gsm_byte * c) +{ + word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; + + /* GSM_MAGIC = (*c >> 4) & 0xF; */ + + if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; + + LARc[0] = (*c++ & 0xF) << 2; /* 1 */ + LARc[0] |= (*c >> 6) & 0x3; + LARc[1] = *c++ & 0x3F; + LARc[2] = (*c >> 3) & 0x1F; + LARc[3] = (*c++ & 0x7) << 2; + LARc[3] |= (*c >> 6) & 0x3; + LARc[4] = (*c >> 2) & 0xF; + LARc[5] = (*c++ & 0x3) << 2; + LARc[5] |= (*c >> 6) & 0x3; + LARc[6] = (*c >> 3) & 0x7; + LARc[7] = *c++ & 0x7; + + + Nc[0] = (*c >> 1) & 0x7F; + bc[0] = (*c++ & 0x1) << 1; + bc[0] |= (*c >> 7) & 0x1; + Mc[0] = (*c >> 5) & 0x3; + xmaxc[0] = (*c++ & 0x1F) << 1; + xmaxc[0] |= (*c >> 7) & 0x1; + xmc[0] = (*c >> 4) & 0x7; + xmc[1] = (*c >> 1) & 0x7; + xmc[2] = (*c++ & 0x1) << 2; + xmc[2] |= (*c >> 6) & 0x3; + xmc[3] = (*c >> 3) & 0x7; + xmc[4] = *c++ & 0x7; + xmc[5] = (*c >> 5) & 0x7; + xmc[6] = (*c >> 2) & 0x7; + xmc[7] = (*c++ & 0x3) << 1; /* 10 */ + xmc[7] |= (*c >> 7) & 0x1; + xmc[8] = (*c >> 4) & 0x7; + xmc[9] = (*c >> 1) & 0x7; + xmc[10] = (*c++ & 0x1) << 2; + xmc[10] |= (*c >> 6) & 0x3; + xmc[11] = (*c >> 3) & 0x7; + xmc[12] = *c++ & 0x7; + + Nc[1] = (*c >> 1) & 0x7F; + bc[1] = (*c++ & 0x1) << 1; + bc[1] |= (*c >> 7) & 0x1; + Mc[1] = (*c >> 5) & 0x3; + xmaxc[1] = (*c++ & 0x1F) << 1; + xmaxc[1] |= (*c >> 7) & 0x1; + xmc[13] = (*c >> 4) & 0x7; + xmc[14] = (*c >> 1) & 0x7; + xmc[15] = (*c++ & 0x1) << 2; + xmc[15] |= (*c >> 6) & 0x3; + xmc[16] = (*c >> 3) & 0x7; + xmc[17] = *c++ & 0x7; + xmc[18] = (*c >> 5) & 0x7; + xmc[19] = (*c >> 2) & 0x7; + xmc[20] = (*c++ & 0x3) << 1; + xmc[20] |= (*c >> 7) & 0x1; + xmc[21] = (*c >> 4) & 0x7; + xmc[22] = (*c >> 1) & 0x7; + xmc[23] = (*c++ & 0x1) << 2; + xmc[23] |= (*c >> 6) & 0x3; + xmc[24] = (*c >> 3) & 0x7; + xmc[25] = *c++ & 0x7; + + + Nc[2] = (*c >> 1) & 0x7F; + bc[2] = (*c++ & 0x1) << 1; /* 20 */ + bc[2] |= (*c >> 7) & 0x1; + Mc[2] = (*c >> 5) & 0x3; + xmaxc[2] = (*c++ & 0x1F) << 1; + xmaxc[2] |= (*c >> 7) & 0x1; + xmc[26] = (*c >> 4) & 0x7; + xmc[27] = (*c >> 1) & 0x7; + xmc[28] = (*c++ & 0x1) << 2; + xmc[28] |= (*c >> 6) & 0x3; + xmc[29] = (*c >> 3) & 0x7; + xmc[30] = *c++ & 0x7; + xmc[31] = (*c >> 5) & 0x7; + xmc[32] = (*c >> 2) & 0x7; + xmc[33] = (*c++ & 0x3) << 1; + xmc[33] |= (*c >> 7) & 0x1; + xmc[34] = (*c >> 4) & 0x7; + xmc[35] = (*c >> 1) & 0x7; + xmc[36] = (*c++ & 0x1) << 2; + xmc[36] |= (*c >> 6) & 0x3; + xmc[37] = (*c >> 3) & 0x7; + xmc[38] = *c++ & 0x7; + + Nc[3] = (*c >> 1) & 0x7F; + bc[3] = (*c++ & 0x1) << 1; + bc[3] |= (*c >> 7) & 0x1; + Mc[3] = (*c >> 5) & 0x3; + xmaxc[3] = (*c++ & 0x1F) << 1; + xmaxc[3] |= (*c >> 7) & 0x1; + + xmc[39] = (*c >> 4) & 0x7; + xmc[40] = (*c >> 1) & 0x7; + xmc[41] = (*c++ & 0x1) << 2; + xmc[41] |= (*c >> 6) & 0x3; + xmc[42] = (*c >> 3) & 0x7; + xmc[43] = *c++ & 0x7; /* 30 */ + xmc[44] = (*c >> 5) & 0x7; + xmc[45] = (*c >> 2) & 0x7; + xmc[46] = (*c++ & 0x3) << 1; + xmc[46] |= (*c >> 7) & 0x1; + xmc[47] = (*c >> 4) & 0x7; + xmc[48] = (*c >> 1) & 0x7; + xmc[49] = (*c++ & 0x1) << 2; + xmc[49] |= (*c >> 6) & 0x3; + xmc[50] = (*c >> 3) & 0x7; + xmc[51] = *c & 0x7; /* 33 */ + + fprintf(f, + "LARc:\t%2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d %2.2d\n", + LARc[0],LARc[1],LARc[2],LARc[3],LARc[4],LARc[5],LARc[6],LARc[7]); + + fprintf(f, "#1: Nc %4.4d bc %d Mc %d xmaxc %d\n", + Nc[0], bc[0], Mc[0], xmaxc[0]); + fprintf(f, +"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", + xmc[0],xmc[1],xmc[2],xmc[3],xmc[4],xmc[5],xmc[6], + xmc[7],xmc[8],xmc[9],xmc[10],xmc[11],xmc[12] ); + + fprintf(f, "#2: Nc %4.4d bc %d Mc %d xmaxc %d\n", + Nc[1], bc[1], Mc[1], xmaxc[1]); + fprintf(f, +"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", + xmc[13+0],xmc[13+1],xmc[13+2],xmc[13+3],xmc[13+4],xmc[13+5], + xmc[13+6], xmc[13+7],xmc[13+8],xmc[13+9],xmc[13+10],xmc[13+11], + xmc[13+12] ); + + fprintf(f, "#3: Nc %4.4d bc %d Mc %d xmaxc %d\n", + Nc[2], bc[2], Mc[2], xmaxc[2]); + fprintf(f, +"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", + xmc[26+0],xmc[26+1],xmc[26+2],xmc[26+3],xmc[26+4],xmc[26+5], + xmc[26+6], xmc[26+7],xmc[26+8],xmc[26+9],xmc[26+10],xmc[26+11], + xmc[26+12] ); + + fprintf(f, "#4: Nc %4.4d bc %d Mc %d xmaxc %d\n", + Nc[3], bc[3], Mc[3], xmaxc[3]); + fprintf(f, +"\t%.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d %.2d\n", + xmc[39+0],xmc[39+1],xmc[39+2],xmc[39+3],xmc[39+4],xmc[39+5], + xmc[39+6], xmc[39+7],xmc[39+8],xmc[39+9],xmc[39+10],xmc[39+11], + xmc[39+12] ); + + return 0; +} diff --git a/gsm/long_term.c b/gsm/long_term.c new file mode 100644 index 0000000000..fd67bda193 --- /dev/null +++ b/gsm/long_term.c @@ -0,0 +1,949 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> +#include <assert.h> + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +/* + * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION + */ + + +/* + * This module computes the LTP gain (bc) and the LTP lag (Nc) + * for the long term analysis filter. This is done by calculating a + * maximum of the cross-correlation function between the current + * sub-segment short term residual signal d[0..39] (output of + * the short term analysis filter; for simplification the index + * of this array begins at 0 and ends at 39 for each sub-segment of the + * RPE-LTP analysis) and the previous reconstructed short term + * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be + * performed to avoid overflow. + */ + + /* The next procedure exists in six versions. First two integer + * version (if USE_FLOAT_MUL is not defined); then four floating + * point versions, twice with proper scaling (USE_FLOAT_MUL defined), + * once without (USE_FLOAT_MUL and FAST defined, and fast run-time + * option used). Every pair has first a Cut version (see the -C + * option to toast or the LTP_CUT option to gsm_option()), then the + * uncut one. (For a detailed explanation of why this is altogether + * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered + * Harmful''.) + */ + +#ifndef USE_FLOAT_MUL + +#ifdef LTP_CUT + +static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), + + struct gsm_state * st, + + register word * d, /* [0..39] IN */ + register word * dp, /* [-120..-1] IN */ + word * bc_out, /* OUT */ + word * Nc_out /* OUT */ +) +{ + register int k, lambda; + word Nc, bc; + word wt[40]; + + longword L_result; + longword L_max, L_power; + word R, S, dmax, scal, best_k; + word ltp_cut; + + register word temp, wt_k; + + /* Search of the optimum scaling of d[0..39]. + */ + dmax = 0; + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS( temp ); + if (temp > dmax) { + dmax = temp; + best_k = k; + } + } + temp = 0; + if (dmax == 0) scal = 0; + else { + assert(dmax > 0); + temp = gsm_norm( (longword)dmax << 16 ); + } + if (temp > 6) scal = 0; + else scal = 6 - temp; + assert(scal >= 0); + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + wt_k = SASR(d[best_k], scal); + + for (lambda = 40; lambda <= 120; lambda++) { + L_result = (longword)wt_k * dp[best_k - lambda]; + if (L_result > L_max) { + Nc = lambda; + L_max = L_result; + } + } + *Nc_out = Nc; + L_max <<= 1; + + /* Rescaling of L_max + */ + assert(scal <= 100 && scal >= -100); + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + assert( Nc <= 120 && Nc >= 40); + + /* Compute the power of the reconstructed short term residual + * signal dp[..] + */ + L_power = 0; + for (k = 0; k <= 39; k++) { + + register longword L_temp; + + L_temp = SASR( dp[k - Nc], 3 ); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_norm( L_power ); + + R = SASR( L_max << temp, 16 ); + S = SASR( L_power << temp, 16 ); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; + *bc_out = bc; +} + +#endif /* LTP_CUT */ + +static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), + register word * d, /* [0..39] IN */ + register word * dp, /* [-120..-1] IN */ + word * bc_out, /* OUT */ + word * Nc_out /* OUT */ +) +{ + register int k, lambda; + word Nc, bc; + word wt[40]; + + longword L_max, L_power; + word R, S, dmax, scal; + register word temp; + + /* Search of the optimum scaling of d[0..39]. + */ + dmax = 0; + + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS( temp ); + if (temp > dmax) dmax = temp; + } + + temp = 0; + if (dmax == 0) scal = 0; + else { + assert(dmax > 0); + temp = gsm_norm( (longword)dmax << 16 ); + } + + if (temp > 6) scal = 0; + else scal = 6 - temp; + + assert(scal >= 0); + + /* Initialization of a working array wt + */ + + for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal ); + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + for (lambda = 40; lambda <= 120; lambda++) { + +# undef STEP +# define STEP(k) (longword)wt[k] * dp[k - lambda] + + register longword L_result; + + L_result = STEP(0) ; L_result += STEP(1) ; + L_result += STEP(2) ; L_result += STEP(3) ; + L_result += STEP(4) ; L_result += STEP(5) ; + L_result += STEP(6) ; L_result += STEP(7) ; + L_result += STEP(8) ; L_result += STEP(9) ; + L_result += STEP(10) ; L_result += STEP(11) ; + L_result += STEP(12) ; L_result += STEP(13) ; + L_result += STEP(14) ; L_result += STEP(15) ; + L_result += STEP(16) ; L_result += STEP(17) ; + L_result += STEP(18) ; L_result += STEP(19) ; + L_result += STEP(20) ; L_result += STEP(21) ; + L_result += STEP(22) ; L_result += STEP(23) ; + L_result += STEP(24) ; L_result += STEP(25) ; + L_result += STEP(26) ; L_result += STEP(27) ; + L_result += STEP(28) ; L_result += STEP(29) ; + L_result += STEP(30) ; L_result += STEP(31) ; + L_result += STEP(32) ; L_result += STEP(33) ; + L_result += STEP(34) ; L_result += STEP(35) ; + L_result += STEP(36) ; L_result += STEP(37) ; + L_result += STEP(38) ; L_result += STEP(39) ; + + if (L_result > L_max) { + + Nc = lambda; + L_max = L_result; + } + } + + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + assert(scal <= 100 && scal >= -100); + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + assert( Nc <= 120 && Nc >= 40); + + /* Compute the power of the reconstructed short term residual + * signal dp[..] + */ + L_power = 0; + for (k = 0; k <= 39; k++) { + + register longword L_temp; + + L_temp = SASR( dp[k - Nc], 3 ); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_norm( L_power ); + + R = SASR( L_max << temp, 16 ); + S = SASR( L_power << temp, 16 ); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; + *bc_out = bc; +} + +#else /* USE_FLOAT_MUL */ + +#ifdef LTP_CUT + +static void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), + struct gsm_state * st, /* IN */ + register word * d, /* [0..39] IN */ + register word * dp, /* [-120..-1] IN */ + word * bc_out, /* OUT */ + word * Nc_out /* OUT */ +) +{ + register int k, lambda; + word Nc, bc; + word ltp_cut; + + float wt_float[40]; + float dp_float_base[120], * dp_float = dp_float_base + 120; + + longword L_max, L_power; + word R, S, dmax, scal; + register word temp; + + /* Search of the optimum scaling of d[0..39]. + */ + dmax = 0; + + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS( temp ); + if (temp > dmax) dmax = temp; + } + + temp = 0; + if (dmax == 0) scal = 0; + else { + assert(dmax > 0); + temp = gsm_norm( (longword)dmax << 16 ); + } + + if (temp > 6) scal = 0; + else scal = 6 - temp; + + assert(scal >= 0); + ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; + + + /* Initialization of a working array wt + */ + + for (k = 0; k < 40; k++) { + register word w = SASR( d[k], scal ); + if (w < 0 ? w > -ltp_cut : w < ltp_cut) { + wt_float[k] = 0.0; + } + else { + wt_float[k] = w; + } + } + for (k = -120; k < 0; k++) dp_float[k] = dp[k]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + for (lambda = 40; lambda <= 120; lambda += 9) { + + /* Calculate L_result for l = lambda .. lambda + 9. + */ + register float *lp = dp_float - lambda; + + register float W; + register float a = lp[-8], b = lp[-7], c = lp[-6], + d = lp[-5], e = lp[-4], f = lp[-3], + g = lp[-2], h = lp[-1]; + register float E; + register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + if ((W = wt_float[K]) != 0.0) { \ + E = W * a; S8 += E; \ + E = W * b; S7 += E; \ + E = W * c; S6 += E; \ + E = W * d; S5 += E; \ + E = W * e; S4 += E; \ + E = W * f; S3 += E; \ + E = W * g; S2 += E; \ + E = W * h; S1 += E; \ + a = lp[K]; \ + E = W * a; S0 += E; } else (a = lp[K]) + +# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) + + STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); + STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); + + STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); + STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); + + STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); + STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); + + STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); + STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); + + STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); + STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); + + if (S0 > L_max) { L_max = S0; Nc = lambda; } + if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } + if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } + if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } + if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } + if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } + if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } + if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } + if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } + + } + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + assert(scal <= 100 && scal >= -100); + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + assert( Nc <= 120 && Nc >= 40); + + /* Compute the power of the reconstructed short term residual + * signal dp[..] + */ + L_power = 0; + for (k = 0; k <= 39; k++) { + + register longword L_temp; + + L_temp = SASR( dp[k - Nc], 3 ); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_norm( L_power ); + + R = SASR( L_max << temp, 16 ); + S = SASR( L_power << temp, 16 ); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; + *bc_out = bc; +} + +#endif /* LTP_CUT */ + +static void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), + register word * d, /* [0..39] IN */ + register word * dp, /* [-120..-1] IN */ + word * bc_out, /* OUT */ + word * Nc_out /* OUT */ +) +{ + register int k, lambda; + word Nc, bc; + + float wt_float[40]; + float dp_float_base[120], * dp_float = dp_float_base + 120; + + longword L_max, L_power; + word R, S, dmax, scal; + register word temp; + + /* Search of the optimum scaling of d[0..39]. + */ + dmax = 0; + + for (k = 0; k <= 39; k++) { + temp = d[k]; + temp = GSM_ABS( temp ); + if (temp > dmax) dmax = temp; + } + + temp = 0; + if (dmax == 0) scal = 0; + else { + assert(dmax > 0); + temp = gsm_norm( (longword)dmax << 16 ); + } + + if (temp > 6) scal = 0; + else scal = 6 - temp; + + assert(scal >= 0); + + /* Initialization of a working array wt + */ + + for (k = 0; k < 40; k++) wt_float[k] = SASR( d[k], scal ); + for (k = -120; k < 0; k++) dp_float[k] = dp[k]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + for (lambda = 40; lambda <= 120; lambda += 9) { + + /* Calculate L_result for l = lambda .. lambda + 9. + */ + register float *lp = dp_float - lambda; + + register float W; + register float a = lp[-8], b = lp[-7], c = lp[-6], + d = lp[-5], e = lp[-4], f = lp[-3], + g = lp[-2], h = lp[-1]; + register float E; + register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float[K]; \ + E = W * a; S8 += E; \ + E = W * b; S7 += E; \ + E = W * c; S6 += E; \ + E = W * d; S5 += E; \ + E = W * e; S4 += E; \ + E = W * f; S3 += E; \ + E = W * g; S2 += E; \ + E = W * h; S1 += E; \ + a = lp[K]; \ + E = W * a; S0 += E + +# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) + + STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); + STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); + + STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); + STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); + + STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); + STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); + + STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); + STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); + + STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); + STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); + + if (S0 > L_max) { L_max = S0; Nc = lambda; } + if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } + if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } + if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } + if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } + if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } + if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } + if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } + if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } + } + *Nc_out = Nc; + + L_max <<= 1; + + /* Rescaling of L_max + */ + assert(scal <= 100 && scal >= -100); + L_max = L_max >> (6 - scal); /* sub(6, scal) */ + + assert( Nc <= 120 && Nc >= 40); + + /* Compute the power of the reconstructed short term residual + * signal dp[..] + */ + L_power = 0; + for (k = 0; k <= 39; k++) { + + register longword L_temp; + + L_temp = SASR( dp[k - Nc], 3 ); + L_power += L_temp * L_temp; + } + L_power <<= 1; /* from L_MULT */ + + /* Normalization of L_max and L_power + */ + + if (L_max <= 0) { + *bc_out = 0; + return; + } + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + temp = gsm_norm( L_power ); + + R = SASR( L_max << temp, 16 ); + S = SASR( L_power << temp, 16 ); + + /* Coding of the LTP gain + */ + + /* Table 4.3a must be used to obtain the level DLB[i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; + *bc_out = bc; +} + +#ifdef FAST +#ifdef LTP_CUT + +static void Cut_Fast_Calculation_of_the_LTP_parameters P5((st, + d,dp,bc_out,Nc_out), + struct gsm_state * st, /* IN */ + register word * d, /* [0..39] IN */ + register word * dp, /* [-120..-1] IN */ + word * bc_out, /* OUT */ + word * Nc_out /* OUT */ +) +{ + register int k, lambda; + register float wt_float; + word Nc, bc; + word wt_max, best_k, ltp_cut; + + float dp_float_base[120], * dp_float = dp_float_base + 120; + + register float L_result, L_max, L_power; + + wt_max = 0; + + for (k = 0; k < 40; ++k) { + if ( d[k] > wt_max) wt_max = d[best_k = k]; + else if (-d[k] > wt_max) wt_max = -d[best_k = k]; + } + + assert(wt_max >= 0); + wt_float = (float)wt_max; + + for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + for (lambda = 40; lambda <= 120; lambda++) { + L_result = wt_float * dp_float[best_k - lambda]; + if (L_result > L_max) { + Nc = lambda; + L_max = L_result; + } + } + + *Nc_out = Nc; + if (L_max <= 0.) { + *bc_out = 0; + return; + } + + /* Compute the power of the reconstructed short term residual + * signal dp[..] + */ + dp_float -= Nc; + L_power = 0; + for (k = 0; k < 40; ++k) { + register float f = dp_float[k]; + L_power += f * f; + } + + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + /* Coding of the LTP gain + * Table 4.3a must be used to obtain the level DLB[i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + lambda = L_max / L_power * 32768.; + for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; + *bc_out = bc; +} + +#endif /* LTP_CUT */ + +static void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), + register word * d, /* [0..39] IN */ + register word * dp, /* [-120..-1] IN */ + word * bc_out, /* OUT */ + word * Nc_out /* OUT */ +) +{ + register int k, lambda; + word Nc, bc; + + float wt_float[40]; + float dp_float_base[120], * dp_float = dp_float_base + 120; + + register float L_max, L_power; + + for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k]; + for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; + + /* Search for the maximum cross-correlation and coding of the LTP lag + */ + L_max = 0; + Nc = 40; /* index for the maximum cross-correlation */ + + for (lambda = 40; lambda <= 120; lambda += 9) { + + /* Calculate L_result for l = lambda .. lambda + 9. + */ + register float *lp = dp_float - lambda; + + register float W; + register float a = lp[-8], b = lp[-7], c = lp[-6], + d = lp[-5], e = lp[-4], f = lp[-3], + g = lp[-2], h = lp[-1]; + register float E; + register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, + S5 = 0, S6 = 0, S7 = 0, S8 = 0; + +# undef STEP +# define STEP(K, a, b, c, d, e, f, g, h) \ + W = wt_float[K]; \ + E = W * a; S8 += E; \ + E = W * b; S7 += E; \ + E = W * c; S6 += E; \ + E = W * d; S5 += E; \ + E = W * e; S4 += E; \ + E = W * f; S3 += E; \ + E = W * g; S2 += E; \ + E = W * h; S1 += E; \ + a = lp[K]; \ + E = W * a; S0 += E + +# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) +# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) +# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) +# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) +# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) +# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) +# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) +# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) + + STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); + STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); + + STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); + STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); + + STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); + STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); + + STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); + STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); + + STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); + STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); + + if (S0 > L_max) { L_max = S0; Nc = lambda; } + if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } + if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } + if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } + if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } + if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } + if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } + if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } + if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } + } + *Nc_out = Nc; + + if (L_max <= 0.) { + *bc_out = 0; + return; + } + + /* Compute the power of the reconstructed short term residual + * signal dp[..] + */ + dp_float -= Nc; + L_power = 0; + for (k = 0; k < 40; ++k) { + register float f = dp_float[k]; + L_power += f * f; + } + + if (L_max >= L_power) { + *bc_out = 3; + return; + } + + /* Coding of the LTP gain + * Table 4.3a must be used to obtain the level DLB[i] for the + * quantization of the LTP gain b to get the coded version bc. + */ + lambda = L_max / L_power * 32768.; + for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; + *bc_out = bc; +} + +#endif /* FAST */ +#endif /* USE_FLOAT_MUL */ + + +/* 4.2.12 */ + +static void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e), + word bc, /* IN */ + word Nc, /* IN */ + register word * dp, /* previous d [-120..-1] IN */ + register word * d, /* d [0..39] IN */ + register word * dpp, /* estimate [0..39] OUT */ + register word * e /* long term res. signal [0..39] OUT */ +) +/* + * In this part, we have to decode the bc parameter to compute + * the samples of the estimate dpp[0..39]. The decoding of bc needs the + * use of table 4.3b. The long term residual signal e[0..39] + * is then calculated to be fed to the RPE encoding section. + */ +{ + register int k; + register longword ltmp; + +# undef STEP +# define STEP(BP) \ + for (k = 0; k <= 39; k++) { \ + dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ + e[k] = GSM_SUB( d[k], dpp[k] ); \ + } + + switch (bc) { + case 0: STEP( 3277 ); break; + case 1: STEP( 11469 ); break; + case 2: STEP( 21299 ); break; + case 3: STEP( 32767 ); break; + } +} + +void Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), /* 4x for 160 samples */ + + struct gsm_state * S, + + word * d, /* [0..39] residual signal IN */ + word * dp, /* [-120..-1] d' IN */ + + word * e, /* [0..39] OUT */ + word * dpp, /* [0..39] OUT */ + word * Nc, /* correlation lag OUT */ + word * bc /* gain factor OUT */ +) +{ + assert( d ); assert( dp ); assert( e ); + assert( dpp); assert( Nc ); assert( bc ); + +#if defined(FAST) && defined(USE_FLOAT_MUL) + if (S->fast) +#if defined (LTP_CUT) + if (S->ltp_cut) + Cut_Fast_Calculation_of_the_LTP_parameters(S, + d, dp, bc, Nc); + else +#endif /* LTP_CUT */ + Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc ); + else +#endif /* FAST & USE_FLOAT_MUL */ +#ifdef LTP_CUT + if (S->ltp_cut) + Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc); + else +#endif + Calculation_of_the_LTP_parameters(d, dp, bc, Nc); + + Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); +} + +/* 4.3.2 */ +void Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp), + struct gsm_state * S, + + word Ncr, + word bcr, + register word * erp, /* [0..39] IN */ + register word * drp /* [-120..-1] IN, [-120..40] OUT */ +) +/* + * This procedure uses the bcr and Ncr parameter to realize the + * long term synthesis filtering. The decoding of bcr needs + * table 4.3b. + */ +{ + register longword ltmp; /* for ADD */ + register int k; + word brp, drpp, Nr; + + /* Check the limits of Nr. + */ + Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; + S->nrp = Nr; + assert(Nr >= 40 && Nr <= 120); + + /* Decoding of the LTP gain bcr + */ + brp = gsm_QLB[ bcr ]; + + /* Computation of the reconstructed short term residual + * signal drp[0..39] + */ + assert(brp != MIN_WORD); + + for (k = 0; k <= 39; k++) { + drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); + drp[k] = GSM_ADD( erp[k], drpp ); + } + + /* + * Update of the reconstructed short term residual signal + * drp[ -1..-120 ] + */ + + for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; +} diff --git a/gsm/lpc.c b/gsm/lpc.c new file mode 100644 index 0000000000..ac2b8a9eb0 --- /dev/null +++ b/gsm/lpc.c @@ -0,0 +1,341 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> +#include <assert.h> + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +#undef P + +/* + * 4.2.4 .. 4.2.7 LPC ANALYSIS SECTION + */ + +/* 4.2.4 */ + + +static void Autocorrelation P2((s, L_ACF), + word * s, /* [0..159] IN/OUT */ + longword * L_ACF) /* [0..8] OUT */ +/* + * The goal is to compute the array L_ACF[k]. The signal s[i] must + * be scaled in order to avoid an overflow situation. + */ +{ + register int k, i; + + word temp, smax, scalauto; + +#ifdef USE_FLOAT_MUL + float float_s[160]; +#endif + + /* Dynamic scaling of the array s[0..159] + */ + + /* Search for the maximum. + */ + smax = 0; + for (k = 0; k <= 159; k++) { + temp = GSM_ABS( s[k] ); + if (temp > smax) smax = temp; + } + + /* Computation of the scaling factor. + */ + if (smax == 0) scalauto = 0; + else { + assert(smax > 0); + scalauto = 4 - gsm_norm( (longword)smax << 16 );/* sub(4,..) */ + } + + /* Scaling of the array s[0...159] + */ + + if (scalauto > 0) { + +# ifdef USE_FLOAT_MUL +# define SCALE(n) \ + case n: for (k = 0; k <= 159; k++) \ + float_s[k] = (float) \ + (s[k] = GSM_MULT_R(s[k], 16384 >> (n-1)));\ + break; +# else +# define SCALE(n) \ + case n: for (k = 0; k <= 159; k++) \ + s[k] = GSM_MULT_R( s[k], 16384 >> (n-1) );\ + break; +# endif /* USE_FLOAT_MUL */ + + switch (scalauto) { + SCALE(1) + SCALE(2) + SCALE(3) + SCALE(4) + } +# undef SCALE + } +# ifdef USE_FLOAT_MUL + else for (k = 0; k <= 159; k++) float_s[k] = (float) s[k]; +# endif + + /* Compute the L_ACF[..]. + */ + { +# ifdef USE_FLOAT_MUL + register float * sp = float_s; + register float sl = *sp; + +# define STEP(k) L_ACF[k] += (longword)(sl * sp[ -(k) ]); +# else + word * sp = s; + word sl = *sp; + +# define STEP(k) L_ACF[k] += ((longword)sl * sp[ -(k) ]); +# endif + +# define NEXTI sl = *++sp + + + for (k = 9; k--; L_ACF[k] = 0) ; + + STEP (0); + NEXTI; + STEP(0); STEP(1); + NEXTI; + STEP(0); STEP(1); STEP(2); + NEXTI; + STEP(0); STEP(1); STEP(2); STEP(3); + NEXTI; + STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); + NEXTI; + STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); + NEXTI; + STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); + NEXTI; + STEP(0); STEP(1); STEP(2); STEP(3); STEP(4); STEP(5); STEP(6); STEP(7); + + for (i = 8; i <= 159; i++) { + + NEXTI; + + STEP(0); + STEP(1); STEP(2); STEP(3); STEP(4); + STEP(5); STEP(6); STEP(7); STEP(8); + } + + for (k = 9; k--; L_ACF[k] <<= 1) ; + + } + /* Rescaling of the array s[0..159] + */ + if (scalauto > 0) { + assert(scalauto <= 4); + for (k = 160; k--; *s++ <<= scalauto) ; + } +} + +#if defined(USE_FLOAT_MUL) && defined(FAST) + +static void Fast_Autocorrelation P2((s, L_ACF), + word * s, /* [0..159] IN/OUT */ + longword * L_ACF) /* [0..8] OUT */ +{ + register int k, i; + float f_L_ACF[9]; + float scale; + + float s_f[160]; + register float *sf = s_f; + + for (i = 0; i < 160; ++i) sf[i] = s[i]; + for (k = 0; k <= 8; k++) { + register float L_temp2 = 0; + register float *sfl = sf - k; + for (i = k; i < 160; ++i) L_temp2 += sf[i] * sfl[i]; + f_L_ACF[k] = L_temp2; + } + scale = MAX_LONGWORD / f_L_ACF[0]; + + for (k = 0; k <= 8; k++) { + L_ACF[k] = f_L_ACF[k] * scale; + } +} +#endif /* defined (USE_FLOAT_MUL) && defined (FAST) */ + +/* 4.2.5 */ + +static void Reflection_coefficients P2( (L_ACF, r), + longword * L_ACF, /* 0...8 IN */ + register word * r /* 0...7 OUT */ +) +{ + register int i, m, n; + register word temp; + register longword ltmp; + word ACF[9]; /* 0..8 */ + word P[ 9]; /* 0..8 */ + word K[ 9]; /* 2..8 */ + + /* Schur recursion with 16 bits arithmetic. + */ + + if (L_ACF[0] == 0) { + for (i = 8; i--; *r++ = 0) ; + return; + } + + assert( L_ACF[0] != 0 ); + temp = gsm_norm( L_ACF[0] ); + + assert(temp >= 0 && temp < 32); + + /* ? overflow ? */ + for (i = 0; i <= 8; i++) ACF[i] = SASR( L_ACF[i] << temp, 16 ); + + /* Initialize array P[..] and K[..] for the recursion. + */ + + for (i = 1; i <= 7; i++) K[ i ] = ACF[ i ]; + for (i = 0; i <= 8; i++) P[ i ] = ACF[ i ]; + + /* Compute reflection coefficients + */ + for (n = 1; n <= 8; n++, r++) { + + temp = P[1]; + temp = GSM_ABS(temp); + if (P[0] < temp) { + for (i = n; i <= 8; i++) *r++ = 0; + return; + } + + *r = gsm_div( temp, P[0] ); + + assert(*r >= 0); + if (P[1] > 0) *r = -*r; /* r[n] = sub(0, r[n]) */ + assert (*r != MIN_WORD); + if (n == 8) return; + + /* Schur recursion + */ + temp = GSM_MULT_R( P[1], *r ); + P[0] = GSM_ADD( P[0], temp ); + + for (m = 1; m <= 8 - n; m++) { + temp = GSM_MULT_R( K[ m ], *r ); + P[m] = GSM_ADD( P[ m+1 ], temp ); + + temp = GSM_MULT_R( P[ m+1 ], *r ); + K[m] = GSM_ADD( K[ m ], temp ); + } + } +} + +/* 4.2.6 */ + +static void Transformation_to_Log_Area_Ratios P1((r), + register word * r /* 0..7 IN/OUT */ +) +/* + * The following scaling for r[..] and LAR[..] has been used: + * + * r[..] = integer( real_r[..]*32768. ); -1 <= real_r < 1. + * LAR[..] = integer( real_LAR[..] * 16384 ); + * with -1.625 <= real_LAR <= 1.625 + */ +{ + register word temp; + register int i; + + + /* Computation of the LAR[0..7] from the r[0..7] + */ + for (i = 1; i <= 8; i++, r++) { + + temp = *r; + temp = GSM_ABS(temp); + assert(temp >= 0); + + if (temp < 22118) { + temp >>= 1; + } else if (temp < 31130) { + assert( temp >= 11059 ); + temp -= 11059; + } else { + assert( temp >= 26112 ); + temp -= 26112; + temp <<= 2; + } + + *r = *r < 0 ? -temp : temp; + assert( *r != MIN_WORD ); + } +} + +/* 4.2.7 */ + +static void Quantization_and_coding P1((LAR), + register word * LAR /* [0..7] IN/OUT */ +) +{ + register word temp; + longword ltmp; + + + /* This procedure needs four tables; the following equations + * give the optimum scaling for the constants: + * + * A[0..7] = integer( real_A[0..7] * 1024 ) + * B[0..7] = integer( real_B[0..7] * 512 ) + * MAC[0..7] = maximum of the LARc[0..7] + * MIC[0..7] = minimum of the LARc[0..7] + */ + +# undef STEP +# define STEP( A, B, MAC, MIC ) \ + temp = GSM_MULT( A, *LAR ); \ + temp = GSM_ADD( temp, B ); \ + temp = GSM_ADD( temp, 256 ); \ + temp = SASR( temp, 9 ); \ + *LAR = temp>MAC ? MAC - MIC : (temp<MIC ? 0 : temp - MIC); \ + LAR++; + + STEP( 20480, 0, 31, -32 ); + STEP( 20480, 0, 31, -32 ); + STEP( 20480, 2048, 15, -16 ); + STEP( 20480, -2560, 15, -16 ); + + STEP( 13964, 94, 7, -8 ); + STEP( 15360, -1792, 7, -8 ); + STEP( 8534, -341, 3, -4 ); + STEP( 9036, -1144, 3, -4 ); + +# undef STEP +} + +void Gsm_LPC_Analysis P3((S, s,LARc), + struct gsm_state *S, + word * s, /* 0..159 signals IN/OUT */ + word * LARc) /* 0..7 LARc's OUT */ +{ + longword L_ACF[9]; + +#if defined(USE_FLOAT_MUL) && defined(FAST) + if (S->fast) Fast_Autocorrelation (s, L_ACF ); + else +#endif + Autocorrelation (s, L_ACF ); + Reflection_coefficients (L_ACF, LARc ); + Transformation_to_Log_Area_Ratios (LARc); + Quantization_and_coding (LARc); +} diff --git a/gsm/preprocess.c b/gsm/preprocess.c new file mode 100644 index 0000000000..99c0709dcf --- /dev/null +++ b/gsm/preprocess.c @@ -0,0 +1,113 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> +#include <assert.h> + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +/* 4.2.0 .. 4.2.3 PREPROCESSING SECTION + * + * After A-law to linear conversion (or directly from the + * Ato D converter) the following scaling is assumed for + * input to the RPE-LTP algorithm: + * + * in: 0.1.....................12 + * S.v.v.v.v.v.v.v.v.v.v.v.v.*.*.* + * + * Where S is the sign bit, v a valid bit, and * a "don't care" bit. + * The original signal is called sop[..] + * + * out: 0.1................... 12 + * S.S.v.v.v.v.v.v.v.v.v.v.v.v.0.0 + */ + + +void Gsm_Preprocess P3((S, s, so), + struct gsm_state * S, + word * s, + word * so ) /* [0..159] IN/OUT */ +{ + + word z1 = S->z1; + longword L_z2 = S->L_z2; + word mp = S->mp; + + word s1; + longword L_s2; + + longword L_temp; + + word msp, lsp; + word SO; + + longword ltmp; /* for ADD */ + ulongword utmp; /* for L_ADD */ + + register int k = 160; + + while (k--) { + + /* 4.2.1 Downscaling of the input signal + */ + SO = SASR( *s, 3 ) << 2; + s++; + + assert (SO >= -0x4000); /* downscaled by */ + assert (SO <= 0x3FFC); /* previous routine. */ + + + /* 4.2.2 Offset compensation + * + * This part implements a high-pass filter and requires extended + * arithmetic precision for the recursive part of this filter. + * The input of this procedure is the array so[0...159] and the + * output the array sof[ 0...159 ]. + */ + /* Compute the non-recursive part + */ + + s1 = SO - z1; /* s1 = gsm_sub( *so, z1 ); */ + z1 = SO; + + assert(s1 != MIN_WORD); + + /* Compute the recursive part + */ + L_s2 = s1; + L_s2 <<= 15; + + /* Execution of a 31 bv 16 bits multiplication + */ + + msp = SASR( L_z2, 15 ); + lsp = L_z2-((longword)msp<<15); /* gsm_L_sub(L_z2,(msp<<15)); */ + + L_s2 += GSM_MULT_R( lsp, 32735 ); + L_temp = (longword)msp * 32735; /* GSM_L_MULT(msp,32735) >> 1;*/ + L_z2 = GSM_L_ADD( L_temp, L_s2 ); + + /* Compute sof[k] with rounding + */ + L_temp = GSM_L_ADD( L_z2, 16384 ); + + /* 4.2.3 Preemphasis + */ + + msp = GSM_MULT_R( mp, -28180 ); + mp = SASR( L_temp, 15 ); + *so++ = GSM_ADD( mp, msp ); + } + + S->z1 = z1; + S->L_z2 = L_z2; + S->mp = mp; +} diff --git a/gsm/private.h b/gsm/private.h new file mode 100644 index 0000000000..6b538cc27a --- /dev/null +++ b/gsm/private.h @@ -0,0 +1,268 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/*$Header$*/ + +#ifndef PRIVATE_H +#define PRIVATE_H + +typedef short word; /* 16 bit signed int */ +typedef long longword; /* 32 bit signed int */ + +typedef unsigned short uword; /* unsigned word */ +typedef unsigned long ulongword; /* unsigned longword */ + +struct gsm_state { + + word dp0[ 280 ]; + + word z1; /* preprocessing.c, Offset_com. */ + longword L_z2; /* Offset_com. */ + int mp; /* Preemphasis */ + + word u[8]; /* short_term_aly_filter.c */ + word LARpp[2][8]; /* */ + word j; /* */ + + word ltp_cut; /* long_term.c, LTP crosscorr. */ + word nrp; /* 40 */ /* long_term.c, synthesis */ + word v[9]; /* short_term.c, synthesis */ + word msr; /* decoder.c, Postprocessing */ + + char verbose; /* only used if !NDEBUG */ + char fast; /* only used if FAST */ + + char wav_fmt; /* only used if WAV49 defined */ + unsigned char frame_index; /* odd/even chaining */ + unsigned char frame_chain; /* half-byte to carry forward */ +}; + + +#define MIN_WORD (-32767 - 1) +#define MAX_WORD 32767 + +#define MIN_LONGWORD (-2147483647 - 1) +#define MAX_LONGWORD 2147483647 + +#ifdef SASR /* flag: >> is a signed arithmetic shift right */ +#undef SASR +#define SASR(x, by) ((x) >> (by)) +#else +#define SASR(x, by) ((x) >= 0 ? (x) >> (by) : (~(-((x) + 1) >> (by)))) +#endif /* SASR */ + +#include "proto.h" + +/* + * Prototypes from add.c + */ +extern word gsm_mult P((word a, word b)); +extern longword gsm_L_mult P((word a, word b)); +extern word gsm_mult_r P((word a, word b)); + +extern word gsm_div P((word num, word denum)); + +extern word gsm_add P(( word a, word b )); +extern longword gsm_L_add P(( longword a, longword b )); + +extern word gsm_sub P((word a, word b)); +extern longword gsm_L_sub P((longword a, longword b)); + +extern word gsm_abs P((word a)); + +extern word gsm_norm P(( longword a )); + +extern longword gsm_L_asl P((longword a, int n)); +extern word gsm_asl P((word a, int n)); + +extern longword gsm_L_asr P((longword a, int n)); +extern word gsm_asr P((word a, int n)); + +/* + * Inlined functions from add.h + */ + +/* + * #define GSM_MULT_R(a, b) (* word a, word b, !(a == b == MIN_WORD) *) \ + * (0x0FFFF & SASR(((longword)(a) * (longword)(b) + 16384), 15)) + */ +#define GSM_MULT_R(a, b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR( ((longword)(a) * (longword)(b) + 16384), 15 )) + +# define GSM_MULT(a,b) /* word a, word b, !(a == b == MIN_WORD) */ \ + (SASR( ((longword)(a) * (longword)(b)), 15 )) + +# define GSM_L_MULT(a, b) /* word a, word b */ \ + (((longword)(a) * (longword)(b)) << 1) + +# define GSM_L_ADD(a, b) \ + ( (a) < 0 ? ( (b) >= 0 ? (a) + (b) \ + : (utmp = (ulongword)-((a) + 1) + (ulongword)-((b) + 1)) \ + >= MAX_LONGWORD ? MIN_LONGWORD : -(longword)utmp-2 ) \ + : ((b) <= 0 ? (a) + (b) \ + : (utmp = (ulongword)(a) + (ulongword)(b)) >= MAX_LONGWORD \ + ? MAX_LONGWORD : utmp)) + +/* + * # define GSM_ADD(a, b) \ + * ((ltmp = (longword)(a) + (longword)(b)) >= MAX_WORD \ + * ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) + */ +/* Nonportable, but faster: */ + +#define GSM_ADD(a, b) \ + ((ulongword)((ltmp = (longword)(a) + (longword)(b)) - MIN_WORD) > \ + MAX_WORD - MIN_WORD ? (ltmp > 0 ? MAX_WORD : MIN_WORD) : ltmp) + +# define GSM_SUB(a, b) \ + ((ltmp = (longword)(a) - (longword)(b)) >= MAX_WORD \ + ? MAX_WORD : ltmp <= MIN_WORD ? MIN_WORD : ltmp) + +# define GSM_ABS(a) ((a) < 0 ? ((a) == MIN_WORD ? MAX_WORD : -(a)) : (a)) + +/* Use these if necessary: + +# define GSM_MULT_R(a, b) gsm_mult_r(a, b) +# define GSM_MULT(a, b) gsm_mult(a, b) +# define GSM_L_MULT(a, b) gsm_L_mult(a, b) + +# define GSM_L_ADD(a, b) gsm_L_add(a, b) +# define GSM_ADD(a, b) gsm_add(a, b) +# define GSM_SUB(a, b) gsm_sub(a, b) + +# define GSM_ABS(a) gsm_abs(a) + +*/ + +/* + * More prototypes from implementations.. + */ +extern void Gsm_Coder P(( + struct gsm_state * S, + word * s, /* [0..159] samples IN */ + word * LARc, /* [0..7] LAR coefficients OUT */ + word * Nc, /* [0..3] LTP lag OUT */ + word * bc, /* [0..3] coded LTP gain OUT */ + word * Mc, /* [0..3] RPE grid selection OUT */ + word * xmaxc,/* [0..3] Coded maximum amplitude OUT */ + word * xMc /* [13*4] normalized RPE samples OUT */)); + +extern void Gsm_Long_Term_Predictor P(( /* 4x for 160 samples */ + struct gsm_state * S, + word * d, /* [0..39] residual signal IN */ + word * dp, /* [-120..-1] d' IN */ + word * e, /* [0..40] OUT */ + word * dpp, /* [0..40] OUT */ + word * Nc, /* correlation lag OUT */ + word * bc /* gain factor OUT */)); + +extern void Gsm_LPC_Analysis P(( + struct gsm_state * S, + word * s, /* 0..159 signals IN/OUT */ + word * LARc)); /* 0..7 LARc's OUT */ + +extern void Gsm_Preprocess P(( + struct gsm_state * S, + word * s, word * so)); + +extern void Gsm_Encoding P(( + struct gsm_state * S, + word * e, + word * ep, + word * xmaxc, + word * Mc, + word * xMc)); + +extern void Gsm_Short_Term_Analysis_Filter P(( + struct gsm_state * S, + word * LARc, /* coded log area ratio [0..7] IN */ + word * d /* st res. signal [0..159] IN/OUT */)); + +extern void Gsm_Decoder P(( + struct gsm_state * S, + word * LARcr, /* [0..7] IN */ + word * Ncr, /* [0..3] IN */ + word * bcr, /* [0..3] IN */ + word * Mcr, /* [0..3] IN */ + word * xmaxcr, /* [0..3] IN */ + word * xMcr, /* [0..13*4] IN */ + word * s)); /* [0..159] OUT */ + +extern void Gsm_Decoding P(( + struct gsm_state * S, + word xmaxcr, + word Mcr, + word * xMcr, /* [0..12] IN */ + word * erp)); /* [0..39] OUT */ + +extern void Gsm_Long_Term_Synthesis_Filtering P(( + struct gsm_state* S, + word Ncr, + word bcr, + word * erp, /* [0..39] IN */ + word * drp)); /* [-120..-1] IN, [0..40] OUT */ + +void Gsm_RPE_Decoding P(( + struct gsm_state *S, + word xmaxcr, + word Mcr, + word * xMcr, /* [0..12], 3 bits IN */ + word * erp)); /* [0..39] OUT */ + +void Gsm_RPE_Encoding P(( + struct gsm_state * S, + word * e, /* -5..-1][0..39][40..44 IN/OUT */ + word * xmaxc, /* OUT */ + word * Mc, /* OUT */ + word * xMc)); /* [0..12] OUT */ + +extern void Gsm_Short_Term_Synthesis_Filter P(( + struct gsm_state * S, + word * LARcr, /* log area ratios [0..7] IN */ + word * drp, /* received d [0...39] IN */ + word * s)); /* signal s [0..159] OUT */ + +extern void Gsm_Update_of_reconstructed_short_time_residual_signal P(( + word * dpp, /* [0...39] IN */ + word * ep, /* [0...39] IN */ + word * dp)); /* [-120...-1] IN/OUT */ + +/* + * Tables from table.c + */ +#ifndef GSM_TABLE_C + +extern word gsm_A[8], gsm_B[8], gsm_MIC[8], gsm_MAC[8]; +extern word gsm_INVA[8]; +extern word gsm_DLB[4], gsm_QLB[4]; +extern word gsm_H[11]; +extern word gsm_NRFAC[8]; +extern word gsm_FAC[8]; + +#endif /* GSM_TABLE_C */ + +/* + * Debugging + */ +#ifdef NDEBUG + +# define gsm_debug_words(a, b, c, d) /* nil */ +# define gsm_debug_longwords(a, b, c, d) /* nil */ +# define gsm_debug_word(a, b) /* nil */ +# define gsm_debug_longword(a, b) /* nil */ + +#else /* !NDEBUG => DEBUG */ + + extern void gsm_debug_words P((char * name, int, int, word *)); + extern void gsm_debug_longwords P((char * name, int, int, longword *)); + extern void gsm_debug_longword P((char * name, longword)); + extern void gsm_debug_word P((char * name, word)); + +#endif /* !NDEBUG */ + +#include "unproto.h" + +#endif /* PRIVATE_H */ diff --git a/gsm/proto.h b/gsm/proto.h new file mode 100644 index 0000000000..87cf05e8a7 --- /dev/null +++ b/gsm/proto.h @@ -0,0 +1,65 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/*$Header$*/ + +#ifndef PROTO_H +#define PROTO_H + +#if __cplusplus +# define NeedFunctionPrototypes 1 +#endif + +#if __STDC__ +# define NeedFunctionPrototypes 1 +#endif + +#ifdef _NO_PROTO +# undef NeedFunctionPrototypes +#endif + +#undef P /* gnu stdio.h actually defines this... */ +#undef P0 +#undef P1 +#undef P2 +#undef P3 +#undef P4 +#undef P5 +#undef P6 +#undef P7 +#undef P8 + +#if NeedFunctionPrototypes + +# define P( protos ) protos + +# define P0() (void) +# define P1(x, a) (a) +# define P2(x, a, b) (a, b) +# define P3(x, a, b, c) (a, b, c) +# define P4(x, a, b, c, d) (a, b, c, d) +# define P5(x, a, b, c, d, e) (a, b, c, d, e) +# define P6(x, a, b, c, d, e, f) (a, b, c, d, e, f) +# define P7(x, a, b, c, d, e, f, g) (a, b, c, d, e, f, g) +# define P8(x, a, b, c, d, e, f, g, h) (a, b, c, d, e, f, g, h) + +#else /* !NeedFunctionPrototypes */ + +# define P( protos ) ( /* protos */ ) + +# define P0() () +# define P1(x, a) x a; +# define P2(x, a, b) x a; b; +# define P3(x, a, b, c) x a; b; c; +# define P4(x, a, b, c, d) x a; b; c; d; +# define P5(x, a, b, c, d, e) x a; b; c; d; e; +# define P6(x, a, b, c, d, e, f) x a; b; c; d; e; f; +# define P7(x, a, b, c, d, e, f, g) x a; b; c; d; e; f; g; +# define P8(x, a, b, c, d, e, f, g, h) x a; b; c; d; e; f; g; h; + +#endif /* !NeedFunctionPrototypes */ + +#endif /* PROTO_H */ diff --git a/gsm/rpe.c b/gsm/rpe.c new file mode 100644 index 0000000000..8a6b81fae7 --- /dev/null +++ b/gsm/rpe.c @@ -0,0 +1,488 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> +#include <assert.h> + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +/* 4.2.13 .. 4.2.17 RPE ENCODING SECTION + */ + +/* 4.2.13 */ + +static void Weighting_filter P2((e, x), + register word * e, /* signal [-5..0.39.44] IN */ + word * x /* signal [0..39] OUT */ +) +/* + * The coefficients of the weighting filter are stored in a table + * (see table 4.4). The following scaling is used: + * + * H[0..10] = integer( real_H[ 0..10] * 8192 ); + */ +{ + /* word wt[ 50 ]; */ + + register longword L_result; + register int k /* , i */ ; + + /* Initialization of a temporary working array wt[0...49] + */ + + /* for (k = 0; k <= 4; k++) wt[k] = 0; + * for (k = 5; k <= 44; k++) wt[k] = *e++; + * for (k = 45; k <= 49; k++) wt[k] = 0; + * + * (e[-5..-1] and e[40..44] are allocated by the caller, + * are initially zero and are not written anywhere.) + */ + e -= 5; + + /* Compute the signal x[0..39] + */ + for (k = 0; k <= 39; k++) { + + L_result = 8192 >> 1; + + /* for (i = 0; i <= 10; i++) { + * L_temp = GSM_L_MULT( wt[k+i], gsm_H[i] ); + * L_result = GSM_L_ADD( L_result, L_temp ); + * } + */ + +#undef STEP +#define STEP( i, H ) (e[ k + i ] * (longword)H) + + /* Every one of these multiplications is done twice -- + * but I don't see an elegant way to optimize this. + * Do you? + */ + +#ifdef STUPID_COMPILER + L_result += STEP( 0, -134 ) ; + L_result += STEP( 1, -374 ) ; + /* + STEP( 2, 0 ) */ + L_result += STEP( 3, 2054 ) ; + L_result += STEP( 4, 5741 ) ; + L_result += STEP( 5, 8192 ) ; + L_result += STEP( 6, 5741 ) ; + L_result += STEP( 7, 2054 ) ; + /* + STEP( 8, 0 ) */ + L_result += STEP( 9, -374 ) ; + L_result += STEP( 10, -134 ) ; +#else + L_result += + STEP( 0, -134 ) + + STEP( 1, -374 ) + /* + STEP( 2, 0 ) */ + + STEP( 3, 2054 ) + + STEP( 4, 5741 ) + + STEP( 5, 8192 ) + + STEP( 6, 5741 ) + + STEP( 7, 2054 ) + /* + STEP( 8, 0 ) */ + + STEP( 9, -374 ) + + STEP(10, -134 ) + ; +#endif + + /* L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x2) *) + * L_result = GSM_L_ADD( L_result, L_result ); (* scaling(x4) *) + * + * x[k] = SASR( L_result, 16 ); + */ + + /* 2 adds vs. >>16 => 14, minus one shift to compensate for + * those we lost when replacing L_MULT by '*'. + */ + + L_result = SASR( L_result, 13 ); + x[k] = ( L_result < MIN_WORD ? MIN_WORD + : (L_result > MAX_WORD ? MAX_WORD : L_result )); + } +} + +/* 4.2.14 */ + +static void RPE_grid_selection P3((x,xM,Mc_out), + word * x, /* [0..39] IN */ + word * xM, /* [0..12] OUT */ + word * Mc_out /* OUT */ +) +/* + * The signal x[0..39] is used to select the RPE grid which is + * represented by Mc. + */ +{ + /* register word temp1; */ + register int /* m, */ i; + register longword L_result, L_temp; + longword EM; /* xxx should be L_EM? */ + word Mc; + + longword L_common_0_3; + + EM = 0; + Mc = 0; + + /* for (m = 0; m <= 3; m++) { + * L_result = 0; + * + * + * for (i = 0; i <= 12; i++) { + * + * temp1 = SASR( x[m + 3*i], 2 ); + * + * assert(temp1 != MIN_WORD); + * + * L_temp = GSM_L_MULT( temp1, temp1 ); + * L_result = GSM_L_ADD( L_temp, L_result ); + * } + * + * if (L_result > EM) { + * Mc = m; + * EM = L_result; + * } + * } + */ + +#undef STEP +#define STEP( m, i ) L_temp = SASR( x[m + 3 * i], 2 ); \ + L_result += L_temp * L_temp; + + /* common part of 0 and 3 */ + + L_result = 0; + STEP( 0, 1 ); STEP( 0, 2 ); STEP( 0, 3 ); STEP( 0, 4 ); + STEP( 0, 5 ); STEP( 0, 6 ); STEP( 0, 7 ); STEP( 0, 8 ); + STEP( 0, 9 ); STEP( 0, 10); STEP( 0, 11); STEP( 0, 12); + L_common_0_3 = L_result; + + /* i = 0 */ + + STEP( 0, 0 ); + L_result <<= 1; /* implicit in L_MULT */ + EM = L_result; + + /* i = 1 */ + + L_result = 0; + STEP( 1, 0 ); + STEP( 1, 1 ); STEP( 1, 2 ); STEP( 1, 3 ); STEP( 1, 4 ); + STEP( 1, 5 ); STEP( 1, 6 ); STEP( 1, 7 ); STEP( 1, 8 ); + STEP( 1, 9 ); STEP( 1, 10); STEP( 1, 11); STEP( 1, 12); + L_result <<= 1; + if (L_result > EM) { + Mc = 1; + EM = L_result; + } + + /* i = 2 */ + + L_result = 0; + STEP( 2, 0 ); + STEP( 2, 1 ); STEP( 2, 2 ); STEP( 2, 3 ); STEP( 2, 4 ); + STEP( 2, 5 ); STEP( 2, 6 ); STEP( 2, 7 ); STEP( 2, 8 ); + STEP( 2, 9 ); STEP( 2, 10); STEP( 2, 11); STEP( 2, 12); + L_result <<= 1; + if (L_result > EM) { + Mc = 2; + EM = L_result; + } + + /* i = 3 */ + + L_result = L_common_0_3; + STEP( 3, 12 ); + L_result <<= 1; + if (L_result > EM) { + Mc = 3; + EM = L_result; + } + + /**/ + + /* Down-sampling by a factor 3 to get the selected xM[0..12] + * RPE sequence. + */ + for (i = 0; i <= 12; i ++) xM[i] = x[Mc + 3*i]; + *Mc_out = Mc; +} + +/* 4.12.15 */ + +static void APCM_quantization_xmaxc_to_exp_mant P3((xmaxc,exp_out,mant_out), + word xmaxc, /* IN */ + word * exp_out, /* OUT */ + word * mant_out ) /* OUT */ +{ + word exp, mant; + + /* Compute exponent and mantissa of the decoded version of xmaxc + */ + + exp = 0; + if (xmaxc > 15) exp = SASR(xmaxc, 3) - 1; + mant = xmaxc - (exp << 3); + + if (mant == 0) { + exp = -4; + mant = 7; + } + else { + while (mant <= 7) { + mant = mant << 1 | 1; + exp--; + } + mant -= 8; + } + + assert( exp >= -4 && exp <= 6 ); + assert( mant >= 0 && mant <= 7 ); + + *exp_out = exp; + *mant_out = mant; +} + +static void APCM_quantization P5((xM,xMc,mant_out,exp_out,xmaxc_out), + word * xM, /* [0..12] IN */ + + word * xMc, /* [0..12] OUT */ + word * mant_out, /* OUT */ + word * exp_out, /* OUT */ + word * xmaxc_out /* OUT */ +) +{ + int i, itest; + + word xmax, xmaxc, temp, temp1, temp2; + word exp, mant; + + + /* Find the maximum absolute value xmax of xM[0..12]. + */ + + xmax = 0; + for (i = 0; i <= 12; i++) { + temp = xM[i]; + temp = GSM_ABS(temp); + if (temp > xmax) xmax = temp; + } + + /* Qantizing and coding of xmax to get xmaxc. + */ + + exp = 0; + temp = SASR( xmax, 9 ); + itest = 0; + + for (i = 0; i <= 5; i++) { + + itest |= (temp <= 0); + temp = SASR( temp, 1 ); + + assert(exp <= 5); + if (itest == 0) exp++; /* exp = add (exp, 1) */ + } + + assert(exp <= 6 && exp >= 0); + temp = exp + 5; + + assert(temp <= 11 && temp >= 0); + xmaxc = gsm_add( SASR(xmax, temp), exp << 3 ); + + /* Quantizing and coding of the xM[0..12] RPE sequence + * to get the xMc[0..12] + */ + + APCM_quantization_xmaxc_to_exp_mant( xmaxc, &exp, &mant ); + + /* This computation uses the fact that the decoded version of xmaxc + * can be calculated by using the exponent and the mantissa part of + * xmaxc (logarithmic table). + * So, this method avoids any division and uses only a scaling + * of the RPE samples by a function of the exponent. A direct + * multiplication by the inverse of the mantissa (NRFAC[0..7] + * found in table 4.5) gives the 3 bit coded version xMc[0..12] + * of the RPE samples. + */ + + + /* Direct computation of xMc[0..12] using table 4.5 + */ + + assert( exp <= 4096 && exp >= -4096); + assert( mant >= 0 && mant <= 7 ); + + temp1 = 6 - exp; /* normalization by the exponent */ + temp2 = gsm_NRFAC[ mant ]; /* inverse mantissa */ + + for (i = 0; i <= 12; i++) { + + assert(temp1 >= 0 && temp1 < 16); + + temp = xM[i] << temp1; + temp = GSM_MULT( temp, temp2 ); + temp = SASR(temp, 12); + xMc[i] = temp + 4; /* see note below */ + } + + /* NOTE: This equation is used to make all the xMc[i] positive. + */ + + *mant_out = mant; + *exp_out = exp; + *xmaxc_out = xmaxc; +} + +/* 4.2.16 */ + +static void APCM_inverse_quantization P4((xMc,mant,exp,xMp), + register word * xMc, /* [0..12] IN */ + word mant, + word exp, + register word * xMp) /* [0..12] OUT */ +/* + * This part is for decoding the RPE sequence of coded xMc[0..12] + * samples to obtain the xMp[0..12] array. Table 4.6 is used to get + * the mantissa of xmaxc (FAC[0..7]). + */ +{ + int i; + word temp, temp1, temp2, temp3; + longword ltmp; + + assert( mant >= 0 && mant <= 7 ); + + temp1 = gsm_FAC[ mant ]; /* see 4.2-15 for mant */ + temp2 = gsm_sub( 6, exp ); /* see 4.2-15 for exp */ + temp3 = gsm_asl( 1, gsm_sub( temp2, 1 )); + + for (i = 13; i--;) { + + assert( *xMc <= 7 && *xMc >= 0 ); /* 3 bit unsigned */ + + /* temp = gsm_sub( *xMc++ << 1, 7 ); */ + temp = (*xMc++ << 1) - 7; /* restore sign */ + assert( temp <= 7 && temp >= -7 ); /* 4 bit signed */ + + temp <<= 12; /* 16 bit signed */ + temp = GSM_MULT_R( temp1, temp ); + temp = GSM_ADD( temp, temp3 ); + *xMp++ = gsm_asr( temp, temp2 ); + } +} + +/* 4.2.17 */ + +static void RPE_grid_positioning P3((Mc,xMp,ep), + word Mc, /* grid position IN */ + register word * xMp, /* [0..12] IN */ + register word * ep /* [0..39] OUT */ +) +/* + * This procedure computes the reconstructed long term residual signal + * ep[0..39] for the LTP analysis filter. The inputs are the Mc + * which is the grid position selection and the xMp[0..12] decoded + * RPE samples which are upsampled by a factor of 3 by inserting zero + * values. + */ +{ + int i = 13; + + assert(0 <= Mc && Mc <= 3); + + switch (Mc) { + case 3: *ep++ = 0; + case 2: do { + *ep++ = 0; + case 1: *ep++ = 0; + case 0: *ep++ = *xMp++; + } while (--i); + } + while (++Mc < 4) *ep++ = 0; + + /* + + int i, k; + for (k = 0; k <= 39; k++) ep[k] = 0; + for (i = 0; i <= 12; i++) { + ep[ Mc + (3*i) ] = xMp[i]; + } + */ +} + +/* 4.2.18 */ + +/* This procedure adds the reconstructed long term residual signal + * ep[0..39] to the estimated signal dpp[0..39] from the long term + * analysis filter to compute the reconstructed short term residual + * signal dp[-40..-1]; also the reconstructed short term residual + * array dp[-120..-41] is updated. + */ + +#if 0 /* Has been inlined in code.c */ +void Gsm_Update_of_reconstructed_short_time_residual_signal P3((dpp, ep, dp), + word * dpp, /* [0...39] IN */ + word * ep, /* [0...39] IN */ + word * dp) /* [-120...-1] IN/OUT */ +{ + int k; + + for (k = 0; k <= 79; k++) + dp[ -120 + k ] = dp[ -80 + k ]; + + for (k = 0; k <= 39; k++) + dp[ -40 + k ] = gsm_add( ep[k], dpp[k] ); +} +#endif /* Has been inlined in code.c */ + +void Gsm_RPE_Encoding P5((S,e,xmaxc,Mc,xMc), + + struct gsm_state * S, + + word * e, /* -5..-1][0..39][40..44 IN/OUT */ + word * xmaxc, /* OUT */ + word * Mc, /* OUT */ + word * xMc) /* [0..12] OUT */ +{ + word x[40]; + word xM[13], xMp[13]; + word mant, exp; + + Weighting_filter(e, x); + RPE_grid_selection(x, xM, Mc); + + APCM_quantization( xM, xMc, &mant, &exp, xmaxc); + APCM_inverse_quantization( xMc, mant, exp, xMp); + + RPE_grid_positioning( *Mc, xMp, e ); + +} + +void Gsm_RPE_Decoding P5((S, xmaxcr, Mcr, xMcr, erp), + struct gsm_state * S, + + word xmaxcr, + word Mcr, + word * xMcr, /* [0..12], 3 bits IN */ + word * erp /* [0..39] OUT */ +) +{ + word exp, mant; + word xMp[ 13 ]; + + APCM_quantization_xmaxc_to_exp_mant( xmaxcr, &exp, &mant ); + APCM_inverse_quantization( xMcr, mant, exp, xMp ); + RPE_grid_positioning( Mcr, xMp, erp ); + +} diff --git a/gsm/short_term.c b/gsm/short_term.c new file mode 100644 index 0000000000..4f5fd7be74 --- /dev/null +++ b/gsm/short_term.c @@ -0,0 +1,429 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include <stdio.h> +#include <assert.h> + +#include "private.h" + +#include "gsm.h" +#include "proto.h" + +/* + * SHORT TERM ANALYSIS FILTERING SECTION + */ + +/* 4.2.8 */ + +static void Decoding_of_the_coded_Log_Area_Ratios P2((LARc,LARpp), + word * LARc, /* coded log area ratio [0..7] IN */ + word * LARpp) /* out: decoded .. */ +{ + register word temp1 /* , temp2 */; + register long ltmp; /* for GSM_ADD */ + + /* This procedure requires for efficient implementation + * two tables. + * + * INVA[1..8] = integer( (32768 * 8) / real_A[1..8]) + * MIC[1..8] = minimum value of the LARc[1..8] + */ + + /* Compute the LARpp[1..8] + */ + + /* for (i = 1; i <= 8; i++, B++, MIC++, INVA++, LARc++, LARpp++) { + * + * temp1 = GSM_ADD( *LARc, *MIC ) << 10; + * temp2 = *B << 1; + * temp1 = GSM_SUB( temp1, temp2 ); + * + * assert(*INVA != MIN_WORD); + * + * temp1 = GSM_MULT_R( *INVA, temp1 ); + * *LARpp = GSM_ADD( temp1, temp1 ); + * } + */ + +#undef STEP +#define STEP( B, MIC, INVA ) \ + temp1 = GSM_ADD( *LARc++, MIC ) << 10; \ + temp1 = GSM_SUB( temp1, B << 1 ); \ + temp1 = GSM_MULT_R( INVA, temp1 ); \ + *LARpp++ = GSM_ADD( temp1, temp1 ); + + STEP( 0, -32, 13107 ); + STEP( 0, -32, 13107 ); + STEP( 2048, -16, 13107 ); + STEP( -2560, -16, 13107 ); + + STEP( 94, -8, 19223 ); + STEP( -1792, -8, 17476 ); + STEP( -341, -4, 31454 ); + STEP( -1144, -4, 29708 ); + + /* NOTE: the addition of *MIC is used to restore + * the sign of *LARc. + */ +} + +/* 4.2.9 */ +/* Computation of the quantized reflection coefficients + */ + +/* 4.2.9.1 Interpolation of the LARpp[1..8] to get the LARp[1..8] + */ + +/* + * Within each frame of 160 analyzed speech samples the short term + * analysis and synthesis filters operate with four different sets of + * coefficients, derived from the previous set of decoded LARs(LARpp(j-1)) + * and the actual set of decoded LARs (LARpp(j)) + * + * (Initial value: LARpp(j-1)[1..8] = 0.) + */ + +static void Coefficients_0_12 P3((LARpp_j_1, LARpp_j, LARp), + register word * LARpp_j_1, + register word * LARpp_j, + register word * LARp) +{ + register int i; + register longword ltmp; + + for (i = 1; i <= 8; i++, LARp++, LARpp_j_1++, LARpp_j++) { + *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); + *LARp = GSM_ADD( *LARp, SASR( *LARpp_j_1, 1)); + } +} + +static void Coefficients_13_26 P3((LARpp_j_1, LARpp_j, LARp), + register word * LARpp_j_1, + register word * LARpp_j, + register word * LARp) +{ + register int i; + register longword ltmp; + for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { + *LARp = GSM_ADD( SASR( *LARpp_j_1, 1), SASR( *LARpp_j, 1 )); + } +} + +static void Coefficients_27_39 P3((LARpp_j_1, LARpp_j, LARp), + register word * LARpp_j_1, + register word * LARpp_j, + register word * LARp) +{ + register int i; + register longword ltmp; + + for (i = 1; i <= 8; i++, LARpp_j_1++, LARpp_j++, LARp++) { + *LARp = GSM_ADD( SASR( *LARpp_j_1, 2 ), SASR( *LARpp_j, 2 )); + *LARp = GSM_ADD( *LARp, SASR( *LARpp_j, 1 )); + } +} + + +static void Coefficients_40_159 P2((LARpp_j, LARp), + register word * LARpp_j, + register word * LARp) +{ + register int i; + + for (i = 1; i <= 8; i++, LARp++, LARpp_j++) + *LARp = *LARpp_j; +} + +/* 4.2.9.2 */ + +static void LARp_to_rp P1((LARp), + register word * LARp) /* [0..7] IN/OUT */ +/* + * The input of this procedure is the interpolated LARp[0..7] array. + * The reflection coefficients, rp[i], are used in the analysis + * filter and in the synthesis filter. + */ +{ + register int i; + register word temp; + register longword ltmp; + + for (i = 1; i <= 8; i++, LARp++) { + + /* temp = GSM_ABS( *LARp ); + * + * if (temp < 11059) temp <<= 1; + * else if (temp < 20070) temp += 11059; + * else temp = GSM_ADD( temp >> 2, 26112 ); + * + * *LARp = *LARp < 0 ? -temp : temp; + */ + + if (*LARp < 0) { + temp = *LARp == MIN_WORD ? MAX_WORD : -(*LARp); + *LARp = - ((temp < 11059) ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD( temp >> 2, 26112 ))); + } else { + temp = *LARp; + *LARp = (temp < 11059) ? temp << 1 + : ((temp < 20070) ? temp + 11059 + : GSM_ADD( temp >> 2, 26112 )); + } + } +} + + +/* 4.2.10 */ +static void Short_term_analysis_filtering P4((S,rp,k_n,s), + struct gsm_state * S, + register word * rp, /* [0..7] IN */ + register int k_n, /* k_end - k_start */ + register word * s /* [0..n-1] IN/OUT */ +) +/* + * This procedure computes the short term residual signal d[..] to be fed + * to the RPE-LTP loop from the s[..] signal and from the local rp[..] + * array (quantized reflection coefficients). As the call of this + * procedure can be done in many ways (see the interpolation of the LAR + * coefficient), it is assumed that the computation begins with index + * k_start (for arrays d[..] and s[..]) and stops with index k_end + * (k_start and k_end are defined in 4.2.9.1). This procedure also + * needs to keep the array u[0..7] in memory for each call. + */ +{ + register word * u = S->u; + register int i; + register word di, zzz, ui, sav, rpi; + register longword ltmp; + + for (; k_n--; s++) { + + di = sav = *s; + + for (i = 0; i < 8; i++) { /* YYY */ + + ui = u[i]; + rpi = rp[i]; + u[i] = sav; + + zzz = GSM_MULT_R(rpi, di); + sav = GSM_ADD( ui, zzz); + + zzz = GSM_MULT_R(rpi, ui); + di = GSM_ADD( di, zzz ); + } + + *s = di; + } +} + +#if defined(USE_FLOAT_MUL) && defined(FAST) + +static void Fast_Short_term_analysis_filtering P4((S,rp,k_n,s), + struct gsm_state * S, + register word * rp, /* [0..7] IN */ + register int k_n, /* k_end - k_start */ + register word * s /* [0..n-1] IN/OUT */ +) +{ + register word * u = S->u; + register int i; + + float uf[8], + rpf[8]; + + register float scalef = 3.0517578125e-5; + register float sav, di, temp; + + for (i = 0; i < 8; ++i) { + uf[i] = u[i]; + rpf[i] = rp[i] * scalef; + } + for (; k_n--; s++) { + sav = di = *s; + for (i = 0; i < 8; ++i) { + register float rpfi = rpf[i]; + register float ufi = uf[i]; + + uf[i] = sav; + temp = rpfi * di + ufi; + di += rpfi * ufi; + sav = temp; + } + *s = di; + } + for (i = 0; i < 8; ++i) u[i] = uf[i]; +} +#endif /* ! (defined (USE_FLOAT_MUL) && defined (FAST)) */ + +static void Short_term_synthesis_filtering P5((S,rrp,k,wt,sr), + struct gsm_state * S, + register word * rrp, /* [0..7] IN */ + register int k, /* k_end - k_start */ + register word * wt, /* [0..k-1] IN */ + register word * sr /* [0..k-1] OUT */ +) +{ + register word * v = S->v; + register int i; + register word sri, tmp1, tmp2; + register longword ltmp; /* for GSM_ADD & GSM_SUB */ + + while (k--) { + sri = *wt++; + for (i = 8; i--;) { + + /* sri = GSM_SUB( sri, gsm_mult_r( rrp[i], v[i] ) ); + */ + tmp1 = rrp[i]; + tmp2 = v[i]; + tmp2 = ( tmp1 == MIN_WORD && tmp2 == MIN_WORD + ? MAX_WORD + : 0x0FFFF & (( (longword)tmp1 * (longword)tmp2 + + 16384) >> 15)) ; + + sri = GSM_SUB( sri, tmp2 ); + + /* v[i+1] = GSM_ADD( v[i], gsm_mult_r( rrp[i], sri ) ); + */ + tmp1 = ( tmp1 == MIN_WORD && sri == MIN_WORD + ? MAX_WORD + : 0x0FFFF & (( (longword)tmp1 * (longword)sri + + 16384) >> 15)) ; + + v[i+1] = GSM_ADD( v[i], tmp1); + } + *sr++ = v[0] = sri; + } +} + + +#if defined(FAST) && defined(USE_FLOAT_MUL) + +static void Fast_Short_term_synthesis_filtering P5((S,rrp,k,wt,sr), + struct gsm_state * S, + register word * rrp, /* [0..7] IN */ + register int k, /* k_end - k_start */ + register word * wt, /* [0..k-1] IN */ + register word * sr /* [0..k-1] OUT */ +) +{ + register word * v = S->v; + register int i; + + float va[9], rrpa[8]; + register float scalef = 3.0517578125e-5, temp; + + for (i = 0; i < 8; ++i) { + va[i] = v[i]; + rrpa[i] = (float)rrp[i] * scalef; + } + while (k--) { + register float sri = *wt++; + for (i = 8; i--;) { + sri -= rrpa[i] * va[i]; + if (sri < -32768.) sri = -32768.; + else if (sri > 32767.) sri = 32767.; + + temp = va[i] + rrpa[i] * sri; + if (temp < -32768.) temp = -32768.; + else if (temp > 32767.) temp = 32767.; + va[i+1] = temp; + } + *sr++ = va[0] = sri; + } + for (i = 0; i < 9; ++i) v[i] = va[i]; +} + +#endif /* defined(FAST) && defined(USE_FLOAT_MUL) */ + +void Gsm_Short_Term_Analysis_Filter P3((S,LARc,s), + + struct gsm_state * S, + + word * LARc, /* coded log area ratio [0..7] IN */ + word * s /* signal [0..159] IN/OUT */ +) +{ + word * LARpp_j = S->LARpp[ S->j ]; + word * LARpp_j_1 = S->LARpp[ S->j ^= 1 ]; + + word LARp[8]; + +#undef FILTER +#if defined(FAST) && defined(USE_FLOAT_MUL) +# define FILTER (* (S->fast \ + ? Fast_Short_term_analysis_filtering \ + : Short_term_analysis_filtering )) + +#else +# define FILTER Short_term_analysis_filtering +#endif + + Decoding_of_the_coded_Log_Area_Ratios( LARc, LARpp_j ); + + Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); + LARp_to_rp( LARp ); + FILTER( S, LARp, 13, s); + + Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); + LARp_to_rp( LARp ); + FILTER( S, LARp, 14, s + 13); + + Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); + LARp_to_rp( LARp ); + FILTER( S, LARp, 13, s + 27); + + Coefficients_40_159( LARpp_j, LARp); + LARp_to_rp( LARp ); + FILTER( S, LARp, 120, s + 40); +} + +void Gsm_Short_Term_Synthesis_Filter P4((S, LARcr, wt, s), + struct gsm_state * S, + + word * LARcr, /* received log area ratios [0..7] IN */ + word * wt, /* received d [0..159] IN */ + + word * s /* signal s [0..159] OUT */ +) +{ + word * LARpp_j = S->LARpp[ S->j ]; + word * LARpp_j_1 = S->LARpp[ S->j ^=1 ]; + + word LARp[8]; + +#undef FILTER +#if defined(FAST) && defined(USE_FLOAT_MUL) + +# define FILTER (* (S->fast \ + ? Fast_Short_term_synthesis_filtering \ + : Short_term_synthesis_filtering )) +#else +# define FILTER Short_term_synthesis_filtering +#endif + + Decoding_of_the_coded_Log_Area_Ratios( LARcr, LARpp_j ); + + Coefficients_0_12( LARpp_j_1, LARpp_j, LARp ); + LARp_to_rp( LARp ); + FILTER( S, LARp, 13, wt, s ); + + Coefficients_13_26( LARpp_j_1, LARpp_j, LARp); + LARp_to_rp( LARp ); + FILTER( S, LARp, 14, wt + 13, s + 13 ); + + Coefficients_27_39( LARpp_j_1, LARpp_j, LARp); + LARp_to_rp( LARp ); + FILTER( S, LARp, 13, wt + 27, s + 27 ); + + Coefficients_40_159( LARpp_j, LARp ); + LARp_to_rp( LARp ); + FILTER(S, LARp, 120, wt + 40, s + 40); +} diff --git a/gsm/table.c b/gsm/table.c new file mode 100644 index 0000000000..16a04118c1 --- /dev/null +++ b/gsm/table.c @@ -0,0 +1,63 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +/* Most of these tables are inlined at their point of use. + */ + +/* 4.4 TABLES USED IN THE FIXED POINT IMPLEMENTATION OF THE RPE-LTP + * CODER AND DECODER + * + * (Most of them inlined, so watch out.) + */ + +#define GSM_TABLE_C +#include "private.h" +#include "gsm.h" + +/* Table 4.1 Quantization of the Log.-Area Ratios + */ +/* i 1 2 3 4 5 6 7 8 */ +word gsm_A[8] = {20480, 20480, 20480, 20480, 13964, 15360, 8534, 9036}; +word gsm_B[8] = { 0, 0, 2048, -2560, 94, -1792, -341, -1144}; +word gsm_MIC[8] = { -32, -32, -16, -16, -8, -8, -4, -4 }; +word gsm_MAC[8] = { 31, 31, 15, 15, 7, 7, 3, 3 }; + + +/* Table 4.2 Tabulation of 1/A[1..8] + */ +word gsm_INVA[8]={ 13107, 13107, 13107, 13107, 19223, 17476, 31454, 29708 }; + + +/* Table 4.3a Decision level of the LTP gain quantizer + */ +/* bc 0 1 2 3 */ +word gsm_DLB[4] = { 6554, 16384, 26214, 32767 }; + + +/* Table 4.3b Quantization levels of the LTP gain quantizer + */ +/* bc 0 1 2 3 */ +word gsm_QLB[4] = { 3277, 11469, 21299, 32767 }; + + +/* Table 4.4 Coefficients of the weighting filter + */ +/* i 0 1 2 3 4 5 6 7 8 9 10 */ +word gsm_H[11] = {-134, -374, 0, 2054, 5741, 8192, 5741, 2054, 0, -374, -134 }; + + +/* Table 4.5 Normalized inverse mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_NRFAC[8] = { 29128, 26215, 23832, 21846, 20165, 18725, 17476, 16384 }; + + +/* Table 4.6 Normalized direct mantissa used to compute xM/xmax + */ +/* i 0 1 2 3 4 5 6 7 */ +word gsm_FAC[8] = { 18431, 20479, 22527, 24575, 26623, 28671, 30719, 32767 }; diff --git a/gsm/toast.c b/gsm/toast.c new file mode 100644 index 0000000000..bea46827f6 --- /dev/null +++ b/gsm/toast.c @@ -0,0 +1,800 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "toast.h" + +/* toast -- lossy sound compression using the gsm library. + */ + +char * progname; + +int f_decode = 0; /* decode rather than encode (-d) */ +int f_cat = 0; /* write to stdout; implies -p (-c) */ +int f_force = 0; /* don't ask about replacements (-f) */ +int f_precious = 0; /* avoid deletion of original (-p) */ +int f_fast = 0; /* use faster fpt algorithm (-F) */ +int f_verbose = 0; /* debugging (-V) */ +int f_ltp_cut = 0; /* LTP cut-off margin (-C) */ + +struct stat instat; /* stat (inname) */ + +FILE *in, *out; +char *inname, *outname; + +/* + * The function (*output)() writes a frame of 160 samples given as + * 160 signed 16 bit values (gsm_signals) to <out>. + * The function (*input)() reads one such frame from <in>. + * The function (*init_output)() begins output (e.g. writes a header)., + * The function (*init_input)() begins input (e.g. skips a header). + * + * There are different versions of input, output, init_input and init_output + * for different formats understood by toast; which ones are used + * depends on the command line arguments and, in their absence, the + * filename; the fallback is #defined in toast.h + * + * The specific implementations of input, output, init_input and init_output + * for a format `foo' live in toast_foo.c. + */ + +int (*output ) P((gsm_signal *)), + (*input ) P((gsm_signal *)); +int (*init_input) P((void)), + (*init_output) P((void)); + +static int generic_init P0() { return 0; } /* NOP */ + +struct fmtdesc { + + char * name, * longname, * suffix; + + int (* init_input ) P((void)), + (* init_output) P((void)); + + int (* input ) P((gsm_signal * )), + (* output) P((gsm_signal * )); + +} f_audio = { + "audio", + "8 kHz, 8 bit u-law encoding with Sun audio header", ".au", + audio_init_input, + audio_init_output, + ulaw_input, + ulaw_output +}, f_ulaw = { + "u-law", "plain 8 kHz, 8 bit u-law encoding", ".u", + generic_init, + generic_init, + ulaw_input, + ulaw_output + +}, f_alaw = { + "A-law", "8 kHz, 8 bit A-law encoding", ".A", + generic_init, + generic_init, + alaw_input, + alaw_output + +}, f_linear = { + "linear", + "16 bit (13 significant) signed 8 kHz signal", ".l", + generic_init, + generic_init, + linear_input, + linear_output +}; + +struct fmtdesc * alldescs[] = { + &f_audio, + &f_alaw, + &f_ulaw, + &f_linear, + (struct fmtdesc *)NULL +}; + +#define DEFAULT_FORMAT f_ulaw /* default audio format, others */ + /* are: f_alaw,f_audio,f_linear */ +struct fmtdesc * f_format = 0; + +/* + * basename + suffix of a pathname + */ +static char * endname P1((name), char * name) +{ + if (name) { + char * s = strrchr(name, '/'); + if (s && s[1]) name = s + 1; + } + return name; + +} + +/* + * Try to figure out what we're supposed to do from the argv[0], if + * any, and set the parameters accordingly. + */ +static void parse_argv0 P1((av0), char * av0 ) +{ + int l; + + progname = av0 = endname(av0 ? av0 : "toast"); + + /* If the name starts with `un', we want to decode, not code. + * If the name ends in `cat', we want to write to stdout, + * and decode as well. + */ + + if (!strncmp(av0, "un", 2)) f_decode = 1; + if ( (l = strlen(av0)) >= 3 /* strlen("cat") */ + && !strcmp( av0 + l - 3, "cat" )) f_cat = f_decode = 1; +} + + +/* + * Check whether the name (possibly generated by appending + * .gsm to something else) is short enough for this system. + */ +static int length_okay P1((name), char * name) +{ + long max_filename_length = 0; + char * end; + + /* If our _pathname_ is too long, we'll usually not be + * able to open the file at all -- don't worry about that. + * + * But if the _filename_ is too long, there is danger of + * silent truncation on some systems, which results + * in the target replacing the source! + */ + + if (!name) return 0; + end = endname(name); + +#ifdef NAME_MAX + max_filename_length = NAME_MAX; +#else +#ifdef _PC_NAME_MAX +#ifdef USE_PATHCONF + { char * s, tmp; + + /* s = dirname(name) + */ + if ((s = end) > name) { + if (s > name + 1) s--; + tmp = s; + *s = 0; + } + + errno = 0; + max_filename_length = pathconf(s > name ? name : ".", + _PC_NAME_MAX); + if (max_filename_length == -1 && errno) { + perror( s > name ? name : "." ); + fprintf(stderr, + "%s: cannot get dynamic filename length limit for %s.\n", + progname, s > name ? name : "."); + return 0; + } + if (s > name) *s = tmp; + } +#endif /* USE_PATHCONF */ +#endif /* _PC_NAME_MAX */ +#endif /* !NAME_MAX */ + + if (max_filename_length > 0 && strlen(end) > max_filename_length) { + fprintf(stderr, + "%s: filename \"%s\" is too long (maximum is %ld)\n", + progname, endname(name), max_filename_length ); + return 0; + } + + return 1; +} + +/* + * Return a pointer the suffix of a string, if any. + * A suffix alone has no suffix, an empty suffix can not be had. + */ +static char * suffix P2((name, suf), char *name, char * suf) +{ + size_t nlen = strlen(name); + size_t slen = strlen(suf); + + if (!slen || nlen <= slen) return (char *)0; + name += nlen - slen; + return memcmp(name, suf, slen) ? (char *)0 : name; +} + + +static void catch_signals P1((fun), SIGHANDLER_T (*fun) ()) +{ +#ifdef SIGHUP + signal( SIGHUP, fun ); +#endif +#ifdef SIGINT + signal( SIGINT, fun ); +#endif +#ifdef SIGPIPE + signal( SIGPIPE, fun ); +#endif +#ifdef SIGTERM + signal( SIGTERM, fun ); +#endif +#ifdef SIGXFSZ + signal( SIGXFSZ, fun ); +#endif +} + +static SIGHANDLER_T onintr P0() +{ + char * tmp = outname; + +#ifdef HAS_SYSV_SIGNALS + catch_signals( SIG_IGN ); +#endif + + outname = (char *)0; + if (tmp) (void)unlink(tmp); + + exit(1); +} + +/* + * Allocate some memory and complain if it fails. + */ +static char * emalloc P1((len), size_t len) +{ + char * s; + if (!(s = malloc(len))) { + fprintf(stderr, "%s: failed to malloc %d bytes -- abort\n", + progname, len); + onintr(); + exit(1); + } + return s; +} + +static char* normalname P3((name, want, cut), char *name, char *want,char *cut) +{ + size_t maxlen; + char * s, * p; + + p = (char *)0; + if (!name) return p; + + maxlen = strlen(name) + 1 + strlen(want) + strlen(cut); + p = strcpy(emalloc(maxlen), name); + + if (s = suffix(p, cut)) strcpy(s, want); + else if (*want && !suffix(p, want)) strcat(p, want); + + return p; +} + +/* + * Generate a `plain' (non-encoded) name from a given name. + */ +static char * plainname P1((name), char *name) +{ + return normalname(name, "", SUFFIX_TOASTED ); +} + +/* + * Generate a `code' name from a given name. + */ +static char * codename P1((name), char *name) +{ + return normalname( name, SUFFIX_TOASTED, "" ); +} + +/* + * If we're supposed to ask (fileno (stderr) is a tty, and f_force not + * set), ask the user whether to overwrite a file or not. + */ +static int ok_to_replace P1(( name ), char * name) +{ + int reply, c; + + if (f_force) return 1; /* YES, do replace */ + if (!isatty(fileno(stderr))) return 0; /* NO, don't replace */ + + fprintf(stderr, + "%s already exists; do you wish to overwrite %s (y or n)? ", + name, name); + fflush(stderr); + + for (c = reply = getchar(); c != '\n' && c != EOF; c = getchar()) ; + if (reply == 'y') return 1; + + fprintf(stderr, "\tnot overwritten\n"); + return 0; +} + +static void update_mode P0() +{ + if (!instat.st_nlink) return; /* couldn't stat in */ + +#ifdef HAS_FCHMOD + if (fchmod(fileno(out), instat.st_mode & 07777)) { + perror(outname); + fprintf(stderr, "%s: could not change file mode of \"%s\"\n", + progname, outname); + } +#else +#ifdef HAS_CHMOD + if (outname && chmod(outname, instat.st_mode & 07777)) { + perror(outname); + fprintf(stderr, "%s: could not change file mode of \"%s\"\n", + progname, outname); + } +#endif /* HAS_CHMOD */ +#endif /* HAS_FCHMOD */ +} + +static void update_own P0() +{ + if (!instat.st_nlink) return; /* couldn't stat in */ +#ifdef HAS_FCHOWN + (void)fchown(fileno(out), instat.st_uid, instat.st_gid); +#else +#ifdef HAS_CHOWN + (void)chown(outname, instat.st_uid, instat.st_gid); +#endif /* HAS_CHOWN */ +#endif /* HAS_FCHOWN */ +} + +static void update_times P0() +{ + if (!instat.st_nlink) return; /* couldn't stat in */ + +#ifdef HAS_UTIMES + if (outname) { + struct timeval tv[2]; + + tv[0].tv_sec = instat.st_atime; + tv[1].tv_sec = instat.st_mtime; + tv[0].tv_usec = tv[1].tv_usec = 0; + (void) utimes(outname, tv); + } +#else +#ifdef HAS_UTIME + + if (outname) { + +#ifdef HAS_UTIMBUF + struct utimbuf ut; + + ut.actime = instat.st_atime; + ut.modtime = instat.st_mtime; + +# ifdef HAS_UTIMEUSEC + ut.acusec = instat.st_ausec; + ut.modusec = instat.st_musec; +# endif /* HAS_UTIMEUSEC */ + + (void) utime(outname, &ut); + +#else /* UTIMBUF */ + + time_t ut[2]; + + ut[0] = instat.st_atime; + ut[1] = instat.st_mtime; + + (void) utime(outname, ut); + +#endif /* UTIMBUF */ + } +#endif /* HAS_UTIME */ +#endif /* HAS_UTIMES */ +} + + +static int okay_as_input P3((name,f,st), char* name, FILE* f, struct stat * st) +{ +# ifdef HAS_FSTAT + if (fstat(fileno(f), st) < 0) +# else + if (stat(name, st) < 0) +# endif + { + perror(name); + fprintf(stderr, "%s: cannot stat \"%s\"\n", progname, name); + return 0; + } + + if (!S_ISREG(st->st_mode)) { + fprintf(stderr, + "%s: \"%s\" is not a regular file -- unchanged.\n", + progname, name); + return 0; + } + if (st->st_nlink > 1 && !f_cat && !f_precious) { + fprintf(stderr, + "%s: \"%s\" has %s other link%s -- unchanged.\n", + progname,name,st->st_nlink - 1,"s" + (st->st_nlink<=2)); + return 0; + } + return 1; +} + +static void prepare_io P1(( desc), struct fmtdesc * desc) +{ + output = desc->output; + input = desc->input; + + init_input = desc->init_input; + init_output = desc->init_output; +} + +static struct fmtdesc * grok_format P1((name), char * name) +{ + char * c; + struct fmtdesc ** f; + + if (name) { + c = plainname(name); + + for (f = alldescs; *f; f++) { + if ( (*f)->suffix + && *(*f)->suffix + && suffix(c, (*f)->suffix)) { + + free(c); + return *f; + } + } + + free(c); + } + return (struct fmtdesc *)0; +} + +static int open_input P2((name, st), char * name, struct stat * st) +{ + struct fmtdesc * f = f_format; + + st->st_nlink = 0; /* indicates `undefined' value */ + if (!name) { + inname = (char *)NULL; + in = stdin; +#ifdef HAS__FSETMODE + _fsetmode(in, "b"); +#endif + } + else { + if (f_decode) inname = codename(name); + else { + if (!f_cat && suffix(name, SUFFIX_TOASTED)) { + fprintf(stderr, + "%s: %s already has \"%s\" suffix -- unchanged.\n", + progname, name, SUFFIX_TOASTED ); + return 0; + } + inname = strcpy(emalloc(strlen(name)+1), name); + } + if (!(in = fopen(inname, READ))) { + perror(inname); /* not guaranteed to be valid here */ + fprintf(stderr, "%s: cannot open \"%s\" for reading\n", + progname, inname); + return 0; + } + if (!okay_as_input(inname, in, st)) return 0; + if (!f) f = grok_format(inname); + } + prepare_io( f ? f : & DEFAULT_FORMAT ); + return 1; +} + +static int open_output P1((name), char *name) +{ + if (!name || f_cat) { + out = stdout; + outname = (char *)NULL; +#ifdef HAS__FSETMODE + _fsetmode(out, "b"); +#endif + } + else { + int outfd = -1; + char * o; + + o = (*(f_decode ? plainname : codename))(name); + if (!length_okay(o)) return 0; + if ((outfd = open(o, O_WRITE_EXCL, 0666)) >= 0) + out = fdopen(outfd, WRITE); + else if (errno != EEXIST) out = (FILE *)NULL; + else if (ok_to_replace(o)) out = fopen(o, WRITE); + else return 0; + + if (!out) { + perror(o); + fprintf(stderr, + "%s: can't open \"%s\" for writing\n", + progname, o); + if (outfd >= 0) (void)close(outfd); + return 0; + } + + outname = o; + } + return 1; +} + +static int process_encode P0() +{ + gsm r; + gsm_signal s[ 160 ]; + gsm_frame d; + + int cc; + + if (!(r = gsm_create())) { + perror(progname); + return -1; + } + (void)gsm_option(r, GSM_OPT_FAST, &f_fast); + (void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose); + (void)gsm_option(r, GSM_OPT_LTP_CUT, &f_ltp_cut); + + while ((cc = (*input)(s)) > 0) { + if (cc < sizeof(s) / sizeof(*s)) + memset((char *)(s+cc), 0, sizeof(s)-(cc * sizeof(*s))); + gsm_encode(r, s, d); + if (fwrite((char *)d, sizeof(d), 1, out) != 1) { + perror(outname ? outname : "stdout"); + fprintf(stderr, "%s: error writing to %s\n", + progname, outname ? outname : "stdout"); + gsm_destroy(r); + return -1; + } + } + if (cc < 0) { + perror(inname ? inname : "stdin"); + fprintf(stderr, "%s: error reading from %s\n", + progname, inname ? inname : "stdin"); + gsm_destroy(r); + return -1; + } + gsm_destroy(r); + + return 0; +} + +static int process_decode P0() +{ + gsm r; + gsm_frame s; + gsm_signal d[ 160 ]; + + int cc; + + if (!(r = gsm_create())) { /* malloc failed */ + perror(progname); + return -1; + } + (void)gsm_option(r, GSM_OPT_FAST, &f_fast); + (void)gsm_option(r, GSM_OPT_VERBOSE, &f_verbose); + + while ((cc = fread(s, 1, sizeof(s), in)) > 0) { + + if (cc != sizeof(s)) { + if (cc >= 0) fprintf(stderr, + "%s: incomplete frame (%d byte%s missing) from %s\n", + progname, sizeof(s) - cc, + "s" + (sizeof(s) - cc == 1), + inname ? inname : "stdin" ); + gsm_destroy(r); + errno = 0; + return -1; + } + if (gsm_decode(r, s, d)) { + fprintf(stderr, "%s: bad frame in %s\n", + progname, inname ? inname : "stdin"); + gsm_destroy(r); + errno = 0; + return -1; + } + + if ((*output)(d) < 0) { + perror(outname); + fprintf(stderr, "%s: error writing to %s\n", + progname, outname); + gsm_destroy(r); + return -1; + } + } + + if (cc < 0) { + perror(inname ? inname : "stdin" ); + fprintf(stderr, "%s: error reading from %s\n", progname, + inname ? inname : "stdin"); + gsm_destroy(r); + return -1; + } + + gsm_destroy(r); + return 0; +} + +static int process P1((name), char * name) +{ + int step = 0; + + out = (FILE *)0; + in = (FILE *)0; + + outname = (char *)0; + inname = (char *)0; + + if (!open_input(name, &instat) || !open_output(name)) + goto err; + + if ((*(f_decode ? init_output : init_input))()) { + fprintf(stderr, "%s: error %s %s\n", + progname, + f_decode ? "writing header to" : "reading header from", + f_decode ? (outname ? outname : "stdout") + : (inname ? inname : "stdin")); + goto err; + } + + if ((*(f_decode ? process_decode : process_encode))()) + goto err; + + if (fflush(out) < 0 || ferror(out)) { + perror(outname ? outname : "stdout"); + fprintf(stderr, "%s: error writing \"%s\"\n", progname, + outname ? outname:"stdout"); + goto err; + } + + if (out != stdout) { + + update_times(); + update_mode (); + update_own (); + + if (fclose(out) < 0) { + perror(outname); + fprintf(stderr, "%s: error writing \"%s\"\n", + progname, outname); + goto err; + } + if (outname != name) free(outname); + outname = (char *)0; + } + out = (FILE *)0; + if (in != stdin) { + (void)fclose(in), in = (FILE *)0; + if (!f_cat && !f_precious) { + if (unlink(inname) < 0) { + perror(inname); + fprintf(stderr, + "%s: source \"%s\" not deleted.\n", + progname, inname); + } + goto err; + } + if (inname != name) free(inname); + inname = (char *)0; + } + return 0; + + /* + * Error handling and cleanup. + */ +err: + if (out && out != stdout) { + (void)fclose(out), out = (FILE *)0; + if (unlink(outname) < 0 && errno != ENOENT && errno != EINTR) { + perror(outname); + fprintf(stderr, "%s: could not unlink \"%s\"\n", + progname, outname); + } + } + if (in && in != stdin) (void)fclose(in), in = (FILE *)0; + + if (inname && inname != name) free(inname); + if (outname && outname != name) free(outname); + + return -1; +} + +static void version P0() +{ + printf( "%s 1.0, version %s\n", + progname, + "$Id$" ); +} + +static void help P0() +{ + printf("Usage: %s [-fcpdhvaulsFC] [files...]\n", progname); + printf("\n"); + + printf(" -f force Replace existing files without asking\n"); + printf(" -c cat Write to stdout, do not remove source files\n"); + printf(" -d decode Decode data (default is encode)\n"); + printf(" -p precious Do not delete the source\n"); + printf("\n"); + + printf(" -u u-law Force 8 kHz/8 bit u-law in/output format\n"); + printf(" -s sun .au Force Sun .au u-law in/output format\n"); + printf(" -a A-law Force 8 kHz/8 bit A-law in/output format\n"); + printf(" -l linear Force 16 bit linear in/output format\n"); + printf("\n"); + + printf(" -F fast Sacrifice conformance to performance\n"); + printf(" -C cutoff Ignore most samples during LTP\n"); + printf(" -v version Show version information\n"); + printf(" -h help Print this text\n"); + printf("\n"); +} + + +static void set_format P1((f), struct fmtdesc * f) +{ + if (f_format && f_format != f) { + fprintf( stderr, + "%s: only one of -[uals] is possible (%s -h for help)\n", + progname, progname); + exit(1); + } + + f_format = f; +} + +int main P2((ac, av), int ac, char **av) +{ + int opt; + extern int optind; + extern char * optarg; + + parse_argv0(*av); + + while ((opt = getopt(ac, av, "fcdpvhuaslVFC:")) != EOF) switch (opt) { + + case 'd': f_decode = 1; break; + case 'f': f_force = 1; break; + case 'c': f_cat = 1; break; + case 'p': f_precious = 1; break; + case 'F': f_fast = 1; break; + case 'C': f_ltp_cut = 100; break; +#ifndef NDEBUG + case 'V': f_verbose = 1; break; /* undocumented */ +#endif + + case 'u': set_format( &f_ulaw ); break; + case 'l': set_format( &f_linear ); break; + case 'a': set_format( &f_alaw ); break; + case 's': set_format( &f_audio ); break; + + case 'v': version(); exit(0); + case 'h': help(); exit(0); + + default: + usage: + fprintf(stderr, + "Usage: %s [-fcpdhvuaslFC] [files...] (-h for help)\n", + progname); + exit(1); + } + + f_precious |= f_cat; + + av += optind; + ac -= optind; + + catch_signals(onintr); + + if (ac <= 0) process( (char *)0 ); + else while (ac--) process( *av++ ); + + exit(0); +} diff --git a/gsm/toast.h b/gsm/toast.h new file mode 100644 index 0000000000..1eaeb6c566 --- /dev/null +++ b/gsm/toast.h @@ -0,0 +1,109 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#ifndef TOAST_H +#define TOAST_H /* Guard against multiple includes */ + +#include "config.h" + +#include <sys/types.h> +#include <sys/stat.h> + +#include <stdio.h> +#include <ctype.h> +#include <signal.h> + +#include <errno.h> +#ifndef HAS_ERRNO_DECL + extern int errno; +#endif + +#ifdef HAS_LIMITS_H +#include <limits.h> +#endif + +#ifdef HAS_FCNTL_H +# include <fcntl.h> +#endif + +#ifdef HAS_UTIME +# ifdef HAS_UTIME_H +# include <utime.h> +# endif +#endif + +#include "gsm.h" + +#ifndef S_ISREG +#define S_ISREG(x) ((x) & S_IFREG) +#endif /* S_ISREG */ + + +# define READ "rb" +# define WRITE "wb" +#ifdef O_BINARY +# define O_WRITE_EXCL O_WRONLY|O_CREAT|O_EXCL|O_BINARY +#else +# define O_WRITE_EXCL O_WRONLY|O_CREAT|O_EXCL +#endif + +#ifndef SIGHANDLER_T +#define SIGHANDLER_T void /* what does a signal handler return? */ +#endif + + +#ifdef HAS_STRING_H +#include <string.h> +#else +# ifdef HAS_STRINGS_H +# include <strings.h> +# else +# include "proto.h" + + extern int strlen P((char *)); + extern char * strcpy P((char *, char *)); + extern char * strcat P((char *, char *)); + extern char * strrchr P((char *, int)); + +# include "unproto.h" +# endif +#endif + + +#ifdef HAS_STDLIB_H +#include <stdlib.h> +#else +# include "proto.h" +# ifdef HAS_MALLOC_H +# include <malloc.h> +# else + extern char * malloc P((unsigned)); +# endif + extern int exit P((int)); +# include "unproto.h" +#endif + + +#ifdef HAS_UNISTD_H +# include <unistd.h> +#endif + +/* + * This suffix is tacked onto/removed from filenames + * similar to the way freeze and compress do it. + */ +#define SUFFIX_TOASTED ".gsm" + +#include "proto.h" + +extern int audio_init_input P((void)), audio_init_output P((void)); +extern int ulaw_input P((gsm_signal*)), ulaw_output P((gsm_signal *)); +extern int alaw_input P((gsm_signal*)), alaw_output P((gsm_signal *)); +extern int linear_input P((gsm_signal*)), linear_output P((gsm_signal *)); + +#endif /* TOAST_H */ diff --git a/gsm/toast_alaw.c b/gsm/toast_alaw.c new file mode 100644 index 0000000000..98917372e1 --- /dev/null +++ b/gsm/toast_alaw.c @@ -0,0 +1,334 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "toast.h" + +/* toast_alaw.c -- manipulate A-law encoded sound. + */ + +extern FILE * in, * out; + +#define A2S(x) (a2s[ (unsigned char )(x) ]) +#define S2A(x) (s2a[ ((unsigned short)(x)) >> 4 ]) + +static unsigned short a2s[] = { + + 60032, 60288, 59520, 59776, 61056, 61312, 60544, 60800, + 57984, 58240, 57472, 57728, 59008, 59264, 58496, 58752, + 62784, 62912, 62528, 62656, 63296, 63424, 63040, 63168, + 61760, 61888, 61504, 61632, 62272, 62400, 62016, 62144, + 43520, 44544, 41472, 42496, 47616, 48640, 45568, 46592, + 35328, 36352, 33280, 34304, 39424, 40448, 37376, 38400, + 54528, 55040, 53504, 54016, 56576, 57088, 55552, 56064, + 50432, 50944, 49408, 49920, 52480, 52992, 51456, 51968, + 65192, 65208, 65160, 65176, 65256, 65272, 65224, 65240, + 65064, 65080, 65032, 65048, 65128, 65144, 65096, 65112, + 65448, 65464, 65416, 65432, 65512, 65528, 65480, 65496, + 65320, 65336, 65288, 65304, 65384, 65400, 65352, 65368, + 64160, 64224, 64032, 64096, 64416, 64480, 64288, 64352, + 63648, 63712, 63520, 63584, 63904, 63968, 63776, 63840, + 64848, 64880, 64784, 64816, 64976, 65008, 64912, 64944, + 64592, 64624, 64528, 64560, 64720, 64752, 64656, 64688, + 5504, 5248, 6016, 5760, 4480, 4224, 4992, 4736, + 7552, 7296, 8064, 7808, 6528, 6272, 7040, 6784, + 2752, 2624, 3008, 2880, 2240, 2112, 2496, 2368, + 3776, 3648, 4032, 3904, 3264, 3136, 3520, 3392, + 22016, 20992, 24064, 23040, 17920, 16896, 19968, 18944, + 30208, 29184, 32256, 31232, 26112, 25088, 28160, 27136, + 11008, 10496, 12032, 11520, 8960, 8448, 9984, 9472, + 15104, 14592, 16128, 15616, 13056, 12544, 14080, 13568, + 344, 328, 376, 360, 280, 264, 312, 296, + 472, 456, 504, 488, 408, 392, 440, 424, + 88, 72, 120, 104, 24, 8, 56, 40, + 216, 200, 248, 232, 152, 136, 184, 168, + 1376, 1312, 1504, 1440, 1120, 1056, 1248, 1184, + 1888, 1824, 2016, 1952, 1632, 1568, 1760, 1696, + 688, 656, 752, 720, 560, 528, 624, 592, + 944, 912, 1008, 976, 816, 784, 880, 848 + +}; + + +static unsigned char s2a[] = { + + 213,212,215,214,209,208,211,210,221,220,223,222,217,216,219,218, + 197,196,199,198,193,192,195,194,205,204,207,206,201,200,203,202, + 245,245,244,244,247,247,246,246,241,241,240,240,243,243,242,242, + 253,253,252,252,255,255,254,254,249,249,248,248,251,251,250,250, + 229,229,229,229,228,228,228,228,231,231,231,231,230,230,230,230, + 225,225,225,225,224,224,224,224,227,227,227,227,226,226,226,226, + 237,237,237,237,236,236,236,236,239,239,239,239,238,238,238,238, + 233,233,233,233,232,232,232,232,235,235,235,235,234,234,234,234, + 149,149,149,149,149,149,149,149,148,148,148,148,148,148,148,148, + 151,151,151,151,151,151,151,151,150,150,150,150,150,150,150,150, + 145,145,145,145,145,145,145,145,144,144,144,144,144,144,144,144, + 147,147,147,147,147,147,147,147,146,146,146,146,146,146,146,146, + 157,157,157,157,157,157,157,157,156,156,156,156,156,156,156,156, + 159,159,159,159,159,159,159,159,158,158,158,158,158,158,158,158, + 153,153,153,153,153,153,153,153,152,152,152,152,152,152,152,152, + 155,155,155,155,155,155,155,155,154,154,154,154,154,154,154,154, + 133,133,133,133,133,133,133,133,133,133,133,133,133,133,133,133, + 132,132,132,132,132,132,132,132,132,132,132,132,132,132,132,132, + 135,135,135,135,135,135,135,135,135,135,135,135,135,135,135,135, + 134,134,134,134,134,134,134,134,134,134,134,134,134,134,134,134, + 129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129, + 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, + 131,131,131,131,131,131,131,131,131,131,131,131,131,131,131,131, + 130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130, + 141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141, + 140,140,140,140,140,140,140,140,140,140,140,140,140,140,140,140, + 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, + 142,142,142,142,142,142,142,142,142,142,142,142,142,142,142,142, + 137,137,137,137,137,137,137,137,137,137,137,137,137,137,137,137, + 136,136,136,136,136,136,136,136,136,136,136,136,136,136,136,136, + 139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139, + 138,138,138,138,138,138,138,138,138,138,138,138,138,138,138,138, + 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181, + 181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181, + 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, + 180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180, + 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, + 183,183,183,183,183,183,183,183,183,183,183,183,183,183,183,183, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177, + 177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177, + 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, + 176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176, + 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179, + 179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179, + 178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178, + 178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178, + 189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, + 189,189,189,189,189,189,189,189,189,189,189,189,189,189,189,189, + 188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188, + 188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 191,191,191,191,191,191,191,191,191,191,191,191,191,191,191,191, + 190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190, + 190,190,190,190,190,190,190,190,190,190,190,190,190,190,190,190, + 185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185, + 185,185,185,185,185,185,185,185,185,185,185,185,185,185,185,185, + 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184, + 184,184,184,184,184,184,184,184,184,184,184,184,184,184,184,184, + 187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187, + 187,187,187,187,187,187,187,187,187,187,187,187,187,187,187,187, + 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, + 186,186,186,186,186,186,186,186,186,186,186,186,186,186,186,186, + 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, + 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, + 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, + 165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165, + 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, + 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, + 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, + 164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164, + 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, + 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, + 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, + 167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167, + 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, + 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, + 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, + 166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166, + 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, + 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, + 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, + 161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161, + 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160, + 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, + 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, + 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, + 163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163, + 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, + 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, + 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, + 162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162, + 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, + 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, + 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, + 173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173, + 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, + 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, + 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, + 172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172, + 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, + 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, + 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, + 175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175, + 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, + 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, + 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, + 174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174, + 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, + 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, + 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, + 169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169, + 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, + 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, + 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, + 168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168, + 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, + 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, + 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, + 171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171, + 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, + 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, + 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, + 170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, 56, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, + 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, + 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, + 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, + 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, + 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, + 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, + 106,106,106,106,107,107,107,107,104,104,104,104,105,105,105,105, + 110,110,110,110,111,111,111,111,108,108,108,108,109,109,109,109, + 98, 98, 98, 98, 99, 99, 99, 99, 96, 96, 96, 96, 97, 97, 97, 97, + 102,102,102,102,103,103,103,103,100,100,100,100,101,101,101,101, + 122,122,123,123,120,120,121,121,126,126,127,127,124,124,125,125, + 114,114,115,115,112,112,113,113,118,118,119,119,116,116,117,117, + 74, 75, 72, 73, 78, 79, 76, 77, 66, 67, 64, 65, 70, 71, 68, 69, + 90, 91, 88, 89, 94, 95, 92, 93, 82, 83, 80, 81, 86, 87, 84, 85 +}; + +int alaw_input P1((buf), gsm_signal * buf) +{ + int i, c; + + for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = A2S( c ); + if (c == EOF && ferror(in)) return -1; + return i; +} + +int alaw_output P1((buf), gsm_signal * buf) +{ + int i; + + for (i = 0; i < 160; i++, buf++) + if (fputc( S2A( *buf ), out) == EOF) return -1; + return 0; +} + diff --git a/gsm/toast_audio.c b/gsm/toast_audio.c new file mode 100644 index 0000000000..42300e3a9d --- /dev/null +++ b/gsm/toast_audio.c @@ -0,0 +1,113 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "toast.h" + +/* toast_audio -- functions to manipulate SunOS audio files. + * + * This is reverse engineered from our present soundfiles + * and in no way portable, durable or aesthetically pleasing. + */ + +extern FILE * in, * out; +extern char * inname; +extern char * progname; + +extern int (*output) P((gsm_signal *)), + (*input ) P((gsm_signal *)); + +extern int alaw_input P((gsm_signal *)), + ulaw_input P((gsm_signal *)), + linear_input P((gsm_signal *)); + +extern int ulaw_output P((gsm_signal *)); + +static int put_u32 P2((f, u), FILE * f, unsigned long u) +{ + /* Write a 32-bit unsigned value msb first. + */ + if ( putc( (char)((u>>24) & 0x0FF), f) == EOF + || putc( (char)((u>>16) & 0x0FF), f) == EOF + || putc( (char)((u>> 8) & 0x0FF), f) == EOF + || putc( (char)( u & 0x0FF), f) == EOF) return -1; + + return 0; +} + +static int get_u32 P2((f, up), FILE * f, unsigned long * up) +{ + /* Read a 32-bit unsigned value msb first. + */ + int i; + unsigned long u; + + if ( (i = getc(f)) == EOF + || ((u = (unsigned char)i), (i = getc(f)) == EOF) + || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF) + || ((u = (u<<8)|(unsigned char)i), (i = getc(f)) == EOF)) return -1; + *up = (u<<8)|(unsigned char)i; + return 0; +} + +int audio_init_input P0() +{ + unsigned long len, enc; /* unsigned 32 bits */ + + if ( fgetc(in) != '.' + || fgetc(in) != 's' + || fgetc(in) != 'n' + || fgetc(in) != 'd' + || get_u32( in, &len ) + || get_u32( in, &enc ) /* skip this */ + || get_u32( in, &enc )) { + fprintf(stderr, + "%s: bad (missing?) header in Sun audio file \"%s\";\n\ + Try one of -u, -a, -l instead (%s -h for help).\n", + progname, inname ? inname : "stdin", progname); + return -1; + } + + switch (enc) { + case 1: input = ulaw_input; break; + case 2: input = alaw_input; break; + case 3: input = linear_input; break; + default: + fprintf(stderr, +"%s: warning: file format #%lu for %s not implemented, defaulting to u-law.\n", + progname, enc, inname); + input = ulaw_input; + break; + } + + while (len > 4*4) + if (getc(in) == EOF) { + fprintf(stderr, + "%s: EOF in header of Sun audio file \"%s\";\n\ + Try one of -u, -a, -l instead (%s -h for help).\n", + progname, inname ? inname : "stdin", progname); + return -1; + } + else len--; + + return 0; +} + +int audio_init_output P0() +{ + if ( fputs(".snd", out) == EOF + || put_u32(out, 32) + || put_u32(out, ~(unsigned long)0) + || put_u32(out, 1) + || put_u32(out, 8000) + || put_u32(out, 1) + || put_u32(out, 0) + || put_u32(out, 0)) return -1; + + return 0; +} + diff --git a/gsm/toast_lin.c b/gsm/toast_lin.c new file mode 100644 index 0000000000..b9f9c890e2 --- /dev/null +++ b/gsm/toast_lin.c @@ -0,0 +1,24 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "toast.h" + +/* toast_linear.c -- read and write 16 bit linear sound in host byte order. + */ + +extern FILE *in, *out; + +int linear_input (buf) gsm_signal * buf; +{ + return fread( (char *)buf, sizeof(*buf), 160, in ); +} + +int linear_output P1((buf), gsm_signal * buf) +{ + return -( fwrite( (char *)buf, sizeof(*buf), 160, out ) != 160 ); +} diff --git a/gsm/toast_ulaw.c b/gsm/toast_ulaw.c new file mode 100644 index 0000000000..987de11362 --- /dev/null +++ b/gsm/toast_ulaw.c @@ -0,0 +1,621 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/* $Header$ */ + +#include "toast.h" + +/* toast_ulaw -- functions to manipulate u-law encoded sound. + */ + +extern FILE *in, *out; + +#define U2S(x) (u2s[ (unsigned char)(x) ]) +#define S2U(x) (s2u[ ((unsigned short)(x)) >> 3 ]) + +static unsigned short u2s[] = { + 33280, 34308, 35336, 36364, 37393, 38421, 39449, 40477, + 41505, 42534, 43562, 44590, 45618, 46647, 47675, 48703, + 49474, 49988, 50503, 51017, 51531, 52045, 52559, 53073, + 53587, 54101, 54616, 55130, 55644, 56158, 56672, 57186, + 57572, 57829, 58086, 58343, 58600, 58857, 59114, 59371, + 59628, 59885, 60142, 60399, 60656, 60913, 61171, 61428, + 61620, 61749, 61877, 62006, 62134, 62263, 62392, 62520, + 62649, 62777, 62906, 63034, 63163, 63291, 63420, 63548, + 63645, 63709, 63773, 63838, 63902, 63966, 64030, 64095, + 64159, 64223, 64287, 64352, 64416, 64480, 64544, 64609, + 64657, 64689, 64721, 64753, 64785, 64818, 64850, 64882, + 64914, 64946, 64978, 65010, 65042, 65075, 65107, 65139, + 65163, 65179, 65195, 65211, 65227, 65243, 65259, 65275, + 65291, 65308, 65324, 65340, 65356, 65372, 65388, 65404, + 65416, 65424, 65432, 65440, 65448, 65456, 65464, 65472, + 65480, 65488, 65496, 65504, 65512, 65520, 65528, 0, + 32256, 31228, 30200, 29172, 28143, 27115, 26087, 25059, + 24031, 23002, 21974, 20946, 19918, 18889, 17861, 16833, + 16062, 15548, 15033, 14519, 14005, 13491, 12977, 12463, + 11949, 11435, 10920, 10406, 9892, 9378, 8864, 8350, + 7964, 7707, 7450, 7193, 6936, 6679, 6422, 6165, + 5908, 5651, 5394, 5137, 4880, 4623, 4365, 4108, + 3916, 3787, 3659, 3530, 3402, 3273, 3144, 3016, + 2887, 2759, 2630, 2502, 2373, 2245, 2116, 1988, + 1891, 1827, 1763, 1698, 1634, 1570, 1506, 1441, + 1377, 1313, 1249, 1184, 1120, 1056, 992, 927, + 879, 847, 815, 783, 751, 718, 686, 654, + 622, 590, 558, 526, 494, 461, 429, 397, + 373, 357, 341, 325, 309, 293, 277, 261, + 245, 228, 212, 196, 180, 164, 148, 132, + 120, 112, 104, 96, 88, 80, 72, 64, + 56, 48, 40, 32, 24, 16, 8, 0 +}; + +static unsigned char s2u[] = { +0377,0376,0375,0374,0373,0372,0371,0370,0367,0366,0365,0364,0363,0362,0361, +0360,0357,0357,0356,0356,0355,0355,0354,0354,0353,0353,0352,0352,0351,0351, +0350,0350,0347,0347,0346,0346,0345,0345,0344,0344,0343,0343,0342,0342,0341, +0341,0340,0340,0337,0337,0337,0337,0336,0336,0336,0336,0335,0335,0335,0335, +0334,0334,0334,0334,0333,0333,0333,0333,0332,0332,0332,0332,0331,0331,0331, +0331,0330,0330,0330,0330,0327,0327,0327,0327,0326,0326,0326,0326,0325,0325, +0325,0325,0324,0324,0324,0324,0323,0323,0323,0323,0322,0322,0322,0322,0321, +0321,0321,0321,0320,0320,0320,0320,0317,0317,0317,0317,0317,0317,0317,0317, +0316,0316,0316,0316,0316,0316,0316,0316,0315,0315,0315,0315,0315,0315,0315, +0315,0314,0314,0314,0314,0314,0314,0314,0314,0313,0313,0313,0313,0313,0313, +0313,0313,0312,0312,0312,0312,0312,0312,0312,0312,0311,0311,0311,0311,0311, +0311,0311,0311,0310,0310,0310,0310,0310,0310,0310,0310,0307,0307,0307,0307, +0307,0307,0307,0307,0306,0306,0306,0306,0306,0306,0306,0306,0305,0305,0305, +0305,0305,0305,0305,0305,0304,0304,0304,0304,0304,0304,0304,0304,0303,0303, +0303,0303,0303,0303,0303,0303,0303,0302,0302,0302,0302,0302,0302,0302,0302, +0301,0301,0301,0301,0301,0301,0301,0301,0300,0300,0300,0300,0300,0300,0300, +0300,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277,0277, +0277,0277,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276,0276, +0276,0276,0276,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275,0275, +0275,0275,0275,0275,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274,0274, +0274,0274,0274,0274,0274,0273,0273,0273,0273,0273,0273,0273,0273,0273,0273, +0273,0273,0273,0273,0273,0273,0272,0272,0272,0272,0272,0272,0272,0272,0272, +0272,0272,0272,0272,0272,0272,0272,0271,0271,0271,0271,0271,0271,0271,0271, +0271,0271,0271,0271,0271,0271,0271,0271,0270,0270,0270,0270,0270,0270,0270, +0270,0270,0270,0270,0270,0270,0270,0270,0270,0267,0267,0267,0267,0267,0267, +0267,0267,0267,0267,0267,0267,0267,0267,0267,0267,0266,0266,0266,0266,0266, +0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0266,0265,0265,0265,0265, +0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0265,0264,0264,0264, +0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0264,0263,0263, +0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0263,0262, +0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262,0262, +0262,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261,0261, +0261,0261,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260,0260, +0260,0260,0260,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257, +0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257,0257, +0257,0257,0257,0257,0257,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256, +0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256,0256, +0256,0256,0256,0256,0256,0256,0256,0255,0255,0255,0255,0255,0255,0255,0255, +0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255,0255, +0255,0255,0255,0255,0255,0255,0255,0255,0255,0254,0254,0254,0254,0254,0254, +0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254, +0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0254,0253,0253,0253,0253, +0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253, +0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0253,0252,0252, +0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252, +0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252,0252, +0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251, +0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251,0251, +0251,0251,0251,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250, +0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250,0250, +0250,0250,0250,0250,0250,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247, +0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247,0247, +0247,0247,0247,0247,0247,0247,0247,0246,0246,0246,0246,0246,0246,0246,0246, +0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246,0246, +0246,0246,0246,0246,0246,0246,0246,0246,0246,0245,0245,0245,0245,0245,0245, +0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245, +0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0245,0244,0244,0244,0244, +0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244, +0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0244,0243,0243, +0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243, +0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243,0243, +0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242, +0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242,0242, +0242,0242,0242,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241, +0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241,0241, +0241,0241,0241,0241,0241,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240, +0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240,0240, +0240,0240,0240,0240,0240,0240,0240,0237,0237,0237,0237,0237,0237,0237,0237, +0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237, +0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237, +0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237, +0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0237,0236,0236,0236,0236, +0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, +0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, +0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, +0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236,0236, +0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, +0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, +0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, +0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235,0235, +0235,0235,0235,0235,0235,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, +0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, +0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, +0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234,0234, +0234,0234,0234,0234,0234,0234,0234,0234,0234,0233,0233,0233,0233,0233,0233, +0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233, +0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233, +0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233, +0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0233,0232,0232, +0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, +0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, +0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, +0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232,0232, +0232,0232,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, +0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, +0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, +0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231,0231, +0231,0231,0231,0231,0231,0231,0231,0230,0230,0230,0230,0230,0230,0230,0230, +0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230, +0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230, +0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230, +0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0230,0227,0227,0227,0227, +0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, +0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, +0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, +0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227,0227, +0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, +0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, +0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, +0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226,0226, +0226,0226,0226,0226,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, +0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, +0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, +0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225,0225, +0225,0225,0225,0225,0225,0225,0225,0225,0225,0224,0224,0224,0224,0224,0224, +0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224, +0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224, +0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224, +0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0224,0223,0223, +0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, +0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, +0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, +0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223,0223, +0223,0223,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, +0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, +0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, +0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222,0222, +0222,0222,0222,0222,0222,0222,0221,0221,0221,0221,0221,0221,0221,0221,0221, +0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221, +0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221, +0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221, +0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0221,0220,0220,0220,0220, +0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, +0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, +0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, +0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220,0220, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217,0217, +0217,0217,0217,0217,0217,0217,0217,0217,0217,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216,0216, +0216,0216,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215, +0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0215,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214,0214, +0214,0214,0214,0214,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213, +0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0213,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212,0212, +0212,0212,0212,0212,0212,0212,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211,0211, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210,0210, +0210,0210,0210,0210,0210,0210,0210,0210,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207,0207, +0207,0207,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0206, +0206,0206,0206,0206,0206,0206,0206,0206,0206,0206,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205,0205, +0205,0205,0205,0205,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204, +0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0204,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203,0203, +0203,0203,0203,0203,0203,0203,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202, +0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0202,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201,0201, +0201,0201,0201,0201,0201,0201,0201,0201,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200,0200, +0200,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000, +0000,0000,0000,0000,0000,0000,0000,0000,0000,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001,0001, +0001,0001,0001,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002, +0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0002,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003,0003, +0003,0003,0003,0003,0003,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004, +0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0004,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005,0005, +0005,0005,0005,0005,0005,0005,0005,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006,0006, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007,0007, +0007,0007,0007,0007,0007,0007,0007,0007,0007,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010,0010, +0010,0010,0010,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011, +0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0011,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012,0012, +0012,0012,0012,0012,0012,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013, +0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0013,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014,0014, +0014,0014,0014,0014,0014,0014,0014,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015,0015, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016,0016, +0016,0016,0016,0016,0016,0016,0016,0016,0016,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017,0017, +0017,0017,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, +0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, +0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, +0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020,0020, +0020,0020,0020,0020,0020,0020,0021,0021,0021,0021,0021,0021,0021,0021,0021, +0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021, +0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021, +0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021, +0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0021,0022,0022,0022,0022, +0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, +0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, +0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, +0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022,0022, +0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, +0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, +0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, +0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023,0023, +0023,0023,0023,0023,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, +0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, +0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, +0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024,0024, +0024,0024,0024,0024,0024,0024,0024,0024,0024,0025,0025,0025,0025,0025,0025, +0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025, +0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025, +0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025, +0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0025,0026,0026, +0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, +0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, +0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, +0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026,0026, +0026,0026,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, +0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, +0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, +0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027,0027, +0027,0027,0027,0027,0027,0027,0030,0030,0030,0030,0030,0030,0030,0030,0030, +0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030, +0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030, +0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030, +0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0030,0031,0031,0031,0031, +0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, +0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, +0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, +0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031,0031, +0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, +0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, +0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, +0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032,0032, +0032,0032,0032,0032,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, +0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, +0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, +0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033,0033, +0033,0033,0033,0033,0033,0033,0033,0033,0034,0034,0034,0034,0034,0034,0034, +0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034, +0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034, +0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034, +0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0034,0035,0035, +0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, +0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, +0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, +0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035,0035, +0035,0035,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, +0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, +0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, +0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036,0036, +0036,0036,0036,0036,0036,0036,0037,0037,0037,0037,0037,0037,0037,0037,0037, +0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037, +0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037, +0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0037, +0037,0037,0037,0037,0037,0037,0037,0037,0037,0037,0040,0040,0040,0040,0040, +0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040, +0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0040,0041,0041, +0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041, +0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041,0041, +0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042, +0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042,0042, +0042,0042,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043, +0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043,0043, +0043,0043,0043,0043,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044, +0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044,0044, +0044,0044,0044,0044,0044,0044,0045,0045,0045,0045,0045,0045,0045,0045,0045, +0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045,0045, +0045,0045,0045,0045,0045,0045,0045,0045,0046,0046,0046,0046,0046,0046,0046, +0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0046, +0046,0046,0046,0046,0046,0046,0046,0046,0046,0046,0047,0047,0047,0047,0047, +0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047, +0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0047,0050,0050, +0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050, +0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050,0050, +0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051, +0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051,0051, +0051,0051,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052, +0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052,0052, +0052,0052,0052,0052,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053, +0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053,0053, +0053,0053,0053,0053,0053,0053,0054,0054,0054,0054,0054,0054,0054,0054,0054, +0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054,0054, +0054,0054,0054,0054,0054,0054,0054,0054,0055,0055,0055,0055,0055,0055,0055, +0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0055, +0055,0055,0055,0055,0055,0055,0055,0055,0055,0055,0056,0056,0056,0056,0056, +0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056, +0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0056,0057,0057,0057, +0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057, +0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057,0057, +0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060,0060, +0060,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061,0061, +0061,0061,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062,0062, +0062,0062,0062,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063,0063, +0063,0063,0063,0063,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064,0064, +0064,0064,0064,0064,0064,0065,0065,0065,0065,0065,0065,0065,0065,0065,0065, +0065,0065,0065,0065,0065,0065,0066,0066,0066,0066,0066,0066,0066,0066,0066, +0066,0066,0066,0066,0066,0066,0066,0067,0067,0067,0067,0067,0067,0067,0067, +0067,0067,0067,0067,0067,0067,0067,0067,0070,0070,0070,0070,0070,0070,0070, +0070,0070,0070,0070,0070,0070,0070,0070,0070,0071,0071,0071,0071,0071,0071, +0071,0071,0071,0071,0071,0071,0071,0071,0071,0071,0072,0072,0072,0072,0072, +0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0072,0073,0073,0073,0073, +0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0073,0074,0074,0074, +0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0074,0075,0075, +0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075,0075, +0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076,0076, +0076,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077,0077, +0077,0077,0100,0100,0100,0100,0100,0100,0100,0100,0101,0101,0101,0101,0101, +0101,0101,0101,0102,0102,0102,0102,0102,0102,0102,0102,0103,0103,0103,0103, +0103,0103,0103,0103,0104,0104,0104,0104,0104,0104,0104,0104,0105,0105,0105, +0105,0105,0105,0105,0105,0106,0106,0106,0106,0106,0106,0106,0106,0107,0107, +0107,0107,0107,0107,0107,0107,0110,0110,0110,0110,0110,0110,0110,0110,0111, +0111,0111,0111,0111,0111,0111,0111,0112,0112,0112,0112,0112,0112,0112,0112, +0113,0113,0113,0113,0113,0113,0113,0113,0114,0114,0114,0114,0114,0114,0114, +0114,0115,0115,0115,0115,0115,0115,0115,0115,0116,0116,0116,0116,0116,0116, +0116,0116,0117,0117,0117,0117,0117,0117,0117,0117,0120,0120,0120,0120,0121, +0121,0121,0121,0122,0122,0122,0122,0123,0123,0123,0123,0124,0124,0124,0124, +0125,0125,0125,0125,0126,0126,0126,0126,0127,0127,0127,0127,0130,0130,0130, +0130,0131,0131,0131,0131,0132,0132,0132,0132,0133,0133,0133,0133,0134,0134, +0134,0134,0135,0135,0135,0135,0136,0136,0136,0136,0137,0137,0137,0137,0140, +0140,0141,0141,0142,0142,0143,0143,0144,0144,0145,0145,0146,0146,0147,0147, +0150,0150,0150,0151,0151,0152,0152,0153,0153,0154,0154,0155,0155,0156,0156, +0157,0157,0160,0161,0162,0163,0164,0165,0166,0167,0170,0171,0172,0173,0174, +0175,0176 +}; + +int ulaw_input P1((buf), gsm_signal * buf) +{ + int i, c; + + for (i = 0; i < 160 && (c = fgetc(in)) != EOF; i++) buf[i] = U2S(c); + if (c == EOF && ferror(in)) return -1; + return i; +} + +int ulaw_output P1((buf), gsm_signal * buf) +{ + int i; + + for(i = 0; i < 160; i++, buf++) + if (fputc( (char)S2U( (unsigned short)*buf ), out) == EOF) + return -1; + return 0; +} diff --git a/gsm/unproto.h b/gsm/unproto.h new file mode 100644 index 0000000000..ccd565109b --- /dev/null +++ b/gsm/unproto.h @@ -0,0 +1,23 @@ +/* + * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische + * Universitaet Berlin. See the accompanying file "COPYRIGHT" for + * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. + */ + +/*$Header$*/ + +#ifdef PROTO_H /* sic */ +#undef PROTO_H + +#undef P +#undef P0 +#undef P1 +#undef P2 +#undef P3 +#undef P4 +#undef P5 +#undef P6 +#undef P7 +#undef P8 + +#endif /* PROTO_H */ diff --git a/src/Makefile b/src/Makefile index 587852ada8..fef294c710 100644 --- a/src/Makefile +++ b/src/Makefile @@ -17,13 +17,16 @@ SKINS = skins RINGS = rings METAL_SKINS = metal -INC_OTHERS = ../stund +ifdef ALSA +endif -INCPATH = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include +INCPATH = -I. -I$(QTDIR)/include -I$(CCPPDIR)/include/cc++2 -I$(CCRTPDIR)/include -I$(OSIPDIR)/include -I$(EXOPSIP)/include -I/usr/include -I../gsm CXXFLAGS = -pipe -Wall -W -g -pipe -march=i386 -mcpu=i686 -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -fpermissive -Wno-deprecated $(INCPATH) -LIBS = -L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound `ccgnu2-config --flags --stdlibs` +LIBS=-L$(QTDIR)/lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm -L/opt/lib -losip2 -leXosip -lccrtp1 -lasound `ccgnu2-config --flags --stdlibs` + +EXTRALIBS=../gsm/libgsm.a CONFIGURE_CONF=$(shell ls ../configure.conf) @@ -61,7 +64,7 @@ OBJS = \ qtGUImainwindow.o qtGUImainwindow.moc.o \ vector.o \ volumecontrol.o volumecontrol.moc.o \ - stun.o udp.o + stun.o udp.o start: check prereq all @@ -96,9 +99,9 @@ udp.o: ../stund/udp.cxx ../stund/udp.h all: $(PROGNAME) - -$(PROGNAME): $(OBJS) - $(CXX) -o $@ $(OBJS) $(LIBS) + +$(PROGNAME): $(OBJS) $(EXTRALIBS) + $(CXX) -o $@ $(OBJS) $(LIBS) $(EXTRALIBS) install: all mkdir -p $(BIN_DIR) diff --git a/src/audiocodec.cpp b/src/audiocodec.cpp index 118dc42473..787c7058d5 100644 --- a/src/audiocodec.cpp +++ b/src/audiocodec.cpp @@ -17,11 +17,10 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include <qapplication.h> - #include "audiocodec.h" #include "configuration.h" #include "g711.h" +#include "../gsm/gsm.h" #include <string> using namespace std; @@ -95,7 +94,8 @@ AudioCodec::codecDecode (int pt, short *dst, unsigned char *src, unsigned int si break; case PAYLOAD_CODEC_GSM: - // TODO: + gsmDecode(dst, src); + return 320; break; case PAYLOAD_CODEC_ILBC: @@ -114,34 +114,60 @@ AudioCodec::codecDecode (int pt, short *dst, unsigned char *src, unsigned int si int AudioCodec::codecEncode (int pt, unsigned char *dst, short *src, unsigned int size) { - switch (pt) { - case PAYLOAD_CODEC_ULAW: - return G711::ULawEncode (dst, src, size); - break; - - case PAYLOAD_CODEC_ALAW: - return G711::ALawEncode (dst, src, size); - break; - - case PAYLOAD_CODEC_GSM: - // TODO - break; - - case PAYLOAD_CODEC_ILBC: - // TODO - break; - - case PAYLOAD_CODEC_SPEEX: - // TODO - break; - - default: - break; - } + switch (pt) { + case PAYLOAD_CODEC_ULAW: + return G711::ULawEncode (dst, src, size); + break; + + case PAYLOAD_CODEC_ALAW: + return G711::ALawEncode (dst, src, size); + break; + + case PAYLOAD_CODEC_GSM: + gsmEncode(dst, src); + return 33; + break; + + case PAYLOAD_CODEC_ILBC: + // TODO + break; + + case PAYLOAD_CODEC_SPEEX: + // TODO + break; + + default: + break; + } return 0; } void AudioCodec::noSupportedCodec (void) { - qDebug("Codec no supported"); + printf("Codec no supported\n"); +} + +void +AudioCodec::gsmDecode (short *dst, unsigned char *src) { + gsm gsmhandle; + + if (!(gsmhandle = gsm_create() )) + printf("AudioCodec: ERROR: gsm_create\n"); + + if (gsm_decode(gsmhandle, src, dst) < 0) + printf("AudioCodec: ERROR: gsm_decode\n"); + + gsm_destroy(gsmhandle); +} + +void +AudioCodec::gsmEncode (unsigned char* dst, short* src) { + gsm gsmhandle; + + if (!(gsmhandle = gsm_create() )) + printf("AudioCodec: ERROR: gsm_create\n"); + + gsm_encode(gsmhandle, src, dst); + + gsm_destroy(gsmhandle); } diff --git a/src/audiocodec.h b/src/audiocodec.h index 815dfab68d..e5849e56ec 100644 --- a/src/audiocodec.h +++ b/src/audiocodec.h @@ -39,6 +39,7 @@ typedef enum { #define NB_CODECS 5 + class AudioCodec { public: AudioCodec (void); @@ -46,11 +47,14 @@ public: int handleCodecs[NB_CODECS]; + void noSupportedCodec (void); static int codecDecode (int, short *, unsigned char *, unsigned int); static int codecEncode (int, unsigned char *, short *, unsigned int); int matchPayloadCodec (string); char * rtpmapPayload (int); + static void gsmDecode (short*, unsigned char*); + static void gsmEncode (unsigned char*, short*); private: diff --git a/src/audiortp.cpp b/src/audiortp.cpp index ad14dfc7d5..29537022ff 100644 --- a/src/audiortp.cpp +++ b/src/audiortp.cpp @@ -38,12 +38,12 @@ using namespace ost; using namespace std; + //////////////////////////////////////////////////////////////////////////////// // AudioRtp //////////////////////////////////////////////////////////////////////////////// -AudioRtp::AudioRtp (SIP *sip, Manager *manager) { +AudioRtp::AudioRtp (Manager *manager) { string svr; - this->sip = sip; this->manager = manager; RTXThread = NULL; if (!manager->useStun()) { @@ -162,6 +162,7 @@ AudioRtpRTX::run (void) { timestamp; int expandedSize; short *data_for_speakers = NULL; + int countTime = 0; data_for_speakers = new short[2048]; data_from_mic = new short[1024]; @@ -253,7 +254,7 @@ AudioRtpRTX::run (void) { } else { session->startRunning(); } - + while (ca->enable_audio != -1) { //////////////////////////// // Send session @@ -287,7 +288,7 @@ AudioRtpRTX::run (void) { // Encode acquired audio sample compSize = AudioCodec::codecEncode ( - ac.handleCodecs[0], + ca->payload, data_to_send, data_from_mic_tmp, i); @@ -319,11 +320,21 @@ AudioRtpRTX::run (void) { data_for_speakers, (unsigned char*) adu->getData(), adu->getSize()); - - // Write decoded data to sound device + + // Set decoded data to sound device audioDevice->audio_buf.resize(expandedSize); audioDevice->audio_buf.setData (data_for_speakers, manager->getSpkrVolume()); + + // Notify (with a bip) an incoming call when there is already call + countTime += TimerPort::getElapsed(); + if (manager->sip->getNumberPendingCalls() != 1) { + if ((countTime % 4000) <= 10 and (countTime % 4000) >= 0) { + manager->notificationIncomingCall(); + } + } + + // Write data or notification i = audioDevice->writeBuffer (); delete adu; diff --git a/src/audiortp.h b/src/audiortp.h index 6400d2048c..551461f36e 100644 --- a/src/audiortp.h +++ b/src/audiortp.h @@ -60,7 +60,7 @@ private: /////////////////////////////////////////////////////////////////////////////// class AudioRtp { public: - AudioRtp (SIP *, Manager *); + AudioRtp (Manager *); ~AudioRtp (void); int createNewSession (SipCall *); diff --git a/src/configurationpanel.ui b/src/configurationpanel.ui index 4767d283cc..379fb0cc25 100644 --- a/src/configurationpanel.ui +++ b/src/configurationpanel.ui @@ -757,6 +757,11 @@ <string>G711a</string> </property> </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> <property name="name"> <cstring>codec1</cstring> </property> @@ -772,6 +777,11 @@ <string>G711u</string> </property> </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> <property name="name"> <cstring>codec2</cstring> </property> @@ -787,6 +797,11 @@ <string>G711a</string> </property> </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> <property name="name"> <cstring>codec3</cstring> </property> @@ -802,6 +817,11 @@ <string>G711a</string> </property> </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> <property name="name"> <cstring>codec4</cstring> </property> @@ -817,6 +837,11 @@ <string>G711a</string> </property> </item> + <item> + <property name="text"> + <string>GSM</string> + </property> + </item> <property name="name"> <cstring>codec5</cstring> </property> @@ -1230,7 +1255,7 @@ Montreal, Quebec H2T 1S6</p></string> </widget> <images> <image name="image0"> - <data format="PNG" length="3612">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000de349444154789ced5d5f685bd71dfe69a4e00e3394b18724946197b5600f4aafe73ec85b4baedb97ca4e49a57650bbeb831467c4de5eeab42f493c52350fa9a34286d5e1ce0a84d82d183b0f8eec419895a1221792591e1e7220057b78432ea638c618d998c0b787ab7b75ff9c73efb9574aea343a2f9fe57bfefcced1ef7cf73bbf7bce1581884688a86a0800ab0000644b883da0eaedd4f089c58a1d3475af00009086674117003a3fc145790ce8bf9907007cdf1dafe1e38b9e0ae6d71502f5c753a065802e4cb8467f01884ca1e6c035748dee0a0090af3a33aa5b94c780c256b126216a28844219b1a730a217467583b14cbee6b8357444c70cf9f522a4647599d50ea5e1d99a64a8a12dda66c03ae02f3c7c8635a33f9eaa396e0db9c8bd905f2fc21ff7c09889142809d0f02c280904afcf03002696942883683dfe8b13953b2e80a1e111444ef522d2d35bc20822a77a31181f0400140a85c7479200484d55774217b78a188c03919e5e048eca88f444bcd7ff10ec63617518f6a26228b6609bb2cb78248c8b22807b4053ab8442eb069a5a2548ad01eee733e7638f05b39f391fd3ecaf9abd1958c6a3ff837e4f13f9a1d8c740ebccdb836b8615499199794f1ad70be3464ef51abe8860670843c3230080d1b109200ec89d41edbad41ac07c6e7eff33ae6a7fb51c024687955a0388f4f456c4b455b58f83967fc870a941379c1d36309ead48e3ca57b3e20e0523c322c71f40dc53ec4bcda46ceb57f355ea20155db7b3afe0c13e0081a3b2e50e847587f17a04f639e5f78d1051948892441405e0fb6892e84098e8811846a41c255f6f215e8afe2d4757165a84ebe3e1e8b135ea7ee1882fa9b79781b9dc3c4e9cfc03edd22ed5511d05e4364a0cc61dcb191040b8ab9b56be59d1ead163500e525f4f941a9f7fd6d77654c6eef62ed5d5d7d1dcad34257d3e9fbebe74268bb3036769737b93a4a6266abff6854fb5b3e5cb166abbd34ebbdbbb86faa5a626925e94e8f4fba78df5c581e62f5ba88eeae8d2a797a8fd955ffb12c32348fe35a995f71f3a489bdfdea75ddaa5a53b398b3d2aaa76b3faa79503d07eac43ab4f9fafaebe8ee6e434adf5acd1e123a5ef45c0bebafa3aadbffa76129f2769e6c60cad7cbb6268c77fe820a5df9ca69db777e8e99ffcd89724d3ccf3f284cb2eb9d5b04e4fd084f630c0aad1829d21601dc866b242335e2d1f382a2b1d29316dff07fd1a23055e938122507caddc5eb03368b5efb8f5fa607cc86a5f06889cea35d467d68606462c96fecfd0a4eae733e763fcf1025bf32307a0a88cb3c13e409150a571d0f21fafd03e13e3e33894ffaf03a177ba8ce35d627a8d69a353f3b8f26f0f8cf8b334e1643b9365fb88e83397cc6d87b181301de6308799299b5f6ab1308899299a9a9aa8fd37edd4dd1536321280dc428e5a5a7e6561e8e656097a464a7c9e243d934c4f4d9699c764c7d29d1c4ddf98a6731f5da05dda257fbd9ffa7afaa8bbfb2d9f9dfd2a23255a0350db89f644a9eff7277cd19e5e2c2c2c5898baebed2eea78a3d337363681ee7f8529ba19253a50472d2fb650dfc9a8c670fa7642c742d4f8a773cee3502dfb8e7550f4641fa9d78372909a062f18bedfb3e76398b93143bbb44b819702d4f697cf7c8a86d8ab2c1eabee45b0a4f5ea31adeb680280c1f81030231645d09881519fca30c1ce90a13c72d098c2c230a4aca62d8c74bc6ccfe8f8049f09ef95194a5dcd33edcd9834bca91facfeaaed22076b7f6cc655ed6fb03368a84f5dc4bab50ff78ced87dee932303a32b07c7f00a030ad072dabc7c04098e6985c4b74e9eb15fae05663559856d1b62bd4fdc2b3ee342a11ad150a387cf830a5bf9aa3f66fda28fc77ab66d56bacbe0f4fd3c29d1c6d6e6f72195bcd7f3f0e5c29693955dbae7cb342dd27a35af9d8c019ea78a3d367666a9ee64c67b238fdfe698d91a3ffb8c561b2081616ee6a76f5fdf36b0b53ad7dbb46f480880e10d5d53f4d894f2e3199d6628fcb71706d9fc01d518ffe7a3fcd4e4d2b1e2f0d57ce88766970ae7a8c5bb06144b7989a491918636478047a86d3346d69353b3a3ec1641814c065704d1396da659577d29c6a7911cde8a6fff3b979667fcc0ca96a5afd38b018daad7de6f645e3e53f5adb2a62e13b22ba36494461cf3879778dc3b544a7034413bb6b0a6356d8ce91c1498a0270d2b4b9dc3c9cf275bcde41afd2abda4cbebf1da5e62e2363267d3e1f1df1f9923e9faffbb76ff9ba0fbdabe56f915a28494474c4e70b1e0b521dd519ea533f4fbf3959663ee9ac76fd8b2faf73ef0ce1aeee72f99794f2fafa13d792ca5ae45a9fa13d3777a016a9c560afda9f2880e6f7957108d78769fac6a4711cde0e1bfa471279b2cfdcfec70367b9779eb54201ea6702aac08089595ba6d552e98959a5ed8d2eda682f58e3b4a3e3a53b4151816c266b605455732263a3f1605c35b3aeb334b31a65b0b3cf10ff0463d55c283399a366b46128964665f5477f070abc261b19d8649f6b4d6bb663bd7c5dbdb369f61595ef4c5d3368d18388d7a8818afe69426f07976579c9f7799ae8bb764fedf60f84a989332377b68a38d1778216eede15d64a5253137d7cee636a7cae91ccf159ffa183b4bbbdc3d474160d781e68be61d468aab633df0978f14f3d361e6aa4a14f2f51e3f38a864f1e95a1dac1d28c8d871a2994baee1c5d21b6a6d46bfa36d9183f161987eb9d21a87156967daa3637dba15f13f0c6a3f1b9469afc624c61fc6205cc172a6d86f19acea4f31e9f90d930ad8e1106e383e0c5093103b6864289994b7153641486054aabda2214edab32b79eb94a7b1ed47283f1415b3b53332943fe72b921ab5d6a7e9d3daabd6ab96cc6c593435d7fd5fe30ffafb34b1d2f35966b2ee7649fed9347467b9153bd0abb668ce34c9ef6bd5e2eefdaaa34659737400977edfbe3fb7f734b0d1f1e92a72881c36e2ed7690bd8804b3b6c3aa69eb4e8bf09c8281fa6ac9d0afe61a038d35e14dbcd556912b5c7ae630d1ce69692953374b13421b2abca4e21663eddf5ecea4655274a9133f1d4f662993c62289d92ae427b43b797114169d31280fcbab13fa97b05c863ca7505671183f7337ff9f50dc460ac2f64aa4f8c69138fc45fb55429d37a2d278285a2f5ce637658de1daa220742796f88340ca396de02b3bfd95554d4dfa1dbd67afd05b1fed272e90ee7a27f219bdd80faf17366da47c4b0e65409d37a2d27746b32d5673e8c191acf72ed96c7001e538a301eb71f9cf18aa1b2fec638f5ea1da8b807c863fcf1163af307a0e1728a3b6ee6f28e4cfb30527e5dd1b0a92507c7dd874cebc4a04efb91a56269af86dbf6c1ef477695cdb4b18c87767418cbb86070f07709daee19b129d7906097233b0f0f54df5fcb0ea93b5336086083b1b80b816d979336fd3e9956e4bd10feb87bad1bcbe45d332dd751dc4c1437f5c2fe4d430d89b2e6eebf99076fed4117ecdf44c48fd316c08d1284ae035454a4032d0374d583d36e30da2d897d2d6d01b46ecd171ac7be655a37716fdb277b2c07e2f4035ca6adec3d12b10c3b8e0e07adcc636811f4179cebb7cc601583a60707fde93ce8327fe6b9765ade8c3469e8d075ebd932b3a3ec2fa6e56b5a1646a6c4cea67961da47a16979985ddd707dd6504a8a697edbd5aee6608959db19e2a44d994e5be4d76769dfe5aa783f695aa908a4f467cca038ba7eff72685ce04405f8fdd8179a96816e4e75376c40388ece65a6b2c3f235ef43615a93a636e7f35f7476bcfda46979cc51dc336a76a75576ffcdc740d30a966761c365f10dfe04220a8d5b67140090c8993181d3b84ca775605a9178dd7e645abda6153a450c6b7dd8d2393a0056bcd4c068fb4cd3aa76bb3d7328fa4aacca4f2e3c334778af8ddc26afbbbcb2bfbb4f6d3fffa9edc9851317005ef9c21f77e870e954a79b930f2aface4f405f5fece5253afbca2fb5fadaaf6671eb7f6d440f2649fe4598babbc5ceb41dfc6492361f888fc3c819e30903d6f7277ca68e837701c419f56220ccddf7bab3073cfd1491577ff21f98a4fb1ff2eb379cc66d60ade60599ef5131add0ee2e227ba61598c9d5d2b4a2f67a61267df93ce72c9eabf619d89060dbc3d5b0ab809d1f49c3ca771fcb28e12c5efd746142d9fabcc5b65ffb6374b120a43d9ca20cc24eebb21d375acaa99e081cf60ed84d08179a561e73ff020d9137aab3b4392fdeee552244a6d86f0462463ba0c455eda202bcb8f4d0ed656e94c11f07866e2f5bca9171c03dbc09a6e8c16397d9cc6087b20b07f372c7b09bf129ddc982aa6b5aa6c3388f8f1ba696d538bac3ea5cdd1dc76340a6e6b4c92f7a67c31620d9dc7955fb8d9a96bcbf6146d5386e92dbf721f8ebc3b4d423ae45ed34ad575435a493a6d5bf3f4258d332706c7119efdee09f6236685addf7d7f8e769facf7607b79cfccc1c1d7caf8da4af96885e6e26fa6a89d2ff6da6cded342dd8ac31e467d2947eaf5dd39a3b7bc0b9a788589a57549b9a710ec01581fa1c57b32278269d7745b44251091dba7a7244a5f0509598d6bc0a37c76159cca35eefbfe9ce6e9646643190343c6b5befe82260de8de61501fe5e033e330ac49d796873c750ed61168cc0a5e6bca89c4010496edf9e28fac4c88ce67daf5e9137b04ed7abfa1b1266bb5c941b5d5c36ec4fe5695f697816f298f2a043db8f6be378a38bca3e5aff45a5bc7c358b10aab48f178a9695c7cabff1d17039a5fd360757dbd8690c266e28efeeb24b6edf7fe05513d6f0878db64ce5e5b71678871da53177cfe4851e6dd6f08944e78ca89e361445af92a0864f068a654459bb7889af8aa23fae68b0fd303035dcbf285ea024e61f16c3ca00f709480d6ba847d705b2ab1bb66782dc6245e1911a3e91e8bd022871482f7b16d4b33f3566ada117ac4e4500461795b85e683c6b39071f42799344ed37706b5829fe1fab8c941d3590b5ea0000000049454e44ae426082</data> + <data format="PNG" length="3612">89504e470d0a1a0a0000000d49484452000000ad0000003008060000006357fade00000de349444154789ced5d5f685bd71dfe69a4e00e3394b28724946197b5600fcaaee73ec85d4baee94b65a7a4525b68bcf5418a33626f7ba8ddbee4cf48d5305247850cabc39d951266b760ec3c24b2076656868b5c48667978c88114ece10db998a21863142302df1eaeeed5fd73cebde75e29a9d3e8bc7c96ef3de7fcced1ef7ce73bbf7bce1581884689a8660800eb000064ca881250f37aeaf8d862d50e9aba930700482373a0f3009d9be4a23c0e0ccce60000df75c3ebf8e8a2a78cb94d8540fdf114681da0f393aed1bf0944aea1eec075748dee320090af3833aa5b94c781fc76b12e21ea28844237a2a430a217467583b1f95cdd71ebe8888e37e4368b9092b565563b9446e6ea92a18eb6687b033601ffe683675833fae3a9bae3d6918bdc0bb9cd22fc710f8c99488192008dcc819240f0ea220060724589328896e3bf3059bde302181e1945e4641f22bd7d658c2072b20f43f12100403e9f7f74240980d4b5da0ee8e27611437120d2db87c0611991de88f7f21f807d2cac0dc35e500cc5366c5366150f85715104b00ab4b44b28b417d1d22e416a0f703f9f3a177b2498fdd4b998667fcdec5d80a53f06de1bf034901f887d0cb48ebc125c33ac488acc2c7ad2b85e183772b2cff04504bb43181e1905008c8d4f027140ee0e6ad7a5f60016b38b7b9f7155fb6be510303aacd41e40a4b7af2aa6ada97d1cb4fc43864b0deac0ae001098c854a571e52b197187829161b1ccef40dc51ec4bcda46ccb57efabd641aaba6e675fde837d00028765cb0c8482437f3d04fb9ceef78d1251948892441405e0fb608a685f98e8be1846a42c255f6d235e8afe2d4b9797da84cbe3e1d8910dea79fe902fa9b79781d9ec228e9ff82dedd22e35500305e40e4a0cc51df3191040f8580fad7dbda695a3c7a01ca4fede28353ff78cafe3b08cdd9d5d6a686ca0851b694afa7c3e7d79e9f90c4e9f3d4d5b3b5b24b5b450e75f3ff7a976b67dd1461db73a697767d750bed4d242d2cf251a7c77d0585e1c68fda28d1aa8812e7e7c913a5f7ed197181945f22f492dbfffc07edafae62eedd22eaddcca5aec5151b59bd53e2d1f80ce235d5a79fafb1a1a1b68414ed346ef061d3c54fe5e04ec6b686cd0daabaf27f1699266aecfd0da376b867afc07f653faf569baf7e63d7af2473ff425c934f2bc3ce1b24b6e35acd31334a13d0cb06ab4607708280099f98cd08857f3070ecb4a43ca4c3bf0de80c648815764a008e0954a7dc1eea0d5bea3d6eb43f161ab7d0b40e4649fa13cb336343062a9fc7f8626553f9f3a17e3f717d89a1fcb50daa5ab2fd81d0200454295fb41bbff6895f699181f47a1fcbf0084de3e66ecef32d36b4c1bbdb688cbfff6c0883f4e134e743259b69f883e71c9dc76183b1ba6831ce6303365eb0b6d16063133454b4b0b75feb2937a8e858d8c0420bb94a5b6b65f5818bab55d829e91129f2649cf24d3d7a62acc63b263e55696a6af4fd3990fced32eed92bfd14ffdbdfdd4d3f386cfce7e959112ed01a8f5447ba3d4ff9be3be686f1f9696962c4c7deccd63d4f55ab76f7c7c123dff0a53742b4ab4af81da7ede46fd27a21ac3e9eb091d0951f31fce38f743adec3bd245d113fda45e0fca416a193a6ff87e4f9f8b61e6fa0cedd22e055e0850c79f3ff1291aa2545d3c56dd8b60499bb5635ad7d1040043f16160562c8aa03103a33c956182dd21437e64a13185856148594d5b18e968c59eb189493e13ae56184a5dcd33ed5d306978533b58ed55eb4516d6f6d8f4abdade6077d0509eba88756b1fee18eb0fbd7dccc0e89887e5fb030085693d68593d06ce866981c9b54417bf5aa3f76e34d78469156dbb463dcf3fe34ea312d1463e8f83070f52facb05eafcba83c27fb76a56bdc6ea7f7f90966e65696b678bcbd8eafd77e3c0e5b29653b5eddad76bd47322aae58f9d3d455daf75fbcc4ccdd39ce9f90c06df1dd41839fa8f1b1c268b6069e9b66657ff3fbfb230d5c6371b44f789681f5143e39394f8e82293692df6b8ec07d7f609cc887af437fa69eedab4e2f1d248f58c689786166ac7b8051b46748ba999948131464746a167384dd39657b36313934c86411e5c06d73461b95e567e27cda9e617d18c6edabf985d64b6c7cc90aaa6d5f7038ba1ddda67ae5f345efe838ded2296be25a2cfa68828ec19a76e6f70b89668304034b9b3a1306695f53cf5c7298a0270d2b4d9ec229ceeeb7ab58b5ea417b5917c77274aad6f191933e9f3f9e890cf97f4f97c3d6fbde10b1f7843bbbf4d6aa32411d1219f2f7824480dd460284ffd3cfdfa9456efa034a85dfffc8babdc99217caca792ff0525bfbefcc46749652df259bfa13e3733509bd466b0576d4f1440ebef957ee86aeca2e9eb53c67e78336c681f49e4c93e73fd1f9e3dcd9d7936f279a89f09a8010326e66c99564be5986eb5f58d2ddb682f58e3b46313e599a0a840663e636054557362de46e3c1b86a665d6769662dca60639f21fe09c6aa395f613247cd68c3502c8dca6a8f7e060abc221b19d8649f6b4d6bb6a350b9aece6c9a7d4500a5ca9a418b1e44bc460d54f44f13fabab82ccb4bbe4fd344df767aaa77e06c985a3823f2de7611c7fb8fd3d2eddbc25a496a69a10fcf7c48cdcf3693393eeb3fb09f7677ee31359d45039e035aaf1b359aaaedcc33012ffea9c7e603cd34fcf1456a7e4ed1f0c9c332543b589ab1f940338552579da32bc4d6947a4ddf211be3c722fd70b53b0435cecab24fd5e6663bf46b025e7f343fdb4c539f8f2b8c5f0df385ca9b61bca653e99cc72764364cab6384a1f810787142cc82ada1506666356ebaa0302c505ed596a0685f95b9f5cc55def3a0e61b8a0fd9da999a4919eeafe41bb6daa5deafb347b557cd979977f1e450d75eb53dccffebec52fb0b5918fa41d43edb278f8cfa2227fb8055285104ddfde469dfeba5caaead6a5366b5004ab8abdf1fdffb9b5beaf8e0903c450904f61bb84adb65d27263874dc3d4931603b3808cca61cafaa9e0ef078a33ed05b1dd5cd526517bec1ad6c4616e29593d4317cb0322b35e00c0294f773db35ea8e9402972069e5a5f6c3e8718caa7a46b50dff0cd554450deb40420b7696c4fea4e1ef2b8725dc139c4e0fdcc5f6eb380188ce5854ce589316de2a1f8ab96aa655aaff944b050b2ce3c6687e5cd505539102a7b43a41118b5f43698edcdaca3aaf60edfb496ebdf146b2fad97673817ed0bd9ec06d4f79f33d33e248635a76a98d66b3ea1a9c9549ef930666822c3b55b1e07784c29c278dc7670fa2b86eada1be394ab77a0620990c7f9fd2d74e60f40d3a514b7dfccf91d99f641a4dca6a261532b0e8ebb0799d689419df6234ba5f25e0db7f583df8ecc3a9b6963f31eead1616cde058383bf4bd076cf884dbea6043b1fd97978a0f6fe5a7148dd99b2210005c6e22e04b65d4edaf4bb645a91f742f8e3eeb56e6c3ee79a69b98ee266a0b82917f66f1a6a4a5434f7c06c0ebcb5079db77f13115f936c821b25085d05a8a448075a07e88a07a7dd66d45b16fb5ada06a860bd2f34813dcbb4dcfe74fb648fe5409c7680cbb4d5bd472236cf8ea3c3412bf3185a04fd9bcee55b46b08a41d3838381740e74893ff25c3b2d6f449a3474e8aaf56c99c551cc8ef59d322d5fd3b230724dec6c9a17a67d189a968799f582ebb38652524cf3dbae7635074bccd98e10276dca74da12bf3c4bfd2e57c57b49d34a2520a53f6306c5d1f5fb97431302272ac06fc79ed0b40c7473aabb691bc271742e33551c96af791f08d39a34b5f93eff0567c7db4b9a96c71cc59251b33badb207661f014d2b989f854d97c437f813882834611d5100402267c63c3e1d73625a9178dd5e645aa0725de81431ace5615be7e80058f15203a3ed314dabdaedf6cca1e82bb1aa3fb9f0f402e19d0e729bbceef2cafcfa2e75fce429db930bc7cf03bcfcf9dfdda383e5539d6e4e3ea8e83b37097d79b19756e8f4cb3fd3caebbc92c18dff7510dd9f22f9a761eae9113bd3b6ffa329daba2fde0fa3a78c270c58df9ff0993a0ede061067948bb361eebed77b25e0c92788bcfa937fdf14dd7d9f5fbee1346e136b352fc87c0f8b6985767711d933adc048ae95a615b5d70b33e9f3e73867f15cd5cfc0a604db1eae865d07ecfc481a51befbd8bc12cee295cf9c71f4dfaffac7d8725e487b384519849dd6653d6eb49453391138ec1db01b102e34ad3ceefe051a226f546769735ebcddab44885c63bf118819ed801257b58b0af0e2d2c33757b951067f1c18beb96ac947c60ef7f0269892078ff5f03e04d98583799931ec467c4a77b2a0e69a96e930cefde386a965358eeeb03a5777c7f11890a9396dee179dd9b00d483633af6abf51d392f737cca81ac74d72fb3e047f6398567ac5b5a89da6f58aaa8674d2b4faf747086b5a068e2fafe257d7f9a7980d9a56f7fd35ff699afeb3d3c5cd273fbd40fbdfe920e9cb15a2975a89be5ca1f47f5b696b274d4b366b0cf9e934a5dfe9d4b4e6bd1270e6092296e615d5a6665c007059a03cc7d5ac089e4ae75c11ad50544287ae9e1c51393c5423a635afc2cd71583ba61d987567374b23b218481a99b32d776c1930ef46ab66a6e1ed35e033a340dc99873633866a0f3363042e35e705e504824872fbf644d127466634ef7bf58abc8e75ba5ed3df9030dbe522dfd8f2aa617f2a4ffb4a237390c795071dda7e5c1bc71b5b56f6d1fa2f28f9e52b198450a37dbc50b4ac3c5ef98d8fa64b29edb739b8dac64e6330715b7977975d72fbfe03af9ab08edf6fb4652a2fbfb5c03bec288dbb7b262ff468b38e8f253adf88da694351f42a09eaf878a0d88da868172ff15551f4c7150db6173aa68e7b17c53394c5fc83625819e03e01a9631df5e83a4366bd607b26c82d56151ea9e36389de0b801287f4b267413dfb5367d63a7ac1da1404606c5989eb8526329673f021543649d47f03b78ed5e2ff01a9e39f669eee93e00000000049454e44ae426082</data> </image> </images> <connections> diff --git a/src/configurationpanelui.cpp b/src/configurationpanelui.cpp index a348bce7e3..28935be1ef 100644 --- a/src/configurationpanelui.cpp +++ b/src/configurationpanelui.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Form implementation generated from reading ui file 'configurationpanel.ui' ** -** Created: Mon Feb 7 11:33:42 2005 +** Created: Thu Feb 10 12:16:26 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! @@ -35,302 +35,302 @@ static const unsigned char image0_data[] = { 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0xad, 0x00, 0x00, 0x00, 0x30, 0x08, 0x06, 0x00, 0x00, 0x00, 0x63, 0x57, 0xfa, 0xde, 0x00, 0x00, 0x0d, 0xe3, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x5d, 0x5f, 0x68, 0x5b, - 0xd7, 0x1d, 0xfe, 0x69, 0xa4, 0xe0, 0x0e, 0x33, 0x94, 0xb1, 0x87, 0x24, - 0x94, 0x61, 0x97, 0xb5, 0x60, 0x0f, 0x4a, 0xaf, 0xe7, 0x3e, 0xc8, 0x5b, - 0x4b, 0xae, 0xdb, 0x97, 0xca, 0x4e, 0x49, 0xa5, 0x76, 0x50, 0xbb, 0xeb, - 0x83, 0x14, 0x67, 0xc4, 0xde, 0x5e, 0xea, 0xb4, 0x2f, 0x49, 0x3c, 0x52, - 0x35, 0x0f, 0xa9, 0xa3, 0x42, 0x86, 0xd5, 0xe1, 0xce, 0x0a, 0x84, 0xd8, - 0x2d, 0x18, 0x3b, 0x0f, 0x8e, 0xec, 0x41, 0x98, 0x95, 0xa1, 0x22, 0x17, - 0x92, 0x59, 0x1e, 0x1e, 0x72, 0x20, 0x05, 0x7b, 0x78, 0x43, 0x2e, 0xa6, - 0x38, 0xc6, 0x18, 0xd9, 0x98, 0xc0, 0xb7, 0x87, 0xab, 0x7b, 0x75, 0xff, - 0x9c, 0x73, 0xef, 0xb9, 0x57, 0x4a, 0xea, 0x34, 0x3a, 0x2f, 0x9f, 0xe5, - 0x7b, 0xfe, 0xfc, 0xce, 0xd1, 0xef, 0x7c, 0xf7, 0x3b, 0xbf, 0x7b, 0xce, - 0x15, 0x81, 0x88, 0x46, 0x88, 0xa8, 0x6a, 0x08, 0x00, 0xab, 0x00, 0x00, - 0x64, 0x4b, 0x88, 0x3d, 0xa0, 0xea, 0xed, 0xd4, 0xf0, 0x89, 0xc5, 0x8a, - 0x1d, 0x34, 0x75, 0xaf, 0x00, 0x00, 0x90, 0x86, 0x67, 0x41, 0x17, 0x00, - 0x3a, 0x3f, 0xc1, 0x45, 0x79, 0x0c, 0xe8, 0xbf, 0x99, 0x07, 0x00, 0x7c, - 0xdf, 0x1d, 0xaf, 0xe1, 0xe3, 0x8b, 0x9e, 0x0a, 0xe6, 0xd7, 0x15, 0x02, - 0xf5, 0xc7, 0x53, 0xa0, 0x65, 0x80, 0x2e, 0x4c, 0xb8, 0x46, 0x7f, 0x01, - 0x88, 0x4c, 0xa1, 0xe6, 0xc0, 0x35, 0x74, 0x8d, 0xee, 0x0a, 0x00, 0x90, - 0xaf, 0x3a, 0x33, 0xaa, 0x5b, 0x94, 0xc7, 0x80, 0xc2, 0x56, 0xb1, 0x26, - 0x21, 0x6a, 0x28, 0x84, 0x42, 0x19, 0xb1, 0xa7, 0x30, 0xa2, 0x17, 0x46, - 0x75, 0x83, 0xb1, 0x4c, 0xbe, 0xe6, 0xb8, 0x35, 0x74, 0x44, 0xc7, 0x0c, - 0xf9, 0xf5, 0x22, 0xa4, 0x64, 0x75, 0x99, 0xd5, 0x0e, 0xa5, 0xe1, 0xd9, - 0x9a, 0x64, 0xa8, 0xa1, 0x2d, 0xda, 0x66, 0xc0, 0x3a, 0xe0, 0x2f, 0x3c, - 0x7c, 0x86, 0x35, 0xa3, 0x3f, 0x9e, 0xaa, 0x39, 0x6e, 0x0d, 0xb9, 0xc8, - 0xbd, 0x90, 0x5f, 0x2f, 0xc2, 0x1f, 0xf7, 0xc0, 0x98, 0x89, 0x14, 0x28, - 0x09, 0xd0, 0xf0, 0x2c, 0x28, 0x09, 0x04, 0xaf, 0xcf, 0x03, 0x00, 0x26, - 0x96, 0x94, 0x28, 0x83, 0x68, 0x3d, 0xfe, 0x8b, 0x13, 0x95, 0x3b, 0x2e, - 0x80, 0xa1, 0xe1, 0x11, 0x44, 0x4e, 0xf5, 0x22, 0xd2, 0xd3, 0x5b, 0xc2, - 0x08, 0x22, 0xa7, 0x7a, 0x31, 0x18, 0x1f, 0x04, 0x00, 0x14, 0x0a, 0x85, - 0xc7, 0x47, 0x92, 0x00, 0x48, 0x4d, 0x55, 0x77, 0x42, 0x17, 0xb7, 0x8a, - 0x18, 0x8c, 0x03, 0x91, 0x9e, 0x5e, 0x04, 0x8e, 0xca, 0x88, 0xf4, 0x44, - 0xbc, 0xd7, 0xff, 0x10, 0xec, 0x63, 0x61, 0x75, 0x18, 0xf6, 0xa2, 0x62, - 0x28, 0xb6, 0x60, 0x9b, 0xb2, 0xcb, 0x78, 0x24, 0x8c, 0x8b, 0x22, 0x80, - 0x7b, 0x40, 0x53, 0xab, 0x84, 0x42, 0xeb, 0x06, 0x9a, 0x5a, 0x25, 0x48, - 0xad, 0x01, 0xee, 0xe7, 0x33, 0xe7, 0x63, 0x8f, 0x05, 0xb3, 0x9f, 0x39, - 0x1f, 0xd3, 0xec, 0xaf, 0x9a, 0xbd, 0x19, 0x58, 0xc6, 0xa3, 0xff, 0x83, - 0x7e, 0x4f, 0x13, 0xf9, 0xa1, 0xd8, 0xc7, 0x40, 0xeb, 0xcc, 0xdb, 0x83, - 0x6b, 0x86, 0x15, 0x49, 0x91, 0x99, 0x79, 0x4f, 0x1a, 0xd7, 0x0b, 0xe3, - 0x46, 0x4e, 0xf5, 0x1a, 0xbe, 0x88, 0x60, 0x67, 0x08, 0x43, 0xc3, 0x23, - 0x00, 0x80, 0xd1, 0xb1, 0x09, 0x20, 0x0e, 0xc8, 0x9d, 0x41, 0xed, 0xba, - 0xd4, 0x1a, 0xc0, 0x7c, 0x6e, 0x7e, 0xff, 0x33, 0xae, 0x6a, 0x7f, 0xb5, - 0x1c, 0x02, 0x46, 0x87, 0x95, 0x5a, 0x03, 0x88, 0xf4, 0xf4, 0x56, 0xc4, - 0xb4, 0x55, 0xb5, 0x8f, 0x83, 0x96, 0x7f, 0xc8, 0x70, 0xa9, 0x41, 0x37, - 0x9c, 0x1d, 0x36, 0x30, 0x9e, 0xad, 0x48, 0xe3, 0xca, 0x57, 0xb3, 0xe2, - 0x0e, 0x05, 0x23, 0xc3, 0x22, 0xc7, 0x1f, 0x40, 0xdc, 0x53, 0xec, 0x4b, - 0xcd, 0xa4, 0x6c, 0xeb, 0x57, 0xf3, 0x55, 0xea, 0x20, 0x15, 0x5d, 0xb7, - 0xb3, 0xaf, 0xe0, 0xc1, 0x3e, 0x00, 0x81, 0xa3, 0xb2, 0xe5, 0x0e, 0x84, - 0x75, 0x87, 0xf1, 0x7a, 0x04, 0xf6, 0x39, 0xe5, 0xf7, 0x8d, 0x10, 0x51, - 0x94, 0x88, 0x92, 0x44, 0x14, 0x05, 0xe0, 0xfb, 0x68, 0x92, 0xe8, 0x40, - 0x98, 0xe8, 0x81, 0x18, 0x46, 0xa4, 0x1c, 0x25, 0x5f, 0x6f, 0x21, 0x5e, - 0x8a, 0xfe, 0x2d, 0x47, 0x57, 0x16, 0x5a, 0x84, 0xeb, 0xe3, 0xe1, 0xe8, - 0xb1, 0x35, 0xea, 0x7e, 0xe1, 0x88, 0x2f, 0xa9, 0xb7, 0x97, 0x81, 0xb9, - 0xdc, 0x3c, 0x4e, 0x9c, 0xfc, 0x03, 0xed, 0xd2, 0x2e, 0xd5, 0x51, 0x1d, - 0x05, 0xe4, 0x36, 0x4a, 0x0c, 0xc6, 0x1d, 0xcb, 0x19, 0x10, 0x40, 0xb8, - 0xab, 0x9b, 0x56, 0xbe, 0x59, 0xd1, 0xea, 0xd1, 0x63, 0x50, 0x0e, 0x52, - 0x5f, 0x4f, 0x94, 0x1a, 0x9f, 0x7f, 0xd6, 0xd7, 0x76, 0x54, 0xc6, 0xee, - 0xf6, 0x2e, 0xd5, 0xd5, 0xd7, 0xd1, 0xdc, 0xad, 0x34, 0x25, 0x7d, 0x3e, - 0x9f, 0xbe, 0xbe, 0x74, 0x26, 0x8b, 0xb3, 0x03, 0x67, 0x69, 0x73, 0x7b, - 0x93, 0xa4, 0xa6, 0x26, 0x6a, 0xbf, 0xf6, 0x85, 0x4f, 0xb5, 0xb3, 0xe5, - 0xcb, 0x16, 0x6a, 0xbb, 0xd3, 0x4e, 0xbb, 0xdb, 0xbb, 0x86, 0xfa, 0xa5, - 0xa6, 0x26, 0x92, 0x5e, 0x94, 0xe8, 0xf4, 0xfb, 0xa7, 0x8d, 0xf5, 0xc5, - 0x81, 0xe6, 0x2f, 0x5b, 0xa8, 0x8e, 0xea, 0xe8, 0xd2, 0xa7, 0x97, 0xa8, - 0xfd, 0x95, 0x5f, 0xfb, 0x12, 0xc3, 0x23, 0x48, 0xfe, 0x35, 0xa9, 0x95, - 0xf7, 0x1f, 0x3a, 0x48, 0x9b, 0xdf, 0xde, 0xa7, 0x5d, 0xda, 0xa5, 0xa5, - 0x3b, 0x39, 0x8b, 0x3d, 0x2a, 0xaa, 0x76, 0xb3, 0xfa, 0xa7, 0x95, 0x03, - 0xd0, 0x7e, 0xac, 0x43, 0xab, 0x4f, 0x9f, 0xaf, 0xae, 0xbe, 0x8e, 0xe6, - 0xe4, 0x34, 0xad, 0xf5, 0xac, 0xd1, 0xe1, 0x23, 0xa5, 0xef, 0x45, 0xc0, - 0xbe, 0xba, 0xfa, 0x3a, 0xad, 0xbf, 0xfa, 0x76, 0x12, 0x9f, 0x27, 0x69, - 0xe6, 0xc6, 0x0c, 0xad, 0x7c, 0xbb, 0x62, 0x68, 0xc7, 0x7f, 0xe8, 0x20, - 0xa5, 0xdf, 0x9c, 0xa6, 0x9d, 0xb7, 0x77, 0xe8, 0xe9, 0x9f, 0xfc, 0xd8, - 0x97, 0x24, 0xd3, 0xcc, 0xf3, 0xf2, 0x84, 0xcb, 0x2e, 0xb9, 0xd5, 0xb0, - 0x4e, 0x4f, 0xd0, 0x84, 0xf6, 0x30, 0xc0, 0xaa, 0xd1, 0x82, 0x9d, 0x21, - 0x60, 0x1d, 0xc8, 0x66, 0xb2, 0x42, 0x33, 0x5e, 0x2d, 0x1f, 0x38, 0x2a, - 0x2b, 0x1d, 0x29, 0x31, 0x6d, 0xff, 0x07, 0xfd, 0x1a, 0x23, 0x05, 0x5e, - 0x93, 0x81, 0x22, 0x50, 0x7c, 0xad, 0xdc, 0x5e, 0xb0, 0x33, 0x68, 0xb5, - 0xef, 0xb8, 0xf5, 0xfa, 0x60, 0x7c, 0xc8, 0x6a, 0x5f, 0x06, 0x88, 0x9c, - 0xea, 0x35, 0xd4, 0x67, 0xd6, 0x86, 0x06, 0x46, 0x2c, 0x96, 0xfe, 0xcf, - 0xd0, 0xa4, 0xea, 0xe7, 0x33, 0xe7, 0x63, 0xfc, 0xf1, 0x02, 0x5b, 0xf3, - 0x23, 0x07, 0xa0, 0xa8, 0x8c, 0xb3, 0xc1, 0x3e, 0x40, 0x91, 0x50, 0xa5, - 0x71, 0xd0, 0xf2, 0x1f, 0xaf, 0xd0, 0x3e, 0x13, 0xe3, 0xe3, 0x38, 0x94, - 0xff, 0xaf, 0x03, 0xa1, 0x77, 0xba, 0x8c, 0xe3, 0x5d, 0x62, 0x7a, 0x8d, - 0x69, 0xa3, 0x53, 0xf3, 0xb8, 0xf2, 0x6f, 0x0f, 0x8c, 0xf8, 0xb3, 0x34, - 0xe1, 0x64, 0x3b, 0x93, 0x65, 0xfb, 0x88, 0xe8, 0x33, 0x97, 0xcc, 0x6d, - 0x87, 0xb1, 0x81, 0x30, 0x1d, 0xe6, 0x30, 0x87, 0x99, 0x29, 0x9b, 0x5f, - 0x6a, 0xb1, 0x30, 0x88, 0x99, 0x29, 0x9a, 0x9a, 0x9a, 0xa8, 0xfd, 0x37, - 0xed, 0xd4, 0xdd, 0x15, 0x36, 0x32, 0x12, 0x80, 0xdc, 0x42, 0x8e, 0x5a, - 0x5a, 0x7e, 0x65, 0x61, 0xe8, 0xe6, 0x56, 0x09, 0x7a, 0x46, 0x4a, 0x7c, - 0x9e, 0x24, 0x3d, 0x93, 0x4c, 0x4f, 0x4d, 0x96, 0x99, 0xc7, 0x64, 0xc7, - 0xd2, 0x9d, 0x1c, 0x4d, 0xdf, 0x98, 0xa6, 0x73, 0x1f, 0x5d, 0xa0, 0x5d, - 0xda, 0x25, 0x7f, 0xbd, 0x9f, 0xfa, 0x7a, 0xfa, 0xa8, 0xbb, 0xfb, 0x2d, - 0x9f, 0x9d, 0xfd, 0x2a, 0x23, 0x25, 0x5a, 0x03, 0x50, 0xdb, 0x89, 0xf6, - 0x44, 0xa9, 0xef, 0xf7, 0x27, 0x7c, 0xd1, 0x9e, 0x5e, 0x2c, 0x2c, 0x2c, - 0x58, 0x98, 0xba, 0xeb, 0xed, 0x2e, 0xea, 0x78, 0xa3, 0xd3, 0x37, 0x36, - 0x36, 0x81, 0xee, 0x7f, 0x85, 0x29, 0xba, 0x19, 0x25, 0x3a, 0x50, 0x47, - 0x2d, 0x2f, 0xb6, 0x50, 0xdf, 0xc9, 0xa8, 0xc6, 0x70, 0xfa, 0x76, 0x42, - 0xc7, 0x42, 0xd4, 0xf8, 0xa7, 0x73, 0xce, 0xe3, 0x50, 0x2d, 0xfb, 0x8e, - 0x75, 0x50, 0xf4, 0x64, 0x1f, 0xa9, 0xd7, 0x83, 0x72, 0x90, 0x9a, 0x06, - 0x2f, 0x18, 0xbe, 0xdf, 0xb3, 0xe7, 0x63, 0x98, 0xb9, 0x31, 0x43, 0xbb, - 0xb4, 0x4b, 0x81, 0x97, 0x02, 0xd4, 0xf6, 0x97, 0xcf, 0x7c, 0x8a, 0x86, - 0xd8, 0xab, 0x2c, 0x1e, 0xab, 0xee, 0x45, 0xb0, 0xa4, 0xf5, 0xea, 0x31, - 0xad, 0xeb, 0x68, 0x02, 0x80, 0xc1, 0xf8, 0x10, 0x30, 0x23, 0x16, 0x45, - 0xd0, 0x98, 0x81, 0x51, 0x9f, 0xca, 0x30, 0xc1, 0xce, 0x90, 0xa1, 0x3c, - 0x72, 0xd0, 0x98, 0xc2, 0xc2, 0x30, 0xa4, 0xac, 0xa6, 0x2d, 0x8c, 0x74, - 0xbc, 0x6c, 0xcf, 0xe8, 0xf8, 0x04, 0x9f, 0x09, 0xef, 0x95, 0x19, 0x4a, - 0x5d, 0xcd, 0x33, 0xed, 0xcd, 0x98, 0x34, 0xbc, 0xa9, 0x1f, 0xac, 0xfe, - 0xaa, 0xed, 0x22, 0x07, 0x6b, 0x7f, 0x6c, 0xc6, 0x55, 0xed, 0x6f, 0xb0, - 0x33, 0x68, 0xa8, 0x4f, 0x5d, 0xc4, 0xba, 0xb5, 0x0f, 0xf7, 0x8c, 0xed, - 0x87, 0xde, 0xe9, 0x32, 0x30, 0x3a, 0x32, 0xb0, 0x7c, 0x7f, 0x00, 0xa0, - 0x30, 0xad, 0x07, 0x2d, 0xab, 0xc7, 0xc0, 0x40, 0x98, 0xe6, 0x98, 0x5c, - 0x4b, 0x74, 0xe9, 0xeb, 0x15, 0xfa, 0xe0, 0x56, 0x63, 0x55, 0x98, 0x56, - 0xd1, 0xb6, 0x2b, 0xd4, 0xfd, 0xc2, 0xb3, 0xee, 0x34, 0x2a, 0x11, 0xad, - 0x15, 0x0a, 0x38, 0x7c, 0xf8, 0x30, 0xa5, 0xbf, 0x9a, 0xa3, 0xf6, 0x6f, - 0xda, 0x28, 0xfc, 0x77, 0xab, 0x66, 0xd5, 0x6b, 0xac, 0xbe, 0x0f, 0x4f, - 0xd3, 0xc2, 0x9d, 0x1c, 0x6d, 0x6e, 0x6f, 0x72, 0x19, 0x5b, 0xcd, 0x7f, - 0x3f, 0x0e, 0x5c, 0x29, 0x69, 0x39, 0x55, 0xdb, 0xae, 0x7c, 0xb3, 0x42, - 0xdd, 0x27, 0xa3, 0x5a, 0xf9, 0xd8, 0xc0, 0x19, 0xea, 0x78, 0xa3, 0xd3, - 0x67, 0x66, 0x6a, 0x9e, 0xe6, 0x4c, 0x67, 0xb2, 0x38, 0xfd, 0xfe, 0x69, - 0x8d, 0x91, 0xa3, 0xff, 0xb8, 0xc5, 0x61, 0xb2, 0x08, 0x16, 0x16, 0xee, - 0x6a, 0x76, 0xf5, 0xfd, 0xf3, 0x6b, 0x0b, 0x53, 0xad, 0x7d, 0xbb, 0x46, - 0xf4, 0x80, 0x88, 0x0e, 0x10, 0xd5, 0xd5, 0x3f, 0x4d, 0x89, 0x4f, 0x2e, - 0x31, 0x99, 0xd6, 0x62, 0x8f, 0xcb, 0x71, 0x70, 0x6d, 0x9f, 0xc0, 0x1d, - 0x51, 0x8f, 0xfe, 0x7a, 0x3f, 0xcd, 0x4e, 0x4d, 0x2b, 0x1e, 0x2f, 0x0d, - 0x57, 0xce, 0x88, 0x76, 0x69, 0x70, 0xae, 0x7a, 0x8c, 0x5b, 0xb0, 0x61, - 0x44, 0xb7, 0x98, 0x9a, 0x49, 0x19, 0x18, 0x63, 0x64, 0x78, 0x04, 0x7a, - 0x86, 0xd3, 0x34, 0x6d, 0x69, 0x35, 0x3b, 0x3a, 0x3e, 0xc1, 0x64, 0x18, - 0x14, 0xc0, 0x65, 0x70, 0x4d, 0x13, 0x96, 0xda, 0x65, 0x95, 0x77, 0xd2, - 0x9c, 0x6a, 0x79, 0x11, 0xcd, 0xe8, 0xa6, 0xff, 0xf3, 0xb9, 0x79, 0x66, - 0x7f, 0xcc, 0x0c, 0xa9, 0x6a, 0x5a, 0xfd, 0x38, 0xb0, 0x18, 0xda, 0xad, - 0x7d, 0xe6, 0xf6, 0x45, 0xe3, 0xe5, 0x3f, 0x5a, 0xdb, 0x2a, 0x62, 0xe1, - 0x3b, 0x22, 0xba, 0x36, 0x49, 0x44, 0x61, 0xcf, 0x38, 0x79, 0x77, 0x8d, - 0xc3, 0xb5, 0x44, 0xa7, 0x03, 0x44, 0x13, 0xbb, 0x6b, 0x0a, 0x63, 0x56, - 0xd8, 0xce, 0x91, 0xc1, 0x49, 0x8a, 0x02, 0x70, 0xd2, 0xb4, 0xb9, 0xdc, - 0x3c, 0x9c, 0xf2, 0x75, 0xbc, 0xde, 0x41, 0xaf, 0xd2, 0xab, 0xda, 0x4c, - 0xbe, 0xbf, 0x1d, 0xa5, 0xe6, 0x2e, 0x23, 0x63, 0x26, 0x7d, 0x3e, 0x1f, - 0x1d, 0xf1, 0xf9, 0x92, 0x3e, 0x9f, 0xaf, 0xfb, 0xb7, 0x6f, 0xf9, 0xba, - 0x0f, 0xbd, 0xab, 0xe5, 0x6f, 0x91, 0x5a, 0x28, 0x49, 0x44, 0x74, 0xc4, - 0xe7, 0x0b, 0x1e, 0x0b, 0x52, 0x1d, 0xd5, 0x19, 0xea, 0x53, 0x3f, 0x4f, - 0xbf, 0x39, 0x59, 0x66, 0x3e, 0xe9, 0xac, 0x76, 0xfd, 0x8b, 0x2f, 0xaf, - 0x73, 0xef, 0x0c, 0xe1, 0xae, 0xee, 0x72, 0xf9, 0x97, 0x94, 0xf2, 0xfa, - 0xfa, 0x13, 0xd7, 0x92, 0xca, 0x5a, 0xe4, 0x5a, 0x9f, 0xa1, 0x3d, 0x37, - 0x77, 0xa0, 0x16, 0xa9, 0xc5, 0x60, 0xaf, 0xda, 0x9f, 0x28, 0x80, 0xe6, - 0xf7, 0x95, 0x71, 0x08, 0xd7, 0x87, 0x69, 0xfa, 0xc6, 0xa4, 0x71, 0x1c, - 0xde, 0x0e, 0x1b, 0xfa, 0x47, 0x12, 0x79, 0xb2, 0xcf, 0xdc, 0xfe, 0xc7, - 0x03, 0x67, 0xb9, 0x77, 0x9e, 0xb5, 0x42, 0x01, 0xea, 0x67, 0x02, 0xaa, - 0xc0, 0x80, 0x89, 0x59, 0x5b, 0xa6, 0xd5, 0x52, 0xe9, 0x89, 0x59, 0xa5, - 0xed, 0x8d, 0x2e, 0xda, 0x68, 0x2f, 0x58, 0xe3, 0xb4, 0xa3, 0xe3, 0xa5, - 0x3b, 0x41, 0x51, 0x81, 0x6c, 0x26, 0x6b, 0x60, 0x54, 0x55, 0x73, 0x22, - 0x63, 0xa3, 0xf1, 0x60, 0x5c, 0x35, 0xb3, 0xae, 0xb3, 0x34, 0xb3, 0x1a, - 0x65, 0xb0, 0xb3, 0xcf, 0x10, 0xff, 0x04, 0x63, 0xd5, 0x5c, 0x28, 0x33, - 0x99, 0xa3, 0x66, 0xb4, 0x61, 0x28, 0x96, 0x46, 0x65, 0xf5, 0x47, 0x7f, - 0x07, 0x0a, 0xbc, 0x26, 0x1b, 0x19, 0xd8, 0x64, 0x9f, 0x6b, 0x4d, 0x6b, - 0xb6, 0x63, 0xbd, 0x7c, 0x5d, 0xbd, 0xb3, 0x69, 0xf6, 0x15, 0x95, 0xef, - 0x4c, 0x5d, 0x33, 0x68, 0xd1, 0x83, 0x88, 0xd7, 0xa8, 0x81, 0x8a, 0xfe, - 0x69, 0x42, 0x6f, 0x07, 0x97, 0x65, 0x79, 0xc9, 0xf7, 0x79, 0x9a, 0xe8, - 0xbb, 0x76, 0x4f, 0xed, 0xf6, 0x0f, 0x84, 0xa9, 0x89, 0x33, 0x23, 0x77, - 0xb6, 0x8a, 0x38, 0xd1, 0x77, 0x82, 0x16, 0xee, 0xde, 0x15, 0xd6, 0x4a, - 0x52, 0x53, 0x13, 0x7d, 0x7c, 0xee, 0x63, 0x6a, 0x7c, 0xae, 0x91, 0xcc, - 0xf1, 0x59, 0xff, 0xa1, 0x83, 0xb4, 0xbb, 0xbd, 0xc3, 0xd4, 0x74, 0x16, - 0x0d, 0x78, 0x1e, 0x68, 0xbe, 0x61, 0xd4, 0x68, 0xaa, 0xb6, 0x33, 0xdf, - 0x09, 0x78, 0xf1, 0x4f, 0x3d, 0x36, 0x1e, 0x6a, 0xa4, 0xa1, 0x4f, 0x2f, - 0x51, 0xe3, 0xf3, 0x8a, 0x86, 0x4f, 0x1e, 0x95, 0xa1, 0xda, 0xc1, 0xd2, - 0x8c, 0x8d, 0x87, 0x1a, 0x29, 0x94, 0xba, 0xee, 0x1c, 0x5d, 0x21, 0xb6, - 0xa6, 0xd4, 0x6b, 0xfa, 0x36, 0xd9, 0x18, 0x3f, 0x16, 0x19, 0x87, 0xeb, - 0x9d, 0x21, 0xa8, 0x71, 0x56, 0x96, 0x7d, 0xaa, 0x36, 0x37, 0xdb, 0xa1, - 0x5f, 0x13, 0xf0, 0xc6, 0xa3, 0xf1, 0xb9, 0x46, 0x9a, 0xfc, 0x62, 0x4c, - 0x61, 0xfc, 0x62, 0x05, 0xcc, 0x17, 0x2a, 0x6d, 0x86, 0xf1, 0x9a, 0xce, - 0xa4, 0xf3, 0x1e, 0x9f, 0x90, 0xd9, 0x30, 0xad, 0x8e, 0x11, 0x06, 0xe3, - 0x83, 0xe0, 0xc5, 0x09, 0x31, 0x03, 0xb6, 0x86, 0x42, 0x89, 0x99, 0x4b, - 0x71, 0x53, 0x64, 0x14, 0x86, 0x05, 0x4a, 0xab, 0xda, 0x22, 0x14, 0xed, - 0xab, 0x32, 0xb7, 0x9e, 0xb9, 0x4a, 0x7b, 0x1e, 0xd4, 0x72, 0x83, 0xf1, - 0x41, 0x5b, 0x3b, 0x53, 0x33, 0x29, 0x43, 0xfe, 0x72, 0xb9, 0x21, 0xab, - 0x5d, 0x6a, 0x7e, 0x9d, 0x3d, 0xaa, 0xbd, 0x6a, 0xb9, 0x6c, 0xc6, 0xc5, - 0x93, 0x43, 0x5d, 0x7f, 0xd5, 0xfe, 0x30, 0xff, 0xaf, 0xb3, 0x4b, 0x1d, - 0x2f, 0x35, 0x96, 0x6b, 0x2e, 0xe7, 0x64, 0x9f, 0xed, 0x93, 0x47, 0x46, - 0x7b, 0x91, 0x53, 0xbd, 0x0a, 0xbb, 0x66, 0x8c, 0xe3, 0x4c, 0x9e, 0xf6, - 0xbd, 0x5e, 0x2e, 0xef, 0xda, 0xaa, 0x34, 0x65, 0x97, 0x37, 0x40, 0x09, - 0x77, 0xed, 0xfb, 0xe3, 0xfb, 0x7f, 0x73, 0x4b, 0x0d, 0x1f, 0x1e, 0x92, - 0xa7, 0x28, 0x81, 0xc3, 0x6e, 0x2e, 0xd7, 0x69, 0x0b, 0xd8, 0x80, 0x4b, - 0x3b, 0x6c, 0x3a, 0xa6, 0x9e, 0xb4, 0xe8, 0xbf, 0x09, 0xc8, 0x28, 0x1f, - 0xa6, 0xac, 0x9d, 0x0a, 0xfe, 0x61, 0xa0, 0x38, 0xd3, 0x5e, 0x14, 0xdb, - 0xcd, 0x55, 0x69, 0x12, 0xb5, 0xc7, 0xae, 0x63, 0x0d, 0x1c, 0xe6, 0x96, - 0x92, 0x95, 0x33, 0x74, 0xb1, 0x34, 0x21, 0xb2, 0xab, 0xca, 0x4e, 0x21, - 0x66, 0x3e, 0xdd, 0xf5, 0xec, 0xea, 0x46, 0x55, 0x27, 0x4a, 0x91, 0x33, - 0xf1, 0xd4, 0xf6, 0x62, 0x99, 0x3c, 0x62, 0x28, 0x9d, 0x92, 0xae, 0x42, - 0x7b, 0x43, 0xb7, 0x97, 0x11, 0x41, 0x69, 0xd3, 0x12, 0x80, 0xfc, 0xba, - 0xb1, 0x3f, 0xa9, 0x7b, 0x05, 0xc8, 0x63, 0xca, 0x75, 0x05, 0x67, 0x11, - 0x83, 0xf7, 0x33, 0x7f, 0xf9, 0xf5, 0x0d, 0xc4, 0x60, 0xac, 0x2f, 0x64, - 0xaa, 0x4f, 0x8c, 0x69, 0x13, 0x8f, 0xc4, 0x5f, 0xb5, 0x54, 0x29, 0xd3, - 0x7a, 0x2d, 0x27, 0x82, 0x85, 0xa2, 0xf5, 0xce, 0x63, 0x76, 0x58, 0xde, - 0x1d, 0xaa, 0x22, 0x07, 0x42, 0x79, 0x6f, 0x88, 0x34, 0x0c, 0xa3, 0x96, - 0xde, 0x02, 0xb3, 0xbf, 0xd9, 0x55, 0x54, 0xd4, 0xdf, 0xa1, 0xdb, 0xd6, - 0x7a, 0xfd, 0x05, 0xb1, 0xfe, 0xd2, 0x72, 0xe9, 0x0e, 0xe7, 0xa2, 0x7f, - 0x21, 0x9b, 0xdd, 0x80, 0xfa, 0xf1, 0x73, 0x66, 0xda, 0x47, 0xc4, 0xb0, - 0xe6, 0x54, 0x09, 0xd3, 0x7a, 0x2d, 0x27, 0x74, 0x6b, 0x32, 0xd5, 0x67, - 0x3e, 0x8c, 0x19, 0x1a, 0xcf, 0x72, 0xed, 0x96, 0xc7, 0x00, 0x1e, 0x53, - 0x8a, 0x30, 0x1e, 0xb7, 0x1f, 0x9c, 0xf1, 0x8a, 0xa1, 0xb2, 0xfe, 0xc6, - 0x38, 0xf5, 0xea, 0x1d, 0xa8, 0xb8, 0x07, 0xc8, 0x63, 0xfc, 0xf1, 0x16, - 0x3a, 0xf3, 0x07, 0xa0, 0xe1, 0x72, 0x8a, 0x3b, 0x6e, 0xe6, 0xf2, 0x8e, - 0x4c, 0xfb, 0x30, 0x52, 0x7e, 0x5d, 0xd1, 0xb0, 0xa9, 0x25, 0x07, 0xc7, - 0xdd, 0x87, 0x4c, 0xeb, 0xc4, 0xa0, 0x4e, 0xfb, 0x91, 0xa5, 0x62, 0x69, - 0xaf, 0x86, 0xdb, 0xf6, 0xc1, 0xef, 0x47, 0x76, 0x95, 0xcd, 0xb4, 0xb1, - 0x8c, 0x87, 0x76, 0x74, 0x18, 0xcb, 0xb8, 0x60, 0x70, 0xf0, 0x77, 0x09, - 0xda, 0xee, 0x19, 0xb1, 0x29, 0xd7, 0x90, 0x60, 0x97, 0x23, 0x3b, 0x0f, - 0x0f, 0x54, 0xdf, 0x5f, 0xcb, 0x0e, 0xa9, 0x3b, 0x53, 0x36, 0x08, 0x60, - 0x83, 0xb1, 0xb8, 0x0b, 0x81, 0x6d, 0x97, 0x93, 0x36, 0xfd, 0x3e, 0x99, - 0x56, 0xe4, 0xbd, 0x10, 0xfe, 0xb8, 0x7b, 0xad, 0x1b, 0xcb, 0xe4, 0x5d, - 0x33, 0x2d, 0xd7, 0x51, 0xdc, 0x4c, 0x14, 0x37, 0xf5, 0xc2, 0xfe, 0x4d, - 0x43, 0x0d, 0x89, 0xb2, 0xe6, 0xee, 0xbf, 0x99, 0x07, 0x6f, 0xed, 0x41, - 0x17, 0xec, 0xdf, 0x44, 0xc4, 0x8f, 0xd3, 0x16, 0xc0, 0x8d, 0x12, 0x84, - 0xae, 0x03, 0x54, 0x54, 0xa4, 0x03, 0x2d, 0x03, 0x74, 0xd5, 0x83, 0xd3, - 0x6e, 0x30, 0xda, 0x2d, 0x89, 0x7d, 0x2d, 0x6d, 0x01, 0xb4, 0x6e, 0xcd, - 0x17, 0x1a, 0xc7, 0xbe, 0x65, 0x5a, 0x37, 0x71, 0x6f, 0xdb, 0x27, 0x7b, - 0x2c, 0x07, 0xe2, 0xf4, 0x03, 0x5c, 0xa6, 0xad, 0xec, 0x3d, 0x12, 0xb1, - 0x0c, 0x3b, 0x8e, 0x0e, 0x07, 0xad, 0xcc, 0x63, 0x68, 0x11, 0xf4, 0x17, - 0x9c, 0xeb, 0xb7, 0xcc, 0x60, 0x15, 0x83, 0xa6, 0x07, 0x07, 0xfd, 0xe9, - 0x3c, 0xe8, 0x32, 0x7f, 0xe6, 0xb9, 0x76, 0x5a, 0xde, 0x8c, 0x34, 0x69, - 0xe8, 0xd0, 0x75, 0xeb, 0xd9, 0x32, 0xb3, 0xa3, 0xec, 0x2f, 0xa6, 0xe5, - 0x6b, 0x5a, 0x16, 0x46, 0xa6, 0xc4, 0xce, 0xa6, 0x79, 0x61, 0xda, 0x47, - 0xa1, 0x69, 0x79, 0x98, 0x5d, 0xdd, 0x70, 0x7d, 0xd6, 0x50, 0x4a, 0x8a, - 0x69, 0x7e, 0xdb, 0xd5, 0xae, 0xe6, 0x60, 0x89, 0x59, 0xdb, 0x19, 0xe2, - 0xa4, 0x4d, 0x99, 0x4e, 0x5b, 0xe4, 0xd7, 0x67, 0x69, 0xdf, 0xe5, 0xaa, - 0x78, 0x3f, 0x69, 0x5a, 0xa9, 0x08, 0xa4, 0xf4, 0x67, 0xcc, 0xa0, 0x38, - 0xba, 0x7e, 0xff, 0x72, 0x68, 0x5c, 0xe0, 0x44, 0x05, 0xf8, 0xfd, 0xd8, - 0x17, 0x9a, 0x96, 0x81, 0x6e, 0x4e, 0x75, 0x37, 0x6c, 0x40, 0x38, 0x8e, - 0xce, 0x65, 0xa6, 0xb2, 0xc3, 0xf2, 0x35, 0xef, 0x43, 0x61, 0x5a, 0x93, - 0xa6, 0x36, 0xe7, 0xf3, 0x5f, 0x74, 0x76, 0xbc, 0xfd, 0xa4, 0x69, 0x79, - 0xcc, 0x51, 0xdc, 0x33, 0x6a, 0x76, 0xa7, 0x55, 0x76, 0xff, 0xcd, 0xc7, - 0x40, 0xd3, 0x0a, 0x96, 0x67, 0x61, 0xc3, 0x65, 0xf1, 0x0d, 0xfe, 0x04, - 0x22, 0x0a, 0x8d, 0x5b, 0x67, 0x14, 0x00, 0x90, 0xc8, 0x99, 0x31, 0x81, - 0xd3, 0xb8, 0x4c, 0xa7, 0x75, 0x60, 0x5a, 0x91, 0x78, 0xdd, 0x7e, 0x64, - 0x5a, 0xbd, 0xa6, 0x15, 0x3a, 0x45, 0x0c, 0x6b, 0x7d, 0xd8, 0xd2, 0x39, - 0x3a, 0x00, 0x56, 0xbc, 0xd4, 0xc0, 0x68, 0xfb, 0x4c, 0xd3, 0xaa, 0x76, - 0xbb, 0x3d, 0x73, 0x28, 0xfa, 0x4a, 0xac, 0xca, 0x4f, 0x2e, 0x3c, 0x33, - 0x47, 0x78, 0xaf, 0x8d, 0xdc, 0x26, 0xaf, 0xbb, 0xbc, 0xb2, 0xbf, 0xbb, - 0x4f, 0x6d, 0x3f, 0xff, 0xa9, 0xed, 0xc9, 0x85, 0x13, 0x17, 0x00, 0x5e, - 0xf9, 0xc2, 0x1f, 0x77, 0xe8, 0x70, 0xe9, 0x54, 0xa7, 0x9b, 0x93, 0x0f, - 0x2a, 0xfa, 0xce, 0x4f, 0x40, 0x5f, 0x5f, 0xec, 0xe5, 0x25, 0x3a, 0xfb, - 0xca, 0x2f, 0xb5, 0xfa, 0xda, 0xaf, 0x66, 0x71, 0xeb, 0x7f, 0x6d, 0x44, - 0x0f, 0x26, 0x49, 0xfe, 0x45, 0x98, 0xba, 0xbb, 0xc5, 0xce, 0xb4, 0x1d, - 0xfc, 0x64, 0x92, 0x36, 0x1f, 0x88, 0x8f, 0xc3, 0xc8, 0x19, 0xe3, 0x09, - 0x03, 0xd6, 0xf7, 0x27, 0x7c, 0xa6, 0x8e, 0x83, 0x77, 0x01, 0xc4, 0x19, - 0xf5, 0x62, 0x20, 0xcc, 0xdd, 0xf7, 0xba, 0xb3, 0x07, 0x3c, 0xfd, 0x14, - 0x91, 0x57, 0x7f, 0xf2, 0x1f, 0x98, 0xa4, 0xfb, 0x1f, 0xf2, 0xeb, 0x37, - 0x9c, 0xc6, 0x6d, 0x60, 0xad, 0xe6, 0x05, 0x99, 0xef, 0x51, 0x31, 0xad, - 0xd0, 0xee, 0x2e, 0x22, 0x7b, 0xa6, 0x15, 0x98, 0xc9, 0xd5, 0xd2, 0xb4, - 0xa2, 0xf6, 0x7a, 0x61, 0x26, 0x7d, 0xf9, 0x3c, 0xe7, 0x2c, 0x9e, 0xab, - 0xf6, 0x19, 0xd8, 0x90, 0x60, 0xdb, 0xc3, 0xd5, 0xb0, 0xab, 0x80, 0x9d, - 0x1f, 0x49, 0xc3, 0xca, 0x77, 0x1f, 0xcb, 0x28, 0xe1, 0x2c, 0x5e, 0xfd, - 0x74, 0x61, 0x42, 0xd9, 0xfa, 0xbc, 0xc5, 0xb6, 0x5f, 0xfb, 0x63, 0x74, - 0xb1, 0x20, 0xa4, 0x3d, 0x9c, 0xa2, 0x0c, 0xc2, 0x4e, 0xeb, 0xb2, 0x1d, - 0x37, 0x5a, 0xca, 0xa9, 0x9e, 0x08, 0x1c, 0xf6, 0x0e, 0xd8, 0x4d, 0x08, - 0x17, 0x9a, 0x56, 0x1e, 0x73, 0xff, 0x02, 0x0d, 0x91, 0x37, 0xaa, 0xb3, - 0xb4, 0x39, 0x2f, 0xde, 0xee, 0x55, 0x22, 0x44, 0xa6, 0xd8, 0x6f, 0x04, - 0x62, 0x46, 0x3b, 0xa0, 0xc4, 0x55, 0xed, 0xa2, 0x02, 0xbc, 0xb8, 0xf4, - 0xd0, 0xed, 0x65, 0x6e, 0x94, 0xc1, 0x1f, 0x07, 0x86, 0x6e, 0x2f, 0x5b, - 0xca, 0x91, 0x71, 0xc0, 0x3d, 0xbc, 0x09, 0xa6, 0xe8, 0xc1, 0x63, 0x97, - 0xd9, 0xcc, 0x60, 0x87, 0xb2, 0x0b, 0x07, 0xf3, 0x72, 0xc7, 0xb0, 0x9b, - 0xf1, 0x29, 0xdd, 0xc9, 0x82, 0xaa, 0x6b, 0x5a, 0xa6, 0xc3, 0x38, 0x8f, - 0x8f, 0x1b, 0xa6, 0x96, 0xd5, 0x38, 0xba, 0xc3, 0xea, 0x5c, 0xdd, 0x1d, - 0xc7, 0x63, 0x40, 0xa6, 0xe6, 0xb4, 0xc9, 0x2f, 0x7a, 0x67, 0xc3, 0x16, - 0x20, 0xd9, 0xdc, 0x79, 0x55, 0xfb, 0x8d, 0x9a, 0x96, 0xbc, 0xbf, 0x61, - 0x46, 0xd5, 0x38, 0x6e, 0x92, 0xdb, 0xf7, 0x21, 0xf8, 0xeb, 0xc3, 0xb4, - 0xd4, 0x23, 0xae, 0x45, 0xed, 0x34, 0xad, 0x57, 0x54, 0x35, 0xa4, 0x93, - 0xa6, 0xd5, 0xbf, 0x3f, 0x42, 0x58, 0xd3, 0x32, 0x70, 0x6c, 0x71, 0x19, - 0xef, 0xde, 0xe0, 0x9f, 0x62, 0x36, 0x68, 0x5a, 0xdd, 0xf7, 0xd7, 0xf8, - 0xe7, 0x69, 0xfa, 0xcf, 0x76, 0x07, 0xb7, 0x9c, 0xfc, 0xcc, 0x1c, 0x1d, - 0x7c, 0xaf, 0x8d, 0xa4, 0xaf, 0x96, 0x88, 0x5e, 0x6e, 0x26, 0xfa, 0x6a, - 0x89, 0xd2, 0xff, 0x6d, 0xa6, 0xcd, 0xed, 0x34, 0x2d, 0xd8, 0xac, 0x31, - 0xe4, 0x67, 0xd2, 0x94, 0x7e, 0xaf, 0x5d, 0xd3, 0x9a, 0x3b, 0x7b, 0xc0, - 0xb9, 0xa7, 0x88, 0x58, 0x9a, 0x57, 0x54, 0x9b, 0x9a, 0x71, 0x0e, 0xc0, - 0x15, 0x81, 0xfa, 0x1c, 0x57, 0xb3, 0x22, 0x78, 0x26, 0x9d, 0x77, 0x45, - 0xb4, 0x42, 0x51, 0x09, 0x1d, 0xba, 0x7a, 0x72, 0x44, 0xa5, 0xf0, 0x50, - 0x95, 0x98, 0xd6, 0xbc, 0x0a, 0x37, 0xc7, 0x61, 0x59, 0xcc, 0xa3, 0x5e, - 0xef, 0xbf, 0xe9, 0xce, 0x6e, 0x96, 0x46, 0x64, 0x31, 0x90, 0x34, 0x3c, - 0x6b, 0x5b, 0xef, 0xe8, 0x22, 0x60, 0xde, 0x8d, 0xe6, 0x15, 0x01, 0xfe, - 0x5e, 0x03, 0x3e, 0x33, 0x0a, 0xc4, 0x9d, 0x79, 0x68, 0x73, 0xc7, 0x50, - 0xed, 0x61, 0x16, 0x8c, 0xc0, 0xa5, 0xe6, 0xbc, 0xa8, 0x9c, 0x40, 0x10, - 0x49, 0x6e, 0xdf, 0x9e, 0x28, 0xfa, 0xc4, 0xc8, 0x8c, 0xe6, 0x7d, 0xaf, - 0x5e, 0x91, 0x37, 0xb0, 0x4e, 0xd7, 0xab, 0xfa, 0x1b, 0x12, 0x66, 0xbb, - 0x5c, 0x94, 0x1b, 0x5d, 0x5c, 0x36, 0xec, 0x4f, 0xe5, 0x69, 0x5f, 0x69, - 0x78, 0x16, 0xf2, 0x98, 0xf2, 0xa0, 0x43, 0xdb, 0x8f, 0x6b, 0xe3, 0x78, - 0xa3, 0x8b, 0xca, 0x3e, 0x5a, 0xff, 0x45, 0xa5, 0xbc, 0x7c, 0x35, 0x8b, - 0x10, 0xaa, 0xb4, 0x8f, 0x17, 0x8a, 0x96, 0x95, 0xc7, 0xca, 0xbf, 0xf1, - 0xd1, 0x70, 0x39, 0xa5, 0xfd, 0x36, 0x07, 0x57, 0xdb, 0xd8, 0x69, 0x0c, - 0x26, 0x6e, 0x28, 0xef, 0xee, 0xb2, 0x4b, 0x6e, 0xdf, 0x7f, 0xe0, 0x55, - 0x13, 0xd6, 0xf0, 0x87, 0x8d, 0xb6, 0x4c, 0xe5, 0xe5, 0xb7, 0x16, 0x78, - 0x87, 0x1d, 0xa5, 0x31, 0x77, 0xcf, 0xe4, 0x85, 0x1e, 0x6d, 0xd6, 0xf0, - 0x89, 0x44, 0xe7, 0x8c, 0xa8, 0x9e, 0x36, 0x14, 0x45, 0xaf, 0x92, 0xa0, - 0x86, 0x4f, 0x06, 0x8a, 0x65, 0x44, 0x59, 0xbb, 0x78, 0x89, 0xaf, 0x8a, - 0xa2, 0x3f, 0xae, 0x68, 0xb0, 0xfd, 0x30, 0x30, 0x35, 0xdc, 0xbf, 0x28, - 0x5e, 0xa0, 0x24, 0xe6, 0x1f, 0x16, 0xc3, 0xca, 0x00, 0xf7, 0x09, 0x48, - 0x0d, 0x6b, 0xa8, 0x47, 0xd7, 0x05, 0xb2, 0xab, 0x1b, 0xb6, 0x67, 0x82, - 0xdc, 0x62, 0x45, 0xe1, 0x91, 0x1a, 0x3e, 0x91, 0xe8, 0xbd, 0x02, 0x28, - 0x71, 0x48, 0x2f, 0x7b, 0x16, 0xd4, 0xb3, 0x3f, 0x35, 0x66, 0xad, 0xa1, - 0x17, 0xac, 0x4e, 0x45, 0x00, 0x46, 0x17, 0x95, 0xb8, 0x5e, 0x68, 0x3c, - 0x6b, 0x39, 0x07, 0x1f, 0x42, 0x79, 0x93, 0x44, 0xed, 0x37, 0x70, 0x6b, - 0x58, 0x29, 0xfe, 0x1f, 0xab, 0x8c, 0x94, 0x1d, 0x35, 0x90, 0xb5, 0xea, + 0xd7, 0x1d, 0xfe, 0x69, 0xa4, 0xe0, 0x0e, 0x33, 0x94, 0xb2, 0x87, 0x24, + 0x94, 0x61, 0x97, 0xb5, 0x60, 0x0f, 0xca, 0xae, 0xe7, 0x3e, 0xc8, 0x5d, + 0x4b, 0xae, 0xe9, 0x4b, 0x65, 0xa7, 0xa4, 0x52, 0x5b, 0x68, 0xbc, 0xf5, + 0x41, 0x8a, 0x33, 0x62, 0x6f, 0x7b, 0xa8, 0xdd, 0xbe, 0xe4, 0xcf, 0x48, + 0xd5, 0x30, 0x52, 0x47, 0x85, 0x0c, 0xab, 0xc3, 0x9d, 0x95, 0x12, 0x66, + 0xb7, 0x60, 0xec, 0x3c, 0x24, 0xb2, 0x07, 0x66, 0x56, 0x86, 0x8b, 0x5c, + 0x48, 0x66, 0x79, 0x78, 0xc8, 0x81, 0x14, 0xec, 0xe1, 0x0d, 0xb9, 0x98, + 0xa2, 0x18, 0x63, 0x14, 0x23, 0x02, 0xdf, 0x1e, 0xae, 0xee, 0xd5, 0xfd, + 0x73, 0xce, 0xbd, 0xe7, 0x5e, 0x29, 0xa9, 0xd3, 0xe8, 0xbc, 0x7c, 0x96, + 0xef, 0x3d, 0xe7, 0xfc, 0xce, 0xd1, 0xef, 0x7c, 0xe7, 0x3b, 0xbf, 0x7b, + 0xce, 0x15, 0x81, 0x88, 0x46, 0x89, 0xa8, 0x66, 0x08, 0x00, 0xeb, 0x00, + 0x00, 0x64, 0xca, 0x88, 0x12, 0x50, 0xf3, 0x7a, 0xea, 0xf8, 0xd8, 0x62, + 0xd5, 0x0e, 0x9a, 0xba, 0x93, 0x07, 0x00, 0x48, 0x23, 0x73, 0xa0, 0xf3, + 0x00, 0x9d, 0x9b, 0xe4, 0xa2, 0x3c, 0x0e, 0x0c, 0xcc, 0xe6, 0x00, 0x00, + 0xdf, 0x75, 0xc3, 0xeb, 0xf8, 0xe8, 0xa2, 0xa7, 0x8c, 0xb9, 0x4d, 0x85, + 0x40, 0xfd, 0xf1, 0x14, 0x68, 0x1d, 0xa0, 0xf3, 0x93, 0xae, 0xd1, 0xbf, + 0x09, 0x44, 0xae, 0xa1, 0xee, 0xc0, 0x75, 0x74, 0x8d, 0xee, 0x32, 0x00, + 0x90, 0xaf, 0x38, 0x33, 0xaa, 0x5b, 0x94, 0xc7, 0x81, 0xfc, 0x76, 0xb1, + 0x2e, 0x21, 0xea, 0x28, 0x84, 0x42, 0x37, 0xa2, 0xa4, 0x30, 0xa2, 0x17, + 0x46, 0x75, 0x83, 0xb1, 0xf9, 0x5c, 0xdd, 0x71, 0xeb, 0xe8, 0x88, 0x8e, + 0x37, 0xe4, 0x36, 0x8b, 0x90, 0x92, 0xb5, 0x65, 0x56, 0x3b, 0x94, 0x46, + 0xe6, 0xea, 0x92, 0xa1, 0x8e, 0xb6, 0x68, 0x7b, 0x03, 0x36, 0x01, 0xff, + 0xe6, 0x83, 0x67, 0x58, 0x33, 0xfa, 0xe3, 0xa9, 0xba, 0xe3, 0xd6, 0x91, + 0x8b, 0xdc, 0x0b, 0xb9, 0xcd, 0x22, 0xfc, 0x71, 0x0f, 0x8c, 0x99, 0x48, + 0x81, 0x92, 0x00, 0x8d, 0xcc, 0x81, 0x92, 0x40, 0xf0, 0xea, 0x22, 0x00, + 0x60, 0x72, 0x45, 0x89, 0x32, 0x88, 0x96, 0xe3, 0xbf, 0x30, 0x59, 0xbd, + 0xe3, 0x02, 0x18, 0x1e, 0x19, 0x45, 0xe4, 0x64, 0x1f, 0x22, 0xbd, 0x7d, + 0x65, 0x8c, 0x20, 0x72, 0xb2, 0x0f, 0x43, 0xf1, 0x21, 0x00, 0x40, 0x3e, + 0x9f, 0x7f, 0x74, 0x24, 0x09, 0x80, 0xd4, 0xb5, 0xda, 0x0e, 0xe8, 0xe2, + 0x76, 0x11, 0x43, 0x71, 0x20, 0xd2, 0xdb, 0x87, 0xc0, 0x61, 0x19, 0x91, + 0xde, 0x88, 0xf7, 0xf2, 0x1f, 0x80, 0x7d, 0x2c, 0xac, 0x0d, 0xc3, 0x5e, + 0x50, 0x0c, 0xc5, 0x36, 0x6c, 0x53, 0x66, 0x15, 0x0f, 0x85, 0x71, 0x51, + 0x04, 0xb0, 0x0a, 0xb4, 0xb4, 0x4b, 0x28, 0xb4, 0x17, 0xd1, 0xd2, 0x2e, + 0x41, 0x6a, 0x0f, 0x70, 0x3f, 0x9f, 0x3a, 0x17, 0x7b, 0x24, 0x98, 0xfd, + 0xd4, 0xb9, 0x98, 0x66, 0x7f, 0xcd, 0xec, 0x5d, 0x80, 0xa5, 0x3f, 0x06, + 0xde, 0x1b, 0xf0, 0x34, 0x90, 0x1f, 0x88, 0x7d, 0x0c, 0xb4, 0x8e, 0xbc, + 0x12, 0x5c, 0x33, 0xac, 0x48, 0x8a, 0xcc, 0x2c, 0x7a, 0xd2, 0xb8, 0x5e, + 0x18, 0x37, 0x72, 0xb2, 0xcf, 0xf0, 0x45, 0x04, 0xbb, 0x43, 0x18, 0x1e, + 0x19, 0x05, 0x00, 0x8c, 0x8d, 0x4f, 0x02, 0x71, 0x40, 0xee, 0x0e, 0x6a, + 0xd7, 0xa5, 0xf6, 0x00, 0x16, 0xb3, 0x8b, 0x7b, 0x9f, 0x71, 0x55, 0xfb, + 0x6b, 0xe5, 0x10, 0x30, 0x3a, 0xac, 0xd4, 0x1e, 0x40, 0xa4, 0xb7, 0xaf, + 0x2a, 0xa6, 0xad, 0xa9, 0x7d, 0x1c, 0xb4, 0xfc, 0x43, 0x86, 0x4b, 0x0d, + 0xea, 0xc0, 0xae, 0x00, 0x10, 0x98, 0xc8, 0x54, 0xa5, 0x71, 0xe5, 0x2b, + 0x19, 0x71, 0x87, 0x82, 0x91, 0x61, 0xb1, 0xcc, 0xef, 0x40, 0xdc, 0x51, + 0xec, 0x4b, 0xcd, 0xa4, 0x6c, 0xcb, 0x57, 0xef, 0xab, 0xd6, 0x41, 0xaa, + 0xba, 0x6e, 0x67, 0x5f, 0xde, 0x83, 0x7d, 0x00, 0x02, 0x87, 0x65, 0xcb, + 0x0c, 0x84, 0x82, 0x43, 0x7f, 0x3d, 0x04, 0xfb, 0x9c, 0xee, 0xf7, 0x8d, + 0x12, 0x51, 0x94, 0x88, 0x92, 0x44, 0x14, 0x05, 0xe0, 0xfb, 0x60, 0x8a, + 0x68, 0x5f, 0x98, 0xe8, 0xbe, 0x18, 0x46, 0xa4, 0x2c, 0x25, 0x5f, 0x6d, + 0x23, 0x5e, 0x8a, 0xfe, 0x2d, 0x4b, 0x97, 0x97, 0xda, 0x84, 0xcb, 0xe3, + 0xe1, 0xd8, 0x91, 0x0d, 0xea, 0x79, 0xfe, 0x90, 0x2f, 0xa9, 0xb7, 0x97, + 0x81, 0xd9, 0xec, 0x22, 0x8e, 0x9f, 0xf8, 0x2d, 0xed, 0xd2, 0x2e, 0x35, + 0x50, 0x03, 0x05, 0xe4, 0x0e, 0x4a, 0x0c, 0xc5, 0x1d, 0xf3, 0x19, 0x10, + 0x40, 0xf8, 0x58, 0x0f, 0xad, 0x7d, 0xbd, 0xa6, 0x95, 0xa3, 0xc7, 0xa0, + 0x1c, 0xa4, 0xfe, 0xde, 0x28, 0x35, 0x3f, 0xf7, 0x8c, 0xaf, 0xe3, 0xb0, + 0x8c, 0xdd, 0x9d, 0x5d, 0x6a, 0x68, 0x6c, 0xa0, 0x85, 0x1b, 0x69, 0x4a, + 0xfa, 0x7c, 0x3e, 0x7d, 0x79, 0xe9, 0xf9, 0x0c, 0x4e, 0x9f, 0x3d, 0x4d, + 0x5b, 0x3b, 0x5b, 0x24, 0xb5, 0xb4, 0x50, 0xe7, 0x5f, 0x3f, 0xf7, 0xa9, + 0x76, 0xb6, 0x7d, 0xd1, 0x46, 0x1d, 0xb7, 0x3a, 0x69, 0x77, 0x67, 0xd7, + 0x50, 0xbe, 0xd4, 0xd2, 0x42, 0xd2, 0xcf, 0x25, 0x1a, 0x7c, 0x77, 0xd0, + 0x58, 0x5e, 0x1c, 0x68, 0xfd, 0xa2, 0x8d, 0x1a, 0xa8, 0x81, 0x2e, 0x7e, + 0x7c, 0x91, 0x3a, 0x5f, 0x7e, 0xd1, 0x97, 0x18, 0x19, 0x45, 0xf2, 0x2f, + 0x49, 0x2d, 0xbf, 0xff, 0xc0, 0x7e, 0xda, 0xfa, 0xe6, 0x2e, 0xed, 0xd2, + 0x2e, 0xad, 0xdc, 0xca, 0x5a, 0xec, 0x51, 0x51, 0xb5, 0x9b, 0xd5, 0x3e, + 0x2d, 0x1f, 0x80, 0xce, 0x23, 0x5d, 0x5a, 0x79, 0xfa, 0xfb, 0x1a, 0x1a, + 0x1b, 0x68, 0x41, 0x4e, 0xd3, 0x46, 0xef, 0x06, 0x1d, 0x3c, 0x54, 0xfe, + 0x5e, 0x04, 0xec, 0x6b, 0x68, 0x6c, 0xd0, 0xda, 0xab, 0xaf, 0x27, 0xf1, + 0x69, 0x92, 0x66, 0xae, 0xcf, 0xd0, 0xda, 0x37, 0x6b, 0x86, 0x7a, 0xfc, + 0x07, 0xf6, 0x53, 0xfa, 0xf5, 0x69, 0xba, 0xf7, 0xe6, 0x3d, 0x7a, 0xf2, + 0x47, 0x3f, 0xf4, 0x25, 0xc9, 0x34, 0xf2, 0xbc, 0x3c, 0xe1, 0xb2, 0x4b, + 0x6e, 0x35, 0xac, 0xd3, 0x13, 0x34, 0xa1, 0x3d, 0x0c, 0xb0, 0x6a, 0xb4, + 0x60, 0x77, 0x08, 0x28, 0x00, 0x99, 0xf9, 0x8c, 0xd0, 0x88, 0x57, 0xf3, + 0x07, 0x0e, 0xcb, 0x4a, 0x43, 0xca, 0x4c, 0x3b, 0xf0, 0xde, 0x80, 0xc6, + 0x48, 0x81, 0x57, 0x64, 0xa0, 0x08, 0xe0, 0x95, 0x4a, 0x7d, 0xc1, 0xee, + 0xa0, 0xd5, 0xbe, 0xa3, 0xd6, 0xeb, 0x43, 0xf1, 0x61, 0xab, 0x7d, 0x0b, + 0x40, 0xe4, 0x64, 0x9f, 0xa1, 0x3c, 0xb3, 0x36, 0x34, 0x30, 0x62, 0xa9, + 0xfc, 0x7f, 0x86, 0x26, 0x55, 0x3f, 0x9f, 0x3a, 0x17, 0xe3, 0xf7, 0x17, + 0xd8, 0x9a, 0x1f, 0xcb, 0x50, 0xda, 0xa5, 0xab, 0x2f, 0xd8, 0x1d, 0x02, + 0x00, 0x45, 0x42, 0x95, 0xfb, 0x41, 0xbb, 0xff, 0x68, 0x95, 0xf6, 0x99, + 0x18, 0x1f, 0x47, 0xa1, 0xfc, 0xbf, 0x00, 0x84, 0xde, 0x3e, 0x66, 0xec, + 0xef, 0x32, 0xd3, 0x6b, 0x4c, 0x1b, 0xbd, 0xb6, 0x88, 0xcb, 0xff, 0xf6, + 0xc0, 0x88, 0x3f, 0x4e, 0x13, 0x4e, 0x74, 0x32, 0x59, 0xb6, 0x9f, 0x88, + 0x3e, 0x71, 0xc9, 0xdc, 0x76, 0x18, 0x3b, 0x1b, 0xa6, 0x83, 0x1c, 0xe6, + 0x30, 0x33, 0x65, 0xeb, 0x0b, 0x6d, 0x16, 0x06, 0x31, 0x33, 0x45, 0x4b, + 0x4b, 0x0b, 0x75, 0xfe, 0xb2, 0x93, 0x7a, 0x8e, 0x85, 0x8d, 0x8c, 0x04, + 0x20, 0xbb, 0x94, 0xa5, 0xb6, 0xb6, 0x5f, 0x58, 0x18, 0xba, 0xb5, 0x5d, + 0x82, 0x9e, 0x91, 0x12, 0x9f, 0x26, 0x49, 0xcf, 0x24, 0xd3, 0xd7, 0xa6, + 0x2a, 0xcc, 0x63, 0xb2, 0x63, 0xe5, 0x56, 0x96, 0xa6, 0xaf, 0x4f, 0xd3, + 0x99, 0x0f, 0xce, 0xd3, 0x2e, 0xed, 0x92, 0xbf, 0xd1, 0x4f, 0xfd, 0xbd, + 0xfd, 0xd4, 0xd3, 0xf3, 0x86, 0xcf, 0xce, 0x7e, 0x95, 0x91, 0x12, 0xed, + 0x01, 0xa8, 0xf5, 0x44, 0x7b, 0xa3, 0xd4, 0xff, 0x9b, 0xe3, 0xbe, 0x68, + 0x6f, 0x1f, 0x96, 0x96, 0x96, 0x2c, 0x4c, 0x7d, 0xec, 0xcd, 0x63, 0xd4, + 0xf5, 0x5a, 0xb7, 0x6f, 0x7c, 0x7c, 0x12, 0x3d, 0xff, 0x0a, 0x53, 0x74, + 0x2b, 0x4a, 0xb4, 0xaf, 0x81, 0xda, 0x7e, 0xde, 0x46, 0xfd, 0x27, 0xa2, + 0x1a, 0xc3, 0xe9, 0xeb, 0x09, 0x1d, 0x09, 0x51, 0xf3, 0x1f, 0xce, 0x38, + 0xf7, 0x43, 0xad, 0xec, 0x3b, 0xd2, 0x45, 0xd1, 0x13, 0xfd, 0xa4, 0x5e, + 0x0f, 0xca, 0x41, 0x6a, 0x19, 0x3a, 0x6f, 0xf8, 0x7e, 0x4f, 0x9f, 0x8b, + 0x61, 0xe6, 0xfa, 0x0c, 0xed, 0xd2, 0x2e, 0x05, 0x5e, 0x08, 0x50, 0xc7, + 0x9f, 0x3f, 0xf1, 0x29, 0x1a, 0xa2, 0x54, 0x5d, 0x3c, 0x56, 0xdd, 0x8b, + 0x60, 0x49, 0x9b, 0xb5, 0x63, 0x5a, 0xd7, 0xd1, 0x04, 0x00, 0x43, 0xf1, + 0x61, 0x60, 0x56, 0x2c, 0x8a, 0xa0, 0x31, 0x03, 0xa3, 0x3c, 0x95, 0x61, + 0x82, 0xdd, 0x21, 0x43, 0x7e, 0x64, 0xa1, 0x31, 0x85, 0x85, 0x61, 0x48, + 0x59, 0x4d, 0x5b, 0x18, 0xe9, 0x68, 0xc5, 0x9e, 0xb1, 0x89, 0x49, 0x3e, + 0x13, 0xae, 0x56, 0x18, 0x4a, 0x5d, 0xcd, 0x33, 0xed, 0x5d, 0x30, 0x69, + 0x78, 0x53, 0x3b, 0x58, 0xed, 0x55, 0xeb, 0x45, 0x16, 0xd6, 0xf6, 0xd8, + 0xf4, 0xab, 0xda, 0xde, 0x60, 0x77, 0xd0, 0x50, 0x9e, 0xba, 0x88, 0x75, + 0x6b, 0x1f, 0xee, 0x18, 0xeb, 0x0f, 0xbd, 0x7d, 0xcc, 0xc0, 0xe8, 0x98, + 0x87, 0xe5, 0xfb, 0x03, 0x00, 0x85, 0x69, 0x3d, 0x68, 0x59, 0x3d, 0x06, + 0xce, 0x86, 0x69, 0x81, 0xc9, 0xb5, 0x44, 0x17, 0xbf, 0x5a, 0xa3, 0xf7, + 0x6e, 0x34, 0xd7, 0x84, 0x69, 0x15, 0x6d, 0xbb, 0x46, 0x3d, 0xcf, 0x3f, + 0xe3, 0x4e, 0xa3, 0x12, 0xd1, 0x46, 0x3e, 0x8f, 0x83, 0x07, 0x0f, 0x52, + 0xfa, 0xcb, 0x05, 0xea, 0xfc, 0xba, 0x83, 0xc2, 0x7f, 0xb7, 0x6a, 0x56, + 0xbd, 0xc6, 0xea, 0x7f, 0x7f, 0x90, 0x96, 0x6e, 0x65, 0x69, 0x6b, 0x67, + 0x8b, 0xcb, 0xd8, 0xea, 0xfd, 0x77, 0xe3, 0xc0, 0xe5, 0xb2, 0x96, 0x53, + 0xb5, 0xed, 0xda, 0xd7, 0x6b, 0xd4, 0x73, 0x22, 0xaa, 0xe5, 0x8f, 0x9d, + 0x3d, 0x45, 0x5d, 0xaf, 0x75, 0xfb, 0xcc, 0x4c, 0xcd, 0xd3, 0x9c, 0xe9, + 0xf9, 0x0c, 0x06, 0xdf, 0x1d, 0xd4, 0x18, 0x39, 0xfa, 0x8f, 0x1b, 0x1c, + 0x26, 0x8b, 0x60, 0x69, 0xe9, 0xb6, 0x66, 0x57, 0xff, 0x3f, 0xbf, 0xb2, + 0x30, 0xd5, 0xc6, 0x37, 0x1b, 0x44, 0xf7, 0x89, 0x68, 0x1f, 0x51, 0x43, + 0xe3, 0x93, 0x94, 0xf8, 0xe8, 0x22, 0x93, 0x69, 0x2d, 0xf6, 0xb8, 0xec, + 0x07, 0xd7, 0xf6, 0x09, 0xcc, 0x88, 0x7a, 0xf4, 0x37, 0xfa, 0x69, 0xee, + 0xda, 0xb4, 0xe2, 0xf1, 0xd2, 0x48, 0xf5, 0x8c, 0x68, 0x97, 0x86, 0x16, + 0x6a, 0xc7, 0xb8, 0x05, 0x1b, 0x46, 0x74, 0x8b, 0xa9, 0x99, 0x94, 0x81, + 0x31, 0x46, 0x47, 0x46, 0xa1, 0x67, 0x38, 0x4d, 0xd3, 0x96, 0x57, 0xb3, + 0x63, 0x13, 0x93, 0x4c, 0x86, 0x41, 0x1e, 0x5c, 0x06, 0xd7, 0x34, 0x61, + 0xb9, 0x5e, 0x56, 0x7e, 0x27, 0xcd, 0xa9, 0xe6, 0x17, 0xd1, 0x8c, 0x6e, + 0xda, 0xbf, 0x98, 0x5d, 0x64, 0xb6, 0xc7, 0xcc, 0x90, 0xaa, 0xa6, 0xd5, + 0xf7, 0x03, 0x8b, 0xa1, 0xdd, 0xda, 0x67, 0xae, 0x5f, 0x34, 0x5e, 0xfe, + 0x83, 0x8d, 0xed, 0x22, 0x96, 0xbe, 0x25, 0xa2, 0xcf, 0xa6, 0x88, 0x28, + 0xec, 0x19, 0xa7, 0x6e, 0x6f, 0x70, 0xb8, 0x96, 0x68, 0x30, 0x40, 0x34, + 0xb9, 0xb3, 0xa1, 0x30, 0x66, 0x95, 0xf5, 0x3c, 0xf5, 0xc7, 0x29, 0x8a, + 0x02, 0x70, 0xd2, 0xb4, 0xd9, 0xec, 0x22, 0x9c, 0xee, 0xeb, 0x7a, 0xb5, + 0x8b, 0x5e, 0xa4, 0x17, 0xb5, 0x91, 0x7c, 0x77, 0x27, 0x4a, 0xad, 0x6f, + 0x19, 0x19, 0x33, 0xe9, 0xf3, 0xf9, 0xe8, 0x90, 0xcf, 0x97, 0xf4, 0xf9, + 0x7c, 0x3d, 0x6f, 0xbd, 0xe1, 0x0b, 0x1f, 0x78, 0x43, 0xbb, 0xbf, 0x4d, + 0x6a, 0xa3, 0x24, 0x11, 0xd1, 0x21, 0x9f, 0x2f, 0x78, 0x24, 0x48, 0x0d, + 0xd4, 0x60, 0x28, 0x4f, 0xfd, 0x3c, 0xfd, 0xfa, 0x94, 0x56, 0xef, 0xa0, + 0x34, 0xa8, 0x5d, 0xff, 0xfc, 0x8b, 0xab, 0xdc, 0x99, 0x21, 0x7c, 0xac, + 0xa7, 0x92, 0xff, 0x05, 0x25, 0xbf, 0xbe, 0xfc, 0xc4, 0x67, 0x49, 0x65, + 0x2d, 0xf2, 0x59, 0xbf, 0xa1, 0x3e, 0x37, 0x33, 0x50, 0x9b, 0xd4, 0x66, + 0xb0, 0x57, 0x6d, 0x4f, 0x14, 0x40, 0xeb, 0xef, 0x95, 0x7e, 0xe8, 0x6a, + 0xec, 0xa2, 0xe9, 0xeb, 0x53, 0xc6, 0x7e, 0x78, 0x33, 0x6c, 0x68, 0x1f, + 0x49, 0xe4, 0xc9, 0x3e, 0x73, 0xfd, 0x1f, 0x9e, 0x3d, 0xcd, 0x9d, 0x79, + 0x36, 0xf2, 0x79, 0xa8, 0x9f, 0x09, 0xa8, 0x01, 0x03, 0x26, 0xe6, 0x6c, + 0x99, 0x56, 0x4b, 0xe5, 0x98, 0x6e, 0xb5, 0xf5, 0x8d, 0x2d, 0xdb, 0x68, + 0x2f, 0x58, 0xe3, 0xb4, 0x63, 0x13, 0xe5, 0x99, 0xa0, 0xa8, 0x40, 0x66, + 0x3e, 0x63, 0x60, 0x54, 0x55, 0x73, 0x62, 0xde, 0x46, 0xe3, 0xc1, 0xb8, + 0x6a, 0x66, 0x5d, 0x67, 0x69, 0x66, 0x2d, 0xca, 0x60, 0x63, 0x9f, 0x21, + 0xfe, 0x09, 0xc6, 0xaa, 0x39, 0x5f, 0x61, 0x32, 0x47, 0xcd, 0x68, 0xc3, + 0x50, 0x2c, 0x8d, 0xca, 0x6a, 0x8f, 0x7e, 0x06, 0x0a, 0xbc, 0x22, 0x1b, + 0x19, 0xd8, 0x64, 0x9f, 0x6b, 0x4d, 0x6b, 0xb6, 0xa3, 0x50, 0xb9, 0xae, + 0xce, 0x6c, 0x9a, 0x7d, 0x45, 0x00, 0xa5, 0xca, 0x9a, 0x41, 0x8b, 0x1e, + 0x44, 0xbc, 0x46, 0x0d, 0x54, 0xf4, 0x4f, 0x13, 0xfa, 0xba, 0xb8, 0x2c, + 0xcb, 0x4b, 0xbe, 0x4f, 0xd3, 0x44, 0xdf, 0x76, 0x7a, 0xaa, 0x77, 0xe0, + 0x6c, 0x98, 0x5a, 0x38, 0x23, 0xf2, 0xde, 0x76, 0x11, 0xc7, 0xfb, 0x8f, + 0xd3, 0xd2, 0xed, 0xdb, 0xc2, 0x5a, 0x49, 0x6a, 0x69, 0xa1, 0x0f, 0xcf, + 0x7c, 0x48, 0xcd, 0xcf, 0x36, 0x93, 0x39, 0x3e, 0xeb, 0x3f, 0xb0, 0x9f, + 0x76, 0x77, 0xee, 0x31, 0x35, 0x9d, 0x45, 0x03, 0x9e, 0x03, 0x5a, 0xaf, + 0x1b, 0x35, 0x9a, 0xaa, 0xed, 0xcc, 0x33, 0x01, 0x2f, 0xfe, 0xa9, 0xc7, + 0xe6, 0x03, 0xcd, 0x34, 0xfc, 0xf1, 0x45, 0x6a, 0x7e, 0x4e, 0xd1, 0xf0, + 0xc9, 0xc3, 0x32, 0x54, 0x3b, 0x58, 0x9a, 0xb1, 0xf9, 0x40, 0x33, 0x85, + 0x52, 0x57, 0x9d, 0xa3, 0x2b, 0xc4, 0xd6, 0x94, 0x7a, 0x4d, 0xdf, 0x21, + 0x1b, 0xe3, 0xc7, 0x22, 0xfd, 0x70, 0xb5, 0x3b, 0x04, 0x35, 0xce, 0xca, + 0xb2, 0x4f, 0xd5, 0xe6, 0x66, 0x3b, 0xf4, 0x6b, 0x02, 0x5e, 0x7f, 0x34, + 0x3f, 0xdb, 0x4c, 0x53, 0x9f, 0x8f, 0x2b, 0x8c, 0x5f, 0x0d, 0xf3, 0x85, + 0xca, 0x9b, 0x61, 0xbc, 0xa6, 0x53, 0xe9, 0x9c, 0xc7, 0x27, 0x64, 0x36, + 0x4c, 0xab, 0x63, 0x84, 0xa1, 0xf8, 0x10, 0x78, 0x71, 0x42, 0xcc, 0x82, + 0xad, 0xa1, 0x50, 0x66, 0x66, 0x35, 0x6e, 0xba, 0xa0, 0x30, 0x2c, 0x50, + 0x5e, 0xd5, 0x96, 0xa0, 0x68, 0x5f, 0x95, 0xb9, 0xf5, 0xcc, 0x55, 0xde, + 0xf3, 0xa0, 0xe6, 0x1b, 0x8a, 0x0f, 0xd9, 0xda, 0x99, 0x9a, 0x49, 0x19, + 0xee, 0xaf, 0xe4, 0x1b, 0xb6, 0xda, 0xa5, 0xde, 0xaf, 0xb3, 0x47, 0xb5, + 0x57, 0xcd, 0x97, 0x99, 0x77, 0xf1, 0xe4, 0x50, 0xd7, 0x5e, 0xb5, 0x3d, + 0xcc, 0xff, 0xeb, 0xec, 0x52, 0xfb, 0x0b, 0x59, 0x18, 0xfa, 0x41, 0xd4, + 0x3e, 0xdb, 0x27, 0x8f, 0x8c, 0xfa, 0x22, 0x27, 0xfb, 0x80, 0x55, 0x28, + 0x51, 0x04, 0xdd, 0xfd, 0xe4, 0x69, 0xdf, 0xeb, 0xa5, 0xca, 0xae, 0xad, + 0x6a, 0x53, 0x66, 0xb5, 0x00, 0x4a, 0xb8, 0xab, 0xdf, 0x1f, 0xdf, 0xfb, + 0x9b, 0x5b, 0xea, 0xf8, 0xe0, 0x90, 0x3c, 0x45, 0x09, 0x04, 0xf6, 0x1b, + 0xb8, 0x4a, 0xdb, 0x65, 0xd2, 0x72, 0x63, 0x87, 0x4d, 0xc3, 0xd4, 0x93, + 0x16, 0x03, 0xb3, 0x80, 0x8c, 0xca, 0x61, 0xca, 0xfa, 0xa9, 0xe0, 0xef, + 0x07, 0x8a, 0x33, 0xed, 0x05, 0xb1, 0xdd, 0x5c, 0xd5, 0x26, 0x51, 0x7b, + 0xec, 0x1a, 0xd6, 0xc4, 0x61, 0x6e, 0x29, 0x59, 0x3d, 0x43, 0x17, 0xcb, + 0x03, 0x22, 0xb3, 0x5e, 0x00, 0xc0, 0x29, 0x4f, 0x77, 0x3d, 0xb3, 0x5e, + 0xa8, 0xe9, 0x40, 0x29, 0x72, 0x06, 0x9e, 0x5a, 0x5f, 0x6c, 0x3e, 0x87, + 0x18, 0xca, 0xa7, 0xa4, 0x6b, 0x50, 0xdf, 0xf0, 0xcd, 0x55, 0x44, 0x50, + 0xde, 0xb4, 0x04, 0x20, 0xb7, 0x69, 0x6c, 0x4f, 0xea, 0x4e, 0x1e, 0xf2, + 0xb8, 0x72, 0x5d, 0xc1, 0x39, 0xc4, 0xe0, 0xfd, 0xcc, 0x5f, 0x6e, 0xb3, + 0x80, 0x18, 0x8c, 0xe5, 0x85, 0x4c, 0xe5, 0x89, 0x31, 0x6d, 0xe2, 0xa1, + 0xf8, 0xab, 0x96, 0xaa, 0x65, 0x5a, 0xaf, 0xf9, 0x44, 0xb0, 0x50, 0xb2, + 0xce, 0x3c, 0x66, 0x87, 0xe5, 0xcd, 0x50, 0x55, 0x39, 0x10, 0x2a, 0x7b, + 0x43, 0xa4, 0x11, 0x18, 0xb5, 0xf4, 0x36, 0x98, 0xed, 0xcd, 0xac, 0xa3, + 0xaa, 0xf6, 0x0e, 0xdf, 0xb4, 0x96, 0xeb, 0xdf, 0x14, 0x6b, 0x2f, 0xad, + 0x97, 0x67, 0x38, 0x17, 0xed, 0x0b, 0xd9, 0xec, 0x06, 0xd4, 0xf7, 0x9f, + 0x33, 0xd3, 0x3e, 0x24, 0x86, 0x35, 0xa7, 0x6a, 0x98, 0xd6, 0x6b, 0x3e, + 0xa1, 0xa9, 0xc9, 0x54, 0x9e, 0xf9, 0x30, 0x66, 0x68, 0x22, 0xc3, 0xb5, + 0x5b, 0x1e, 0x07, 0x78, 0x4c, 0x29, 0xc2, 0x78, 0xdc, 0x76, 0x70, 0xfa, + 0x2b, 0x86, 0xea, 0xda, 0x1b, 0xe3, 0x94, 0xab, 0x77, 0xa0, 0x62, 0x09, + 0x90, 0xc7, 0xf9, 0xfd, 0x2d, 0x74, 0xe6, 0x0f, 0x40, 0xd3, 0xa5, 0x14, + 0xb7, 0xdf, 0xcc, 0xf9, 0x1d, 0x99, 0xf6, 0x41, 0xa4, 0xdc, 0xa6, 0xa2, + 0x61, 0x53, 0x2b, 0x0e, 0x8e, 0xbb, 0x07, 0x99, 0xd6, 0x89, 0x41, 0x9d, + 0xf6, 0x23, 0x4b, 0xa5, 0xf2, 0x5e, 0x0d, 0xb7, 0xf5, 0x83, 0xdf, 0x8e, + 0xcc, 0x3a, 0x9b, 0x69, 0x63, 0xf3, 0x1e, 0xea, 0xd1, 0x61, 0x6c, 0xde, + 0x05, 0x83, 0x83, 0xbf, 0x4b, 0xd0, 0x76, 0xcf, 0x88, 0x4d, 0xbe, 0xa6, + 0x04, 0x3b, 0x1f, 0xd9, 0x79, 0x78, 0xa0, 0xf6, 0xfe, 0x5a, 0x71, 0x48, + 0xdd, 0x99, 0xb2, 0x21, 0x00, 0x05, 0xc6, 0xe2, 0x2e, 0x04, 0xb6, 0x5d, + 0x4e, 0xda, 0xf4, 0xbb, 0x64, 0x5a, 0x91, 0xf7, 0x42, 0xf8, 0xe3, 0xee, + 0xb5, 0x6e, 0x6c, 0x3e, 0xe7, 0x9a, 0x69, 0xb9, 0x8e, 0xe2, 0x66, 0xa0, + 0xb8, 0x29, 0x17, 0xf6, 0x6f, 0x1a, 0x6a, 0x4a, 0x54, 0x34, 0xf7, 0xc0, + 0x6c, 0x0e, 0xbc, 0xb5, 0x07, 0x9d, 0xb7, 0x7f, 0x13, 0x11, 0x5f, 0x93, + 0x6c, 0x82, 0x1b, 0x25, 0x08, 0x5d, 0x05, 0xa8, 0xa4, 0x48, 0x07, 0x5a, + 0x07, 0xe8, 0x8a, 0x07, 0xa7, 0xdd, 0x66, 0xd4, 0x5b, 0x16, 0xfb, 0x5a, + 0xda, 0x06, 0xa8, 0x60, 0xbd, 0x2f, 0x34, 0x81, 0x3d, 0xcb, 0xb4, 0xdc, + 0xfe, 0x74, 0xfb, 0x64, 0x8f, 0xe5, 0x40, 0x9c, 0x76, 0x80, 0xcb, 0xb4, + 0xd5, 0xbd, 0x47, 0x22, 0x36, 0xcf, 0x8e, 0xa3, 0xc3, 0x41, 0x2b, 0xf3, + 0x18, 0x5a, 0x04, 0xfd, 0x9b, 0xce, 0xe5, 0x5b, 0x46, 0xb0, 0x8a, 0x41, + 0xd3, 0x83, 0x83, 0x81, 0x74, 0x0e, 0x74, 0x89, 0x3f, 0xf2, 0x5c, 0x3b, + 0x2d, 0x6f, 0x44, 0x9a, 0x34, 0x74, 0xe8, 0xaa, 0xf5, 0x6c, 0x99, 0xc5, + 0x51, 0xcc, 0x8e, 0xf5, 0x9d, 0x32, 0x2d, 0x5f, 0xd3, 0xb2, 0x30, 0x72, + 0x4d, 0xec, 0x6c, 0x9a, 0x17, 0xa6, 0x7d, 0x18, 0x9a, 0x96, 0x87, 0x99, + 0xf5, 0x82, 0xeb, 0xb3, 0x86, 0x52, 0x52, 0x4c, 0xf3, 0xdb, 0xae, 0x76, + 0x35, 0x07, 0x4b, 0xcc, 0xd9, 0x8e, 0x10, 0x27, 0x6d, 0xca, 0x74, 0xda, + 0x12, 0xbf, 0x3c, 0x4b, 0xfd, 0x2e, 0x57, 0xc5, 0x7b, 0x49, 0xd3, 0x4a, + 0x25, 0x20, 0xa5, 0x3f, 0x63, 0x06, 0xc5, 0xd1, 0xf5, 0xfb, 0x97, 0x43, + 0x13, 0x02, 0x27, 0x2a, 0xc0, 0x6f, 0xc7, 0x9e, 0xd0, 0xb4, 0x0c, 0x74, + 0x73, 0xaa, 0xbb, 0x69, 0x1b, 0xc2, 0x71, 0x74, 0x2e, 0x33, 0x55, 0x1c, + 0x96, 0xaf, 0x79, 0x1f, 0x08, 0xd3, 0x9a, 0x34, 0xb5, 0xf9, 0x3e, 0xff, + 0x05, 0x67, 0xc7, 0xdb, 0x4b, 0x9a, 0x96, 0xc7, 0x1c, 0xc5, 0x92, 0x51, + 0xb3, 0x3b, 0xad, 0xb2, 0x07, 0x66, 0x1f, 0x01, 0x4d, 0x2b, 0x98, 0x9f, + 0x85, 0x4d, 0x97, 0xc4, 0x37, 0xf8, 0x13, 0x88, 0x28, 0x34, 0x61, 0x1d, + 0x51, 0x00, 0x40, 0x22, 0x67, 0xc6, 0x3c, 0x3e, 0x1d, 0x73, 0x62, 0x5a, + 0x91, 0x78, 0xdd, 0x5e, 0x64, 0x5a, 0xa0, 0x72, 0x5d, 0xe8, 0x14, 0x31, + 0xac, 0xe5, 0x61, 0x5b, 0xe7, 0xe8, 0x00, 0x58, 0xf1, 0x52, 0x03, 0xa3, + 0xed, 0x31, 0x4d, 0xab, 0xda, 0xed, 0xf6, 0xcc, 0xa1, 0xe8, 0x2b, 0xb1, + 0xaa, 0x3f, 0xb9, 0xf0, 0xf4, 0x02, 0xe1, 0x9d, 0x0e, 0x72, 0x9b, 0xbc, + 0xee, 0xf2, 0xca, 0xfc, 0xfa, 0x2e, 0x75, 0xfc, 0xe4, 0x29, 0xdb, 0x93, + 0x0b, 0xc7, 0xcf, 0x03, 0xbc, 0xfc, 0xf9, 0xdf, 0xdd, 0xa3, 0x83, 0xe5, + 0x53, 0x9d, 0x6e, 0x4e, 0x3e, 0xa8, 0xe8, 0x3b, 0x37, 0x09, 0x7d, 0x79, + 0xb1, 0x97, 0x56, 0xe8, 0xf4, 0xcb, 0x3f, 0xd3, 0xca, 0xeb, 0xbc, 0x92, + 0xc1, 0x8d, 0xff, 0x75, 0x10, 0xdd, 0x9f, 0x22, 0xf9, 0xa7, 0x61, 0xea, + 0xe9, 0x11, 0x3b, 0xd3, 0xb6, 0xff, 0xa3, 0x29, 0xda, 0xba, 0x2f, 0xde, + 0x0f, 0xa3, 0xa7, 0x8c, 0x27, 0x0c, 0x58, 0xdf, 0x9f, 0xf0, 0x99, 0x3a, + 0x0e, 0xde, 0x06, 0x10, 0x67, 0x94, 0x8b, 0xb3, 0x61, 0xee, 0xbe, 0xd7, + 0x7b, 0x25, 0xe0, 0xc9, 0x27, 0x88, 0xbc, 0xfa, 0x93, 0x7f, 0xdf, 0x14, + 0xdd, 0x7d, 0x9f, 0x5f, 0xbe, 0xe1, 0x34, 0x6e, 0x13, 0x6b, 0x35, 0x2f, + 0xc8, 0x7c, 0x0f, 0x8b, 0x69, 0x85, 0x76, 0x77, 0x11, 0xd9, 0x33, 0xad, + 0xc0, 0x48, 0xae, 0x95, 0xa6, 0x15, 0xb5, 0xd7, 0x0b, 0x33, 0xe9, 0xf3, + 0xe7, 0x38, 0x67, 0xf1, 0x5c, 0xd5, 0xcf, 0xc0, 0xa6, 0x04, 0xdb, 0x1e, + 0xae, 0x86, 0x5d, 0x07, 0xec, 0xfc, 0x48, 0x1a, 0x51, 0xbe, 0xfb, 0xd8, + 0xbc, 0x12, 0xce, 0xe2, 0x95, 0xcf, 0x9c, 0x71, 0xf4, 0xdf, 0xaf, 0xfa, + 0xc7, 0xd8, 0x72, 0x5e, 0x48, 0x7b, 0x38, 0x45, 0x19, 0x84, 0x9d, 0xd6, + 0x65, 0x3d, 0x6e, 0xb4, 0x94, 0x53, 0x39, 0x11, 0x38, 0xec, 0x1d, 0xb0, + 0x1b, 0x10, 0x2e, 0x34, 0xad, 0x3c, 0xee, 0xfe, 0x05, 0x1a, 0x22, 0x6f, + 0x54, 0x67, 0x69, 0x73, 0x5e, 0xbc, 0xdd, 0xab, 0x44, 0x88, 0x5c, 0x63, + 0xbf, 0x11, 0x88, 0x19, 0xed, 0x80, 0x12, 0x57, 0xb5, 0x8b, 0x0a, 0xf0, + 0xe2, 0xd2, 0xc3, 0x37, 0x57, 0xb9, 0x51, 0x06, 0x7f, 0x1c, 0x18, 0xbe, + 0xb9, 0x6a, 0xc9, 0x47, 0xc6, 0x0e, 0xf7, 0xf0, 0x26, 0x98, 0x92, 0x07, + 0x8f, 0xf5, 0xf0, 0x3e, 0x04, 0xd9, 0x85, 0x83, 0x79, 0x99, 0x31, 0xec, + 0x46, 0x7c, 0x4a, 0x77, 0xb2, 0xa0, 0xe6, 0x9a, 0x96, 0xe9, 0x30, 0xce, + 0xfd, 0xe3, 0x86, 0xa9, 0x65, 0x35, 0x8e, 0xee, 0xb0, 0x3a, 0x57, 0x77, + 0xc7, 0xf1, 0x18, 0x90, 0xa9, 0x39, 0x6d, 0xee, 0x17, 0x9d, 0xd9, 0xb0, + 0x0d, 0x48, 0x36, 0x33, 0xaf, 0x6a, 0xbf, 0x51, 0xd3, 0x92, 0xf7, 0x37, + 0xcc, 0xa8, 0x1a, 0xc7, 0x4d, 0x72, 0xfb, 0x3e, 0x04, 0x7f, 0x63, 0x98, + 0x56, 0x7a, 0xc5, 0xb5, 0xa8, 0x9d, 0xa6, 0xf5, 0x8a, 0xaa, 0x86, 0x74, + 0xd2, 0xb4, 0xfa, 0xf7, 0x47, 0x08, 0x6b, 0x5a, 0x06, 0x8e, 0x2f, 0xaf, + 0xe2, 0x57, 0xd7, 0xf9, 0xa7, 0x98, 0x0d, 0x9a, 0x56, 0xf7, 0xfd, 0x35, + 0xff, 0x69, 0x9a, 0xfe, 0xb3, 0xd3, 0xc5, 0xcd, 0x27, 0x3f, 0xbd, 0x40, + 0xfb, 0xdf, 0xe9, 0x20, 0xe9, 0xcb, 0x15, 0xa2, 0x97, 0x5a, 0x89, 0xbe, + 0x5c, 0xa1, 0xf4, 0x7f, 0x5b, 0x69, 0x6b, 0x27, 0x4d, 0x4b, 0x36, 0x6b, + 0x0c, 0xf9, 0xe9, 0x34, 0xa5, 0xdf, 0xe9, 0xd4, 0xb4, 0xe6, 0xbd, 0x12, + 0x70, 0xe6, 0x09, 0x22, 0x96, 0xe6, 0x15, 0xd5, 0xa6, 0x66, 0x5c, 0x00, + 0x70, 0x59, 0xa0, 0x3c, 0xc7, 0xd5, 0xac, 0x08, 0x9e, 0x4a, 0xe7, 0x5c, + 0x11, 0xad, 0x50, 0x54, 0x42, 0x87, 0xae, 0x9e, 0x1c, 0x51, 0x39, 0x3c, + 0x54, 0x23, 0xa6, 0x35, 0xaf, 0xc2, 0xcd, 0x71, 0x58, 0x3b, 0xa6, 0x1d, + 0x98, 0x75, 0x67, 0x37, 0x4b, 0x23, 0xb2, 0x18, 0x48, 0x1a, 0x99, 0xb3, + 0x2d, 0x77, 0x6c, 0x19, 0x30, 0xef, 0x46, 0xab, 0x66, 0xa6, 0xe1, 0xed, + 0x35, 0xe0, 0x33, 0xa3, 0x40, 0xdc, 0x99, 0x87, 0x36, 0x33, 0x86, 0x6a, + 0x0f, 0x33, 0x63, 0x04, 0x2e, 0x35, 0xe7, 0x05, 0xe5, 0x04, 0x82, 0x48, + 0x72, 0xfb, 0xf6, 0x44, 0xd1, 0x27, 0x46, 0x66, 0x34, 0xef, 0x7b, 0xf5, + 0x8a, 0xbc, 0x8e, 0x75, 0xba, 0x5e, 0xd3, 0xdf, 0x90, 0x30, 0xdb, 0xe5, + 0x22, 0xdf, 0xd8, 0xf2, 0xaa, 0x61, 0x7f, 0x2a, 0x4f, 0xfb, 0x4a, 0x23, + 0x73, 0x90, 0xc7, 0x95, 0x07, 0x1d, 0xda, 0x7e, 0x5c, 0x1b, 0xc7, 0x1b, + 0x5b, 0x56, 0xf6, 0xd1, 0xfa, 0x2f, 0x28, 0xf9, 0xe5, 0x2b, 0x19, 0x84, + 0x50, 0xa3, 0x7d, 0xbc, 0x50, 0xb4, 0xac, 0x3c, 0x5e, 0xf9, 0x8d, 0x8f, + 0xa6, 0x4b, 0x29, 0xed, 0xb7, 0x39, 0xb8, 0xda, 0xc6, 0x4e, 0x63, 0x30, + 0x71, 0x5b, 0x79, 0x77, 0x97, 0x5d, 0x72, 0xfb, 0xfe, 0x03, 0xaf, 0x9a, + 0xb0, 0x8e, 0xdf, 0x6f, 0xb4, 0x65, 0x2a, 0x2f, 0xbf, 0xb5, 0xc0, 0x3b, + 0xec, 0x28, 0x8d, 0xbb, 0x7b, 0x26, 0x2f, 0xf4, 0x68, 0xb3, 0x8e, 0x8f, + 0x25, 0x3a, 0xdf, 0x88, 0xda, 0x69, 0x43, 0x51, 0xf4, 0x2a, 0x09, 0xea, + 0xf8, 0x78, 0xa0, 0xd8, 0x8d, 0xa8, 0x68, 0x17, 0x2f, 0xf1, 0x55, 0x51, + 0xf4, 0xc7, 0x15, 0x0d, 0xb6, 0x17, 0x3a, 0xa6, 0x8e, 0x7b, 0x17, 0xc5, + 0x33, 0x94, 0xc5, 0xfc, 0x83, 0x62, 0x58, 0x19, 0xe0, 0x3e, 0x01, 0xa9, + 0x63, 0x1d, 0xf5, 0xe8, 0x3a, 0x43, 0x66, 0xbd, 0x60, 0x7b, 0x26, 0xc8, + 0x2d, 0x56, 0x15, 0x1e, 0xa9, 0xe3, 0x63, 0x89, 0xde, 0x0b, 0x80, 0x12, + 0x87, 0xf4, 0xb2, 0x67, 0x41, 0x3d, 0xfb, 0x53, 0x67, 0xd6, 0x3a, 0x7a, + 0xc1, 0xda, 0x14, 0x04, 0x60, 0x6c, 0x59, 0x89, 0xeb, 0x85, 0x26, 0x32, + 0x96, 0x73, 0xf0, 0x21, 0x54, 0x36, 0x49, 0xd4, 0x7f, 0x03, 0xb7, 0x8e, + 0xd5, 0xe2, 0xff, 0x01, 0xa9, 0xe3, 0x9f, 0x66, 0x9e, 0xee, 0x93, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 }; @@ -831,18 +831,23 @@ void ConfigurationPanel::languageChange() codec1->clear(); codec1->insertItem( tr( "G711u" ) ); codec1->insertItem( tr( "G711a" ) ); + codec1->insertItem( tr( "GSM" ) ); codec2->clear(); codec2->insertItem( tr( "G711a" ) ); codec2->insertItem( tr( "G711u" ) ); + codec2->insertItem( tr( "GSM" ) ); codec3->clear(); codec3->insertItem( tr( "G711u" ) ); codec3->insertItem( tr( "G711a" ) ); + codec3->insertItem( tr( "GSM" ) ); codec4->clear(); codec4->insertItem( tr( "G711u" ) ); codec4->insertItem( tr( "G711a" ) ); + codec4->insertItem( tr( "GSM" ) ); codec5->clear(); codec5->insertItem( tr( "G711u" ) ); codec5->insertItem( tr( "G711a" ) ); + codec5->insertItem( tr( "GSM" ) ); textLabel1_4->setText( tr( "1" ) ); textLabel1_4_2->setText( tr( "2" ) ); textLabel1_4_3->setText( tr( "3" ) ); diff --git a/src/configurationpanelui.h b/src/configurationpanelui.h index 4dbbb4b3dc..8f8193a222 100644 --- a/src/configurationpanelui.h +++ b/src/configurationpanelui.h @@ -1,7 +1,7 @@ /**************************************************************************** ** Form interface generated from reading ui file 'configurationpanel.ui' ** -** Created: Mon Feb 7 11:33:42 2005 +** Created: Thu Feb 10 12:16:26 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/manager.cpp b/src/manager.cpp index ee41e5d2f7..aca5bcc20b 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -65,8 +65,8 @@ Manager::Manager (QString *Dc = NULL) { Qt::WStyle_NoBorder,this); sip = new SIP(this); - audioRTP = new AudioRtp(this->sip, this); tone = new ToneGenerator(this); + audioRTP = new AudioRtp(this); sip_init(); @@ -74,9 +74,9 @@ Manager::Manager (QString *Dc = NULL) { // Init variables b_ringing = false; - mute = false; b_ringtone = false; b_congestion = false; + mute = false; if (DirectCall) { qWarning ("Direct call....."); @@ -200,7 +200,9 @@ Manager::ring (bool var) { this->b_ringing = var; } tonezone = ringing(); - tone->playRing ((gui()->getRingFile()).ascii()); + + if (sip->getNumberPendingCalls() == 1) + tone->playRing ((gui()->getRingFile()).ascii()); } // When IP-phone user makes call @@ -222,6 +224,16 @@ Manager::congestion (bool var) { tone->toneHandle(ZT_TONE_CONGESTION); } +void +Manager::notificationIncomingCall (void) { + short *buffer = new short[SAMPLING_RATE]; + + tone->generateSin(440, 0, AMPLITUDE, SAMPLING_RATE, buffer); + + audiodriver->audio_buf.resize(SAMPLING_RATE); + audiodriver->audio_buf.setData(buffer, getSpkrVolume()); + delete[] buffer; +} #if 0 bool Manager::getCallInProgress (void) { diff --git a/src/manager.h b/src/manager.h index 4297653f71..50d3b6595b 100644 --- a/src/manager.h +++ b/src/manager.h @@ -91,6 +91,7 @@ public: void ringTone (bool); void startDialTone (void); void congestion (bool); + void notificationIncomingCall(void); void errorDisplay (char*); void nameDisplay (char*); void spkrSoundVolume (int); diff --git a/src/phonebookui.cpp b/src/phonebookui.cpp index 7a9cfb624d..1827c9b47e 100644 --- a/src/phonebookui.cpp +++ b/src/phonebookui.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Form implementation generated from reading ui file 'phonebook.ui' ** -** Created: Mon Feb 7 11:33:42 2005 +** Created: Thu Feb 10 12:16:24 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/phonebookui.h b/src/phonebookui.h index 3b364498b8..497f1b8d41 100644 --- a/src/phonebookui.h +++ b/src/phonebookui.h @@ -1,7 +1,7 @@ /**************************************************************************** ** Form interface generated from reading ui file 'phonebook.ui' ** -** Created: Mon Feb 7 11:33:42 2005 +** Created: Thu Feb 10 12:16:24 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/sip.cpp b/src/sip.cpp index 7c32f3bba8..f889e0894b 100644 --- a/src/sip.cpp +++ b/src/sip.cpp @@ -214,7 +214,7 @@ SIP::getNumberPendingCalls(void) { for (k = 0; k < NUMBER_OF_LINES; k++) { assert (k < NUMBER_OF_LINES); - if (call[k]->state != NOT_USED) { + if (call[k] != NULL) { pos++; } } @@ -361,6 +361,7 @@ SIP::setRegister (void) { eXosip_lock(); if (setAuthentication() == -1) { + eXosip_unlock(); return -1; } @@ -837,10 +838,11 @@ SIP::getEvent (void) { break; case EXOSIP_CALL_REQUESTFAILURE: +#if 0 qDebug("REQUESTFAILURE<- (%i %i) [%i %s] %s", event->cid, event->did, event->status_code, event->reason_phrase, event->remote_uri); - +#endif theline = findLineNumber(event); assert (theline >= 0); assert (theline < NUMBER_OF_LINES); @@ -850,10 +852,10 @@ SIP::getEvent (void) { // Handle 4XX errors switch (event->status_code) { case AUTH_REQUIRED: - eXosip_lock(); if (setAuthentication() == -1) { break; } + eXosip_lock(); eXosip_retry_call (event->cid); eXosip_unlock(); break; @@ -963,9 +965,11 @@ SIP::getEvent (void) { break; case EXOSIP_REGISTRATION_FAILURE: +#if 0 qDebug("REGISTRATION_FAILURE <- (%i) [%i %s] %s for REGISTER %s", event->rid, event->status_code, event->reason_phrase, event->remote_uri, event->req_uri); +#endif if (countReg <= 3) { setRegister(); countReg++; diff --git a/src/tonegenerator.cpp b/src/tonegenerator.cpp index 47f1db70e7..7940d6989e 100644 --- a/src/tonegenerator.cpp +++ b/src/tonegenerator.cpp @@ -36,10 +36,9 @@ using namespace std; /////////////////////////////////////////////////////////////////////////////// // ToneThread implementation /////////////////////////////////////////////////////////////////////////////// -ToneThread::ToneThread (Manager *mngr, short *buf, int total) { +ToneThread::ToneThread (Manager *mngr, short *buf) { this->mngr = mngr; this->buffer = buf; - this->totalbytes = total; } ToneThread::~ToneThread (void) { @@ -49,9 +48,9 @@ ToneThread::~ToneThread (void) { void ToneThread::run (void) { while (mngr->tonezone) { - mngr->audiodriver->audio_buf.setData (buffer, mngr->getSpkrVolume()); + mngr->audiodriver->audio_buf.setData(buffer, mngr->getSpkrVolume()); mngr->audiodriver->writeBuffer(); - } + } } /////////////////////////////////////////////////////////////////////////////// @@ -158,8 +157,8 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate, int amplitude, short* temp) { QString s; int count = 0; - int oct = 0, - oct_temp = 0, + int byte = 0, + byte_temp = 0, nbcomma; short *buffer = new short[1024*1024]; @@ -175,20 +174,22 @@ ToneGenerator::buildTone (int idCountry, int idTones, int samplingRate, // If there is time or if it's unlimited if (time) { - oct = (samplingRate*2*time)/1000; + byte = (samplingRate*2*time)/1000; } else { - oct = samplingRate; + byte = samplingRate; } // To concatenate the different buffers for each section. - for (int j = oct_temp * i; j < oct + (oct_temp * i); j++) { + for (int j = byte_temp * i; j < byte + (byte_temp * i); j++) { temp[j] = buffer[count++]; } - oct_temp = oct; + byte_temp = byte; count = 0; } // Total number in final buffer - totalbytes = oct + (oct_temp * (nbcomma+1)); + totalbytes = byte + (byte_temp * (nbcomma+1)); + + delete[] buffer; } /** @@ -234,7 +235,7 @@ ToneGenerator::toneHandle (int idr) { // New thread for the tone if (tonethread == NULL) { - tonethread = new ToneThread (manager, buf, totalbytes); + tonethread = new ToneThread (manager, buf); manager->audiodriver->audio_buf.resize(totalbytes); tonethread->start(); } @@ -283,9 +284,10 @@ ToneGenerator::playRing (const char *fileName) { dst, (unsigned char *)src, length); + // Start tone thread if (tonethread == NULL) { - tonethread = new ToneThread (manager, dst, expandedsize); + tonethread = new ToneThread (manager, dst); manager->audiodriver->audio_buf.resize(expandedsize); tonethread->start(); } @@ -301,3 +303,4 @@ ToneGenerator::playRing (const char *fileName) { return 1; } + diff --git a/src/tonegenerator.h b/src/tonegenerator.h index 256049f457..693afaf5c2 100644 --- a/src/tonegenerator.h +++ b/src/tonegenerator.h @@ -47,14 +47,13 @@ using namespace ost; /////////////////////////////////////////////////////////////////////////////// class ToneThread : public Thread { public: - ToneThread (Manager *, short *, int); + ToneThread (Manager *, short *); ~ToneThread (void); virtual void run (); private: - Manager *mngr; - short *buffer; - int totalbytes; + Manager* mngr; + short* buffer; }; /////////////////////////////////////////////////////////////////////////////// @@ -85,9 +84,9 @@ public: private: void initTone (void); - Manager *manager; - ToneThread *tonethread; - + Manager* manager; + ToneThread* tonethread; + }; #endif // __TONE_GENRATOR_H__ diff --git a/src/url_inputui.cpp b/src/url_inputui.cpp index e992ba1816..5dd00baa5d 100644 --- a/src/url_inputui.cpp +++ b/src/url_inputui.cpp @@ -1,7 +1,7 @@ /**************************************************************************** ** Form implementation generated from reading ui file 'url_input.ui' ** -** Created: Mon Feb 7 11:33:42 2005 +** Created: Thu Feb 10 12:16:26 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! diff --git a/src/url_inputui.h b/src/url_inputui.h index 54dd2ea82b..1fc6372dba 100644 --- a/src/url_inputui.h +++ b/src/url_inputui.h @@ -1,7 +1,7 @@ /**************************************************************************** ** Form interface generated from reading ui file 'url_input.ui' ** -** Created: Mon Feb 7 11:33:42 2005 +** Created: Thu Feb 10 12:16:26 2005 ** by: The User Interface Compiler ($Id$) ** ** WARNING! All changes made in this file will be lost! -- GitLab