rat-4.2.22/0040750000175000017500000000000007517342656011361 5ustar enderenderrat-4.2.22/man/0040750000175000017500000000000007517342160012122 5ustar enderenderrat-4.2.22/man/man1/0040750000175000017500000000000007517342161012757 5ustar enderenderrat-4.2.22/man/man1/rat.10100640000175000017500000001662007106312050013616 0ustar enderender'\" t .\" @(#)rat.1 3.1 97/02/22 .\" Copyright (c) 1997-2000 University College London. .\" Written by Orion Hodson .\" .TH rat 1 "14 January 2000" .SH NAME rat \- unicast and multicast audio conferencing tool .SH SYNOPSIS .B rat .RB [options] .I address/port .SH DESCRIPTION .LP .I RAT is a network audio conferencing and streaming application with support for multiple sampling rates, error concealment, and redundant audio encoding. Transmissions can be between two participants directly (unicast) or between a group of participants on a common multicast address. To initiate a unicast conference the user specifies the .I address of the destination host name or IP address and a port number. To participate in a multicast conference a Class D group address should be specified together with a .I port number. The application uses the greatest even integer less than or equal to the port specified for data (RTP) and the port above for control messages (RTCP). The protocols RTP and RTCP used are specified in RFC 1889. .SH OPTIONS The following options are supported: .TP .BI -agc " 1|0" Enable automatic gain control (AGC). .TP .BI -allowloopback Causes rtp packets to be loopbacked during multicast sessions. .TP .BI \-crypt " key" Enable encryption, with the specified key. Encryption is done using DES, and is believed compatible with encrypting versions of vat. .TP .BI -C " name" Sets the RAT window title to .I name. .TP .BI -E " email" Sets the .I email address transmitted to remote participants. .TP .BI \-f " codec" Specifies the primary encoding used when transmitting audio. .TP .BI -L " location" Sets the .I location description transmitted to remote participants. .TP .BI -N " username" Sets the .I username transmitted to remote participants. .TP .BI -P " phone" Sets the .I phone number transmitted to remote participants. .TP .BI -pt " type/codec" Specifies the payload type to be used for .I codec. .TP .BI -r " codec/offset" Specifies the coding used for the redundant encoder and the offset of the redundant encoding relative to the primary in audio frames. .TP .BI -repair " method" Specifies the use of receiver based repair technique based on .I method. This can currently be none or repeat. .TP .BI -t " ttl" Specifies the TTL (time to live) value set in the packet headers. This limits the scope of the packets. The following values are generally considered appropriate: .RS 10n .nf .ta 4 campus/organization 16 country 64 continent 127 planet .fi .RE .TP .BI -silence " 1|0" Turns silence suppression on or off. .TP .B -version Displays the version number. .SH USER INTERFACE .SS Main Window The main window of RAT is split into three sections. At the top of the window are the audio device port and volume selectors, and the mutes for incoming and outgoing audio. In the middle the list of participants shows local and remote conference members. Active speakers are highlighted. Clicking the left mouse button on the name of a remote participant will display a user information panel, giving various reception statistics for that user. Individuals can be selectively muted by clicking on them with the middle mouse button on three button systems, or moving the mouse to the individual and pressing the m. At the bottom of the window are buttons for the options panel, the about panel, and to quit. Pressing the right mouse button anywhere within the RAT window will temporarily toggle the state of the audio input mute: this allows a "push-to-talk" mode of operation. .SS Options RAT supports a large number of options and pressing the "options" button will launch the optinos panel. The best approach to see what is available is to go and explore. The options panel has a category menu at the top and by clicking on it options in the different categories are presented. .TP .B Personal User details that are conveyed to other conference participants. .TP .B Transmission Allows the selection of codec used for transmission, the setting of the number, of units of audio per packet, and the selection of redundant audio data. .TP .B Reception Options that control how received audio is decoded. .TP .B Audio Options to select and configure the available audio device, and features that pertain to audio handling (i.e. silence suppression, agc, audio loopback, and echo suppression). .TP .B Codecs Displays details on available codecs and allows for them to be assigned to alternate RTP payload numbers. Map payload numbers at your own peril. .TP .B Security Allows DES encryption of audio for incoming and outgoing streams. .TP .B Interface Allows users to control balloon help, enable lip synchronization with suitably modified versions of .I VIC , and displaying of windows for reception quality and file playback and recording. .SH EXAMPLES To start a unicast session between the current host and the host shrew.cs.ucl.ac.uk using port 12000 type: rat shrew.cs.ucl.ac.uk/12000 To join a multicast session on group address 224.5.6.7 and port 8110 type, using primary encoding of dvi and a secondary encoding of lpc: rat -f dvi/lpc 224.5.6.7/8110 .SH AUTHORS This version of RAT was written by Orion Hodson and Colin Perkins in the Networked Multimedia Group, University College London. Markus Iken contributed the 3d rendering code. Bob's Olson and Lindell contributed the ALSA audio interface. The first version of RAT was developed by Vicky Hardman and Isidor Kouvelas at University College London. The DES encryption was written by Saleem Bhatti and integrated by Darren Harris. RAT has been supported by the following projects: .RS 4 .TS MICE Multimedia Conferencing in Europe (ESPRIT) MERCI Multimedia European Research Conferencing Integration ReLaTe Remote Language Teaching for Super Janet (BT/JISC) RAT Robust Audio Tool (EPSRC/BT) .TE .RE This software has benefited from hardware donations by Sun Microsystems and Hewlett Packard, and software donations by Microsoft. .SH ACKNOWLEDGEMENTS We thank Roy Bennett, Davide Cavagnino, Jon Crowcroft, Ross Finlayson, Atanu Ghosh, Terry Gibbons, Jeremy Hall, Mark Handley, Marcus Iken, Iain McKay, Roman Kurmanowyts, Robert Olson, Fulvio Risso, Roy Rodenstein, Lorenzo Vicisano, Anna Watson, Michael Wallbaum, Hui Zhao, and our collegues at UCL who have provided countless suggestions and extended good humour through the buggy pre-releases. Modifications for HP-UX by Terje Vernly and Geir Harald Hansen . This software is derived, in part, from publically available source code with the following copyright: Copyright (c) 1991-1993,1996 Regents of the University of California. Copyright (c) 1992 Stichting Mathematisch Centrum, Amsterdam. Copyright (c) 1991,1992 RSA Data Security, Inc. Copyright (c) 1992 Jutta Degener and Carsten Bormann, Technische Universitaet Berlin. Copyright (c) 1994 Henning Schulzrinne. Copyright (c) 1994 Paul Stewart. This product includes software developed by the Computer Systems Engineering Group and by the Network Research Group at Lawrence Berkeley Laboratory. Encryption features of this software use the RSA Data Security, Inc. MD5 Message-Digest Algorithm. .SH FEEDBACK Please send comments, bug-reports, patches, and suggestions to rat-trap@cs.ucl.ac.uk. Please check http://www-mice.cs.ucl.ac.uk/multimedia/software for latest release information. rat-4.2.22/COPYRIGHT0100640000175000017500000000542707452150057012650 0ustar enderenderCopyright (C) 1995-2002 University College London All rights reserved. Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. All advertising materials mentioning features or use of this software must display the following acknowledgement: This product includes software developed by the Computer Science Department at University College London. 4. Neither the name of the University nor of the Department may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. This software is derived, in part, from publically available and contributed source code with the following copyright: Copyright (C) 1991-1993,1996 Regents of the University of California Copyright (C) 1992 Stichting Mathematisch Centrum, Amsterdam Copyright (C) 1991-1992 RSA Data Security, Inc Copyright (C) 1992 Jutta Degener and Carsten Bormann, TU Berlin Copyright (C) 1994 Paul Stewart Copyright (C) 2000 Nortel Networks Copyright (C) 2000 Argonne National Laboratory Copyright (C) 1991 Bell Communications Research, Inc. (Bellcore) Copyright (C) 1996 Internet Software Consortium. Copyright (C) 1995-1999 WIDE Project This product includes software developed by the Computer Systems Engineering Group and by the Network Research Group at Lawrence Berkeley Laboratory. The WB-ADPCM algorithm was developed by British Telecommunications plc. Permission has been granted to use it for non-commercial research and development projects. BT retain the intellectual property rights to this algorithm. Encryption features of this software use the RSA Data Security, Inc. MD5 Message-Digest Algorithm. rat-4.2.22/INSTALL.TXT0100640000175000017500000000652307226421472013063 0ustar enderenderRobust-Audio Tool installation instructions =========================================== Copyright (C) 1995-2001 University College London All rights reserved. This software is distributed under license, see the file COPYRIGHT for full terms and conditions. Installing pre-compiled binaries -------------------------------- Binary releases of RAT are standalone, and do not require the installation of other libraries to function correctly. The Windows 95/98/NT binary is a self-extracting installer, double-click on its icon and follow the instructions. The Unix versions are distributed as tar archives compressed with gzip. The archive contains documentation files and binaries which can be installed as follows: tar zxvf rat-4.2.3-solaris2.7.tar.gz cd rat-4.2.3 ./rat-4.2.3-installer at this point you will be asked to read the license agreement. If you accept the license terms, a second tar/gzip archive will be generated. You should then install this using: tar zxvf rat-4.2.3-solaris2.7.tar.gz install -m 755 rat-4.2.3 /usr/local/bin install -m 755 rat-4.2.3-ui /usr/local/bin install -m 755 rat-4.2.3-media /usr/local/bin replacing "4.2.3-Solaris" with the version number and platform of your choice. Note: 1) The front-end binary ("rat-4.2.3" in this example) can be renamed if desired. The application will not work if the other binaries are renamed. 2) All three binaries must be installed in a directory in your search path. If you have the sdr program, you should also install the supplied sdr plugin according to the instructions for sdr. Compiling from source code -------------------------- To compile RAT from source you MUST download and compile the following additional packages: The UCL common multimedia code library The UCL distribution of tcl-8.0 The UCL distribution of tk-8.0 These can be downloaded from http://www-mice.cs.ucl.ac.uk/multimedia/software or, if you have access to the UCL CVS server, you should fetch the modules common, tcl-8.0 and tk-8.0. On Windows 95/98/NT you should install the packages in c:\src. The entire package can be built using Visual C++ 6.0 with the rat.dsw workspace, there is no need to separately compile common, tcl-8.0 and tk-8.0. Ensure that you select the correct configuration when compiling (rat win32 release, for example). To compile the IPv6 version, you need the Microsoft Research IPv6 stack; this must be downloaded separately. On Unix you should build the tcl-8.0, tk-8.0 and common packages before attempting to compile rat. You should then build rat as follows: ./configure make The compilation process requires that all four packages are installed below a common directory. A distribution binary package can be built with the command make tgz The configure script takes the following options: --enable-debug build a binary with debug symbols --enable-debug-mem build a binary with memory debugging --enable-profile build a binary with profiling information --enable-bounds compile with array bounds checking (requires a modified gcc which supports this) Further options may be available - use "./configure --help" for details. On SGI Irix, you may need to specify the "--x-libraries=/usr/lib32" option to configure. If you need to modify the source to build RAT on your platform, please send these modifications to rat-trap@cs.ucl.ac.uk for incorporation in future releases. rat-4.2.22/MODS0100640000175000017500000024266007517337114012047 0ustar enderenderMODIFICATIONS FILE ------------------ $Id: MODS,v 1.308 2002/07/23 20:36:28 ucaccsp Exp $ Copyright (C) 1995-2002 University College London All rights reserved. This software is distributed under license, see the file COPYRIGHT for full terms and conditions. The modifications here include the development versions, not all of which are released. This list is not intended to be comprehensive. The current release is available at http://www-mice.cs.ucl.ac.uk/multimedia/software/rat/ v0 Initial audio tool Old VAT and RTPv2(5) compatibility PCM DVI GSM LPC codecs v1 Vicky's restructuring Dropped old VAT compat mode Used in ReLaTe trials New UI including small mode Video Sync code added v2.0 Transmitter cleaned up Lots of bugs fixed Replaced DVI and LPC codecs with VAT4 versions Released in Boston WWW4 v2.1 Ported to Tcl7.3/Tk4.0 Added UI response slider v2.2 Added play and rec options v2.3 Port to Tk4.1/Tcl7.5 v2.4a0 Port to Windows95 v2.4a1 Fixed active speaker indication v2.4a2 Fixed GSM v2.4a3 Release to MERCI partners for testing v2.4a4 Fixed broken assertions... v2.4a5 SGI fix v2.4a6 Security holes fixed Assertion handling improved Start at encryption and multi-rate audio v2.4a7 FreeBSD modifications Fixed playout calculation (probably) v2.4a8 Added RTCP SDES TOOL field to stats panel Fixed version number Made packet repetition an option and set default to OFF Fixed encoding selection bugs Misc bug fixes.... v2.4a9 Fixed participant display when audio device is busy When device is busy audio controls get disabled Added code to set microphone gain under Win95 Modified loop timing for win95 version so that it does not hog CPU Made session title appear as window title with -C flag v2.4a10 Added OS type to RTCP tool string v2.5a0 Fixed long DVI packet format. Now there is only one state (VAT comp). Reduced UI window border width. New look! Added scrollbar to participants window New participant stats code. Allows multiple windows... Attempt to fix some of the stats Popup window to request RTP name if resource not set v2.5a1 Changed redundancy packet format to conform to UCL-INRIA spec Added error code to report use of old packet format New code to do encoding name stats Fixed RTCP RR packets to conform with latest spec Made RAT look in .RTPdefaults for user name Added IP address display in stats v2.5a2 Highlight other RAT users in list of participants Ignore audio until RTCP packet received v2.5a3 Added encryption (Darren said it's compatible with vat) v2.6a0 Added command line option to set redundancy type Started to change payload type to match draft-perkins-rtp-redundancy-01.txt (Grouped headers, but haven't changed bit order yet...) v2.6a1 Finished changing the payload type. Default redundancy pt=121 Send initial RTCP message as soon as we start up... v2.6a2 Allow window to resize horizontally (requested by vilhuber@cs.colorado.edu) Updated copyright notice. Updated about panel. Added -pt pt/codec/clock/channels command line option. Example: "-pt 121/redundancy" to set redundancy payload type to 121 Remove -rpt option (use -pt instead). Remove -f2 option. Change -f option to accept things like "-f pcm/dvi" to set redundancy type. v2.6a3 Fixed packing order so it resizes horizontally correctly. v2.6a4 New WIN32 version Changed priority of thread Fixed cushion code to work with I/O switching Linked tcl and tk with WIN32 binary so no DLLs are needed v2.6a5 Partial rewrite of win32 audio driver to use static buffers Solved most win32 audio problems v2.6a6 Made the prompt for .RTPdefaults information less user hostile Fixed LPC decoding on SGIs (-fsigned-char does it!?!) v2.6a7 Removed old bitmap from control panel Rewrite of small user interface (command line option -smallui) v2.6a8 Further rewrite of the small user interface Fixed SO_REUSEADDR HP-UX fixes Added "-crypt " command line option to enable encryption v2.6a9 Fix m/cast power meters when encryption is turned on. v2.6a10 HP-UX fixes v2.6a11 Remove debugging malloc wh en NDEBUG is defined. v2.6a12 Code cleanup in preparation for mixer Corrected URL on the about panel v2.6a13 Code cleanup in preparation for mixer Added -li option for multihomed hosts Removed annoying transient tag from pop-up windows. v2.6a14 Added an icon Win32 fixes Removed -li stuff, since it broke the win32 port. More HP-UX changes v3.0.0 Restructure code for audio translator/mixer Extended ascii hostnames (>15 chars) - useful for unicast Additional RTP header validation v3.0.1 Major restucturing of main_rat.c, and split into several separate files. Fixes for Linux. Include full/half duplex stuff in all versions. v3.0.2 Bug fixes to auddev_linux.c Fixes to RTCP header checks on little-endian machines. Now obeys xresources settings. v3.0.3 Experimental release for Linux Some fixes to encryption code: it still doesn't work though... v3.0.4 Major mods to init_session.c Added mixer code to linux port. v3.0.5 Fake TS start if we TOG packets Fix RTCP timestamp epoch to 1900 not 1970 to conform to RFC1889 Fix display of group address in options panel. Fix CNAME. Extensive changes for the audio transcoder/mixer. New HP-UX audio device driver from UiO added. v3.0.6 More changes for the audio transcoder/mixer. Fixes to Linux audio driver when in half-duplex mode. Added the -version option. v3.0.7 Major changes for the audio transcoder/mixer: First version to work at all! Now sources $HOME/.rat as tcl on startup Linux fixes v3.0.8 CNAME now uses dotted-quad representation of the IP address, not FQDN. 16bit linear audio throughout main code: not all device drivers fixed yet. Make DVI the default primary encoding. Added L16 (16bit linear, uncompressed) codec. Both sides of transcoder/mixer use same SSRC/CNAME. Calculate RTCP reporting interval, rather than using constant 6 seconds. Major rewrite of transmitter and receiver code (supports multiple red) Added CSRC processing to receiver Fix indication of active speakers Update device buffer cushion code Removed small (ReLaTe) UI Minor redisign of option UI Added lecture mode Linux port now works again v3.0.9 Added minimal LBL conference bus support Enabled voice-switching of video using LBL conference bus/vic Fixed SGI 16 bit Fixed WIN32 16 bit Slight highlighting of participants after they stop speaking Now uses tk4.2/tcl7.6 v3.0.10 Prehang and posthang added to new code IP_MULTICAST_LOOP is now on for the session port We can now parse our BYE message although it is wrong Packet repetition added to new code Audio DC bias removal added for all platforms v3.0.11 We can no longer parse our BYE message, since it is wrong! More UI changes... (packet format uses pull down menus) Disable powermeters option added Selective muting of participants possible with middle mouse button. Automatic bias removal (turns off if not needed) Fix handling of RTP packets with CSRC data Rewrite of RTCP handling code... Fix RTCP BYE packet Transcoder/mixer now passes RTCP packets Exponential fade on packets (no good) LPC redundancy alignment code (also no good) v3.0.12 Linear fade on repeated packets Fade on repeated LPC decoded packets Prevention of mixing dummies with no decompressed data Packet length shown in UI Can select N-level redundancy from command line (-f pcm/dvi/lpc for example) Fix parsing of command line options Lecture mode is on by default Turn off lecture mode as soon as we send data Added -loopback_rtp option for loopback of the RTP packets (RTCP loopback is always on) Added audio device trading via the LBL conference bus Added flakeway operation v3.0.13 Integrated transcoder/mixer into the main Rat code. v3.0.14 Move to tcl-7.6p2/tk-4.2p2 Fix linux/HP-UX ports Fix for flakeaway v3.0.15 Assorted bug fixes Hang onto multiple encoded data in receiver Logic into UI for redundant coding types Fix LPC redundancy (Ho Ho) Fix sending L16 with redundancy Fix auto-select of "Mike mutes net" when running on a half-duplex machine TCL_ALL_EVENTS in event processing loop (sockets from tcl scripts->fileevents) v3.0.16 Bug fixes to the transmitter Fix CSRC processing v3.0.17 Fixes for Win32 v3.0.18 Fix RTCP BYE packet on little-endian machines Muting of output now frees data Fix reception of 160ms packets Fix uninitialised variable in rtcp_db v3.0.19 Remove spurious debugging messages when we can't open the audio device Cleanup HP-UX audio driver v3.0.20 Can now select line-in/microne input on SGI machines Added -K option to enable encryption (synonym for -crypt) Cleanup Linux audio driver Cleanup Sparc audio driver Cleanup for draft-ietf-avt-profile-new-00 Added -double_speed (16kHz) option Transcoder no longer hits stdin/stdout with audio ioctls Rewrite and optimize decryption of RTCP packets RTCP timer reconsideration done for every RTCP packet received (following presentation at Memphis IETF...) RTCP SR and SDES fixes Can now send/display PHONE, LOC and EMAIL SDES items. Fixed mike mutes net operation for half duplex cards. FreeBSD port now works. Win32 version uses registry to store defaults. v3.0.21 Added signal handler, to catch SIGINT and exit cleanly (with RTCP BYE) Linux device driver now accepts 16kHz operation. Assorted bug fixes to Linux device driver. Initialise device_time variable: prevents crash if we can't access the audio device. The use of strdup() interacts badly with xmalloc(). Fixed. Fixed transcoder RTCP BYE handling * Branch here: v3.1 development starts, later v3.0 fixes will have to * be forward ported v3.0.22 Remove debugging messages in statistics.c Remove WBS codec Remove -double_speed option v3.0.23 Linux port uses both audio channels, rather than just the left channel Linux port no longer repeatedly resets the volume to 50% Bug fix for HP-UX audio driver (Terje Vernly ) Fix CPU usage on Win32 v3.0.24 Fix encryption Fix loopback of packts Fix crash in LBL conference bus code, sending focus when the CNAME was NULL Fix RTCP header validation Fix RTP header validation when padding bit is set Fix voice switching of video using LBL conference bus with vic Modifications to WIN32 silence detection as PC hardware often breaks previous algorithm. Assorted Win32 bug fixes Win32 HOMEDIR bug fix. 3.0.25 Assorted Win32 fixes. 3.0.26 Fixed bug in net.c that caused packets to cease processing on some Win32 boxes. 3.0.27 Fix transcoder problems on half-duplex machines. Thanks to Sachin Sheth for providing the fix. Fix fonts for solaris 2.6. * Released 15 August 1998 3.0.28 Update copyright notice (the dates were wrong!) Endian fix to the RTCP packet forwarding code (Thanks to Sachin Sheth). Fixed HOMEDIR problem introduced in 3.0.27 for Win32. Fixed catch when sourcing ~/.rat * Released 22 September 1998 3.0.29 Added -smallui option to use relate interface and to enable power messages via the lbl confbus Fixed -drop option * Released 21 December 1998 3.0.30 Fix statistics in RTCP SR/RR packets Fix copyright notice in small UI Fix URL in the about panel * Released 6 January 1999 3.0.31 Remove obsolete tcl/tk library code Fix tcl/tk configuration on win32 Move to using winsock2.h on win32 * Released 29 January 1999 3.0.32 Fix Tk resource files on Win32 * Released 4 February 1999 3.0.33 Fix font in the statistics panel, which I broke in 3.0.31 (oops!) Added A-law audio codec. Back port from 3.2x. Added MMX mixing support. Patch from Michael Wallbaum for transcoder on win32. Made file processing use binary mode opens. Win32 cares. * Released 1 March 1999 3.0.34 Removed -D$(USER) from Makefile (Reported by Ola Borrebak). Added alaw to command line codecs (Reported by Dimitris Terzis). Winsock 1/2 detection and selection. Bug fixes for Winsock 1 built with Winsock 2 headers. v3.1.0 Added the wide-band speech codec (use with the -double_speed hack) Cleanup statistics.c Fixed Win32 cname Made left mouse button on participants toggle stats on and off Keep input/output mode selection and gain settings when device trading Reorganize the codec_* files Add indication of loss rat to UI Add automatic gain control Fix CPU usage on Win32 GSM now implements 06.11 repair (so there) Fixed self induced LPC bug :-) Improved cushion code to give lower delay Completely fixed highlighting (honest) v3.1.1 Default RTP port is 5004 (draft-ietf-avt-profile-new-00) Turn off automatic gain control in the transcoder Linux port uses both audio channels, rather than just the left channel Linux port no longer repeatedly resets the volume to 50% UI user participant code now maintains sorted list No longer source $HOME/.rat on startup Separate the UI from the media engine (use conference bus for communication) v3.1.2 Many changes to the conference bus protocol and support code Allow multiple UI scripts (use -ui to select) Unify Linux/FreeBSD drivers into auddev_oss.c Fix HP-UX audio driver (Terje Vernly ) Fix encryption code on little-endian machines Fix RTCP header validation code Fix security hole in confbus (zap [] in strings send to tcl) Add Anna Bouch's UI code (use "-ui anna" to enable) Add ReLaTe UI code (use "-ui ReLaTe" to enable) v3.2.0 - Codec interface rewrite. Based on structure holding all codec parameters and pointers to init/encode/decode functions. - Multi rate support. Multiple clock support (one per participant plus a few internal ones to keep RTCP etc working). - Rewrite of transmit code. Circular buffer is gone and now a list of minibufs is used instead. Within each minibuf the unit_size (which is calculated from number of channels, freq etc) remains constant. - Rewrite of receive code to support multiple unit_sizes. Now each receiver has a separate receive buffer. Within each buffer units of different length can be mixed without any problems. The only restriction is that for any particular time segment all coded_units must be compatible (i.e same length /frequency/channels etc). - All the code understands number of channels, variable unit sizes and multiple frequencies. This information is deduced from codec information. This includes mix and statistics... - Added hooks for up and down sampling of remote participant decoded audio. - Cleaned up include file mess. Now each source file includes only required headers. In the process of doing so I cleaned up a few interfaces so parts of the code that do not need to know about structures don't see the definitions and work with pointers. - Various old and new bug fixes :-) - Probably some more changes that I can not remember now as I didn't bother to write them down as I was doing them ;-) - Reimplemented repair code from previous release and left hooks for pitch repetition and pattern matching. Now repair is multi-channel and multi-freq. - Centralized allocation of rx_queue_element's. - Added CD input support - Assorted bug fixes to the original UI - Add reception quality chart to the original UI - Fix encryption code on little-endian machines (again) - Cleanup RTCP code and headers - Many changes to the conference bus (Mbus) code - Assorted bug fixes to the transcoder - SGI version now sets initial volume to something sensible - Incorporated Luigi's mods to FreeBSD driver - Added Pattern Matching repair - Fix loopback of RTP packets - Modified rules_based_silence to work at rates other than 8K. - Add balloon help - Fix RTP header validation for packets with P bit set [Bill Fenner] - Fix transcoder timing (RTCP packets are sent much too often: loopback problem...) - Fix freeing of units held in the receive buffer, when an RTCP BYE packet is received. - Seems that FreeBSD (unlike the rest of the known universe...) has a SO_REUSEPORT, which we need to set if we're doing TTL zero multicast. Sigh. - Fixed timer code - works with all freqs that divide into 96000. - Added channel coding functionality - it should now be possible to slot in any scheme. - Reimplemented redundancy to comply with new channel coding regime. - Added interleaving. - Fix decoding of encrypted packet (no longer blocks...) - Fix encryption code on little-endian machines (again, again!) - Fix fragment size on Linux - Added header extension support. - Remove LBL conference bus support (exercise for the reader: write an Mbus to LBL conference bus bridge, to allow device trading...) - Add binding for Control-Button-1 to mute individual participants - Add lip-sync support - Major UI rewrite - New silence detection algorithm. - Fix parsing of RTCP SR/RR packets on little-endian machines - Fix of decoding path - repair works again now. - Separated out cushion code (cushion.[ch]) and cleaned a little. - Separated out the UI update code from the Tcl/Tk maintainence code. - Modularise Mbus code - Stereo (?) - Time code simplified. - Multi-channel silence suppression. - Misordered packets counted. - Remove NET_MUTES_MIKE and MIKE_MUTES_NET options. We now require a full duplex audio device to operate. This should not be a problem, since such hardware is readily available for all platforms we care about (and some we don't...). - Minor memory allocation optimization for native units and mbus block_alloc replacing xmalloc for fixed size allocations. - Modularisation of silence detection and voice activity code. - Transmit buffer simplification. - Changes labels on preferences panel to match sdr, since it makes sense that way, and the old labels were broken dammit! (and I don't care if they were the ones Windows uses....) - Remove flakeaway options (Cadbury's must hate us...) - Create RTCP database entries for new sources when we find them in SR/RR packets, rather than ignoring them. - Fix operation with -no_ui. This is not very useful though... - Hack the RTCP decryption code to accept encrypted packets from vat, even though vat sets the padding bit incorrectly, and gets the length of encrypted SDES packets off by one. - Fix source address checking in the mbus code - Added sampling options to transmission menu. - Added destruction code to coders and channel coders. - Make sure the random number generator is initialised before use. - Rejigged code to allow hot swapping of sampling format mid-session. - Fix RTCP reporting interval, when running at other than 8kHz - Change of RTCP reporting interval when freq changes. - Replaced old AGC code. - UI tweaks, bitmaps, titling, about panel. - Playout point limits now optional. - Allow for remote ui, enable with "-ui " - Watch for transmitter device clock being slower than ours and corrective action. - Cushion decrease only when not playing audio - stops interruptions. - Allow `wait for mbus init message' on startup with "-wait" - Redundancy new format - mods to rfc to match implementation. - Removed auto_path initialisation from init.tcl and aatk.tcl. - Interleaver (mk II) no longer halts the system (or works). - Powermeters frequency independent. - Own activity only sent when changing state. - Activity changes no longer refresh participant info. - Playout buffer size monitoring and device drift bias correction. - Fixed problem with codec recognition at startup when rate not 8k. - UI displays correct encoding with interleaver and redundancy. - Wrote a configure script - Graceful failure/stasis when device not available. - Bitmaps match audio i/o ports at start up. * Released to CAIRN/MECCANO for testing, 8 June 1998 v3.2.1 - Assorted tweaks to the UI - Cleanup mbus_encode_str interface - a small change to function rx_source_playout in mbus_engine.c - fixed bug in ui_update_video_playout - lip-sync support - play audio packets in no lip-synced mode when no RTCP SR is received even if lip-sync is enabled. When SR is received, switch to lip-sync mode - bug in mbus resend code fixed. - Cleanup parsing of command line options - Add patches for HP-UX 10 from Dirk Meersman - Remove HP-UX 9 compatibility: it makes the code cleaner, and HP-UX 9 is completely obsolete anyway. Now if only we could do the same with SunOS 4... - Only allow lip-sync to be enabled if we are not running on the Mbus base c hannel - Table for format conversions. Windows ACM PCM Converter support. * Released for testing, 10 July 1998 v3.2.2 - Fixes for command line option parsing - Improvements to playout calculation (less togged) - Increased audio in receive buffer to be 1 cushion's worth. This makes handling "fast" senders easier and also reduces togged units - tcl2c now strips comments, 10-40% size improvement on tcl strings (UNIX only). - Removed fixed tables for g711 conversion. Now calculated at start time. - Increased minimum pitch length in pattern match repair (less pings). - Add support for TclX, and profiling of the tcl code - Attempt to optimize some of the more intensive Tcl routines - Reduce rate of power-meter updates, since profiling shows that is an expensive operation. - Added playout buffer size to participant info - Converted jitter into ms for ui - Increased initial estimate of jitter, and codec independent - Reduced average playout delay, now just add/subtract cushion surplus instead of whole cushion length to playout, i.e. we add exactly the right amount. - Rearranged files for more portable Windows configuration. * Released for testing, 17 July 1998 v3.2.3 - Added button in the UI to enable sound externalisation (the actual 3d audio code is not present yet). - Fix display of loss rates in the participant list ("loss diamonds") - Updated sdr plugin (in sdr v2.5a4) - Change initial silence detection threshold, such that we transmit until the detector has trained rather than suppressing. - Win32 release configuration added. - Added reset of saved settings when version change detected. - Minor change to low jitter playout handling. - Fix parsing of -K/-crypt options - Endian fix to RTCP packet forwarding code - Remove TclX support (as part of the planned move to using the Tcl plus-patch to cleanup the initialisation code). - Fixed playout point calculation problems. Playout buffer should now have same order as source timestamps, no overlaps allowed. - Powermeters tweak. - Move to winsock2.h, in preparation for IPv6 port. NOTE: This now requires that winsock2.dll is installed on Windows. - Win32 ACM G.723.1 code. * Release for testing, 24 August 1998 v3.2.4 - Cleanup networking code - Cleanup RTCP code - Only send an RTCP BYE packet if the number of members is less than 50. This means we just-about comply with the latest RTP draft, although we should really implement BYE reconsideration. - Fixed bug introduced into repair code. - Increased powermeter rate and added table to improve vu performance. - RTCP timeout frequency independent. - Got ride of speaker table code. Highlighting is now from when playout buffer created destroyed. - Fix GSM codec * Release for testing, 10 September 1998 v3.2.5 - Fix transmission mute/unmute * Release for testing, 10 September 1998 v3.2.6 - Move all system specific configuration options and includes into config_unix.h and config_win32.h to ease porting. Should also simplify things when we move to a common code library among the UCL tools. - Audio loopback in hardware for Solaris/SunOS and Windows. - Moved select on audio_fd out of networking code. - Centralized code that destroys and empties playout buffers. - Added "net mutes mike" and called it "Silence Suppression". Works off of creation and destruction of playout buffers. - Assorted UI tweaks - Move to using our own version of tcl/tk on unix machines, to avoid the problems with initialisation scripts being sourced from other installed versions. We no longer compile the tcl or tk initialisation scripts into rat. - Merge GSM codec into codec_gsm.[ch] - Modularize networking code - Mbus code now batches messages before transmission, to reduce the number of packets sent - Update Mbus command set to better match latest specification - Add 3d audio code - Add IPv6 support under Windows NT 4.0 using the stack from Microsoft Research (http://www.research.microsoft.com/msripv6/) * Release for testing, 9 October 1998 v3.3.0 - Audio interface revamp. Support for multiple cards. - Osprey SunVideo Plus audio support added (buggy). - PCA audio support added on FreeBSD (builtin speaker). - Documented audio interface. - Replaced audio_fd with audio_device to emphasize this is no longer a file descriptor. - Added null audio interface for devices not attainable. - Safety net when opening an interfac - Fix LSR and DLSR in our reception report packets (maybe) - Fix muting of individual participants - Update mbus command set - Added virtual externalisation (sound source emanating from outside the head even when listened to with headphones) - File loading and saving added. - Playout calc refinements. - Repair schemes given queryable interface (like other modules). mbus and ui updated to reflect this. - Fix for fatal bug in channel decoder arising from duplicates and interaction with playout buffer. - Merge in IPv6 fixes from Maryann Maher - 3D rendering code added, debugged, and integrated into UI. - Audio device interface changes - input format may differ from output format. - format conversion in audio interface if dev does not support required format. - Win32 RTCP tool includes OS version of end host. - Win32 Multiple audio device support bug fixed. Uses matching card and mixer. - Fix stereo powermeters (work). - Convert to use the common code library - Disposed of old packet queues, now use simpler buffer and no nasty macros. (rx queue still there, when there's time it goes..) - Re-wrote codec interface. Codec wrappers appear in files codec_*.[ch] and codec implementation files appear in cx_*.[ch]. - codec_t axed and replaced with codec_id_t. Look at codec.h for manipulation functions. - Codec repair functions appear in codec interfaces rather than reair function. - Removed all RAT dependencies from codec code, repair code, 3d code, appart from a few basic types i.e sample, audio format, and coded_unit. - Disabled all channel coding except vanilla. All to be re-implemented. - Added ability to read number of samples written to and read from audio device. - Made audio device id's (handles) mirror codec id's. We now always have a valid handle for a device, and can read/write to it. - Removed interfaces.[ch]. - Replaced receive.[ch] with source.[ch] and replaced playout buffer code with playout.c. - Rewrote channel coder interface to be cleaner. - Removed unnecessary dependencies in rate and channel conversion code. Conversion routine now uses coded_units for input and output. - Moved codec_state_list onto source structure and channel_coder_state. - Fixed dependencies in repair and 3D rendering code. Their only dependencies are now the codec files. - Made converter interfaces same as audio device and codec interfaces. - Changed 3d rendered to always output stereo. - Fixed potential problem in 3D code where the audio frame size being passed is smaller than the delay the render applies causing samples to be shifted over the stack. - Added tests directory where people can through tests for modules if they care. So far have added test_3d.c which found the last problem and native.c used to fix bug in native coding types. - Fixed nasty bug in 3d rendered where at high sampling rates the delay size is larger than the storage buffers between intervals causing memcpy to overlap src and dst areas. - Fixed bug in vdvi frame peek code and sizes returned by vdvi_{en,de}code. All codecs pass tests in test_codecs. - Wrote timestamp code that allows easy comparison between multi-rate clocks. - Added first order differencing for sequences of timestamps so wraps in 32 bit clocks do not cause discontinuities in modulo m clocks and vice versa. - Added iterators to playout buffer. - Updated transmitter to use playout buffer with multiple iterators instead of former custom list code. - Modified channel code and source code for playout buffer iterators. - Fixed widgetabbing (due to missing tk library scripts). - CNAME now uses the IPv6 host address, if running on IPv6. - Move mbus heartbeat into the common code library. - Repair and duplicate handling put back into new decode path. - Separated sample ops into audio_util.[ch]. - Added MMX mixing code for Win32. - Moved bias control out of session pointer and into transmitter. - Removed support for multiple mbus channels. - Removed unnecessary include files from assorted source files. - Cleaned up device reconfiguration code. - Fixed l16 48k stereo name - was incorrect. - Renamed certain functions to make names congruent to group of calls. - Removed input_mode and output_mode from session_struct. - Restored playout buffer length reporting functions. - Added source flush if mix fails (source sample rate change). - Added repair failure code, should only fail if sample rate changes. - Added codec list option (-codecs) for launcher apps to know what is available. - Added payload mapping from UI. - Added Sun's G726 public reference version. - Redundancy encoder and decoder re-written but not linked in yet, needs debugging. - Rewrote win32 mixer interface code. No longer use string matching with pre-defined english names. Still have to use some string matching but only between names various controls from the driver spit out. Took circuitous route since no two driver vendors implement mixer functions in same way. Seems to be stable now. - Modularized audio ports so that device interfaces now return audio_port_details_t that contains string name and unique input/output identifier to be used for port selection. - Modified UI to have transmit and receive checkbuttons and replaced bitmaps with string names since we cannot guarantee win32 port names and changing between bitmaps and strings in the ui is ugly. - Fixed transmitter bug where temporary audio_buffer iterator was not being freed. v4.0.0 - Update license agreement -- we now use a standard Berkeley style license for all files. See the file LICENSE for details. - Removed output_gain and input_gain from session_struct. Should fix output gain going to zero on some updates. * Released 31 March 1999 v4.0.1 - Clarify license -- the LICENSE and COPYRIGHT files contradicted each other, we now only have one file (COPYRIGHT) which is a standard Berkeley style license. - Fixed problem with pseudo-devices (auddev_null and auddev_pca) that use gettimeofday to calculate how many samples are available. They were failing to include number of samples included in "device" buffer left over from previous reads. This meant device time was always slow. - Go back to ssrc rather than cname in UI for indexing entries. Issues running multiple instances on single machine otherwise. - Playout buffer skew adjustment added so when playout buffer deviates from expected size because source clock is different and signal is temporarily silent an adjustment is made. Only intervals when adjustment made is when packet has arrived in current processing interval so we do not adapt at the end of talkspurts. - Made repair and converters communication like that of input and output ports in ui. i.e. tool.rat.converters.flush, tool.rat.converters.add, tool.rat.converter. Defaults for repair and conversion are first type of module. - Issues with mixing multi-rate fixed. Existing code was not accounting properly for different sample rates when positioning new mixer head time. This probably got introduced when the time stamp method got changed since it definitely worked before (honest). - Added status bar's to file window. Hopefully clearer what is going on. Attempted fix button of state problems. - Caching of previous talkspurt jitter. Previously a fresh guess was made at the start of each spurt. - source_get_playout_delay now includes audio we believe to be in device buffer. So buffer shifts now work with cushion...hopefully. - Added counter for skew adjustments to make adjustments less aggressive. - Win32 mixer corrections - mixer control code now works with all the cards we have. Let this be the end of it! - Added read_and_discard for reading all available packets and discarding them. This is needed because there is a long delay between opening the socket and the first read (due to ui startup, audio device startup, etc...). As a result lots of audio was getting buffered at receiver with continuous sources at start up. - Fixes to linux audio driver - Fixed initial playout delay estimation. - Stopped interaction between skew ajustment and repair. - Assorted bug fixes to the UI - Attempt to get participant highlighting correct - Blending on samples dropped because of skew not quite there. - Added unsigned 8 bit to device formats and added to conversion routines. - Partial SoundBlaster support on FreeBSD (out s16, in u8). - Initial code for the move to using the RTP library - not used yet - WAV file MAKEFOURCC bug fixed for non-Win32 little endian machines. All platforms should be able to read WAV and AU files. - Changed skew adjust back so it invokes repair to cover would-be gap. - Enhanced sample drop during skew detection. Period that can be be dropped determined by pattern matching samples in frame to to have samples dropped in. Then blend in start of what would have been played to match point. Quality improvement more than compensates for extra cpu cycles. - Redundancy encoder working again (95% confidence :-). - Added dismiss button to file dialog. - Add support for DES encryption to the mbus (on by default). - Fix encryption. - Fix UI codec failure when changing sampling config and no codec with same friendly name exists. Also fix for redundant codec displayed when primary updated. - Add timestamp to mbus packet headers - Reorder initialisation sequence, to handle the new requirement that the mbus can only send reliably to those entities we've received a message from previously. This probably means that the wait-on-startup hack for ReLaTe is broken, but we don't care since the entire initialisation sequence needs redoing anyway (the Bremen PSTN-to-Mbone gateway needs more fine grained control than is possible with the current startup sequence). - Fixed size of participant window so user can see 2 layers of encoding when redundancy in use. - Fixed channel coder reconfigure issue when changing sampling mode. - The name of the RAT binary now includes the version number. - Fix muting of individual participants. - Added G726-16 using code from Marc Randolph's patch on comp.speech. - Add sdr plugin (not tested) - Fixed decoding preference problem when redundancy used. - Fixed source muting (we discard the packets in statistics, rather than not mixing source). - Removed -drop command line option. - Moved codecs that had CODEC_PAYLOAD_DYNAMIC into unassigned and dynamic range so they are available in transmission panel. - Removed half-duplex cards appear in devices list on Win32. - Fixed ui update when switching channel coder. * Released 14 May 1999 v4.0.2 - Added message box for win32 users who launch with no command line options, giving usage instructions. - Added WSACleanup() to shutdown win32 sockets nicely. - Fix inet_aton(), which prevents a crash on startup on Windows NT service pack 3 and some versions of Windows 95. * Released 15 May 1999 v4.0.3 - Fix compilation with v1.2 of the Microsoft Research IPv6 stack. - Catch WM_DELETE for preferences window. Reported by Atanu Ghosh. - Check address and port is valid in command line parsing so we don't dump core later. Reported by Lorenzo Vicisano. - Unrecognized options are ignored, but no longer stop processing other options. This means that "rat-4.0.3 -f pcm -t 64 224.1.2.3/1234" now sets the TTL correctly, even though the -f is unrecognized, meaning that we can start rat via sdr. Reported by Terry Gibbons. - Fix occasional assertion failure in mix.c:133 `len < ms->buf_len' (it looks like the condition in the assert is off by one, should be 'len <= ms->buf_len'. If this doesn't fix it, there's a check around line 242 of mix.c which sets things up so we don't overflow the buffer - we just decrease the amount we write by one sample there instead. Reported by Roy Bennett and others. - Fix payload type mapping for PCMA-16K-Stereo. - Mapping for existing rat/vat codec names. - Primary payload type mapping using -f. - Secondary payload type mapping using -f also. - Fix restoration of previous audio port settings from saved values. - Separated sound file handling into sndfile_wav.[ch] and sndfile_au.[ch] - Added support for default sndfile extension if none specified. Win32 -> wav, others -> au. - Added support for writing alaw and ulaw. - Updated man page. - Added sndfile_raw.[ch] for handling raw files. - Added sndfile_valid_format. - Fixed spurious debugging code in the windows audio driver which would cause an infinite loop if activated (rare, but could happen). - Split converter code up into convert_*.[ch] and added convert_types.h - Fixed repair when next unit on playout buffer is less than expected length away. - Compilation fixes for Irix 5.3 contributed by David Balazic. - Some linux audio drivers, in particular the ES1370 used in the SoundBlaster PCI 128, don't support /dev/sndstat. Rewrite the query functions to work with /dev/mixer instead. - Handle known skew in the audio sampling rate for those linux audio drivers which report it. - Added 'high quality' converter, sinc filter. * Released 2 June 1999 v4.0.4 - Add ability to receive on one port yet send to another, requested by Henning Schulzrinne. Usage: "rat addr/rx_port/tx_port" - Compilation fixes for Irix 6.5 contributed by Bob Olson. - Fix core dump caused by calling sndfile_write_audio with buffer length of 0. - Fix core dump when called with invalid command line arguments, reported by Marcus Meissner. - Fix passing of encryption key across mbus, reported by Ed Whelan. - Remove support for the -wait option. This means we can't work with the ReLaTe interface anymore but, once the split into multiple processes is complete, ReLaTe will be able to drive the media engine directly. - Remove most of the transcoder support - it didn't work anyway, and needs to be reimplemented from scratch. - Start the split into multiple processes: media engine, user interface and controller. - Added basic layered channel coder. Usage: rat -l n
/
/, where n = no of layers and there is an address and port for each layer. Only works with the WBS codec at present, and probably not very well at that. - Move the code to load and save settings into the media engine, and out of the user interface. - Fixed WBS codec so that it works with different endian machines. - Added hash table to settings_load. - Fixes for 64 bit IRIX from Peter Orbaek - Some codecs' default payload values clashed with RTP spec: PCM-16-K Stereo was 76, now 124; GSM-16K was 72, now 118; GSM-32K was 73, now 119; GSM-48K was 76, now 123. * Released 7 July 1999 v4.1.0 - Fixed slow memory leak reported by Emmanuel Duros. Vanilla decoder was not checking all pb_add functions returned success and so pointer was getting trashed. - Fix RTCP RR DLSR field when reporting on a source from which we've received no SR packets. - Changed drop preference for incoming packet buffer overflows. Now drop incoming packet rather than earliest packet in buffer - makes source packet processing better ordered. - Remove address sanity checking for the layered coder from the command line parser: it should be done when the socket is opened since that makes the code address format agnostic. - Added network_exit. - Added per source gain control. Now appears in participant panel on audio pane. Suggested by Jerry Isdale. - Fixes for the Detexis Musica IPv6 stack on Windows NT. - Send rtp.source.cname messages to the video tool when lip-sync is enabled, so it can match sources up to those in the video session. - Cleanup documentation of the audev_*.c files - Fix loading of preferences: powermeter, lip-sync - Fix the fileboxes on the Windows release version. - Fix spurious transmission of tool.rat.lecture.mode() mbus messages - Fix spurious transmission of rtp.source.active() mbus messages when we are sending. - Fix (hopefully) assertion failure in the mixer when trying to zero blocks longer than the buffer. - Improved layered channel coder, thereby making it incompatible with 4.0.4. - Added persistent database pdb.[ch]. - Moved render_3D_data from the rtcp database into persistent database as first step towards using common rtp code. Lots of other fields to do, but looks to work in principle. - Add RPM spec file for RedHat Linux. Based on that contributed by Stephen Adler - Convert to using the RTP code in the common library. - Fixed getenv not checking for null string after getenv in auddev_osprey.c. Reported by Dirk Kutscher . - Add playout_calc.[ch]. - Add ts_mul and ts_div to keep playout calc clean. - Change default units per packet to 1, since PIPVIC2 says that the end to end delay is too large otherwise. - Rewrite the reception quality matrix - Consistency changes: audio device and repair query now consistent with the majority of interfaces. - More consistency changes: channel_get_coder now consistent with other interfaces. - Add ability to mtrace between participants by clicking on the squares in the reception quality matrix - Split setting load between .RTPdefaults and .RATdefaults. - Add cutesy popup boxes to the reception quality matrix - Add device buffer occupancy check to auddev_luigi to try to fix sb16 problems. - Add toged and cont_toged back. - Move source_check_buffering into rtp_callback. - Fix mixer handling overlapping blocks. - Changed win32 audio read and write methods, added audio event to reduce CPU usage. Fixed handling of non-blocksize writes. - Modified auddev_null on Win32 to use WaitForSingleObject rather than Sleep on Win32. Reduces CPU considerably. - Added colour to powermeters. - Add fixed size packet buffer to make for easy discards when media engine has blocked for an inordinate period. - Added source_get_bps (bits per second :-). - Removed gain setting stuff from luigi_audio_open. Problems reported by Bill Fenner and code purpose is defunct. - Complete split into media engine, user interface and controller processes. Only works on Unix at present, still debugging the Windows port. * Released 5 October 1999 v4.1.1 - Added transcoder audio device. Contributed by Michael Wallbaum - Now send RTP BYE packets on exit - Fixed converter table initialization. Was not initializing interpolation and extrapolation correctly after last consistency update. - Unrolled loops in extrapolation converter. - Replaced divisions in interpolation converter that were not powers of two with a multiplication scaling factor and a power of 2 denominator. Improves performance 3-4 for upsampling by 3,5,6. - Fixed 2 step sample rate conversion support. - Fixed Windows port. - Initialize sp->cur_ts in main_engine, before tx_start. Should fix occasional assert failure during transmitter startup. - Put cont_toged check into source_process packets. Added check for cont_toged in rtp_callback. - Added time constants and replaced lots of ts_map32 functions with them in source.c. - Rewrite initialization and rendezvous code between the controller and the user interface and media engine. This should remove many race conditions and generally clean things up and make them more reliable. - use mbus_rendezvous_waiting() and mbus_rendezvous_go() - do a real handshake between controller and the subprocesses - Fix parsing of many command line options. NOTE: many of the options are parsed in a backwards incompatible manner now, to make the code cleaner. - Tuples for mbus command switches in mbus_{control,engine,ui}. * Released 2 November 1999 v4.1.2 - Added echo suppression back, it fell out of code base at some point. - Fix ui sending input and output gain values before it's got values from audio engine. Was happening because scale widget invokes -command option when created. Now we don't send gain info until we've heard some from engine. - Add signal handler to main_control. - Add back default port 5004. - Fix luigi_audio_drain to reset, sync, and trigger reading. - Moved packet reception handling from rtp_callback to source_add_packet. - Changed playout buffer length estimation to use transit times and average transit. Previously used observations of playout buffer lengths, but this maybe unreliable due to packet losses. - Revised skew adaptation. Now compares transit time in use with transit average, instead of monitoring playout buffer length which is tainted by packet losses. - Playout variable now refers to playout offset only. - VAT style reduction in playout estimate when marker bit set. - Playout recalc trigger when jitter > playout. - Device reconfig no longer resets ports if device unchanged. - Shuffled front panel. Added bps field. - Changed source processing to use next_played rather than last_played. Cleans some processing issues up and allows for codecs with non-constant frame durations. - Added source_get_skew_rate to return relative skew. - Added skew to stats panel. - Made stats panel consistent with UI. - Split reception panel into Decoder and Playout. - Added note field for local user. - Playout calc revisions: only update transit if: (a) source is new. (b) source quiet for longer than transit_reset period. (c) playout re-calc triggered by toged_cont. - toged_cont is now no. thrown on ground in last 8 packets. - Global change of integer types, and removal of compatibility defines: u_int8 -> u_int8_t u_int16 -> u_int16_t u_int32 -> u_int32_t and the same for the signed varients. - And change them all to be uint32, etc - Packet spikes now accounted for in packet processing. Transit average and playout not updated during spike period. - Playout panel now displays spike info also. - Mbus updates from Markus Germeier, which fix compatibility with the Uni Bremen implementation: - mbus.bye() signals an entity when it leaves. (mbus.quit commands an entity to leave) - Generate and work with 64 bit DES keys. Generate parity bits for key. - mbus_heartbeat(m, 1) should send an mbus.hello() every second and not every two seconds - HMAC-MD5 should read HMAC-MD5-96 - Honor the MBUS environment variable for the MBUS configuration file - The TZI Mbus implementations generate spaces in configuration file, which mislead the UCL Mbus to dump core. - Allow Spaces in .mbus - Address must be unique - Delete failed reliable messages if err_handler is present - Fix uninitialized use of session->last_update in RTP code - Fix assertion failures in RTP library when sending RTCP packets - Recognize, but ignore, profile specific extensions to RTCP SR/RR packets - Update RTCP reporting interval calculation - Implement reverse reconsideration of RTCP reporting interval - Implement encryption in the RTP code - Fix redundancy decoder - Fix path searching when starting subprocesses - Add patch matching segment insertion when correcting for slow sources - Migrated Makefiles and Headers to use autoconf - Fix crash on exit - Fix system name in tool version - Add version number to mbus config file. Should prevent crashes when we update the format of that file. - Set thread priority of media engine to THREAD_PRIORITY_ABOVE_NORMAL on Windows. - Fix CPU usage of UI - Update to common library 1.0.10 * Released 13 December 1999 v4.1.3 - Rename common library to libuclmmbase.a on unix - Update RPM spec file - Update installation instructions - Fix "-t" option, to set the TTL. The v4.1.2 release would always send with TTL=15, making it useless for wide area. - Fix assertion failures in source.c - Cleanup code for updating SDES items in the UI - Remove core files & directories on "make distclean" - Add check audio in adjusted playout point packets can be played out and correct if would be dropped. - Add failure return option for pattern matches used in skew detection. - Add session_validate(), source_validate() and pdb_item_validate() debugging routines. These mostly just check a magic number stored in the structure, to check that the structure hasn't been totally corrupted. There's a lot of scope for extending them in future... - Waveform repair schemes now use last available native coding. - Minor decode path change. Decode, sample rate conversion, 3d rendering, gain scaling, are all performed if no native coding available rather than individually test. Fixes problems introduced with media_data duplication in playout buffer shift code. - Various fixes for potential buffer overflows - Update copyright notices to welcome in the new millennium - Fix mbus address of the media engine (had a spurious space in instance:pid) - Remove lip-sync command line option and toggle button in the user interface. - Automatically enable/disable lip-sync when we detect a video tool via our mbus interface. - Rewrite the lip-sync code to send our playout delay to the video tool. We send "rtp.source.playout(ssrc delay-in-ms)", which might be sufficient. - Added back backwards compatible name mappings for command line parsing. - Robustified command line parsing of codecs. - Fix ordering of command line argument parsing. - Accept -crypt as a synonym for -K. - Add encrkey field to the session struct. - Fix encryption key handling at startup. - Fix saving of audioChannelParameters setting. - Fix use of mbus structure after freeing it. - Fix freeing of memory on shutdown. - Add assorted debugging code. - Fix reception of RTP packets with padding (this is what caused a crash when using the GSM codec with encryption). - Update for changes in the mbus library. - Add format conversions for a-law devices. - Incorporated auddev_atm.c and wrote auddev_atm.h. * Released 31 January 2000 [X3D SDK CDROM] v4.1.4 - Fix dependencies in Makefile for rpm target - Fix handling of odd numbered RTP ports (pick next lower port). - Fix loopback setting load and carry thru when changing device. - Fix -version command line option. * Released 1 February 2000 v4.1.5 - Add support for ALSA audio drivers on Linux, contributed by Robert Olson of Argonne National Laboratory. - Add rtt calculation to rtp_callback.c. - Fix don't start mbus and processes if no command line args given. - Add controller validation of command-line addresses before launching sub-processes. - Fix controller only quits upon hearing byes from one of it's children. - Add playout buffer debugging/validation code. - Add engine parsing of sdes commands accept my_ssrc as an acceptable ssrc identifier. Then control does not need to know to set name, etc, from command line. - Add check in settings that sdes values read in are not already set. - Add filter on rtt values to avoid displaying garbage values from rtp misimplementations. - Fix participant muting (reported by Bob Olson). - Correct size of pb->buf allocation in pktbuf.c. - Fix slow memory leak in pktbuf (didn't free pb->buf). - Removed unused variables from the session struct - Add checks for sp->ui_on to the user interface dispatcher code. This has currently broken the user interface, but is needed to make the initialization sequence reliable. - Major update to the initialization sequence - media engine solicits for the user interface - user interface requests state information from the media engine - split ui.c into ui_send_*.c - Load/save the note setting. - Remove all traces of operating specific defines. Configure no longer subsitutes operating system. - Fix @OSTYPE@ in SDES Tool field (broke with latter). - Add SIGCHLD to main_control to shutdown process tree when child processes die in a timely manner. - Fix shutdown sequence. - Patch G711 A-law, Sun's reference implementation had a few glitches and you only notice when speaking with real h/w implementations. - Update README.mbus, giving documentation of how to remote control RAT using the message bus interface, and how to replace the user interface by one of your own choosing. - Fix two step sample format conversion assertion failure. - Fix device sample conversion layer freeing already freed pointer when swapping between devices with and without layer. - Add RTCP DELETE messages trigger deletion corresponding pdb entry and source (if relevent). - Tweak source ageing, to fix problems with users being hilighted after they finish speaking. Problem occured if less than 50 packets arrived in a talkspurt. - Save settings now passes through settings file, replacing entries RAT has update values for, and then appends entries not in settings file. Requested by Frode Kileng. - Add use of username when no RTPdefault exists for participant name. - Fix handling of audioInputMute in RATdefaults. Reported by Frode Kileng. - Fix rtp.source.active for local user in response to rtp.query(), didn't highlight local users transmit state. - Update SDR plugin. - Transfer string associative array code out of settings.c into new common library files asarray.[ch]. - Fix -allowloopback option. - Add controller checks for child process termination on Win32. - Add message loop and watch for WM_DESTROY to controller. Will now shutdown engine and ui when Win32 task manager sends these. NB, Visual Studio debugger terminates processes and still leaves children running. AFAIK there is no way for children to spot this, i.e. WaitForSingleObject watching process does not appear to work for children watching parents. - Use _vsnprintf for snprintf functionality on Win32. - Fix "make tgz" target to include the sdr plugin * Released 14 February 2000 v4.1.6 - Fix Windows port * Released 15 February 2000 v4.1.7 - Update ALSA detection in configure script - Fix display of names when SDES NAME is not known (fallback to CNAME or SSRC in that order). - Add support for the rtp.addr.query() mbus message to media engine. - Remove support for the tool.rat.codec.details() mbus message. - Add support for the tool.rat.codecs.request() tool.rat.codecs.flush() tool.rat.codecs.add() mbus messages. - Add audio clip support to balloon help. - Tidied mixer interface and cleaned session_struct out. - Fix mixer wrap handling for multi-channel. - Fix default device if not present in saved settings. - Add support for rtp.source.mute ("ALL" 0|1), which is much more efficient than iterating all sources over the mbus. - Fix handling of WM_DELETE_WINDOW for the about box - Fix handling of WM_DELETE_WINDOW for participant popup boxes - Remove all "Dismiss" buttons - just close the windows instead - Add balloon help button to the main window, moving the application name to the title bar - Partially fix processing of Tcl events in the UI during the rendezvous with the media engine - Partially fix audio processing on windows 2000 * Released 24 February 2000 v4.1.8 - Partially fix layered codec (recognises multiple addresses on command line but doesn't send to all of them) - Slay zombies when children die - Add repeat+ repair type. It does standard repeat and then reverse blends samples from the end of the previous frame with the start of this frame. Perhaps reduces some glitching. - Add README.reporting-bugs describing "How to Report Bugs Effectively" - Update to the ALSA support, contributed by Bob Lindell of ISI - Add local tone generator. - Add pointer to the RAT users mailing list an open list for discussion of issues relating to RAT. - RTT calculation fix (ntp32_sub was broken). - Add checks to main processing loop for liveness of controller process. - Add checks for sibling and parent process in ui and engine so proc's don't wait for messages that are never going to come. - Change skew correction code to use audio_blend rather than repeat procedure in situ. Fixes a memory corruption bug. - Add null handler for RX_APP to rtp_callback, circumvents abort call. - Add linear8 to sndfile import and export functions. - Add handling to sinc_converter for conversion chunks that are smaller than hold buffer size. We can now convert a sample at a time if desired rather than blocks of at least the duration of the hold buffer. - Add manual silence detection algorithm. - Add UI and settings for silence detection algorithm alternatives. - Add sample rate and channel converter to sound file importer. - Add support for m*11025 native encoding types. Although RAT does not support these sampling rates, one of the sample rate converters supports conversion from m*11025 to n*8000. - Fix noise during sample insertion from skew adaptation. - Fix fatal mix error when downsampling. Trim length did not compensate for the sample rate, causing trim length to wrap and attempt to remove zillions of samples. - Fix mixer rounding error in timestamps vs samples. Would periodically fail mix_verify by 1 otherwise. - Add installer for the Unix ports. This displays the copyright notice, and gets confirmation from the user that they accept the conditions, before extracting the .tar.gz file. Use "make installer" to build and then distribute the rat-4.1.8-installer binary only. - Add transit estimate reset when device format changes at either end. - Add settings to default to first device when device in settings file does not exist on host. * Released 20 March 2000. 4.1.9 - fix configure script handling of X_CFLAGS during broken header tests reported by Atanu. - remove variable component (e->playout) from spike threshold in source processing, believe this is part of the bad spike messages (160>nnnnn). - Changes to Win32 driver read code to remove race condition (audio callback occuring as audio being taken from list of ready buffers). - Move participant database clean up into session_exit. - Destroy local file player and tone generator when reconfiguring device. - Changes to Win32 driver interface write code. Appears to resolve problems with a few troublesome cards. - Replace puts with bgerror where appropriate in ui script. * Tagged 30 March 2000 (not released). v4.2.0 - Fix mixer writing to new head position so it mixes multiple streams again! - Fix phase skips of tone generator. - Add RTP flush after device reconfiguration. - Clean up and fix controller command line parsing. - Remove timers.[ch] to give a single internal representation of time. - Add creation time to mix_create and remove mixer re-sync function. - Fix MMX mix bounds calculation. - Add sample rate factor into cushion. - Change initial cushion value to be more conservative. - Fix entries in cushion histogram being entered when less than minimum allowed cushion. - Remove second audio_rw_process in engine main loop. Process only blocks for audio nowadays. * Released 5 April 2000. v4.2.1 - Fix handling of 8bit PCM .WAV files (unsigned 8bit, not signed). - Fix shuffle participants not to print newline if last entry. - Fix parsing of -t flag, was mis-coded as -ttl in layering command line parsing changes in 4.2.0. * Released 6 April 2000. v4.2.2 - Catch mbus initialization failure and warn user in ui, control, and engine. - Round ttl to maximum of 127. - Change parse_args_early in main_control.c to pass over all args. (problem reported by Didier Lambllais). - Add -N,-E,-P,-L for sdes item setting from command-line (name, email, phone, location). - Fix -f codec communication from controller to engine. - Break controller address and option parsing so options are not communicated to engine before rendezvous has occurred. Otherwise options can be lost due engine's settings_load occuring after rendezvous. - OSS (Linux) audio driver updates from Stuart Levy - Should make mixer controls work with the Sound Blaster Live! cards - Update behaviour of the line-in controls, to hopefully work better with AC97 compatible cards, if you see a difference in the behaviour of line-in please let us know. - Update behaviour of output gain controls, to set all outputs. This probably needs more work, let us know if it breaks anything (the entire OSS audio output control is broken - we need to deal better with the output mixer...) - SGI audio driver updates from Stuart Levy - Add "APanel" input source. When selected, rat carefully avoids ever specifying the input source to the audio library; thus whatever source is selected by the SGI "apanel" program applies. Use this if you have problems with rat switching to the built-in microphone on O2 machines. - If anyone could contribute support for the new (post Irix 6.3) audio library, we'd be grateful... - Fix library ordering in makefile (reported by Stuart Levy) - Document configure options which may be needed to build on Irix in INSTALL.TXT - Fix RTP SR timestamps and RTP jitter calculation. Reported by Robert Olson. * Released 17 April 2000. v4.2.3 - Change the session struct to be a two element array in main_engine.c - Change all references to sp-> into sp[0]-> in main() of the media engine - A few trivial changes to the initialization sequence, in support of the transcoder. There are a number of things which will hinder this: - mbus_rendezvous_waiting() and mbus_rendezvous_go() are incompatible with another mbus needing to run in parallel. - some parts of the code are non-reentrant (i.e. use static variables) and will have to be fixed it's probably not too bad, though. All are wrapped in #ifdef IS_TRANSCODER, for now. - Update OSS (i.e. Linux) audio device detection code - Better card detection and probing - On systems where the audio driver supports two half-duplex devices, rather than a single full-duplex device (e.g. the NM256) we attempt to pair them into a form usable by rat. Reported by Thierry Turletti. - Workaround failure to get host IP address when setting the RTP CNAME (we use user@127.0.0.1 as the CNAME in this case). Reported by Joe Love. - Add support for "-logstats" option, to log RTP and codec statistics to a file. Requested by Anna Watson. - Update "make installer" target * Released 3 May 2000 v4.2.4 - Further updates to OSS (i.e. Linux) audio support - Further updates to support the transcoder - Add -T option to media engine to enable transcoder operation. This will need a custom user interface and controller. - Remove the IS_TRANSCODER defines. - Update installation instructions - Fix buffer overflow when reading from "No audio device". This was the cause of the "playout.c:86: pb_validate:Assertion 'pb->magic==0x83838383' error reported by Christa Wenger, Marcos Bedinelli and Fang Yuan. - Remove spurious calls to tx_process_audio() and tx_send() from the main loop. - User interface hides the main window is hidden until it is finished initialising. This should prevent errors due to manipulation of the user interface before the system has finished initialisation, as reported by Peter Parnes. - Fix reception of packets with an RTP header extension. Reported by Peter Parnes. * Released 16 May 2000 v4.2.5 - Fix assert failure in auddev_trans.c, contributed by Jakub Segen - Fix audio device pairing with the OSS driver, in those cases where there is only a single mixer channel. Reported by Thierry Turletti. - Rewrite code to rendezvous with the controller in the media engine, to support future transcoder operation. - Cleanup main_control.c - code moved into process.c and cmd_parser.c * Released 16 June 2000 v4.2.6 - Compilation fixes for Win32 contributed by Marcin Michalak. - Merge ALSA fixes from Robert Olson - Merge OSS fixes for AC97 based soundcards from Robert Olson: "I went ahead and did the (more) proper fixes for AC97 cards. I don't have a reliable way to detect which cards are AC97-based, so there's currently a hard-coded list of them in the OSS code: "OSS: AudioPCI 97 (STAC9708)", "OSS: AudioPCI 97 (CRY13/0x43525913)", These two are the one that Jay told me about and my ES1371 card. If you have a card that you think this will help for (probably SBLive falls into this category, and any of the ES1371 based cards), you can force rat into AC97 mode by setting the OSS_IS_AC97 environment variable to 1, in bash: export OSS_IS_AC97=1 or in tcsh: setenv OSS_IS_AC97 1 If this makes things work for you, please mail the output of cat /dev/sndstat to rat-users@cs.ucl.ac.uk and we can add your card." * Released 30 June 2000 v4.2.7 - Split main() in the controller into two parts: one for normal operation as an audio tool, one for operation as a transcoder. - Add extra debugging code to transmit.c - Fix buffer overflow in tx_unit_create() - Add missing initialization of reversal buffer for repetition plus (problem reported by Lingfen Sun). - Only perform audio bias removal for live capture, not when reading from a file. This fixes the problem reported by Paxton Smith, where excess RTP packets are sent when playing from a file. - Note that there are still some extra packets sent, due to the pre- and/or post-hang in the voice activity detection code. This makes for a much nicer sound for speech (since we have continuous audio during short (<200ms at present) silence periods, but does cause some spurious transmission in this case. The following #define's in parameters.c can be changed to adjust this behaviour: #define VAD_SIG_LECT 40 #define VAD_SIG_CONF 60 #define VAD_PRE_LECT 60 #define VAD_PRE_CONF 20 #define VAD_POST_LECT 200 #define VAD_POST_CONF 200 - Fix reading of .wav files - The last unit of audio data was not being sent, which also contributed to Paxton Smith's problem. - Fix bias removal for stereo signals. - Fix bias removal maintenance ( >> != / ). - Fix arithmetic overflow problems in the bias removal code. - Remove debugging code in auddev_null.c which caused the NULL audio device to (incorrectly) generate non-silent a-law audio. - Detect whether FreeBSD driver is newpcm or luigi. There are differences in detecting full duplex caps and handling mixer settings. See comments in auddev_luigi.c for an explanation. - Change ts_t to timestamp_t. ts_t is a system defined type on Solaris8. - Cleanup and document the receiver source processing (starting with the source_process() function and friends). * Released 6 August 2000 v4.2.8 - Mbus address of media engine now contains session identifier (this is always zero when running as an audio tool, but the transcoder has sessions 0 and 1). - Fix bug in mbus transmit code which would cause messages to have the same sequence number as the preceeding ack. - Update controller initialization sequence to handle transcoder. - All fatal_error() messages are now prefixed with the RAT_VERSION text, rather than the argv[0] application name. - Fix RTP header extension code (patch from Jori ) as part of RTP interoperability tests. - FreeBSD 4.1 doesn't support binding to an IPv6 multicast address, must bind to in6addr_any instead (reported by Shirasaki Yasuhiro). - Fix validation of RTCP packets with padding (reported by Vladimir Brauner). - Fix padding octet count in RTCP packets sent with padding (Vladimir Brauner). - Fix RTCP timer reconsideration (Vladimir Brauner). - Minimal transcoder support: the media engine can transcode, although it is very buggy. The controller supports just enough to test the media engine, the UI does not support transcoding yet. * Released 22 August 2000 v4.2.9 - Fix spurious assertions in source.c -- I think (hope?) this will fix the source.c:1588: source_process: Assertion `md->nrep < 5 && md->nrep > 0' failed. crash reported by Bob Olson and Justin Pietsch. - Add other_session field to the session struct, and fix transcoder to make calls to rtp_add_csrc() and rtp_del_csrc(), which will eventually support pass through of RTCP. This changes the size of the session struct, and means that you'll have to "make clean" after updating. - Modularize user interface: bargraph and chart - Fix labelling of transcoder input/output ports * Released 8 September 2000 v4.2.10 - Added auddev_newpcm.[ch] with newpcm style mixer control. Includes support for loopback and preservation of mixer settings so mixer is returned to original state upon exit. [oh] Note: both driver interfaces (luigi, newpcm) are pulled in by configure and this is possible whilst luigi pcm and newpcm maintain the same function call interface. This may break in future. Both are necessary because mixer operation is not consistent between the two interfaces. - Catch SIGTERM and SIGHUP on unix (Robert Olson) - Update Windows project file ratui.dsp (Paxton Smith) - Add extra debugging code to sanity check the playout time: since 4.2.9 fixed the md->nrep assertion failures in source.c, we now see problems due to poor playout time calculation. - Compilation fixes for installer under Red Hat 7's weird gcc varient. * Released 1 November 2000 v4.2.11 - Fix port restoration when changing device (Shirasaki Yasuhiro) - Remove assert that made duff port restoration core dump in newpcm, just check port is correct range, if not print warning. - Add check that requested sampling rate is within device capabilities on newpcm. Driver does not do bounds checking when setting rate and will mis-report actual rate when a duff rate has been set (reported by Lars Eggert). - Break up newpcm writes to n separate writes of blocksize rather than one big write as current newpcm debug code complains if this is done. - Fix erroneous debug messages for gain settings in newpcm. - Change newpcm_audio_open() to use SNDCTL_DSP_SETFRAGMENT from SNDCTL_DSP_SETBLKSIZE. The latter creates just 2 frags in secondary buffer and this is not enough for cushion fill levels. - Fix breakage due to "gcc 2.96" shipped with Red Hat Linux 7 - Remove inline math routines from cx_gsm.[ch] since they broke with some versions of gcc (signed vs unsigned comparison). * Released 8 January 2001 v4.2.12 - Better diagnostic message when mbus config file cannot be locked. - Remove SNDCTL_DSP_SYNC from newpcm reset function as it can block. - Change G726-32 packing to fit AVT profile. Because of packing order difference this and future versions will not be interoperable with previous RAT releases. - Set initial cushion size to zero to force audio_rw_process to write an empty cushion of audio after device is opened. - Change mix_put_audio return value when gap detected. Was returning TRUE which indicates mixer and source formats not compatible, this caused source media and channel buffers to be wrongly flushed. - Remove debug sample that made concealment distinctly audible. Should not have gone into code base. - Re-jig source_process so that frames generated through loss concealment get passed onto mixer. This must have broke during tidying. - Remove repeat+ from loss concealment schemes, didn't add anything. - Add L8 encoding. - Change pktbuf to use playout buffer (better use of code). - Reset transit histories when source created. This should fix: - Sometime see messages of the form: "source.c:767 Spike (160 > 2708390)" and hear nothing. - If a receiving stream contains a lot of jitter and out-of-order packets it crashes sometimes. (jitter around 1000 ms and random out-of-order). Reported by Peter Parnes. - Occasional crashes due to "too many blocks allocated" with many allocations in channel_types.c:29, channel_types.c:34, playout.c:188 and source.c:893. Seems to be due to packets being received off the network, but never played out. Reported by Angel Mateo, and also observed at UCL. Not something I've found a way of reproducing. - Occasional weird behaviour of the playout buffer, where sources are buffered for several _minutes_ before being played out? Reported by Steven Dawson on the CAIRN list. - Reduce source packet buffer size. - Change all G726 packings to gratuitously painful little endian. - Increase initial cushion estimate to 2 * min cushion size. - Enable 11025 sample rates and codecs. - Fix detection of incompatible conversions, M * 11025 <-> N * 8000 is not supported. * Released 14 January 2001. 4.2.13 - Fix spurious assert in G726 decoder - Fix G726-40 unpack (bits per sample mis-represented as 3!) - Fix sinc converter selection bug. Should fix: (a) Crash in convert_sinc.c: convert_sinc.c:134: failed assertion convert_sinc.c:122: failed assertion util.c:87: _block_alloc: Assertion `size > 0' failed. reported by Greg Herlein. (b) Another crash in convert_sinc.c: convert_sinc.c:1107: sinc_upsample_stereo: Assertion `out == dst + dst_len' failed. reported by - Change linear converter to use same structure arrangement as sinc converter and fix linear converter selection bug (derived from convert_sinc.c). - Fix reverse reconsideration of RTCP interval - Mark entries in the RTP database as active senders if we get an RTCP SR packet from them. - Added support for G.728 encoding and decoding. See README.g728 for build instructions and comments. - Add support for non-AC97 mixers on FreeBSD's newpcm. - Add support for new device names under FreeBSD-5 (audio.) - OSS/Linux audio driver now uses /dev/dsp rather than /dev/audio, since some drivers don't support /dev/audio. - Cleanup OSS/Linux audio driver code - Added check for device busy vs device not configured in newpcm probing. - Fixed re-use of "thedev" string in newpcm_audio_open that caused device name to be trashed. Reported by Lars Eggert. Thanks! - Fix RTCP bandwidth fraction estimation (Timur Friedman) - Add support for displaying RTCP SDES PRIV items (we send a test item also). * Released 3 March 2001 v4.2.14 - Add "-noui" option to start the media engine without user interface - Fix CSRC handling (Patch from ivo.sedlacek@anfdata.cz) - Fix uninitialized field in SDES PRIV handling (Robert Olson) - Fix G726-24 and G726-40 out by one in codewords unpacked. - Rename rtp_callback to rtp_callback_proc to avoid name clash following recent common library changes. - Fixed all MSVC warnings about implicit type conversions. - Update MSVC project files to reflect new paths in common library. - Update configure to remove need for patching in FreeBSD ports collection. - Add shell script target "rat" as target in Makefile. Again to make FreeBSD ports less effort, like zero :-D. * Released 6 April 2001 v4.2.15 - Fix common include path for use with standard Tcl/Tk (Pekka Savola) - Fix handling of undefined PATH variable, which caused a crash on startup in some cases (patch from Pekka Savola). * Released 13 April 2001 v4.2.16 - Fix PATH handling - Fix so that we no longer send an RTCP BYE if we leave the session before sending any other packets. - Fix initial estimate of average RTCP packet size. - Implement RTCP BYE reconsideration. - Fix RTCP transmission interval. - Fix handling of probationary sources in the RTP code (a source is no longer treated as probationary if we've received RTCP packet from it). * Released 24 April 2001 v4.2.17 - Fixes to auddev_oss.c from Robert Olson - Fix includes for (should fix Red Hat 7.1 compilation) - Fix IPv6 support (Kris Hasler) * Released 18 May 2001 v4.2.18 - IPv6 fixes in common - Config for Windows2k IPv6 stack * Released 25 May 2001 v4.2.19 - Fix off-by-one error when removing half duplex audio devices in the OSS driver (Eric Gerlach and Robert Olson) - Fix generation of rat shell script (David Martinez) - Fix assert failure with Repair=None (Jakub Segen) - Add initial IXJ audio driver for QuickNet devices (contributed by James MacLean ) - Fixes to device pairing for SB Live (Robert Olson) - Fix complience with draft-ietf-mmusic-mbus-transport-06.txt (patch from Lars Fischer) - Fix handling of EAGAIN in auddev_oss.c (James MacLean) * Released 21 June 2001 v4.2.20 - Fix forgotton malloc in auddev_oss.c mixer allocation (patch from Eric Gerlach) - Fix configure script to detect PhoneJack audio devices - Add PHONE type to audio_types.h - Fix misquoted mbus message in ui_send_rtp.c (Eric Gerlach) * 24 September 2001 v4.2.21 - Fix FreeBSD support to work with 4.5-RELEASE (Orion Hodson) - Fix SoundBlaster Live! support on win32 (Chris Greenhalgh) - Accept (and ignore) unknown SSRC in SDES (Chris Greenhalgh) - Add . to path in rat script. Helpful for folks working on RAT without dot in their path. - Change sample rate variable types from uint16_t to uint32_t and add 96kHz timebase (Orion Hodson) - Update configure script to better support IPv6 (Suzuki Shinsuke) - Fix count of CSRCs in mixer - Fix compilation on alpha (David Martinez) - Fixes for MacOS X and Win32 (Bill May) - Explicitly set send/recv buffer sizes (1Mbyte) - Assorted performance tweaks to RTP code (Colin Perkins) * 15 April 2002 v4.2.22 - Fix compilation on Debian/SPARC (David Martinez/Petter Reinholdsten) - Reduce device buffer to 1/8 second on Win32 (Justin Binns) - Fix compilation on Win32 * 23 July 2002 TODO -- They're features not bugs dammit! ---- - Assorted audio driver problems: - Broken auddev_pca with adding of audio interface conversion code. FreeBSD 3.1 pca audio does not seem to work anymore. - SunVideoPlus interface code does not work properly. The driver Sun distributes only works in 8k mono. MMAC produce the card and wrote a driver for Sun: an exceptionally buggy and unstable driver. MMAC now has a better version now, but expect you to pay for the developer kit to access features. $1200 for a card that does not perform as advertised. The marketing blurb states it has G728, G722, and "CD Quality" audio: it may do, but you can't access them. - SGI O2's don't have autosensing audio interface selection like Indy's. - OSS/Linux driver is buggy - Thierry still has problems with the NM256 card and device pairing - Some cards are not detected correctly - Update the 3d audio rendering code - should decimate when using sampling rates other than that for which it was originally designed for. - could use finite precision maths for better performance (eliminate type conversions). - sndfile routines should use conversion functions in audio_fmt.c, not their own. - Channel coders need intelligent bail out fn's for when units overflow (rare, but real problem). - UI lets you select packets larger than the MTU, which can't be sent - Reimplement transcoder. - Convertors need to be moved into the session struct, rather than being statically allocated. - settings load/save code needs to be updated for the transcoder. We should save settings into a different set of files, and save each side of the transcoder individually. - Add support for conversion between m*8000 and n*11025 - Sample based codecs should accept frame lengths of 0-200ms, not just multiples of frame lengths in tables. Should add codec_is_sample_based test and data to codec tables and relax receiver sanity checking so that sample based frames do not have to be n * codec__peek_frame_size. - Should use the empty RRs coming back from receivers who are not seeing traffic, and display this in the loss matrix. - Layering is broken (hasn't been updated for multiple processes, etc) - Weird interaction with rat-3.0.x -- seems that we can generate packets which some instances of rat-3.0 won't play. You get some people in the session who's tools report receiving your data, but they don't play it out. Suspect we're hitting the limitations of the old playout algorithm, rather than a specific bug, and the correct solution is to get everyone to update to rat-4.x - Handling of SSRC collisions is broken - Rework media engine initialization, so we can query it before sending rtp.addr() - when rat starts it turns of "playback-mute" on the mic input which gives feedback for the mic. Muting it via the audio control turns of the feedback. Note that record-mute and playback-mute is not the same thing. Reported by Peter Parnes. [Depends on feedback settings and platform, oh]. - Add ability to change RTP sessions whilst rat is running. Requested by lots of people (Robert Olson, Joerg Ott, etc). - When weak RTP validation is enabled, spurious sources can be added to the database (from the CSRC area of a packet?). Reported by Xiaotao Wu - Crashes on WinNT if another version of Tcl/Tk is installed on the machine? Reported by Didier Lamballais . - Excessive end-to-end delay on Windows? Gerry Wolfson. [The scale of delay is order of magnitude greater than observed on UCL machines, direct sound sound driver anyone...]. - Crash when playing .wav files? [Can't Replicate???] - Build problems on Windows: some of the *.dsp/*.dsw files have unix end of line characters which cause problems for some versions of VC++? Reported by Fulvio Risso rat-4.2.22/Makefile.in0100640000175000017500000001650407444432466013430 0ustar enderender# # Makefile for the RAT project. This requires GNU make on many systems. # # $Id: Makefile.in,v 1.143 2002/03/15 17:53:58 ucacoxh Exp $ # # Configure substitutes variables here... ##################################### DEFS = @DEFS@ CFLAGS = @CFLAGS@ $(DEFS) LIBS = @LIBS@ @MATHLIBS@ LDLIBS = INCLUDE = @COMMON_INC@ @AU_INC@ @TCL_INC@ @TK_INC@ @G728_INC@ CC = @CC@ AR = ar RANLIB = @RANLIB@ ECHO = echo STRIP = strip VERSION = @VERSION@ RATVER = rat-$(VERSION) AU_OBJ = @AU_OBJ@ AU_INC = @AU_INC@ AU_LIB = @AU_LIB@ TCL_LIB = @TCL_LIB@ TK_LIB = @TK_LIB@ X_CFLAGS = @X_CFLAGS@ X_LIB = @X_PRE_LIBS@ @X_LIBS@ -lX11 -lXext @X_EXTRA_LIBS@ COMMON_LIB = @COMMON_LIB@ EXTRA_OBJ = @EXTRA_OBJ@ EXTERNAL_DEP = @EXTERNAL_DEP@ G728_CODEC_OBJ = @G728_CODEC_OBJ@ G728_LIB = @G728_LIB@ WBS_CODEC_OBJ = codec_wbs.o cx_wbs.o prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ mandir = @mandir@ # Nothing below here set by configure ######################################### AUDIO_OBJS = $(AU_OBJ) auddev_null.o audio_fmt.o audio_util.o \ auddev_trans.o auddev.o CODEC_OBJS = codec.o codec_state.o codec_dvi.o codec_gsm.o \ codec_l8.o codec_l16.o codec_g711.o codec_g726.o codec_lpc.o \ codec_types.o codec_vdvi.o \ cx_g726.o cx_g726_16.o cx_g726_24.o cx_g726_32.o cx_g726_40.o \ cx_gsm.o cx_lpc.o cx_vdvi.o cx_dvi.o \ converter.o convert_util.o convert_extra.o convert_linear.o \ convert_sinc.o bitstream.o @G728_CODEC_OBJ@ $(WBS_CODEC_OBJ) SNDFILE_OBJS = sndfile.o sndfile_au.o sndfile_raw.o sndfile_wav.o MEDIALIBS = libuclaudio.a libuclcodec.a libuclsndfile.a CHANNEL_OBJS = channel.o channel_types.o cc_vanilla.o cc_rdncy.o cc_layered.o TOY_OBJS = render_3D.o repair.o MEDIA_OBJS = ts.o playout.o net.o source.o session.o \ main_engine.o mbus_engine.o audio.o cushion.o mix.o \ parameters.o transmit.o playout_calc.o \ ui_send_rtp.o ui_send_audio.o ui_send_prefs.o ui_send_stats.o \ transcoder.o rtp_dump.o rtp_callback.o settings.o \ pdb.o pktbuf.o tonegen.o voxlet.o fatal_error.o $(EXTRA_OBJ) UI_OBJS = tcltk.o mbus_ui.o main_ui.o fatal_error.o CTRL_OBJS = main_control.o mbus_control.o codec_compat.o fatal_error.o \ process.o cmd_parser.o TCL_OBJS = ui_audiotool.o ui_transcoder.o TCL_SRCS = $(TCL_OBJS:%.o=%.c) ALL_OBJS = $(AUDIO_OBJS) $(CODEC_OBJS) $(SNDFILE_OBJS) $(CHANNEL_OBJS) \ $(TOY_OBJS) $(MEDIA_OBJS) $(UI_OBJS) $(CTRL_OBJS) ALL_SRCS = $(ALL_OBJS:%.o=%.c) INSTALL_OBJS = ui_installer.o installer.o binaries.o all: version.h sdr2.plugin.S02.audio.rtp.-.$(RATVER) $(RATVER).spec $(RATVER) $(RATVER)-ui $(RATVER)-media rat Makefile libuclaudio.a: $(AUDIO_OBJS) $(AR) r $@ $(AUDIO_OBJS) $(RANLIB) $@ libuclcodec.a: $(CODEC_OBJS) $(AR) r $@ $(CODEC_OBJS) $(RANLIB) $@ libuclsndfile.a: $(SNDFILE_OBJS) $(AR) r $@ $(SNDFILE_OBJS) $(RANLIB) $@ $(RATVER)-media: $(CHANNEL_OBJS) $(TOY_OBJS) $(MEDIA_OBJS) $(MEDIALIBS) $(EXTERNAL_DEP) $(CC) $(CFLAGS) $(CHANNEL_OBJS) $(TOY_OBJS) $(MEDIA_OBJS) $(MEDIALIBS) $(COMMON_LIB) $(AU_LIB) $(LIBS) $(G728_LIB) -o $(RATVER)-media $(RATVER)-ui: $(TCL_OBJS) $(UI_OBJS) $(EXTERNAL_DEP) $(CC) $(CFLAGS) $(TCL_OBJS) $(UI_OBJS) $(COMMON_LIB) $(TCL_LIB) $(TK_LIB) $(X_LIB) $(LIBS) -o $(RATVER)-ui $(RATVER): $(CTRL_OBJS) $(EXTERNAL_DEP) $(CC) $(CFLAGS) $(CTRL_OBJS) $(COMMON_LIB) $(LIBS) -o $(RATVER) .c.o: $(CC) $(CFLAGS) $(X_CFLAGS) $(INCLUDE) -c $< $(TCL_OBJS): $(TCL_SRCS) ui_transcoder.c: ui_transcoder.tcl tcl2c/tcl2c cat ui_transcoder.tcl | tcl2c/tcl2c ui_transcoder > ui_transcoder.c ui_audiotool.c: uicomponent_bargraph.tcl uicomponent_chart.tcl uicomponent_help.tcl asfilebox.tcl ui_audiotool.tcl tcl2c/tcl2c cat uicomponent_bargraph.tcl uicomponent_chart.tcl uicomponent_help.tcl asfilebox.tcl ui_audiotool.tcl | tcl2c/tcl2c ui_audiotool > ui_audiotool.c ui_installer.c: ui_installer.tcl tcl2c/tcl2c cat ui_installer.tcl | tcl2c/tcl2c ui_installer > ui_installer.c tcl2c/tcl2c: tcl2c/tcl2c.c $(CC) -o tcl2c/tcl2c tcl2c/tcl2c.c version.h: VERSION @${ECHO} "Generating version.h" @sed -e 's/.*/#define RAT_VERSION "&"/' VERSION > version.h sdr2.plugin.S02.audio.rtp.-.rat-$(VERSION): sdr2.plugin.in @${ECHO} "Generating sdr plugin" @${ECHO} "# Generated automatically from sdr2.plugin.in" > $@ @${ECHO} "# DO NOT EDIT THIS FILE" >> $@ @sed -e 's/VERSION/$(VERSION)/g' sdr2.plugin.in >> $@ rat-$(VERSION).spec: rat.spec @${ECHO} "Generating RPM spec file" @${ECHO} "# Generated automatically from rat.spec" > $@ @${ECHO} "# DO NOT EDIT THIS FILE" >> $@ @cat rat.spec | sed s/VERSION/$(VERSION)/g >> $@ rat: VERSION Makefile @${ECHO} "Generating rat shell script" @${ECHO} "#/bin/sh" > $@ @${ECHO} "# Generated automatically from RAT Makefile. Edit there." >> $@ @${ECHO} 'PATH=$${PATH}:.' >> $@ @${ECHO} "exec rat-$(VERSION)" '$$*' >> $@ @chmod a+x rat clean: -rm -f $(CTRL_OBJS) $(AUDIO_OBJS) $(CODEC_OBJS) $(SNDFILE_OBJS) $(CHANNEL_OBJS) $(TOY_OBJS) $(MEDIA_OBJS) $(UI_OBJS) $(TCL_OBJS) -rm -f $(MEDIALIBS) -rm -f tcl_libs.c ui_audiotool.c ui_transcoder.c ui_installer.c version.h -rm -f tcl2c/tcl2c sdr2.plugin.S02.audio.rtp.-.$(RATVER) $(RATVER).spec -rm -f bin2c bin2c.o binaries.c $(INSTALL_OBJS) $(RATVER)-installer -rm -f rat $(RATVER)-media $(RATVER)-ui $(RATVER) distclean: clean -rm -rf config.cache config.log config.status ratconf.h Makefile -rm -rf core core-$(RATVER)-media core-$(RATVER)-ui install: all ./install-sh -m 555 -c rat $(bindir) ./install-sh -m 555 -c $(RATVER) $(bindir) ./install-sh -m 555 -c $(RATVER)-media $(bindir) ./install-sh -m 555 -c $(RATVER)-ui $(bindir) ./install-sh -m 444 -c man/man1/rat.1 $(mandir)/man1/rat.1 ./install-sh -m 444 -c sdr2.plugin.S02.audio.rtp.-.$(RATVER) $(prefix)/etc/sdr/plugins installer: $(RATVER)-installer mkdir release mkdir release/$(RATVER) cp $(RATVER)-installer README.* MODS COPYRIGHT INSTALL.TXT VERSION release/$(RATVER) cd release && tar cvf $(RATVER)-$(OSTYPE).tar $(RATVER) && gzip -9 $(RATVER)-$(OSTYPE).tar mv release/$(RATVER)-$(OSTYPE).tar.gz . rm -rf release $(RATVER)-installer: $(INSTALL_OBJS) $(CC) $(CFLAGS) $(INSTALL_OBJS) $(TCL_LIB) $(TK_LIB) $(X_LIB) $(LIBS) -o $(RATVER)-installer binaries.c: $(RATVER)-$(OSTYPE).tar.gz bin2c ./bin2c $(RATVER)-$(OSTYPE).tar.gz > binaries.c bin2c: bin2c.o $(CC) bin2c.o -o bin2c etags: etags ../common/src/*.[ch] *.[ch] ctags: ctags ../common/src/*.[ch] *.[ch] release: cvs tag release-`cat VERSION | sed "s/\./-/g"` $(RATVER)-$(OSTYPE).tar.gz: $(RATVER) $(RATVER)-ui $(RATVER)-media rat tar cf $(RATVER)-$(OSTYPE).tar README.* MODS COPYRIGHT INSTALL.TXT VERSION $(RATVER) $(RATVER)-ui $(RATVER)-media sdr2.plugin.S02.audio.rtp.-.rat-$(VERSION) rat rm -f $(RATVER)-$(OSTYPE).tar.gz gzip -9 $(RATVER)-$(OSTYPE).tar tgz: $(RATVER)-$(OSTYPE).tar.gz rpm: tgz @${ECHO} "Building $(RATVER).rpm -- this almost certainly needs to run as root on RedHat Linux" install -m 644 $(RATVER)-$(OSTYPE).tar.gz /usr/src/redhat/SOURCES/rat-4.1.2.tar.gz rpm -bb $(RATVER).spec Makefile: Makefile.in VERSION $(error "Run configure again, the following file(s) are newer than Makefile: $?") depend: makedepend $(X_CFLAGS) $(INCLUDE) $(ALL_SRCS) # DO NOT DELETE THIS LINE rat-4.2.22/README0100640000175000017500000002636107226421473012237 0ustar enderenderRobust-Audio Tool (RAT) ~~~~~~~~~~~~~~~~~~~~~~~ Copyright (C) 1995-2001 University College London All rights reserved. This software is distributed under license, see the file COPYRIGHT for full terms and conditions. Further information, and a list of frequently asked questions (with answers) is available from http://www-mice.cs.ucl.ac.uk/multimedia/software/rat/ See the file INSTALL.TXT for installation and compilation instructions. Send comments, suggestions and bug-reports to . A mailing list for general discussion on related issues is now available, send mail to to subscribe. All users of rat are encouraged to join this list. RAT is a network audio tool that allows users to particpate in audio conferences over the internet. These can be between two participants directly, or between a group of participants on a common multicast group. No special features are required to use RAT in point-to-point mode, but to use the multicast conferencing facilities of RAT, a connection to the Mbone, or a similar multicast capable network, is required. RAT is based on IETF standards, using RTP above UDP/IP as its transport protocol, and conforming to the RTP profile for audio and video conferences with minimal control. In addition to the features provided by other Mbone audio conferencing tools RAT offers the following additional functionality: - Sender based repair of damaged audio streams - FEC in the form of redundant packet transmission - Support for interleaved audio - Received based repair of damaged audio streams - Adaptive scheduling protection - Secure conferencing - Improved statistics and diagnostic features - Conference coordination bus - Transcoder operation - Sound localisation and externalisation This list is correct for RAT v3.2, earlier versions have a more limited feature set. Sender based repair of damaged audio streams ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Unless some form of resource reservation protcol (eg: RSVP) is used, an IP based network, such as the Internet or the Mbone, will occasionally lose packets. These lost packets result in broken up audio, which rapidly becomes unintelligible as the loss rate increases. RAT implements two sender based repair schemes to recover from this problem: redundant transmission and interleaving. Redundant transmission is the means by which a (more) heavily compressed copy of a packet is piggy-backed onto the following packet. If the original packet is lost, the redundant copy can be used in its place. Because the redundant packet is very heavily compressed, sound quality suffers, but is still better than having no audio to play out in the place of the lost packet. Clearly, there exists a tradeoff between the amount of compression used for the redundant packet (and hence stream bandwidth/overhead), and the quality of the resultant audio. Redundant transmission was developed by UCL and INRIA Sophia-Antipolis, as part of the MICE/MERCI multimedia conferencing projects. It is discussed further in the following papers: Vicky Hardman, Angela Sasse, Mark Handley and Anna Watson, "Reliable Audio for Use over the Internet", in Proceedings of INET'95, June 1995, Honolulu, Hawaii. Isidor Kouvelas, Orion Hodson, Vicky Hardman and Jon Crowcroft, "Redundancy Control in Real-Time Internet Audio Conferencing", in Proceedings of AVSPN 97, September 1997, Aberdeen, Scotland, UK. Colin Perkins, Isidor Kouvelas, Orion Hodson, Vicky Hardman, Mark Handley, Jean-Chrysostome Bolot, Andres Vega-Garcia, Sacha Fosse-Parisis, "RTP Payload for Redundant Audio Data", IETF Audio/Video Transport Working Group, RFC2198, September 1997. C. S. Perkins, O. Hodson & V. Hardman, "A Survey of Packet-Loss Recovery Techniques for Streaming Audio", IEEE Network Magazine, September/October 1998. As an alternative to redundant transmission, recent versions of RAT provide the option to send interleaved audio. Units of audio data are resequenced before transmission, so that originally adjacent units are separated by a guaranteed distance in the transmitted stream, and returned to their original order at the receiver. Interleaving disperses the effect of packet losses. If, for example, units are 5ms in length and packets 20ms (ie: 4 units per packet), then the first packet could contain units 1, 5, 9, 13; the second packet would contain units 2, 6, 10, 14; and so on. It can be seen that the loss of a single packet from an interleaved stream results in multiple small gaps in the reconstructed stream, as opposed to the single large gap which would occur in a non-interleaved stream. Although interleaving does not reduce the amount of loss observed, it does significantly improve the perceived quality of an audio stream. The obvious disadvantage of interleaving is that it increases latency. This limits the use of this technique for interactive applications, although it performs well for non-interactive use. The major advantage of interleaving is that it does not increase the bandwidth requirements of a stream. Receiver based repair of damaged audio streams ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Receiver based recovery schemes rely on producing a replacement for a lost packet which is similar to the original. This is possible since audio signals, and in particular speech, exhibit large amounts of short-term self similarity. As such, these techniques work for relatively small loss rates (less than 15%), and for small packets (4-40ms). When the loss length approaches the length of a phoneme (5-100ms) these techniques breakdown, since whole phonemes may be missed by the listener. It is, therefore, clear that receiver based repair schemes are not a substitute for sender-based repair, but rather work in tandem with it. A sender-based scheme is used to repair most losses, leaving a small number of isolated gaps to be repaired. Once the effective loss rate has been reduced in this way, receiver based repair forms a cheap and effective means of patching over the remaining loss. A number of receiver based repair schemes are implemented in RAT: - Silence substituation - Packet repetition - Pattern matching repair A simple form of receiver based recovery is silence substitution. The gap left by a lost packet is filled with silence, to maintain the timing relationship between the surrounding packets. It is only effective with short packet lengths (less than 4ms) and low loss rates (less than 2%), making it suitable for striped audio with narrow and distributed stripes over low loss paths. The performance of silence substitution degrades rapidly as packet sizes increase, and quality is unacceptably bad for the 40ms packet size in common use in network audio conferencing tools. Despite this, the use of silence substitution is widespread, primarily because it is simple to implement. Packet repetition replaces lost packets with copies of the packets that arrived immediately before the loss. It has low computational complexity and performs reasonably well. The subjective quality of repetition is improved by gradually fading repeated units. The GSM system, for example, advocates the repetition of the first 20ms with the same amplitude and followed by fading the repeated signal to zero amplitude over the next 320ms. The use of repetition with fading is a good compromise between the poor performance of silence substitution, and the more complex pattern matching scheme. Pattern matching repair uses audio before and after the loss to interpolate a suitable signal to cover the loss. It performs somewhat better than packet repetition, but is significantly more computationally intesive. Adaptive Scheduling Protection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Current general purpose operating systems, such as Unix and Windows 95, do not provide adequate support for real-time services in their scheduling algorithms. RAT uses a novel adaptive algorithm, where the DMA driven audio playout is used to `cushion' the system against scheduling anomolies. This is described in the following paper: Isidor Kouvelas and Vicky Hardman, " Overcoming Workstation Scheduling Problems in a Real-Time Audio Tool", in Proceedings of Usenix Annual Technical Conference, January 1997, Anaheim, California. Secure Conferencing ~~~~~~~~~~~~~~~~~~~ RAT allows for secure conferencing, whereby media streams and participant identity information can be encrypted using DES. Other encryption algorithms can easily be added. Improved Statistics and diagnostic features ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Like other RTP-based audio tools, RAT provides reception quality statistics and user information for all participants in a conference. In addition, it has a graphical display of the loss to/from each participant, making diagnosis of problems a simple matter. Conference coordination bus ~~~~~~~~~~~~~~~~~~~~~~~~~~~ RAT implements a conference coordination bus, whereby the user interface and media engine are separated, and communicate via an IPC mechanism. This allows for complete control of RAT by another process operating on the same host. Advantages of this split approach include: - Customised user-interface: the existing RAT user interface can easily be replaced, with no loss of functionality. - Lip-synchronisation: RAT can communicate with a videa tool, to synchronise audio and video. - Integration with wide area conference control: a separate conference control process may be run on the same host as the audio/video tools. This can use the conference bus to control the media tools, to provide, for example H.323 conference control. Transcoder operation ~~~~~~~~~~~~~~~~~~~~ When the bandwidth available is not constant for all participants in a conference, or when some participants do not have multicast capable access, the RAT transcoder/gateway may be used. This connects two multicast groups, or one multicast group and a single unicast host. RTP packets received from either group are transcoded into the format specified for the other group, multiple sources are mixed together, and the resulting stream is transmitted to the other group. This allows for different codecs to be used in each group, meaning that the bandwidth requirements are different. Future research ~~~~~~~~~~~~~~~ Future developments planned include: - Additional codecs, for low bandwidth speech and high quality music. - Investigation of different error recovery techniques. Project Background ~~~~~~~~~~~~~~~~~~ UCL has a well-established multimedia and communications research group. One of the current research topics is multimedia conferencing applications over the Internet Mbone. We are in the process of developing a next generation audio tool, RAT, for use over the Internet, as part of a suite of integrated multimedia tools. The research is aimed at providing software systems on heterogeneous workstations (Unix and Windows based). The group has existing collaborative and industrially funded application piloting projects. Sponsors ~~~~~~~~ The RAT project was funded by the EPSRC under the Multimedia and Networked Applications Programme, Bristish Telecommunications plc, and the European Commision (Telematics Applications Programme, Research Sector). It has benefited from hardware donations by Hewlett-Packard and Sun Microsystems, and software donations by Microsoft. rat-4.2.22/README.HPUX100100640000175000017500000000102106547722536013156 0ustar enderenderREADME.HPUX10 ------------- Additional info needed to run/compile RAT on HPUX-10.xx machines. Since the RAT uses the audio device directly (raw) instead of the Aserver interface of HP, one needs to make this device writable to get it running. as root user : #ll /dev/audio crw-r--r-- 1 root sys 66 0x000000 Jun 23 18:17 audio #chmod o+w /dev/audio #ll /dev/audio crw-r--rw- 1 root sys 66 0x000000 Jun 23 18:17 audio Should solve this problem. rat-4.2.22/README.IXJ0100640000175000017500000000052107311015275012650 0ustar enderender*** 2001/06/04 *** . Use environment variable IXJ_AEC=x to set Echo Cancellation o Goes 1-5 = low, medium, high, auto, auto + auto_gain . Reads and writes seem to need to be full blksize . No builtin codecs used . Needs latest ixj modules from CVS: o http://www.openh323.org/driver/cvs.html . Add auddev_ixj.o to MAkefile targets. rat-4.2.22/README.RELEASES0100640000175000017500000000204107073267470013433 0ustar enderenderSuggested checklist before release, please add to as necessary. TESTING ======= [ ] Transmit and receive between two machines in lab. [ ] Runs on each of the supported operating systems. [ ] Mixes multiple streams (preferably reflected from somewhere on the end of a distant/hostile link). In g11 there is 3 CD set from Hitch Hikers Guide to the Galaxy that can be used for this purpose. [ ] Should be able to leave running for order of hours (decoding and transmitting) across hostile link. [ ] *All* new features tested. Preferably in a test module and in situ. [ ] Feature interactions considered and tested. [ ] Two instances run on the same machine. [ ] All command line options in code work. RELEASING ========= [ ] All binaries build and run before writing release note. [ ] MODS file has release note added before source code tarball is made. [ ] MODS files is copied to distribution directory after tarball. [ ] rat, common, tcl-8.0, tk-8.0 are tagged in source tree. [ ] Pub will be open when release is ready.rat-4.2.22/README.WB-ADPCM0100640000175000017500000000123507307174171013361 0ustar enderenderFrom the COPYRIGHT file: The WB-ADPCM algorithm was developed by British Telecommunications plc. Permission has been granted to use it for non-commercial research and development projects. BT retain the intellectual property rights to this algorithm. The code implementing the WB-ADPCM algorithm is contained in the following: codec_wbs.c codec_wbs.h cx_wbs.c cx_wbs.h and is referenced from codec.c and the makefiles. If you have concerns about IPR, or if you wish to use rat for purposes disallowed by the above license, you should remove these 4 files, and make the obvious edits to codec.c and Makefile.in such that they are no longer referenced. rat-4.2.22/README.debug0100640000175000017500000002026707051640254013317 0ustar enderenderDebugging Hints =============== This document describes the tools, macros, and configure options that are employed at UCL to work with RAT. It also contains a few hints on other things and a list of reading matter that most programmers benefit from. RAT is dependent on the UCL common library for a number of important features such as RTP, MBUS, and memory routines, it is imperative that the common library should be configured with the same options as RAT for those options to work correctly. On Windows this happens automatically when you select a configuration, on UNIX configure needs to be invoked with the same options for both the common library and RAT (use make clean before performing configure to clean out old objects). Debug configuration ------------------- On Unix use the configuration option --enable-debug. On Windows select one of the Debug configurations (Build->Set Active Configuration). When debugging is enabled the macro DEBUG is defined and certain portions of code that perform checking become enabled. In addition, the macro debug_msg is defined. This operates in a similar manner to printf, on UNIX it logs messages on stderr and on Windows it generates debug messages that debugger applications can snoop. The message format is: ::. An example of the output is: 2236:pdb.c:205 Removing persistent database entry for SSRC 0x7a0e824b A potential problem on Win32 is that the developer studio debugger only listens to messages from it's immediate child process. It does not listen to their children. When RAT launches the controller process creates the media engine and ui as child processes. To see their output a debugger that can listen to all messages is necessary. We use the publically available application DebugView (http://www.sysinternals.com), it provides filtering options and permits a range of debug and message snooping options. Memory Debug Configuration -------------------------- RAT uses a set of memory allocation and debugging routines that are incorporated in the common library. When memory debugging is turned on they perform checks on memory corruption (e.g. buffer over- and under- flows) and memory tracking to help memory leaks. To enable memory debugging on UNIX run configure with the flag --enable-debug-mem. On Win32 memory debugging is enabled when the Debug configuration is selected. There are two sets of allocation routines in RAT, those based on xmalloc and those on block_alloc. xmalloc is basically a malloc replacement, block_alloc is a re-cycling allocator that originated because some earlier generation hardware had issues with the rate of memory allocation and freeing. The code for these routines exists in common/memory.[ch] and common/util.c. Brief descriptions are: xmalloc, wrappered version of malloc. xrealloc, wrappered version of realloc. xstrdup, wrappered version of strdup. xfree, wrappered version of free that check for corruption before releasing block. xmemchk, checks all allocated blocks for memory corruption. xmemdmp, prints a list of all memory not xfree'd. Useful especially at process termination for spotting leaks. xmemdist, prints a distribution of the memory allocations to file. xdoneinit, timestamps the end of initialization. block_alloc, re-cycling version of xmalloc. block_free, re-cycling free, but has arguments of address and size. It will be immediately apparent if code uses the wrong free method for the allocation method when memory debugging is enabled. Coding for Debug ---------------- It is generally a good idea (tm) to sprinkle code with assert macro's (see man assert) when there are known limits or values for variables that can be used to check correct operation. In debug mode, when assertions fail they print an error message indicating the failure and dump core (or jump into the debugger in Visual Studio). When adding checks for debugging purposes, bear in mind RAT has real-time constraints. Nearly everything is slower in debug mode because of extra sanity checks. With extra debugging code, you want to test cases are sensible, etc, and may want to dump a little state. If the sum of these additional checks is too great the application probably won't send or receive audio too well. Try to have code fail gracefully, returning an error code rather than just calling abort. In the author's opinion "ABORT SHOULD ONLY BE USED AS A FINAL RESORT", i.e. you have no idea how the application might have ended up in a state, but if it did it would be really bad. Since you have no clue how you might have got there it would be great if a conscientious user sends in a core corresponding to that weird state. Since you are generally running in debug mode when developing you really don't need abort (there are too many already in this code). Dumping Core ------------ When debugging (and on UNIX), the media engine and user interface dump core into their own directories: core-rat--media and core-rat--ui. This is because some unix variants insist on calling all core dump files 'core' so when one process dies and dumps core, it maybe quickly overwritten by second processes core if that process depends on the first. Profiling --------- Configure with --enable profile will enable code profiling. This enables logging of how often functions are called, where they are called from, how much time was spent in these functions, etc, etc. It is a profoundly useful feature for spotting code hotspots. If you think you may be able to optimize a chunk of code you may want to profile it first to see if it makes any difference: the author implemented an MMX optimized version of the sample mixing code in assembler that sped up this operation by a factor of around 4. As a coding excercise it was interesting to try, but as an optimization it would be worthless as mixing is somewhere after another 150 functions in terms of time spent doing the operation. When running applications built with profiling they will dump a usage file at the end, appname.gmon, with gcc/egcs. The gnu profiler is gmon (see man gmon and try it!), e.g. % gmon rat-4.1.5-media core-rat-4.1.5-media/rat-4.1.5-media.gmon Three Processes --------------- Most debuggers are only able to deal with one process for debugging at a time. RAT runs as three processes. There are two methods for debugging child processes that we commonly use: 1) Attach to process. On UNIX gdb (and perhaps other debuggers?) have an attach command allows the debugger to hijack the running process; i.e. arbitrarily pause it, add break points, inspect data, etc. This functionality exists on Windows with Visual Studio. It is possible to attach to a process using the debug menu 'Attach to Process' option, or right clicking on a process in task manager and selecting the attach debugger option. 2) Place -DDEBUG_FORK (UNIX only) in the Makefile and rebuild main_control.o. This permits the developer to start the child processes manually and start one or both from inside a debugger. When the controller is run it provides command line arguments to that the sub-processes should be launched with. Dependencies ------------ On UNIX always type 'make depend' after configure. This means that if you change any function prototypes or structures in header files any files that depend on those will be automatically rebuilt in the next make. Tags ---- On UNIX, editors like vi and emacs have tag modes that allow the keen hacker to jump to references and declarations of variables, prototypes, macros, etc. 'make ctags' builds vi style tags, 'make etags' builds emacs style tags. Reading ------- - Code Complete: A Practical Handbook of Software Construction Steve McConnell, Microsoft Press; ISBN: 1556154844 - The Practice of Programming, Brian W. Kernighan, Rob Pike Addison Wesley Publishing Company; ISBN: 020161586X - Programming Pearls, Jon L. Bentley Addison-Wesley Pub Co; ISBN: 0201657880 Also More Programming Pearls: Confessions of a Coder (out of print). - Writing Solid Code: Microsoft's Techniques for Developing Bug-Free C Programs, Steve Maguire, Microsoft Press; ISBN: 1556155514 - C Programming Language, Brian Kernighan, Dennis Ritchie. Prentice Hall; ISBN: 0131103709rat-4.2.22/README.devices0100640000175000017500000002100107051640254013636 0ustar enderenderAudio Interfaces ================ This document describes the set of functions that need to be implemented for RAT to support an audio interface. Examples exist in the files auddev_*.[ch]. RAT implements a fairly basic device abstraction that should make it straightforward to add new devices. The following interfaces are currently supported: auddev_alsa.[ch] Advanced Linux Sound Architecture. auddev_atm.[ch] ATM A-law driver (reads and writes raw AAL1) auddev_luigi.[ch] PCM Sound Driver for FreeBSD (Luigi's Driver) auddev_osprey.[ch] SunVideo Plus Audio Device (Buggy driver!) auddev_oss.[ch] Linux and FreeBSD Open Sound System auddev_pca.[ch] FreeBSD Speaker Device (/dev/pcaudio) auddev_sgi.[ch] SGI Audio Device auddev_sparc.[ch] Sun Audio Device auddev_win32.[ch] Win32 SDK Audio Device(s) The following interfaces are suffering bit-rot but could easily be updated if suitably motivated: auddev_freebsd.[ch] Voxware FreeBSD audio driver auddev_hpux_raw.[ch] HP-UX audio driver Adding Audio Interfaces ======================= The basic idea is that a source and header file is created containing the function declarations and definitions used by the new interface. In auddev.c the function audio_init_interfaces() is used to add interfaces into RAT. To add a new interface include the header file containing the interface declarations before audio_init_interfaces(). Add an entry like the existing ones for the new interface. An important distinction exists between audio interfaces: those that support single devices (sparc, sgi) and those that support multiple devices (e.g. win32sdk). There can only be one interface that support multiple devices (for a given platform) and it must be the first to be appear in audio_init_interfaces. If you look at the code you can see why, audio_open passes the index of the device in the call to the interface's audio_open function. The interfaces audio_open function uses this to work out which device to use. It's a minor limitation and a fix is deferred until it is an issue. Audio Interface Functions ========================= WARNING: THIS DOCUMENT IS CORRECT AT THE TIME OF WRITING ONLY. ------------------------------------------------------------------------------- int platform_audio_init(void); Arguments: None. Returns: TRUE if initialization successful, FALSE otherwise. Note: If there is any one time initialization that is need for device support like testing a device exists (auddev_pca) or the presence of a library (auddev_osprey) it should be performed here. Note this function is optional and does not have to be implemented. -------------------------------------------------------------------------------- int platform_audio_free(void); Arguments: None. Returns: TRUE if termination successful FALSE otherwise. Note: This function should perform any last minute clean up necessary before termination. Some hardware/drivers may get confused if not cleanly shutdown. This function is optional and doesn't need to be implemented. -------------------------------------------------------------------------------- int platform_audio_open(audio_desc_t ad, audio_format* ifmt, audio_format *ofmt); Arguments: A unique desciptor and the requested audio formats. Both defined in audio_types.h. If the device does not support the sample types of the input or output format, it should change the format type to one that it supports via the audio_format_change_encoding function and use that format. The audio device interface (auddev.c) handles conversion to what the application requested. No changes should be made to any other fields in the input or output formats. Returns: TRUE if device opened with requested format. FALSE otherwise. Note: It is intend the audio interface code keeps it own audio file descriptors within the scope of its file. The descriptor ad corresponds to the index of the interface selected in the table of interfaces. -------------------------------------------------------------------------------- void platform_audio_close(audio_desc_t ad); Arguments: Descriptor to be closed. Returns: Nothing. -------------------------------------------------------------------------------- void platform_audio_drain(audio_desc_t ad); Arguments: Descriptor to be drained. Both input and output devices should be drained if possible. Returns: Nothing. -------------------------------------------------------------------------------- int platform_audio_duplex(audio_desc_t ad); Arguments: Descriptor to be tested. Returns: TRUE if full-duplex, FALSE otherwise. RAT only supports full-duplex. -------------------------------------------------------------------------------- void platform_audio_set_gain(audio_desc_t ad, int gain); Arguments: Descriptor and input gain to set to (0-100). Returns: Nothing. -------------------------------------------------------------------------------- int platform_audio_get_gain(audio_desc_t ad); Arguments: Descriptor from which to retrieve input gain. Returns: Input gain (0-100) -------------------------------------------------------------------------------- void platform_audio_set_volume(audio_desc_t ad, int vol); Arguments: Descriptor and output gain to set to (0-100). Returns: Nothing. -------------------------------------------------------------------------------- int platform_audio_get_volume(audio_desc_t ad); Arguments: Descriptor from which to retrieve input gain. Returns: Output Gain (0-100) -------------------------------------------------------------------------------- void platform_audio_loopback(audio_desc_t ad, int gain); Arguments: Descriptor and gain to set hardware loopback gain to (0-100). Returns: Nothing. Note: Not all devices support this in which case this function should exist but do nothing. -------------------------------------------------------------------------------- int platform_audio_read(audio_desc_t ad, u_char *buf, int read_bytes); Arguments: Descriptor, sample buffer, no of bytes to read. Returns: Bytes read. -------------------------------------------------------------------------------- int platform_audio_write(audio_desc_t ad, u_char *buf, int write_bytes); Arguments: Descriptor, sample buffer, no of bytes to be read. Returns: Number of bytes successfully written. -------------------------------------------------------------------------------- void platform_audio_non_block(audio_desc_t ad); Arguments: Descriptor. Returns: Set device to non-blocking. -------------------------------------------------------------------------------- void platform_audio_block(audio_desc_t ad); Arguments: Descriptor. Returns: Set device to blocking operation (not used by RAT). -------------------------------------------------------------------------------- void platform_audio_set_oport(audio_desc_t ad, int port); Arguments: Descriptor and port number corresponding to definitions in config_unix.h or config_win32.h. Returns: Nothing. Note: Port should only change if this call works. -------------------------------------------------------------------------------- int platform_audio_get_oport(audio_desc_t ad); Arguments: Descriptor to retrieve active output port from. Returns: Selected audio output port number as defined in config_{unix,win32}.h -------------------------------------------------------------------------------- void platform_audio_set_iport(audio_desc_t ad, int port); Arguments: Descriptor and audio input port to change to. Returns: Nothing. Note: Port should only change if this call works. -------------------------------------------------------------------------------- int platform_audio_get_iport(audio_desc_t ad); Arguments: Descriptor to retrieve active input port from. Returns: Active input port. -------------------------------------------------------------------------------- int platform_audio_is_ready(audio_desc_t ad); Arguments: Descriptor. Returns: TRUE if at least one blocksize of audio is available. FALSE otherwise. -------------------------------------------------------------------------------- void platform_audio_wait_for(audio_desc_t ad, int delay_ms); Arguments: Descriptor and upper bound on delay. Returns: Nothing. Note: The purpose of this function is to choke CPU usage. Function should wait for up to delay_ms for audio to become available. -------------------------------------------------------------------------------- rat-4.2.22/README.files0100640000175000017500000001544207472536116013342 0ustar enderenderWhy so many files? ----------------- There are a lot of files to have to deal with in this application. Before describing the files themselves a brief overview of how the modules are implemented is necessary as this will help explain a lot of the files trivially. There is a common design philosophy between the components that have to be modular. In general there is one file that contains an interface to all of the alternate module implementations. This is interface is implemented via a table of function pointers that reference components. This prevents the need for large switch statements and means that modules can be added trivially so long as they implement the functions required in the table of the component type. The table is hidden from the application to prevent direct access, reduce the risk of memory corruption and to keep the code clean. Access to the table is via a simple query mechanism that typically returns information about the components of that type. As a simple example here is how to print out all of the available codecs: #include "codec_types.h" #include "codec.h" int main() { const codec_format_t *cf; codec_id_t cid; u_int32 i, n; /* Call one time initialization function */ codec_init(); n = codec_get_codec_count(); for(i = 0; i < n; i++) { /* Get handle for i'th codec */ cid = codec_get_codec_number(i); /* Get details of codec by handle */ cf = codec_get_format(cid); /* Print the details */ printf("%3u s\n", i, cf->long_name); } return 0; } A cursory look at the files and you'll see there are many codec_*.[ch] files and cx_*.[ch] files. What are all these files? codec.[ch] implement the codec table and the interface to the table. codec_*.[ch] are contain functions that appear in the table. cx_*.[ch] are the codec functions. These are kept separate from the interfacing functions in codec_*.[ch] to keep the code clean. At the time of writing that accounts for 40 of the ~100 files. If you want to add a component that does a job similar to one of the other already implemented, the best way to figure out how is to take a component of that type. A tour of the files ------------------- /* Audio device table interface files */ auddev.[ch] audio_types.h Audio types for audio device handling. /* Audio driver interface files */ auddev_luigi.[ch] FreeBSD audio driver. auddev_null.[ch] Null audio device (spoof device when none avail). auddev_osprey.[ch] PCI SunVideo (broken). auddev_oss.[ch] Open Sound System. auddev_pca.[ch] FreeBSD PC audio device. auddev_sgi.[ch] SGI audio. auddev_sparc.[ch] Sun audio. auddev_win32.[ch] Win32 sdk audio device and /* Channel coder table interface files */ channel.[ch] channel_types.[ch] Channel types for manipulation. /* Channel coder implementation files */ cc_layered.[ch] Layered channel coder. cc_rdncy.[ch] Redundant channel coder. cc_vanilla.[ch] Vanilla (null) channel coder. /* Codec table interface files */ codec.[ch] codec_types.[ch] Basic types and functions for codecs. codec_state.[ch] Functions for holding codec state. /* Codec interfaces and implementations */ codec_acm.[ch] Interface files to Windows ACM compressor. codec_dvi.[ch] IMA adpcm interface. codec_g711.[ch] ITU G711 interface and implementation files. codec_g726.[ch] ITU G726-16/24/32/40 interface files. codec_gsm.[ch] ETSI GSM interface files. codec_l16.[ch] Linear-16 interface and implementation files. codec_lpc.[ch] LPC interface files. codec_vdvi.[ch] Variable rate IMA adpcm interface files. codec_wbs.[ch] Wideband speech interface files. cx_dvi.[ch] IMA adpcm implementation files. cx_g726.[ch] ITU G726 implementation files. cx_g726.h cx_g726_16.c cx_g726_24.c cx_g726_32.c cx_g726_40.c cx_gsm.[ch] GSM implementation files. cx_lpc.[ch] LPC implementation files. cx_vdvi.[ch] Variable rate IMA adpcm implementation files. cx_wbs.[ch] Wideband speech implementation files. /* Sample rate and channel conversion interface files */ converter.[ch] converter_types.h /* Sample rate and channel conversion implementation files */ convert_acm.[ch] Windows ACM sample rate converter. convert_extra.[ch] Extrapolating sample rate converter. convert_linear.[ch] Linear interpolating sample rate converter. convert_sinc.[ch] Sinc filter sample rate converter. /* Utilities for channel conversion implmentation files */ convert_util.[ch] /* Interface and implementation of 3D renderer's */ render_3D.[ch] /* Interface and implementation of repair schemes */ repair.[ch] /* Sound file playback and recording interface files */ sndfile.c sndfile.h /* Sound file playout and recording implementation files */ sndfile_au.c sndfile_au.h sndfile_raw.c sndfile_raw.h sndfile_types.h sndfile_wav.c sndfile_wav.h /* RAT specific files */ config_unix.h Includes and defines for UN*X. config_win32.h Includes and defines for Win32. audio.[ch] Audio device setup and teardown functions. audio_fmt.[ch] Audio format manipulation (comparison, dup, etc). audio_util.[ch] Assorted audio processing (bias removal, filtering, MMX mixing). crypt.[ch] Interface to DES encryption. crypt_random.[ch] LBL's rng used for encryption. cushion.[ch] Audio device cushion computation. main.c main. main_engine.c main for audio engine (not used yet). main_ui.c main for user interface (not used yet). mbus_control.[ch] Message bus utility functions. mbus_engine.[ch] Audio engine message bus command processor. mbus_ui.[ch] User interface message bus command processor. mix.[ch] Audio mixer. net.[ch] Network interface files. parameters.[ch] Audio energy, silence detection, automatic gain control, and voice activity detection function.s pckt_queue.[ch] Packet queueing functions. playout.[ch] Playout buffer functions. rtcp.[ch] RTCP processing, packetization, and database files. rtcp_db.[ch] rtcp_pckt.[ch] rtp_callback.[ch] Callback interface for RTCP processing when implemented. session.[ch] Session files - session_struct holds application global data. settings.[ch] Functions to load and save settings to file / registry. source.[ch] Audio source processing functions. Controls decode path. statistics.[ch] Packet reception, playout calculation, and statistics maintenance. tcltk.[ch] Interface to tcl/tk interpreter. timers.[ch] Timer functions. transcoder.[ch] Transcoder implementation files (broken). transmit.[ch] Transmitter functions (gather, classify, encoder audio functions). ts.[ch] Timestamp functions. ui.[ch] Function calls to pass messages to the user interface. usleep.[ch] An implementation for usleep for platforms that need it. version.h Version number - automagically generated. win32.c Miscellaneous Win32 functions. /* Tcl scripts */ asfilebox.tcl Asynchronous file box "widget". ui_audiotool.tcl Audio tool user interface script. ui_transcoder.tcl Transcoder user interface script. rat-4.2.22/README.g7280100640000175000017500000000344407244417672012730 0ustar enderender ------------------------------------------------------------------------ This file provides information on enabling G.728 support in RAT. Please do not make binaries containing G.728 available to the public without consulting the G.728 intellectual property right owners. We have added support for evaluation purposes only. ------------------------------------------------------------------------ G.728 support is provided by a wrapper around the publicly available encoding and decoding routines by Alex Zatsman (with additions by Michael Concannon). The G.728 wrapper can be found on the UCL multimedia cvs server. The module is named "g728lib". Details on accessing the server may be found at: http://www-mice.cs.ucl.ac.uk/multimedia/software/cvsanon.html The modules rat, common, g728lib should be extracted into the same directory. g728lib needs building first to allow RAT's configure script to detect it and put the appropriate pieces into the Makefile. We have not made any modifications to the underlying encoding and decoding functions in Alex's package. The functions use static variables to contain state and therefore limit the number of instances that should be run per process to 1. Running more instances simultaneously will lead to state corruption and degradation of the audio stream quality. For point-to-point communication this should not be a major issue if silence suppression is used. Echo suppression (network-mutes-mic operation) will also help. When using G.728 it is worth considering that it has an exceptionally small frame size (0.625ms). We recommend using 32 or 64 units (frames) per packet to get a reasonable amount of G.728 data into each RTP packet. 32 units (frames) per packet -> 20ms audio per packet 64 units (frames) per packet -> 40ms audio per packet Enjoy! rat-4.2.22/README.gsm0100640000175000017500000000126206566026614013021 0ustar enderenderCopyright 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 rat-4.2.22/README.mbus0100640000175000017500000003012107054737033013172 0ustar enderenderUse of the message bus by RAT ============================= $Id: README.mbus,v 1.10 2000/02/23 11:01:47 ucaccsp Exp $ This document documents the message bus commands known by RAT. It does not define the mbus transport mechanism, that is defined in the companion document draft-ietf-mmusic-mbus-transport-01.txt (see http://www.mbus.org/ for any future updates to that document). The UCL common multimedia library contains an implementation of the message bus which is intended to be relatively simple to build standalone and may be of interest to those wishing to interface with RAT in this manner. This should have been supplied along with the RAT source code, but can also be retrieved from http://www-mice.cs.ucl.ac.uk/multimedia/software/ RAT comprises three separate processes: controller, media engine and user interface. On Unix systems these are called, for example, rat-4.1.5 controller rat-4.1.5-media media engine rat-4.1.5-ui user interface The controller starts first, and spawns the other two processes. It's main role is to parse the command line options given to rat, and after starting the other processes, inform them of details of the session. Replacing the controller with one of your own design would allow you to, for example, build a SIP or H.323 terminal with the rat media engine providing RTP functions, and your controller providing H.245/SIP. The message bus is the sole means by which the RAT media engine communicates with the user interface. This allows for replacement of the UI or controller and for remote control of the media engine. The media engine and user interface expect to be started in a particular manner. That is, they are given command line options as follows: rat-... -token -control where is an opaque string, and is the mbus address of the controller. After they have been started, they wait for an mbus.waiting(token) message from the controller. The token in this message is that given to those processes on the command line. On reception of this, they respond with mbus.go(token) and start periodically sending mbus.waiting(token) to the controller. The controller will then send any early configuration commands (see below) to those processed, followed by mbus.go(token) indicating that the subprocesses should begin operation. The controller MUST send the following early configuration command to the media engine rtp.addr(...) and may send other commands. The controller is not required to send any early configuration commands to the user interface. Once the media engine has started up, it will solicit for a user interface by sending mbus.waiting("rai-ui-requested"). The user interface should response with a _single_ mbus message containing the commands: mbus.go("rat-ui-requested") tool.rat.settings() audio.query() rtp.query() These MUST be sent in a single message, to maintain atomicity, otherwise the media engine could send the user interface messages before it has the necessary state to receive them. When the user interface wishes to exit, it should send tool.rat.ui.detach.request() to the media engine. The media engine will then complete sending commands to the user interface, the final command being tool.rat.ui.detach() at which point no further messages will be sent to the user interface, and the media engine will return to solicitation for a new user interface. Quick roadmap of the mbus related code in rat: - mbus_*.c reception of messages - ui_send_*.c sends messages from the media engine to the UI - ui_audiotool.tcl sends messages from the UI to the media engine also handles processing of most of the messages received by the UI the common library include mbus related code to actually send and receive the mbus packets. ------------------------------------------------------------------------------- --- The mbus.* commands provide synchronization and coordination between --- --- processes at a high level. --- mbus.hello () Sent as a heartbeat message every second to indicate liveness. mbus.quit () Sent to indicate that the receiving entity should quit. mbus.bye() Sent to indicate that the sender is about to exit. Should be the last message sent by an entity. mbus.waiting (condition) mbus.go (condition) An mbus.waiting command indicates that the sender is waiting for the specified condition to be fulfilled. An mbus.go command is sent to inform such a waiting entity that that condition has been met. ------------------------------------------------------------------------------- --- The rtp.* commands have two purposes. Firstly, they are sent from the --- --- media engine to the user interface to inform the UI of the participants --- --- in a session. Secondly, they can be used to control some aspects of the --- --- transmission of RTP packets by the media engine (e.g. the SDES details) --- rtp.query () Sent to the media engine to request an update of the current state of the RTP session. rtp.addr (addr rx_port tx_port ttl) This can be sent to the media engine on startup to set the addresses used, thereafter it is sent by the media engine as part of the response to rtp.query() to inform the recipient of the addresses used for the session. rtp.addr.query () Request the media engine to send an rtp.addr() message. rtp.ssrc (my_ssrc) Inform the recipient of the SSRC the sender is using in the session. Again, sent in response the rtp.query(). rtp.source.cname (ssrc name) rtp.source.name (ssrc name) rtp.source.email (ssrc email) rtp.source.phone (ssrc phone) rtp.source.loc (ssrc location) rtp.source.tool (ssrc tool) rtp.source.note (ssrc note) Convey RTP SDES information about a source. Can be sent to the media engine to set the SDES information it includes in its RTCP packets - in which case the ssrc used must be that from the rtp.ssrc() message. rtp.source.mute (ssrc mute) The specified source should be muted (if mute == 1) or unmuted (if mute == 0). The ssrc can be "ALL" to mute/unmute all sources. rtp.source.codec (ssrc codec) Convey codec being used by this source. rtp.source.packet.duration (ssrc duration) Convey the duration of audio packets received from this source. rtp.source.packet.loss (dest srce loss) Convey the percentage packet loss between two participants. rtp.source.reception (ssrc packets_recv packets_lost packets_mis o packets_dup jitter jit_tog) Convey RTCP reception report statistics. rtp.source.active (ssrc) rtp.source.inactive (ssrc) Indicate that the specified source is active/inactive now. rtp.source.exists (ssrc) Indicate to the receiver that the participant with the specified is present in the session. rtp.source.remove (ssrc) The specified source should be remove from the list of participants. rtp.source.gain (ssrc gain) rtp.source.rtt (ssrc rtt) rtp.source.playout (ssrc playout-delay) Convey playout delay being used for this source. ------------------------------------------------------------------------------- audio.query () Sent to the media engine to query the current audio settings. audio.input.ports.flush () Sent by the media engine to clear the list of support input ports. Followed by audio.input.ports.add(). audio.input.ports.add (port) Add to the list of supported input ports. The parameter will be a string, such as "microphone". audio.input.port (port) Set the port to be used. audio.input.mute (boolean) Enable/disable muting of transmission. audio.input.gain (percentage) Set the input (Eg: microphone) gain. audio.input.powermeter (percentage) Set the level of the input powermeter on the display. audio.output.mute (boolean) audio.output.gain (percentage) audio.output.ports.flush () audio.output.ports.add (port) audio.output.port (port) audio.output.powermeter (percentage) Similar to audio.input.*() audio.channel.coding (coding) audio.channel.repair (repair) Select the coding or repair scheme to be used. audio.devices.flush () audio.devices.add (device) audio.device (device) Supported audio hardware. audio.file.play.open audio.file.play.pause audio.file.play.stop audio.file.play.live audio.file.play.ready audio.file.play.alive Control the playback of audio files into a session. audio.file.record.open audio.file.record.pause audio.file.record.stop audio.file.record.live audio.file.record.ready audio.file.record.alive Control the recording of the audio from a session into a file. audio.suppress.silence (boolean) Enable/disable silence suppression in the transmitter. audio.3d.filter.types audio.3d.filter.lengths audio.3d.azimuth.min audio.3d.azimuth.max audio.3d.enabled audio.3d.user.settings Control 3d audio rendering. ------------------------------------------------------------------------------- security.encryption.key (key) Enable DES encryption with the specified key. ------------------------------------------------------------------------------- session.title (title) Indicates the title of this session. ------------------------------------------------------------------------------- tool.rat.settings () Request that the media engine sends a list of it's settings. Audio and RTP related settings are not reported. tool.rat.ui.detach.request () Request that the media engine stops sending messages to the user interface. tool.rat.ui.detach () Sent by the media engine in response to tool.rat.ui.detach.request(). This is the last message the media engine sends to the user interface. tool.rat.agc (boolean) tool.rat.filter.loopback (boolean) tool.rat.lecture.mode (boolean) tool.rat.echo.suppress (boolean) tool.rat.silence (boolean) tool.rat.powermeter (boolean) Enable/disable various options. tool.rat.bps.in (bps) tool.rat.bps.out (bps) Used by the media engine to inform the user interface of the input and output data rates. tool.rat.spike.events (ssrc ...) tool.rat.spike.toged (ssrc ...) Used by the media engine to inform the user interface of the number of "spike events" (sudden increases in the end to end delay, which may affect media playout), and the number of packets "thrown on the ground" (toged) as a result of those events. tool.rat.audio.buffered (ssrc ...) tool.rat.audio.delay (ssrc ...) tool.rat.audio.skew (ssrc ...) Used by the media engine to informt he user interface of the amount of audio buffered for playout, playout delay and relative clock skew between source and receiver. tool.rat.loopback.gain (gain) Set the gain of the audio signal looped back from microphone to headset at the transmitter. tool.rat.converters.request () Request that the media engine informs the sender of this message of the list of supported sample rate converters. tool.rat.converters.flush () Clear the list of sample rate converters. Sent by the media engine in response to tool.rat.settings() or tool.rat.converters.request(). tool.rat.converters.add (...) Inform the receiver of a supported converter. Sent by the media engine. tool.rat.converter (...) Sent to the media engine to select a particular converter. The converter name used is one of those previously sent in a tool.rat.converters.add() message. tool.rat.repairs.request() tool.rat.repairs.flush () tool.rat.repairs.add (...) These function in much the same way as tool.rat.converters.*(), except that they list error concealment (repair) schemes. tool.rat.codecs.request() tool.rat.codecs.flush() tool.rat.codecs.add(...) These function in much the same way as tool.rat.converters.*(), except that they list codecs. tool.rat.codec (...) Set the codec to be used. tool.rat.playout.max (ms) tool.rat.playout.min (ms) tool.rat.playout.limit (boolean) Set the maximum and minimum playout delay allowed. Ignored unless tool.rat.playout.limit(1) is sent. tool.rat.rate (units-per-packet) Set the number of "units" (codec frames, typically) placed in each packet when transmitting. tool.rat.format.in (...) tool.rat.sampling.supported (...) Inform the receiver that a particular sampling rate is supported by the audio hardware. Sent in response to tool.rat.settings(). tool.rat.voxlet.play (filename) Play back a voxlet. See README.voxlet for details. ------------------------------------------------------------------------------- rat-4.2.22/README.playout0100640000175000017500000000564606753104771013741 0ustar enderender>>>Quick question on rat: does your adaptive playout buffer algorithm take >>>the redundancy into account? I would expect it would do something like: >>>compute the playout delay as normal, and then add N*packetization_delay, >>>where N is the number of packets in the past covered by the redundancy >>>in a packet. Is that basically right? >> >>To avoid modifying the playout calculation for each channel coder the >>channel coders may add the extra delay in their decode stage. We have >>two buffers in the receiver: one for media data and one for channel >>data. The same playout time is used for both. When a channel coded >>unit reaches playout it is passed to the channel decoder. The >>channel decoder may or may not output a media unit. If it does it is >>decoded and played. In the case of the redundant decoder there is >>some internal buffering inside (N * packetization_delay) to ensure the >>redundant data can be used. > >What is a channel coder in this context? Are you talking abut the >redundant codecs? There is a generic framework for channel coders. We currently have redundancy and layered, and used to have interleaving, though it was removed for some re-engineering and I have not had time to add it back. It should work with parity and Reed-Solomon also. >Wouldn't the additional buffering need to be in the playout buffer of >the main codec? Right, there are two playout buffers, one for the channel coded data and one for the media data. The channel coder can output media units with any playout offset it chooses. The story in the case of redundancy goes as follows: let the channel unit (redundant packet) playout time be Tc, then media units are output at: Tm (i) = Tc + max_offset + i * frame_duration where Tm(i) is the output time of media frame, i, arising from the channel unit. >My question is also how this amount and the playout >delay computed from network jitter are used - do you add the >n*packetization delay to the playout delay computed from jitter? The playout delay calculation has some caveats, but it is basically 3 * jitter as calculated at the arrival time of the first packet in the talkspurt. Caveats are: 1) with first packet received we have no jitter information so take minimum of 3 * frame_duration and 3 * 20ms. 2) if user has set bounds on the minimum and maximum playout delay, constrain playout to sit inside these bounds. 3) if lip synchronization is in use, use playout negotiated with video tool (always >= jitter based playout calculation). 4) playout time of incoming audio overlaps with audio currently being played - push back. 5) playout delay is less than cushion, use cushion - cushion is estimate of how much audio is in device buffer to protect against process losing cycles in scheduler. >>There is no option to vary the amount of internal buffering for >>redundancy, but obviously it would be trivial to do. rat-4.2.22/README.reporting-bugs0100640000175000017500000004663107117735062015210 0ustar enderenderHow to Report Bugs Effectively Simon Tatham Introduction Anybody who has written software for public use will probably have received at least one bad bug report. Reports that say nothing ("It doesn't work!"); reports that make no sense; reports that don't give enough information; reports that give wrong information. Reports of problems that turn out to be user error; reports of problems that turn out to be the fault of somebody else's program; reports of problems that turn out to be network failures. There's a reason why technical support is seen as a horrible job to be in, and that reason is bad bug reports. However, not all bug reports are unpleasant: I maintain free software, when I'm not earning my living, and sometimes I receive wonderfully clear, helpful, informative bug reports. In this essay I'll try to state clearly what makes a good bug report. Ideally, I would like everybody in the world to read this essay before reporting any bugs to anybody. Certainly I would like everybody who reports bugs to me to have read it. In a nutshell, the aim of a bug report is to enable the programmer to see the program failing in front of him. You can either show him in person, or give him careful and detailed instructions on how to make it fail. If he can make it fail, he will try to gather extra information until he knows the cause. If he can't make it fail, he will have to ask you to gather that information for him. In bug reports, try to make very clear what are actual facts ("I was at the computer and this happened") and what are speculations ("I think the problem might be this"). Leave out speculations if you want to, but don't leave out facts. When you report a bug, you are doing so because you want the bug fixed. There is no point in swearing at the programmer or being deliberately unhelpful. It may be his fault and your problem, and you might be right to be angry with him, but the bug will get fixed faster if you help by supplying all the information he needs. Remember also that if the program is free, the author is providing it out of kindness, so if too many people are rude to him, he may stop feeling kind. "It doesn't work." Give the programmer some credit for basic intelligence. If the program really didn't work at all, he would probably have noticed. Since he hasn't noticed, it must be working for him. Therefore, either you are doing something differently, or your environment is different from his. He needs information; providing this information is the purpose of a bug report. More information is almost always better than less. Many programs, particularly free ones, publish their list of known bugs. If you can find a list of known bugs, it's worth reading it to see if the bug you've just found is already known or not. If it's already known, it probably isn't worth reporting again, but if you think you have more information than the report in the bug list, you might want to contact the programmer anyway. He might be able to fix the bug more easily if you can give him information he didn't already have. This essay is full of guidelines. None of them is an absolute rule. Particular programmers have particular ways they like bugs to be reported. If the program comes with its own set of bug-reporting guidelines, read them. If the guidelines that come with the program contradict the guidelines in this essay, follow the ones that come with the program! If you are not reporting a bug but just asking for help using the program, you should state where you have already looked for the answer to your question. ("I looked in chapter 4 and section 5.2 but couldn't find anything that told me if this is possible.") This will let the programmer know where people will expect to find the answer, so they can make the documentation easier to use. "Show me." One of the very best ways you can report a bug is by showing it to the programmer. Stand him in front of your computer, fire up his software, and demonstrate the thing that goes wrong. Let him watch you start the machine, watch you run the software, watch how you interact with the software, and watch what the software does in response to your inputs. He knows that software like the back of his hand. He knows which parts he trusts, and he knows which parts are likely to have faults. He knows intuitively what to watch for. By the time the software does something obviously wrong, he may well have already noticed something subtly wrong earlier which might give him a clue. He can observe everything the computer does during the test run, and he can pick out the important bits for himself. This may not be enough. He may decide he needs more information, and ask you to show him the same thing again. He may ask you to talk him through the procedure, so that he can reproduce the bug for himself as many times as he wants. He might try varying the procedure a few times, to see whether the problem occurs in only one case or in a family of related cases. If you're unlucky, he may need to sit down for a couple of hours with a set of development tools and really start investigating. But the most important thing is to have the programmer looking at the computer when it goes wrong. Once he can see the problem happening, he can usually take it from there and start trying to fix it. "Show me how to show myself." This is the era of the Internet. This is the era of worldwide communication. This is the era in which I can send my software to somebody in Russia at the touch of a button, and he can send me comments about it just as easily. But if he has a problem with my program, he can't have me standing in front of it while it fails. "Show me" is good when you can, but often you can't. If you have to report a bug to a programmer who can't be present in person, the aim of the exercise is to enable him to reproduce the problem. You want the programmer to run his own copy of the program, do the same things to it, and make it fail in the same way. When he can see the problem happening in front of his eyes, then he can deal with it. So tell him exactly what you did. If it's a graphical program, tell him which buttons you pressed and in what order you pressed them. If it's a program you run by typing a command, show him precisely what command you typed. Wherever possible, you should provide a verbatim transcript of the session, showing what commands you typed and what the computer output in response. Give the programmer all the input you can think of. If the program reads from a file, you will probably need to send a copy of the file. If the program talks to another computer over a network, you probably can't send a copy of that computer, but you can at least say what kind of computer it is, and (if you can) what software is running on it. "Works for me. So what goes wrong?" If you give the programmer a long list of inputs and actions, and he fires up his own copy of the program and nothing goes wrong, then you haven't given him enough information. Possibly the fault doesn't show up on every computer; your system and his may differ in some way. Possibly you have misunderstood what the program is supposed to do, and you are both looking at exactly the same display but you think it's wrong and he knows it's right. So also describe what happened. Tell him exactly what you saw. Tell him why you think what you saw is wrong; better still, tell him exactly what you expected to see. If you say "and then it went wrong", you have left out some very important information. If you saw error messages, tell the programmer, carefully and precisely, what they were. They are important! At this stage, the programmer is not trying to fix the problem; he's just trying to find it. He needs to know what has gone wrong, and those error messages are the computer's best effort to tell you that. Write the errors down if you have no other easy way to remember them, but it's not worth reporting that the program generated an error unless you can also report what the error message was. In particular, if the error message has numbers in it, do let the programmer have those numbers. Just because you can't see any meaning in them doesn't mean there isn't any. Numbers contain all kinds of information that can be read by programmers, and they are likely to contain vital clues. Numbers in error messages are there because the computer is too confused to report the error in words, but is doing the best it can to get the important information to you somehow. At this stage, the programmer is effectively doing detective work. He doesn't know what happened, and he can't get close enough to watch it happening for himself, so he's searching for clues that might give it away. Error messages, incomprehensible strings of numbers, and even unexplained delays are all just as important as fingerprints at the scene of a crime. Keep them! If you are using Unix, the program may have produced a core dump. Core dumps are a particularly good source of clues, so don't throw them away. On the other hand, most programmers don't like to receive huge core files by e-mail without warning, so ask before mailing one to anybody. Also, be aware that the core file contains a record of the complete state of the program: any "secrets" involved (maybe the program was handling a personal message, or dealing with confidential data) may be contained in the core file. "So then I tried..." There are a lot of things you might do when an error or bug comes up. Many of them make the problem worse. A friend of mine at school deleted all her Word documents by mistake, and before calling in any expert help, she tried reinstalling Word, and then she tried running Defrag. Neither of these helped recover her files, and between them they scrambled her disk to the extent that no Undelete program in the world would have been able to recover anything. If she'd only left it alone, she might have had a chance. Users like this are like a mongoose backed into a corner: with its back to the wall and seeing certain death staring it in the face, it attacks frantically, because doing something has to be better than doing nothing. This is not well adapted to the type of problems computers produce. Instead of being a mongoose, be an antelope. When an antelope is confronted with something unexpected or frightening, it freezes. It stays absolutely still and tries not to attract any attention, while it stops and thinks and works out the best thing to do. (If antelopes had a technical support line, it would be telephoning it at this point.) Then, once it has decided what the safest thing to do is, it does it. When something goes wrong, immediately stop doing anything. Don't touch any buttons at all. Look at the screen and notice everything out of the ordinary, and remember it or write it down. Then perhaps start cautiously pressing "OK" or "Cancel", whichever seems safest. Try to develop a reflex reaction - if a computer does anything unexpected, freeze. If you manage to get out of the problem, whether by closing down the affected program or by rebooting the computer, a good thing to do is to try to make it happen again. Programmers like problems that they can reproduce more than once. Happy programmers fix bugs faster and more efficiently. "I think the tachyon modulation must be wrongly polarised." It isn't only non-programmers who produce bad bug reports. Some of the worst bug reports I've ever seen come from programmers, and even from good programmers. I worked with another programmer once who kept finding bugs in his own code and trying to fix them. Every so often he'd hit a bug he couldn't solve, and he'd call me over to help. "What's gone wrong?" I'd ask. He would reply by telling me his current opinion of what had caused the problem. This worked fine when his current opinion was right. It meant he'd already done half the work and we were able to finish the job together. It was efficient and useful. But quite often he was wrong. We would work for some time trying to figure out why some particular part of the program was producing incorrect data, and eventually we would discover that it wasn't, that we'd been investigating a perfectly good piece of code for half an hour, and that the actual problem was somewhere else. I'm sure he wouldn't do that to a doctor. "Doctor, I think I've got Perkin's disease." People know not to say that to a doctor: you describe the symptoms, the actual discomforts and aches and pains and rashes and fevers, and you let the doctor do the diagnosis of what caused the problem. Otherwise, the doctor dismisses you as a hypochondriac or crackpot, and quite rightly so. It's the same with programmers. Providing your own diagnosis might be helpful sometimes, but always state the symptoms. The diagnosis is an optional extra, and not an alternative to giving the symptoms. Equally, sending a modification to the code to fix the problem is a useful addition to a bug report but not an adequate substitute for one. If a programmer asks you for extra information, don't make it up! Somebody reported a bug to me once, and I asked him to try a command that I knew wouldn't work. The reason I asked him to try it was that I wanted to know which of two different error messages it would give. Knowing which error message came back would give a vital clue. But he didn't actually try it; he just mailed me back and said "No, that won't work". It took me some time to persuade him to try it for real. Using your intelligence to help the programmer is fine. Even if your deductions are wrong, the programmer should be grateful that you at least tried to make his life easier. But report the symptoms as well, or you may well make his life much more difficult instead. "That's funny, it did it a moment ago." Say "intermittent fault" to any programmer and watch his face fall. The easy problems are the ones in which failure is caused by a simple sequence of actions. The programmer can then repeat those actions under closely observed test conditions and watch what happens in great detail. Too many problems simply don't work that way: there will be programs that fail once a week, or fail once in a blue moon, or never fail when you try them in front of the programmer but always fail when you have a deadline coming up. Most intermittent faults are not truly intermittent. Most of them have some logic somewhere. Some might occur when the machine is running out of memory, some might occur when another program tries to modify a critical file at the wrong moment, and some might occur only in the first half of every hour! (I've actually seen one of these.) Also, if you can reproduce the bug but the programmer can't, it could very well be that his computer and your computer are different in some way and this difference is causing the problem. I had a program once whose window curled up into a little ball in the top left corner of the screen, and sat there and sulked. But it only did it on 800x600 screens; it was fine on my 1024x768 monitor. The programmer will want to know anything you can find out about the problem. Try it on another machine, perhaps. Try it twice or three times and see how often it fails. If it goes wrong when you're doing serious work but not when you're trying to demonstrate it, it might be long running times or large files that make it fall over. Try to remember as much detail as you can about what you were doing to it when it did fall over, and if you see any patterns, mention them. Anything you can provide has to be some help. Even if it's only probabilistic (such as "it tends to crash more often when Emacs is running"), it might not provide direct clues to the cause of the problem, but it might help the programmer reproduce it. Most importantly, the programmer will want to be sure of whether he's dealing with a true intermittent fault or a machine-specific fault. He will want to know lots of details about your computer, so he can work out how it differs from his. A lot of these details will depend on the particular program, but one thing you should definitely be ready to provide is version numbers. The version number of the program itself, and the version number of the operating system, and probably the version numbers of any other programs that are involved in the problem. "So I loaded the disk on to my Windows..." Writing clearly is essential in a bug report. If the programmer can't tell what you meant, you might as well have not said anything. I get bug reports from all around the world. Many of them are from non-native English speakers, and a lot of those apologize for their poor English. In general, the bug reports with apologies for their poor English are actually very clear and useful. All the most unclear reports come from native English speakers who assume that I will understand them even if they don't make any effort to be clear or precise. Be specific. If you can do the same thing two different ways, state which one you used. "I selected Load" might mean "I clicked on Load" or "I pressed Alt-L". Say which you did. Sometimes it matters. Be verbose. Give more information rather than less. If you say too much, the programmer can ignore some of it. If you say too little, he has to come back and ask more questions. One bug report I received was a single sentence. Every time I asked for more information, the reporter would reply with another single sentence. It took me several weeks to get a useful amount of information, because it turned up one short sentence at a time. Be careful of pronouns. Don't use words like "it", or references like "the window", when it's unclear what they mean. Consider this: "I started FooApp. It put up a warning window. I tried to close it and it crashed." It isn't clear what the user tried to close. Did he try to close the warning window, or the whole of FooApp? It makes a difference. Instead, you could say "I started FooApp, which put up a warning window. I tried to close the warning window, and FooApp crashed." This is longer and more repetitive, but also clearer and easier to understand. Read what you wrote. Read the report back to yourself, and see if you think it's clear. If you have listed a sequence of actions which should produce the failure, try following them yourself, to see if you missed a step. Summary - The first aim of a bug report is to let the programmer see the failure with his own eyes. If you can't be with him to make it fail in front of him, give him detailed instructions so that he can make it fail for himself. - In case the first aim doesn't succeed, and the programmer can't see it failing himself, the second aim of a bug report is to describe what went wrong. Describe everything in detail. State what you saw, and also state what you expected to see. Write down the error messages, especially if they have numbers in them. - When your computer does something unexpected, freeze. Do nothing until you're calm, and don't do anything that you think might be dangerous. - By all means, try to diagnose the fault yourself if you think you can, but if you do, you should still report the symptoms as well. - Be ready to provide extra information if the programmer needs it. If he didn't need it, he wouldn't be asking for it. He isn't being deliberately awkward. Have version numbers at your fingertips, because they will probably be needed. - Write clearly. Say what you mean, and make sure it can't be misinterpreted. - Above all, be precise. Programmers like precision. Disclaimer: I've never actually seen a mongoose or an antelope. My zoology may be inaccurate. rat-4.2.22/README.settings0100640000175000017500000000436507113504261014066 0ustar enderender>Can you explain the default file a little better. >ie. what should the actual file name be and where should it be? On Unix, there are two files in your home directory: .RATdefaults .RTPdefaults The .RATdefaults file can have the following entries: *audioTool: RAT v4.2.5 SunOS 5.7 (sun4u) *audioLoopback: 0 --+ *audioAGC: 0 | *audioEchoSuppress: 0 | *audioLecture: 0 +-- 0 = disable, 1 = enable *audioPowermeters: 1 | *audio3dRendering: 0 | *audioLimitPlayout: 0 --+ *audioMaxPlayout: 2000 +-- If audioLimitPlayout is enabled, *audioMinPlayout: 0 --+ specify limits in milliseconds *audioPrimary: GSM }-- Primary codec *audioUnits: 1 }-- Number of frames of audio per packet *audioChannelCoding: None }-- Type of channel coding used *audioChannelParameters: }-- Optional channel coding parameters *audioRepair: Pattern-Match }-- Type of repair used *audioSilence: Off --+-- Control silence suppression *audioSilenceManualThresh: 100 --+ *audioAutoConvert: High Quality }-- Type of sample rate conversion *audioChannelsIn: 1 }-- 1 = mono, 2 = stereo *audioDevice: Sun Audio Device }-- Audio card being used *audioInputPort: Microphone --+ *audioOutputPort: Headphone | *audioInputGain: 49 +-- Record and playback device, *audioOutputGain: 43 | sample rate, and volume *audioFrequency: 8000 --+ *audioInputMute: 1 }-- Start with transmission muted? *audioOutputMute: 1 }-- Start with reception muted? All apart from the last two options are saved automatically, and correspond to options which can be set in the user interface. The audioInputMute and audioOutputMute settings are never saved, but are used in the are manually added to the settings (hence can be used to force rat to transmit on startup). And .RTPdefaults has a similar format, and corresponds to the setting in the personal details options panel. *rtpName: Colin Perkins *rtpEmail: c.perkins@cs.ucl.ac.uk *rtpPhone: +44 171 419 3666 *rtpLoc: University College London *rtpNote: On Windows machines, the settings are stored in the registry under Software\Mbone Applications\rat Software\Mbone Applications\common in HKEY_CURRENT_USER. The settings which may be stored here are the same as those in the unix version, and may be edited with regedit. rat-4.2.22/README.timestamps0100640000175000017500000000271206754254643014426 0ustar enderender> If you could please write me a sentence or three about the meaning and > use of the ts_t structures, I would be most grateful. The timestamp structure is a devious tool for handling timestamps from different rate clocks. By default RTP uses 32 bits to handle timestamps, however, if you have two sources at different rates and the internal timestamp representation used for both is 32 bits you have a problem with operations that cause wraparounds since you cannot scale the faster rate clock down to the lower clock. The ts_t structure is used to get around this by having the wrap point for a given clock proportional to the rate of the clock. Thus comparison can always be made by linearly scaling timestamp values. The timestamp structure itself contains 3 fields: ticks - how far along the timeline we are check - used to make sure timestamp is properly initialized. idx - index to table of frequencies, i.e. identify timebase and wrap point Timestamps are initialized in one of two ways: i) ts_map32 ii) ts_seq32_in ts_map32 maps a 32 bit timestamp, frequency tuple to a valid timestamp. This is used for mapping small timestamp values - less than wraparound of timestamp scale (372 seconds). ts_seq32_in and ts_seq_32_out convert between ts_t and 32 bit timestamps. They are needed because the wrap points of the two representations are different and so use relative difference between the previous and current timestamp to calculate the next value. rat-4.2.22/README.voxlet0100640000175000017500000000303507054741724013553 0ustar enderenderIntroducing voxlets.... ======================= $Id: README.voxlet,v 1.2 2000/02/23 11:26:12 ucaccsp Exp $ Starting with release 4.1.7, rat supports playout of voxlets - audio clips played back to the local user (only) in response to the tool.rat.voxlet.play(filename) mbus message. This allows, for example, the balloon help system to trigger audible help messages. When the media engine receive the command to play a voxlet, it searches in the directory specified by the VOXLETDIR environment variable, and plays the file with the given name, if found. If the VOXLETDIR variable is not set, the directory /usr/local/share/voxlets is searched (on windows, \voxlets). The following filenames are used in the balloon help system: tx_gain.au tx_port.au tx_port.au tx_mute.au tx_powermeter.au rx_gain.au rx_port.au rx_port.au rx_mute.au rx_powermeter.au session_title.au participant_list.au balloon_help.au options.au about.au quit.au prefs_category.au cancel_changes.au apply_changes.au user_name.au user_email.au user_phone.au user_loc.au audio_device.au sampling_freq.au mono_stereo.au suppress_silence.au agc.au audio_loopback.au echo_suppression.au packet_duration.au codec_primary.au channel_coding_none.au channel_coding_redundant.au red_codec.au red_offset.au num_layers.au int_sep.au int_units.au channel_coding_interleave.au repair_schemes.au samples_rate_conversion.au playout_limits.au min_playout_delay.au max_playout_delay.au lecture_mode.au security.au disable_powermeters.au balloon_help.au rqm_enable.au participant_list.au rqm.au rat-4.2.22/VERSION0100640000175000017500000000000707472536116012420 0ustar enderender4.2.22 rat-4.2.22/xbm/0040750000175000017500000000000007517342176012144 5ustar enderenderrat-4.2.22/xbm/balloon.xbm0100640000175000017500000000207007054745634014301 0ustar enderender#define balloon_width 20 #define balloon_height 20 #ifndef WIN32 static unsigned char balloon_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x10, 0x40, 0x00, 0x10, 0x47, 0x00, 0x90, 0x4d, 0x00, 0x90, 0x48, 0x00, 0x10, 0x4c, 0x00, 0x10, 0x46, 0x00, 0x10, 0x42, 0x00, 0x10, 0x44, 0x00, 0x10, 0x46, 0x00, 0x10, 0x40, 0x00, 0xe0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char balloon_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\xe0', '\x3f', '\x00', '\x10', '\x40', '\x00', '\x10', '\x47', '\x00', '\x90', '\x4d', '\x00', '\x90', '\x48', '\x00', '\x10', '\x4c', '\x00', '\x10', '\x46', '\x00', '\x10', '\x42', '\x00', '\x10', '\x44', '\x00', '\x10', '\x46', '\x00', '\x10', '\x40', '\x00', '\xe0', '\xff', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif /* WIN32 */ /**** Generated by xbm2dual.awk ****/ rat-4.2.22/xbm/disk.xbm0100640000175000017500000000176106610436505013602 0ustar enderender#define disk_width 20 #define disk_height 20 #ifndef WIN32 static char disk_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x30, 0xc0, 0x00, 0xb0, 0xdf, 0x00, 0x30, 0xc0, 0x00, 0xb0, 0xd6, 0x00, 0x30, 0xc0, 0x00, 0xf0, 0xff, 0x00, 0xf0, 0xf0, 0x00, 0xf0, 0xf2, 0x00, 0xf0, 0xf2, 0x00, 0xf0, 0xf2, 0x00, 0xf0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char disk_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\xf0', '\xff', '\x00', '\x30', '\xc0', '\x00', '\xb0', '\xdf', '\x00', '\x30', '\xc0', '\x00', '\xb0', '\xd6', '\x00', '\x30', '\xc0', '\x00', '\xf0', '\xff', '\x00', '\xf0', '\xf0', '\x00', '\xf0', '\xf2', '\x00', '\xf0', '\xf2', '\x00', '\xf0', '\xf2', '\x00', '\xf0', '\x7f', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif rat-4.2.22/xbm/left.xbm0100640000175000017500000000047207012602421013565 0ustar enderender#define left_width 8 #define left_height 8 #ifndef WIN32 static unsigned char left_bits[] = { 0x20, 0x30, 0x38, 0x3c, 0x3c, 0x38, 0x30, 0x20}; #else static unsigned char left_bits[] = { '\x20', '\x30', '\x38', '\x3c', '\x3c', '\x38', '\x30', '\x20'}; #endif /* WIN32 */ /**** Generated by xbm2dual.awk ****/ rat-4.2.22/xbm/pause.xbm0100640000175000017500000000200106610436506013752 0ustar enderender#define pause_width 20 #define pause_height 20 #ifndef WIN32 static char pause_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0xc0, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char pause_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\xc0', '\x39', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif /* WIN32 */ rat-4.2.22/xbm/play.xbm0100640000175000017500000000176106610436506013616 0ustar enderender#define play_width 20 #define play_height 20 #ifndef WIN32 static char play_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x0f, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char play_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\xc0', '\x00', '\x00', '\xc0', '\x03', '\x00', '\xc0', '\x0f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x0f', '\x00', '\xc0', '\x03', '\x00', '\xc0', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif rat-4.2.22/xbm/rat2.xbm0100640000175000017500000002150106535542143013514 0ustar enderender#define rat2_width 165 #define rat2_height 83 static char rat2_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x02,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x46,0x05,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x0a,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x25,0x15,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd8,0x00,0x40,0x92,0x32,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x40,0x49, 0x48,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x01,0x0c,0xc0,0x54,0xad,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf8,0x10,0x80,0x22,0xa5,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x8c, 0x11,0x80,0x95,0x52,0x01,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x40,0x06,0x21,0x00,0x4a,0x89,0x02,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x02,0x02,0x00,0xa6, 0x54,0x02,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x40,0x03,0x22,0x00,0x14,0x4a,0x05,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x12,0x22,0x00,0xd4,0x22,0x0d,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03, 0x11,0x00,0x2e,0x54,0x12,0x04,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x04,0xf8,0x1d,0x11,0x00,0x59,0x25,0x59,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xf4,0x81,0x10,0x80,0xb4, 0x92,0x6a,0x04,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0xf1,0xc0,0x08,0xa0,0x72,0xa8,0x7c,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x30,0x00,0x04,0x50,0x4c,0x85,0x4b,0x42, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3a,0x00,0x08, 0x0f,0x0c,0x83,0xd5,0x36,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xa8,0x02,0x80,0x11,0xa4,0x01,0xd1,0x1a,0x20,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x01,0x01,0xa0,0xd2,0x00, 0x6b,0x8d,0x10,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x38,0x02,0x20,0x40,0x2a,0x00,0xb6,0x42,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x1d,0x80,0x54,0x19,0x00,0xac,0x01,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x06,0x02, 0x58,0x06,0x00,0x78,0x10,0x06,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x38,0x00,0x26,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x54,0x00,0xd3,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x52,0xc4,0x4b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x19,0x60,0x3c,0x04,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf0,0xff, 0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x40,0x00,0x1d,0x0b,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0x7f,0x4b,0x04,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xb0,0xff,0xdf,0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x60,0xf0,0x7f,0x10,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0xf0,0x3c, 0x10,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x20,0x00, 0x00,0x1c,0x00,0x00,0xd0,0x4f,0x12,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x00,0x90,0x9b,0x10,0x06,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x34,0x00, 0x00,0x10,0xb0,0x11,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x2c,0x00,0x00,0x38,0x00,0x00,0x10,0x60,0x12,0x05,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x5e,0x00,0x00,0x10,0x80, 0x1c,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x32,0x00, 0x60,0x47,0x00,0x00,0x30,0x80,0x11,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x62,0x6f,0x0d,0x40,0x00,0x00,0x90,0x00,0x86,0x09,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x80,0x00, 0x00,0x10,0x02,0x8c,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x10,0x00,0xd8,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x01,0x00,0x10,0x20, 0x60,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x80,0x00,0x1d, 0x00,0x00,0x01,0x00,0x10,0x80,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0xc0,0x1f,0x80,0x80,0xe1,0x00,0x00,0x02,0x00,0x20,0x42,0xbf,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x38,0x60,0x40,0x60,0x1e,0x01,0x00,0x02, 0x00,0x30,0x60,0xc0,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x06,0x80, 0x00,0x20,0xf2,0x00,0x00,0x02,0x00,0x20,0x10,0x04,0x23,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x80,0x81,0x02,0x43,0x18,0xc0,0x00,0x00,0x04,0x00,0xa0,0x18, 0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x80,0xf0,0x0d,0x22,0xe8,0x43, 0x01,0x00,0x04,0x00,0x20,0x0c,0x00,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x40,0x08,0x18,0x24,0x94,0xbf,0x00,0x04,0xdc,0x2b,0x40,0x14,0x21,0x44,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x40,0x04,0x20,0x16,0x14,0xc2,0x00,0x0a,0x03, 0xd0,0x42,0x04,0x00,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x20,0x46,0x64, 0x14,0x1a,0xb2,0x80,0x11,0x01,0x00,0x86,0x04,0x04,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x20,0x02,0x40,0x16,0x14,0x09,0x83,0x92,0x43,0x12,0x88,0x04, 0x80,0x04,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x02,0x20,0x1c,0xe2,0x08, 0xa1,0x24,0x1c,0x04,0x08,0x45,0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0xe0, 0x30,0x20,0x21,0xf4,0x07,0x08,0xba,0x24,0xe1,0x00,0x08,0x0e,0x10,0x06,0x08, 0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x06,0x30,0x84,0xfe,0x09,0x26,0x21,0x01, 0xaf,0x08,0x0c,0x01,0x1a,0x30,0x00,0x00,0x00,0x00,0x00,0xe0,0x20,0x18,0x0c, 0x02,0xf8,0x19,0x20,0x26,0x01,0x60,0x0f,0x0c,0x00,0xf3,0xc1,0x00,0x00,0x00, 0x00,0x00,0xe0,0x20,0xe0,0x03,0x02,0x80,0x60,0xd0,0xb7,0x01,0x00,0x08,0x18, 0x80,0x01,0x0e,0xdd,0x02,0x00,0x00,0x00,0xe0,0x40,0x00,0x00,0x01,0xc0,0x89, 0x6f,0x57,0x01,0x00,0x08,0x50,0x48,0x00,0xe0,0x00,0x0c,0x00,0x00,0x00,0xe0, 0xc0,0x00,0x80,0xbf,0x81,0x1e,0x23,0x07,0x00,0x00,0x04,0x20,0x60,0x00,0x00, 0x0e,0x10,0x00,0x2c,0x00,0xe0,0x80,0x01,0xc0,0xc4,0xef,0xc2,0x2c,0x1e,0x08, 0x00,0x06,0x20,0x21,0x00,0x00,0x30,0x60,0xe9,0x40,0x01,0xe0,0x00,0x0b,0x79, 0x02,0x7c,0x71,0xd4,0x07,0x00,0x11,0x02,0x20,0x10,0x00,0x00,0x80,0x49,0x04, 0x1f,0xaf,0xe5,0x00,0xbe,0x1f,0x01,0xf8,0x93,0x10,0xbe,0x05,0x80,0x01,0x30, 0x18,0x00,0x00,0x00,0x8a,0xc3,0xa0,0x14,0xe4,0x00,0x20,0x80,0x01,0xe0,0x09, 0x0d,0x23,0xfe,0x6d,0xc0,0x07,0x08,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0xe0, 0x00,0x00,0x80,0x41,0xeb,0x07,0xe0,0xf7,0x3f,0x08,0x40,0x00,0x10,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0xff,0x14,0xbe,0x3e,0x00,0xa0, 0x01,0x80,0xf9,0x0f,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80, 0x00,0x00,0x40,0x01,0x00,0xe0,0x8d,0x09,0x77,0x0e,0x19,0x7c,0x04,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0xa0,0x7f,0x8c,0x18,0x33, 0xc6,0xcd,0x37,0x06,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x80,0x55,0xff,0xff, 0xff,0x3f,0xa0,0xe6,0x8c,0xb1,0x35,0x10,0xb8,0x0d,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x00,0x00,0x10,0x5b,0x46,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0}; rat-4.2.22/xbm/rat_med.xbm0100640000175000017500000006262506535542143014273 0ustar enderender#define rat_med_width 212 #define rat_med_height 187 static char rat_med_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x1f, 0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xe0,0x1f,0x00,0x00,0xc0,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8,0xff,0x1f,0x00,0x00,0x00,0xf8,0x01,0x00,0x00,0x80,0x1f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x7f, 0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x3f,0x00, 0x1f,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff, 0xff,0x0f,0x00,0x00,0xfe,0xff,0x9f,0xfd,0xff,0xff,0xff,0x81,0x0f,0x00,0x00, 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x3f,0x00, 0xfc,0xff,0xff,0x00,0x00,0xfe,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xc0, 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0xff,0x00,0xff,0xff,0x3f, 0x00,0x00,0xc0,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0xf8,0xe3,0xff,0xff,0x1f,0xf8,0xff,0x07, 0x9c,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00, 0xc0,0x1f,0x00,0x00,0xc0,0xff,0xff,0x3f,0xf8,0xff,0xff,0xff,0x0f,0xfe,0xff, 0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0xf0,0x07,0x00, 0x00,0x00,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0x7f,0xf0,0xff,0x07,0x00,0x00, 0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0xe0,0xff, 0x7f,0xf0,0xff,0x00,0x00,0x00,0xfe,0x0f,0xff,0x0f,0x00,0x00,0x00,0x00,0x00, 0x1c,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0xe0,0xff,0x1f,0xfe,0x07, 0x00,0x00,0x00,0xf0,0x3f,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00, 0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0xf0,0xff,0x0f,0xff,0x03,0x00,0x00,0x00, 0x80,0x7f,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x80, 0x0f,0x00,0x00,0x00,0xff,0x07,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0xf0,0x07, 0x7f,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00, 0x00,0xff,0x03,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xff,0x00,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0xc0,0xff,0x01, 0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xfe,0x00,0x00,0x00,0x00,0x00, 0x70,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe0,0x3f,0x80,0x7f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0xf8,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00, 0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x1f,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0xf0,0x01,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x78, 0x00,0x00,0x00,0xf8,0x07,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0xe0,0x03,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0xfc,0x07,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xc0,0x03,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0xfe,0x03,0x7e, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x80,0x07,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xff,0x80,0x0f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x1f,0x00,0x00,0x00,0x00,0xc0,0x01,0x00, 0x00,0x00,0x1e,0x00,0x00,0x80,0xff,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x07,0x1f,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x0f, 0x00,0x00,0xc0,0x7f,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0f,0x7e,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0xc0, 0x3f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x7e,0x00, 0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x07,0x00,0x00,0xc0,0x3f,0xf8,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x7e,0x00,0x00,0x00,0x00, 0x80,0x03,0x00,0x00,0x80,0x03,0x00,0x00,0xe0,0x1f,0x3e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x7e,0x00,0x00,0x00,0x00,0x00,0x03,0x00, 0x00,0xc0,0x03,0x00,0x00,0xf0,0x0f,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xf0,0xfc,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x01, 0x00,0x00,0xf8,0x87,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0xfc,0x01,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x00,0x00,0xf8, 0xc7,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xf9,0x01, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xe0,0x00,0x00,0x00,0xf8,0xc7,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xe3,0x0f,0x00,0x00,0x00, 0x00,0x03,0x00,0x00,0xf0,0x00,0x00,0x00,0xfc,0xe1,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xe3,0xff,0x01,0x00,0x00,0x00,0x03,0x00, 0x00,0xf0,0x00,0x00,0x00,0xfc,0xf1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf3,0xff,0x01,0x00,0x00,0x00,0x03,0x00,0x00,0x78,0x00, 0x00,0x00,0xfe,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xff,0xff,0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x78,0x00,0x00,0x00,0xfe, 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff, 0x03,0x00,0x00,0x00,0x03,0x00,0x00,0x38,0x00,0x00,0x00,0x7e,0x1c,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x07,0x00,0x00, 0x00,0x03,0x00,0x00,0x38,0x00,0x00,0xe0,0x7f,0x1e,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0x80,0x03,0x00, 0x00,0x18,0x00,0x00,0xfc,0x3f,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0xc0,0x03,0x00,0x00,0x18,0x00, 0x00,0xff,0x3f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0xff,0x0f,0x00,0x00,0xc0,0x01,0x00,0x00,0x18,0x00,0x00,0xff,0x3f, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff, 0x0f,0x00,0x00,0xe0,0x00,0x00,0x00,0x1c,0x00,0x80,0xff,0xff,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x0f,0x00,0x00, 0xe0,0x00,0x00,0x00,0x1c,0x00,0x80,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x0f,0x00,0x00,0xe0,0x00,0x00, 0x00,0x1c,0x00,0x80,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf8,0xff,0x0f,0x00,0x00,0xf0,0x00,0x00,0x00,0x1c,0x00, 0x80,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0xff,0x0f,0x00,0x00,0x70,0x00,0x00,0x00,0x1c,0x00,0x80,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff, 0x0f,0x00,0x00,0x38,0x00,0x00,0x00,0x1c,0x00,0x80,0xff,0xff,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x8f,0x00,0x00, 0x38,0x00,0x00,0x00,0x1c,0x00,0xc0,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x1e,0x00,0x00, 0x00,0x1c,0x00,0xc0,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x03,0x00,0x1f,0x00,0x00,0x00,0x1c,0x00, 0xc0,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0xff,0xff,0xff,0x03,0x00,0x0f,0x00,0x00,0x00,0x1c,0x00,0xc0,0xff,0x7f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff, 0xff,0x07,0x80,0x07,0x00,0x00,0x00,0x1c,0x00,0xe0,0xff,0xff,0x03,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,0xc0, 0x03,0x00,0x00,0x00,0x18,0x00,0xe0,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xf3,0xff,0xff,0x07,0xc0,0x01,0x00,0x00, 0x00,0x18,0x00,0xf0,0xff,0xff,0xff,0xff,0x1f,0xf4,0xff,0x1d,0x00,0x00,0x40, 0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0x07,0xe0,0x01,0x00,0x00,0x00,0x18,0x00, 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xf7,0xff,0xff,0x07,0xf0,0x00,0x00,0x00,0x00,0x18,0x00,0xf0,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff, 0xff,0x07,0x78,0x00,0x00,0x00,0x00,0x18,0x00,0xf0,0xff,0xcf,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xfd,0xff,0xff,0x07,0x38, 0x00,0x00,0x00,0x00,0x18,0x00,0xf0,0xff,0xcf,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xdf,0xff,0xfb,0xff,0xfe,0xff,0xff,0x07,0x3c,0x00,0x00,0x00, 0x00,0x38,0x00,0xf0,0xff,0xcf,0xff,0x1f,0x0f,0xee,0xff,0xff,0xef,0xff,0x73, 0x80,0xff,0xff,0x3f,0xff,0xff,0xff,0x07,0x1e,0x00,0x00,0x00,0x00,0x38,0x00, 0xf0,0xff,0xcf,0xff,0x3f,0x0f,0xee,0xff,0xff,0xff,0xff,0xff,0x80,0xff,0xff, 0xbf,0xff,0xff,0xff,0x03,0x1f,0x00,0x00,0x00,0x00,0x78,0x00,0xf0,0xff,0xff, 0xff,0xff,0x1f,0xcc,0xff,0xff,0xff,0xff,0xff,0x80,0xf7,0xff,0xdf,0xff,0xff, 0xff,0xc3,0x07,0x00,0x00,0x00,0x00,0x78,0x00,0xf0,0xff,0xff,0xff,0xff,0x1f, 0xfc,0xff,0xff,0xff,0xff,0xff,0x81,0xf7,0xff,0xff,0xff,0xff,0xf3,0xc3,0x07, 0x00,0x00,0x00,0x00,0x70,0x00,0xf0,0xff,0xff,0xff,0xff,0x1f,0xfc,0xff,0xff, 0xff,0xff,0xff,0x81,0xff,0xff,0xef,0xfd,0xff,0xf3,0xc3,0x03,0x00,0x00,0x00, 0x00,0xe0,0x00,0xf0,0xff,0xff,0xff,0xff,0x3f,0xf8,0xff,0xff,0x7f,0xfc,0xff, 0x7b,0xff,0xff,0xff,0xfc,0xff,0xf1,0xf3,0x01,0x00,0x00,0x00,0x00,0xe0,0x00, 0xf0,0xff,0xef,0xff,0xff,0x3f,0xf8,0xff,0xff,0xfb,0xfe,0xff,0x7f,0xff,0xff, 0xff,0xfc,0xff,0xf1,0xf1,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xf0,0xff,0x8f, 0xff,0xff,0x7f,0x34,0xde,0xff,0xfe,0xff,0xff,0xff,0xe2,0xfe,0x3f,0xfc,0xff, 0xf0,0x79,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0xf0,0xff,0x0f,0xff,0xff,0x7f, 0x0e,0xfe,0xff,0xff,0xff,0xff,0xff,0xe1,0xfe,0x3f,0xfc,0xff,0xf0,0x3f,0x00, 0x00,0x00,0x00,0x00,0xe0,0x01,0xf0,0xff,0x0f,0xff,0xff,0x7f,0x0e,0xfc,0xff, 0xff,0xff,0xff,0xef,0xe1,0xff,0x1f,0xfe,0xff,0xf0,0x3f,0x00,0x00,0x00,0x00, 0x00,0x80,0x03,0xf0,0xff,0x1f,0xbc,0xff,0xff,0x1f,0xf8,0xff,0x8f,0xff,0xff, 0xff,0xc1,0xff,0x1f,0xee,0x77,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0x07, 0xf0,0xff,0x1f,0x38,0xff,0xff,0x1f,0xf0,0xff,0x07,0xff,0xff,0xff,0xc1,0xff, 0x1f,0xef,0x7b,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xf0,0xff,0x1d, 0xf8,0xff,0xe7,0x3f,0xf0,0xff,0x07,0xff,0xff,0xff,0xc1,0xff,0x0f,0xc7,0x3f, 0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xf0,0xf1,0x1d,0xf0,0xff,0xff, 0x7b,0xf0,0xff,0x07,0xfe,0xff,0xff,0xc3,0xff,0x07,0x87,0x1f,0xf8,0x01,0x00, 0x00,0x00,0x00,0x00,0x00,0x3e,0xf0,0xf1,0x1d,0xf0,0xff,0xff,0x7f,0xf0,0xff, 0x07,0xfe,0xff,0xff,0xc3,0x3f,0x87,0x03,0x1f,0xfc,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xe0,0xff,0x3d,0xe0,0xfe,0xff,0xff,0xe0,0xff,0x03,0xfc,0xff, 0xff,0xc7,0xbf,0x87,0x03,0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0xc0,0xff,0x3f,0xe0,0xfc,0xff,0xff,0xe0,0xbf,0x03,0xdc,0xff,0x7f,0xc7,0xff, 0xc7,0x03,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0xff,0x3f, 0xe0,0xf9,0xff,0xcf,0xc1,0xdf,0x03,0x3c,0x9f,0x7f,0x8f,0xfb,0xc3,0x01,0x80, 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xfe,0x3f,0xe0,0xfb,0xff, 0xdf,0xc1,0xcf,0x01,0x3c,0x0c,0x7f,0xcf,0xff,0xe1,0x01,0xc0,0x7f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x80,0x3b,0xc0,0xff,0xff,0xff,0xc1,0xc5, 0x01,0xf8,0x01,0x1f,0xfe,0xff,0xe0,0x00,0xe0,0x7f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x1f,0x00,0x38,0x80,0x8f,0xff,0xff,0xc3,0xf9,0x00,0xf0,0xff, 0xff,0xff,0x3f,0xe0,0x00,0xf8,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3c,0x00,0x78,0x00,0x1f,0xff,0xff,0xc3,0xfd,0x00,0xf0,0xff,0xff,0xff,0x3f, 0x70,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x70, 0x00,0x7f,0xff,0xe3,0x83,0xff,0x00,0xe0,0xff,0xff,0xff,0x1f,0x70,0x00,0xfc, 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xe0,0x00,0xfc,0xff, 0xff,0xff,0x3f,0x00,0x00,0xff,0xff,0xff,0x03,0x38,0x80,0x9f,0x1f,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0xe0,0x00,0xf8,0xff,0xff,0xff,0x0f, 0x00,0x00,0xff,0xff,0xff,0x00,0x38,0xe0,0x8f,0x0f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0x0f,0xe0,0x00,0x80,0xff,0xff,0xff,0x01,0x00,0x00,0xfe, 0xff,0x0f,0x00,0x1c,0xf8,0xc3,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0x0f,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00, 0x1e,0xfc,0xe1,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xc0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x7f,0xe0, 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xc0,0x01,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,0x1f,0xe0,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xc1,0x01,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xe7,0x07,0xf0,0x03,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xc0,0x87,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0xff,0x01,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x1f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0xff,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f, 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x3f,0x00,0xf8, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x07,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,0x00,0xfc,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf0,0x07,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38, 0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x80,0x3f, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x80,0x1f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x80,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0f,0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07, 0x00,0xe0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0xe0,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0xf0,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf0,0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00, 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x7e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0e,0x00,0x80,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00, 0xe0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0xe0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0xf8,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xe0,0x01,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,0xf0,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf0,0x01,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0xc0,0x7f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00, 0xff,0x00,0x00,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0xff,0x00,0x00, 0x00,0xc0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x80,0x7f,0x00,0x00,0xc0,0x0f,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x0e,0x00,0xc0,0x3f,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00, 0x0f,0x00,0xc0,0x1f,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0xe0, 0x1f,0x40,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0xf0,0x0f,0x7e,0x01, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c, 0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0xf8,0xdf,0x0f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00, 0x00,0x00,0xe0,0x00,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0xf0, 0x00,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x7c,0x00,0xf8,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x3e,0x80,0xff,0x7f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0x07,0x00,0x00,0x00,0x00,0x1f,0xf8,0x0f,0x3e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00, 0x00,0x80,0xff,0x0f,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xe0,0xff, 0x03,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0xff,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xf8,0x07,0x00,0xe0,0x07, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x0f,0x00, 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xfc,0x00,0x00,0xf0,0x07,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0x00,0x00,0x00, 0xf0,0x00,0x00,0x00,0x7f,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x1f,0x00,0x00,0xc0,0x01,0x1e, 0xf8,0x1f,0x00,0x00,0xfc,0x3f,0xff,0xff,0xbf,0xff,0x03,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x5f,0x00,0x80,0x03,0x3f,0xfe,0x0f,0x00, 0xf0,0xff,0xff,0xe7,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x7e,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x3f,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, 0xff,0xff,0xff,0xff,0x7f,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff, 0x7f,0x00,0x00,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,0xf8,0xff,0x1f,0x00,0x00, 0xe0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0x0f,0xf0,0xff,0x07,0x00,0x00,0xf0,0x07,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xe0,0xff,0x1f,0x00,0xf0,0xff,0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7f,0x00, 0x00,0xf8,0xff,0xef,0xff,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x07,0x00,0x00,0x00,0xf8,0xff, 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0x3f,0x00,0x00,0x00,0x00,0xfe,0xff,0x01,0x00,0x80, 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x80,0xff,0x07,0x00,0x00,0x00,0xc0,0xff,0x7f,0x00,0x00,0xc0,0x3f,0x00,0xfc, 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x7f,0x00,0x00, 0x00,0x00,0x00,0xff,0xff,0x0f,0x00,0x00,0xe0,0x0f,0x00,0x00,0x00,0x7f,0x02, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x07,0x00,0x00,0x00,0x00,0xe0, 0x7f,0xc0,0x07,0x00,0x00,0xf0,0x07,0x00,0x00,0x00,0xe0,0x7f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x00,0x00,0x00, 0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0x00, 0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0xe0,0x1f,0x00,0x00,0x00,0x80,0x00,0xff, 0x01,0x00,0x00,0x00,0x00,0x00,0x80,0x7f,0x00,0x00,0x00,0x00,0x60,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0xe0,0x07,0x7f,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xf8,0x07,0x00,0x00,0x00,0x00,0xf8,0xdf,0x1f,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00, 0x00,0x00,0x00,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0xc0,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0xf8, 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xe0,0x1f,0x00,0x00,0x00,0x00,0x00,0xf8,0x9f,0xff,0x03, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xfc,0x03,0x00,0x00,0x00,0x00,0x00,0xf8,0xdf,0xff,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00, 0x00,0x00,0x00,0x00,0x00,0xf8,0xfb,0xfb,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0xff,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0xff,0xf7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb8,0x7f,0xf7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x7f,0xf7,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8, 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xf7,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x61,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0, 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; rat-4.2.22/xbm/rat_small.xbm0100640000175000017500000001013306535542144014622 0ustar enderender#define rat_small_width 53 #define rat_small_height 47 #ifndef WIN32 static char rat_small_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x08,0xe0,0x00, 0x00,0x00,0x00,0xc0,0x63,0xe0,0x00,0x78,0xe0,0xff,0x23,0x80,0xe0,0x00,0x83, 0xfd,0x5e,0x1f,0x00,0xe1,0x80,0x00,0x6f,0x80,0x3f,0x00,0xe2,0x40,0xc0,0x19, 0x00,0x24,0x00,0xe2,0x20,0x60,0x02,0x00,0x48,0x00,0xe0,0x10,0x30,0x01,0x00, 0xd0,0x00,0xe4,0x10,0xd8,0x00,0x00,0xa0,0x00,0xe4,0x08,0x18,0x00,0x00,0xc0, 0x03,0xe4,0x08,0x2c,0x00,0x00,0x80,0x07,0xe4,0x08,0x1f,0x00,0x00,0x80,0x07, 0xe0,0x08,0x1f,0x00,0x00,0x80,0x07,0xe2,0x08,0x0f,0x00,0x00,0xc0,0x1f,0xe2, 0x08,0x7f,0x00,0x00,0xfe,0x1f,0xe1,0x80,0xf7,0xff,0xff,0xff,0x9f,0xe0,0x88, 0xff,0xfb,0x7f,0xff,0x5f,0xe0,0x80,0xff,0xfb,0xff,0xbf,0x3f,0xe0,0x90,0xef, 0xef,0xfd,0xbd,0x3b,0xe0,0x20,0xef,0xef,0xf9,0x5d,0x09,0xe0,0x40,0xcc,0x57, 0xc9,0x5d,0x0c,0xe0,0x80,0x88,0xdf,0xf0,0x27,0x0e,0xe0,0x00,0x03,0x00,0x20, 0xa0,0x05,0xe0,0x00,0x14,0x00,0x00,0x70,0x06,0xe0,0x00,0x18,0x00,0x00,0x18, 0x02,0xe0,0x00,0x20,0x00,0x00,0x08,0x03,0xe0,0x00,0x40,0x00,0x00,0x04,0x01, 0xe0,0x00,0x40,0x00,0x00,0x82,0x00,0xe0,0x00,0x80,0x00,0x00,0xc1,0x00,0xe0, 0x00,0x80,0x00,0x00,0x61,0x00,0xe8,0x00,0x00,0x01,0x80,0x30,0x10,0xe0,0x00, 0x00,0x02,0x40,0xb8,0x00,0xe0,0x00,0x00,0x04,0x20,0x0e,0x00,0xe0,0x18,0x00, 0x08,0x70,0x0c,0x00,0xe0,0x00,0x34,0x90,0x0e,0x56,0x00,0xe0,0x00,0x00,0xf8, 0x0f,0x03,0x00,0xe0,0x00,0xc0,0xe3,0x81,0x01,0x00,0xe0,0x80,0x04,0xf0,0xc0, 0x88,0x00,0xe0,0x04,0x00,0x03,0x30,0x00,0x30,0xe0,0x00,0x14,0x80,0x1f,0x00, 0x00,0xe0,0x80,0x00,0x80,0x0f,0x00,0x00,0xe0,0x00,0x00,0x80,0x0f,0x00,0x00, 0xe0,0x00,0x00,0x80,0x0b,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0, 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xe0}; #else static char rat_small_bits[] = { '\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x08','\xe0','\x00', '\x00','\x00','\x00','\xc0','\x63','\xe0','\x00','\x78','\xe0','\xff','\x23','\x80','\xe0','\x00','\x83', '\xfd','\x5e','\x1f','\x00','\xe1','\x80','\x00','\x6f','\x80','\x3f','\x00','\xe2','\x40','\xc0','\x19', '\x00','\x24','\x00','\xe2','\x20','\x60','\x02','\x00','\x48','\x00','\xe0','\x10','\x30','\x01','\x00', '\xd0','\x00','\xe4','\x10','\xd8','\x00','\x00','\xa0','\x00','\xe4','\x08','\x18','\x00','\x00','\xc0', '\x03','\xe4','\x08','\x2c','\x00','\x00','\x80','\x07','\xe4','\x08','\x1f','\x00','\x00','\x80','\x07', '\xe0','\x08','\x1f','\x00','\x00','\x80','\x07','\xe2','\x08','\x0f','\x00','\x00','\xc0','\x1f','\xe2', '\x08','\x7f','\x00','\x00','\xfe','\x1f','\xe1','\x80','\xf7','\xff','\xff','\xff','\x9f','\xe0','\x88', '\xff','\xfb','\x7f','\xff','\x5f','\xe0','\x80','\xff','\xfb','\xff','\xbf','\x3f','\xe0','\x90','\xef', '\xef','\xfd','\xbd','\x3b','\xe0','\x20','\xef','\xef','\xf9','\x5d','\x09','\xe0','\x40','\xcc','\x57', '\xc9','\x5d','\x0c','\xe0','\x80','\x88','\xdf','\xf0','\x27','\x0e','\xe0','\x00','\x03','\x00','\x20', '\xa0','\x05','\xe0','\x00','\x14','\x00','\x00','\x70','\x06','\xe0','\x00','\x18','\x00','\x00','\x18', '\x02','\xe0','\x00','\x20','\x00','\x00','\x08','\x03','\xe0','\x00','\x40','\x00','\x00','\x04','\x01', '\xe0','\x00','\x40','\x00','\x00','\x82','\x00','\xe0','\x00','\x80','\x00','\x00','\xc1','\x00','\xe0', '\x00','\x80','\x00','\x00','\x61','\x00','\xe8','\x00','\x00','\x01','\x80','\x30','\x10','\xe0','\x00', '\x00','\x02','\x40','\xb8','\x00','\xe0','\x00','\x00','\x04','\x20','\x0e','\x00','\xe0','\x18','\x00', '\x08','\x70','\x0c','\x00','\xe0','\x00','\x34','\x90','\x0e','\x56','\x00','\xe0','\x00','\x00','\xf8', '\x0f','\x03','\x00','\xe0','\x00','\xc0','\xe3','\x81','\x01','\x00','\xe0','\x80','\x04','\xf0','\xc0', '\x88','\x00','\xe0','\x04','\x00','\x03','\x30','\x00','\x30','\xe0','\x00','\x14','\x80','\x1f','\x00', '\x00','\xe0','\x80','\x00','\x80','\x0f','\x00','\x00','\xe0','\x00','\x00','\x80','\x0f','\x00','\x00', '\xe0','\x00','\x00','\x80','\x0b','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\xe0', '\x00','\x00','\x00','\x00','\x00','\x00','\xe0','\x00','\x00','\x00','\x00','\x00','\x00','\xe0'}; #endif rat-4.2.22/xbm/rec.xbm0100640000175000017500000000177106610436506013423 0ustar enderender#define rec_width 20 #define rec_height 20 #ifndef WIN32 static char rec_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x1f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char rec_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x0f', '\x00', '\x80', '\x1f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\x80', '\x1f', '\x00', '\x00', '\x0f', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif /* WIN32 */ rat-4.2.22/xbm/reception.xbm0100640000175000017500000000210007054745636014637 0ustar enderender#define reception_width 20 #define reception_height 20 #ifndef WIN32 static unsigned char reception_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0xf0, 0xff, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0xf0, 0xff, 0x00, 0x10, 0x92, 0x00, 0x10, 0x92, 0x00, 0xf0, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char reception_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\xf0', '\xff', '\x00', '\x10', '\x92', '\x00', '\x10', '\x92', '\x00', '\x10', '\x92', '\x00', '\x10', '\x92', '\x00', '\xf0', '\xff', '\x00', '\x10', '\x92', '\x00', '\x10', '\x92', '\x00', '\xf0', '\xff', '\x00', '\x10', '\x92', '\x00', '\x10', '\x92', '\x00', '\xf0', '\xff', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif /* WIN32 */ /**** Generated by xbm2dual.awk ****/ rat-4.2.22/xbm/right.xbm0100640000175000017500000000047607012602421013754 0ustar enderender#define right_width 8 #define right_height 8 #ifndef WIN32 static unsigned char right_bits[] = { 0x04, 0x0c, 0x1c, 0x3c, 0x3c, 0x1c, 0x0c, 0x04}; #else static unsigned char right_bits[] = { '\x04', '\x0c', '\x1c', '\x3c', '\x3c', '\x1c', '\x0c', '\x04'}; #endif /* WIN32 */ /**** Generated by xbm2dual.awk ****/ rat-4.2.22/xbm/stop.xbm0100640000175000017500000000177306610436506013641 0ustar enderender#define stop_width 20 #define stop_height 20 #ifndef WIN32 static char stop_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; #else static unsigned char stop_bits[] = { '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\xc0', '\x3f', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00'}; #endif /*WIN32*/ rat-4.2.22/xbm/ucl.xbm0100640000175000017500000000413006535542145013430 0ustar enderender#define ucl_width 45 #define ucl_height 55 static char ucl_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x60, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x40, 0x01, 0x00, 0xe0, 0x00, 0x00, 0x60, 0x03, 0x00, 0xe0, 0x00, 0x00, 0x20, 0x02, 0x00, 0xe0, 0x00, 0x00, 0x20, 0x02, 0x00, 0xe0, 0x00, 0x00, 0x10, 0x04, 0x00, 0xe0, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0xe0, 0x00, 0x00, 0xaa, 0x2a, 0x00, 0xe0, 0x00, 0x00, 0xab, 0x52, 0x00, 0xe0, 0x00, 0x00, 0xa5, 0x54, 0x00, 0xe0, 0x00, 0x80, 0x94, 0x94, 0x00, 0xe0, 0x00, 0x80, 0x92, 0xa4, 0x00, 0xe0, 0x00, 0x80, 0x92, 0xa4, 0x00, 0xe0, 0x00, 0xc0, 0xff, 0xff, 0x01, 0xe0, 0x00, 0x20, 0x00, 0x00, 0x02, 0xe0, 0x00, 0xe0, 0xff, 0xff, 0x03, 0xe0, 0x00, 0x20, 0x00, 0x00, 0x02, 0xe0, 0x00, 0x20, 0xc0, 0x01, 0x02, 0xe0, 0x00, 0x20, 0x3e, 0x3e, 0x04, 0xe0, 0x00, 0xf0, 0x01, 0xc0, 0x07, 0xe0, 0x00, 0x1f, 0x00, 0x00, 0x7c, 0xe0, 0xf0, 0x00, 0x00, 0x00, 0x80, 0xe3, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x10, 0x00, 0x00, 0x00, 0x00, 0xe2, 0x10, 0x00, 0x00, 0x00, 0x00, 0xe2, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xe0, 0xcf, 0x87, 0x7f, 0x7f, 0xe0, 0x40, 0x03, 0xe3, 0x71, 0x3a, 0xe0, 0x40, 0x03, 0xd3, 0x60, 0x1a, 0xe0, 0x40, 0x03, 0x6b, 0x00, 0x1a, 0xe0, 0x40, 0x03, 0x6b, 0x00, 0x1a, 0xe0, 0x40, 0x03, 0x6b, 0x00, 0x1a, 0xe0, 0x40, 0x03, 0x6b, 0x00, 0x1a, 0xe0, 0x40, 0x03, 0x6b, 0x00, 0x1a, 0xe0, 0x40, 0x03, 0x6b, 0x00, 0x1a, 0xe0, 0xc0, 0x02, 0x6b, 0x40, 0x1a, 0xe2, 0x80, 0x86, 0xd1, 0x60, 0x1a, 0xe3, 0x00, 0xfd, 0xe1, 0x7f, 0xfd, 0xe3, 0x00, 0x7e, 0x80, 0x1f, 0xff, 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe7, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe4, 0x08, 0x00, 0x00, 0x00, 0x00, 0xe4, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0}; rat-4.2.22/xbm/waveform.xbm0100640000175000017500000000075606535542145014505 0ustar enderender#define waveform_width 32 #define waveform_height 16 static unsigned char waveform_bits[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe2, 0x04, 0x00, 0x00, 0xa2, 0x04, 0x00, 0x00, 0xa5, 0x0e, 0x00, 0xf8, 0x95, 0xca, 0x0f, 0xf8, 0x94, 0xea, 0x0f, 0x00, 0x94, 0x3a, 0x00, 0x00, 0x9c, 0x13, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; rat-4.2.22/acconfig.h0100640000175000017500000000211107314414137013261 0ustar enderender/* * Define this if your C library doesn't have usleep. * * $Id: acconfig.h,v 1.12 2001/06/21 15:53:03 ucaccsp Exp $ */ #undef NEED_USLEEP #undef NEED_SNPRINTF /* * Missing declarations */ #undef GETTOD_NOT_DECLARED #undef KILL_NOT_DECLARED /* * If you don't have these types in , #define these to be * the types you do have. */ #undef int16_t #undef int32_t #undef int64_t #undef int8_t #undef uint16_t #undef uint32_t #undef uint8_t /* * Debugging: * DEBUG: general debugging * DEBUG_MEM: debug memory allocation */ #undef DEBUG #undef DEBUG_MEM /* * Optimization */ #undef NDEBUG /* Audio device relate */ #undef HAVE_SPARC_AUDIO #undef HAVE_SGI_AUDIO #undef HAVE_PCA_AUDIO #undef HAVE_LUIGI_AUDIO #undef HAVE_NEWPCM_AUDIO #undef HAVE_OSS_AUDIO #undef HAVE_HP_AUDIO #undef HAVE_NETBSD_AUDIO #undef HAVE_OSPREY_AUDIO #undef HAVE_MACHINE_PCAUDIOIO_H #undef HAVE_ALSA_AUDIO #undef HAVE_IXJ_AUDIO #undef HAVE_G728 #undef HAVE_IPv6 /* GSM related */ #undef SASR #undef FAST #undef USE_FLOAT_MUL @BOTTOM@ #ifndef WORDS_BIGENDIAN #define WORDS_SMALLENDIAN #endif rat-4.2.22/asfilebox.tcl0100640000175000017500000002021506603403772014027 0ustar enderender # Asynchronous file box -the default one is modal and no good for real time applications. # # Usage: asFileBox .widget # # Options: -command # -defaultextension # -directory # -extensions # -force_extension - append extension to name if not entered # -type