gmfsk-0.7pre1/0000777000076400007640000000000010206176701007034 5gmfsk-0.7pre1/po/0000777000076400007640000000000010206176700007451 5gmfsk-0.7pre1/po/ChangeLog0000644000076400007640000000000007604435776011150 gmfsk-0.7pre1/po/Makefile.in.in0000644000076400007640000001557110206155260012046 # Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # # This file file be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # Please note that the actual code is *not* freely available. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = /bin/sh @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ libdir = @libdir@ localedir = $(libdir)/locale gnulocaledir = $(datadir)/locale gettextsrcdir = $(datadir)/glib-2.0/gettext/po subdir = po INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ MKINSTALLDIRS = $(top_srcdir)/@MKINSTALLDIRS@ CC = @CC@ GENCAT = @GENCAT@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ MSGMERGE = msgmerge DEFS = @DEFS@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ INCLUDES = -I.. -I$(top_srcdir)/intl COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS) SOURCES = POFILES = @POFILES@ GMOFILES = @GMOFILES@ DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(GETTEXT_PACKAGE).pot \ $(POFILES) $(GMOFILES) $(SOURCES) POTFILES = \ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ INSTOBJEXT = @INSTOBJEXT@ .SUFFIXES: .SUFFIXES: .c .o .po .pox .gmo .mo .msg .cat .c.o: $(COMPILE) $< .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(srcdir)/$(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=$(srcdir)/`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && $(GENCAT) $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(srcdir)/$(GETTEXT_PACKAGE).pot: $(POTFILES) $(XGETTEXT) --default-domain=$(GETTEXT_PACKAGE) --directory=$(top_srcdir) \ --add-comments --keyword=_ --keyword=N_ \ --files-from=$(srcdir)/POTFILES.in \ && test ! -f $(GETTEXT_PACKAGE).po \ || ( rm -f $(srcdir)/$(GETTEXT_PACKAGE).pot \ && mv $(GETTEXT_PACKAGE).po $(srcdir)/$(GETTEXT_PACKAGE).pot ) install: install-exec install-data install-exec: install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(datadir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(datadir); \ fi @catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ case "$$cat" in \ *.gmo) destdir=$(gnulocaledir);; \ *) destdir=$(localedir);; \ esac; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ dir=$(DESTDIR)$$destdir/$$lang/LC_MESSAGES; \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $$dir; \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $$dir; \ fi; \ if test -r $$cat; then \ $(INSTALL_DATA) $$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $$cat as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ else \ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT)"; \ fi; \ if test -r $$cat.m; then \ $(INSTALL_DATA) $$cat.m $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $$cat.m as $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ if test -r $(srcdir)/$$cat.m ; then \ $(INSTALL_DATA) $(srcdir)/$$cat.m \ $$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ echo "installing $(srcdir)/$$cat as" \ "$$dir/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m"; \ else \ true; \ fi; \ fi; \ done if test "$(PACKAGE)" = "glib"; then \ if test -r "$(MKINSTALLDIRS)"; then \ $(MKINSTALLDIRS) $(DESTDIR)$(gettextsrcdir); \ else \ $(SHELL) $(top_srcdir)/mkinstalldirs $(DESTDIR)$(gettextsrcdir); \ fi; \ $(INSTALL_DATA) $(srcdir)/Makefile.in.in \ $(DESTDIR)$(gettextsrcdir)/Makefile.in.in; \ else \ : ; \ fi # Define this as empty until I found a useful application. installcheck: uninstall: catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT); \ rm -f $(DESTDIR)$(gnulocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE)$(INSTOBJEXT).m; \ done rm -f $(DESTDIR)$(gettextsrcdir)/po-Makefile.in.in check: all dvi info tags TAGS ID: mostlyclean: rm -f core core.* *.pox $(GETTEXT_PACKAGE).po *.old.po cat-id-tbl.tmp rm -fr *.o clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES *.mo *.msg *.cat *.cat.m maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f $(GMOFILES) distdir = ../$(GETTEXT_PACKAGE)-$(VERSION)/$(subdir) dist distdir: update-po $(DISTFILES) dists="$(DISTFILES)"; \ for file in $$dists; do \ ln $(srcdir)/$$file $(distdir) 2> /dev/null \ || cp -p $(srcdir)/$$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot cd $(srcdir); \ catalogs='$(CATALOGS)'; \ for cat in $$catalogs; do \ cat=`basename $$cat`; \ lang=`echo $$cat | sed 's/\$(CATOBJEXT)$$//'`; \ mv $$lang.po $$lang.old.po; \ echo "$$lang:"; \ if $(MSGMERGE) $$lang.old.po $(GETTEXT_PACKAGE).pot -o $$lang.po; then \ rm -f $$lang.old.po; \ else \ echo "msgmerge for $$cat failed!"; \ rm -f $$lang.po; \ mv $$lang.old.po $$lang.po; \ fi; \ done # POTFILES is created from POTFILES.in by stripping comments, empty lines # and Intltool tags (enclosed in square brackets), and appending a full # relative path to them POTFILES: POTFILES.in ( if test 'x$(srcdir)' != 'x.'; then \ posrcprefix='$(top_srcdir)/'; \ else \ posrcprefix="../"; \ fi; \ rm -f $@-t $@ \ && (sed -e '/^#/d' \ -e "s/^\[.*\] +//" \ -e '/^[ ]*$$/d' \ -e "s@.*@ $$posrcprefix& \\\\@" < $(srcdir)/$@.in \ | sed -e '$$s/\\$$//') > $@-t \ && chmod a-w $@-t \ && mv $@-t $@ ) Makefile: Makefile.in.in ../config.status POTFILES cd .. \ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/po/POTFILES.in0000644000076400007640000000050110166330016011133 # List of source files containing translatable strings. src/callbacks.c src/callbacks.c src/conf.c src/confdialog.c src/cwirc.c src/druid.c src/hamlib.c src/interface.c src/log.c src/macro.c src/main.c src/miniscope.c src/picture.c src/picture.c src/ptt.c src/qsodata.c src/snd.c src/support.c src/trx.c src/waterfall.c gmfsk-0.7pre1/po/gmfsk.pot0000644000076400007640000007004210206176700011223 # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "POT-Creation-Date: 2005-02-20 23:14+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: src/callbacks.c:84 msgid "Unable to open log file" msgstr "" #: src/callbacks.c:1351 #, c-format msgid "Error reading file: %s" msgstr "" #: src/callbacks.c:1359 #, c-format msgid "Error converting file to UTF8: %s" msgstr "" #. Append qsodata buttons #: src/callbacks.c:1509 src/interface.c:2159 src/interface.c:4517 msgid "Callsign" msgstr "" #: src/callbacks.c:1517 src/interface.c:525 src/interface.c:2167 #: src/interface.c:4525 msgid "Name" msgstr "" #: src/callbacks.c:1525 src/interface.c:598 src/interface.c:2175 #: src/interface.c:4533 msgid "QTH" msgstr "" #: src/callbacks.c:1533 src/interface.c:612 src/interface.c:2183 #: src/interface.c:4541 msgid "Locator" msgstr "" #: src/callbacks.c:1541 src/interface.c:541 msgid "Sent RST" msgstr "" #: src/callbacks.c:1549 msgid "Received RST" msgstr "" #: src/callbacks.c:1557 src/interface.c:605 msgid "Notes" msgstr "" #: src/conf.c:310 src/druid.c:291 #, c-format msgid "Error converting filename (%s=%s): %s" msgstr "" #: src/conf.c:357 msgid "Couldn't allocate color" msgstr "" #: src/conf.c:620 msgid "GConf client init failed!!!\n" msgstr "" #: src/confdialog.c:60 msgid "Station info" msgstr "" #: src/confdialog.c:61 msgid "Date & Time" msgstr "" #: src/confdialog.c:62 src/interface.c:2298 msgid "Bands" msgstr "" #: src/confdialog.c:63 msgid "Files & Dirs" msgstr "" #: src/confdialog.c:68 src/interface.c:2446 msgid "Colors" msgstr "" #: src/confdialog.c:69 src/interface.c:2493 msgid "Fonts" msgstr "" #: src/confdialog.c:74 src/interface.c:2531 msgid "All" msgstr "" #: src/confdialog.c:75 src/interface.c:2572 msgid "MFSK" msgstr "" #: src/confdialog.c:76 src/interface.c:83 src/interface.c:2704 msgid "OLIVIA" msgstr "" #: src/confdialog.c:77 src/interface.c:90 src/interface.c:2898 msgid "RTTY" msgstr "" #: src/confdialog.c:78 src/interface.c:2938 msgid "THROB" msgstr "" #: src/confdialog.c:79 src/interface.c:2977 msgid "PSK31" msgstr "" #: src/confdialog.c:80 src/interface.c:139 src/interface.c:3084 msgid "MT63" msgstr "" #: src/confdialog.c:81 src/interface.c:3185 msgid "HELL" msgstr "" #: src/confdialog.c:82 src/interface.c:153 src/interface.c:3256 msgid "CW" msgstr "" #: src/confdialog.c:87 src/confdialog.c:99 src/interface.c:3406 #: src/interface.c:3738 msgid "Settings" msgstr "" #: src/confdialog.c:92 src/interface.c:3538 msgid "Sound" msgstr "" #: src/confdialog.c:93 src/interface.c:3627 msgid "PTT" msgstr "" #: src/confdialog.c:100 msgid "Features" msgstr "" #: src/confdialog.c:106 msgid "General" msgstr "" #: src/confdialog.c:107 msgid "Appearance" msgstr "" #: src/confdialog.c:108 msgid "Modems" msgstr "" #: src/confdialog.c:109 src/interface.c:1341 src/interface.c:1648 msgid "Waterfall" msgstr "" #: src/confdialog.c:110 msgid "Devices" msgstr "" #: src/confdialog.c:112 src/interface.c:3742 msgid "Hamlib" msgstr "" #: src/confdialog.c:660 msgid "Categories" msgstr "" #: src/confdialog.c:712 msgid "confdialog_select_node: ConfDialog init failed\n" msgstr "" #: src/confdialog.c:725 #, c-format msgid "confdialog_select_node: tree path '%s' not found (%s)\n" msgstr "" #: src/cwirc.c:66 msgid "Can't attach to the CWirc API shared memory block!\n" msgstr "" #: src/cwirc.c:70 msgid "Working in CWirc slave mode.\n" msgstr "" #: src/druid.c:409 #, c-format msgid "Error creating directory: %s: %m" msgstr "" #: src/druid.c:416 #, c-format msgid "Error creating directory: %s exists but is not a directory" msgstr "" #: src/druid.c:435 #, c-format msgid "Error creating file: %s: %m" msgstr "" #: src/druid.c:442 #, c-format msgid "Error creating file: %s exists but is not a regular file" msgstr "" #: src/druid.c:447 #, c-format msgid "Error: %s is not writable: %m" msgstr "" #: src/druid.c:505 #, c-format msgid "Sound card open for read failed: %s" msgstr "" #: src/druid.c:512 src/druid.c:539 #, c-format msgid "Reading from sound card failed: %s" msgstr "" #: src/druid.c:523 #, c-format msgid "Sound card open for write failed: %s" msgstr "" #: src/druid.c:576 src/ptt.c:146 #, c-format msgid "Cannot open PTT device '%s': %m" msgstr "" #: src/druid.c:590 src/ptt.c:123 src/ptt.c:130 #, c-format msgid "set_ptt: ioctl: %m" msgstr "" #: src/hamlib.c:270 #, c-format msgid "Hamlib init: Bad rig config parameter: '%s'" msgstr "" #: src/hamlib.c:275 #, c-format msgid "Hamlib init: rig_set_conf failed (%s=%s): %s" msgstr "" #: src/hamlib.c:310 #, c-format msgid "Hamlib init: rig_init failed (model=%d)" msgstr "" #: src/hamlib.c:322 #, c-format msgid "Hamlib init: Bad param=value pair: '%s'" msgstr "" #: src/hamlib.c:348 #, c-format msgid "Hamlib init: rig_open failed: %s" msgstr "" #: src/hamlib.c:361 #, c-format msgid "Hamlib init: rig_get_freq failed: %s" msgstr "" #: src/hamlib.c:372 #, c-format msgid "" "Hamlib init: rig_get_mode failed: %s.\n" "Assuming USB mode." msgstr "" #: src/hamlib.c:379 #, c-format msgid "" "Hamlib init: rig_set_ptt failed: %s.\n" "Hamlib PTT disabled" msgstr "" #: src/hamlib.c:396 #, c-format msgid "Hamlib init: pthread_create: %m" msgstr "" #: src/hamlib.c:440 #, c-format msgid "" "rig_set_ptt failed: %s.\n" "Hamlib PTT disabled.\n" msgstr "" #: src/hamlib.c:484 #, c-format msgid "rig_get_freq failed: %s" msgstr "" #: src/hamlib.c:506 #, c-format msgid "rig_get_mode failed: %s" msgstr "" #: src/hamlib.c:524 #, c-format msgid "rig_set_freq failed: %s" msgstr "" #: src/interface.c:32 msgid "_Send file..." msgstr "" #: src/interface.c:40 msgid "_Log to file" msgstr "" #: src/interface.c:48 msgid "Clear _TX window" msgstr "" #: src/interface.c:55 msgid "Clear _RX window" msgstr "" #: src/interface.c:69 msgid "MFSK16" msgstr "" #: src/interface.c:76 msgid "MFSK8" msgstr "" #: src/interface.c:97 msgid "THROB (1 tps)" msgstr "" #: src/interface.c:104 msgid "THROB (2 tps)" msgstr "" #: src/interface.c:111 msgid "THROB (4 tps)" msgstr "" #: src/interface.c:118 msgid "PSK31 (BPSK)" msgstr "" #: src/interface.c:125 msgid "PSK31 (QPSK)" msgstr "" #: src/interface.c:132 msgid "PSK63" msgstr "" #: src/interface.c:146 msgid "FELDHELL" msgstr "" #: src/interface.c:175 msgid "macro 1" msgstr "" #: src/interface.c:182 msgid "macro 2" msgstr "" #: src/interface.c:189 msgid "macro 3" msgstr "" #: src/interface.c:196 msgid "macro 4" msgstr "" #: src/interface.c:203 msgid "macro 5" msgstr "" #: src/interface.c:210 msgid "macro 6" msgstr "" #: src/interface.c:217 msgid "macro 7" msgstr "" #: src/interface.c:224 msgid "macro 8" msgstr "" #: src/interface.c:231 msgid "macro 9" msgstr "" #: src/interface.c:238 msgid "macro 10" msgstr "" #: src/interface.c:245 msgid "macro 11" msgstr "" #: src/interface.c:252 msgid "macro 12" msgstr "" #: src/interface.c:265 msgid "_Configure macros" msgstr "" #: src/interface.c:277 msgid "_Contents" msgstr "" #: src/interface.c:290 msgid "_File" msgstr "" #: src/interface.c:297 msgid "_Mode" msgstr "" #: src/interface.c:304 msgid "_Settings" msgstr "" #: src/interface.c:311 msgid "_Help" msgstr "" #: src/interface.c:416 msgid "gMFSK" msgstr "" #: src/interface.c:436 src/interface.c:1367 msgid "Pause" msgstr "" #: src/interface.c:437 msgid "Suspend the modem and release soundcard (Ctl+Z)" msgstr "" #: src/interface.c:454 msgid "Receive" msgstr "" #: src/interface.c:455 msgid "Switch to receive (Ctl+R)" msgstr "" #: src/interface.c:471 msgid "Transmit" msgstr "" #: src/interface.c:472 msgid "Switch to transmit (Ctl+T)" msgstr "" #: src/interface.c:489 msgid "Abort" msgstr "" #: src/interface.c:490 msgid "Abort transmission immediately (Ctl+X)" msgstr "" #: src/interface.c:504 msgid "Tune" msgstr "" #: src/interface.c:505 msgid "Send tune signal (Ctl+U)" msgstr "" #: src/interface.c:533 msgid "Rcvd RST" msgstr "" #: src/interface.c:549 msgid "Call" msgstr "" #: src/interface.c:557 msgid "Band" msgstr "" #: src/interface.c:620 msgid "New entry" msgstr "" #: src/interface.c:625 msgid "Clear QSO data fields (Ctl-N)" msgstr "" #: src/interface.c:644 msgid "Log entry" msgstr "" #: src/interface.c:649 msgid "Send QSO data to xlog (Ctl-L)" msgstr "" #: src/interface.c:694 msgid "textmodes" msgstr "" #: src/interface.c:734 msgid "hellmodes" msgstr "" #: src/interface.c:750 src/interface.c:759 src/interface.c:768 #: src/interface.c:781 src/interface.c:790 src/interface.c:799 #: src/interface.c:816 src/interface.c:825 src/interface.c:834 #: src/interface.c:847 src/interface.c:856 src/interface.c:865 msgid "Click right button to edit macro" msgstr "" #: src/interface.c:896 msgid "Freq" msgstr "" #: src/interface.c:910 msgid "Center frequency on RX pass band" msgstr "" #: src/interface.c:921 msgid "AFC" msgstr "" #: src/interface.c:925 msgid "Automatic frequency control" msgstr "" #: src/interface.c:927 msgid "SQL" msgstr "" #: src/interface.c:931 src/interface.c:2564 src/interface.c:2603 #: src/interface.c:2735 src/interface.c:2930 src/interface.c:2969 #: src/interface.c:3008 src/interface.c:3216 msgid "Squelch" msgstr "" #: src/interface.c:933 msgid "REV" msgstr "" #: src/interface.c:937 src/interface.c:2878 msgid "Reverse polarity" msgstr "" #: src/interface.c:985 msgid "clock" msgstr "" #. TRANSLATORS: Replace this string with your names, one name per line. #: src/interface.c:1280 msgid "translator_credits" msgstr "" #: src/interface.c:1288 msgid "Copyright 2001-2005 Tomi Manninen, OH2BNS" msgstr "" #: src/interface.c:1289 msgid "" "A Gnome terminal program for HF conversation modes (MFSK, OLIVIA, RTTY, " "THROB, PSK31, MT63 and FeldHell)" msgstr "" #: src/interface.c:1308 msgid "Select File to Transmit" msgstr "" #: src/interface.c:1348 src/interface.c:1655 msgid "Spectrum" msgstr "" #: src/interface.c:1355 src/interface.c:1662 msgid "Scope" msgstr "" #: src/interface.c:1381 msgid "Waterfall properties..." msgstr "" #: src/interface.c:1417 msgid "125 Hz" msgstr "" #: src/interface.c:1424 msgid "250 Hz" msgstr "" #: src/interface.c:1431 src/interface.c:1622 msgid "500 Hz" msgstr "" #: src/interface.c:1438 src/interface.c:1629 msgid "1000 Hz" msgstr "" #: src/interface.c:1445 src/interface.c:1636 msgid "2000 Hz" msgstr "" #: src/interface.c:1457 msgid "4" msgstr "" #: src/interface.c:1464 msgid "8" msgstr "" #: src/interface.c:1471 msgid "16" msgstr "" #: src/interface.c:1478 msgid "32" msgstr "" #: src/interface.c:1485 msgid "64" msgstr "" #: src/interface.c:1492 msgid "128" msgstr "" #: src/interface.c:1499 msgid "256" msgstr "" #: src/interface.c:1511 src/interface.c:3595 src/interface.c:4787 msgid "none" msgstr "" #: src/interface.c:1518 msgid "even" msgstr "" #: src/interface.c:1525 msgid "odd" msgstr "" #: src/interface.c:1532 msgid "zero" msgstr "" #: src/interface.c:1539 msgid "one" msgstr "" #: src/interface.c:1551 msgid "1" msgstr "" #: src/interface.c:1558 msgid "1.5" msgstr "" #: src/interface.c:1565 msgid "2" msgstr "" #: src/interface.c:1577 msgid "5 (BAUDOT)" msgstr "" #: src/interface.c:1584 msgid "7 (ASCII)" msgstr "" #: src/interface.c:1591 msgid "8 (ASCII)" msgstr "" #: src/interface.c:1603 msgid "32 (short)" msgstr "" #: src/interface.c:1610 msgid "64 (long)" msgstr "" #: src/interface.c:1674 msgid "x 1" msgstr "" #: src/interface.c:1681 msgid "x 2" msgstr "" #: src/interface.c:1688 msgid "x 4" msgstr "" #: src/interface.c:1700 msgid "Half" msgstr "" #: src/interface.c:1707 msgid "Normal" msgstr "" #: src/interface.c:1714 msgid "Double" msgstr "" #: src/interface.c:1726 msgid "Boxcar" msgstr "" #: src/interface.c:1733 msgid "Triangular" msgstr "" #: src/interface.c:1740 msgid "Hamming" msgstr "" #: src/interface.c:1762 msgid "MHz" msgstr "" #: src/interface.c:1769 msgid "kHz" msgstr "" #: src/interface.c:1776 msgid "Hz" msgstr "" #: src/interface.c:2100 msgid "Preferences" msgstr "" #: src/interface.c:2131 msgid "gMFSK" msgstr "" #: src/interface.c:2136 msgid "Logo" msgstr "" #: src/interface.c:2149 msgid "" "The station information is used in the macros like $mycall, $myname, etc. " msgstr "" #: src/interface.c:2191 src/interface.c:4549 msgid "E-mail" msgstr "" #: src/interface.c:2229 msgid "Station" msgstr "" #: src/interface.c:2239 msgid "" "These are used in the $date and $date macros. See the strftime manual page " "for an explanation of the format." msgstr "" #: src/interface.c:2249 msgid "Time format string" msgstr "" #: src/interface.c:2257 msgid "Date format string" msgstr "" #: src/interface.c:2270 src/interface.c:2277 msgid "See the strftime manual page for explanation of this field" msgstr "" #: src/interface.c:2279 msgid "Time" msgstr "" #: src/interface.c:2288 msgid "" "This is a comma separated list of bands you want to appear in the Bands " "popdown list." msgstr "" #: src/interface.c:2307 msgid "Files and directories used by gMFSK." msgstr "" #: src/interface.c:2323 src/interface.c:4619 msgid "Log file name" msgstr "" #: src/interface.c:2330 src/interface.c:4626 msgid "TX pictures directory" msgstr "" #: src/interface.c:2337 src/interface.c:4633 msgid "RX pictures directory" msgstr "" #: src/interface.c:2356 msgid "Files" msgstr "" #: src/interface.c:2366 msgid "" "The color settings let you configure the colors used in the RX and TX " "windows." msgstr "" #: src/interface.c:2406 msgid "Received text color" msgstr "" #: src/interface.c:2414 msgid "Transmitted text color" msgstr "" #: src/interface.c:2422 msgid "HIghlighted text color" msgstr "" #: src/interface.c:2430 msgid "RX window background color" msgstr "" #: src/interface.c:2438 msgid "TX window background color" msgstr "" #: src/interface.c:2455 msgid "" "The fonts settings let you configure the fonts used in the RX and TX windows." msgstr "" #: src/interface.c:2465 msgid "Received text font" msgstr "" #: src/interface.c:2473 msgid "Transmitted text font" msgstr "" #: src/interface.c:2503 msgid "These settings affect all modems." msgstr "" #: src/interface.c:2523 msgid "TX offset frequency" msgstr "" #: src/interface.c:2542 msgid "" "MFSK16 and MFSK8 modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:2568 src/interface.c:2700 src/interface.c:2894 #: src/interface.c:2934 src/interface.c:2973 src/interface.c:3080 #: src/interface.c:3252 src/interface.c:3534 msgid "Restart modem" msgstr "" #: src/interface.c:2581 msgid "" "OLIVIA modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:2645 msgid "Tones" msgstr "" #: src/interface.c:2653 src/interface.c:3050 msgid "Bandwidth" msgstr "" #: src/interface.c:2661 msgid "RX sync search margin" msgstr "" #: src/interface.c:2669 msgid "RX sync integration period" msgstr "" #: src/interface.c:2691 src/interface.c:3071 msgid "Allow 8 bit characters (escape-127 method)" msgstr "" #: src/interface.c:2696 src/interface.c:2890 src/interface.c:3076 msgid "Modem settings" msgstr "" #: src/interface.c:2713 msgid "" "RTTY modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:2798 msgid "23" msgstr "" #: src/interface.c:2799 msgid "85" msgstr "" #: src/interface.c:2800 msgid "160" msgstr "" #: src/interface.c:2801 msgid "170" msgstr "" #: src/interface.c:2802 msgid "182" msgstr "" #: src/interface.c:2803 src/interface.c:2830 msgid "200" msgstr "" #: src/interface.c:2804 msgid "240" msgstr "" #: src/interface.c:2805 msgid "350" msgstr "" #: src/interface.c:2806 msgid "425" msgstr "" #: src/interface.c:2807 msgid "850" msgstr "" #: src/interface.c:2822 msgid "45" msgstr "" #: src/interface.c:2823 msgid "45.45" msgstr "" #: src/interface.c:2824 msgid "50" msgstr "" #: src/interface.c:2825 msgid "56" msgstr "" #: src/interface.c:2826 msgid "75" msgstr "" #: src/interface.c:2827 msgid "100" msgstr "" #: src/interface.c:2828 msgid "110" msgstr "" #: src/interface.c:2829 msgid "150" msgstr "" #: src/interface.c:2831 msgid "300" msgstr "" #: src/interface.c:2838 msgid "Shift" msgstr "" #: src/interface.c:2846 msgid "Baudrate" msgstr "" #: src/interface.c:2854 msgid "Bits" msgstr "" #: src/interface.c:2862 msgid "Parity" msgstr "" #: src/interface.c:2870 msgid "Stopbits" msgstr "" #: src/interface.c:2882 msgid "If tones should be reversed for RTTY" msgstr "" #: src/interface.c:2884 msgid "Send MSB first" msgstr "" #: src/interface.c:2888 msgid "If most significant bit should the transmitted first" msgstr "" #: src/interface.c:2908 msgid "" "THROB modem parameters. \n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:2947 msgid "" "BPSK31, QPSK31 and PSK63 modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:2986 msgid "" "MT63 modem parameters. \n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:3058 msgid "Interleave" msgstr "" #: src/interface.c:3066 msgid "CW Identification" msgstr "" #: src/interface.c:3093 msgid "FELDHELL modem parameters." msgstr "" #: src/interface.c:3107 msgid "Force upper case" msgstr "" #: src/interface.c:3114 msgid "Hellschreiber font" msgstr "" #: src/interface.c:3150 src/interface.c:3232 msgid "Filter BW" msgstr "" #: src/interface.c:3165 msgid "AGC attack" msgstr "" #: src/interface.c:3181 msgid "AGC decay" msgstr "" #: src/interface.c:3194 msgid "" "CW modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" #: src/interface.c:3248 msgid "Speed (WPM)" msgstr "" #: src/interface.c:3265 msgid "Settings for the waterfall/scope display." msgstr "" #: src/interface.c:3286 msgid "Ref level" msgstr "" #: src/interface.c:3301 msgid "Amp span" msgstr "" #: src/interface.c:3317 msgid "Mode" msgstr "" #: src/interface.c:3325 msgid "Zoom" msgstr "" #: src/interface.c:3333 src/interface.c:3704 msgid "Speed" msgstr "" #: src/interface.c:3341 msgid "Window" msgstr "" #: src/interface.c:3401 msgid "Waterfall scrolls upwards" msgstr "" #: src/interface.c:3410 msgid "WF" msgstr "" #: src/interface.c:3423 msgid "Sound card settings take effect after restarting the modem." msgstr "" #: src/interface.c:3433 src/interface.c:4709 msgid "8-bit sound I/O" msgstr "" #: src/interface.c:3440 src/interface.c:4714 msgid "Stereo sound I/O" msgstr "" #: src/interface.c:3447 msgid "Full duplex I/O (unsupported!)" msgstr "" #: src/interface.c:3454 src/interface.c:4687 msgid "Sound card device" msgstr "" #: src/interface.c:3470 src/interface.c:4699 msgid "/dev/dsp" msgstr "" #: src/interface.c:3471 src/interface.c:4700 msgid "/dev/dsp0" msgstr "" #: src/interface.c:3472 src/interface.c:4701 msgid "/dev/dsp1" msgstr "" #: src/interface.c:3473 src/interface.c:4702 msgid "/dev/dsp2" msgstr "" #: src/interface.c:3480 msgid "Requested sample rate" msgstr "" #: src/interface.c:3488 msgid "TX rate offset (ppm)" msgstr "" #: src/interface.c:3496 msgid "RX rate offset (ppm)" msgstr "" #: src/interface.c:3548 msgid "" "Push-To-Talk settings. \n" "New setting take effect next time PTT is toggled." msgstr "" #: src/interface.c:3562 src/interface.c:4754 msgid "RTS" msgstr "" #: src/interface.c:3571 src/interface.c:4763 msgid "DTR" msgstr "" #: src/interface.c:3579 src/interface.c:4771 msgid "both" msgstr "" #: src/interface.c:3596 src/interface.c:3693 src/interface.c:4788 msgid "/dev/ttyS0" msgstr "" #: src/interface.c:3597 src/interface.c:3694 src/interface.c:4789 msgid "/dev/ttyS1" msgstr "" #: src/interface.c:3598 src/interface.c:4790 msgid "/dev/parport0" msgstr "" #: src/interface.c:3599 src/interface.c:4791 msgid "/dev/parport1" msgstr "" #: src/interface.c:3606 src/interface.c:4798 msgid "PTT device" msgstr "" #: src/interface.c:3614 src/interface.c:4806 msgid "PTT line (serial)" msgstr "" #: src/interface.c:3622 src/interface.c:4814 msgid "Use inverted PTT logic" msgstr "" #: src/interface.c:3637 msgid "Hamlib support enables the rig control features in gMFSK." msgstr "" #: src/interface.c:3643 msgid "Enable hamlib support" msgstr "" #: src/interface.c:3656 msgid "Radio model" msgstr "" #: src/interface.c:3676 msgid "Port" msgstr "" #: src/interface.c:3692 msgid "localhost" msgstr "" #: src/interface.c:3695 msgid "/dev/ttyS2" msgstr "" #: src/interface.c:3696 msgid "/dev/ttyS3" msgstr "" #: src/interface.c:3702 msgid "Serial port name or hostname for RPC rig" msgstr "" #: src/interface.c:3729 msgid "A comma separated list of parameter=value hamlib config parameters." msgstr "" #: src/interface.c:3731 msgid "Config" msgstr "" #: src/interface.c:3751 msgid "Here you can select the rig control features to use." msgstr "" #: src/interface.c:3761 msgid "Use real frequencies in waterfall" msgstr "" #: src/interface.c:3768 msgid "Set QSO data frequency" msgstr "" #: src/interface.c:3775 msgid "Use hamlib PTT" msgstr "" #: src/interface.c:3782 msgid "Resolution:" msgstr "" #: src/interface.c:3808 msgid "RX pass band center frequency" msgstr "" #: src/interface.c:3815 msgid "Hamlib2" msgstr "" #: src/interface.c:4233 msgid "Macro name" msgstr "" #: src/interface.c:4307 msgid "gMFSK picture" msgstr "" #: src/interface.c:4361 msgid "Select Picture to Transmit" msgstr "" #: src/interface.c:4389 msgid "Select File" msgstr "" #: src/interface.c:4474 msgid "gMFSK configuration druid" msgstr "" #: src/interface.c:4487 msgid "Welcome to gMFSK" msgstr "" #: src/interface.c:4489 msgid "" "This is the first time you run this version of gMFSK. On the following pages " "you will be guided through the initial setup of gMFSK.\n" "\n" "All settings can also be done later in the main program Settings-" ">Preferences dialog.\n" "\n" "This druid can be run again by starting gMFSK with the \"--run-druid\" flag." msgstr "" #: src/interface.c:4495 msgid "Station information" msgstr "" #: src/interface.c:4506 msgid "" "Fill in your station information. This data is used in the fixtext macros." msgstr "" #: src/interface.c:4591 msgid "Files and directories" msgstr "" #: src/interface.c:4602 msgid "" "These files and directories are used by gMFSK. Click the button to actually " "create the files and directories." msgstr "" #: src/interface.c:4652 msgid "Create files and directories" msgstr "" #: src/interface.c:4661 msgid "Sound card configuration" msgstr "" #: src/interface.c:4672 msgid "" "Some sound cards don't support the default setting (16 bit mono sampling). " "You should hear a short sound sample when you click the test button below." msgstr "" #: src/interface.c:4719 msgid "Test sound card" msgstr "" #: src/interface.c:4728 msgid "PTT configuration" msgstr "" #: src/interface.c:4739 msgid "" "gMFSK can control PTT via the serial port control lines or the parallel port." msgstr "" #: src/interface.c:4819 msgid "Test PTT" msgstr "" #: src/interface.c:4829 msgid "Configuration complete!" msgstr "" #: src/interface.c:4831 msgid "Initial setup is now complete.\n" msgstr "" #: src/log.c:71 #, c-format msgid "Error writing to log file: %m" msgstr "" #: src/log.c:94 #, c-format msgid "" "\n" "--- Logging started at %s UTC ---\n" msgstr "" #: src/log.c:105 #, c-format msgid "" "\n" "--- Logging stopped at %s UTC ---\n" msgstr "" #: src/macro.c:87 #, c-format msgid "fill_macroconfig: invalid macro number %d\n" msgstr "" #: src/macro.c:120 #, c-format msgid "apply_macroconfig: invalid macro number %d\n" msgstr "" #: src/macro.c:237 #, c-format msgid "run_command: %s" msgstr "" #: src/macro.c:310 #, c-format msgid "send_macro: invalid macro number %d\n" msgstr "" #: src/main.c:328 #, c-format msgid "insert_rx_text: conversion failed: %s" msgstr "" #: src/main.c:539 msgid "Start with specified modem" msgstr "" #: src/main.c:539 msgid "MODEM" msgstr "" #: src/main.c:542 msgid "Run first-time configuration druid" msgstr "" #: src/main.c:545 msgid "Enable CWirc slave mode" msgstr "" #: src/main.c:545 msgid "SHMID" msgstr "" #: src/main.c:549 msgid "Enable test mode (write audio data to stdin/stdout)" msgstr "" #: src/main.c:550 msgid "MODE" msgstr "" #: src/main.c:563 #, c-format msgid "Menu item \"%s\" not found!\n" msgstr "" #: src/main.c:609 msgid "" "FFTW wisdom not found. This is normal if you are running gMFSK for the first " "time." msgstr "" #: src/main.c:628 msgid "gMFSK -- testmode (both)" msgstr "" #: src/main.c:632 msgid "gMFSK -- testmode (rx)" msgstr "" #: src/main.c:636 msgid "gMFSK -- testmode (tx)" msgstr "" #: src/main.c:638 #, c-format msgid "Invalid testmode '%s'\n" msgstr "" #: src/miniscope.c:176 src/miniscope.c:188 src/miniscope.c:200 #: src/waterfall.c:343 src/waterfall.c:354 src/waterfall.c:365 #: src/waterfall.c:376 src/waterfall.c:387 #, c-format msgid "unable to allocate color: ( %d %d %d )" msgstr "" #: src/miniscope.c:434 #, c-format msgid "miniscope: invalid mode %d\n" msgstr "" #: src/picture.c:171 #, c-format msgid "Error saving picture: %s: %s" msgstr "" #: src/picture.c:253 #, c-format msgid "picture write: x >= width (%d >= %d)" msgstr "" #: src/picture.c:259 #, c-format msgid "picture write: y >= height (%d >= %d)" msgstr "" #: src/picture.c:334 #, c-format msgid "send_picture: %s" msgstr "" #: src/picture.c:344 msgid "send_picture: pixbuf conversion failed!" msgstr "" #: src/picture.c:351 msgid "send_picture: couldn't load picture icon!" msgstr "" #: src/ptt.c:162 #, c-format msgid "Device '%s' is neither a parallel nor a serial port" msgstr "" #: src/ptt.c:164 #, c-format msgid "Device '%s' is not a serial port" msgstr "" #: src/qsodata.c:76 #, c-format msgid "log message too long, entry dropped: %s\n" msgstr "" #: src/snd.c:144 msgid "opensnd: device not set" msgstr "" #: src/snd.c:168 #, c-format msgid "opensnd: open: %s: %m" msgstr "" #: src/snd.c:174 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_NONBLOCK: %m" msgstr "" #: src/snd.c:194 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SETFMT: %m" msgstr "" #: src/snd.c:198 msgid "opensnd: Requested sample format not supported" msgstr "" #: src/snd.c:214 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_STEREO: %m" msgstr "" #: src/snd.c:218 #, c-format msgid "opensnd: Cannot set %s audio" msgstr "" #: src/snd.c:229 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SPEED: %m" msgstr "" #: src/snd.c:233 #, c-format msgid "Sampling rate is %u, requested %u\n" msgstr "" #: src/snd.c:261 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %m" msgstr "" #: src/snd.c:349 #, c-format msgid "sound_open_for_write: src_new failed: %s" msgstr "" #: src/snd.c:418 #, c-format msgid "sound_open_for_read: src_new failed: %s" msgstr "" #: src/snd.c:461 #, c-format msgid "sound_close: ioctl: SNDCTL_DSP_SYNC: %m" msgstr "" #: src/snd.c:489 msgid "sound_write: fd < 0" msgstr "" #: src/snd.c:503 #, c-format msgid "sound_write: src_process: %s" msgstr "" #: src/snd.c:522 #, c-format msgid "write_samples: count <= 0 (%d)" msgstr "" #: src/snd.c:527 #, c-format msgid "write_samples: count > SND_BUF_LEN (%d)" msgstr "" #: src/snd.c:558 #, c-format msgid "write_samples: write: %m" msgstr "" #: src/snd.c:590 msgid "sound_read: fd < 0" msgstr "" #: src/snd.c:611 #, c-format msgid "sound_read: src_process: %s" msgstr "" #: src/snd.c:630 #, c-format msgid "read_samples: count <= 0 (%d)" msgstr "" #: src/snd.c:635 #, c-format msgid "read_samples: count > SND_BUF_LEN (%d)" msgstr "" #: src/snd.c:683 #, c-format msgid "sound_read: read: %m" msgstr "" #: src/support.c:60 src/support.c:85 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "" #: src/trx.c:100 #, c-format msgid "sound_open_for_read: %s" msgstr "" #: src/trx.c:121 #, c-format msgid "%s" msgstr "" #: src/trx.c:138 #, c-format msgid "sound_open_for_write: %s" msgstr "" #: src/trx.c:297 msgid "Modem initialization failed!" msgstr "" #: src/trx.c:307 #, c-format msgid "pthread_create: %m" msgstr "" #: src/trx.c:823 #, c-format msgid "trx_get_tx_char: conversion failed: %s" msgstr "" #: src/waterfall.c:1060 #, c-format msgid "Unknown waterfall mode: %d\n" msgstr "" #: src/waterfall.c:1226 #, c-format msgid "Invalid window function: %d\n" msgstr "" #: src/waterfall.c:1395 #, c-format msgid "Unsupported magnification: %d\n" msgstr "" gmfsk-0.7pre1/po/fi.po0000644000076400007640000011302610206176700010326 # SOME DESCRIPTIVE TITLE. # Copyright (C) 2004 Tomi Manninen # This file is distributed under the same license as the gmfsk package. # Tomi Manninen , 2004. # msgid "" msgstr "" "Project-Id-Version: gmfsk 0.6.1\n" "POT-Creation-Date: 2005-02-20 23:14+0200\n" "PO-Revision-Date: 2004-12-29 20:41+0200\n" "Last-Translator: Tomi Manninen \n" "Language-Team: Finnish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: src/callbacks.c:84 msgid "Unable to open log file" msgstr "Tallennustiedoston avaus epäonnistui" #: src/callbacks.c:1351 #, c-format msgid "Error reading file: %s" msgstr "Virhe tiedoston luvussa: %s" #: src/callbacks.c:1359 #, c-format msgid "Error converting file to UTF8: %s" msgstr "Virhe tiedoston UTF8-muunnoksessa: %s" #. Append qsodata buttons #: src/callbacks.c:1509 src/interface.c:2159 src/interface.c:4517 msgid "Callsign" msgstr "Kutsu" #: src/callbacks.c:1517 src/interface.c:525 src/interface.c:2167 #: src/interface.c:4525 msgid "Name" msgstr "Nimi" #: src/callbacks.c:1525 src/interface.c:598 src/interface.c:2175 #: src/interface.c:4533 msgid "QTH" msgstr "QTH" #: src/callbacks.c:1533 src/interface.c:612 src/interface.c:2183 #: src/interface.c:4541 msgid "Locator" msgstr "Lokaattori" #: src/callbacks.c:1541 src/interface.c:541 msgid "Sent RST" msgstr "Lähetetty RST" #: src/callbacks.c:1549 msgid "Received RST" msgstr "Vastaanotettu RST" #: src/callbacks.c:1557 src/interface.c:605 msgid "Notes" msgstr "Lisätietoja" #: src/conf.c:310 src/druid.c:291 #, c-format msgid "Error converting filename (%s=%s): %s" msgstr "Virhe tiedoston nimen muunnoksessa (%s=%s): %s" #: src/conf.c:357 msgid "Couldn't allocate color" msgstr "Väriä ei voitu varata" #: src/conf.c:620 msgid "GConf client init failed!!!\n" msgstr "GConf asiakkaan alustus epäonnistui!!!\n" #: src/confdialog.c:60 msgid "Station info" msgstr "Aseman tiedot" #: src/confdialog.c:61 msgid "Date & Time" msgstr "Aika ja päiväys" #: src/confdialog.c:62 src/interface.c:2298 msgid "Bands" msgstr "Bandit" #: src/confdialog.c:63 msgid "Files & Dirs" msgstr "Tiedostot ja hakemistot" #: src/confdialog.c:68 src/interface.c:2446 msgid "Colors" msgstr "Värit" #: src/confdialog.c:69 src/interface.c:2493 msgid "Fonts" msgstr "Kirjasimet" #: src/confdialog.c:74 src/interface.c:2531 msgid "All" msgstr "Kaikki" #: src/confdialog.c:75 src/interface.c:2572 msgid "MFSK" msgstr "MFSK" #: src/confdialog.c:76 src/interface.c:83 src/interface.c:2704 msgid "OLIVIA" msgstr "" #: src/confdialog.c:77 src/interface.c:90 src/interface.c:2898 msgid "RTTY" msgstr "RTTY" #: src/confdialog.c:78 src/interface.c:2938 msgid "THROB" msgstr "THROB" #: src/confdialog.c:79 src/interface.c:2977 msgid "PSK31" msgstr "PSK31" #: src/confdialog.c:80 src/interface.c:139 src/interface.c:3084 msgid "MT63" msgstr "MT63" #: src/confdialog.c:81 src/interface.c:3185 msgid "HELL" msgstr "HELL" #: src/confdialog.c:82 src/interface.c:153 src/interface.c:3256 msgid "CW" msgstr "CW" #: src/confdialog.c:87 src/confdialog.c:99 src/interface.c:3406 #: src/interface.c:3738 msgid "Settings" msgstr "Asetukset" #: src/confdialog.c:92 src/interface.c:3538 msgid "Sound" msgstr "Ääni" #: src/confdialog.c:93 src/interface.c:3627 msgid "PTT" msgstr "PTT" #: src/confdialog.c:100 msgid "Features" msgstr "Ominaisuudet" #: src/confdialog.c:106 msgid "General" msgstr "Yleiset" #: src/confdialog.c:107 msgid "Appearance" msgstr "Ulkoasu" #: src/confdialog.c:108 msgid "Modems" msgstr "Modeemit" #: src/confdialog.c:109 src/interface.c:1341 src/interface.c:1648 msgid "Waterfall" msgstr "Vesiputous" #: src/confdialog.c:110 msgid "Devices" msgstr "Laitteet" #: src/confdialog.c:112 src/interface.c:3742 msgid "Hamlib" msgstr "Hamlib" #: src/confdialog.c:660 msgid "Categories" msgstr "Luokat" #: src/confdialog.c:712 msgid "confdialog_select_node: ConfDialog init failed\n" msgstr "confdialog_select_node: ConfDialog:in alustus epäonnistui\n" #: src/confdialog.c:725 #, c-format msgid "confdialog_select_node: tree path '%s' not found (%s)\n" msgstr "confdialog_select_node: puupolkua '%s' ei löytynyt (%s)\n" #: src/cwirc.c:66 msgid "Can't attach to the CWirc API shared memory block!\n" msgstr "Kytkeytyminen CWirc API:n jaettuun muistilohkoon epäonnistui!\n" #: src/cwirc.c:70 msgid "Working in CWirc slave mode.\n" msgstr "CWirc-tila aktivoitu.\n" #: src/druid.c:409 #, c-format msgid "Error creating directory: %s: %m" msgstr "Virhe hakemiston luomisessa: %s: %m" #: src/druid.c:416 #, c-format msgid "Error creating directory: %s exists but is not a directory" msgstr "Virhe hakemiston luomisessa: %s on olemassa mutta ei ole hakemisto" #: src/druid.c:435 #, c-format msgid "Error creating file: %s: %m" msgstr "Virhe tiedoston luomisessa: %s: %m" #: src/druid.c:442 #, c-format msgid "Error creating file: %s exists but is not a regular file" msgstr "" "Virhe tiedoston luomisessa: %s on olemassa mutta ei ole tavallinen tiedosto" #: src/druid.c:447 #, c-format msgid "Error: %s is not writable: %m" msgstr "Virhe: tiedostoon %s ei voida kirjoittaa: %m" #: src/druid.c:505 #, c-format msgid "Sound card open for read failed: %s" msgstr "Äänikortin avaaminen kirjoitusta varten epäonnistui: %s" #: src/druid.c:512 src/druid.c:539 #, c-format msgid "Reading from sound card failed: %s" msgstr "Äänikortilta luku epäonnistui: %s" #: src/druid.c:523 #, c-format msgid "Sound card open for write failed: %s" msgstr "Äänikortille kirjoitus epäonnistui: %s" #: src/druid.c:576 src/ptt.c:146 #, c-format msgid "Cannot open PTT device '%s': %m" msgstr "PTT-laitteen '%s' avaus epäonnistui: %m" #: src/druid.c:590 src/ptt.c:123 src/ptt.c:130 #, c-format msgid "set_ptt: ioctl: %m" msgstr "set_ptt: ioctl: %m" #: src/hamlib.c:270 #, c-format msgid "Hamlib init: Bad rig config parameter: '%s'" msgstr "Hamlib init: Virheellinen rigin asetus: '%s'" #: src/hamlib.c:275 #, c-format msgid "Hamlib init: rig_set_conf failed (%s=%s): %s" msgstr "Hamlib init: rig_set_conf epäonnistui (%s=%s): %s" #: src/hamlib.c:310 #, c-format msgid "Hamlib init: rig_init failed (model=%d)" msgstr "Hamlib init: rig_init epäonnistui (malli=%d)" #: src/hamlib.c:322 #, c-format msgid "Hamlib init: Bad param=value pair: '%s'" msgstr "Hamlib init: Virheellinen parametri=arvo -pari: '%s'" #: src/hamlib.c:348 #, c-format msgid "Hamlib init: rig_open failed: %s" msgstr "Hamlib init: rig_open epäonnistui: %s" #: src/hamlib.c:361 #, c-format msgid "Hamlib init: rig_get_freq failed: %s" msgstr "Hamlib init: rig_get_freq epäonnistui: %s" #: src/hamlib.c:372 #, c-format msgid "" "Hamlib init: rig_get_mode failed: %s.\n" "Assuming USB mode." msgstr "" "Hamlib init: rig_get_mode epäonnistui: %s.\n" "Oletus on USB." #: src/hamlib.c:379 #, c-format msgid "" "Hamlib init: rig_set_ptt failed: %s.\n" "Hamlib PTT disabled" msgstr "" "Hamlib init: rig_set_ptt epäonnistui: %s.\n" "Hamlib PTT deaktivoitu" #: src/hamlib.c:396 #, c-format msgid "Hamlib init: pthread_create: %m" msgstr "Hamlib init: pthread_create: %m" #: src/hamlib.c:440 #, c-format msgid "" "rig_set_ptt failed: %s.\n" "Hamlib PTT disabled.\n" msgstr "" "rig_set_ptt epäonnistui: %s.\n" "Hamlib PTT deaktivoitu.\n" #: src/hamlib.c:484 #, c-format msgid "rig_get_freq failed: %s" msgstr "rig_get_freq epäonnistui: %s" #: src/hamlib.c:506 #, c-format msgid "rig_get_mode failed: %s" msgstr "rig_get_mode epäonnistui: %s" #: src/hamlib.c:524 #, fuzzy, c-format msgid "rig_set_freq failed: %s" msgstr "rig_get_freq epäonnistui: %s" #: src/interface.c:32 msgid "_Send file..." msgstr "_Lähetä tiedosto" #: src/interface.c:40 msgid "_Log to file" msgstr "_Tallenna tiedostoon" #: src/interface.c:48 msgid "Clear _TX window" msgstr "Tyhjennä _TX ikkuna" #: src/interface.c:55 msgid "Clear _RX window" msgstr "Tyhjennä _RX ikkuna" #: src/interface.c:69 msgid "MFSK16" msgstr "MFSK16" #: src/interface.c:76 msgid "MFSK8" msgstr "MFSK8" #: src/interface.c:97 msgid "THROB (1 tps)" msgstr "THROB (1 tps)" #: src/interface.c:104 msgid "THROB (2 tps)" msgstr "THROB (2 tps)" #: src/interface.c:111 msgid "THROB (4 tps)" msgstr "THROB (4 tps)" #: src/interface.c:118 msgid "PSK31 (BPSK)" msgstr "PSK31 (BPSK)" #: src/interface.c:125 msgid "PSK31 (QPSK)" msgstr "PSK31 (QPSK)" #: src/interface.c:132 msgid "PSK63" msgstr "PSK63" #: src/interface.c:146 msgid "FELDHELL" msgstr "FELDHELL" #: src/interface.c:175 msgid "macro 1" msgstr "makro 1" #: src/interface.c:182 msgid "macro 2" msgstr "makro 2" #: src/interface.c:189 msgid "macro 3" msgstr "makro 3" #: src/interface.c:196 msgid "macro 4" msgstr "makro 4" #: src/interface.c:203 msgid "macro 5" msgstr "makro 5" #: src/interface.c:210 msgid "macro 6" msgstr "makro 6" #: src/interface.c:217 msgid "macro 7" msgstr "makro 7" #: src/interface.c:224 msgid "macro 8" msgstr "makro 8" #: src/interface.c:231 msgid "macro 9" msgstr "makro 9" #: src/interface.c:238 msgid "macro 10" msgstr "makro 10" #: src/interface.c:245 msgid "macro 11" msgstr "makro 11" #: src/interface.c:252 msgid "macro 12" msgstr "makro 12" #: src/interface.c:265 msgid "_Configure macros" msgstr "_Aseta makrot" #: src/interface.c:277 msgid "_Contents" msgstr "_Sisältö" #: src/interface.c:290 msgid "_File" msgstr "_Tiedosto" #: src/interface.c:297 msgid "_Mode" msgstr "_Lähetelaji" #: src/interface.c:304 msgid "_Settings" msgstr "_Asetukset" #: src/interface.c:311 msgid "_Help" msgstr "_Ohje" #: src/interface.c:416 msgid "gMFSK" msgstr "gMFSK" #: src/interface.c:436 src/interface.c:1367 msgid "Pause" msgstr "Tauko" #: src/interface.c:437 msgid "Suspend the modem and release soundcard (Ctl+Z)" msgstr "Pysäytä modeemi ja vapauta äänikortti (Ctl+Z)" #: src/interface.c:454 msgid "Receive" msgstr "Vastaanota" #: src/interface.c:455 msgid "Switch to receive (Ctl+R)" msgstr "Vaihda vastaanotolle (Ctl+R)" #: src/interface.c:471 msgid "Transmit" msgstr "Lähetä" #: src/interface.c:472 msgid "Switch to transmit (Ctl+T)" msgstr "Vaihda lähetykselle (Ctl+T)" #: src/interface.c:489 msgid "Abort" msgstr "Keskeytä" #: src/interface.c:490 msgid "Abort transmission immediately (Ctl+X)" msgstr "Keskeytä lähetys välittömästi (Ctl+X)" #: src/interface.c:504 msgid "Tune" msgstr "Viritä" #: src/interface.c:505 msgid "Send tune signal (Ctl+U)" msgstr "Lähetä virityssignaalia (Ctl+U)" #: src/interface.c:533 msgid "Rcvd RST" msgstr "Vastaanotettu RST" #: src/interface.c:549 msgid "Call" msgstr "Kutsu" #: src/interface.c:557 msgid "Band" msgstr "Bandi" #: src/interface.c:620 msgid "New entry" msgstr "Uusi yhteys" #: src/interface.c:625 msgid "Clear QSO data fields (Ctl-N)" msgstr "Tyhjennä QSO-tiedot (Ctl-N)" #: src/interface.c:644 msgid "Log entry" msgstr "Vie lokiin" #: src/interface.c:649 msgid "Send QSO data to xlog (Ctl-L)" msgstr "Lähetä QSO-tiedot lokiin (Ctl-L)" #: src/interface.c:694 msgid "textmodes" msgstr "tekstiläheteet" #: src/interface.c:734 msgid "hellmodes" msgstr "hell-lähetteet" #: src/interface.c:750 src/interface.c:759 src/interface.c:768 #: src/interface.c:781 src/interface.c:790 src/interface.c:799 #: src/interface.c:816 src/interface.c:825 src/interface.c:834 #: src/interface.c:847 src/interface.c:856 src/interface.c:865 msgid "Click right button to edit macro" msgstr "Klikkaa oikeata hiiren näppäintä editoidaksesi makroa" #: src/interface.c:896 msgid "Freq" msgstr "" #: src/interface.c:910 msgid "Center frequency on RX pass band" msgstr "" #: src/interface.c:921 msgid "AFC" msgstr "AFC" #: src/interface.c:925 msgid "Automatic frequency control" msgstr "Automaattinen taajuuden korjaus" #: src/interface.c:927 msgid "SQL" msgstr "SQL" #: src/interface.c:931 src/interface.c:2564 src/interface.c:2603 #: src/interface.c:2735 src/interface.c:2930 src/interface.c:2969 #: src/interface.c:3008 src/interface.c:3216 msgid "Squelch" msgstr "Kohinasalpa" #: src/interface.c:933 msgid "REV" msgstr "REV" #: src/interface.c:937 src/interface.c:2878 msgid "Reverse polarity" msgstr "Käänteinen polariteetti" #: src/interface.c:985 msgid "clock" msgstr "kello" #. TRANSLATORS: Replace this string with your names, one name per line. #: src/interface.c:1280 msgid "translator_credits" msgstr "Tomi Manninen, OH2BNS" #: src/interface.c:1288 #, fuzzy msgid "Copyright 2001-2005 Tomi Manninen, OH2BNS" msgstr "Tekijänoikeudet 2001-2004 Tomi Manninen, OH2BNS" #: src/interface.c:1289 #, fuzzy msgid "" "A Gnome terminal program for HF conversation modes (MFSK, OLIVIA, RTTY, " "THROB, PSK31, MT63 and FeldHell)" msgstr "" "Gnome pääteohjelma HF-alueen keskustelulähetelajeille (MFSK, RTTY, THROB, " "PSK31, MT63 and FeldHell)" #: src/interface.c:1308 msgid "Select File to Transmit" msgstr "Valitse lähetettävä tiedosto" #: src/interface.c:1348 src/interface.c:1655 msgid "Spectrum" msgstr "Spektri" #: src/interface.c:1355 src/interface.c:1662 msgid "Scope" msgstr "Skooppi" #: src/interface.c:1381 msgid "Waterfall properties..." msgstr "Vesiputousnäytön ominaisuudet..." #: src/interface.c:1417 #, fuzzy msgid "125 Hz" msgstr "500 Hz" #: src/interface.c:1424 #, fuzzy msgid "250 Hz" msgstr "500 Hz" #: src/interface.c:1431 src/interface.c:1622 msgid "500 Hz" msgstr "500 Hz" #: src/interface.c:1438 src/interface.c:1629 msgid "1000 Hz" msgstr "1000 Hz" #: src/interface.c:1445 src/interface.c:1636 msgid "2000 Hz" msgstr "2000 Hz" #: src/interface.c:1457 #, fuzzy msgid "4" msgstr "45" #: src/interface.c:1464 #, fuzzy msgid "8" msgstr "85" #: src/interface.c:1471 #, fuzzy msgid "16" msgstr "160" #: src/interface.c:1478 #, fuzzy msgid "32" msgstr "2" #: src/interface.c:1485 msgid "64" msgstr "" #: src/interface.c:1492 #, fuzzy msgid "128" msgstr "182" #: src/interface.c:1499 #, fuzzy msgid "256" msgstr "56" #: src/interface.c:1511 src/interface.c:3595 src/interface.c:4787 msgid "none" msgstr "tyhjä" #: src/interface.c:1518 msgid "even" msgstr "parillinen" #: src/interface.c:1525 msgid "odd" msgstr "pariton" #: src/interface.c:1532 msgid "zero" msgstr "nolla" #: src/interface.c:1539 msgid "one" msgstr "yksi" #: src/interface.c:1551 msgid "1" msgstr "1" #: src/interface.c:1558 msgid "1.5" msgstr "1.5" #: src/interface.c:1565 msgid "2" msgstr "2" #: src/interface.c:1577 msgid "5 (BAUDOT)" msgstr "5 (BAUDOT)" #: src/interface.c:1584 msgid "7 (ASCII)" msgstr "7 (ASCII)" #: src/interface.c:1591 msgid "8 (ASCII)" msgstr "8 (ASCII)" #: src/interface.c:1603 msgid "32 (short)" msgstr "32 (lyhyt)" #: src/interface.c:1610 msgid "64 (long)" msgstr "64 (pitkä)" #: src/interface.c:1674 msgid "x 1" msgstr "x 1" #: src/interface.c:1681 msgid "x 2" msgstr "x 2" #: src/interface.c:1688 msgid "x 4" msgstr "x 4" #: src/interface.c:1700 msgid "Half" msgstr "Puolikas" #: src/interface.c:1707 msgid "Normal" msgstr "Normaali" #: src/interface.c:1714 msgid "Double" msgstr "Tupla" #: src/interface.c:1726 msgid "Boxcar" msgstr "Laatikko" #: src/interface.c:1733 msgid "Triangular" msgstr "Kolmio" #: src/interface.c:1740 msgid "Hamming" msgstr "Hamming" #: src/interface.c:1762 msgid "MHz" msgstr "MHz" #: src/interface.c:1769 msgid "kHz" msgstr "kHz" #: src/interface.c:1776 msgid "Hz" msgstr "Hz" #: src/interface.c:2100 msgid "Preferences" msgstr "Valinnat" #: src/interface.c:2131 msgid "gMFSK" msgstr "gMFSK" #: src/interface.c:2136 msgid "Logo" msgstr "Logo" #: src/interface.c:2149 msgid "" "The station information is used in the macros like $mycall, $myname, etc. " msgstr "Asematietoja käytetään makroissa kuten $mycall, $myname, jne. " #: src/interface.c:2191 src/interface.c:4549 msgid "E-mail" msgstr "Sähköposti" #: src/interface.c:2229 msgid "Station" msgstr "Asema" #: src/interface.c:2239 msgid "" "These are used in the $date and $date macros. See the strftime manual page " "for an explanation of the format." msgstr "" "Näitä käytetään $date ja $time makroissa. Ulkoasu on selitetty strftime-" "funktion manuaalisivuilla." #: src/interface.c:2249 msgid "Time format string" msgstr "Ajan ulkoasumerkkijono" #: src/interface.c:2257 msgid "Date format string" msgstr "Päivämäärän ulkoasumerkkijono" #: src/interface.c:2270 src/interface.c:2277 msgid "See the strftime manual page for explanation of this field" msgstr "Tämä kenttä on selitetty trftime-funktion manuaalisivulla" #: src/interface.c:2279 msgid "Time" msgstr "Aika" #: src/interface.c:2288 msgid "" "This is a comma separated list of bands you want to appear in the Bands " "popdown list." msgstr "" "Tämä on piluilla erotettu lista bandeista jotka haluat näkyviin Bandit-" "alasvetovalikossa" #: src/interface.c:2307 msgid "Files and directories used by gMFSK." msgstr "Tiedostot ja hakemistot joita gMFSK käyttää" #: src/interface.c:2323 src/interface.c:4619 msgid "Log file name" msgstr "Lokitiestoston nimi" #: src/interface.c:2330 src/interface.c:4626 msgid "TX pictures directory" msgstr "Lähetettävien kuvien hakemisto" #: src/interface.c:2337 src/interface.c:4633 msgid "RX pictures directory" msgstr "Vastaanotettujen kuvien hakemisto" #: src/interface.c:2356 msgid "Files" msgstr "Tiedostot" #: src/interface.c:2366 msgid "" "The color settings let you configure the colors used in the RX and TX " "windows." msgstr "Väriasetukset vaikuttavat RX- ja TX-ikkunoiden väreihin" #: src/interface.c:2406 msgid "Received text color" msgstr "Vastaanotetun tekstin väri" #: src/interface.c:2414 msgid "Transmitted text color" msgstr "Lähetetyn tekstin väri" #: src/interface.c:2422 msgid "HIghlighted text color" msgstr "Korostetun tekstin väri" #: src/interface.c:2430 msgid "RX window background color" msgstr "Rx-ikkunan taustaväri" #: src/interface.c:2438 msgid "TX window background color" msgstr "TX-ikkunan taustaväri" #: src/interface.c:2455 msgid "" "The fonts settings let you configure the fonts used in the RX and TX windows." msgstr "Kirjasinasetukset vaikuttavat RX- ja TX-ikkunoiden kirjasimiin." #: src/interface.c:2465 msgid "Received text font" msgstr "Vastaanotetun tekstin kirjasin" #: src/interface.c:2473 msgid "Transmitted text font" msgstr "Lähetetyn tekstin kirjasin" #: src/interface.c:2503 msgid "These settings affect all modems." msgstr "Nämä asetukset vaikuttavat kaikkiin modeemeihin." #: src/interface.c:2523 msgid "TX offset frequency" msgstr "Lähetyksen erotustaajuus" #: src/interface.c:2542 msgid "" "MFSK16 and MFSK8 modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "MFSK16- ja MFSK8-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:2568 src/interface.c:2700 src/interface.c:2894 #: src/interface.c:2934 src/interface.c:2973 src/interface.c:3080 #: src/interface.c:3252 src/interface.c:3534 msgid "Restart modem" msgstr "Käynnistä modeemi uudelleen" #: src/interface.c:2581 #, fuzzy msgid "" "OLIVIA modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "CW-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:2645 #, fuzzy msgid "Tones" msgstr "yksi" #: src/interface.c:2653 src/interface.c:3050 msgid "Bandwidth" msgstr "Kaistanleveys" #: src/interface.c:2661 msgid "RX sync search margin" msgstr "" #: src/interface.c:2669 msgid "RX sync integration period" msgstr "" #: src/interface.c:2691 src/interface.c:3071 msgid "Allow 8 bit characters (escape-127 method)" msgstr "Salli 8-bittiset merkit (escape-127 metodi)" #: src/interface.c:2696 src/interface.c:2890 src/interface.c:3076 msgid "Modem settings" msgstr "Modeemin asetukset" #: src/interface.c:2713 msgid "" "RTTY modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "RTTY-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:2798 msgid "23" msgstr "23" #: src/interface.c:2799 msgid "85" msgstr "85" #: src/interface.c:2800 msgid "160" msgstr "160" #: src/interface.c:2801 msgid "170" msgstr "170" #: src/interface.c:2802 msgid "182" msgstr "182" #: src/interface.c:2803 src/interface.c:2830 msgid "200" msgstr "200" #: src/interface.c:2804 msgid "240" msgstr "240" #: src/interface.c:2805 msgid "350" msgstr "350" #: src/interface.c:2806 msgid "425" msgstr "425" #: src/interface.c:2807 msgid "850" msgstr "850" #: src/interface.c:2822 msgid "45" msgstr "45" #: src/interface.c:2823 msgid "45.45" msgstr "45,45" #: src/interface.c:2824 msgid "50" msgstr "50" #: src/interface.c:2825 msgid "56" msgstr "56" #: src/interface.c:2826 msgid "75" msgstr "75" #: src/interface.c:2827 msgid "100" msgstr "100" #: src/interface.c:2828 msgid "110" msgstr "110" #: src/interface.c:2829 msgid "150" msgstr "150" #: src/interface.c:2831 msgid "300" msgstr "300" #: src/interface.c:2838 msgid "Shift" msgstr "Taajuuserotus" #: src/interface.c:2846 msgid "Baudrate" msgstr "Baudinopeus" #: src/interface.c:2854 msgid "Bits" msgstr "Bittien lukumäärä" #: src/interface.c:2862 msgid "Parity" msgstr "Pariteetti" #: src/interface.c:2870 msgid "Stopbits" msgstr "Lopetusbittien lukumäärä" #: src/interface.c:2882 msgid "If tones should be reversed for RTTY" msgstr "Käännettäänkö äänet RTTY:llä" #: src/interface.c:2884 msgid "Send MSB first" msgstr "Lähetä MSB ensin" #: src/interface.c:2888 msgid "If most significant bit should the transmitted first" msgstr "Lähetetäänkö eniten merkitsevä bitti ensiksi" #: src/interface.c:2908 msgid "" "THROB modem parameters. \n" "New parametes take effect after restarting the modem." msgstr "" "THROB-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:2947 msgid "" "BPSK31, QPSK31 and PSK63 modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "BPSK31-, QPSK31- ja PSK63-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:2986 msgid "" "MT63 modem parameters. \n" "New parametes take effect after restarting the modem." msgstr "" "MT63-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:3058 msgid "Interleave" msgstr "Välistys" #: src/interface.c:3066 msgid "CW Identification" msgstr "CW identifikaatio" #: src/interface.c:3093 msgid "FELDHELL modem parameters." msgstr "FELDHELL-modeemin parametrit." #: src/interface.c:3107 msgid "Force upper case" msgstr "Pakota suuraakkoset" #: src/interface.c:3114 msgid "Hellschreiber font" msgstr "Hellscreiber-kirjasin" #: src/interface.c:3150 src/interface.c:3232 msgid "Filter BW" msgstr "Suodattimen kaistanleveys" #: src/interface.c:3165 msgid "AGC attack" msgstr "AGC hyökkäys" #: src/interface.c:3181 msgid "AGC decay" msgstr "AGC sammuminen" #: src/interface.c:3194 msgid "" "CW modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "CW-modeemin parametrit.\n" "Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen." #: src/interface.c:3248 msgid "Speed (WPM)" msgstr "Nopeus (WPM)" #: src/interface.c:3265 msgid "Settings for the waterfall/scope display." msgstr "Vesiputous/skooppi-näytön asetukset." #: src/interface.c:3286 msgid "Ref level" msgstr "Ref taso" #: src/interface.c:3301 msgid "Amp span" msgstr "Amp väli" #: src/interface.c:3317 msgid "Mode" msgstr "Toiminto" #: src/interface.c:3325 msgid "Zoom" msgstr "Suurennos" #: src/interface.c:3333 src/interface.c:3704 msgid "Speed" msgstr "Nopeus" #: src/interface.c:3341 msgid "Window" msgstr "Ikkunafunktio" #: src/interface.c:3401 msgid "Waterfall scrolls upwards" msgstr "Vesiputous vierii ylöspäin" #: src/interface.c:3410 msgid "WF" msgstr "WF" #: src/interface.c:3423 msgid "Sound card settings take effect after restarting the modem." msgstr "" "Äänikorttiasetukset tulevat voimaan kun modeemi käynnistetään uudelleen" #: src/interface.c:3433 src/interface.c:4709 msgid "8-bit sound I/O" msgstr "8-bittinen ääni" #: src/interface.c:3440 src/interface.c:4714 msgid "Stereo sound I/O" msgstr "Stereoääni" #: src/interface.c:3447 msgid "Full duplex I/O (unsupported!)" msgstr "Täysduplexääni (ei tuettu!)" #: src/interface.c:3454 src/interface.c:4687 msgid "Sound card device" msgstr "Äänikorttilaite" #: src/interface.c:3470 src/interface.c:4699 msgid "/dev/dsp" msgstr "/dev/dsp" #: src/interface.c:3471 src/interface.c:4700 msgid "/dev/dsp0" msgstr "/dev/dsp0" #: src/interface.c:3472 src/interface.c:4701 msgid "/dev/dsp1" msgstr "/dev/dsp1" #: src/interface.c:3473 src/interface.c:4702 msgid "/dev/dsp2" msgstr "/dev/dsp2" #: src/interface.c:3480 msgid "Requested sample rate" msgstr "Pyydetty näytteistystaajuus" #: src/interface.c:3488 msgid "TX rate offset (ppm)" msgstr "Lähetyksen näytteistyksen virhe (ppm)" #: src/interface.c:3496 msgid "RX rate offset (ppm)" msgstr "Vastaanoton näytteistyksen virhe (ppm)" #: src/interface.c:3548 msgid "" "Push-To-Talk settings. \n" "New setting take effect next time PTT is toggled." msgstr "" "PTT-asetukset.\n" "Uudet asetukset asettuvat voimaan seuraavan kerran kun PTT:tä vaihdetaan." #: src/interface.c:3562 src/interface.c:4754 msgid "RTS" msgstr "RTS" #: src/interface.c:3571 src/interface.c:4763 msgid "DTR" msgstr "DTR" #: src/interface.c:3579 src/interface.c:4771 msgid "both" msgstr "Molemmat" #: src/interface.c:3596 src/interface.c:3693 src/interface.c:4788 msgid "/dev/ttyS0" msgstr "/dev/ttyS0" #: src/interface.c:3597 src/interface.c:3694 src/interface.c:4789 msgid "/dev/ttyS1" msgstr "/dev/ttyS1" #: src/interface.c:3598 src/interface.c:4790 msgid "/dev/parport0" msgstr "/dev/parport0" #: src/interface.c:3599 src/interface.c:4791 msgid "/dev/parport1" msgstr "/dev/parport1" #: src/interface.c:3606 src/interface.c:4798 msgid "PTT device" msgstr "PTT-laite" #: src/interface.c:3614 src/interface.c:4806 msgid "PTT line (serial)" msgstr "PTT-linja (sarjaportti)" #: src/interface.c:3622 src/interface.c:4814 msgid "Use inverted PTT logic" msgstr "Käänteinen PTT-logiikka" #: src/interface.c:3637 msgid "Hamlib support enables the rig control features in gMFSK." msgstr "Hamlib-tuki aktivoi gMFSK:n radionohjausominaisuudet." #: src/interface.c:3643 msgid "Enable hamlib support" msgstr "Aktivoi gMFSK:n hamlib-tuki" #: src/interface.c:3656 msgid "Radio model" msgstr "Radion malli" #: src/interface.c:3676 msgid "Port" msgstr "Portti" #: src/interface.c:3692 msgid "localhost" msgstr "localhost" #: src/interface.c:3695 msgid "/dev/ttyS2" msgstr "/dev/ttyS2" #: src/interface.c:3696 msgid "/dev/ttyS3" msgstr "/dev/ttyS3" #: src/interface.c:3702 msgid "Serial port name or hostname for RPC rig" msgstr "Sarjaportin nimi tai RPG rigin koneennimi" #: src/interface.c:3729 msgid "A comma separated list of parameter=value hamlib config parameters." msgstr "Pilkuilla erotettu parametri=arvo asetusparametrien lista." #: src/interface.c:3731 msgid "Config" msgstr "Asetukset" #: src/interface.c:3751 msgid "Here you can select the rig control features to use." msgstr "Tässä voit valita haluamasi radionohjaustoiminteet." #: src/interface.c:3761 msgid "Use real frequencies in waterfall" msgstr "Käytä todellisia taajuuksia vesiputousnäytössä" #: src/interface.c:3768 msgid "Set QSO data frequency" msgstr "Aseta taajuus QSO-tietoihin" #: src/interface.c:3775 msgid "Use hamlib PTT" msgstr "Käytä hamlib-PTT:tä" #: src/interface.c:3782 msgid "Resolution:" msgstr "Tarkkuus:" #: src/interface.c:3808 #, fuzzy msgid "RX pass band center frequency" msgstr "Lähetyksen erotustaajuus" #: src/interface.c:3815 msgid "Hamlib2" msgstr "Hamlib2" #: src/interface.c:4233 msgid "Macro name" msgstr "Makron nimi" #: src/interface.c:4307 msgid "gMFSK picture" msgstr "gMFSK-kuva" #: src/interface.c:4361 msgid "Select Picture to Transmit" msgstr "Valitse lähetettävä kuva" #: src/interface.c:4389 msgid "Select File" msgstr "Valitse tiedosto" #: src/interface.c:4474 msgid "gMFSK configuration druid" msgstr "gMFSK asetusvelho" #: src/interface.c:4487 msgid "Welcome to gMFSK" msgstr "Tervetuloa gMFSK:hon" #: src/interface.c:4489 msgid "" "This is the first time you run this version of gMFSK. On the following pages " "you will be guided through the initial setup of gMFSK.\n" "\n" "All settings can also be done later in the main program Settings-" ">Preferences dialog.\n" "\n" "This druid can be run again by starting gMFSK with the \"--run-druid\" flag." msgstr "" "Tämä on ensimmäinen kerta kun käynnistät tämän version gMFSK:sta. " "Seuraavilla sivuilla sinut ohjastetaan gMFSK:n ensiasennuksen läpi.\n" "\n" "Kaikkia asetuksia voidaan muuttaa myös myöhemmin Asetukset->Asetukset -" "valikon kautta.\n" "\n" "Voit käynnistää tämän velhon uudestaan käynnistämällä gMFSK:n \"--run-druid" "\" optiolla." #: src/interface.c:4495 msgid "Station information" msgstr "Aseman tiedot" #: src/interface.c:4506 msgid "" "Fill in your station information. This data is used in the fixtext macros." msgstr "Täytä asemasi tiedot. Näitä tietoja käytetään makroissa." #: src/interface.c:4591 msgid "Files and directories" msgstr "Tiedostot ja hakemistot" #: src/interface.c:4602 msgid "" "These files and directories are used by gMFSK. Click the button to actually " "create the files and directories." msgstr "" "gMFSK käyttää näitä tiedostoja ja hakemistoja. Klikkaa näppäintä jotta " "tiedostot ja hakemistot luodaan." #: src/interface.c:4652 msgid "Create files and directories" msgstr "Luo tiedostot ja hakemistot" #: src/interface.c:4661 msgid "Sound card configuration" msgstr "Äänikortin asetukset" #: src/interface.c:4672 msgid "" "Some sound cards don't support the default setting (16 bit mono sampling). " "You should hear a short sound sample when you click the test button below." msgstr "" "Jotkut äänikortit eivät tue oletusasetuksia (16-bittinen mono-näytteistys). " "Sinun pitäisi kuulla lyhyt ääninäyte kun klikkaat alla olevaa testinäppäintä." #: src/interface.c:4719 msgid "Test sound card" msgstr "Kokeile äänikorttia" #: src/interface.c:4728 msgid "PTT configuration" msgstr "PTT-asetukset" #: src/interface.c:4739 msgid "" "gMFSK can control PTT via the serial port control lines or the parallel port." msgstr "gMFSK voi kontrolloida PTT:tä joko sarja- tai rinnakkaisportin kautta." #: src/interface.c:4819 msgid "Test PTT" msgstr "Kokeile PTT:tä" #: src/interface.c:4829 msgid "Configuration complete!" msgstr "Asetukset valmiit!" #: src/interface.c:4831 msgid "Initial setup is now complete.\n" msgstr "Ensiasennus on nyt valmis.\n" #: src/log.c:71 #, c-format msgid "Error writing to log file: %m" msgstr "Virhe kirjoitettaessa tiedostoon: %m" #: src/log.c:94 #, c-format msgid "" "\n" "--- Logging started at %s UTC ---\n" msgstr "" "\n" "--- Tiedostoon tallennus aloitettu %s UTC ---\n" #: src/log.c:105 #, c-format msgid "" "\n" "--- Logging stopped at %s UTC ---\n" msgstr "" "\n" "--- Tiedostoon tallennus lopetettu %s UTC ---\n" #: src/macro.c:87 #, c-format msgid "fill_macroconfig: invalid macro number %d\n" msgstr "fill_macroconfig: virheellinen makron numero %d\n" #: src/macro.c:120 #, c-format msgid "apply_macroconfig: invalid macro number %d\n" msgstr "apply_macroconfig: virheellinen makron numero %d\n" #: src/macro.c:237 #, c-format msgid "run_command: %s" msgstr "run_command: %s" #: src/macro.c:310 #, c-format msgid "send_macro: invalid macro number %d\n" msgstr "send_macro: virheellinen makron numero %d\n" #: src/main.c:328 #, c-format msgid "insert_rx_text: conversion failed: %s" msgstr "insert_rx_text: muunnos epäonnistui: %s" #: src/main.c:539 msgid "Start with specified modem" msgstr "" #: src/main.c:539 #, fuzzy msgid "MODEM" msgstr "MODE" #: src/main.c:542 msgid "Run first-time configuration druid" msgstr "Käynnistä ensiasennusvelho" #: src/main.c:545 msgid "Enable CWirc slave mode" msgstr "Aktivoi CWirc-tila" #: src/main.c:545 msgid "SHMID" msgstr "SHMID" #: src/main.c:549 msgid "Enable test mode (write audio data to stdin/stdout)" msgstr "Aktivoi testitila (audiodata stdin/stdout kanavista)" #: src/main.c:550 msgid "MODE" msgstr "MODE" #: src/main.c:563 #, c-format msgid "Menu item \"%s\" not found!\n" msgstr "Valikon kohtaa \"%s\" ei löytynyt!\n" #: src/main.c:609 msgid "" "FFTW wisdom not found. This is normal if you are running gMFSK for the first " "time." msgstr "" "FFTW vihjeitä ei löydy. Tämä on normaalia jos käytät ohjelmaa ensimmäistä " "kertaa." #: src/main.c:628 msgid "gMFSK -- testmode (both)" msgstr "gMFSK -- testitila (molemmat)" #: src/main.c:632 msgid "gMFSK -- testmode (rx)" msgstr "gMFSK -- testitila (vastaanotto)" #: src/main.c:636 msgid "gMFSK -- testmode (tx)" msgstr "gMFSK -- testitila (lähetys)" #: src/main.c:638 #, c-format msgid "Invalid testmode '%s'\n" msgstr "Epäkelpo testitila '%s'\n" #: src/miniscope.c:176 src/miniscope.c:188 src/miniscope.c:200 #: src/waterfall.c:343 src/waterfall.c:354 src/waterfall.c:365 #: src/waterfall.c:376 src/waterfall.c:387 #, c-format msgid "unable to allocate color: ( %d %d %d )" msgstr "väriä ei voitu varata: ( %d %d %d )" #: src/miniscope.c:434 #, c-format msgid "miniscope: invalid mode %d\n" msgstr "miniscope: virheellinen toimintamuoto %d\n" #: src/picture.c:171 #, c-format msgid "Error saving picture: %s: %s" msgstr "Virhe kuvatiedostoa tallennettaessa: %s: %s" #: src/picture.c:253 #, c-format msgid "picture write: x >= width (%d >= %d)" msgstr "picture write: x >= width (%d >= %d)" #: src/picture.c:259 #, c-format msgid "picture write: y >= height (%d >= %d)" msgstr "picture write: y >= height (%d >= %d)" #: src/picture.c:334 #, c-format msgid "send_picture: %s" msgstr "send_picture: %s" #: src/picture.c:344 msgid "send_picture: pixbuf conversion failed!" msgstr "send_picture: pixbuf-muunnos epäonnistui!" #: src/picture.c:351 msgid "send_picture: couldn't load picture icon!" msgstr "send_picture: kuvaikonin lataus epäonnistui!" #: src/ptt.c:162 #, c-format msgid "Device '%s' is neither a parallel nor a serial port" msgstr "Laite '%s' ei ole sarja- eikä rinnakkaisportti" #: src/ptt.c:164 #, c-format msgid "Device '%s' is not a serial port" msgstr "Laite '%s' ei ole sarjaportti" #: src/qsodata.c:76 #, c-format msgid "log message too long, entry dropped: %s\n" msgstr "lokiviesti on liian pitkä, merkintä poistettu: %s\n" #: src/snd.c:144 msgid "opensnd: device not set" msgstr "opensnd: laitetta ei ole asetettu" #: src/snd.c:168 #, c-format msgid "opensnd: open: %s: %m" msgstr "opensnd: open: %s: %m" #: src/snd.c:174 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_NONBLOCK: %m" msgstr "opensnd: ioctl: SNDCTL_DSP_NONBLOCK: %m" #: src/snd.c:194 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SETFMT: %m" msgstr "opensnd: ioctl: SNDCTL_DSP_SETFMT: %m" #: src/snd.c:198 msgid "opensnd: Requested sample format not supported" msgstr "opensnd: Pyydetty näytteistysmuoto ei ole tuettu" #: src/snd.c:214 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_STEREO: %m" msgstr "opensnd: ioctl: SNDCTL_DSP_STEREO: %m" #: src/snd.c:218 #, c-format msgid "opensnd: Cannot set %s audio" msgstr "opensnd: %s-ääni ei ole mahdollinen" #: src/snd.c:229 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SPEED: %m" msgstr "opensnd: ioctl: SNDCTL_DSP_SPEED: %m" #: src/snd.c:233 #, c-format msgid "Sampling rate is %u, requested %u\n" msgstr "Näytteistystaajuus on %u, pyydetty taajuus %u\n" #: src/snd.c:261 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %m" msgstr "opensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %m" #: src/snd.c:349 #, c-format msgid "sound_open_for_write: src_new failed: %s" msgstr "sound_open_for_write: src_new epäonnistui: %s" #: src/snd.c:418 #, c-format msgid "sound_open_for_read: src_new failed: %s" msgstr "sound_open_for_read: src_new epäonnistui: %s" #: src/snd.c:461 #, c-format msgid "sound_close: ioctl: SNDCTL_DSP_SYNC: %m" msgstr "sound_close: ioctl: SNDCTL_DSP_SYNC: %m" #: src/snd.c:489 msgid "sound_write: fd < 0" msgstr "sound_write: fd < 0" #: src/snd.c:503 #, c-format msgid "sound_write: src_process: %s" msgstr "sound_write: src_process: %s" #: src/snd.c:522 #, c-format msgid "write_samples: count <= 0 (%d)" msgstr "write_samples: count <= 0 (%d)" #: src/snd.c:527 #, c-format msgid "write_samples: count > SND_BUF_LEN (%d)" msgstr "write_samples: count > SND_BUF_LEN (%d)" #: src/snd.c:558 #, c-format msgid "write_samples: write: %m" msgstr "write_samples: write: %m" #: src/snd.c:590 msgid "sound_read: fd < 0" msgstr "sound_read: fd < 0" #: src/snd.c:611 #, c-format msgid "sound_read: src_process: %s" msgstr "sound_read: src_process: %s" #: src/snd.c:630 #, c-format msgid "read_samples: count <= 0 (%d)" msgstr "read_samples: count <= 0 (%d)" #: src/snd.c:635 #, c-format msgid "read_samples: count > SND_BUF_LEN (%d)" msgstr "read_samples: count > SND_BUF_LEN (%d)" #: src/snd.c:683 #, c-format msgid "sound_read: read: %m" msgstr "sound_read: read: %m" #: src/support.c:60 src/support.c:85 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Pixmap-tiedostoa ei löytynyt: %s" #: src/trx.c:100 #, c-format msgid "sound_open_for_read: %s" msgstr "sound_open_for_read: %s" #: src/trx.c:121 #, c-format msgid "%s" msgstr "%s" #: src/trx.c:138 #, c-format msgid "sound_open_for_write: %s" msgstr "sound_open_for_write: %s" #: src/trx.c:297 msgid "Modem initialization failed!" msgstr "Modeemin alustus epäonnistui!" #: src/trx.c:307 #, c-format msgid "pthread_create: %m" msgstr "pthread_create: %m" #: src/trx.c:823 #, c-format msgid "trx_get_tx_char: conversion failed: %s" msgstr "trx_get_tx_char: muunnos epäonnistui: %s" #: src/waterfall.c:1060 #, c-format msgid "Unknown waterfall mode: %d\n" msgstr "Tuntematon vesiputouksen toimintatila: %d\n" #: src/waterfall.c:1226 #, c-format msgid "Invalid window function: %d\n" msgstr "Epäkelpo ikkunafunktio: %d\n" #: src/waterfall.c:1395 #, c-format msgid "Unsupported magnification: %d\n" msgstr "Suurennosta ei tueta: %d\n" #~ msgid "frequency" #~ msgstr "taajuus" gmfsk-0.7pre1/po/sk.po0000644000076400007640000010431410206176700010345 # translation of gmfsk.po to slovak # This file is distributed under the same license as the PACKAGE package. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER. # Michal Karas , 2004. # msgid "" msgstr "" "Project-Id-Version: gmfsk\n" "POT-Creation-Date: 2005-02-20 23:14+0200\n" "PO-Revision-Date: 2004-09-02 00:34+0200\n" "Last-Translator: Michal Karas \n" "Language-Team: slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.3.1\n" #: src/callbacks.c:84 msgid "Unable to open log file" msgstr "" #: src/callbacks.c:1351 #, c-format msgid "Error reading file: %s" msgstr "" #: src/callbacks.c:1359 #, c-format msgid "Error converting file to UTF8: %s" msgstr "" #. Append qsodata buttons #: src/callbacks.c:1509 src/interface.c:2159 src/interface.c:4517 msgid "Callsign" msgstr "Značka" #: src/callbacks.c:1517 src/interface.c:525 src/interface.c:2167 #: src/interface.c:4525 msgid "Name" msgstr "Meno" #: src/callbacks.c:1525 src/interface.c:598 src/interface.c:2175 #: src/interface.c:4533 msgid "QTH" msgstr "QTH" #: src/callbacks.c:1533 src/interface.c:612 src/interface.c:2183 #: src/interface.c:4541 msgid "Locator" msgstr "Lokátor" #: src/callbacks.c:1541 src/interface.c:541 msgid "Sent RST" msgstr "Odoslaný RST" #: src/callbacks.c:1549 #, fuzzy msgid "Received RST" msgstr "Prijatý RST" #: src/callbacks.c:1557 src/interface.c:605 msgid "Notes" msgstr "Poznámky" #: src/conf.c:310 src/druid.c:291 #, c-format msgid "Error converting filename (%s=%s): %s" msgstr "" #: src/conf.c:357 msgid "Couldn't allocate color" msgstr "" #: src/conf.c:620 msgid "GConf client init failed!!!\n" msgstr "" #: src/confdialog.c:60 #, fuzzy msgid "Station info" msgstr "Informácie o stanici" #: src/confdialog.c:61 msgid "Date & Time" msgstr "" #: src/confdialog.c:62 src/interface.c:2298 msgid "Bands" msgstr "Pásma" #: src/confdialog.c:63 #, fuzzy msgid "Files & Dirs" msgstr "Súbory a adresáre" #: src/confdialog.c:68 src/interface.c:2446 msgid "Colors" msgstr "Farby" #: src/confdialog.c:69 src/interface.c:2493 msgid "Fonts" msgstr "Typy písma" #: src/confdialog.c:74 src/interface.c:2531 msgid "All" msgstr "Všetky" #: src/confdialog.c:75 src/interface.c:2572 msgid "MFSK" msgstr "MFSK" #: src/confdialog.c:76 src/interface.c:83 src/interface.c:2704 msgid "OLIVIA" msgstr "" #: src/confdialog.c:77 src/interface.c:90 src/interface.c:2898 msgid "RTTY" msgstr "RTTY" #: src/confdialog.c:78 src/interface.c:2938 msgid "THROB" msgstr "THROB" #: src/confdialog.c:79 src/interface.c:2977 msgid "PSK31" msgstr "PSK31" #: src/confdialog.c:80 src/interface.c:139 src/interface.c:3084 msgid "MT63" msgstr "MT63" #: src/confdialog.c:81 src/interface.c:3185 msgid "HELL" msgstr "HELL" #: src/confdialog.c:82 src/interface.c:153 src/interface.c:3256 msgid "CW" msgstr "" #: src/confdialog.c:87 src/confdialog.c:99 src/interface.c:3406 #: src/interface.c:3738 msgid "Settings" msgstr "Nastavenia" #: src/confdialog.c:92 src/interface.c:3538 msgid "Sound" msgstr "Zvuk" #: src/confdialog.c:93 src/interface.c:3627 msgid "PTT" msgstr "PTT" #: src/confdialog.c:100 msgid "Features" msgstr "" #: src/confdialog.c:106 msgid "General" msgstr "" #: src/confdialog.c:107 msgid "Appearance" msgstr "" #: src/confdialog.c:108 #, fuzzy msgid "Modems" msgstr "Mód" #: src/confdialog.c:109 src/interface.c:1341 src/interface.c:1648 msgid "Waterfall" msgstr "Vodopád" #: src/confdialog.c:110 msgid "Devices" msgstr "" #: src/confdialog.c:112 src/interface.c:3742 msgid "Hamlib" msgstr "Hamlib" #: src/confdialog.c:660 msgid "Categories" msgstr "" #: src/confdialog.c:712 msgid "confdialog_select_node: ConfDialog init failed\n" msgstr "" #: src/confdialog.c:725 #, c-format msgid "confdialog_select_node: tree path '%s' not found (%s)\n" msgstr "" #: src/cwirc.c:66 msgid "Can't attach to the CWirc API shared memory block!\n" msgstr "" #: src/cwirc.c:70 #, fuzzy msgid "Working in CWirc slave mode.\n" msgstr "Povoliť CWirc slave mód" #: src/druid.c:409 #, c-format msgid "Error creating directory: %s: %m" msgstr "" #: src/druid.c:416 #, c-format msgid "Error creating directory: %s exists but is not a directory" msgstr "" #: src/druid.c:435 #, c-format msgid "Error creating file: %s: %m" msgstr "" #: src/druid.c:442 #, c-format msgid "Error creating file: %s exists but is not a regular file" msgstr "" #: src/druid.c:447 #, c-format msgid "Error: %s is not writable: %m" msgstr "" #: src/druid.c:505 #, c-format msgid "Sound card open for read failed: %s" msgstr "" #: src/druid.c:512 src/druid.c:539 #, c-format msgid "Reading from sound card failed: %s" msgstr "" #: src/druid.c:523 #, c-format msgid "Sound card open for write failed: %s" msgstr "" #: src/druid.c:576 src/ptt.c:146 #, c-format msgid "Cannot open PTT device '%s': %m" msgstr "" #: src/druid.c:590 src/ptt.c:123 src/ptt.c:130 #, c-format msgid "set_ptt: ioctl: %m" msgstr "" #: src/hamlib.c:270 #, c-format msgid "Hamlib init: Bad rig config parameter: '%s'" msgstr "" #: src/hamlib.c:275 #, c-format msgid "Hamlib init: rig_set_conf failed (%s=%s): %s" msgstr "" #: src/hamlib.c:310 #, c-format msgid "Hamlib init: rig_init failed (model=%d)" msgstr "" #: src/hamlib.c:322 #, c-format msgid "Hamlib init: Bad param=value pair: '%s'" msgstr "" #: src/hamlib.c:348 #, c-format msgid "Hamlib init: rig_open failed: %s" msgstr "" #: src/hamlib.c:361 #, c-format msgid "Hamlib init: rig_get_freq failed: %s" msgstr "" #: src/hamlib.c:372 #, c-format msgid "" "Hamlib init: rig_get_mode failed: %s.\n" "Assuming USB mode." msgstr "" #: src/hamlib.c:379 #, c-format msgid "" "Hamlib init: rig_set_ptt failed: %s.\n" "Hamlib PTT disabled" msgstr "" #: src/hamlib.c:396 #, c-format msgid "Hamlib init: pthread_create: %m" msgstr "" #: src/hamlib.c:440 #, c-format msgid "" "rig_set_ptt failed: %s.\n" "Hamlib PTT disabled.\n" msgstr "" #: src/hamlib.c:484 #, c-format msgid "rig_get_freq failed: %s" msgstr "" #: src/hamlib.c:506 #, c-format msgid "rig_get_mode failed: %s" msgstr "" #: src/hamlib.c:524 #, c-format msgid "rig_set_freq failed: %s" msgstr "" #: src/interface.c:32 msgid "_Send file..." msgstr "Odo_slať súbor..." #: src/interface.c:40 msgid "_Log to file" msgstr "Zaz_namenávať do súboru" #: src/interface.c:48 msgid "Clear _TX window" msgstr "Vyčistiť _TX okno" #: src/interface.c:55 msgid "Clear _RX window" msgstr "Vyčistiť _RX okno" #: src/interface.c:69 msgid "MFSK16" msgstr "MFSK16" #: src/interface.c:76 msgid "MFSK8" msgstr "MFSK8" #: src/interface.c:97 msgid "THROB (1 tps)" msgstr "THROB (1 tps)" #: src/interface.c:104 msgid "THROB (2 tps)" msgstr "THROB (2 tps)" #: src/interface.c:111 msgid "THROB (4 tps)" msgstr "THROB (4 tps)" #: src/interface.c:118 msgid "PSK31 (BPSK)" msgstr "PSK31 (BPSK)" #: src/interface.c:125 msgid "PSK31 (QPSK)" msgstr "PSK31 (QPSK)" #: src/interface.c:132 msgid "PSK63" msgstr "PSK63" #: src/interface.c:146 msgid "FELDHELL" msgstr "FELDHELL" #: src/interface.c:175 msgid "macro 1" msgstr "makro 1" #: src/interface.c:182 msgid "macro 2" msgstr "makro 2" #: src/interface.c:189 msgid "macro 3" msgstr "makro 3" #: src/interface.c:196 msgid "macro 4" msgstr "makro 4" #: src/interface.c:203 msgid "macro 5" msgstr "makro 5" #: src/interface.c:210 msgid "macro 6" msgstr "makro 6" #: src/interface.c:217 msgid "macro 7" msgstr "makro 7" #: src/interface.c:224 msgid "macro 8" msgstr "makro 8" #: src/interface.c:231 msgid "macro 9" msgstr "makro 9" #: src/interface.c:238 msgid "macro 10" msgstr "makro 10" #: src/interface.c:245 msgid "macro 11" msgstr "makro 11" #: src/interface.c:252 msgid "macro 12" msgstr "makro 12" #: src/interface.c:265 msgid "_Configure macros" msgstr "Nastaviť _makrá" #: src/interface.c:277 msgid "_Contents" msgstr "_Obsah" #: src/interface.c:290 msgid "_File" msgstr "Súbo_r" #: src/interface.c:297 msgid "_Mode" msgstr "_Mód" #: src/interface.c:304 msgid "_Settings" msgstr "Na_stavenia" #: src/interface.c:311 msgid "_Help" msgstr "_Pomocník" #: src/interface.c:416 msgid "gMFSK" msgstr "gMFSK" #: src/interface.c:436 src/interface.c:1367 msgid "Pause" msgstr "Pauza" #: src/interface.c:437 msgid "Suspend the modem and release soundcard (Ctl+Z)" msgstr "Suspendovať modem a uvoľniť zvukovú kartu (Ctl+Z)" #: src/interface.c:454 msgid "Receive" msgstr "Príjem" #: src/interface.c:455 msgid "Switch to receive (Ctl+R)" msgstr "Prepnúť na príjem (Ctl+R)" #: src/interface.c:471 msgid "Transmit" msgstr "Vysielanie" #: src/interface.c:472 msgid "Switch to transmit (Ctl+T)" msgstr "Prepnúť na vysielanie (Ctl+T)" #: src/interface.c:489 msgid "Abort" msgstr "Prerušiť" #: src/interface.c:490 msgid "Abort transmission immediately (Ctl+X)" msgstr "Okamžite prerušiť vysielanie (Ctl+X)" #: src/interface.c:504 msgid "Tune" msgstr "Ladenie" #: src/interface.c:505 msgid "Send tune signal (Ctl+U)" msgstr "Vysielať ladiací signál (Ctl+U)" #: src/interface.c:533 msgid "Rcvd RST" msgstr "Prijatý RST" #: src/interface.c:549 msgid "Call" msgstr "Značka" #: src/interface.c:557 msgid "Band" msgstr "Pásmo" #: src/interface.c:620 msgid "New entry" msgstr "Nové" #: src/interface.c:625 msgid "Clear QSO data fields (Ctl-N)" msgstr "Vyčistiť údaje o QSO (Ctl+N)" #: src/interface.c:644 msgid "Log entry" msgstr "Zaznamenať" #: src/interface.c:649 msgid "Send QSO data to xlog (Ctl-L)" msgstr "Odoslať informácie o QSO xlogu (Ctl+L)" #: src/interface.c:694 msgid "textmodes" msgstr "textové módy" #: src/interface.c:734 msgid "hellmodes" msgstr "hell módy" #: src/interface.c:750 src/interface.c:759 src/interface.c:768 #: src/interface.c:781 src/interface.c:790 src/interface.c:799 #: src/interface.c:816 src/interface.c:825 src/interface.c:834 #: src/interface.c:847 src/interface.c:856 src/interface.c:865 msgid "Click right button to edit macro" msgstr "Klikni pravým tlačítkom pre úpravu makra" #: src/interface.c:896 msgid "Freq" msgstr "" #: src/interface.c:910 msgid "Center frequency on RX pass band" msgstr "" #: src/interface.c:921 msgid "AFC" msgstr "AFC" #: src/interface.c:925 msgid "Automatic frequency control" msgstr "Automatické dolaďovanie" #: src/interface.c:927 msgid "SQL" msgstr "SQL" #: src/interface.c:931 src/interface.c:2564 src/interface.c:2603 #: src/interface.c:2735 src/interface.c:2930 src/interface.c:2969 #: src/interface.c:3008 src/interface.c:3216 msgid "Squelch" msgstr "Squelch" #: src/interface.c:933 msgid "REV" msgstr "REV" #: src/interface.c:937 src/interface.c:2878 msgid "Reverse polarity" msgstr "Opačná polarizácia" #: src/interface.c:985 msgid "clock" msgstr "hodiny" #. TRANSLATORS: Replace this string with your names, one name per line. #: src/interface.c:1280 msgid "translator_credits" msgstr "Mike Karas, OM4AA" #: src/interface.c:1288 #, fuzzy msgid "Copyright 2001-2005 Tomi Manninen, OH2BNS" msgstr "Copyright 2001-2004 Tomi Manninen, OH2BNS" #: src/interface.c:1289 #, fuzzy msgid "" "A Gnome terminal program for HF conversation modes (MFSK, OLIVIA, RTTY, " "THROB, PSK31, MT63 and FeldHell)" msgstr "" "Gnome aplikácia pre KV digitálne módy (MFSK, RTTY, THROB, PSK31, MT63 a " "FeldHell)" #: src/interface.c:1308 msgid "Select File to Transmit" msgstr "Vyber súbor pre odoslanie" #: src/interface.c:1348 src/interface.c:1655 msgid "Spectrum" msgstr "Spektrum" #: src/interface.c:1355 src/interface.c:1662 msgid "Scope" msgstr "Osciloskop" #: src/interface.c:1381 msgid "Waterfall properties..." msgstr "Vlastnosti vodopádu..." #: src/interface.c:1417 #, fuzzy msgid "125 Hz" msgstr "500 Hz" #: src/interface.c:1424 #, fuzzy msgid "250 Hz" msgstr "500 Hz" #: src/interface.c:1431 src/interface.c:1622 msgid "500 Hz" msgstr "500 Hz" #: src/interface.c:1438 src/interface.c:1629 msgid "1000 Hz" msgstr "1000 Hz" #: src/interface.c:1445 src/interface.c:1636 msgid "2000 Hz" msgstr "2000 Hz" #: src/interface.c:1457 #, fuzzy msgid "4" msgstr "45" #: src/interface.c:1464 #, fuzzy msgid "8" msgstr "85" #: src/interface.c:1471 #, fuzzy msgid "16" msgstr "160" #: src/interface.c:1478 #, fuzzy msgid "32" msgstr "2" #: src/interface.c:1485 msgid "64" msgstr "" #: src/interface.c:1492 #, fuzzy msgid "128" msgstr "182" #: src/interface.c:1499 #, fuzzy msgid "256" msgstr "56" #: src/interface.c:1511 src/interface.c:3595 src/interface.c:4787 msgid "none" msgstr "žiadné" #: src/interface.c:1518 msgid "even" msgstr "párna" #: src/interface.c:1525 msgid "odd" msgstr "nepárna" #: src/interface.c:1532 msgid "zero" msgstr "nula" #: src/interface.c:1539 msgid "one" msgstr "jednotka" #: src/interface.c:1551 msgid "1" msgstr "1" #: src/interface.c:1558 msgid "1.5" msgstr "1.5" #: src/interface.c:1565 msgid "2" msgstr "2" #: src/interface.c:1577 msgid "5 (BAUDOT)" msgstr "5 (BAUDOT)" #: src/interface.c:1584 msgid "7 (ASCII)" msgstr "7 (ASCII)" #: src/interface.c:1591 msgid "8 (ASCII)" msgstr "8 (ASCII)" #: src/interface.c:1603 msgid "32 (short)" msgstr "32 (krátke)" #: src/interface.c:1610 msgid "64 (long)" msgstr "64 (dlhé)" #: src/interface.c:1674 msgid "x 1" msgstr "x 1" #: src/interface.c:1681 msgid "x 2" msgstr "x 2" #: src/interface.c:1688 msgid "x 4" msgstr "x 4" #: src/interface.c:1700 msgid "Half" msgstr "Polovičná" #: src/interface.c:1707 msgid "Normal" msgstr "Normálna" #: src/interface.c:1714 msgid "Double" msgstr "Dvojnásobná" #: src/interface.c:1726 msgid "Boxcar" msgstr "Boxcar" #: src/interface.c:1733 msgid "Triangular" msgstr "Triangular" #: src/interface.c:1740 msgid "Hamming" msgstr "Hamming" #: src/interface.c:1762 msgid "MHz" msgstr "MHz" #: src/interface.c:1769 msgid "kHz" msgstr "kHz" #: src/interface.c:1776 msgid "Hz" msgstr "Hz" #: src/interface.c:2100 msgid "Preferences" msgstr "Predvoľby" #: src/interface.c:2131 msgid "gMFSK" msgstr "gMFSK" #: src/interface.c:2136 msgid "Logo" msgstr "Logo" #: src/interface.c:2149 msgid "" "The station information is used in the macros like $mycall, $myname, etc. " msgstr "Informácie o stanici sú použité v makrách ako $mycall, $myname, atď." #: src/interface.c:2191 src/interface.c:4549 msgid "E-mail" msgstr "E-mail" #: src/interface.c:2229 msgid "Station" msgstr "Stanica" #: src/interface.c:2239 msgid "" "These are used in the $date and $date macros. See the strftime manual page " "for an explanation of the format." msgstr "" "Toto je použité v $date a $time makrách. Pozri manuálovú stránku strftime " "pre informácie o formáte." #: src/interface.c:2249 msgid "Time format string" msgstr "Formát reťazca času" #: src/interface.c:2257 msgid "Date format string" msgstr "Formát reťazca dátumu" #: src/interface.c:2270 src/interface.c:2277 msgid "See the strftime manual page for explanation of this field" msgstr "Pozri manuálovú stránku strftime pre informácie o položke." #: src/interface.c:2279 msgid "Time" msgstr "Čas" #: src/interface.c:2288 msgid "" "This is a comma separated list of bands you want to appear in the Bands " "popdown list." msgstr "" "Toto je čiarkami oddelený zoznam pásiem, ktoré chceš mať v popdown zozname" #: src/interface.c:2307 msgid "Files and directories used by gMFSK." msgstr "Súbory a adresáre použité v gMFSK" #: src/interface.c:2323 src/interface.c:4619 msgid "Log file name" msgstr "Názov súboru denníka" #: src/interface.c:2330 src/interface.c:4626 msgid "TX pictures directory" msgstr "Adresár pre odosielané obrázky" #: src/interface.c:2337 src/interface.c:4633 msgid "RX pictures directory" msgstr "Adresár pre prijímané obrázky" #: src/interface.c:2356 msgid "Files" msgstr "Súbory" #: src/interface.c:2366 msgid "" "The color settings let you configure the colors used in the RX and TX " "windows." msgstr "Nastavenia farieb ti umožnia zmeniť farby použité pre RX a TX okná." #: src/interface.c:2406 msgid "Received text color" msgstr "Prijatý text" #: src/interface.c:2414 msgid "Transmitted text color" msgstr "Odoslaný text" #: src/interface.c:2422 msgid "HIghlighted text color" msgstr "Zvýraznený text" #: src/interface.c:2430 msgid "RX window background color" msgstr "Pozadie RX okna" #: src/interface.c:2438 msgid "TX window background color" msgstr "Pozadie TX okna" #: src/interface.c:2455 msgid "" "The fonts settings let you configure the fonts used in the RX and TX windows." msgstr "" "Nastavenie typov písma ti umožní zmeniť typy písma použité pre RX a TX okná." #: src/interface.c:2465 msgid "Received text font" msgstr "Prijatý text" #: src/interface.c:2473 msgid "Transmitted text font" msgstr "Odoslaný text" #: src/interface.c:2503 msgid "These settings affect all modems." msgstr "Tieto nastavenia ovplyvňujú všetky modemy." #: src/interface.c:2523 msgid "TX offset frequency" msgstr "Posuv TX frekvencie" #: src/interface.c:2542 msgid "" "MFSK16 and MFSK8 modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre MFSK16 a MFSK8.\n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:2568 src/interface.c:2700 src/interface.c:2894 #: src/interface.c:2934 src/interface.c:2973 src/interface.c:3080 #: src/interface.c:3252 src/interface.c:3534 msgid "Restart modem" msgstr "Reštartovať modem" #: src/interface.c:2581 #, fuzzy msgid "" "OLIVIA modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre RTTY.\n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:2645 #, fuzzy msgid "Tones" msgstr "jednotka" #: src/interface.c:2653 src/interface.c:3050 msgid "Bandwidth" msgstr "Širka pásma" #: src/interface.c:2661 msgid "RX sync search margin" msgstr "" #: src/interface.c:2669 msgid "RX sync integration period" msgstr "" #: src/interface.c:2691 src/interface.c:3071 msgid "Allow 8 bit characters (escape-127 method)" msgstr "Povoliť 8 bitové znaky (escape-127 metóda)" #: src/interface.c:2696 src/interface.c:2890 src/interface.c:3076 msgid "Modem settings" msgstr "Nastavenia modemu" #: src/interface.c:2713 msgid "" "RTTY modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre RTTY.\n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:2798 msgid "23" msgstr "23" #: src/interface.c:2799 msgid "85" msgstr "85" #: src/interface.c:2800 msgid "160" msgstr "160" #: src/interface.c:2801 msgid "170" msgstr "170" #: src/interface.c:2802 msgid "182" msgstr "182" #: src/interface.c:2803 src/interface.c:2830 msgid "200" msgstr "200" #: src/interface.c:2804 msgid "240" msgstr "240" #: src/interface.c:2805 msgid "350" msgstr "350" #: src/interface.c:2806 msgid "425" msgstr "425" #: src/interface.c:2807 msgid "850" msgstr "850" #: src/interface.c:2822 msgid "45" msgstr "45" #: src/interface.c:2823 msgid "45.45" msgstr "45.45" #: src/interface.c:2824 msgid "50" msgstr "50" #: src/interface.c:2825 msgid "56" msgstr "56" #: src/interface.c:2826 msgid "75" msgstr "75" #: src/interface.c:2827 msgid "100" msgstr "100" #: src/interface.c:2828 msgid "110" msgstr "110" #: src/interface.c:2829 msgid "150" msgstr "150" #: src/interface.c:2831 msgid "300" msgstr "300" #: src/interface.c:2838 msgid "Shift" msgstr "Zdvih" #: src/interface.c:2846 msgid "Baudrate" msgstr "Baudrejt" #: src/interface.c:2854 msgid "Bits" msgstr "Bitov" #: src/interface.c:2862 msgid "Parity" msgstr "Parita" #: src/interface.c:2870 msgid "Stopbits" msgstr "Stopbitov" #: src/interface.c:2882 msgid "If tones should be reversed for RTTY" msgstr "Ak majú byť tóny reverzované pre RTTY" #: src/interface.c:2884 msgid "Send MSB first" msgstr "Najskôr odošli MSB" #: src/interface.c:2888 msgid "If most significant bit should the transmitted first" msgstr "Ak majú byť najskôr odoslané dôležité bity " #: src/interface.c:2908 msgid "" "THROB modem parameters. \n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre THROB. \n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:2947 msgid "" "BPSK31, QPSK31 and PSK63 modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre BPSK31, QPSK31 a PSK63.\n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:2986 msgid "" "MT63 modem parameters. \n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre MT63.\n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:3058 msgid "Interleave" msgstr "Prekladanie" #: src/interface.c:3066 msgid "CW Identification" msgstr "CW identifikácia" #: src/interface.c:3093 msgid "FELDHELL modem parameters." msgstr "Parametre modemu pre FELDHELL." #: src/interface.c:3107 msgid "Force upper case" msgstr "Vnútiť veľké písmená" #: src/interface.c:3114 msgid "Hellschreiber font" msgstr "Typ písma pre Hellschreiber" #: src/interface.c:3150 src/interface.c:3232 #, fuzzy msgid "Filter BW" msgstr "Filter bw" #: src/interface.c:3165 msgid "AGC attack" msgstr "AGC attack" #: src/interface.c:3181 msgid "AGC decay" msgstr "AGC decay" #: src/interface.c:3194 #, fuzzy msgid "" "CW modem parameters.\n" "New parametes take effect after restarting the modem." msgstr "" "Parametre modemu pre RTTY.\n" "Nové parametre sa prejavia až po reštartovaní modemu." #: src/interface.c:3248 #, fuzzy msgid "Speed (WPM)" msgstr "Rýchlosť" #: src/interface.c:3265 msgid "Settings for the waterfall/scope display." msgstr "Nastavenia pre vodopád/osciloskop." #: src/interface.c:3286 msgid "Ref level" msgstr "Ref level" #: src/interface.c:3301 msgid "Amp span" msgstr "Amp span" #: src/interface.c:3317 msgid "Mode" msgstr "Mód" #: src/interface.c:3325 msgid "Zoom" msgstr "Zväčšenie" #: src/interface.c:3333 src/interface.c:3704 msgid "Speed" msgstr "Rýchlosť" #: src/interface.c:3341 msgid "Window" msgstr "Okno" #: src/interface.c:3401 msgid "Waterfall scrolls upwards" msgstr "Pohyb vodopádu smerom nahor" #: src/interface.c:3410 msgid "WF" msgstr "VP" #: src/interface.c:3423 msgid "Sound card settings take effect after restarting the modem." msgstr "Nastavenia zvukovej karty sa prejavia až po reštartovaní modemu." #: src/interface.c:3433 src/interface.c:4709 msgid "8-bit sound I/O" msgstr "8-bitový zvukový V/V" #: src/interface.c:3440 src/interface.c:4714 msgid "Stereo sound I/O" msgstr "Stereo zvukový V/V" #: src/interface.c:3447 msgid "Full duplex I/O (unsupported!)" msgstr "Plno duplexný V/V (nepodporované!)" #: src/interface.c:3454 src/interface.c:4687 msgid "Sound card device" msgstr "Zariadenie zvukovej karty" #: src/interface.c:3470 src/interface.c:4699 msgid "/dev/dsp" msgstr "/dev/dsp" #: src/interface.c:3471 src/interface.c:4700 msgid "/dev/dsp0" msgstr "/dev/dsp0" #: src/interface.c:3472 src/interface.c:4701 msgid "/dev/dsp1" msgstr "/dev/dsp1" #: src/interface.c:3473 src/interface.c:4702 msgid "/dev/dsp2" msgstr "/dev/dsp2" #: src/interface.c:3480 msgid "Requested sample rate" msgstr "Žiadaná vzorkovacia frekvencia" #: src/interface.c:3488 msgid "TX rate offset (ppm)" msgstr "Posuv vzorkovania pre TX (ppm)" #: src/interface.c:3496 msgid "RX rate offset (ppm)" msgstr "Posuv vzorkovania pre RX (ppm)" #: src/interface.c:3548 msgid "" "Push-To-Talk settings. \n" "New setting take effect next time PTT is toggled." msgstr "" "Nastavenia PTT.\n" "Nové nastavenia sa prejavia až po ďalšom stlačení PTT." #: src/interface.c:3562 src/interface.c:4754 msgid "RTS" msgstr "RTS" #: src/interface.c:3571 src/interface.c:4763 msgid "DTR" msgstr "DTR" #: src/interface.c:3579 src/interface.c:4771 msgid "both" msgstr "obidva" #: src/interface.c:3596 src/interface.c:3693 src/interface.c:4788 msgid "/dev/ttyS0" msgstr "/dev/ttyS0" #: src/interface.c:3597 src/interface.c:3694 src/interface.c:4789 msgid "/dev/ttyS1" msgstr "/dev/ttyS1" #: src/interface.c:3598 src/interface.c:4790 msgid "/dev/parport0" msgstr "/dev/parport0" #: src/interface.c:3599 src/interface.c:4791 msgid "/dev/parport1" msgstr "/dev/parport1" #: src/interface.c:3606 src/interface.c:4798 msgid "PTT device" msgstr "PTT zariadenie" #: src/interface.c:3614 src/interface.c:4806 msgid "PTT line (serial)" msgstr "PTT vývod (sériový)" #: src/interface.c:3622 src/interface.c:4814 msgid "Use inverted PTT logic" msgstr "Použiť invertovanú logiku PTT" #: src/interface.c:3637 msgid "Hamlib support enables the rig control features in gMFSK." msgstr "Podpora hamlib umožňuje ovládať rig v gMFSK." #: src/interface.c:3643 msgid "Enable hamlib support" msgstr "Povoliť hamlib podporu" #: src/interface.c:3656 msgid "Radio model" msgstr "Model rádia" #: src/interface.c:3676 msgid "Port" msgstr "Port" #: src/interface.c:3692 msgid "localhost" msgstr "localhost" #: src/interface.c:3695 msgid "/dev/ttyS2" msgstr "/dev/ttyS2" #: src/interface.c:3696 msgid "/dev/ttyS3" msgstr "/dev/ttyS3" #: src/interface.c:3702 msgid "Serial port name or hostname for RPC rig" msgstr "Názov sériového portu alebo názov hostu pre RPC rig" #: src/interface.c:3729 msgid "A comma separated list of parameter=value hamlib config parameters." msgstr "" "Čiarkou oddelený zoznam \"parameter=hodnota\" parametrov pre konfiguráciu " "hamlib." #: src/interface.c:3731 msgid "Config" msgstr "Konfigurácia" #: src/interface.c:3751 msgid "Here you can select the rig control features to use." msgstr "Tu môžeš zvoliť možnosti ovládania rigu, ktoré sa využijú." #: src/interface.c:3761 msgid "Use real frequencies in waterfall" msgstr "Používať skutočné frekvencie vo vodopáde" #: src/interface.c:3768 msgid "Set QSO data frequency" msgstr "Nastavovať frekvenciu pre QSO" #: src/interface.c:3775 msgid "Use hamlib PTT" msgstr "Používať hamlib PTT" #: src/interface.c:3782 msgid "Resolution:" msgstr "Rozlíšenie:" #: src/interface.c:3808 #, fuzzy msgid "RX pass band center frequency" msgstr "Posuv TX frekvencie" #: src/interface.c:3815 msgid "Hamlib2" msgstr "Hamlib2" #: src/interface.c:4233 msgid "Macro name" msgstr "Názov makra" #: src/interface.c:4307 msgid "gMFSK picture" msgstr "obrázok gMFSK" #: src/interface.c:4361 msgid "Select Picture to Transmit" msgstr "Vyber obrázok na odoslanie" #: src/interface.c:4389 msgid "Select File" msgstr "Vyber súbor" #: src/interface.c:4474 msgid "gMFSK configuration druid" msgstr "Druid pre nastavenie gMFSK" #: src/interface.c:4487 msgid "Welcome to gMFSK" msgstr "Vitaj v gMFSK" #: src/interface.c:4489 msgid "" "This is the first time you run this version of gMFSK. On the following pages " "you will be guided through the initial setup of gMFSK.\n" "\n" "All settings can also be done later in the main program Settings-" ">Preferences dialog.\n" "\n" "This druid can be run again by starting gMFSK with the \"--run-druid\" flag." msgstr "" "Túto verziu gMFSK spúšťaš prvý krát. Na následujúcich stránkach budeš " "prevedený prvotným nastavením gMFSK.\n" "\n" "Všetky nastavenia môžu byť dokončené neskôr v dialógu hlavného programu " "Nastavenia->Predvoľby.\n" "\n" "Tento druid môžeš opätovne vyvolať, ak gMFSK spustíš s voľbou \"--run-druid" "\"." #: src/interface.c:4495 msgid "Station information" msgstr "Informácie o stanici" #: src/interface.c:4506 msgid "" "Fill in your station information. This data is used in the fixtext macros." msgstr "Vyplň informácie o tvojej stanici. Tieto údaje budú použité v makrách." #: src/interface.c:4591 msgid "Files and directories" msgstr "Súbory a adresáre" #: src/interface.c:4602 msgid "" "These files and directories are used by gMFSK. Click the button to actually " "create the files and directories." msgstr "" "Tieto súbory a adresáre sú použité v gMFSK. Klikni na tlačítko pre aktuálne " "vytvorenie súborov a adresárov." #: src/interface.c:4652 msgid "Create files and directories" msgstr "Vytvoriť súbory a adresáre" #: src/interface.c:4661 msgid "Sound card configuration" msgstr "Nastavenia zvukovej karty" #: src/interface.c:4672 msgid "" "Some sound cards don't support the default setting (16 bit mono sampling). " "You should hear a short sound sample when you click the test button below." msgstr "" "Niektoré zvukové karty nepodporujú štandardné nastavenia (16 bitové mono " "vzorkovanie). Po kliknutí na testovacie tlačítko by si mal počuť krátku " "zvukovú ukážku." #: src/interface.c:4719 msgid "Test sound card" msgstr "Otestovať zvukovú kartu" #: src/interface.c:4728 msgid "PTT configuration" msgstr "Nastavenie PTT" #: src/interface.c:4739 msgid "" "gMFSK can control PTT via the serial port control lines or the parallel port." msgstr "gMFSK može ovládať PTT cez sériový alebo paralelný port." #: src/interface.c:4819 msgid "Test PTT" msgstr "Otestovať PTT" #: src/interface.c:4829 msgid "Configuration complete!" msgstr "Nastavenie kompletné!" #: src/interface.c:4831 msgid "Initial setup is now complete.\n" msgstr "Prvotné nastavenie bolo dokončené.\n" #: src/log.c:71 #, c-format msgid "Error writing to log file: %m" msgstr "" #: src/log.c:94 #, c-format msgid "" "\n" "--- Logging started at %s UTC ---\n" msgstr "" #: src/log.c:105 #, c-format msgid "" "\n" "--- Logging stopped at %s UTC ---\n" msgstr "" #: src/macro.c:87 #, c-format msgid "fill_macroconfig: invalid macro number %d\n" msgstr "" #: src/macro.c:120 #, c-format msgid "apply_macroconfig: invalid macro number %d\n" msgstr "" #: src/macro.c:237 #, c-format msgid "run_command: %s" msgstr "" #: src/macro.c:310 #, c-format msgid "send_macro: invalid macro number %d\n" msgstr "" #: src/main.c:328 #, c-format msgid "insert_rx_text: conversion failed: %s" msgstr "" #: src/main.c:539 msgid "Start with specified modem" msgstr "" #: src/main.c:539 #, fuzzy msgid "MODEM" msgstr "MÓD" #: src/main.c:542 msgid "Run first-time configuration druid" msgstr "Spustiť druida pre prvotnú konfiguráciu" #: src/main.c:545 msgid "Enable CWirc slave mode" msgstr "Povoliť CWirc slave mód" #: src/main.c:545 msgid "SHMID" msgstr "SHMID" #: src/main.c:549 msgid "Enable test mode (write audio data to stdin/stdout)" msgstr "Povoliť testovací mód (vypisovať audio dáta na stdin/stdout)" #: src/main.c:550 msgid "MODE" msgstr "MÓD" #: src/main.c:563 #, c-format msgid "Menu item \"%s\" not found!\n" msgstr "" #: src/main.c:609 msgid "" "FFTW wisdom not found. This is normal if you are running gMFSK for the first " "time." msgstr "" #: src/main.c:628 msgid "gMFSK -- testmode (both)" msgstr "gMFSK -- testovací mód (obidva)" #: src/main.c:632 msgid "gMFSK -- testmode (rx)" msgstr "gMFSK -- testovací mód (príjem)" #: src/main.c:636 msgid "gMFSK -- testmode (tx)" msgstr "gMFSK -- testovací mód (vysielanie)" #: src/main.c:638 #, c-format msgid "Invalid testmode '%s'\n" msgstr "Neznámy testovací mód '%s'\n" #: src/miniscope.c:176 src/miniscope.c:188 src/miniscope.c:200 #: src/waterfall.c:343 src/waterfall.c:354 src/waterfall.c:365 #: src/waterfall.c:376 src/waterfall.c:387 #, c-format msgid "unable to allocate color: ( %d %d %d )" msgstr "" #: src/miniscope.c:434 #, c-format msgid "miniscope: invalid mode %d\n" msgstr "" #: src/picture.c:171 #, c-format msgid "Error saving picture: %s: %s" msgstr "" #: src/picture.c:253 #, c-format msgid "picture write: x >= width (%d >= %d)" msgstr "" #: src/picture.c:259 #, c-format msgid "picture write: y >= height (%d >= %d)" msgstr "" #: src/picture.c:334 #, c-format msgid "send_picture: %s" msgstr "" #: src/picture.c:344 msgid "send_picture: pixbuf conversion failed!" msgstr "" #: src/picture.c:351 msgid "send_picture: couldn't load picture icon!" msgstr "" #: src/ptt.c:162 #, c-format msgid "Device '%s' is neither a parallel nor a serial port" msgstr "" #: src/ptt.c:164 #, c-format msgid "Device '%s' is not a serial port" msgstr "" #: src/qsodata.c:76 #, c-format msgid "log message too long, entry dropped: %s\n" msgstr "" #: src/snd.c:144 msgid "opensnd: device not set" msgstr "" #: src/snd.c:168 #, c-format msgid "opensnd: open: %s: %m" msgstr "" #: src/snd.c:174 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_NONBLOCK: %m" msgstr "" #: src/snd.c:194 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SETFMT: %m" msgstr "" #: src/snd.c:198 #, fuzzy msgid "opensnd: Requested sample format not supported" msgstr "Žiadaná vzorkovacia frekvencia" #: src/snd.c:214 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_STEREO: %m" msgstr "" #: src/snd.c:218 #, c-format msgid "opensnd: Cannot set %s audio" msgstr "" #: src/snd.c:229 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SPEED: %m" msgstr "" #: src/snd.c:233 #, c-format msgid "Sampling rate is %u, requested %u\n" msgstr "" #: src/snd.c:261 #, c-format msgid "opensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %m" msgstr "" #: src/snd.c:349 #, c-format msgid "sound_open_for_write: src_new failed: %s" msgstr "" #: src/snd.c:418 #, c-format msgid "sound_open_for_read: src_new failed: %s" msgstr "" #: src/snd.c:461 #, c-format msgid "sound_close: ioctl: SNDCTL_DSP_SYNC: %m" msgstr "" #: src/snd.c:489 msgid "sound_write: fd < 0" msgstr "" #: src/snd.c:503 #, c-format msgid "sound_write: src_process: %s" msgstr "" #: src/snd.c:522 #, c-format msgid "write_samples: count <= 0 (%d)" msgstr "" #: src/snd.c:527 #, c-format msgid "write_samples: count > SND_BUF_LEN (%d)" msgstr "" #: src/snd.c:558 #, c-format msgid "write_samples: write: %m" msgstr "" #: src/snd.c:590 msgid "sound_read: fd < 0" msgstr "" #: src/snd.c:611 #, c-format msgid "sound_read: src_process: %s" msgstr "" #: src/snd.c:630 #, c-format msgid "read_samples: count <= 0 (%d)" msgstr "" #: src/snd.c:635 #, c-format msgid "read_samples: count > SND_BUF_LEN (%d)" msgstr "" #: src/snd.c:683 #, c-format msgid "sound_read: read: %m" msgstr "" #: src/support.c:60 src/support.c:85 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Nemožno nájsť pixmapový súbor: %s" #: src/trx.c:100 #, c-format msgid "sound_open_for_read: %s" msgstr "" #: src/trx.c:121 #, c-format msgid "%s" msgstr "" #: src/trx.c:138 #, c-format msgid "sound_open_for_write: %s" msgstr "" #: src/trx.c:297 msgid "Modem initialization failed!" msgstr "" #: src/trx.c:307 #, c-format msgid "pthread_create: %m" msgstr "" #: src/trx.c:823 #, c-format msgid "trx_get_tx_char: conversion failed: %s" msgstr "" #: src/waterfall.c:1060 #, c-format msgid "Unknown waterfall mode: %d\n" msgstr "" #: src/waterfall.c:1226 #, c-format msgid "Invalid window function: %d\n" msgstr "" #: src/waterfall.c:1395 #, c-format msgid "Unsupported magnification: %d\n" msgstr "" #~ msgid "frequency" #~ msgstr "frekvencia" gmfsk-0.7pre1/po/fi.gmo0000644000076400007640000006220010206176700010467 jl X#Y#}         %)-159;?GJN R]aeh ny|   BC E I T ^ &d  *   ` K!P! V!`!i!n!u!x!J!!!3!" 7"B"`"q" """""""# #,#3?# s######3#! $%.$:T$ $8$$%%9%W%u%~%R%%% %&$&JC& &&&&&&&&''''+C'o'$'8''' (,6(8c(9((((4(.)41)$f)) )))) ) ) ***X*t*z*~**M* ***++-+4+ 9+C+J+P+ V+ c+p+v+z+ +++++ +I+,,,,L",o,,, ,,",, ,-- )-3- I- U-c-"t---"--:- ..).D.S.q..(...)./ ////#/$/;0X0a0 g0s0{0 0000/001#1 )1 71 E1NS1111112N2Md2J2l2mj3!3U3&P4w5|5555 5555 6(676!N6p6 s6}6666666 67 7 77 %7 37+=7i7n7/t7677*7 88*8A8MX88 8 8%88 9( 959=9F9O9X9`9h9p9x999999999.9 :'%:%M:*s:$:%::$:%$;J;];&{;;;-;<$<5<)F<'p<<'<<'<=(,=U=h=}=== ==&=&>5>'T>|>>>>>>/?/?%@(@ 1@ ;@ E@ O@ ]@ k@ v@ @ @@@@@@@@@@@@@@@@ @@@@@ @@AA A A A #A-A?ABABFA:AAAA A*AB+"B NBXB`B|BBC C C$C9CBCECeWCCC?C( D2D9DVDkD8DD DDD!DE3E7E"IE/lEEEE EEE4F%:F.`FBF#FKF"BGeG+G$G,GGHY&H H HHH.H?H6I PI[IoI(IIIIII4I,"JOJ*oJ:J-J&K2*KA]K5KKKK5K1L14L$fLL LLL L LLMMMs#MMMMMgM N"NBNKNjN}NN NN NN N NNN N NN OOOOY(OOOOOgO!O'PEP \PiP${P PPPPPQ Q(QFQ`Q}QQ/QQ<QQ R-RIR"\R!RR)RR R&S 'S5SSSS: T)ETLoTTT T TT T T UU1/UaU~UU U U UhU4V NV'oVVVV9V?WANWgWoW2hX[XGX?ZDZ[ZdZ}ZZZ%Z*ZZ[*[3D[x[ {["[[[ [[ \ \ \ #\-\3\ H\U\ h\1s\\\;\9\ *]05]f]l] ]]G]^ #^.^(>^g^ k^4u^^^^^^^^^^^^_) _7_>_F_%K_1q_!_'_%_*`$>`%c``$`%```&aBa`a6~aa*aa-b*/bZb'mbb-bb.b#c6cKcgc{ccc)c%cd'-dUdndrdvdzd d?]0O76P!*83jkO `b#nTI A._RL1Y>;Ts}tjp'7(2/Pgh|XS&Gi< D-\,Q:X .yVYZ1I:?$9oGAE-#l46r89/ *UC[_"%Ra)xz@(Uw>cfg"~ hqaWD^20=4`%KLZ+mVS'e3c]uHNQiMFN^  BH[!@Ee$&<J{5Kd\+bv;)=5M,WBFCJf --- Logging started at %s UTC --- --- Logging stopped at %s UTC --- %s/dev/dsp/dev/dsp0/dev/dsp1/dev/dsp2/dev/parport0/dev/parport1/dev/ttyS0/dev/ttyS1/dev/ttyS2/dev/ttyS311.51001000 Hz11015016017018222002000 Hz2324030032 (short)3504254545.455 (BAUDOT)50500 Hz5664 (long)7 (ASCII)758 (ASCII)8-bit sound I/O85850gMFSKA comma separated list of parameter=value hamlib config parameters.AFCAGC attackAGC decayAbortAbort transmission immediately (Ctl+X)AllAllow 8 bit characters (escape-127 method)Amp spanAppearanceAutomatic frequency controlBPSK31, QPSK31 and PSK63 modem parameters. New parametes take effect after restarting the modem.BandBandsBandwidthBaudrateBitsBoxcarCWCW IdentificationCW modem parameters. New parametes take effect after restarting the modem.CallCallsignCan't attach to the CWirc API shared memory block! Cannot open PTT device '%s': %mCategoriesClear QSO data fields (Ctl-N)Clear _RX windowClear _TX windowClick right button to edit macroColorsConfigConfiguration complete!Couldn't allocate colorCouldn't find pixmap file: %sCreate files and directoriesDTRDate & TimeDate format stringDevice '%s' is neither a parallel nor a serial portDevice '%s' is not a serial portDevicesDoubleE-mailEnable CWirc slave modeEnable hamlib supportEnable test mode (write audio data to stdin/stdout)Error converting file to UTF8: %sError converting filename (%s=%s): %sError creating directory: %s exists but is not a directoryError creating directory: %s: %mError creating file: %s exists but is not a regular fileError creating file: %s: %mError reading file: %sError saving picture: %s: %sError writing to log file: %mError: %s is not writable: %mFELDHELLFELDHELL modem parameters.FFTW wisdom not found. This is normal if you are running gMFSK for the first time.FeaturesFilesFiles & DirsFiles and directoriesFiles and directories used by gMFSK.Fill in your station information. This data is used in the fixtext macros.Filter BWFontsForce upper caseFull duplex I/O (unsupported!)GConf client init failed!!! GeneralHELLHIghlighted text colorHalfHamlibHamlib init: Bad param=value pair: '%s'Hamlib init: Bad rig config parameter: '%s'Hamlib init: pthread_create: %mHamlib init: rig_get_freq failed: %sHamlib init: rig_get_mode failed: %s. Assuming USB mode.Hamlib init: rig_init failed (model=%d)Hamlib init: rig_open failed: %sHamlib init: rig_set_conf failed (%s=%s): %sHamlib init: rig_set_ptt failed: %s. Hamlib PTT disabledHamlib support enables the rig control features in gMFSK.Hamlib2HammingHellschreiber fontHere you can select the rig control features to use.HzIf most significant bit should the transmitted firstIf tones should be reversed for RTTYInitial setup is now complete. InterleaveInvalid testmode '%s' Invalid window function: %d LocatorLog entryLog file nameLogoMFSKMFSK16MFSK16 and MFSK8 modem parameters. New parametes take effect after restarting the modem.MFSK8MHzMODEMT63MT63 modem parameters. New parametes take effect after restarting the modem.Macro nameMenu item "%s" not found! ModeModem initialization failed!Modem settingsModemsNameNew entryNormalNotesPSK31PSK31 (BPSK)PSK31 (QPSK)PSK63PTTPTT configurationPTT devicePTT line (serial)ParityPausePortPreferencesPush-To-Talk settings. New setting take effect next time PTT is toggled.QTHREVRTSRTTYRTTY modem parameters. New parametes take effect after restarting the modem.RX pictures directoryRX rate offset (ppm)RX window background colorRadio modelRcvd RSTReading from sound card failed: %sReceiveReceived RSTReceived text colorReceived text fontRef levelRequested sample rateResolution:Restart modemReverse polarityRun first-time configuration druidSHMIDSQLSampling rate is %u, requested %u ScopeSee the strftime manual page for explanation of this fieldSelect FileSelect File to TransmitSelect Picture to TransmitSend MSB firstSend QSO data to xlog (Ctl-L)Send tune signal (Ctl+U)Sent RSTSerial port name or hostname for RPC rigSet QSO data frequencySettingsSettings for the waterfall/scope display.ShiftSome sound cards don't support the default setting (16 bit mono sampling). You should hear a short sound sample when you click the test button below.SoundSound card configurationSound card deviceSound card open for read failed: %sSound card open for write failed: %sSound card settings take effect after restarting the modem.SpectrumSpeedSpeed (WPM)SquelchStationStation infoStation informationStereo sound I/OStopbitsSuspend the modem and release soundcard (Ctl+Z)Switch to receive (Ctl+R)Switch to transmit (Ctl+T)THROBTHROB (1 tps)THROB (2 tps)THROB (4 tps)THROB modem parameters. New parametes take effect after restarting the modem.TX offset frequencyTX pictures directoryTX rate offset (ppm)TX window background colorTest PTTTest sound cardThe color settings let you configure the colors used in the RX and TX windows.The fonts settings let you configure the fonts used in the RX and TX windows.The station information is used in the macros like $mycall, $myname, etc. These are used in the $date and $date macros. See the strftime manual page for an explanation of the format.These files and directories are used by gMFSK. Click the button to actually create the files and directories.These settings affect all modems.This is a comma separated list of bands you want to appear in the Bands popdown list.This is the first time you run this version of gMFSK. On the following pages you will be guided through the initial setup of gMFSK. All settings can also be done later in the main program Settings->Preferences dialog. This druid can be run again by starting gMFSK with the "--run-druid" flag.TimeTime format stringTransmitTransmitted text colorTransmitted text fontTriangularTuneUnable to open log fileUnknown waterfall mode: %d Unsupported magnification: %d Use hamlib PTTUse inverted PTT logicUse real frequencies in waterfallWFWaterfallWaterfall properties...Waterfall scrolls upwardsWelcome to gMFSKWindowWorking in CWirc slave mode. Zoom_Configure macros_Contents_File_Help_Log to file_Mode_Send file..._Settingsapply_macroconfig: invalid macro number %d bothclockconfdialog_select_node: ConfDialog init failed confdialog_select_node: tree path '%s' not found (%s) evenfill_macroconfig: invalid macro number %d gMFSKgMFSK -- testmode (both)gMFSK -- testmode (rx)gMFSK -- testmode (tx)gMFSK can control PTT via the serial port control lines or the parallel port.gMFSK configuration druidgMFSK picturehellmodesinsert_rx_text: conversion failed: %skHzlocalhostlog message too long, entry dropped: %s macro 1macro 10macro 11macro 12macro 2macro 3macro 4macro 5macro 6macro 7macro 8macro 9miniscope: invalid mode %d noneoddoneopensnd: Cannot set %s audioopensnd: Requested sample format not supportedopensnd: device not setopensnd: ioctl: SNDCTL_DSP_NONBLOCK: %mopensnd: ioctl: SNDCTL_DSP_SETFMT: %mopensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %mopensnd: ioctl: SNDCTL_DSP_SPEED: %mopensnd: ioctl: SNDCTL_DSP_STEREO: %mopensnd: open: %s: %mpicture write: x >= width (%d >= %d)picture write: y >= height (%d >= %d)pthread_create: %mread_samples: count <= 0 (%d)read_samples: count > SND_BUF_LEN (%d)rig_get_freq failed: %srig_get_mode failed: %srig_set_ptt failed: %s. Hamlib PTT disabled. run_command: %ssend_macro: invalid macro number %d send_picture: %ssend_picture: couldn't load picture icon!send_picture: pixbuf conversion failed!set_ptt: ioctl: %msound_close: ioctl: SNDCTL_DSP_SYNC: %msound_open_for_read: %ssound_open_for_read: src_new failed: %ssound_open_for_write: %ssound_open_for_write: src_new failed: %ssound_read: fd < 0sound_read: read: %msound_read: src_process: %ssound_write: fd < 0sound_write: src_process: %stextmodestranslator_creditstrx_get_tx_char: conversion failed: %sunable to allocate color: ( %d %d %d )write_samples: count <= 0 (%d)write_samples: count > SND_BUF_LEN (%d)write_samples: write: %mx 1x 2x 4zeroProject-Id-Version: gmfsk 0.6.1 POT-Creation-Date: 2005-02-20 23:14+0200 PO-Revision-Date: 2004-12-29 20:41+0200 Last-Translator: Tomi Manninen Language-Team: Finnish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tiedostoon tallennus aloitettu %s UTC --- --- Tiedostoon tallennus lopetettu %s UTC --- %s/dev/dsp/dev/dsp0/dev/dsp1/dev/dsp2/dev/parport0/dev/parport1/dev/ttyS0/dev/ttyS1/dev/ttyS2/dev/ttyS311.51001000 Hz11015016017018222002000 Hz2324030032 (lyhyt)3504254545,455 (BAUDOT)50500 Hz5664 (pitkä)7 (ASCII)758 (ASCII)8-bittinen ääni85850gMFSKPilkuilla erotettu parametri=arvo asetusparametrien lista.AFCAGC hyökkäysAGC sammuminenKeskeytäKeskeytä lähetys välittömästi (Ctl+X)KaikkiSalli 8-bittiset merkit (escape-127 metodi)Amp väliUlkoasuAutomaattinen taajuuden korjausBPSK31-, QPSK31- ja PSK63-modeemin parametrit. Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen.BandiBanditKaistanleveysBaudinopeusBittien lukumääräLaatikkoCWCW identifikaatioCW-modeemin parametrit. Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen.KutsuKutsuKytkeytyminen CWirc API:n jaettuun muistilohkoon epäonnistui! PTT-laitteen '%s' avaus epäonnistui: %mLuokatTyhjennä QSO-tiedot (Ctl-N)Tyhjennä _RX ikkunaTyhjennä _TX ikkunaKlikkaa oikeata hiiren näppäintä editoidaksesi makroaVäritAsetuksetAsetukset valmiit!Väriä ei voitu varataPixmap-tiedostoa ei löytynyt: %sLuo tiedostot ja hakemistotDTRAika ja päiväysPäivämäärän ulkoasumerkkijonoLaite '%s' ei ole sarja- eikä rinnakkaisporttiLaite '%s' ei ole sarjaporttiLaitteetTuplaSähköpostiAktivoi CWirc-tilaAktivoi gMFSK:n hamlib-tukiAktivoi testitila (audiodata stdin/stdout kanavista)Virhe tiedoston UTF8-muunnoksessa: %sVirhe tiedoston nimen muunnoksessa (%s=%s): %sVirhe hakemiston luomisessa: %s on olemassa mutta ei ole hakemistoVirhe hakemiston luomisessa: %s: %mVirhe tiedoston luomisessa: %s on olemassa mutta ei ole tavallinen tiedostoVirhe tiedoston luomisessa: %s: %mVirhe tiedoston luvussa: %sVirhe kuvatiedostoa tallennettaessa: %s: %sVirhe kirjoitettaessa tiedostoon: %mVirhe: tiedostoon %s ei voida kirjoittaa: %mFELDHELLFELDHELL-modeemin parametrit.FFTW vihjeitä ei löydy. Tämä on normaalia jos käytät ohjelmaa ensimmäistä kertaa.OminaisuudetTiedostotTiedostot ja hakemistotTiedostot ja hakemistotTiedostot ja hakemistot joita gMFSK käyttääTäytä asemasi tiedot. Näitä tietoja käytetään makroissa.Suodattimen kaistanleveysKirjasimetPakota suuraakkosetTäysduplexääni (ei tuettu!)GConf asiakkaan alustus epäonnistui!!! YleisetHELLKorostetun tekstin väriPuolikasHamlibHamlib init: Virheellinen parametri=arvo -pari: '%s'Hamlib init: Virheellinen rigin asetus: '%s'Hamlib init: pthread_create: %mHamlib init: rig_get_freq epäonnistui: %sHamlib init: rig_get_mode epäonnistui: %s. Oletus on USB.Hamlib init: rig_init epäonnistui (malli=%d)Hamlib init: rig_open epäonnistui: %sHamlib init: rig_set_conf epäonnistui (%s=%s): %sHamlib init: rig_set_ptt epäonnistui: %s. Hamlib PTT deaktivoituHamlib-tuki aktivoi gMFSK:n radionohjausominaisuudet.Hamlib2HammingHellscreiber-kirjasinTässä voit valita haluamasi radionohjaustoiminteet.HzLähetetäänkö eniten merkitsevä bitti ensiksiKäännettäänkö äänet RTTY:lläEnsiasennus on nyt valmis. VälistysEpäkelpo testitila '%s' Epäkelpo ikkunafunktio: %d LokaattoriVie lokiinLokitiestoston nimiLogoMFSKMFSK16MFSK16- ja MFSK8-modeemin parametrit. Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen.MFSK8MHzMODEMT63MT63-modeemin parametrit. Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen.Makron nimiValikon kohtaa "%s" ei löytynyt! ToimintoModeemin alustus epäonnistui!Modeemin asetuksetModeemitNimiUusi yhteysNormaaliLisätietojaPSK31PSK31 (BPSK)PSK31 (QPSK)PSK63PTTPTT-asetuksetPTT-laitePTT-linja (sarjaportti)PariteettiTaukoPorttiValinnatPTT-asetukset. Uudet asetukset asettuvat voimaan seuraavan kerran kun PTT:tä vaihdetaan.QTHREVRTSRTTYRTTY-modeemin parametrit. Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen.Vastaanotettujen kuvien hakemistoVastaanoton näytteistyksen virhe (ppm)Rx-ikkunan taustaväriRadion malliVastaanotettu RSTÄänikortilta luku epäonnistui: %sVastaanotaVastaanotettu RSTVastaanotetun tekstin väriVastaanotetun tekstin kirjasinRef tasoPyydetty näytteistystaajuusTarkkuus:Käynnistä modeemi uudelleenKäänteinen polariteettiKäynnistä ensiasennusvelhoSHMIDSQLNäytteistystaajuus on %u, pyydetty taajuus %u SkooppiTämä kenttä on selitetty trftime-funktion manuaalisivullaValitse tiedostoValitse lähetettävä tiedostoValitse lähetettävä kuvaLähetä MSB ensinLähetä QSO-tiedot lokiin (Ctl-L)Lähetä virityssignaalia (Ctl+U)Lähetetty RSTSarjaportin nimi tai RPG rigin koneennimiAseta taajuus QSO-tietoihinAsetuksetVesiputous/skooppi-näytön asetukset.TaajuuserotusJotkut äänikortit eivät tue oletusasetuksia (16-bittinen mono-näytteistys). Sinun pitäisi kuulla lyhyt ääninäyte kun klikkaat alla olevaa testinäppäintä.ÄäniÄänikortin asetuksetÄänikorttilaiteÄänikortin avaaminen kirjoitusta varten epäonnistui: %sÄänikortille kirjoitus epäonnistui: %sÄänikorttiasetukset tulevat voimaan kun modeemi käynnistetään uudelleenSpektriNopeusNopeus (WPM)KohinasalpaAsemaAseman tiedotAseman tiedotStereoääniLopetusbittien lukumääräPysäytä modeemi ja vapauta äänikortti (Ctl+Z)Vaihda vastaanotolle (Ctl+R)Vaihda lähetykselle (Ctl+T)THROBTHROB (1 tps)THROB (2 tps)THROB (4 tps)THROB-modeemin parametrit. Uudet parametrit asettuvat voimaan modeemin uudelleenkäynnistyksen jälkeen.Lähetyksen erotustaajuusLähetettävien kuvien hakemistoLähetyksen näytteistyksen virhe (ppm)TX-ikkunan taustaväriKokeile PTT:täKokeile äänikorttiaVäriasetukset vaikuttavat RX- ja TX-ikkunoiden väreihinKirjasinasetukset vaikuttavat RX- ja TX-ikkunoiden kirjasimiin.Asematietoja käytetään makroissa kuten $mycall, $myname, jne. Näitä käytetään $date ja $time makroissa. Ulkoasu on selitetty strftime-funktion manuaalisivuilla.gMFSK käyttää näitä tiedostoja ja hakemistoja. Klikkaa näppäintä jotta tiedostot ja hakemistot luodaan.Nämä asetukset vaikuttavat kaikkiin modeemeihin.Tämä on piluilla erotettu lista bandeista jotka haluat näkyviin Bandit-alasvetovalikossaTämä on ensimmäinen kerta kun käynnistät tämän version gMFSK:sta. Seuraavilla sivuilla sinut ohjastetaan gMFSK:n ensiasennuksen läpi. Kaikkia asetuksia voidaan muuttaa myös myöhemmin Asetukset->Asetukset -valikon kautta. Voit käynnistää tämän velhon uudestaan käynnistämällä gMFSK:n "--run-druid" optiolla.AikaAjan ulkoasumerkkijonoLähetäLähetetyn tekstin väriLähetetyn tekstin kirjasinKolmioViritäTallennustiedoston avaus epäonnistuiTuntematon vesiputouksen toimintatila: %d Suurennosta ei tueta: %d Käytä hamlib-PTT:täKäänteinen PTT-logiikkaKäytä todellisia taajuuksia vesiputousnäytössäWFVesiputousVesiputousnäytön ominaisuudet...Vesiputous vierii ylöspäinTervetuloa gMFSK:honIkkunafunktioCWirc-tila aktivoitu. Suurennos_Aseta makrot_Sisältö_Tiedosto_Ohje_Tallenna tiedostoon_Lähetelaji_Lähetä tiedosto_Asetuksetapply_macroconfig: virheellinen makron numero %d Molemmatkelloconfdialog_select_node: ConfDialog:in alustus epäonnistui confdialog_select_node: puupolkua '%s' ei löytynyt (%s) parillinenfill_macroconfig: virheellinen makron numero %d gMFSKgMFSK -- testitila (molemmat)gMFSK -- testitila (vastaanotto)gMFSK -- testitila (lähetys)gMFSK voi kontrolloida PTT:tä joko sarja- tai rinnakkaisportin kautta.gMFSK asetusvelhogMFSK-kuvahell-lähetteetinsert_rx_text: muunnos epäonnistui: %skHzlocalhostlokiviesti on liian pitkä, merkintä poistettu: %s makro 1makro 10makro 11makro 12makro 2makro 3makro 4makro 5makro 6makro 7makro 8makro 9miniscope: virheellinen toimintamuoto %d tyhjäparitonyksiopensnd: %s-ääni ei ole mahdollinenopensnd: Pyydetty näytteistysmuoto ei ole tuettuopensnd: laitetta ei ole asetettuopensnd: ioctl: SNDCTL_DSP_NONBLOCK: %mopensnd: ioctl: SNDCTL_DSP_SETFMT: %mopensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %mopensnd: ioctl: SNDCTL_DSP_SPEED: %mopensnd: ioctl: SNDCTL_DSP_STEREO: %mopensnd: open: %s: %mpicture write: x >= width (%d >= %d)picture write: y >= height (%d >= %d)pthread_create: %mread_samples: count <= 0 (%d)read_samples: count > SND_BUF_LEN (%d)rig_get_freq epäonnistui: %srig_get_mode epäonnistui: %srig_set_ptt epäonnistui: %s. Hamlib PTT deaktivoitu. run_command: %ssend_macro: virheellinen makron numero %d send_picture: %ssend_picture: kuvaikonin lataus epäonnistui!send_picture: pixbuf-muunnos epäonnistui!set_ptt: ioctl: %msound_close: ioctl: SNDCTL_DSP_SYNC: %msound_open_for_read: %ssound_open_for_read: src_new epäonnistui: %ssound_open_for_write: %ssound_open_for_write: src_new epäonnistui: %ssound_read: fd < 0sound_read: read: %msound_read: src_process: %ssound_write: fd < 0sound_write: src_process: %stekstiläheteetTomi Manninen, OH2BNStrx_get_tx_char: muunnos epäonnistui: %sväriä ei voitu varata: ( %d %d %d )write_samples: count <= 0 (%d)write_samples: count > SND_BUF_LEN (%d)write_samples: write: %mx 1x 2x 4nollagmfsk-0.7pre1/po/sk.gmo0000644000076400007640000004053410206176700010514 Ta  $ . 8 F T _ j u     $'B+Cn  &*'0`L & 7X_f~3 @Idj$J&+BG9N44$= ]h  X M kv{      IgkosLx  (< OY o {":   , G V t  (   )  !!!!!;!""!")"1"E"V"/_"""" " " "N"C#W#m####N#M$JS$l$m %!y%U%&%''0'9'P' f'q'v''!'' ''''((( ,(6(<( B(O( U( c(m(r(x(}((((M() 2) @)J) N)X)`)i)r){))))))))))) ))))))?)6+ ?+ I+ S+ ]+ k+ y+ + + ++++++++++++++++ +++++ , ,,, , %,/, 2,<,S,V,BZ,R,, , , -'-<--D-r-{-f--. ..!.'...@.H.P.p..,.. ..&./5/9/ R/`/g//A///0 0%0ME0 00$000 010 1:1B1J1Cg1121)1& 2 22>2]2 f2r2222^2233 3T3 c3p3u333 3 33 3 3333334 44 4L"4o4s4w4{4T4!445 &5 35@5 H5 V5 d5 n5 555*555 5?6 G6T6o66)6"6 67637 R7#]77778<8V8Cp88 88888 95 9B9_99 9 9 9V9:!:<:[:k:z:H:T:J2;k};u;-_<P<8<>> 3>>>M> \>g>o> >.>>>>> ?%? *?7?I?P? X?c?~?? ?????!?"?%@>*@i@@ @@ @@@@@@@@@@@@AAA!A*A9AKAOASAWAqez.BS}" 7VtHk?:lCjAJ]vN{U(aDF2c8IP1oR_$Q%XpfKLGdZn-g@T!E*#Y <6b'3w&`0x)9hi u,[MO4^y+m\s5/|;=r>~W /dev/dsp/dev/dsp0/dev/dsp1/dev/dsp2/dev/parport0/dev/parport1/dev/ttyS0/dev/ttyS1/dev/ttyS2/dev/ttyS311.51001000 Hz11015016017018222002000 Hz2324030032 (short)3504254545.455 (BAUDOT)50500 Hz5664 (long)7 (ASCII)758 (ASCII)8-bit sound I/O85850gMFSKA comma separated list of parameter=value hamlib config parameters.AFCAGC attackAGC decayAbortAbort transmission immediately (Ctl+X)AllAllow 8 bit characters (escape-127 method)Amp spanAutomatic frequency controlBPSK31, QPSK31 and PSK63 modem parameters. New parametes take effect after restarting the modem.BandBandsBandwidthBaudrateBitsBoxcarCW IdentificationCallCallsignClear QSO data fields (Ctl-N)Clear _RX windowClear _TX windowClick right button to edit macroColorsConfigConfiguration complete!Couldn't find pixmap file: %sCreate files and directoriesDTRDate format stringDoubleE-mailEnable CWirc slave modeEnable hamlib supportEnable test mode (write audio data to stdin/stdout)FELDHELLFELDHELL modem parameters.FilesFiles and directoriesFiles and directories used by gMFSK.Fill in your station information. This data is used in the fixtext macros.FontsForce upper caseFull duplex I/O (unsupported!)HELLHIghlighted text colorHalfHamlibHamlib support enables the rig control features in gMFSK.Hamlib2HammingHellschreiber fontHere you can select the rig control features to use.HzIf most significant bit should the transmitted firstIf tones should be reversed for RTTYInitial setup is now complete. InterleaveInvalid testmode '%s' LocatorLog entryLog file nameLogoMFSKMFSK16MFSK16 and MFSK8 modem parameters. New parametes take effect after restarting the modem.MFSK8MHzMODEMT63MT63 modem parameters. New parametes take effect after restarting the modem.Macro nameModeModem settingsNameNew entryNormalNotesPSK31PSK31 (BPSK)PSK31 (QPSK)PSK63PTTPTT configurationPTT devicePTT line (serial)ParityPausePortPreferencesPush-To-Talk settings. New setting take effect next time PTT is toggled.QTHREVRTSRTTYRTTY modem parameters. New parametes take effect after restarting the modem.RX pictures directoryRX rate offset (ppm)RX window background colorRadio modelRcvd RSTReceiveReceived text colorReceived text fontRef levelRequested sample rateResolution:Restart modemReverse polarityRun first-time configuration druidSHMIDSQLScopeSee the strftime manual page for explanation of this fieldSelect FileSelect File to TransmitSelect Picture to TransmitSend MSB firstSend QSO data to xlog (Ctl-L)Send tune signal (Ctl+U)Sent RSTSerial port name or hostname for RPC rigSet QSO data frequencySettingsSettings for the waterfall/scope display.ShiftSome sound cards don't support the default setting (16 bit mono sampling). You should hear a short sound sample when you click the test button below.SoundSound card configurationSound card deviceSound card settings take effect after restarting the modem.SpectrumSpeedSquelchStationStation informationStereo sound I/OStopbitsSuspend the modem and release soundcard (Ctl+Z)Switch to receive (Ctl+R)Switch to transmit (Ctl+T)THROBTHROB (1 tps)THROB (2 tps)THROB (4 tps)THROB modem parameters. New parametes take effect after restarting the modem.TX offset frequencyTX pictures directoryTX rate offset (ppm)TX window background colorTest PTTTest sound cardThe color settings let you configure the colors used in the RX and TX windows.The fonts settings let you configure the fonts used in the RX and TX windows.The station information is used in the macros like $mycall, $myname, etc. These are used in the $date and $date macros. See the strftime manual page for an explanation of the format.These files and directories are used by gMFSK. Click the button to actually create the files and directories.These settings affect all modems.This is a comma separated list of bands you want to appear in the Bands popdown list.This is the first time you run this version of gMFSK. On the following pages you will be guided through the initial setup of gMFSK. All settings can also be done later in the main program Settings->Preferences dialog. This druid can be run again by starting gMFSK with the "--run-druid" flag.TimeTime format stringTransmitTransmitted text colorTransmitted text fontTriangularTuneUse hamlib PTTUse inverted PTT logicUse real frequencies in waterfallWFWaterfallWaterfall properties...Waterfall scrolls upwardsWelcome to gMFSKWindowZoom_Configure macros_Contents_File_Help_Log to file_Mode_Send file..._SettingsbothclockevengMFSKgMFSK -- testmode (both)gMFSK -- testmode (rx)gMFSK -- testmode (tx)gMFSK can control PTT via the serial port control lines or the parallel port.gMFSK configuration druidgMFSK picturehellmodeskHzlocalhostmacro 1macro 10macro 11macro 12macro 2macro 3macro 4macro 5macro 6macro 7macro 8macro 9noneoddonetextmodestranslator_creditsx 1x 2x 4zeroProject-Id-Version: gmfsk POT-Creation-Date: 2005-02-20 23:14+0200 PO-Revision-Date: 2004-09-02 00:34+0200 Last-Translator: Michal Karas Language-Team: slovak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: KBabel 1.3.1 /dev/dsp/dev/dsp0/dev/dsp1/dev/dsp2/dev/parport0/dev/parport1/dev/ttyS0/dev/ttyS1/dev/ttyS2/dev/ttyS311.51001000 Hz11015016017018222002000 Hz2324030032 (krátke)3504254545.455 (BAUDOT)50500 Hz5664 (dlhé)7 (ASCII)758 (ASCII)8-bitový zvukový V/V85850gMFSKČiarkou oddelený zoznam "parameter=hodnota" parametrov pre konfiguráciu hamlib.AFCAGC attackAGC decayPrerušiťOkamžite prerušiť vysielanie (Ctl+X)VšetkyPovoliť 8 bitové znaky (escape-127 metóda)Amp spanAutomatické dolaďovanieParametre modemu pre BPSK31, QPSK31 a PSK63. Nové parametre sa prejavia až po reštartovaní modemu.PásmoPásmaŠirka pásmaBaudrejtBitovBoxcarCW identifikáciaZnačkaZnačkaVyčistiť údaje o QSO (Ctl+N)Vyčistiť _RX oknoVyčistiť _TX oknoKlikni pravým tlačítkom pre úpravu makraFarbyKonfiguráciaNastavenie kompletné!Nemožno nájsť pixmapový súbor: %sVytvoriť súbory a adresáreDTRFormát reťazca dátumuDvojnásobnáE-mailPovoliť CWirc slave módPovoliť hamlib podporuPovoliť testovací mód (vypisovať audio dáta na stdin/stdout)FELDHELLParametre modemu pre FELDHELL.SúborySúbory a adresáreSúbory a adresáre použité v gMFSKVyplň informácie o tvojej stanici. Tieto údaje budú použité v makrách.Typy písmaVnútiť veľké písmenáPlno duplexný V/V (nepodporované!)HELLZvýraznený textPolovičnáHamlibPodpora hamlib umožňuje ovládať rig v gMFSK.Hamlib2HammingTyp písma pre HellschreiberTu môžeš zvoliť možnosti ovládania rigu, ktoré sa využijú.HzAk majú byť najskôr odoslané dôležité bity Ak majú byť tóny reverzované pre RTTYPrvotné nastavenie bolo dokončené. PrekladanieNeznámy testovací mód '%s' LokátorZaznamenaťNázov súboru denníkaLogoMFSKMFSK16Parametre modemu pre MFSK16 a MFSK8. Nové parametre sa prejavia až po reštartovaní modemu.MFSK8MHzMÓDMT63Parametre modemu pre MT63. Nové parametre sa prejavia až po reštartovaní modemu.Názov makraMódNastavenia modemuMenoNovéNormálnaPoznámkyPSK31PSK31 (BPSK)PSK31 (QPSK)PSK63PTTNastavenie PTTPTT zariadeniePTT vývod (sériový)ParitaPauzaPortPredvoľbyNastavenia PTT. Nové nastavenia sa prejavia až po ďalšom stlačení PTT.QTHREVRTSRTTYParametre modemu pre RTTY. Nové parametre sa prejavia až po reštartovaní modemu.Adresár pre prijímané obrázkyPosuv vzorkovania pre RX (ppm)Pozadie RX oknaModel rádiaPrijatý RSTPríjemPrijatý textPrijatý textRef levelŽiadaná vzorkovacia frekvenciaRozlíšenie:Reštartovať modemOpačná polarizáciaSpustiť druida pre prvotnú konfiguráciuSHMIDSQLOsciloskopPozri manuálovú stránku strftime pre informácie o položke.Vyber súborVyber súbor pre odoslanieVyber obrázok na odoslanieNajskôr odošli MSBOdoslať informácie o QSO xlogu (Ctl+L)Vysielať ladiací signál (Ctl+U)Odoslaný RSTNázov sériového portu alebo názov hostu pre RPC rigNastavovať frekvenciu pre QSONastaveniaNastavenia pre vodopád/osciloskop.ZdvihNiektoré zvukové karty nepodporujú štandardné nastavenia (16 bitové mono vzorkovanie). Po kliknutí na testovacie tlačítko by si mal počuť krátku zvukovú ukážku.ZvukNastavenia zvukovej kartyZariadenie zvukovej kartyNastavenia zvukovej karty sa prejavia až po reštartovaní modemu.SpektrumRýchlosťSquelchStanicaInformácie o staniciStereo zvukový V/VStopbitovSuspendovať modem a uvoľniť zvukovú kartu (Ctl+Z)Prepnúť na príjem (Ctl+R)Prepnúť na vysielanie (Ctl+T)THROBTHROB (1 tps)THROB (2 tps)THROB (4 tps)Parametre modemu pre THROB. Nové parametre sa prejavia až po reštartovaní modemu.Posuv TX frekvencieAdresár pre odosielané obrázkyPosuv vzorkovania pre TX (ppm)Pozadie TX oknaOtestovať PTTOtestovať zvukovú kartuNastavenia farieb ti umožnia zmeniť farby použité pre RX a TX okná.Nastavenie typov písma ti umožní zmeniť typy písma použité pre RX a TX okná.Informácie o stanici sú použité v makrách ako $mycall, $myname, atď.Toto je použité v $date a $time makrách. Pozri manuálovú stránku strftime pre informácie o formáte.Tieto súbory a adresáre sú použité v gMFSK. Klikni na tlačítko pre aktuálne vytvorenie súborov a adresárov.Tieto nastavenia ovplyvňujú všetky modemy.Toto je čiarkami oddelený zoznam pásiem, ktoré chceš mať v popdown zoznameTúto verziu gMFSK spúšťaš prvý krát. Na následujúcich stránkach budeš prevedený prvotným nastavením gMFSK. Všetky nastavenia môžu byť dokončené neskôr v dialógu hlavného programu Nastavenia->Predvoľby. Tento druid môžeš opätovne vyvolať, ak gMFSK spustíš s voľbou "--run-druid".ČasFormát reťazca časuVysielanieOdoslaný textOdoslaný textTriangularLadeniePoužívať hamlib PTTPoužiť invertovanú logiku PTTPoužívať skutočné frekvencie vo vodopádeVPVodopádVlastnosti vodopádu...Pohyb vodopádu smerom nahorVitaj v gMFSKOknoZväčšenieNastaviť _makrá_ObsahSúbo_r_PomocníkZaz_namenávať do súboru_MódOdo_slať súbor...Na_staveniaobidvahodinypárnagMFSKgMFSK -- testovací mód (obidva)gMFSK -- testovací mód (príjem)gMFSK -- testovací mód (vysielanie)gMFSK može ovládať PTT cez sériový alebo paralelný port.Druid pre nastavenie gMFSKobrázok gMFSKhell módykHzlocalhostmakro 1makro 10makro 11makro 12makro 2makro 3makro 4makro 5makro 6makro 7makro 8makro 9žiadnénepárnajednotkatextové módyMike Karas, OM4AAx 1x 2x 4nulagmfsk-0.7pre1/README0000644000076400007640000002233410072473551007640 gMFSK v0.6 - The Gnome MFSK terminal program ============================================ gMFSK is a multi-mode soundcard terminal program for HF amateur communications. Originally the program was written for compatibility with the IZ8BLY Stream program in MFSK16 mode. Currently the program supports the following amateur digital communications modes: MFSK16, MFSK8, RTTY, THROB, PSK31, MT63 and FELDHELL. MFSK ==== The MFSK modem supports two modes: MFSK16 - 16 tones, 15.625 symbols per second MFSK8 - 32 tones, 7.8125 symbols per second Both modes use convolutional encoding (R=1/2, K=7, NASA standard polynomials) and viterbi decoding. MFSK16 also supports sending small pictures in analog FM mode. This is compatible with MixW (http://www.mixw.net/). Receiving pictures is automatic. Sending is triggered with the macros $pic and $picc (see below). RTTY ==== RTTY support in gMFSK should be considered experimental. I have tried a few decoding algorithms and the one currently in use is not necessarily the best one. All the parameters (shift, baudrate, number of bits, parity, number of stopbits) are almost freely configurable. There is also a separate "reverse" setting for RTTY which you probably want to enable if you want to use USB to work RTTY. The "MSB first" option is needed for the ASCII modes. Or at least when I tested the modem against MMTTY (http://www.qsl.net/mmhamsoft/mmtty/) it was. THROB ===== Throb support is also to be considered experimental. There is a working automatic sync method now but it may not be as good as it should be (feedback welcome). For more information about THROB please check Lionel's web page (http://www.lsear.freeserve.co.uk/page3.html). PSK31 ===== PSK31 support in gMFSK borrows heavily from the C++ modem classes written by Hansi Reiser DL9RDZ (which in turn is partly derived from the work of Andrew Senior G0TJZ and Peter Martinez G3PLX). While I have not used any code directly, much of the architecture and algorithms are almost directly copied from there. As a result I think the PSK31 support is pretty mature. MT63 ==== The MT63 modem uses source code written by Pawel Jalocha SP9VRC. I have only written a few lines of glue code to integrate Pawel's code to my framework. The modem should be pretty mature. I haven't done much testing but it does decode real life signals. There is no support for the IZ8BLY style secondary channel. 8 bit characters are supported using the escape 127 encoding. FELDHELL ======== Both Feldhell RX and TX work now, but the mode still needs some work. The AGC parameter adjustments don't work yet. Also TX uses antialiased fonts which is probably not the optimal solution. Operating ========= Operating gMFSK should be easy to learn even without much help if you have any experience in operating with other modern soundcard digital modes. The MFSK web site (http://www.qsl.net/zl1bpu/MFSK/) is suggested reading for background information. Also the help in IZ8BLY Stream program could prove useful. Note however that tuning in gMFSK works a little different to that in Stream. Setting audio levels is very important. The scope display should prove a nice tool for setting the incoming audio level. However be aware that the amplifier stages before the sound card mixer can also be overdriven without showing signs on the scope display. On transmit you should be just as careful. Overdriving MFSK or RTTY doesn't produce intermodulation products as there is only one tone transmitted at a time but harmonic products (of the audio) are always present when overdriving. THROB, PSK and MT63 on the other hand do produce intermodulation products if overdriven. FELDHELL produces key clicks is overdriven. The GUI ======= The graphical user interface should for the most part be self explanatory. From top to bottom there are the Menubar, Toolbar, QSO data area, Received text, Transmitted text, Preconfigured messages buttons and the Waterfall indicator area. In addition to the obvious there are a few additional tricks: As with any Gnome application the Menubar and Toolbar areas are dockable, ie. you can drag them around the desktop or the application window. The received text and the QSO data area are of course subject to the normal X Window Selection system: dragging with the left button selects text and the middle button pastes the selected text. However the received text area also implements an additional trick with the right button. Clicking the right button over a word selects the word and opens a context menu where you can select where you want the selected data to be pasted. The waterfall can be paused from the popup menu that opens if you right click over it. The waterfall config dialog can also be activated from the popup menu. The status bar shows modem state, transmission mode and UTC time. Clicking the mode label is a shortcut to the mode config dialog. The "Log entry" button sends the QSO data to logging program using inter process communication (IPC). Currently only xlog (http://savannah.gnu.org/projects/Xlog) supports this feature. The "New entry" button clears all the QSO data fields and resets the QSO time (the first change after a reset on any of the QSO data fields sets the time). The most used functions now have keyboard accelerators. Fixtext buttons show the associated function keys in their labels and the other buttons tell you the accelerator in their tooltips ie. when you hover the mouse pointer above the button (be sure to enable tooltips in gnome config). All in all, I recommend experimenting with the GUI before having real contacts. Macros ====== The predefined text buttons can contain macros. Macros start with the letter $. A standard macro is of the form $text. A list of available standard macros is here: $$ - The letter '$' $tx - Push the TX button. $rx - Push the RX button. $pause - Push the Pause button. $abort - Push the Abort button (this is probably of no use to anyone). $mycall - Callsign as defined in preferences. $myname - Name as defined in preferences. $myqth - QTH as defined in preferences. $myloc - Locator as defined in preferences. $myemail - Email address as defined in preferences. $time - Local time. $utctime - Universal Coordinated Time. $date - Local date. $utcdate - UTC date. $call - Other partys callsign taken from QSO data. $band - Band taken from QSO data. $rxrst - Received RST taken from QSO data. $txrst - Transmitted RST taken from QSO data. $name - Other partys name taken from QSO data. $qth - Other partys QTH taken from QSO data. $notes - Notes taken from QSO data. $soft - Software version. $mode - Currently active mode name. $pic - Grayscale picture $picc - Color picture The macro name can also be enclosed in curly braces. This can be useful if you need to avoid any spaces between the macro and some text. The macro can also have an optional argument separated by a colon. This only works in conjunction with curly braces. Currently this argument is only useful with the picture macros where you can supply a filename that way. A typical picture macro might be: ${picc:/home/joe/joe.jpg} In addition to standard macros you can use so called command substitution with a macro of the form $(command). The command is executed using fork()/exec() and the standard output of the command is captured (standard error is discarded). If the last character of the captured output is a newline, it is removed. The macros are evaluated at the time the button is pressed (as opposed to being evaluated during the transmission) which is a significant fact especially with the "push ... button" and date/time macros. An unrecognized $-macro is ignored. Disclaimer ========== This program is something I wrote for my own amusement. I'm not a professional DSP engineer (though I may want to be one in the future) and I'm certainly not a GUI programmer nor do I ever want to be one. Suggestions especially for the GUI part are more than welcome! Hopefully the program is of use to you! Thanks ====== Thanks to Murray ZL1BPU and Nino IZ8BLY for creating a very cool ham communication modes, MFSK16 and MFSK8. Special thanks to Murray for the technical documentation of MFSK16/8 and Hellschreiber. Thanks also to Jess EB1DIX for his RTTY decoder program for Linux. I used that software as the base for my experiments and a lot of ideas was borrowed from it. Likewise thanks to Lionel G3PPT for making Throb source code publically available. Again lot was learned just by browsing through it. Thanks to Hansi DL9RDZ for his PSK31 C++ classes and the work of Andrew G0TJZ and Peter G3PLX on which the classes are based on. Special thanks to Pawel SP9VRC for his work on MT63 and the source code for it. Due to a stupid oversight from my part I released gMFSK v0.5 with Pawel's MT63 code under GPL even though Pawel's original license was not GPL-compatible. Fortunately Pawel has since agreed to release his code under the GPL. Thanks Pawel! Also many thanks to Phil KA9Q and Charles G4GUO for giving ideas and/or code for the project. Neither probably knew about this project but that's simply what free software is, everyone benefits from it! Last but not least many thanks to Joni OH2NJR/OH2MUI for providing me with feedback and equipment to be able to develop and test the stuff..... -- Tomi Manninen, OH2BNS gmfsk-0.7pre1/AUTHORS0000644000076400007640000000016507746551616010043 Author: Tomi Manninen, OH2BNS MT63 modem: Pawel Jalocha, SP9VRC Documentation: Carl Makin, VK1KCM gmfsk-0.7pre1/COPYING0000644000076400007640000004311007606111630010002 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. gmfsk-0.7pre1/ChangeLog0000644000076400007640000003570210206176134010531 2005-01-20 Tomi Manninen * Released version 0.7pre1. 2005-01-20 Tomi Manninen * Added a "center on this signal" button to the gui. The idea is to change the rig frequency (with hamlib) so that the currently decoded signal is in the center of the receiver pass band. Thanks Leigh WA5ZNU. 2005-01-20 Tomi Manninen * Changes to the way Olivia handles sent characters (make it more "real time"). Thanks Paul K9PS. 2005-01-16 Tomi Manninen * Fixed a typo in confdialog.c. Adding Olivia made hamlib config unreachable. * Generalized some of the hamlib init code. 2005-01-15 Tomi Manninen * Intergrated Pawel's new Olivia modem. Works but is pretty much untested... 2005-01-04 Tomi Manninen * Started using glib malloc functions in all files and removed AC_FUNC_*ALLOC* checks from configure.in. This should fix the rpl_malloc bug some people are seeing. 2005-01-03 Tomi Manninen * Internationalization stuff. All strings should now be marked for i18n. * Wrote a quick Finnish translation. * Slovakian translation from Mike OM4AA. * Fixed mt63/dsp.h so that it compiles with gcc 3.4. Thanks Carl Makin VK1KCM. 2004-11-14 Tomi Manninen * Fix autoconf stuff so that gmfsk compiles on arm architecture too. Thanks Hamish VK3SB. 2004-09-12 Tomi Manninen * File send didn't quite work. Added a conversion to UTF8 before writing to the tx window. 2004-09-12 Tomi Manninen * Some changes to the config dialog: Expand the children when a row is selected. Also mode and waterfall shortcuts automatically expand the correct treeview item. 2004-08-04 Tomi Manninen * Added Feldhell fonts, made FeldNarr the default feldhell TX font and changed the TX entry widget to use the TX font. 2004-07-30 Tomi Manninen * CWIrc now uses the core sample rate conversion. 2004-07-29 Tomi Manninen * Calculate the size of sound fragments from the real sample rate. 2004-07-24 Tomi Manninen * Fixed a bug where some modems refuse to transmit if sample rate conversion is in use. * Feldhell transmit didn't always empty the text entry. 2004-07-15 Tomi Manninen * Released version 0.6. 2004-07-06 Tomi Manninen * Updated MT63 to use the official 0.5 version code. 2004-07-06 Tomi Manninen * Updates to the help file. 2004-06-29 Tomi Manninen * An attempt at automatic sync for THROB. Not perfect but works for now. 2004-04-27 Tomi Manninen * Fixed a bug causing a freeze when going from tx to rx on some systems (compiler or lib dependent?). 2004-04-17 Tomi Manninen * Samplerate conversion gets now used automatically if the requested rate is not supported. 2004-04-16 Tomi Manninen * Added progress meter for MFSK picture send. * Statusbar messages are removed by a 10sec timeout. * Use a common output buffer for all modulators. This also fixes a FreeBSD crash on Feldhell TX. * Colored waterfall. (For now disabled, need to edit source and recompile.) (tnx Thierry F4DWV) 2004-04-15 Tomi Manninen * MT63 CWID now sends " MT63" instead of only the callsign. 2004-04-13 Tomi Manninen * Changes to make everything compile also without optimization enabled (to help debugging). * Use AC_COMPILE_WARNINGS in configure.in 2004-04-04 Tomi Manninen * Added timestamps to each line in the log file and fixed a few minor issues in log.c (tnx Andrea IZ4FHT). * Made "Log to file" sticky between invocations. 2004-03-28 Tomi Manninen * Implemented sample rate conversion using libsamplerate (slightly stripped down to save space). * Restructured snd.c. 2004-03-08 Tomi Manninen * Reset RTS and DTR at serial PTT open. 2004-03-02 Tomi Manninen * Changed the state change logic a bit. Switching from pause to tx works now. 2004-02-27 Tomi Manninen * Fixed filter.c to actually save calculations when decimating... 2004-02-26 Tomi Manninen * CWirc bug fix (Pierre F8EJF) 2004-02-25 Tomi Manninen * Support for hamlib rig_set_conf 2004-02-22 Tomi Manninen * Add underscore to the paths fed to find_menu_item(). This fixes a sigsegv on gnome 2.4. There will probably be a problem with translations though(?) 2004-02-22 Tomi Manninen * Released version 0.6beta3 * New help docs from Carl VK1KCM and lots of doc tweaking by me in the past few weeks 2004-02-20 Tomi Manninen * Added parport ptt support 2004-02-17 Tomi Manninen * Rewrote qsodata.c * Start in the mode saved at last exit * Added callsign to the saved picture name * Adjusted waterfall spectrum mode display scale a bit 2004-02-10 Tomi Manninen * Qsodata band combo changed to a simple entry if hamlib is in use 2004-02-09 Tomi Manninen * New mode: PSK63 * Changed the way TX/RX switching is handled in macros and squashed a major bug * removed macros $abort and $pause 2004-02-04 Tomi Manninen * Hamlib errors after initialization are not fatal. Errors reported to the main status bar. 2004-01-25 Tomi Manninen * Workaround for old popt versions * Search /opt/gnome2/bin as well for gconftool-2 2004-01-23 Tomi Manninen * Released version 0.6beta2 * Included some sample fixtexts 2004-01-18 Tomi Manninen * Small modification to support hamlib-1.1.5. 2004-01-12 Tomi Manninen * Waterfall mode can be set directly from the popup menu. * Testmode is now set from command line. 2003-12-27 Tomi Manninen * Test needed hamlib functions at startup and added a bit better logic if some features are not supported. 2003-11-27 Tomi Manninen * Use popt to parse command line options. Add a --run-druid option. * Added a first time configuration druid (wizard). 2003-11-23 Tomi Manninen * FFTW wisdom is saved to to gconf now. No separate file anymore. 2003-11-12 Tomi Manninen * CWirc slave code from Pierre-Philippe Coupard. See http://webperso.easyconnect.fr/om.the/web/helloip/ 2003-11-10 Tomi Manninen * Started using Glade 2.0.1. 2003-11-03 Tomi Manninen * New macros: $startqso, $logqso, $clearqso (set start time, log qso, clear qso data respectively). * Log qso sends end time to the remote log. * Don't clear qso data when pushing "log qso". * Search for gconftool-2 also in /opt/gnome/bin 2003-11-01 Tomi Manninen * Hitting TX button moved focus always to the TX text widget. This is not very good in Feldhell mode... Fixed. 2003-10-28 Tomi Manninen * Included gnome-screenshot.png in gMFSK. MFSK picture TX fails if this is not found. 2003-10-25 Tomi Manninen * Released version 0.6beta1 2003-10-23 Tomi Manninen * New help file from Carl VK1KCM. This is still work in progress. 2003-10-18 Tomi Manninen * Fixed timefmt key in the schemas file. 2003-10-12 Tomi Manninen * Fixed compile without hamlib support. 2003-09-12 Tomi Manninen * Reworked configure.in. 2003-09-06 Tomi Manninen * Hamlib PTT 2003-09-03 Tomi Manninen * Moved sound config reads to the main thread. Apparently GConf is not thread safe... * Made sound open non-blocking. Better error reporting if sound card is busy. * Added the GPL statement to each source file. 2003-08-31 Tomi Manninen * More hamlib stuff. Most of it now works at least for me... 2003-08-05 Tomi Manninen * Hamlib stuff... 2003-08-04 Tomi Manninen * Use g_file_get_contents() in "Send File..." 2003-07-26 Tomi Manninen * Waterfall enhancements: fall/rise switch, improved frequency ruler that can be dragged. * TX window clear bug fixed. * Made FFTW wisdom file configurable (default ~/gMFSK/fftw_wisdom) 2003-07-20 Tomi Manninen * More preparations for FFTW3. * Fixed a bug in the fftfilt code. (wrong length in fftfilt_set_freqs()) * Use FFTW_MEASURE flag to fftw_create_plan(). Also wisdom is imported/exported from/to $HOME/.gmfsk_fftw_wisdom. There will be a short delay the first time the program is started or a new modem is selected. 2003-07-18 Tomi Manninen * Reset miniscope and metric dial at TX start. * Feldhell now uses the same sample rate as all the other modems (8000 sps). * 8 bit character handling for MT63 (escape 127). 2003-07-14 Tomi Manninen * All modems now have a separate squelch setting. (Only MFSK, PSK31 and MT63 have a working squelch though.) 2003-07-14 Tomi Manninen * Setting Hellschreiber filter bandwidth now works. 2003-07-14 Tomi Manninen * Rewrote much or the config code. Adding new config items is now much easier. * Wrote a .schemas file. This provides defaults and documentation to the config keys used by gmfsk. * Updated the build files and .spec file to install the .schemas file. Also fixed the "Installed (but unpackaged) file(s) found" error on RPM builds. * Use the c_re() and c_im() macros to access complex numbers. This is the first step towards supporting FFTW 3. 2003-07-10 Tomi Manninen * MFSK pictures should now work. Tests against MixW show that it is compatible... (knock knock) 2003-07-05 Tomi Manninen * Switched to using GAsyncQueues in trx.c. * Macros can now have curly braces and an optional argument separated by a colon. Like this: ${pic:/home/joe/joe.jpg} * Two new macros: $pic and $picc. The first sends a gray- scale picture, the latter a color picture. An optional argument tells the picture file to send. If it's omitted or is a question mark, a file selection dialog is opened. 2003-06-23 Tomi Manninen * Fixed a bug in RTTY 8 bit ASCII handling. (A problem with signed chars cast to ints...) * FreeBSD fix for snd.c (tnx Craig vk1kcm) 2003-06-20 Tomi Manninen * MFSK picture receive almost works now 2003-06-10 Tomi Manninen * Simplified the MFSK sync code a bit 2003-05-30 Tomi Manninen * Help system now installs correctly * RPM spec file fixes * Added a "locator" entry in the QSO data area * Right click over rxtext uses current selection if there is one 2003-05-18 Tomi Manninen * Changes to make everything unicode transparent * TX text is handled differently now 2003-05-15 Tomi Manninen * Papertape is now (sort of) resizable 2003-05-09 Tomi Manninen * FeldHell TX now works. Still needs some work before it's ready for release. 2003-05-05 Tomi Manninen * Updated About dialog * Started a help file 2003-05-03 Tomi Manninen * Command macro segfaults if command isn't found - fixed * PTT open now delayed from config change 2003-04-26 Tomi Manninen * Separate config dialogs for all modems. Clicking statusbar pops up the mode config. * Removed "Apps" config dialog * Fixed "Clear RX/TX window" for FeldHell * Some preparations for FeldHell TX 2003-04-19 Tomi Manninen * Released version 0.5 * Ported to GTK+ 2 / Gnome 2 * gettext support * New modems: MFSK8, (Q)PSK31, MT63, FELDHELL (rx only for now) * Removed the homemade FFT implementation, FFTW is now required * Wrote my own Viterbi decoder, Phil's code removed * "make rpm" * Extensive rewrite of the waterfall widget * Syncscope converted to a real widget (miniscope) * Config system ported to gconf-2 * AFC/SQL/REV state saved/recovered at program exit/start * New macro: $mode * PTT output configurable to RTS or DTR * Various other minor things... 2002-04-22 Tomi Manninen * Changed the way waterfall ticks are drawn 2002-04-08 Tomi Manninen * Fixtexts still used /gmfsk/ as config file, fixed. * Implemented command substitution macros for fixtexts. * Made QSO bands and time/date format strings configurable. * Removed short time/date macros. * Fixed bug in TX window key press handling. Not all modifiers should be ignored... :) 2002-03-29 Tomi Manninen * Released version 0.4. * Numerous changes, eg. multithreaded modem engine and support for RTTY and THROB. 2001-06-23 Tomi Manninen * Changed tune signal behaviour. 2001-06-18 Tomi Manninen * Fixed SIGFPE on Alpha. 2001-06-17 Tomi Manninen * Some changes to enable generating debug symbols if needed. * Version 0.3. 2001-05-11 Tomi Manninen * A "send file" function. * Icon for the tune button (thanks Paul K9PS). * TX window accepts selections now. * Settable RX and TX window background colors. * Support for 8-bit sound cards. * A fullduplex sound io mode for certain broken soundcard drivers. * STDIO test mode for doing channel simulations (this was previously a compile time option). * PTT should now work correctly (waits for all samples to be sent). Also PTT signal is now also on DTR, it seems that most other software support both RTS and DTR. * Inverted PTT mode. * Macro buttons sent LF as EOL fixed. * Stupid typo with errmsg() fixed. * Writing to the TX window optimised somewhat. * A bit more informative sound IO error messages. * A "log to file" function. (thanks again Paul K9PS) * RX and TX window clear functions now moved under the File menu. * Code restructuring as always... 2001-04-28 Tomi Manninen * Changed soundcard reads to be non-blocking. This _might_ help folks with buggy soundcard drivers. * Implemented PTT and settable sound device. * Some code restructuring. * Added a RPM .spec file. * Version 0.2. 2001-04-22 Tomi Manninen * Initial public release (version 0.1). gmfsk-0.7pre1/INSTALL0000644000076400007640000002440310004532304007773 Quick Installation Instructions for gMFSK ========================================= To build gMFSK you need to have the Gnome 2.x libraries and the corresponding -devel packages installed. You don't need to run the Gnome desktop to build (or run) gMFSK. Note that many distributions divide libraries to two packages: the normal package that contains whatever is needed to *run* the software and to a developement package that contains files that are needed to *compile* software. When compiling gMFSK, you obviously need to have the devel packages installed as well. You will also need the FFTW libraries and headers installed. (www.fftw.org) gMFSK needs FFTW version 2.x, version 3.x will not work. Also, if you compile FFTW from source, remember to use the --enable-shared flag to the FFTW configure script. The help mechanism depends on the Gnome Help Browser (Yelp) so that must be installed if you want help to work. To build the package you type: ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var make make install If you want hamlib (rig control) support, add --enable-hamlib to the configure line. You need to be root during the "make install" part. =============== Begin generic installation instructions =============== Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. (Caching is disabled by default to prevent problems with accidental use of stale cache files.) If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You only need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not support the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the `--target=TYPE' option to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc will cause the specified gcc to be used as the C compiler (unless it is overridden in the site shell script). `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. gmfsk-0.7pre1/Makefile.am0000644000076400007640000000275210104220152010775 ## Process this file with automake to produce Makefile.in ACLOCAL_AMFLAGS = -I m4 SUBDIRS = m4 src po help EXTRA_DIST = \ COPYING-DOCS \ autogen.sh \ gmfsk.glade \ gmfsk.gladep \ gmfsk.spec \ gmfsk.spec.in \ xmldocs.make \ omf.make \ $(schema_DATA) schemadir = $(GCONF_SCHEMA_FILE_DIR) schema_DATA = gmfsk.schemas install-data-local: @$(NORMAL_INSTALL) if test -d $(srcdir)/pixmaps; then \ $(mkinstalldirs) $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \ for pixmap in $(srcdir)/pixmaps/*; do \ if test -f $$pixmap; then \ $(INSTALL_DATA) $$pixmap $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \ fi \ done \ fi if test -d $(srcdir)/fonts; then \ $(mkinstalldirs) $(DESTDIR)$(datadir)/fonts/feldhell; \ for font in $(srcdir)/fonts/*; do \ if test -f $$font; then \ $(INSTALL_DATA) $$font $(DESTDIR)$(datadir)/fonts/feldhell; \ fi \ done \ fi GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ $(GCONFTOOL) --makefile-install-rule $(top_builddir)/gmfsk.schemas dist-hook: if test -d pixmaps; then \ mkdir $(distdir)/pixmaps; \ for pixmap in pixmaps/*; do \ if test -f $$pixmap; then \ cp -p $$pixmap $(distdir)/pixmaps; \ fi \ done \ fi if test -d fonts; then \ mkdir $(distdir)/fonts; \ for font in fonts/*; do \ if test -f $$font; then \ cp -p $$font $(distdir)/fonts; \ fi \ done \ fi rpm: Makefile make dist $(RPMBUILD) -ta $(PACKAGE)-$(VERSION).tar.gz rm $(PACKAGE)-$(VERSION).tar.gz gmfsk-0.7pre1/Makefile.in0000644000076400007640000004731210206155264011025 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ ACLOCAL_AMFLAGS = -I m4 SUBDIRS = m4 src po help EXTRA_DIST = \ COPYING-DOCS \ autogen.sh \ gmfsk.glade \ gmfsk.gladep \ gmfsk.spec \ gmfsk.spec.in \ xmldocs.make \ omf.make \ $(schema_DATA) schemadir = $(GCONF_SCHEMA_FILE_DIR) schema_DATA = gmfsk.schemas subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = gmfsk.spec DIST_SOURCES = DATA = $(schema_DATA) RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ps-recursive install-info-recursive uninstall-info-recursive \ all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive \ check-recursive installcheck-recursive DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \ Makefile.in NEWS TODO acconfig.h aclocal.m4 config.guess \ config.h.in config.sub configure configure.in depcomp \ gmfsk.spec.in install-sh missing mkinstalldirs DIST_SUBDIRS = $(SUBDIRS) all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe) $(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ configure.in m4/ac_compile_warnings.m4 m4/codeset.m4 m4/gettext.m4 m4/glibc21.m4 m4/iconv.m4 m4/isc-posix.m4 m4/lcmessage.m4 m4/lrint.m4 m4/progtest.m4 cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) config.h: stamp-h1 @if test ! -f $@; then \ rm -f stamp-h1; \ $(MAKE) stamp-h1; \ else :; fi stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status @rm -f stamp-h1 cd $(top_builddir) && $(SHELL) ./config.status config.h $(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(top_srcdir)/configure.in $(ACLOCAL_M4) $(top_srcdir)/acconfig.h cd $(top_srcdir) && $(AUTOHEADER) touch $(srcdir)/config.h.in distclean-hdr: -rm -f config.h stamp-h1 gmfsk.spec: $(top_builddir)/config.status gmfsk.spec.in cd $(top_builddir) && $(SHELL) ./config.status $@ uninstall-info-am: schemaDATA_INSTALL = $(INSTALL_DATA) install-schemaDATA: $(schema_DATA) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(schemadir) @list='$(schema_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " $(schemaDATA_INSTALL) $$d$$p $(DESTDIR)$(schemadir)/$$f"; \ $(schemaDATA_INSTALL) $$d$$p $(DESTDIR)$(schemadir)/$$f; \ done uninstall-schemaDATA: @$(NORMAL_UNINSTALL) @list='$(schema_DATA)'; for p in $$list; do \ f="`echo $$p | sed -e 's|^.*/||'`"; \ echo " rm -f $(DESTDIR)$(schemadir)/$$f"; \ rm -f $(DESTDIR)$(schemadir)/$$f; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = . distdir = $(PACKAGE)-$(VERSION) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print distdir: $(DISTFILES) $(am__remove_distdir) mkdir $(distdir) $(mkinstalldirs) $(distdir)/. $(distdir)/po @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist dist-all: distdir $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist $(am__remove_distdir) GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && $(mkinstalldirs) "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \ && rm -f $(distdir).tar.gz \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @echo "$(distdir).tar.gz is ready for distribution" | \ sed 'h;s/./=/g;p;x;p;x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile $(DATA) config.h installdirs: installdirs-recursive installdirs-am: $(mkinstalldirs) $(DESTDIR)$(schemadir) install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) distclean-am: clean-am distclean-generic distclean-hdr distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-data-local install-schemaDATA install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-schemaDATA uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ clean-generic clean-recursive ctags ctags-recursive dist \ dist-all dist-gzip distcheck distclean distclean-generic \ distclean-hdr distclean-recursive distclean-tags distcleancheck \ distdir distuninstallcheck dvi dvi-am dvi-recursive info \ info-am info-recursive install install-am install-data \ install-data-am install-data-local install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-schemaDATA install-strip installcheck \ installcheck-am installdirs installdirs-am \ installdirs-recursive maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am pdf-recursive ps ps-am \ ps-recursive tags tags-recursive uninstall uninstall-am \ uninstall-info-am uninstall-info-recursive uninstall-recursive \ uninstall-schemaDATA install-data-local: @$(NORMAL_INSTALL) if test -d $(srcdir)/pixmaps; then \ $(mkinstalldirs) $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \ for pixmap in $(srcdir)/pixmaps/*; do \ if test -f $$pixmap; then \ $(INSTALL_DATA) $$pixmap $(DESTDIR)$(datadir)/pixmaps/$(PACKAGE); \ fi \ done \ fi if test -d $(srcdir)/fonts; then \ $(mkinstalldirs) $(DESTDIR)$(datadir)/fonts/feldhell; \ for font in $(srcdir)/fonts/*; do \ if test -f $$font; then \ $(INSTALL_DATA) $$font $(DESTDIR)$(datadir)/fonts/feldhell; \ fi \ done \ fi GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) \ $(GCONFTOOL) --makefile-install-rule $(top_builddir)/gmfsk.schemas dist-hook: if test -d pixmaps; then \ mkdir $(distdir)/pixmaps; \ for pixmap in pixmaps/*; do \ if test -f $$pixmap; then \ cp -p $$pixmap $(distdir)/pixmaps; \ fi \ done \ fi if test -d fonts; then \ mkdir $(distdir)/fonts; \ for font in fonts/*; do \ if test -f $$font; then \ cp -p $$font $(distdir)/fonts; \ fi \ done \ fi rpm: Makefile make dist $(RPMBUILD) -ta $(PACKAGE)-$(VERSION).tar.gz rm $(PACKAGE)-$(VERSION).tar.gz # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/NEWS0000644000076400007640000000141607746551474007474 Version 0.6beta1 user visible changes: - Feldhell TX works. Full international character set support. - All modems have their own config dialog. Clicking the mode label in the statusbar opens the dialog for the current mode. (RTTY and THROB squelch and Feldhell AGC settings don't work yet.) - Help file. This is still work in progress. Specifically the section about usage is mostly bogus right now. - TX text is handled a bit differently now. Difficult to explain, please test... - Locator entry in QSO data (also sent to remote log). - MFSK pictures. - The FFT library (FFTW) now uses "wisdom" to optimize CPU consumption. User will notice that the first time a modem is used, there will be a few seconds delay. - Hamlib (rig control) support. gmfsk-0.7pre1/TODO0000644000076400007640000000273310065565366007461 Features that might one day be implemented in gMFSK. Actually this is only for me to remember my own ideas and ideas suggested by other people. Some of these will probably never fly... But if you see something that you would _really_ like to see in gMFSK, email me and I may bump that idea up the list. These are not in any particular order however. - International character set support. (Hellschreiber already has this.) - A "log to file" for Feldhell. Perhaps save the bottom most papertape as a png every time it is filled (scrolled upwards). - "Start QSO" button. This would reset the start time of the QSO to current time. - Query remote log for name/qth/etc data from a possible earlier QSO with this callsign. Needs Xlog support. - NET or Lock TX checkbutton. - Color waterfall. - Adjustable (mode specific?) AFC capture/scan speed. - Callcheck, ie. scan received text for callsigns and grab the callsign to QSO data. - CW mode. - A completely separate modem engine or a TNC emulation mode. - AutoCQ - Save current mode at exit and start with that mode next time. - Resync button for MT63. (Hitting the Abort button is equivalent!!!) - simultaneous decoding of multiple signals. - replay received audio when clicking on a new signal. - Amtor/pactor (receive only?) - IMD display for PSK31 - FMHELL - Video-ID mode - Working sync for THROB - Configurable waterfall font (fix drawing first) - REV doesn't for on MT63, needs to be fixed. gmfsk-0.7pre1/acconfig.h0000644000076400007640000000021610031346105010662 #undef ENABLE_NLS #undef HAVE_CATGETS #undef HAVE_GETTEXT #undef GETTEXT_PACKAGE #undef HAVE_LC_MESSAGES #undef HAVE_STPCPY #undef HAVE_LIBSM gmfsk-0.7pre1/aclocal.m40000644000076400007640000014161610206155261010617 # generated automatically by aclocal 1.7.6 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 # Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Do all the work for Automake. -*- Autoconf -*- # This macro actually does too much some checks are only needed if # your package does certain things. But this isn't really a big deal. # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 10 AC_PREREQ([2.54]) # Autoconf 2.50 wants to disallow AM_ names. We explicitly allow # the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_MISSING_PROG(AMTAR, tar) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $1 | $1:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) # Copyright 2002 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.7"]) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION so it can be traced. # This function is AC_REQUIREd by AC_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.7.6])]) # Helper functions for option handling. -*- Autoconf -*- # Copyright 2001, 2002 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # # Check to make sure that the build environment is sane. # # Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # -*- Autoconf -*- # Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 3 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # AM_AUX_DIR_EXPAND # Copyright 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. # Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50]) AC_DEFUN([AM_AUX_DIR_EXPAND], [ # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. # Copyright 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"$am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # AM_PROG_INSTALL_STRIP # Copyright 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # -*- Autoconf -*- # Copyright (C) 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 1 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # serial 5 -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c : > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking Speeds up one-time builds --enable-dependency-tracking Do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH]) ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. #serial 2 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n -e '/^U = / s///p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n -e ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright 1997, 2000, 2001 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 5 AC_PREREQ(2.52) # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE]) AC_SUBST([$1_FALSE]) if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]) fi])]) # Add --enable-maintainer-mode option to configure. # From Jim Meyering # Copyright 1996, 1998, 2000, 2001, 2002 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # serial 2 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return (int) dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) if test "$gt_cv_func_dgettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then AC_CHECK_FUNCS(dcgettext) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.in. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN(GLIB_GNU_GETTEXT, [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for lang in ${LINGUAS=$ALL_LINGUAS}; do case "$ALL_LINGUAS" in *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; esac done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN(GLIB_DEFINE_LOCALEDIR, [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" test "x$prefix" = xNONE && prefix=$ac_default_prefix if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_in,[],[ AC_DEFUN(AM_GLIB_GNU_GETTEXT,[GLIB_GNU_GETTEXT($@)]) AC_DEFUN(AM_GLIB_DEFINE_LOCALEDIR,[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl dnl AM_GCONF_SOURCE_2 dnl Defines GCONF_SCHEMA_CONFIG_SOURCE which is where you should install schemas dnl (i.e. pass to gconftool-2 dnl Defines GCONF_SCHEMA_FILE_DIR which is a filesystem directory where dnl you should install foo.schemas files dnl AC_DEFUN(AM_GCONF_SOURCE_2, [ if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi AC_ARG_WITH(gconf-source, [ --with-gconf-source=sourceaddress Config database for installing schema files.],GCONF_SCHEMA_CONFIG_SOURCE="$withval",) AC_SUBST(GCONF_SCHEMA_CONFIG_SOURCE) AC_MSG_RESULT([Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation]) if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas/' else GCONF_SCHEMA_FILE_DIR=$GCONF_SCHEMA_FILE_DIR fi AC_ARG_WITH(gconf-schema-file-dir, [ --with-gconf-schema-file-dir=dir Directory for installing schema files.],GCONF_SCHEMA_FILE_DIR="$withval",) AC_SUBST(GCONF_SCHEMA_FILE_DIR) AC_MSG_RESULT([Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files]) AC_ARG_ENABLE(schemas-install, [ --disable-schemas-install Disable the schemas installation], [case "${enableval}" in yes) schemas_install=true ;; no) schemas_install=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --disable-schemas-install) ;; esac],[schemas_install=true]) AM_CONDITIONAL(GCONF_SCHEMAS_INSTALL, test x$schemas_install = xtrue) ]) dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not) dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page dnl also defines GSTUFF_PKG_ERRORS on error AC_DEFUN(PKG_CHECK_MODULES, [ succeeded=no if test -z "$PKG_CONFIG"; then AC_PATH_PROG(PKG_CONFIG, pkg-config, no) fi if test "$PKG_CONFIG" = "no" ; then echo "*** The pkg-config script could not be found. Make sure it is" echo "*** in your path, or set the PKG_CONFIG environment variable" echo "*** to the full path to pkg-config." echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." else PKG_CONFIG_MIN_VERSION=0.9.0 if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then AC_MSG_CHECKING(for $2) if $PKG_CONFIG --exists "$2" ; then AC_MSG_RESULT(yes) succeeded=yes AC_MSG_CHECKING($1_CFLAGS) $1_CFLAGS=`$PKG_CONFIG --cflags "$2"` AC_MSG_RESULT($$1_CFLAGS) AC_MSG_CHECKING($1_LIBS) $1_LIBS=`$PKG_CONFIG --libs "$2"` AC_MSG_RESULT($$1_LIBS) else $1_CFLAGS="" $1_LIBS="" ## If we have a custom action on failure, don't print errors, but ## do set a variable so people can do so. $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` ifelse([$4], ,echo $$1_PKG_ERRORS,) fi AC_SUBST($1_CFLAGS) AC_SUBST($1_LIBS) else echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." echo "*** See http://www.freedesktop.org/software/pkgconfig" fi fi if test $succeeded = yes; then ifelse([$3], , :, [$3]) else ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4]) fi ]) dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_compile_warnings.html dnl AC_DEFUN([AC_COMPILE_WARNINGS], [AC_MSG_CHECKING(maximum warning verbosity option) if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi AC_MSG_RESULT($ac_compile_warnings_msg) unset ac_compile_warnings_msg unset ac_compile_warnings_opt ]) dnl @synopsis AC_C99_FUNC_LRINT dnl dnl Check whether C99's lrint function is available. dnl @version 1.3 Feb 12 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LRINT], [AC_CACHE_CHECK(for lrint, ac_cv_c99_lrint, [ lrint_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no) CFLAGS=$lrint_save_CFLAGS ]) if test "$ac_cv_c99_lrint" = yes; then AC_DEFINE(HAVE_LRINT, 1, [Define if you have C99's lrint function.]) fi ])# AC_C99_FUNC_LRINT dnl @synopsis AC_C99_FUNC_LRINTF dnl dnl Check whether C99's lrintf function is available. dnl @version 1.3 Feb 12 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LRINTF], [AC_CACHE_CHECK(for lrintf, ac_cv_c99_lrintf, [ lrintf_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) CFLAGS=$lrintf_save_CFLAGS ]) if test "$ac_cv_c99_lrintf" = yes; then AC_DEFINE(HAVE_LRINTF, 1, [Define if you have C99's lrintf function.]) fi ])# AC_C99_FUNC_LRINTF dnl @synopsis AC_C99_FUNC_LLRINT dnl dnl Check whether C99's llrint function is available. dnl @version 1.1 Sep 30 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LLRINT], [AC_CACHE_CHECK(for llrint, ac_cv_c99_llrint, [ llrint_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include #include ], int64_t x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no) CFLAGS=$llrint_save_CFLAGS ]) if test "$ac_cv_c99_llrint" = yes; then AC_DEFINE(HAVE_LLRINT, 1, [Define if you have C99's llrint function.]) fi ])# AC_C99_FUNC_LLRINT gmfsk-0.7pre1/config.guess0000755000076400007640000012206507730172325011304 #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-07-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit 0 ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*|*:GNU/FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/FreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit 0 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit 0 ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit 0 ;; i*86:*:5:[78]*) case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit 0 ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit 0 ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4.3${OS_REL} && exit 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gmfsk-0.7pre1/config.h.in0000644000076400007640000001032410206155346010775 /* config.h.in. Generated from configure.in by autoheader. */ #undef ENABLE_NLS #undef HAVE_CATGETS #undef HAVE_GETTEXT #undef GETTEXT_PACKAGE #undef HAVE_LC_MESSAGES #undef HAVE_STPCPY #undef HAVE_LIBSM /* always defined to indicate that i18n is enabled */ #undef ENABLE_NLS /* Gettext domain name */ #undef GETTEXT_PACKAGE /* Define to 1 if you have the `bind_textdomain_codeset' function. */ #undef HAVE_BIND_TEXTDOMAIN_CODESET /* Define to 1 if you have the `ceil' function. */ #undef HAVE_CEIL /* Define to 1 if you have the `dcgettext' function. */ #undef HAVE_DCGETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_DFFTW_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the header file. */ #undef HAVE_FFTW_H /* Define to 1 if you have the `floor' function. */ #undef HAVE_FLOOR /* Define to 1 if you have the `fmod' function. */ #undef HAVE_FMOD /* Define if the GNU gettext() function is already present or preinstalled. */ #undef HAVE_GETTEXT /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define if your file defines LC_MESSAGES. */ #undef HAVE_LC_MESSAGES /* Define to 1 if you have the header file. */ #undef HAVE_LIMITS_H /* Define to 1 if you have the header file. */ #undef HAVE_LINUX_PPDEV_H /* Define to 1 if you have the header file. */ #undef HAVE_LOCALE_H /* Define if you have C99's lrint function. */ #undef HAVE_LRINT /* Define if you have C99's lrintf function. */ #undef HAVE_LRINTF /* Define to 1 if you have the `memcpy' function. */ #undef HAVE_MEMCPY /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkdir' function. */ #undef HAVE_MKDIR /* Define to 1 if you have the `pow' function. */ #undef HAVE_POW /* Define to 1 if you have the `sqrt' function. */ #undef HAVE_SQRT /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strcasecmp' function. */ #undef HAVE_STRCASECMP /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the version of this package. */ #undef PACKAGE_VERSION /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if your declares `struct tm'. */ #undef TM_IN_SYS_TIME /* Version number of package */ #undef VERSION /* Define to 1 if hamlib support is wanted */ #undef WANT_HAMLIB /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define as `__inline' if that's what the C compiler calls it, or to nothing if it is not supported. */ #undef inline gmfsk-0.7pre1/config.sub0000755000076400007640000007314107730172325010747 #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003 Free Software Foundation, Inc. timestamp='2003-07-04' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | kfreebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k \ | m32r | m68000 | m68k | m88k | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* \ | m32r-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | msp430-* \ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; crds | unos) basic_machine=m68k-crds ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; mmix*) basic_machine=mmix-knuth os=-mmixware ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nv1) basic_machine=nv1-cray os=-unicosmp ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -kfreebsd* | -freebsd* | -riscix* \ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -ptx*) vendor=sequent ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gmfsk-0.7pre1/configure0000755000076400007640000075674310206155270010703 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.57 for gmfsk 0.7pre1. # # Report bugs to . # # Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 # Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi # Support unset when possible. if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid variable name. as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME='gmfsk' PACKAGE_TARNAME='gmfsk' PACKAGE_VERSION='0.7pre1' PACKAGE_STRING='gmfsk 0.7pre1' PACKAGE_BUGREPORT='oh2bns@sral.fi' ac_unique_file="configure.in" # Factoring default headers for most tests. ac_includes_default="\ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # endif #endif #if HAVE_UNISTD_H # include #endif" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM AWK SET_MAKE am__leading_dot MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT GETTEXT_PACKAGE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP USE_NLS MSGFMT GMSGFMT XGETTEXT CATALOGS CATOBJEXT DATADIRNAME GMOFILES INSTOBJEXT INTLLIBS PO_IN_DATADIR_TRUE PO_IN_DATADIR_FALSE POFILES POSUB MKINSTALLDIRS CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE RANLIB ac_ct_RANLIB RPMBUILD GCONFTOOL GCONF_SCHEMA_CONFIG_SOURCE GCONF_SCHEMA_FILE_DIR GCONF_SCHEMAS_INSTALL_TRUE GCONF_SCHEMAS_INSTALL_FALSE SK_CONFIG SCROLLKEEPER_BUILD_REQUIRED PKG_CONFIG PACKAGE_CFLAGS PACKAGE_LIBS LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias ac_env_CC_set=${CC+set} ac_env_CC_value=$CC ac_cv_env_CC_set=${CC+set} ac_cv_env_CC_value=$CC ac_env_CFLAGS_set=${CFLAGS+set} ac_env_CFLAGS_value=$CFLAGS ac_cv_env_CFLAGS_set=${CFLAGS+set} ac_cv_env_CFLAGS_value=$CFLAGS ac_env_LDFLAGS_set=${LDFLAGS+set} ac_env_LDFLAGS_value=$LDFLAGS ac_cv_env_LDFLAGS_set=${LDFLAGS+set} ac_cv_env_LDFLAGS_value=$LDFLAGS ac_env_CPPFLAGS_set=${CPPFLAGS+set} ac_env_CPPFLAGS_value=$CPPFLAGS ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} ac_cv_env_CPPFLAGS_value=$CPPFLAGS ac_env_CPP_set=${CPP+set} ac_env_CPP_value=$CPP ac_cv_env_CPP_set=${CPP+set} ac_cv_env_CPP_value=$CPP ac_env_CXX_set=${CXX+set} ac_env_CXX_value=$CXX ac_cv_env_CXX_set=${CXX+set} ac_cv_env_CXX_value=$CXX ac_env_CXXFLAGS_set=${CXXFLAGS+set} ac_env_CXXFLAGS_value=$CXXFLAGS ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} ac_cv_env_CXXFLAGS_value=$CXXFLAGS # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gmfsk 0.7pre1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gmfsk 0.7pre1:";; esac cat <<\_ACEOF Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking Speeds up one-time builds --enable-dependency-tracking Do not reject slow dependency extractors --disable-schemas-install Disable the schemas installation --enable-hamlib Add support for hamradio control libraries Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gconf-source=sourceaddress Config database for installing schema files. --with-gconf-schema-file-dir=dir Directory for installing schema files. Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF gmfsk configure 0.7pre1 generated by GNU Autoconf 2.57 Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gmfsk $as_me 0.7pre1, which was generated by GNU Autoconf 2.57. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core core.* *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" am__api_version="1.7" ac_aux_dir= for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do if test -f $ac_dir/install-sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f $ac_dir/install.sh; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f $ac_dir/shtool; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5 echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;} { (exit 1); exit 1; }; } fi ac_config_guess="$SHELL $ac_aux_dir/config.guess" ac_config_sub="$SHELL $ac_aux_dir/config.sub" ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi done done ;; esac done fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. We don't cache a # path for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the path is relative. INSTALL=$ac_install_sh fi fi echo "$as_me:$LINENO: result: $INSTALL" >&5 echo "${ECHO_T}$INSTALL" >&6 # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo "$as_me:$LINENO: checking whether build environment is sane" >&5 echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 test "$program_prefix" != NONE && program_transform_name="s,^,$program_prefix,;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s,\$,$program_suffix,;$program_transform_name" # Double any \ or $. echo might interpret backslashes. # By default was `s,x,x', remove it if useless. cat <<\_ACEOF >conftest.sed s/[\\$]/&&/g;s/;s,x,x,$// _ACEOF program_transform_name=`echo $program_transform_name | sed -f conftest.sed` rm conftest.sed # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_AWK+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then echo "$as_me:$LINENO: result: $AWK" >&5 echo "${ECHO_T}$AWK" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$AWK" && break done echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # test to see if srcdir already configured if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='gmfsk' VERSION='0.7pre1' cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} AMTAR=${AMTAR-"${am_missing_run}tar"} install_sh=${install_sh-"$am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then echo "$as_me:$LINENO: result: $STRIP" >&5 echo "${ECHO_T}$STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 echo "${ECHO_T}$ac_ct_STRIP" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi STRIP=$ac_ct_STRIP else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" >&6 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi; echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 echo "${ECHO_T}$USE_MAINTAINER_MODE" >&6 if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE GETTEXT_PACKAGE=gmfsk cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF # Supported languages. # ALL_LINGUAS="fi sk" DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi echo "$as_me:$LINENO: result: $_am_result" >&5 echo "${ECHO_T}$_am_result" >&6 rm -f confinc confmf # Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval="$enable_dependency_tracking" fi; if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. echo "$as_me:$LINENO: checking for C compiler default output" >&5 echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6 ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 (eval $ac_link_default) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Find the output, starting from the most likely. This scheme is # not robust to junk in `.', hence go to wildcards (a.*) only as a last # resort. # Be careful to initialize this variable, since it used to be cached. # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. ac_cv_exeext= # b.out is created by i960 compilers. for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; conftest.$ac_ext ) # This is the source file. ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` # FIXME: I believe we export ac_cv_exeext for Libtool, # but it would be cool to find out if it's true. Does anybody # maintain Libtool? --akim. export ac_cv_exeext break;; * ) break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; } fi ac_exeext=$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_file" >&5 echo "${ECHO_T}$ac_file" >&6 # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether the C compiler works" >&5 echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi fi fi echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 rm -f a.out a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 echo "$as_me:$LINENO: result: $cross_compiling" >&5 echo "${ECHO_T}$cross_compiling" >&6 echo "$as_me:$LINENO: checking for suffix of executables" >&5 echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` export ac_cv_exeext break;; * ) break;; esac done else { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest$ac_cv_exeext echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 echo "${ECHO_T}$ac_cv_exeext" >&6 rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT echo "$as_me:$LINENO: checking for suffix of object files" >&5 echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 if test "${ac_cv_objext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 echo "${ECHO_T}$ac_cv_objext" >&6 OBJEXT=$ac_cv_objext ac_objext=$OBJEXT echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c : > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi echo "$as_me:$LINENO: result: $CPP" >&5 echo "${ECHO_T}$CPP" >&6 ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether non-existent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then # Broken: success on invalid input. continue else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 echo $ECHO_N "checking for egrep... $ECHO_C" >&6 if test "${ac_cv_prog_egrep+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if echo a | (grep -E '(a|b)') >/dev/null 2>&1 then ac_cv_prog_egrep='grep -E' else ac_cv_prog_egrep='egrep' fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 echo "${ECHO_T}$ac_cv_prog_egrep" >&6 EGREP=$ac_cv_prog_egrep echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_Header=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in locale.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc in yes:no ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; no:yes ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5 echo $ECHO_N "checking for LC_MESSAGES... $ECHO_C" >&6 if test "${am_cv_val_LC_MESSAGES+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then am_cv_val_LC_MESSAGES=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 am_cv_val_LC_MESSAGES=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5 echo "${ECHO_T}$am_cv_val_LC_MESSAGES" >&6 if test $am_cv_val_LC_MESSAGES = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LC_MESSAGES 1 _ACEOF fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= if test "${ac_cv_header_libintl_h+set}" = set; then echo "$as_me:$LINENO: checking for libintl.h" >&5 echo $ECHO_N "checking for libintl.h... $ECHO_C" >&6 if test "${ac_cv_header_libintl_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: $ac_cv_header_libintl_h" >&5 echo "${ECHO_T}$ac_cv_header_libintl_h" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking libintl.h usability" >&5 echo $ECHO_N "checking libintl.h usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking libintl.h presence" >&5 echo $ECHO_N "checking libintl.h presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc in yes:no ) { echo "$as_me:$LINENO: WARNING: libintl.h: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: libintl.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: libintl.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: libintl.h: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; no:yes ) { echo "$as_me:$LINENO: WARNING: libintl.h: present but cannot be compiled" >&5 echo "$as_me: WARNING: libintl.h: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: libintl.h: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: libintl.h: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: libintl.h: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: libintl.h: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for libintl.h" >&5 echo $ECHO_N "checking for libintl.h... $ECHO_C" >&6 if test "${ac_cv_header_libintl_h+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_header_libintl_h=$ac_header_preproc fi echo "$as_me:$LINENO: result: $ac_cv_header_libintl_h" >&5 echo "${ECHO_T}$ac_cv_header_libintl_h" >&6 fi if test $ac_cv_header_libintl_h = yes; then gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # echo "$as_me:$LINENO: checking for dgettext in libc" >&5 echo $ECHO_N "checking for dgettext in libc... $ECHO_C" >&6 if test "${gt_cv_func_dgettext_libc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return (int) dgettext ("","") ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then gt_cv_func_dgettext_libc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_dgettext_libc=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $gt_cv_func_dgettext_libc" >&5 echo "${ECHO_T}$gt_cv_func_dgettext_libc" >&6 if test "$gt_cv_func_dgettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then echo "$as_me:$LINENO: checking for bindtextdomain in -lintl" >&5 echo $ECHO_N "checking for bindtextdomain in -lintl... $ECHO_C" >&6 if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char bindtextdomain (); int main () { bindtextdomain (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_intl_bindtextdomain=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_bindtextdomain=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_intl_bindtextdomain" >&5 echo "${ECHO_T}$ac_cv_lib_intl_bindtextdomain" >&6 if test $ac_cv_lib_intl_bindtextdomain = yes; then echo "$as_me:$LINENO: checking for dgettext in -lintl" >&5 echo $ECHO_N "checking for dgettext in -lintl... $ECHO_C" >&6 if test "${ac_cv_lib_intl_dgettext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dgettext (); int main () { dgettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_intl_dgettext=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_dgettext=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dgettext" >&5 echo "${ECHO_T}$ac_cv_lib_intl_dgettext" >&6 if test $ac_cv_lib_intl_dgettext = yes; then gt_cv_func_dgettext_libintl=yes fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then echo "$as_me:$LINENO: checking if -liconv is needed to use gettext" >&5 echo $ECHO_N "checking if -liconv is needed to use gettext... $ECHO_C" >&6 echo "$as_me:$LINENO: result: " >&5 echo "${ECHO_T}" >&6 echo "$as_me:$LINENO: checking for dcgettext in -lintl" >&5 echo $ECHO_N "checking for dcgettext in -lintl... $ECHO_C" >&6 if test "${ac_cv_lib_intl_dcgettext+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char dcgettext (); int main () { dcgettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_intl_dcgettext=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_dcgettext=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dcgettext" >&5 echo "${ECHO_T}$ac_cv_lib_intl_dcgettext" >&6 if test $ac_cv_lib_intl_dcgettext = yes; then gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then cat >>confdefs.h <<\_ACEOF #define HAVE_GETTEXT 1 _ACEOF # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_MSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then echo "$as_me:$LINENO: result: $MSGFMT" >&5 echo "${ECHO_T}$MSGFMT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "$MSGFMT" != "no"; then for ac_func in dcgettext do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_GMSGFMT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then echo "$as_me:$LINENO: result: $GMSGFMT" >&5 echo "${ECHO_T}$GMSGFMT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_XGETTEXT+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then echo "$as_me:$LINENO: result: $XGETTEXT" >&5 echo "${ECHO_T}$XGETTEXT" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then CATOBJEXT=.gmo DATADIRNAME=share else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CATOBJEXT=.mo DATADIRNAME=lib fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then cat >>confdefs.h <<\_ACEOF #define ENABLE_NLS 1 _ACEOF fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5 echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6 XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else echo "$as_me:$LINENO: checking for catalogs to be installed" >&5 echo $ECHO_N "checking for catalogs to be installed... $ECHO_C" >&6 NEW_LINGUAS= for lang in ${LINGUAS=$ALL_LINGUAS}; do case "$ALL_LINGUAS" in *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;; esac done LINGUAS=$NEW_LINGUAS echo "$as_me:$LINENO: result: $LINGUAS" >&5 echo "${ECHO_T}$LINGUAS" >&6 fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES # Checks for programs. # ac_ext=cc ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then echo "$as_me:$LINENO: result: $CXX" >&5 echo "${ECHO_T}$CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 echo "${ECHO_T}$ac_ct_CXX" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CXX" && break done test -n "$ac_ct_CXX" || ac_ct_CXX="g++" CXX=$ac_ct_CXX fi # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C++ compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 if test "${ac_cv_cxx_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 GXX=`test $ac_compiler_gnu = yes && echo yes` ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS CXXFLAGS="-g" echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cxx_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cxx_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cxx_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c : > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi CC=$ac_ct_CC else CC="$ac_cv_prog_CC" fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then echo "$as_me:$LINENO: result: $CC" >&5 echo "${ECHO_T}$CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 echo "${ECHO_T}$ac_ct_CC" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$ac_ct_CC" && break done CC=$ac_ct_CC fi fi test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } # Provide some information about the compiler. echo "$as_me:$LINENO:" \ "checking for C compiler version" >&5 ac_compiler=`set X $ac_compile; echo $2` { (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 (eval $ac_compiler --version &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 (eval $ac_compiler -v &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 (eval $ac_compiler -V &5) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 if test "${ac_cv_c_compiler_gnu+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_compiler_gnu=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 GCC=`test $ac_compiler_gnu = yes && echo yes` ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS CFLAGS="-g" echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_g=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_prog_cc_g=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 if test "${ac_cv_prog_cc_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_prog_cc_stdc=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF # Don't try gcc -ansi; that turns off useful extensions and # breaks some systems' header files. # AIX -qlanglvl=ansi # Ultrix and OSF/1 -std1 # HP-UX 10.20 and later -Ae # HP-UX older versions -Aa -D_HPUX_SOURCE # SVR4 -Xc -D__EXTENSIONS__ for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_prog_cc_stdc=$ac_arg break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext done rm -f conftest.$ac_ext conftest.$ac_objext CC=$ac_save_CC fi case "x$ac_cv_prog_cc_stdc" in x|xno) echo "$as_me:$LINENO: result: none needed" >&5 echo "${ECHO_T}none needed" >&6 ;; *) echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 CC="$CC $ac_cv_prog_cc_stdc" ;; esac # Some people use a C++ compiler to compile C. Since we use `exit', # in C++ we need to declare it. In case someone uses the same compiler # for both compiling C and C++ we need to have the C++ compiler decide # the declaration of exit, since it's the most demanding environment. cat >conftest.$ac_ext <<_ACEOF #ifndef __cplusplus choke me #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then for ac_declaration in \ ''\ '#include ' \ 'extern "C" void std::exit (int) throw (); using std::exit;' \ 'extern "C" void std::exit (int); using std::exit;' \ 'extern "C" void exit (int) throw ();' \ 'extern "C" void exit (int);' \ 'void exit (int);' do cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 continue fi rm -f conftest.$ac_objext conftest.$ac_ext cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_declaration int main () { exit (42); ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done rm -f conftest* if test -n "$ac_declaration"; then echo '#ifdef __cplusplus' >>confdefs.h echo $ac_declaration >>confdefs.h echo '#endif' >>confdefs.h fi else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c : > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # (even with -Werror). So we grep stderr for any message # that says an option was ignored. if grep 'ignoring option' conftest.err >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.make <<\_ACEOF all: @echo 'ac_maketemp="$(MAKE)"' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` if test -n "$ac_maketemp"; then eval ac_cv_prog_make_${ac_make}_set=yes else eval ac_cv_prog_make_${ac_make}_set=no fi rm -f conftest.make fi if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 SET_MAKE= else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 SET_MAKE="MAKE=${MAKE-make}" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then echo "$as_me:$LINENO: result: $RANLIB" >&5 echo "${ECHO_T}$RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 echo "${ECHO_T}$ac_ct_RANLIB" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi RANLIB=$ac_ct_RANLIB else RANLIB="$ac_cv_prog_RANLIB" fi for ac_prog in rpmbuild do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_RPMBUILD+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$RPMBUILD"; then ac_cv_prog_RPMBUILD="$RPMBUILD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RPMBUILD="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi RPMBUILD=$ac_cv_prog_RPMBUILD if test -n "$RPMBUILD"; then echo "$as_me:$LINENO: result: $RPMBUILD" >&5 echo "${ECHO_T}$RPMBUILD" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$RPMBUILD" && break done test -n "$RPMBUILD" || RPMBUILD="rpm" # GConf (some systems hide gconftool in strange places...) # # Extract the first word of "gconftool-2", so it can be a program name with args. set dummy gconftool-2; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_GCONFTOOL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $GCONFTOOL in [\\/]* | ?:[\\/]*) ac_cv_path_GCONFTOOL="$GCONFTOOL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_dummy="$PATH:/opt/gnome/bin:/opt/gnome2/bin" for as_dir in $as_dummy do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_GCONFTOOL="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done ;; esac fi GCONFTOOL=$ac_cv_path_GCONFTOOL if test -n "$GCONFTOOL"; then echo "$as_me:$LINENO: result: $GCONFTOOL" >&5 echo "${ECHO_T}$GCONFTOOL" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test "x$GCONF_SCHEMA_INSTALL_SOURCE" = "x"; then GCONF_SCHEMA_CONFIG_SOURCE=`gconftool-2 --get-default-source` else GCONF_SCHEMA_CONFIG_SOURCE=$GCONF_SCHEMA_INSTALL_SOURCE fi # Check whether --with-gconf-source or --without-gconf-source was given. if test "${with_gconf_source+set}" = set; then withval="$with_gconf_source" GCONF_SCHEMA_CONFIG_SOURCE="$withval" fi; echo "$as_me:$LINENO: result: Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&5 echo "${ECHO_T}Using config source $GCONF_SCHEMA_CONFIG_SOURCE for schema installation" >&6 if test "x$GCONF_SCHEMA_FILE_DIR" = "x"; then GCONF_SCHEMA_FILE_DIR='$(sysconfdir)/gconf/schemas/' else GCONF_SCHEMA_FILE_DIR=$GCONF_SCHEMA_FILE_DIR fi # Check whether --with-gconf-schema-file-dir or --without-gconf-schema-file-dir was given. if test "${with_gconf_schema_file_dir+set}" = set; then withval="$with_gconf_schema_file_dir" GCONF_SCHEMA_FILE_DIR="$withval" fi; echo "$as_me:$LINENO: result: Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&5 echo "${ECHO_T}Using $GCONF_SCHEMA_FILE_DIR as install directory for schema files" >&6 # Check whether --enable-schemas-install or --disable-schemas-install was given. if test "${enable_schemas_install+set}" = set; then enableval="$enable_schemas_install" case "${enableval}" in yes) schemas_install=true ;; no) schemas_install=false ;; *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for --disable-schemas-install" >&5 echo "$as_me: error: bad value ${enableval} for --disable-schemas-install" >&2;} { (exit 1); exit 1; }; } ;; esac else schemas_install=true fi; if test x$schemas_install = xtrue; then GCONF_SCHEMAS_INSTALL_TRUE= GCONF_SCHEMAS_INSTALL_FALSE='#' else GCONF_SCHEMAS_INSTALL_TRUE='#' GCONF_SCHEMAS_INSTALL_FALSE= fi # Scrollkeeper. # # Extract the first word of "scrollkeeper-config", so it can be a program name with args. set dummy scrollkeeper-config; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_SK_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $SK_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_SK_CONFIG="$SK_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_SK_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_SK_CONFIG" && ac_cv_path_SK_CONFIG="no" ;; esac fi SK_CONFIG=$ac_cv_path_SK_CONFIG if test -n "$SK_CONFIG"; then echo "$as_me:$LINENO: result: $SK_CONFIG" >&5 echo "${ECHO_T}$SK_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi if test x$SK_CONFIG = xno; then { { echo "$as_me:$LINENO: error: Couldn't find scrollkeeper-config." >&5 echo "$as_me: error: Couldn't find scrollkeeper-config." >&2;} { (exit 1); exit 1; }; } fi SCROLLKEEPER_BUILD_REQUIRED=0.3.5 # Checks for libraries. # # Check whether --enable-hamlib or --disable-hamlib was given. if test "${enable_hamlib+set}" = set; then enableval="$enable_hamlib" enable_hamlib=$enableval else enable_hamlib=no fi; if test "x$enable_hamlib" = "xyes"; then pkg_modules="libgnomeui-2.0 hamlib" else pkg_modules="libgnomeui-2.0" fi succeeded=no if test -z "$PKG_CONFIG"; then # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_path_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no" ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi fi if test "$PKG_CONFIG" = "no" ; then echo "*** The pkg-config script could not be found. Make sure it is" echo "*** in your path, or set the PKG_CONFIG environment variable" echo "*** to the full path to pkg-config." echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config." else PKG_CONFIG_MIN_VERSION=0.9.0 if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then echo "$as_me:$LINENO: checking for $pkg_modules" >&5 echo $ECHO_N "checking for $pkg_modules... $ECHO_C" >&6 if $PKG_CONFIG --exists "$pkg_modules" ; then echo "$as_me:$LINENO: result: yes" >&5 echo "${ECHO_T}yes" >&6 succeeded=yes echo "$as_me:$LINENO: checking PACKAGE_CFLAGS" >&5 echo $ECHO_N "checking PACKAGE_CFLAGS... $ECHO_C" >&6 PACKAGE_CFLAGS=`$PKG_CONFIG --cflags "$pkg_modules"` echo "$as_me:$LINENO: result: $PACKAGE_CFLAGS" >&5 echo "${ECHO_T}$PACKAGE_CFLAGS" >&6 echo "$as_me:$LINENO: checking PACKAGE_LIBS" >&5 echo $ECHO_N "checking PACKAGE_LIBS... $ECHO_C" >&6 PACKAGE_LIBS=`$PKG_CONFIG --libs "$pkg_modules"` echo "$as_me:$LINENO: result: $PACKAGE_LIBS" >&5 echo "${ECHO_T}$PACKAGE_LIBS" >&6 else PACKAGE_CFLAGS="" PACKAGE_LIBS="" ## If we have a custom action on failure, don't print errors, but ## do set a variable so people can do so. PACKAGE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$pkg_modules"` echo $PACKAGE_PKG_ERRORS fi else echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer." echo "*** See http://www.freedesktop.org/software/pkgconfig" fi fi if test $succeeded = yes; then : else { { echo "$as_me:$LINENO: error: Library requirements ($pkg_modules) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." >&5 echo "$as_me: error: Library requirements ($pkg_modules) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." >&2;} { (exit 1); exit 1; }; } fi if test "x$enable_hamlib" = "xyes"; then cat >>confdefs.h <<\_ACEOF #define WANT_HAMLIB 1 _ACEOF { echo "$as_me:$LINENO: Enabling hamlib support" >&5 echo "$as_me: Enabling hamlib support" >&6;} else cat >>confdefs.h <<\_ACEOF #define WANT_HAMLIB 0 _ACEOF { echo "$as_me:$LINENO: Disabling hamlib support" >&5 echo "$as_me: Disabling hamlib support" >&6;} fi # Checks for header files. echo "$as_me:$LINENO: checking for ANSI C header files" >&5 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 if test "${ac_cv_header_stdc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_header_stdc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } _ACEOF rm -f conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else echo "$as_me: program exited with status $ac_status" >&5 echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 echo "${ECHO_T}$ac_cv_header_stdc" >&6 if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi for ac_header in fcntl.h limits.h stdlib.h string.h sys/ioctl.h unistd.h dfftw.h fftw.h linux/ppdev.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` if eval "test \"\${$as_ac_Header+set}\" = set"; then echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 else # Is the header compilable? echo "$as_me:$LINENO: checking $ac_header usability" >&5 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_header_compiler=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f conftest.$ac_objext conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 echo "${ECHO_T}$ac_header_compiler" >&6 # Is the header present? echo "$as_me:$LINENO: checking $ac_header presence" >&5 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null; then if test -s conftest.err; then ac_cpp_err=$ac_c_preproc_warn_flag else ac_cpp_err= fi else ac_cpp_err=yes fi if test -z "$ac_cpp_err"; then ac_header_preproc=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 echo "${ECHO_T}$ac_header_preproc" >&6 # So? What about this header? case $ac_header_compiler:$ac_header_preproc in yes:no ) { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; no:yes ) { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} ( cat <<\_ASBOX ## ------------------------------------ ## ## Report this to bug-autoconf@gnu.org. ## ## ------------------------------------ ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac echo "$as_me:$LINENO: checking for $ac_header" >&5 echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 if eval "test \"\${$as_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else eval "$as_ac_Header=$ac_header_preproc" fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 fi if test `eval echo '${'$as_ac_Header'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Checks for typedefs, structures, and compiler characteristics. # echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6 if test "${ac_cv_c_const+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset x; /* SunOS 4.1.1 cc rejects this. */ char const *const *ccp; char **p; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; ccp = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++ccp; p = (char**) ccp; ccp = (char const *const *) p; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; } #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_const=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c_const=no fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 echo "${ECHO_T}$ac_cv_c_const" >&6 if test $ac_cv_c_const = no; then cat >>confdefs.h <<\_ACEOF #define const _ACEOF fi echo "$as_me:$LINENO: checking for inline" >&5 echo $ECHO_N "checking for inline... $ECHO_C" >&6 if test "${ac_cv_c_inline+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_cv_c_inline=no for ac_kw in inline __inline__ __inline; do cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifndef __cplusplus typedef int foo_t; static $ac_kw foo_t static_foo () {return 0; } $ac_kw foo_t foo () {return 0; } #endif _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c_inline=$ac_kw; break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest.$ac_ext done fi echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 echo "${ECHO_T}$ac_cv_c_inline" >&6 case $ac_cv_c_inline in inline | yes) ;; no) cat >>confdefs.h <<\_ACEOF #define inline _ACEOF ;; *) cat >>confdefs.h <<_ACEOF #define inline $ac_cv_c_inline _ACEOF ;; esac echo "$as_me:$LINENO: checking whether struct tm is in sys/time.h or time.h" >&5 echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6 if test "${ac_cv_struct_tm+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include int main () { struct tm *tp; tp->tm_sec; ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest.$ac_objext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_struct_tm=time.h else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_struct_tm=sys/time.h fi rm -f conftest.$ac_objext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_struct_tm" >&5 echo "${ECHO_T}$ac_cv_struct_tm" >&6 if test $ac_cv_struct_tm = sys/time.h; then cat >>confdefs.h <<\_ACEOF #define TM_IN_SYS_TIME 1 _ACEOF fi echo "$as_me:$LINENO: checking maximum warning verbosity option" >&5 echo $ECHO_N "checking maximum warning verbosity option... $ECHO_C" >&6 if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi echo "$as_me:$LINENO: result: $ac_compile_warnings_msg" >&5 echo "${ECHO_T}$ac_compile_warnings_msg" >&6 unset ac_compile_warnings_msg unset ac_compile_warnings_opt # Checks for library functions. # if test $ac_cv_c_compiler_gnu = yes; then echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5 echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6 if test "${ac_cv_prog_gcc_traditional+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_pattern="Autoconf.*'x'" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi echo "$as_me:$LINENO: result: $ac_cv_prog_gcc_traditional" >&5 echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6 if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi for ac_func in strftime do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF else # strftime is in -lintl on SCO UNIX. echo "$as_me:$LINENO: checking for strftime in -lintl" >&5 echo $ECHO_N "checking for strftime in -lintl... $ECHO_C" >&6 if test "${ac_cv_lib_intl_strftime+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char strftime (); int main () { strftime (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_lib_intl_strftime=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_strftime=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_lib_intl_strftime" >&5 echo "${ECHO_T}$ac_cv_lib_intl_strftime" >&6 if test $ac_cv_lib_intl_strftime = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_STRFTIME 1 _ACEOF LIBS="-lintl $LIBS" fi fi done for ac_func in vprintf do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF echo "$as_me:$LINENO: checking for _doprnt" >&5 echo $ECHO_N "checking for _doprnt... $ECHO_C" >&6 if test "${ac_cv_func__doprnt+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char _doprnt (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char _doprnt (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub__doprnt) || defined (__stub____doprnt) choke me #else char (*f) () = _doprnt; #endif #ifdef __cplusplus } #endif int main () { return f != _doprnt; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_func__doprnt=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func__doprnt=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: $ac_cv_func__doprnt" >&5 echo "${ECHO_T}$ac_cv_func__doprnt" >&6 if test $ac_cv_func__doprnt = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_DOPRNT 1 _ACEOF fi fi done echo "$as_me:$LINENO: checking for lrint" >&5 echo $ECHO_N "checking for lrint... $ECHO_C" >&6 if test "${ac_cv_c99_lrint+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lrint_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include int main () { if (!lrint(3.14159)) lrint(2.7183); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_lrint=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_lrint=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext CFLAGS=$lrint_save_CFLAGS fi echo "$as_me:$LINENO: result: $ac_cv_c99_lrint" >&5 echo "${ECHO_T}$ac_cv_c99_lrint" >&6 if test "$ac_cv_c99_lrint" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LRINT 1 _ACEOF fi echo "$as_me:$LINENO: checking for lrintf" >&5 echo $ECHO_N "checking for lrintf... $ECHO_C" >&6 if test "${ac_cv_c99_lrintf+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else lrintf_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include int main () { if (!lrintf(3.14159)) lrintf(2.7183); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_c99_lrintf=yes else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_c99_lrintf=no fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext CFLAGS=$lrintf_save_CFLAGS fi echo "$as_me:$LINENO: result: $ac_cv_c99_lrintf" >&5 echo "${ECHO_T}$ac_cv_c99_lrintf" >&6 if test "$ac_cv_c99_lrintf" = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LRINTF 1 _ACEOF fi for ac_func in floor ceil fmod memcpy memmove memset pow sqrt strcasecmp strchr strdup strerror strstr mkdir do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" { #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else char (*f) () = $ac_func; #endif #ifdef __cplusplus } #endif int main () { return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then eval "$as_ac_var=yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 if test `eval echo '${'$as_ac_var'}'` = yes; then cat >>confdefs.h <<_ACEOF #define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done # Check for this library last so that it doesn't kill checks # for the libc functions echo "$as_me:$LINENO: checking for library containing fftw_create_plan" >&5 echo $ECHO_N "checking for library containing fftw_create_plan... $ECHO_C" >&6 if test "${ac_cv_search_fftw_create_plan+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else ac_func_search_save_LIBS=$LIBS ac_cv_search_fftw_create_plan=no cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char fftw_create_plan (); int main () { fftw_create_plan (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_fftw_create_plan="none required" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext if test "$ac_cv_search_fftw_create_plan" = no; then for ac_lib in dfftw fftw; do LIBS="-l$ac_lib -lm $ac_func_search_save_LIBS" cat >conftest.$ac_ext <<_ACEOF #line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" #endif /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char fftw_create_plan (); int main () { fftw_create_plan (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then ac_cv_search_fftw_create_plan="-l$ac_lib" break else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext done fi LIBS=$ac_func_search_save_LIBS fi echo "$as_me:$LINENO: result: $ac_cv_search_fftw_create_plan" >&5 echo "${ECHO_T}$ac_cv_search_fftw_create_plan" >&6 if test "$ac_cv_search_fftw_create_plan" != no; then test "$ac_cv_search_fftw_create_plan" = "none required" || LIBS="$ac_cv_search_fftw_create_plan $LIBS" else { { echo "$as_me:$LINENO: error: FFTW libraries not found!!!" >&5 echo "$as_me: error: FFTW libraries not found!!!" >&2;} { (exit 1); exit 1; }; } fi # Output # ac_config_files="$ac_config_files Makefile gmfsk.spec help/Makefile help/gmfsk/Makefile help/gmfsk/C/Makefile m4/Makefile po/Makefile.in src/Makefile src/cw/Makefile src/feld/Makefile src/mfsk/Makefile src/misc/Makefile src/mt63/Makefile src/olivia/Makefile src/psk31/Makefile src/rtty/Makefile src/samplerate/Makefile src/throb/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${GCONF_SCHEMAS_INSTALL_TRUE}" && test -z "${GCONF_SCHEMAS_INSTALL_FALSE}"; then { { echo "$as_me:$LINENO: error: conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." >&5 echo "$as_me: error: conditional \"GCONF_SCHEMAS_INSTALL\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi # Support unset when possible. if (FOO=FOO; unset FOO) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -n "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" # Sed expression to map a string onto a valid variable name. as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by gmfsk $as_me 0.7pre1, which was generated by GNU Autoconf 2.57. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ gmfsk config.status 0.7pre1 configured by $0, generated by GNU Autoconf 2.57, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir INSTALL="$INSTALL" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # INIT-COMMANDS section. # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; "gmfsk.spec" ) CONFIG_FILES="$CONFIG_FILES gmfsk.spec" ;; "help/Makefile" ) CONFIG_FILES="$CONFIG_FILES help/Makefile" ;; "help/gmfsk/Makefile" ) CONFIG_FILES="$CONFIG_FILES help/gmfsk/Makefile" ;; "help/gmfsk/C/Makefile" ) CONFIG_FILES="$CONFIG_FILES help/gmfsk/C/Makefile" ;; "m4/Makefile" ) CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;; "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/cw/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/cw/Makefile" ;; "src/feld/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/feld/Makefile" ;; "src/mfsk/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/mfsk/Makefile" ;; "src/misc/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/misc/Makefile" ;; "src/mt63/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/mt63/Makefile" ;; "src/olivia/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/olivia/Makefile" ;; "src/psk31/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/psk31/Makefile" ;; "src/rtty/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/rtty/Makefile" ;; "src/samplerate/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/samplerate/Makefile" ;; "src/throb/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/throb/Makefile" ;; "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t s,@CYGPATH_W@,$CYGPATH_W,;t t s,@PACKAGE@,$PACKAGE,;t t s,@VERSION@,$VERSION,;t t s,@ACLOCAL@,$ACLOCAL,;t t s,@AUTOCONF@,$AUTOCONF,;t t s,@AUTOMAKE@,$AUTOMAKE,;t t s,@AUTOHEADER@,$AUTOHEADER,;t t s,@MAKEINFO@,$MAKEINFO,;t t s,@AMTAR@,$AMTAR,;t t s,@install_sh@,$install_sh,;t t s,@STRIP@,$STRIP,;t t s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t s,@AWK@,$AWK,;t t s,@SET_MAKE@,$SET_MAKE,;t t s,@am__leading_dot@,$am__leading_dot,;t t s,@MAINTAINER_MODE_TRUE@,$MAINTAINER_MODE_TRUE,;t t s,@MAINTAINER_MODE_FALSE@,$MAINTAINER_MODE_FALSE,;t t s,@MAINT@,$MAINT,;t t s,@GETTEXT_PACKAGE@,$GETTEXT_PACKAGE,;t t s,@CC@,$CC,;t t s,@CFLAGS@,$CFLAGS,;t t s,@LDFLAGS@,$LDFLAGS,;t t s,@CPPFLAGS@,$CPPFLAGS,;t t s,@ac_ct_CC@,$ac_ct_CC,;t t s,@EXEEXT@,$EXEEXT,;t t s,@OBJEXT@,$OBJEXT,;t t s,@DEPDIR@,$DEPDIR,;t t s,@am__include@,$am__include,;t t s,@am__quote@,$am__quote,;t t s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t s,@CCDEPMODE@,$CCDEPMODE,;t t s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t s,@CPP@,$CPP,;t t s,@EGREP@,$EGREP,;t t s,@USE_NLS@,$USE_NLS,;t t s,@MSGFMT@,$MSGFMT,;t t s,@GMSGFMT@,$GMSGFMT,;t t s,@XGETTEXT@,$XGETTEXT,;t t s,@CATALOGS@,$CATALOGS,;t t s,@CATOBJEXT@,$CATOBJEXT,;t t s,@DATADIRNAME@,$DATADIRNAME,;t t s,@GMOFILES@,$GMOFILES,;t t s,@INSTOBJEXT@,$INSTOBJEXT,;t t s,@INTLLIBS@,$INTLLIBS,;t t s,@PO_IN_DATADIR_TRUE@,$PO_IN_DATADIR_TRUE,;t t s,@PO_IN_DATADIR_FALSE@,$PO_IN_DATADIR_FALSE,;t t s,@POFILES@,$POFILES,;t t s,@POSUB@,$POSUB,;t t s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t s,@CXX@,$CXX,;t t s,@CXXFLAGS@,$CXXFLAGS,;t t s,@ac_ct_CXX@,$ac_ct_CXX,;t t s,@CXXDEPMODE@,$CXXDEPMODE,;t t s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t s,@RANLIB@,$RANLIB,;t t s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t s,@RPMBUILD@,$RPMBUILD,;t t s,@GCONFTOOL@,$GCONFTOOL,;t t s,@GCONF_SCHEMA_CONFIG_SOURCE@,$GCONF_SCHEMA_CONFIG_SOURCE,;t t s,@GCONF_SCHEMA_FILE_DIR@,$GCONF_SCHEMA_FILE_DIR,;t t s,@GCONF_SCHEMAS_INSTALL_TRUE@,$GCONF_SCHEMAS_INSTALL_TRUE,;t t s,@GCONF_SCHEMAS_INSTALL_FALSE@,$GCONF_SCHEMAS_INSTALL_FALSE,;t t s,@SK_CONFIG@,$SK_CONFIG,;t t s,@SCROLLKEEPER_BUILD_REQUIRED@,$SCROLLKEEPER_BUILD_REQUIRED,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@PACKAGE_CFLAGS@,$PACKAGE_CFLAGS,;t t s,@PACKAGE_LIBS@,$PACKAGE_LIBS,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_builddir$INSTALL ;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo $f;; *) # Relative if test -f "$f"; then # Build tree echo $f elif test -f "$srcdir/$f"; then # Source tree echo $srcdir/$f else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t s,@INSTALL@,$ac_INSTALL,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_HEADER section. # # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='[ ].*$,\1#\2' ac_dC=' ' ac_dD=',;t' # ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='$,\1#\2define\3' ac_uC=' ' ac_uD=',;t' for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo $f;; *) # Relative if test -f "$f"; then # Build tree echo $f elif test -f "$srcdir/$f"; then # Source tree echo $srcdir/$f else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } # Remove the trailing spaces. sed 's/[ ]*$//' $ac_file_inputs >$tmp/in _ACEOF # Transform confdefs.h into two sed scripts, `conftest.defines' and # `conftest.undefs', that substitutes the proper values into # config.h.in to produce config.h. The first handles `#define' # templates, and the second `#undef' templates. # And first: Protect against being on the right side of a sed subst in # config.status. Protect against being in an unquoted here document # in config.status. rm -f conftest.defines conftest.undefs # Using a here document instead of a string reduces the quoting nightmare. # Putting comments in sed scripts is not portable. # # `end' is used to avoid that the second main sed command (meant for # 0-ary CPP macros) applies to n-ary macro definitions. # See the Autoconf documentation for `clear'. cat >confdef2sed.sed <<\_ACEOF s/[\\&,]/\\&/g s,[\\$`],\\&,g t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp t end s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp : end _ACEOF # If some macros were called several times there might be several times # the same #defines, which is useless. Nevertheless, we may not want to # sort them, since we want the *last* AC-DEFINE to be honored. uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs rm -f confdef2sed.sed # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >>conftest.undefs <<\_ACEOF s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, _ACEOF # Break up conftest.defines because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS echo ' :' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.defines >/dev/null do # Write a limited-size here document to $tmp/defines.sed. echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#define' lines. echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/defines.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail rm -f conftest.defines mv conftest.tail conftest.defines done rm -f conftest.defines echo ' fi # grep' >>$CONFIG_STATUS echo >>$CONFIG_STATUS # Break up conftest.undefs because some shells have a limit on the size # of here documents, and old seds have small limits too (100 cmds). echo ' # Handle all the #undef templates' >>$CONFIG_STATUS rm -f conftest.tail while grep . conftest.undefs >/dev/null do # Write a limited-size here document to $tmp/undefs.sed. echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS # Speed up: don't consider the non `#undef' echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS # Work around the forget-to-reset-the-flag bug. echo 't clr' >>$CONFIG_STATUS echo ': clr' >>$CONFIG_STATUS sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS echo 'CEOF sed -f $tmp/undefs.sed $tmp/in >$tmp/out rm -f $tmp/in mv $tmp/out $tmp/in ' >>$CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail rm -f conftest.undefs mv conftest.tail conftest.undefs done rm -f conftest.undefs cat >>$CONFIG_STATUS <<\_ACEOF # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then echo "/* Generated by configure. */" >$tmp/config.h else echo "/* $ac_file. Generated by configure. */" >$tmp/config.h fi cat $tmp/in >>$tmp/config.h rm -f $tmp/in if test x"$ac_file" != x-; then if diff $ac_file $tmp/config.h >/dev/null 2>&1; then { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 echo "$as_me: $ac_file is unchanged" >&6;} else ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } rm -f $ac_file mv $tmp/config.h $ac_file fi else cat $tmp/config.h rm -f $tmp/config.h fi # Compute $ac_file's index in $config_headers. _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $ac_file | $ac_file:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || $as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X$ac_file : 'X\(//\)[^/]' \| \ X$ac_file : 'X\(//\)$' \| \ X$ac_file : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X$ac_file | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'`/stamp-h$_am_stamp_count done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # # CONFIG_COMMANDS section. # for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue ac_dest=`echo "$ac_file" | sed 's,:.*,,'` ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_dir=`(dirname "$ac_dest") 2>/dev/null || $as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_dest" : 'X\(//\)[^/]' \| \ X"$ac_dest" : 'X\(//\)$' \| \ X"$ac_dest" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_dest" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be # absolute. ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd` ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd` ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd` ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd` { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 echo "$as_me: executing $ac_dest commands" >&6;} case $ac_dest in depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # So let's grep whole file. if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then dirpart=`(dirname "$mf") 2>/dev/null || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` else continue fi grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue # Extract the definition of DEP_FILES from the Makefile without # running `make'. DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"` test -z "$DEPDIR" && continue # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n -e '/^U = / s///p' < "$mf"` test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" # We invoke sed twice because it is the simplest approach to # changing $(DEPDIR) to its actual value in the expansion. for file in `sed -n -e ' /^DEP_FILES = .*\\\\$/ { s/^DEP_FILES = // :loop s/\\\\$// p n /\\\\$/ b loop p } /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`(dirname "$file") 2>/dev/null || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p $dirpart/$fdir else as_dir=$dirpart/$fdir as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; default-1 ) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; esac done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi gmfsk-0.7pre1/configure.in0000644000076400007640000000530110206155254011260 # Process this file with autoconf to produce a configure script. # AC_PREREQ(2.57) AC_INIT([gmfsk], [0.7pre1], [oh2bns@sral.fi]) AC_CONFIG_SRCDIR([configure.in]) AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE AM_MAINTAINER_MODE AH_TEMPLATE([GETTEXT_PACKAGE], [Gettext domain name]) AH_TEMPLATE([WANT_HAMLIB], [Define to 1 if hamlib support is wanted]) GETTEXT_PACKAGE=gmfsk AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE") # Supported languages. # ALL_LINGUAS="fi sk" AM_GLIB_GNU_GETTEXT # Checks for programs. # AC_PROG_CXX AC_PROG_CC AC_PROG_MAKE_SET AC_PROG_RANLIB AC_CHECK_PROGS(RPMBUILD, rpmbuild, rpm) # GConf (some systems hide gconftool in strange places...) # AC_PATH_PROG([GCONFTOOL], [gconftool-2], [], [$PATH:/opt/gnome/bin:/opt/gnome2/bin]) AM_GCONF_SOURCE_2 # Scrollkeeper. # AC_PATH_PROG(SK_CONFIG, scrollkeeper-config, no) if test x$SK_CONFIG = xno; then AC_MSG_ERROR([Couldn't find scrollkeeper-config.]) fi SCROLLKEEPER_BUILD_REQUIRED=0.3.5 AC_SUBST(SCROLLKEEPER_BUILD_REQUIRED) # Checks for libraries. # AC_ARG_ENABLE(hamlib, AC_HELP_STRING([--enable-hamlib], [Add support for hamradio control libraries]), [enable_hamlib=$enableval], [enable_hamlib=no]) if test "x$enable_hamlib" = "xyes"; then pkg_modules="libgnomeui-2.0 hamlib" else pkg_modules="libgnomeui-2.0" fi PKG_CHECK_MODULES(PACKAGE, [$pkg_modules]) AC_SUBST(PACKAGE_CFLAGS) AC_SUBST(PACKAGE_LIBS) if test "x$enable_hamlib" = "xyes"; then AC_DEFINE(WANT_HAMLIB, 1) AC_MSG_NOTICE([Enabling hamlib support]) else AC_DEFINE(WANT_HAMLIB, 0) AC_MSG_NOTICE([Disabling hamlib support]) fi # Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h limits.h stdlib.h string.h sys/ioctl.h unistd.h dfftw.h fftw.h linux/ppdev.h]) # Checks for typedefs, structures, and compiler characteristics. # AC_C_CONST AC_C_INLINE AC_STRUCT_TM AC_COMPILE_WARNINGS # Checks for library functions. # AC_PROG_GCC_TRADITIONAL AC_FUNC_STRFTIME AC_FUNC_VPRINTF AC_C99_FUNC_LRINT AC_C99_FUNC_LRINTF AC_CHECK_FUNCS([floor ceil fmod memcpy memmove memset pow sqrt strcasecmp strchr strdup strerror strstr mkdir]) # Check for this library last so that it doesn't kill checks # for the libc functions AC_SEARCH_LIBS([fftw_create_plan], [dfftw fftw],, [AC_MSG_ERROR([FFTW libraries not found!!!])], [-lm]) # Output # AC_CONFIG_FILES([Makefile gmfsk.spec help/Makefile help/gmfsk/Makefile help/gmfsk/C/Makefile m4/Makefile po/Makefile.in src/Makefile src/cw/Makefile src/feld/Makefile src/mfsk/Makefile src/misc/Makefile src/mt63/Makefile src/olivia/Makefile src/psk31/Makefile src/rtty/Makefile src/samplerate/Makefile src/throb/Makefile]) AC_OUTPUT gmfsk-0.7pre1/depcomp0000755000076400007640000002753307606111630010337 #! /bin/sh # depcomp - compile a program generating dependencies as side-effects # Copyright 1999, 2000 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # `libtool' can also be set to `yes' or `no'. if test -z "$depfile"; then base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` dir=`echo "$object" | sed 's,/.*$,/,'` if test "$dir" = "$object"; then dir= fi # FIXME: should be _deps on DOS. depfile="$dir.deps/$base" fi tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. This file always lives in the current directory. # Also, the AIX compiler puts `$object:' at the start of each line; # $object doesn't have directory information. stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'` tmpdepfile="$stripped.u" outname="$stripped.o" if test "$libtool" = yes; then "$@" -Wc,-M else "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1="$dir.libs/$base.lo.d" tmpdepfile2="$dir.libs/$base.d" "$@" -Wc,-MD else tmpdepfile1="$dir$base.o.d" tmpdepfile2="$dir$base.d" "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi if test -f "$tmpdepfile1"; then tmpdepfile="$tmpdepfile1" else tmpdepfile="$tmpdepfile2" fi if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a space and a tab in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. We will use -o /dev/null later, # however we can't do the remplacement now because # `-o $object' might simply not be used IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M "$@" -o /dev/null $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; -*) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the proprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 gmfsk-0.7pre1/gmfsk.spec.in0000644000076400007640000000346310164611016011342 # gmfsk.spec # %define name gmfsk %define version @VERSION@ %define release 1 %define skreq @SCROLLKEEPER_BUILD_REQUIRED@ Summary: Gnome MFSK, RTTY, THROB, PSK31, MT63 and HELLSCHREIBER terminal Name: %{name} Version: %{version} Release: %{release} License: GPL Group: Applications/Communications Source: ftp://ftp.hes.iki.fi/pub/ham/unix/linux/hfmodems/%{name}-%{version}.tar.gz BuildRoot: /var/tmp/%{name}-root BuildRequires: scrollkeeper >= %skreq %description gMFSK is a terminal program for MFSK, RTTY, THROB, PSK31, MT63 and HELLSCHREIBER. %prep %setup -q %build %configure --enable-hamlib make %install rm -rf $RPM_BUILD_ROOT export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 %makeinstall unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL rm -rf $RPM_BUILD_ROOT/var/lib/scrollkeeper/ %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc AUTHORS COPYING COPYING-DOCS ChangeLog INSTALL NEWS README %{_bindir}/%{name} %{_datadir}/pixmaps/%{name} %{_datadir}/fonts/feldhell %{_datadir}/omf/%{name} %{_datadir}/gnome/help/%{name} %{_datadir}/locale/*/LC_MESSAGES/%{name}.mo %{_sysconfdir}/gconf/schemas/%{name}.schemas %post if which scrollkeeper-update >/dev/null 2>&1; then echo "Doing scrollkeeper update." scrollkeeper-update -q -o %{_datadir}/omf/%{name} fi if which gconftool-2 >/dev/null 2>&1; then echo "Installing gconf schema." export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/%{name}.schemas > /dev/null fi %postun if which scrollkeeper-update >/dev/null 2>&1; then scrollkeeper-update -q fi %changelog * Mon Jul 14 2003 Tomi Manninen - Added gconf stuff %changelog * Fri May 30 2003 Tomi Manninen - Updated for version 0.5.1 * Sat Apr 28 2001 Tomi Manninen - Create. gmfsk-0.7pre1/install-sh0000755000076400007640000001270107606111624010760 #!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else : fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=$mkdirprog fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f "$src" ] || [ -d "$src" ] then : else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else : fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else : fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else : fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else : fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 gmfsk-0.7pre1/missing0000755000076400007640000002403607606111627010362 #! /bin/sh # Common stub for a few missing GNU programs while installing. # Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch]" ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing 0.4 - GNU automake" ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; aclocal*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. You can get \`$1Help2man' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then # We have makeinfo, but it failed. exit 1 fi echo 1>&2 "\ WARNING: \`$1' is missing on your system. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` fi touch $file ;; tar) shift if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 fi # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and you do not seem to have it handy on your system. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequirements for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 gmfsk-0.7pre1/mkinstalldirs0000755000076400007640000000341107606111626011562 #! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case "${1}" in -h | --help | --h* ) # -h for help echo "${usage}" 1>&2; exit 0 ;; -m ) # -m PERM arg shift test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; } dirmode="${1}" shift ;; -- ) shift; break ;; # stop option processing -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option * ) break ;; # first non-opt arg esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case "$pathcomp" in -* ) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 3 # End: # mkinstalldirs ends here gmfsk-0.7pre1/COPYING-DOCS0000644000076400007640000004327507665516215010561 GNU Free Documentation License Version 1.1, March 2000 Copyright (C) 2000 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other written document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section entitled "History", and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. In any section entitled "Acknowledgements" or "Dedications", preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section as "Endorsements" or to conflict in title with any Invariant Section. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections entitled "History" in the various original documents, forming one section entitled "History"; likewise combine any sections entitled "Acknowledgements", and any sections entitled "Dedications". You must delete all sections entitled "Endorsements." 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an "aggregate", and this License does not apply to the other self-contained works thus compiled with the Document, on account of their being thus compiled, if they are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have no Invariant Sections, write "with no Invariant Sections" instead of saying which ones are invariant. If you have no Front-Cover Texts, write "no Front-Cover Texts" instead of "Front-Cover Texts being LIST"; likewise for Back-Cover Texts. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. gmfsk-0.7pre1/autogen.sh0000755000076400007640000001063007730201147010752 #!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` test -z "$srcdir" && srcdir=. DIE=0 if [ -n "$GNOME2_DIR" ]; then ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS" LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH" PATH="$GNOME2_DIR/bin:$PATH" export PATH export LD_LIBRARY_PATH fi (test -f $srcdir/configure.in) || { echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" echo " top-level package directory" exit 1 } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`autoconf' installed." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } (grep "^AC_PROG_INTLTOOL" $srcdir/configure.in >/dev/null) && { (intltoolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`intltool' installed." echo "You can get it from:" echo " ftp://ftp.gnome.org/pub/GNOME/" DIE=1 } } (grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.in >/dev/null) && { (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`xml-i18n-toolize' installed." echo "You can get it from:" echo " ftp://ftp.gnome.org/pub/GNOME/" DIE=1 } } (grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && { (libtool --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`libtool' installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 } } (grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.in >/dev/null) && { (grep "sed.*POTFILES" $srcdir/configure.in) > /dev/null || \ (glib-gettextize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`glib' installed." echo "You can get it from: ftp://ftp.gtk.org/pub/gtk" DIE=1 } } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`automake' installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 NO_AUTOMAKE=yes } # if no automake, don't bother testing for aclocal test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: Missing \`aclocal'. The version of \`automake'" echo "installed doesn't appear recent enough." echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi if test -z "$*"; then echo "**Warning**: I am going to run \`configure' with no arguments." echo "If you wish to pass any to it, please specify them on the" echo \`$0\'" command line." echo fi case $CC in xlc ) am_opt=--include-deps;; esac for coin in `find $srcdir -path $srcdir/CVS -prune -o -name configure.in -print` do dr=`dirname $coin` if test -f $dr/NO-AUTO-GEN; then echo skipping $dr -- flagged as no auto-gen else echo processing $dr ( cd $dr aclocalinclude="$ACLOCAL_FLAGS" if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then echo "Creating $dr/aclocal.m4 ..." test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 echo "Running glib-gettextize... Ignore non-fatal messages." echo "no" | glib-gettextize --force --copy echo "Making $dr/aclocal.m4 writable ..." test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 fi if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then echo "Running intltoolize..." intltoolize --copy --force --automake fi if grep "^AM_PROG_XML_I18N_TOOLS" configure.in >/dev/null; then echo "Running xml-i18n-toolize..." xml-i18n-toolize --copy --force --automake fi if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then if test -z "$NO_LIBTOOLIZE" ; then echo "Running libtoolize..." libtoolize --force --copy fi fi echo "Running aclocal $aclocalinclude ..." aclocal $aclocalinclude if grep "^AC_CONFIG_HEADER" configure.in >/dev/null; then echo "Running autoheader..." autoheader fi echo "Running automake --gnu $am_opt ..." automake --add-missing --gnu $am_opt echo "Running autoconf ..." autoconf ) fi done conf_flags="--enable-maintainer-mode" if test x$NOCONFIGURE = x; then echo Running $srcdir/configure $conf_flags "$@" ... $srcdir/configure $conf_flags "$@" \ && echo Now type \`make\' to compile. || exit 1 else echo Skipping configure process. fi gmfsk-0.7pre1/gmfsk.glade0000644000076400007640000130105210206176466011067 True gMFSK GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True True True True GTK_SHADOW_NONE True True _File True True _Send file... True True True _Log to file True False True True Clear _TX window True True Clear _RX window True True True GNOMEUIINFO_MENU_EXIT_ITEM True _Mode True True MFSK16 True True True MFSK8 True False mfsk1 True OLIVIA True False mfsk1 True RTTY True False mfsk1 True THROB (1 tps) True False mfsk1 True THROB (2 tps) True False mfsk1 True THROB (4 tps) True False mfsk1 True PSK31 (BPSK) True False mfsk1 True PSK31 (QPSK) True False mfsk1 True PSK63 True False mfsk1 True MT63 True False mfsk1 True FELDHELL True False mfsk1 True CW True False mfsk1 True _Settings True True GNOMEUIINFO_MENU_PREFERENCES_ITEM True _Configure macros True True macro 1 True True macro 2 True True macro 3 True True macro 4 True True macro 5 True True macro 6 True True macro 7 True True macro 8 True True macro 9 True True macro 10 True True macro 11 True True macro 12 True True _Help True True _Contents True True gtk-help 1 0.5 0.5 0 0 True GNOMEUIINFO_MENU_ABOUT_ITEM BONOBO_DOCK_TOP 0 0 0 BONOBO_DOCK_ITEM_BEH_EXCLUSIVE True GTK_SHADOW_NONE True GTK_ORIENTATION_HORIZONTAL GTK_TOOLBAR_ICONS True True Suspend the modem and release soundcard (Ctl+Z) Pause True pause.xpm False False True Switch to receive (Ctl+R) Receive True rx.xpm True False pausebutton True True True Switch to transmit (Ctl+T) Transmit True tx.xpm False False pausebutton True Abort transmission immediately (Ctl+X) Abort True gtk-stop True True True Send tune signal (Ctl+U) Tune True tune.xpm False False pausebutton True True BONOBO_DOCK_TOP 1 0 0 BONOBO_DOCK_ITEM_BEH_EXCLUSIVE True False 0 True 2 9 False 1 0 True Name False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 4 5 0 1 4 fill True Rcvd RST False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 2 3 1 2 4 fill True Sent RST False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 2 3 0 1 4 fill True Call False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 fill True Band False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 fill True True True True 0 True * False 6 3 4 0 1 True True True True 0 True * False 6 3 4 1 2 70 True True True True 0 True * False 1 2 0 1 True True True True 0 True * False 7 8 0 1 True True True True 0 True * False 7 8 1 2 True QTH False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 6 7 0 1 4 fill True Notes False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 6 7 1 2 4 fill True Locator False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 4 5 1 2 4 fill True Clear QSO data fields (Ctl-N) True New entry True GTK_RELIEF_NORMAL 8 9 1 2 4 fill 70 True True True True 0 True * False 5 6 0 1 fill 70 True True True True 0 True * False 5 6 1 2 fill True Send QSO data to xlog (Ctl-L) True Log entry True GTK_RELIEF_NORMAL 8 9 0 1 4 fill 4 False False True False True GTK_POS_TOP False False True False 0 True GTK_POLICY_AUTOMATIC GTK_POLICY_ALWAYS GTK_SHADOW_IN GTK_CORNER_TOP_LEFT 2 200 True False GTK_JUSTIFY_LEFT GTK_WRAP_WORD True 0 0 0 0 0 0 0 True True True GTK_POLICY_AUTOMATIC GTK_POLICY_ALWAYS GTK_SHADOW_IN GTK_CORNER_TOP_LEFT 2 50 True True True True GTK_JUSTIFY_LEFT GTK_WRAP_WORD True 0 0 0 0 0 0 0 True True False True True textmodes False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab True False 0 True False 0 True papertape_new 0 0 Sat, 05 Apr 2003 23:49:01 GMT 1 True True True papertape_new 0 0 Sat, 05 Apr 2003 23:49:07 GMT 1 True True True papertape_new 0 0 Sat, 05 Apr 2003 23:49:14 GMT 1 True True True papertape_new 0 0 Sat, 05 Apr 2003 23:49:18 GMT 1 True True 0 True True True True True True 0 True * False 2 False False False True True hellmodes False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 0 True True True True 0 True True 0 True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True 4 True True True True 0 True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True 4 True True 4 False False True True 0 True True 0 True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True 4 True True True True 0 True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True True Click right button to edit macro True GTK_RELIEF_NORMAL 2 True True 4 True True 0 False False True 2 False False True False 0 True waterfall_new 0 0 Sat, 26 Oct 2002 16:27:00 GMT 2 True True True 4 False False True False 0 True False 0 True Freq False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 4 False False True True 1 1 True GTK_UPDATE_ALWAYS False False 1001 0 4000 1 10 10 2 True True True Center frequency on RX pass band True GTK_RELIEF_NORMAL 15 True gtk-justify-center 4 0.5 0.5 0 0 2 False False 2 True True True False 0 True Automatic frequency control AFC True GTK_RELIEF_NORMAL False False True 1 False False True Squelch SQL True GTK_RELIEF_NORMAL False False True 1 False False True Reverse polarity REV True GTK_RELIEF_NORMAL False False True 1 False False 2 True True True False 2 True miniscope_new 0 0 Fri, 08 Nov 2002 19:29:37 GMT 2 True True 64 64 True gtk_dial_new 0 100 Sat, 04 Jan 2003 18:24:28 GMT 2 False True 2 True True 0 False False 0 False False True False 0 2 True False 0 True True 2 90 True False 2 False True True GDK_BUTTON_PRESS_MASK 2 80 True False 2 False True True clock False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 4 False False 0 False False 0 True True True False mfsk.png Copyright 2001-2005 Tomi Manninen, OH2BNS A Gnome terminal program for HF conversation modes (MFSK, OLIVIA, RTTY, THROB, PSK31, MT63 and FeldHell) Author: Tomi Manninen, OH2BNS <oh2bns@sral.fi>. MFSK modem: Help for pictures support from Denis, UU9JDR. RTTY modem: Ideas from Jesús, EB1DIX. THROB modem: Ideas from Lionel, G3PPT. PSK31 modem: Ideas from Hansi, DL9RDZ. MT63 and OLIVIA modem: Written by Pawel, SP9VRC. CW modem: Written by Lawrence, VE7IT with ideas and code from the Unix-Cw project by Simon, G0FRD. Original FeldHell font: Peter, G3PLX. Other FeldHell fonts: Nino, IZ8BLY. translator_credits 10 True Select File to Transmit GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False False True True True gtk-cancel True GTK_RELIEF_NORMAL True True True gtk-ok True GTK_RELIEF_NORMAL True True Pause True False True True Waterfall True True True Spectrum True False waterfall1 True Scope True False waterfall1 True True Waterfall properties... True True Preferences GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-help True GTK_RELIEF_NORMAL -11 True True True gtk-close True GTK_RELIEF_NORMAL -7 0 False True GTK_PACK_END True False 0 True False 0 160 350 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN GTK_CORNER_TOP_LEFT True True False False False True 0 True True 6 True True True False True GTK_POS_TOP False False True <span font_desc="Serif Italic 48" foreground="grey50">gMFSK</span> False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 False True True Logo False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab True False 0 4 True False 0 True The station information is used in the macros like $mycall, $myname, etc. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 5 2 False 0 0 True Callsign False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Name False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 1 2 4 4 fill True QTH False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 2 3 4 4 fill True Locator False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 3 4 4 4 fill True E-mail False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 4 5 4 4 fill True True True True 0 True * False 1 2 0 1 4 2 True True True True 0 True * False 1 2 1 2 4 2 True True True True 0 True * False 1 2 2 3 4 2 True True True True 0 True * False 1 2 3 4 4 2 True True True True 0 True * False 1 2 4 5 4 2 0 True True 0 True True False True True Station False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 tab 4 True False 0 True These are used in the $date and $date macros. See the strftime manual page for an explanation of the format. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 2 2 False 0 0 True Time format string False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Date format string False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill True See the strftime manual page for explanation of this field True True True 0 True * False 1 2 0 1 4 2 True See the strftime manual page for explanation of this field True True True 0 True * False 1 2 1 2 4 2 0 True True False True True Time False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True This is a comma separated list of bands you want to appear in the Bands popdown list. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True True True True 0 True * False 8 False False False True True Bands False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True Files and directories used by gMFSK. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False False True 3 2 False 0 0 True True True True 0 True * False 1 2 0 1 4 2 True Log file name False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 0 1 4 2 fill True TX pictures directory False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 1 2 4 2 fill True RX pictures directory False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 2 3 4 2 fill True True True True 0 True * False 1 2 1 2 4 2 True True True True 0 True * False 1 2 2 3 4 2 0 True True False True True Files False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 tab 4 True False 0 True The color settings let you configure the colors used in the RX and TX windows. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 5 2 False 0 0 True True True False Pick a color 0 1 0 1 4 2 fill True True True False Pick a color 0 1 1 2 4 2 fill True True True False Pick a color 0 1 2 3 4 2 fill True True True False Pick a color 0 1 3 4 4 2 fill True True True False Pick a color 0 1 4 5 4 2 fill True Received text color False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 1 2 0 1 2 True Transmitted text color False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 1 2 1 2 2 True HIghlighted text color False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 1 2 2 3 2 True RX window background color False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 1 2 3 4 2 True TX window background color False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 1 2 4 5 2 0 True True False True True Colors False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True The fonts settings let you configure the fonts used in the RX and TX windows. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 2 2 False 0 0 True Received text font False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 1 2 0 1 4 True Transmitted text font False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 1 2 1 2 4 True True GNOME_FONT_PICKER_MODE_PIXMAP True False 14 0 1 1 2 4 2 fill True True GNOME_FONT_PICKER_MODE_PIXMAP True False 14 0 1 0 1 4 2 fill 0 True True False True True Fonts False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 tab 4 True False 0 True These settings affect all modems. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 1 2 False 0 0 True True 1 1 True GTK_UPDATE_IF_VALID False True 0 -1000 1000 1 10 10 1 2 0 1 2 True TX offset frequency False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill 0 False True False True True All False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True MFSK16 and MFSK8 modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False False True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False True True True MFSK False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True OLIVIA modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False False True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True False 0 True 4 2 False 0 0 2 True True 0 True True 125 Hz True True 250 Hz True True 500 Hz True True 1000 Hz True True 2000 Hz True 1 2 1 2 2 True True 0 True True 4 True True 8 True True 16 True True 32 True True 64 True True 128 True True 256 True 1 2 0 1 True Tones False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Bandwidth False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill True RX sync search margin False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 2 3 4 4 fill True RX sync integration period False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 3 4 4 4 fill True True 1 0 False GTK_UPDATE_ALWAYS False False 8 2 128 1 10 10 1 2 2 3 2 2 True True 1 0 False GTK_UPDATE_ALWAYS False False 4 2 128 1 10 10 1 2 3 4 2 2 0 False False 4 True True Allow 8 bit characters (escape-127 method) True GTK_RELIEF_NORMAL False False True 2 False False True Modem settings False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 True True 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False False True True OLIVIA False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True RTTY modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True False 0 True 5 2 False 0 0 2 True True 0 True True none True True even True True odd True True zero True True one True 1 2 3 4 fill 2 True True 0 True True 1 True True 1.5 True True 2 True 1 2 4 5 fill 2 True True 0 True True 5 (BAUDOT) True True 7 (ASCII) True True 8 (ASCII) True 1 2 2 3 fill 2 True False True False True False True True True True 0 True * False True GTK_SELECTION_BROWSE True True 23 True True 85 True True 160 True True 170 True True 182 True True 200 True True 240 True True 350 True True 425 True True 850 1 2 0 1 2 True False True False True False True True True True 0 True * False True GTK_SELECTION_BROWSE True True 45 True True 45.45 True True 50 True True 56 True True 75 True True 100 True True 110 True True 150 True True 200 True True 300 1 2 1 2 True Shift False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Baudrate False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill True Bits False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 2 3 4 4 fill True Parity False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 3 4 4 4 fill True Stopbits False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 4 5 4 4 fill 0 False False 4 True If tones should be reversed for RTTY True Reverse polarity True GTK_RELIEF_NORMAL False False True 2 False False 4 True If most significant bit should the transmitted first True Send MSB first True GTK_RELIEF_NORMAL False False True 2 False False True Modem settings False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 True True 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False False True True RTTY False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 tab 4 True False 0 True THROB modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False False True True THROB False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True BPSK31, QPSK31 and PSK63 modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False False True True PSK31 False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True MT63 modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True False 0 True 2 2 False 0 0 2 True True 0 True True 32 (short) True True 64 (long) True 1 2 1 2 2 True True 0 True True 500 Hz True True 1000 Hz True True 2000 Hz True 1 2 0 1 True Bandwidth False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Interleave False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill 0 False False 4 True True CW Identification True GTK_RELIEF_NORMAL False False True 2 False False 4 True True Allow 8 bit characters (escape-127 method) True GTK_RELIEF_NORMAL False False True 2 False False True Modem settings False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 True True 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False False True True MT63 False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True FELDHELL modem parameters. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 2 2 False 0 0 True Force upper case False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 1 2 4 4 fill True Hellschreiber font False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 0 1 4 4 fill True True True GTK_RELIEF_NORMAL False False True 1 2 1 2 4 4 fill True True GNOME_FONT_PICKER_MODE_PIXMAP True False 14 1 2 0 1 4 4 fill 0 False False 4 True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 250 0 500 5 5 0 True Filter BW False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 1 GTK_UPDATE_DISCONTINUOUS True 5 0 10 1 1 0 True AGC attack False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 500 0 1000 10 10 0 True AGC decay False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True 4 True True 0 True True False True True HELL False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True CW modem parameters. New parametes take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 0 0 100 1 5 0 True Squelch False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 75 0 300 1 5 0 True Filter BW False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False False True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_DISCONTINUOUS True 18 5 60 1 5 0 True Speed (WPM) False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False False 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False False True True CW False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True Settings for the waterfall/scope display. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_CONTINUOUS True -0 -50 0 5 5 0 True Ref level False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True True True GTK_POS_BOTTOM 0 GTK_UPDATE_CONTINUOUS True 100 10 100 5 5 0 True Amp span False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 False True True 0 0.5 GTK_SHADOW_ETCHED_IN True False 0 True 4 2 False 0 0 True Mode False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Zoom False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill True Speed False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 2 3 4 4 fill True Window False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 3 4 4 4 fill 2 True True 0 True True Waterfall True True Spectrum True True Scope True 1 2 0 1 2 True True 0 True True x 1 True True x 2 True True x 4 True 1 2 1 2 2 True True 0 True True Half True True Normal True True Double True 1 2 2 3 2 True True 0 True True Boxcar True True Triangular True True Hamming True 1 2 3 4 0 False False 4 True True Waterfall scrolls upwards True GTK_RELIEF_NORMAL False False True 2 False False True Settings False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 True True 0 True True False True True WF False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab True False 0 4 True False 0 True Sound card settings take effect after restarting the modem. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 7 2 False 0 0 4 True True 8-bit sound I/O True GTK_RELIEF_NORMAL False False True 0 1 4 5 fill 4 True True Stereo sound I/O True GTK_RELIEF_NORMAL False False True 0 1 5 6 fill 4 True True Full duplex I/O (unsupported!) True GTK_RELIEF_NORMAL False False True 0 1 6 7 fill True Sound card device False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill 8 True False True False True False True True True True 0 True * False True GTK_SELECTION_BROWSE True True /dev/dsp True True /dev/dsp0 True True /dev/dsp1 True True /dev/dsp2 1 2 0 1 True Requested sample rate False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill True TX rate offset (ppm) False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 2 3 4 4 fill True RX rate offset (ppm) False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 3 4 4 4 fill True True 1 0 True GTK_UPDATE_IF_VALID False True 8000 667 96000 1 10 10 1 2 1 2 8 4 True True 1 0 True GTK_UPDATE_IF_VALID False True 0 -1e+06 1e+06 1 10 10 1 2 2 3 8 4 True True 1 0 True GTK_UPDATE_IF_VALID False True 0 -1e+06 1e+06 1 10 10 1 2 3 4 8 4 0 True True True True Restart modem True GTK_RELIEF_NORMAL 0 False False 0 True True False True True Sound False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 tab 4 True False 0 True Push-To-Talk settings. New setting take effect next time PTT is toggled. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True False 0 True 4 2 False 0 0 True True RTS True GTK_RELIEF_NORMAL True False True 1 2 1 2 8 fill True True DTR True GTK_RELIEF_NORMAL False False True pttrtsradiobutton 1 2 2 3 8 fill True True both True GTK_RELIEF_NORMAL False False True pttrtsradiobutton 1 2 3 4 8 fill 8 True False True False True False True True True True 0 True * False True GTK_SELECTION_BROWSE True True none True True /dev/ttyS0 True True /dev/ttyS1 True True /dev/parport0 True True /dev/parport1 1 2 0 1 True PTT device False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 0 1 4 4 fill True PTT line (serial) False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill 0 False False 4 True True Use inverted PTT logic True GTK_RELIEF_NORMAL False False True 0 False False 0 True True False True True PTT False False GTK_JUSTIFY_CENTER False False 0.5 0.5 0 0 tab 4 True False 0 True Hamlib support enables the rig control features in gMFSK. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True 4 True True Enable hamlib support True GTK_RELIEF_NORMAL False False True 0 False False True 0 0.5 GTK_SHADOW_ETCHED_IN True 4 2 False 0 0 True Radio model False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 0 1 4 4 fill 2 True True -1 1 2 0 1 True Port False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 1 2 4 4 fill 2 True False True False True False True Serial port name or hostname for RPC rig True True True 0 True * False True GTK_SELECTION_BROWSE True True True True localhost True True /dev/ttyS0 True True /dev/ttyS1 True True /dev/ttyS2 True True /dev/ttyS3 1 2 1 2 True Speed False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 2 3 4 4 fill 2 True True -1 1 2 2 3 fill True A comma separated list of parameter=value hamlib config parameters. True True True 0 True * False 1 2 3 4 2 2 True Config False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 3 4 4 4 fill True Settings False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 label_item 2 True True False True True Hamlib False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 4 True False 0 True Here you can select the rig control features to use. False False GTK_JUSTIFY_LEFT True False 0 0.5 0 0 8 False True True 4 3 False 0 0 4 True True Use real frequencies in waterfall True GTK_RELIEF_NORMAL False False True 0 1 0 1 fill 4 True True Set QSO data frequency True GTK_RELIEF_NORMAL False False True 0 1 1 2 fill 4 True True Use hamlib PTT True GTK_RELIEF_NORMAL False False True 0 1 2 3 fill True Resolution: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 1 2 1 2 9 fill True True 0 True MHz True True kHz True True Hz True 2 3 1 2 True True 1 0 False GTK_UPDATE_ALWAYS False False 1000 0 4000 1 10 10 2 3 3 4 2 True RX pass band center frequency False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 3 4 4 4 fill 0 True True False True True Hamlib2 False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 tab 0 True True 0 True True True GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False False False True True False 0 True GTK_BUTTONBOX_END True True True gtk-help True GTK_RELIEF_NORMAL -11 True True True gtk-clear True GTK_RELIEF_NORMAL -2 True True True gtk-cancel True GTK_RELIEF_NORMAL -6 True True True gtk-ok True GTK_RELIEF_NORMAL -5 0 False True GTK_PACK_END 4 True False 0 True False 0 True Macro name False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 4 False False True True True True 0 True * False 4 True True 4 False True 400 200 True True GTK_POLICY_NEVER GTK_POLICY_AUTOMATIC GTK_SHADOW_ETCHED_IN GTK_CORNER_TOP_LEFT True True True GTK_JUSTIFY_LEFT GTK_WRAP_NONE True 0 0 0 0 0 0 4 True True 4 True True True gMFSK picture GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False 0 4 True 0.5 0.5 0 0 True 0 0.5 GTK_SHADOW_IN 0 True True True 4 False False True False 0 4 True True gtk-save True GTK_RELIEF_NORMAL 4 False False 4 True True gtk-close True GTK_RELIEF_NORMAL 0 False False GTK_PACK_END 0 False False GTK_PACK_END 10 True Select Picture to Transmit GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True True False True True True GTK_RELIEF_NORMAL True True True GTK_RELIEF_NORMAL 10 True Select File GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True True True True GTK_RELIEF_NORMAL True True True GTK_RELIEF_NORMAL True gMFSK configuration druid GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False 4 500 350 True False True GNOME_EDGE_START Welcome to gMFSK This is the first time you run this version of gMFSK. On the following pages you will be guided through the initial setup of gMFSK. All settings can also be done later in the main program Settings->Preferences dialog. This druid can be run again by starting gMFSK with the "--run-druid" flag. True Station information 16 True False 6 4 True False 0 True Fill in your station information. This data is used in the fixtext macros. False False GTK_JUSTIFY_FILL True False 0 0.5 0 0 8 False True True 5 2 False 0 0 True Callsign False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 0 1 4 4 fill True Name False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 1 2 4 4 fill True QTH False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 2 3 4 4 fill True Locator False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 3 4 4 4 fill True E-mail False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 4 5 4 4 fill True True True True 0 True * False 1 2 0 1 4 2 True True True True 0 True * False 1 2 1 2 4 2 True True True True 0 True * False 1 2 2 3 4 2 True True True True 0 True * False 1 2 3 4 4 2 True True True True 0 True * False 1 2 4 5 4 2 0 True True 0 True True True Files and directories 16 True False 6 4 True False 0 True These files and directories are used by gMFSK. Click the button to actually create the files and directories. False False GTK_JUSTIFY_FILL True False 0 0.5 0 0 8 False False True 3 2 False 0 0 True True True True 0 True * False 1 2 0 1 4 2 True Log file name False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 0 1 4 2 fill True TX pictures directory False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 1 2 4 2 fill True RX pictures directory False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 0 1 2 3 4 2 fill True True True True 0 True * False 1 2 1 2 4 2 True True True True 0 True * False 1 2 2 3 4 2 0 True True 4 True True Create files and directories True GTK_RELIEF_NORMAL 0 False False 0 True True True Sound card configuration 16 True False 6 4 True False 0 True Some sound cards don't support the default setting (16 bit mono sampling). You should hear a short sound sample when you click the test button below. False False GTK_JUSTIFY_FILL True False 0 0.5 0 0 8 False True True False 0 True False 0 True Sound card device False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 4 False False 8 True False True False True False True True True True 0 True * False True GTK_SELECTION_BROWSE True True /dev/dsp True True /dev/dsp0 True True /dev/dsp1 True True /dev/dsp2 0 True True 0 False False 4 True True 8-bit sound I/O True GTK_RELIEF_NORMAL False False True 0 False False 4 True True Stereo sound I/O True GTK_RELIEF_NORMAL False False True 0 False False 0 True True 4 True True Test sound card True GTK_RELIEF_NORMAL 0 False False 0 True True True PTT configuration 16 True False 6 4 True False 0 True gMFSK can control PTT via the serial port control lines or the parallel port. False False GTK_JUSTIFY_FILL True False 0 0.5 0 0 8 False True True False 0 True 4 2 False 0 0 True True RTS True GTK_RELIEF_NORMAL True False True 1 2 1 2 8 fill True True DTR True GTK_RELIEF_NORMAL False False True druid_pttrtsradiobutton 1 2 2 3 8 fill True True both True GTK_RELIEF_NORMAL False False True druid_pttrtsradiobutton 1 2 3 4 8 fill 8 True False True False True False True True True True 0 True * False True GTK_SELECTION_BROWSE True True none True True /dev/ttyS0 True True /dev/ttyS1 True True /dev/parport0 True True /dev/parport1 1 2 0 1 True PTT device False False GTK_JUSTIFY_CENTER False False 7.45058e-09 0.5 0 0 0 1 0 1 4 4 fill True PTT line (serial) False False GTK_JUSTIFY_CENTER False False 0 0.5 0 0 0 1 1 2 4 4 fill 0 False False 4 True True Use inverted PTT logic True GTK_RELIEF_NORMAL False False True 0 False False 0 True True 4 True True Test PTT True GTK_RELIEF_NORMAL 0 False False 0 True True True GNOME_EDGE_FINISH Configuration complete! Initial setup is now complete. gmfsk-0.7pre1/gmfsk.gladep0000644000076400007640000000043010206176466011242 gMFSK gmfsk TRUE gmfsk-0.7pre1/gmfsk.spec0000644000076400007640000000343110206155303010727 # gmfsk.spec # %define name gmfsk %define version 0.7pre1 %define release 1 %define skreq 0.3.5 Summary: Gnome MFSK, RTTY, THROB, PSK31, MT63 and HELLSCHREIBER terminal Name: %{name} Version: %{version} Release: %{release} License: GPL Group: Applications/Communications Source: ftp://ftp.hes.iki.fi/pub/ham/unix/linux/hfmodems/%{name}-%{version}.tar.gz BuildRoot: /var/tmp/%{name}-root BuildRequires: scrollkeeper >= %skreq %description gMFSK is a terminal program for MFSK, RTTY, THROB, PSK31, MT63 and HELLSCHREIBER. %prep %setup -q %build %configure --enable-hamlib make %install rm -rf $RPM_BUILD_ROOT export GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL=1 %makeinstall unset GCONF_DISABLE_MAKEFILE_SCHEMA_INSTALL rm -rf $RPM_BUILD_ROOT/var/lib/scrollkeeper/ %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc AUTHORS COPYING COPYING-DOCS ChangeLog INSTALL NEWS README %{_bindir}/%{name} %{_datadir}/pixmaps/%{name} %{_datadir}/fonts/feldhell %{_datadir}/omf/%{name} %{_datadir}/gnome/help/%{name} %{_datadir}/locale/*/LC_MESSAGES/%{name}.mo %{_sysconfdir}/gconf/schemas/%{name}.schemas %post if which scrollkeeper-update >/dev/null 2>&1; then echo "Doing scrollkeeper update." scrollkeeper-update -q -o %{_datadir}/omf/%{name} fi if which gconftool-2 >/dev/null 2>&1; then echo "Installing gconf schema." export GCONF_CONFIG_SOURCE=`gconftool-2 --get-default-source` gconftool-2 --makefile-install-rule %{_sysconfdir}/gconf/schemas/%{name}.schemas > /dev/null fi %postun if which scrollkeeper-update >/dev/null 2>&1; then scrollkeeper-update -q fi %changelog * Mon Jul 14 2003 Tomi Manninen - Added gconf stuff %changelog * Fri May 30 2003 Tomi Manninen - Updated for version 0.5.1 * Sat Apr 28 2001 Tomi Manninen - Create. gmfsk-0.7pre1/xmldocs.make0000644000076400007640000000612107662023402011261 # # No modifications of this Makefile should be necessary. # # To use this template: # 1) Define: figdir, docname, lang, omffile, and entities in # your Makefile.am file for each document directory, # although figdir, omffile, and entities may be empty # 2) Make sure the Makefile in (1) also includes # "include $(top_srcdir)/xmldocs.make" and # "dist-hook: app-dist-hook". # 3) Optionally define 'entities' to hold xml entities which # you would also like installed # 4) Figures must go under $(figdir)/ and be in PNG format # 5) You should only have one document per directory # 6) Note that the figure directory, $(figdir)/, should not have its # own Makefile since this Makefile installs those figures. # # example Makefile.am: # figdir = figures # docname = scrollkeeper-manual # lang = C # omffile=scrollkeeper-manual-C.omf # entities = fdl.xml # include $(top_srcdir)/xmldocs.make # dist-hook: app-dist-hook # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # ************* Begin of section some packagers may need to modify ************** # This variable (docdir) specifies where the documents should be installed. # This default value should work for most packages. # docdir = $(datadir)/@PACKAGE@/doc/$(docname)/$(lang) docdir = $(datadir)/gnome/help/$(docname)/$(lang) # ************** You should not have to edit below this line ******************* xml_files = $(entities) $(docname).xml EXTRA_DIST = $(xml_files) $(omffile) CLEANFILES = omf_timestamp # If the following file is in a subdir (like help/) you need to add that to the path include $(top_srcdir)/omf.make all: omf $(docname).xml: $(entities) -ourdir=`pwd`; \ cd $(srcdir); \ cp $(entities) $$ourdir app-dist-hook: if test "$(figdir)"; then \ $(mkinstalldirs) $(distdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \ done \ fi install-data-local: omf $(mkinstalldirs) $(DESTDIR)$(docdir) for file in $(xml_files); do \ cp $(srcdir)/$$file $(DESTDIR)$(docdir); \ done if test "$(figdir)"; then \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ done \ fi install-data-hook: install-data-hook-omf uninstall-local: uninstall-local-doc uninstall-local-omf uninstall-local-doc: -if test "$(figdir)"; then \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ rm -f $(docdir)/$(figdir)/$$basefile; \ done; \ rmdir $(DESTDIR)$(docdir)/$(figdir); \ fi -for file in $(xml_files); do \ rm -f $(DESTDIR)$(docdir)/$$file; \ done -rmdir $(DESTDIR)$(docdir) gmfsk-0.7pre1/omf.make0000644000076400007640000000410307665524173010405 # # No modifications of this Makefile should be necessary. # # This file contains the build instructions for installing OMF files. It is # generally called from the makefiles for particular formats of documentation. # # Note that you must configure your package with --localstatedir=/var/lib # so that the scrollkeeper-update command below will update the database # in the standard scrollkeeper directory. # # If it is impossible to configure with --localstatedir=/var/lib, then # modify the definition of scrollkeeper_localstate_dir so that # it points to the correct location. Note that you must still use # $(localstatedir) in this or when people build RPMs it will update # the real database on their system instead of the one under RPM_BUILD_ROOT. # # Note: This make file is not incorporated into xmldocs.make because, in # general, there will be other documents install besides XML documents # and the makefiles for these formats should also include this file. # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # !!!!!! added /lib/ to scrollkeeper_localstate_dir - oh2bns !!!!!! omf_dest_dir=$(datadir)/omf/@PACKAGE@ scrollkeeper_localstate_dir = $(localstatedir)/lib/scrollkeeper omf: omf_timestamp omf_timestamp: $(omffile) -for file in $(omffile); do \ scrollkeeper-preinstall $(docdir)/$(docname).xml $(srcdir)/$$file $$file.out; \ done touch omf_timestamp install-data-hook-omf: $(mkinstalldirs) $(DESTDIR)$(omf_dest_dir) for file in $(omffile); do \ $(INSTALL_DATA) $$file.out $(DESTDIR)$(omf_dest_dir)/$$file; \ done -scrollkeeper-update -p $(scrollkeeper_localstate_dir) -o $(DESTDIR)$(omf_dest_dir) uninstall-local-omf: -for file in $(srcdir)/*.omf; do \ basefile=`basename $$file`; \ rm -f $(omf_dest_dir)/$$basefile; \ done -rmdir $(omf_dest_dir) -scrollkeeper-update -p $(scrollkeeper_localstate_dir) gmfsk-0.7pre1/gmfsk.schemas0000644000076400007640000006317010104641105011423 /schemas/apps/gmfsk/info/mycall /apps/gmfsk/info/mycall gmfsk string Station callsign Station callsign is used for the fixtext macro $mycall. /schemas/apps/gmfsk/info/myname /apps/gmfsk/info/myname gmfsk string Operator's name Operator's name is used for the fixtext macro $myname. /schemas/apps/gmfsk/info/myqth /apps/gmfsk/info/myqth gmfsk string Station QTH Station QTH is used for the fixtext macro $myqth. /schemas/apps/gmfsk/info/myloc /apps/gmfsk/info/myloc gmfsk string Station locator Station locator is used for the fixtext macro $myloc. /schemas/apps/gmfsk/info/myemail /apps/gmfsk/info/myemail gmfsk string Operator's email address Operator's email address is used for the fixtext macro $myemail. /schemas/apps/gmfsk/colors/tx /apps/gmfsk/colors/tx gmfsk string red TX text color Color used for transmitted text in the RX window. /schemas/apps/gmfsk/colors/rx /apps/gmfsk/colors/rx gmfsk string black RX text color Color used for received text in the RX window. /schemas/apps/gmfsk/colors/hl /apps/gmfsk/colors/hl gmfsk string blue Highlighted text color Color used for special characters in the RX window. /schemas/apps/gmfsk/colors/txwin /apps/gmfsk/colors/txwin gmfsk string white TX window background color TX window background color. /schemas/apps/gmfsk/colors/rxwin /apps/gmfsk/colors/rxwin gmfsk string white RX window background color RX window background color. /schemas/apps/gmfsk/fonts/txfont /apps/gmfsk/fonts/txfont gmfsk string Sans 10 TX window font Font used in the TX window. /schemas/apps/gmfsk/fonts/rxfont /apps/gmfsk/fonts/rxfont gmfsk string Sans 10 RX window font Font used in the RX window. /schemas/apps/gmfsk/sound/dev /apps/gmfsk/sound/dev gmfsk string /dev/dsp Sound device Device used for sound input/output. /schemas/apps/gmfsk/ptt/dev /apps/gmfsk/ptt/dev gmfsk string none PTT device Serial device used for PTT control. A value of "none" disables PTT control. /schemas/apps/gmfsk/misc/datefmt /apps/gmfsk/misc/datefmt gmfsk string %d.%m.%Y Date format string Format string used for the fixtext macros $date and $utcdate. See the strftime(3) manual page for explanation of the format. /schemas/apps/gmfsk/misc/timefmt /apps/gmfsk/misc/timefmt gmfsk string %H:%M:%S %Z Time format string Format string used for the fixtext macros $time and $utctime. See the strftime(3) manual page for explanation of the format. /schemas/apps/gmfsk/misc/bands /apps/gmfsk/misc/bands gmfsk string ,1.8,3.5,7,10,14,18,21,24,28 QSO bands list A comma separated list of bands to be included in the combobox in the QSO data area. /schemas/apps/gmfsk/misc/logfile /apps/gmfsk/misc/logfile gmfsk string ~/gMFSK.log Log file name All received and transmitted text is logged to this file if logging is enabled. A tilde (~) at the beginning is expanded to the users home directory. /schemas/apps/gmfsk/misc/picrxdir /apps/gmfsk/misc/picrxdir gmfsk string ~/gMFSK/ RX picture directory Default directory to save received pictures to. A tilde (~) at the beginning is expanded to the users home directory. /schemas/apps/gmfsk/misc/pictxdir /apps/gmfsk/misc/pictxdir gmfsk string ~/gMFSK/ TX picture directory Default directory to load pictures to be transmitted. A tilde (~) at the beginning is expanded to the users home directory. /schemas/apps/gmfsk/hell/font /apps/gmfsk/hell/font gmfsk string FeldNarr 14 Hellschreiber font Font used to render transmitted Hellschreiber text. /schemas/apps/gmfsk/sound/8bit /apps/gmfsk/sound/8bit gmfsk bool FALSE Eight bit sound I/O Use eight bit sound I/O. Some older cards might not support 16 bit samples. /schemas/apps/gmfsk/sound/stereo /apps/gmfsk/sound/stereo gmfsk bool FALSE Stereo sound I/O Use stereo sound I/O. Some newer cards do not support mono. /schemas/apps/gmfsk/sound/fulldup /apps/gmfsk/sound/fulldup gmfsk bool FALSE Full duplex sound I/O Use full duplex sound I/O. This is unsupported and likely to be buggy. /schemas/apps/gmfsk/sound/testmode /apps/gmfsk/sound/testmode gmfsk bool FALSE Test mode sound I/O In test mode sound input is read from stdin (as 16 bit signed native byteorder samples). Sound output is written to stdout. Useful for channel simulation etc. /schemas/apps/gmfsk/ptt/inverted /apps/gmfsk/ptt/inverted gmfsk bool FALSE Inverted PTT Use inverted PTT control. /schemas/apps/gmfsk/misc/afc /apps/gmfsk/misc/afc gmfsk bool FALSE AFC Automatic Frequency Control. /schemas/apps/gmfsk/misc/squelch /apps/gmfsk/misc/squelch gmfsk bool TRUE Squelch Squelch. /schemas/apps/gmfsk/misc/reverse /apps/gmfsk/misc/reverse gmfsk bool FALSE Reverse Reverse modulation in frequency domain. /schemas/apps/gmfsk/rtty/reverse /apps/gmfsk/rtty/reverse gmfsk bool TRUE RTTY reverse Reverse mark/space in RTTY mode. /schemas/apps/gmfsk/rtty/msbfirst /apps/gmfsk/rtty/reverse gmfsk bool FALSE RTTY MSB first Send Most Significant Bit first in RTTY mode. /schemas/apps/gmfsk/mt63/cwid /apps/gmfsk/mt63/cwid gmfsk bool FALSE MT63 CWID Send CW ID during MT63 transmission. /schemas/apps/gmfsk/hell/uppercase /apps/gmfsk/hell/uppercase gmfsk bool TRUE Hellscreiber force upper case Force upper case letters in Hellschreiber transmission. /schemas/apps/gmfsk/wf/direction /apps/gmfsk/wf/direction gmfsk bool FALSE Waterfall direction Scrolling direction of the waterfall display. If true waterfall scrolls upwards. /schemas/apps/gmfsk/ptt/mode /apps/gmfsk/ptt/mode gmfsk int 2 PTT mode Push-to-Talk control mode. Possible values are: 0 (RTS), 1 (DTR), 2 (RTS and DTR). /schemas/apps/gmfsk/wf/mode /apps/gmfsk/wf/mode gmfsk int 0 Waterfall mode Waterfall display mode. Possible values are: 0 (Normal), 1 (Spectrum), 2 (Scope). /schemas/apps/gmfsk/wf/zoom /apps/gmfsk/wf/zoom gmfsk int 0 Waterfall zoom Waterfall display zoom. Possible values are: 0 (1x), 1 (2x), 2 (4x). /schemas/apps/gmfsk/wf/speed /apps/gmfsk/wf/speed gmfsk int 1 Waterfall speed Waterfall display speed. Possible values are: 0 (Half), 1 (Normal), 2 (Fast). /schemas/apps/gmfsk/wf/window /apps/gmfsk/wf/window gmfsk int 1 Waterfall window function Waterfall display window function. Possible values are: 0 (Boxcar), 1 (Triangular), 2 (Hamming). /schemas/apps/gmfsk/rtty/bits /apps/gmfsk/rtty/bits gmfsk int 0 RTTY data bits RTTY number of data bits. Possible values are: 0 (5 bits - BAUDOT), 1 (7 bits - ASCII), 2 (8 bits - ASCII). /schemas/apps/gmfsk/rtty/parity /apps/gmfsk/rtty/parity gmfsk int 0 RTTY parity RTTY parity type. Possible values are: 0 (None), 1 (Even), 2 (Odd), 3 (Zero), 4 (One). /schemas/apps/gmfsk/rtty/stop /apps/gmfsk/rtty/parity gmfsk int 1 RTTY stop bits RTTY number of stop bits. Possible values are: 0 (1 bit), 1 (1.5 bits), 2 (2 bits). /schemas/apps/gmfsk/mt63/bandwidth /apps/gmfsk/mt63/bandwidth gmfsk int 1 MT63 bandwidth MT63 bandwidth mode. Possible values are: 0 (500 Hz), 1 (1000 Hz), 2 (2000 Hz). /schemas/apps/gmfsk/mt63/interleave /apps/gmfsk/mt63/interleave gmfsk int 1 MT63 interleave MT63 interleave mode. Possible values are: 0 (Short - 32), 1 (Long - 64). /schemas/apps/gmfsk/wf/reflevel /apps/gmfsk/wf/reflevel gmfsk float -10.0 Waterfall reference level Waterfall disply reference level in dB. Relative amplitude value of a white pixel. Allowed range: -100 ... 0 /schemas/apps/gmfsk/wf/ampspan /apps/gmfsk/wf/ampspan gmfsk float 100.0 Waterfall amplitude span Waterfall disply amplitude span in dB. A black pixel means this much lower amplitude compred to a white pixel. Allowed range: 10 ... 100 /schemas/apps/gmfsk/wf/ampspan /apps/gmfsk/wf/ampspan gmfsk float 100.0 Waterfall amplitude span Waterfall disply amplitude span in dB. A black pixel means this much lower amplitude compred to a white pixel. Allowed range: 10 ... 100 /schemas/apps/gmfsk/misc/txoffset /apps/gmfsk/misc/txoffset gmfsk float 0.0 TX offset frequency Transmitter offset frequency in Hz. The transmit frequency is shifted by this much in frequency. /schemas/apps/gmfsk/mfsk/squelch /apps/gmfsk/mfsk/squelch gmfsk float 15.0 MFSK squelch level Squelch level. If the "goodness" of reception is below this value, no text is printed and AFC is disabled. Allowed range: 0 ... 100 /schemas/apps/gmfsk/rtty/shift /apps/gmfsk/rtty/shift gmfsk float 170.0 RTTY shift RTTY shift in Hz. /schemas/apps/gmfsk/rtty/baud /apps/gmfsk/rtty/baud gmfsk float 45.45 RTTY baud rate RTTY baud rate. /schemas/apps/gmfsk/rtty/squelch /apps/gmfsk/rtty/squelch gmfsk float 15.0 RTTY squelch level Squelch level. If the "goodness" of reception is below this value, no text is printed and AFC is disabled. Allowed range: 0 ... 100. (RTTY squelch does not work at the moment.) /schemas/apps/gmfsk/throb/squelch /apps/gmfsk/throb/squelch gmfsk float 15.0 THROB squelch level Squelch level. If the "goodness" of reception is below this value, no text is printed and AFC is disabled. Allowed range: 0 ... 100. (THROB squelch does not work at the moment.) /schemas/apps/gmfsk/psk31/squelch /apps/gmfsk/psk31/squelch gmfsk float 15.0 PSK31 squelch level Squelch level. If the "goodness" of reception is below this value, no text is printed and AFC is disabled. Allowed range: 0 ... 100 /schemas/apps/gmfsk/mt63/squelch /apps/gmfsk/mt63/squelch gmfsk float 15.0 MT63 squelch level Squelch level. If the "goodness" of reception is below this value, no text is printed and AFC is disabled. Allowed range: 0 ... 100 /schemas/apps/gmfsk/macro/name1 /apps/gmfsk/macro/name1 gmfsk string CQ Macro 1 name Macro 1 name /schemas/apps/gmfsk/macro/text1 /apps/gmfsk/macro/text1 gmfsk string $tx cq cq cq de $mycall $mycall $mycall cq cq cq de $mycall $mycall $mycall cq cq cq de $mycall $mycall $mycall pse k $rx Macro 1 text Macro 1 text /schemas/apps/gmfsk/macro/name2 /apps/gmfsk/macro/name2 gmfsk string Station Macro 2 name Macro 2 name /schemas/apps/gmfsk/macro/text2 /apps/gmfsk/macro/text2 gmfsk string --- $mycall station info: Name: $myname QTH: $myqth, Locator: $myloc Email: $myemail Rig: Icom IC-745 Pwr: abt 10 W Ant: end fed wire + SG-237 automatic ATU Comp: AMD Duron 900 MHz 256 MB OS: $(cat /etc/redhat-release) Soft: $soft localtime: $time ($utctime) --- Macro 2 text Macro 2 text /schemas/apps/gmfsk/macro/name3 /apps/gmfsk/macro/name3 gmfsk string BTU Macro 3 name Macro 3 name /schemas/apps/gmfsk/macro/text3 /apps/gmfsk/macro/text3 gmfsk string btu $call de $mycall k $rx Macro 3 text Macro 3 text /schemas/apps/gmfsk/macro/name4 /apps/gmfsk/macro/name4 gmfsk string call de mycall Macro 4 name Macro 4 name /schemas/apps/gmfsk/macro/text4 /apps/gmfsk/macro/text4 gmfsk string $tx $call de $mycall Macro 4 text Macro 4 text /schemas/apps/gmfsk/macro/name5 /apps/gmfsk/macro/name5 gmfsk string QRZ ? Macro 5 name Macro 5 name /schemas/apps/gmfsk/macro/text5 /apps/gmfsk/macro/text5 gmfsk string $tx qrz? qrz? qrz? de $mycall $mycall $mycall pse kn $rx Macro 5 text Macro 5 text /schemas/apps/gmfsk/macro/name6 /apps/gmfsk/macro/name6 gmfsk string 73 & sk Macro 6 name Macro 6 name /schemas/apps/gmfsk/macro/text6 /apps/gmfsk/macro/text6 gmfsk string Thanks for very nice $mode QSO dr $name. QSL is ok via buro if needed. 73 and hope to see you soon again on $mode or other digital modes. $call de $mycall sk sk $rx Macro 6 text Macro 6 text gmfsk-0.7pre1/m4/0000777000076400007640000000000010206176675007366 5gmfsk-0.7pre1/m4/Makefile.am0000644000076400007640000000023010036774440011324 EXTRA_DIST = \ ac_compile_warnings.m4 \ codeset.m4 \ gettext.m4 \ glibc21.m4 \ iconv.m4 \ isc-posix.m4 \ lcmessage.m4 \ progtest.m4 \ lrint.m4 gmfsk-0.7pre1/m4/Makefile.in0000644000076400007640000001717010206155265011345 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ EXTRA_DIST = \ ac_compile_warnings.m4 \ codeset.m4 \ gettext.m4 \ glibc21.m4 \ iconv.m4 \ isc-posix.m4 \ lcmessage.m4 \ progtest.m4 \ lrint.m4 subdir = m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = DIST_SOURCES = DIST_COMMON = Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu m4/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am info info-am install \ install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/m4/ac_compile_warnings.m40000644000076400007640000000136310036774330013543 dnl Available from the GNU Autoconf Macro Archive at: dnl http://www.gnu.org/software/ac-archive/htmldoc/ac_compile_warnings.html dnl AC_DEFUN([AC_COMPILE_WARNINGS], [AC_MSG_CHECKING(maximum warning verbosity option) if test -n "$CXX" then if test "$GXX" = "yes" then ac_compile_warnings_opt='-Wall' fi CXXFLAGS="$CXXFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_opt for C++" fi if test -n "$CC" then if test "$GCC" = "yes" then ac_compile_warnings_opt='-Wall' fi CFLAGS="$CFLAGS $ac_compile_warnings_opt" ac_compile_warnings_msg="$ac_compile_warnings_msg $ac_compile_warnings_opt for C" fi AC_MSG_RESULT($ac_compile_warnings_msg) unset ac_compile_warnings_msg unset ac_compile_warnings_opt ]) gmfsk-0.7pre1/m4/codeset.m40000644000076400007640000000157607730173334011200 # codeset.m4 serial AM1 (gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_LANGINFO_CODESET], [ AC_CACHE_CHECK([for nl_langinfo and CODESET], am_cv_langinfo_codeset, [AC_TRY_LINK([#include ], [char* cs = nl_langinfo(CODESET);], am_cv_langinfo_codeset=yes, am_cv_langinfo_codeset=no) ]) if test $am_cv_langinfo_codeset = yes; then AC_DEFINE(HAVE_LANGINFO_CODESET, 1, [Define if you have and nl_langinfo(CODESET).]) fi ]) gmfsk-0.7pre1/m4/gettext.m40000644000076400007640000005730207730173334011234 # gettext.m4 serial 16 (gettext-0.11.4) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2002. dnl Macro to add for using GNU gettext. dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The dnl default (if it is not specified or empty) is 'no-libtool'. dnl INTLSYMBOL should be 'external' for packages with no intl directory, dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. dnl If INTLSYMBOL is 'use-libtool', then a libtool library dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, dnl depending on --{enable,disable}-{shared,static} and on the presence of dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library dnl $(top_builddir)/intl/libintl.a will be created. dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext dnl implementations (in libc or libintl) without the ngettext() function dnl will be ignored. If NEEDSYMBOL is specified and is dnl 'need-formatstring-macros', then GNU gettext implementations that don't dnl support the ISO C 99 formatstring macros will be ignored. dnl INTLDIR is used to find the intl libraries. If empty, dnl the value `$(top_builddir)/intl/' is used. dnl dnl The result of the configuration is one of three cases: dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled dnl and used. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 2) GNU gettext has been found in the system's C library. dnl Catalog format: GNU --> install in $(datadir) dnl Catalog extension: .mo after installation, .gmo in source tree dnl 3) No internationalization, always use English msgid. dnl Catalog format: none dnl Catalog extension: none dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. dnl The use of .gmo is historical (it was needed to avoid overwriting the dnl GNU format catalogs when building on a platform with an X/Open gettext), dnl but we keep it in order not to force irrelevant filename changes on the dnl maintainers. dnl AC_DEFUN([AM_GNU_GETTEXT], [ dnl Argument checking. ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT ])])])])]) ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT ])])])]) define(gt_included_intl, ifelse([$1], [external], [no], [yes])) define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) AC_REQUIRE([AM_PO_SUBDIRS])dnl ifelse(gt_included_intl, yes, [ AC_REQUIRE([AM_INTL_SUBDIR])dnl ]) dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Sometimes libintl requires libiconv, so first search for libiconv. dnl Ideally we would do this search only after the dnl if test "$USE_NLS" = "yes"; then dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT dnl the configure script would need to contain the same shell code dnl again, outside any 'if'. There are two solutions: dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not dnl documented, we avoid it. ifelse(gt_included_intl, yes, , [ AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) ]) AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ifelse(gt_included_intl, yes, [ BUILD_INCLUDED_LIBINTL=no USE_INCLUDED_LIBINTL=no ]) LIBINTL= LTLIBINTL= POSUB= dnl If we use NLS figure out what method if test "$USE_NLS" = "yes"; then gt_use_preinstalled_gnugettext=no ifelse(gt_included_intl, yes, [ AC_MSG_CHECKING([whether included gettext is requested]) AC_ARG_WITH(included-gettext, [ --with-included-gettext use the GNU gettext library included here], nls_cv_force_use_gnu_gettext=$withval, nls_cv_force_use_gnu_gettext=no) AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" if test "$nls_cv_force_use_gnu_gettext" != "yes"; then ]) dnl User does not insist on using GNU NLS library. Figure out what dnl to use. If GNU gettext is available we use this. Else we have dnl to fall back to GNU NLS library. dnl Add a version number to the cache macros. define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, [AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern int *_nl_domain_bindings;], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], gt_cv_func_gnugettext_libc=yes, gt_cv_func_gnugettext_libc=no)]) if test "$gt_cv_func_gnugettext_libc" != "yes"; then dnl Sometimes libintl requires libiconv, so first search for libiconv. ifelse(gt_included_intl, yes, , [ AM_ICONV_LINK ]) dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) dnl because that would add "-liconv" to LIBINTL and LTLIBINTL dnl even if libiconv doesn't exist. AC_LIB_LINKFLAGS_BODY([intl]) AC_CACHE_CHECK([for GNU gettext in libintl], gt_cv_func_gnugettext_libintl, [gt_save_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $INCINTL" gt_save_LIBS="$LIBS" LIBS="$LIBS $LIBINTL" dnl Now see whether libintl exists and does not depend on libiconv. AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], gt_cv_func_gnugettext_libintl=yes, gt_cv_func_gnugettext_libintl=no) dnl Now see whether libintl exists and depends on libiconv. if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include ]ifelse([$2], [need-formatstring-macros], [#ifndef __GNU_GETTEXT_SUPPORTED_REVISION #define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) #endif changequote(,)dnl typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; changequote([,])dnl ], [])[extern int _nl_msg_cat_cntr; extern #ifdef __cplusplus "C" #endif const char *_nl_expand_alias ();], [bindtextdomain ("", ""); return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], [LIBINTL="$LIBINTL $LIBICONV" LTLIBINTL="$LTLIBINTL $LTLIBICONV" gt_cv_func_gnugettext_libintl=yes ]) fi CPPFLAGS="$gt_save_CPPFLAGS" LIBS="$gt_save_LIBS"]) fi dnl If an already present or preinstalled GNU gettext() is found, dnl use it. But if this macro is used in GNU gettext, and GNU dnl gettext is already preinstalled in libintl, we update this dnl libintl. (Cf. the install rule in intl/Makefile.in.) if test "$gt_cv_func_gnugettext_libc" = "yes" \ || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ && test "$PACKAGE" != gettext; }; then gt_use_preinstalled_gnugettext=yes else dnl Reset the values set by searching for libintl. LIBINTL= LTLIBINTL= INCINTL= fi ifelse(gt_included_intl, yes, [ if test "$gt_use_preinstalled_gnugettext" != "yes"; then dnl GNU gettext is not found in the C library. dnl Fall back on included GNU gettext library. nls_cv_use_gnu_gettext=yes fi fi if test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions used to generate GNU NLS library. INTLOBJS="\$(GETTOBJS)" BUILD_INCLUDED_LIBINTL=yes USE_INCLUDED_LIBINTL=yes LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` fi if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then dnl Mark actions to use GNU gettext tools. CATOBJEXT=.gmo fi ]) if test "$gt_use_preinstalled_gnugettext" = "yes" \ || test "$nls_cv_use_gnu_gettext" = "yes"; then AC_DEFINE(ENABLE_NLS, 1, [Define to 1 if translation of program messages to the user's native language is requested.]) else USE_NLS=no fi fi if test "$USE_NLS" = "yes"; then if test "$gt_use_preinstalled_gnugettext" = "yes"; then if test "$gt_cv_func_gnugettext_libintl" = "yes"; then AC_MSG_CHECKING([how to link with libintl]) AC_MSG_RESULT([$LIBINTL]) AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) fi dnl For backward compatibility. Some packages may be using this. AC_DEFINE(HAVE_GETTEXT, 1, [Define if the GNU gettext() function is already present or preinstalled.]) AC_DEFINE(HAVE_DCGETTEXT, 1, [Define if the GNU dcgettext() function is already present or preinstalled.]) fi dnl We need to process the po/ directory. POSUB=po fi ifelse(gt_included_intl, yes, [ dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL dnl to 'yes' because some of the testsuite requires it. if test "$PACKAGE" = gettext; then BUILD_INCLUDED_LIBINTL=yes fi dnl Make all variables we use known to autoconf. AC_SUBST(BUILD_INCLUDED_LIBINTL) AC_SUBST(USE_INCLUDED_LIBINTL) AC_SUBST(CATOBJEXT) AC_SUBST(INTLOBJS) dnl For backward compatibility. Some configure.ins may be using this. nls_cv_header_intl= nls_cv_header_libgt= dnl For backward compatibility. Some Makefiles may be using this. DATADIRNAME=share AC_SUBST(DATADIRNAME) dnl For backward compatibility. Some Makefiles may be using this. INSTOBJEXT=.mo AC_SUBST(INSTOBJEXT) dnl For backward compatibility. Some Makefiles may be using this. GENCAT=gencat AC_SUBST(GENCAT) dnl Enable libtool support if the surrounding package wishes it. INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) ]) dnl For backward compatibility. Some Makefiles may be using this. INTLLIBS="$LIBINTL" AC_SUBST(INTLLIBS) dnl Make all documented variables known to autoconf. AC_SUBST(LIBINTL) AC_SUBST(LTLIBINTL) AC_SUBST(POSUB) ]) dnl Checks for all prerequisites of the po subdirectory, dnl except for USE_NLS. AC_DEFUN([AM_PO_SUBDIRS], [ AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl dnl Perform the following tests also if --disable-nls has been given, dnl because they are needed for "make dist" to work. dnl Search for GNU msgfmt in the PATH. dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. dnl The second test excludes FreeBSD msgfmt. AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) dnl Search for GNU xgettext 0.11 or newer in the PATH. dnl The first test excludes Solaris xgettext and early GNU xgettext versions. dnl The second test excludes FreeBSD xgettext. AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [$ac_dir/$ac_word --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $ac_dir/$ac_word --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], :) dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po dnl Search for GNU msgmerge 0.11 or newer in the PATH. AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU msgfmt. if test "$GMSGFMT" != ":"; then dnl If it is no GNU msgfmt we define it as : so that the dnl Makefiles still can work. if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` AC_MSG_RESULT( [found $GMSGFMT program is not GNU msgfmt; ignore it]) GMSGFMT=":" fi fi dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is no GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header --copyright-holder= /dev/null >/dev/null 2>&1 && (if $XGETTEXT --omit-header --copyright-holder= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi dnl Remove leftover from FreeBSD xgettext call. rm -f messages.po fi AC_OUTPUT_COMMANDS([ for ac_file in $CONFIG_FILES; do # Support "outfile[:infile[:infile...]]" case "$ac_file" in *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; esac # PO directories have a Makefile.in generated from Makefile.in.in. case "$ac_file" in */Makefile.in) # Adjust a relative srcdir. ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` # In autoconf-2.13 it is called $ac_given_srcdir. # In autoconf-2.50 it is called $srcdir. test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" case "$ac_given_srcdir" in .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; /*) top_srcdir="$ac_given_srcdir" ;; *) top_srcdir="$ac_dots$ac_given_srcdir" ;; esac if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then rm -f "$ac_dir/POTFILES" test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" # ALL_LINGUAS, POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES depend # on $ac_dir but don't depend on user-specified configuration # parameters. if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then # The LINGUAS file contains the set of available languages. if test -n "$ALL_LINGUAS"; then test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" fi ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` # Hide the ALL_LINGUAS assigment from automake. eval 'ALL_LINGUAS''=$ALL_LINGUAS_' fi case "$ac_given_srcdir" in .) srcdirpre= ;; *) srcdirpre='$(srcdir)/' ;; esac POFILES= GMOFILES= UPDATEPOFILES= DUMMYPOFILES= for lang in $ALL_LINGUAS; do POFILES="$POFILES $srcdirpre$lang.po" GMOFILES="$GMOFILES $srcdirpre$lang.gmo" UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" DUMMYPOFILES="$DUMMYPOFILES $lang.nop" done # CATALOGS depends on both $ac_dir and the user's LINGUAS # environment variable. INST_LINGUAS= if test -n "$ALL_LINGUAS"; then for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "$LINGUAS"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then INST_LINGUAS="$INST_LINGUAS $presentlang" fi done fi CATALOGS= if test -n "$INST_LINGUAS"; then for lang in $INST_LINGUAS; do CATALOGS="$CATALOGS $lang.gmo" done fi test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do if test -f "$f"; then case "$f" in *.orig | *.bak | *~) ;; *) cat "$f" >> "$ac_dir/Makefile" ;; esac fi done fi ;; esac done], [# Capture the value of obsolete $ALL_LINGUAS because we need it to compute # POFILES, GMOFILES, UPDATEPOFILES, DUMMYPOFILES, CATALOGS. But hide it # from automake. eval 'ALL_LINGUAS''="$ALL_LINGUAS"' # Capture the value of LINGUAS because we need it to compute CATALOGS. LINGUAS="${LINGUAS-%UNSET%}" ]) ]) dnl Checks for all prerequisites of the intl subdirectory, dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. AC_DEFUN([AM_INTL_SUBDIR], [ AC_REQUIRE([AC_PROG_INSTALL])dnl AC_REQUIRE([AM_MKINSTALLDIRS])dnl AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_PROG_RANLIB])dnl AC_REQUIRE([AC_ISC_POSIX])dnl AC_REQUIRE([AC_HEADER_STDC])dnl AC_REQUIRE([AC_C_CONST])dnl AC_REQUIRE([AC_C_INLINE])dnl AC_REQUIRE([AC_TYPE_OFF_T])dnl AC_REQUIRE([AC_TYPE_SIZE_T])dnl AC_REQUIRE([AC_FUNC_ALLOCA])dnl AC_REQUIRE([AC_FUNC_MMAP])dnl AC_REQUIRE([jm_GLIBC21])dnl AC_REQUIRE([gt_INTDIV0])dnl AC_REQUIRE([jm_AC_TYPE_UINTMAX_T])dnl AC_REQUIRE([gt_HEADER_INTTYPES_H])dnl AC_REQUIRE([gt_INTTYPES_PRI])dnl AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h stddef.h \ stdlib.h string.h unistd.h sys/param.h]) AC_CHECK_FUNCS([feof_unlocked fgets_unlocked getc_unlocked getcwd getegid \ geteuid getgid getuid mempcpy munmap putenv setenv setlocale stpcpy \ strcasecmp strdup strtoul tsearch __argz_count __argz_stringify __argz_next]) AM_ICONV AM_LANGINFO_CODESET if test $ac_cv_header_locale_h = yes; then AM_LC_MESSAGES fi dnl intl/plural.c is generated from intl/plural.y. It requires bison, dnl because plural.y uses bison specific features. It requires at least dnl bison-1.26 because earlier versions generate a plural.c that doesn't dnl compile. dnl bison is only needed for the maintainer (who touches plural.y). But in dnl order to avoid separate Makefiles or --enable-maintainer-mode, we put dnl the rule in general Makefile. Now, some people carelessly touch the dnl files or have a broken "make" program, hence the plural.c rule will dnl sometimes fire. To avoid an error, defines BISON to ":" if it is not dnl present or too old. AC_CHECK_PROGS([INTLBISON], [bison]) if test -z "$INTLBISON"; then ac_verc_fail=yes else dnl Found it, now check the version. AC_MSG_CHECKING([version of bison]) changequote(<<,>>)dnl ac_prog_version=`$INTLBISON --version 2>&1 | sed -n 's/^.*GNU Bison.* \([0-9]*\.[0-9.]*\).*$/\1/p'` case $ac_prog_version in '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; 1.2[6-9]* | 1.[3-9][0-9]* | [2-9].*) changequote([,])dnl ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; esac AC_MSG_RESULT([$ac_prog_version]) fi if test $ac_verc_fail = yes; then INTLBISON=: fi ]) AC_DEFUN([AM_MKINSTALLDIRS], [ dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but $(top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) ]) dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) gmfsk-0.7pre1/m4/glibc21.m40000644000076400007640000000172707730173334010773 # glibc21.m4 serial 2 (fileutils-4.1.3, gettext-0.10.40) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # Test for the GNU C Library, version 2.1 or newer. # From Bruno Haible. AC_DEFUN([jm_GLIBC21], [ AC_CACHE_CHECK(whether we are using the GNU C Library 2.1 or newer, ac_cv_gnu_library_2_1, [AC_EGREP_CPP([Lucky GNU user], [ #include #ifdef __GNU_LIBRARY__ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) || (__GLIBC__ > 2) Lucky GNU user #endif #endif ], ac_cv_gnu_library_2_1=yes, ac_cv_gnu_library_2_1=no) ] ) AC_SUBST(GLIBC21) GLIBC21="$ac_cv_gnu_library_2_1" ] ) gmfsk-0.7pre1/m4/iconv.m40000644000076400007640000000665307730173334010671 # iconv.m4 serial AM4 (gettext-0.11.3) dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl From Bruno Haible. AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], [ dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) AC_REQUIRE([AC_LIB_RPATH]) dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_LIB_LINKFLAGS_BODY([iconv]) ]) AC_DEFUN([AM_ICONV_LINK], [ dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and dnl those with the standalone portable GNU libiconv installed). dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV dnl accordingly. AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) dnl Add $INCICONV to CPPFLAGS before performing the following checks, dnl because if the user has installed libiconv and not disabled its use dnl via --without-libiconv-prefix, he wants to use it. The first dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. am_save_CPPFLAGS="$CPPFLAGS" AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_func_iconv=yes) if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" AC_TRY_LINK([#include #include ], [iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd);], am_cv_lib_iconv=yes am_cv_func_iconv=yes) LIBS="$am_save_LIBS" fi ]) if test "$am_cv_func_iconv" = yes; then AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) fi if test "$am_cv_lib_iconv" = yes; then AC_MSG_CHECKING([how to link with libiconv]) AC_MSG_RESULT([$LIBICONV]) else dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV dnl either. CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi AC_SUBST(LIBICONV) AC_SUBST(LTLIBICONV) ]) AC_DEFUN([AM_ICONV], [ AM_ICONV_LINK if test "$am_cv_func_iconv" = yes; then AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_VAL(am_cv_proto_iconv, [ AC_TRY_COMPILE([ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif ], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` AC_MSG_RESULT([$]{ac_t:- }[$]am_cv_proto_iconv) AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, [Define as const if the declaration of iconv() needs const.]) fi ]) gmfsk-0.7pre1/m4/isc-posix.m40000644000076400007640000000213307730173334011456 # isc-posix.m4 serial 2 (gettext-0.11.2) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. # This file is not needed with autoconf-2.53 and newer. Remove it in 2005. # This test replaces the one in autoconf. # Currently this macro should have the same name as the autoconf macro # because gettext's gettext.m4 (distributed in the automake package) # still uses it. Otherwise, the use in gettext.m4 makes autoheader # give these diagnostics: # configure.in:556: AC_TRY_COMPILE was called before AC_ISC_POSIX # configure.in:556: AC_TRY_RUN was called before AC_ISC_POSIX undefine([AC_ISC_POSIX]) AC_DEFUN([AC_ISC_POSIX], [ dnl This test replaces the obsolescent AC_ISC_POSIX kludge. AC_CHECK_LIB(cposix, strerror, [LIBS="$LIBS -lcposix"]) ] ) gmfsk-0.7pre1/m4/lcmessage.m40000644000076400007640000000261607730173334011511 # lcmessage.m4 serial 3 (gettext-0.11.3) dnl Copyright (C) 1995-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995. # Check whether LC_MESSAGES is available in . AC_DEFUN([AM_LC_MESSAGES], [ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi ]) gmfsk-0.7pre1/m4/progtest.m40000644000076400007640000000407407730173334011415 # progtest.m4 serial 2 (gettext-0.10.40) dnl Copyright (C) 1996-2002 Free Software Foundation, Inc. dnl This file is free software, distributed under the terms of the GNU dnl General Public License. As a special exception to the GNU General dnl Public License, this file may be distributed as part of a program dnl that contains a configuration script generated by Autoconf, under dnl the same distribution terms as the rest of that program. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1996. # Search path for a program which passes the given test. dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) AC_DEFUN([AM_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) gmfsk-0.7pre1/m4/lrint.m40000644000076400007640000000624610023613162010664 dnl @synopsis AC_C99_FUNC_LRINT dnl dnl Check whether C99's lrint function is available. dnl @version 1.3 Feb 12 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LRINT], [AC_CACHE_CHECK(for lrint, ac_cv_c99_lrint, [ lrint_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrint(3.14159)) lrint(2.7183);, ac_cv_c99_lrint=yes, ac_cv_c99_lrint=no) CFLAGS=$lrint_save_CFLAGS ]) if test "$ac_cv_c99_lrint" = yes; then AC_DEFINE(HAVE_LRINT, 1, [Define if you have C99's lrint function.]) fi ])# AC_C99_FUNC_LRINT dnl @synopsis AC_C99_FUNC_LRINTF dnl dnl Check whether C99's lrintf function is available. dnl @version 1.3 Feb 12 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LRINTF], [AC_CACHE_CHECK(for lrintf, ac_cv_c99_lrintf, [ lrintf_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) CFLAGS=$lrintf_save_CFLAGS ]) if test "$ac_cv_c99_lrintf" = yes; then AC_DEFINE(HAVE_LRINTF, 1, [Define if you have C99's lrintf function.]) fi ])# AC_C99_FUNC_LRINTF dnl @synopsis AC_C99_FUNC_LLRINT dnl dnl Check whether C99's llrint function is available. dnl @version 1.1 Sep 30 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LLRINT], [AC_CACHE_CHECK(for llrint, ac_cv_c99_llrint, [ llrint_save_CFLAGS=$CFLAGS CFLAGS="-O2 -lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include #include ], int64_t x ; x = llrint(3.14159) ;, ac_cv_c99_llrint=yes, ac_cv_c99_llrint=no) CFLAGS=$llrint_save_CFLAGS ]) if test "$ac_cv_c99_llrint" = yes; then AC_DEFINE(HAVE_LLRINT, 1, [Define if you have C99's llrint function.]) fi ])# AC_C99_FUNC_LLRINT gmfsk-0.7pre1/src/0000777000076400007640000000000010206176677007637 5gmfsk-0.7pre1/src/Makefile.am0000644000076400007640000000230410167564746011612 ## Process this file with automake to produce Makefile.in SUBDIRS = misc samplerate mfsk rtty throb psk31 mt63 feld cw olivia INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src/misc \ -I$(top_srcdir)/src/samplerate bin_PROGRAMS = gmfsk gmfsk_SOURCES = \ main.c main.h \ support.c support.h \ interface.c interface.h \ callbacks.c callbacks.h \ waterfall.c waterfall.h \ miniscope.c miniscope.h \ papertape.c papertape.h \ gtkdial.c gtkdial.h \ ascii.h \ conf.c conf.h \ confdialog.c confdialog.h \ druid.c druid.h \ hamlib.c hamlib.h \ log.c log.h \ macro.c macro.h \ ptt.c ptt.h \ qsodata.c qsodata.h \ remlog.h \ snd.c snd.h \ trx.c trx.h \ cwirc.c cwirc.h \ picture.c picture.h gmfsk_LDADD = \ mfsk/libmfsk.a \ mt63/libmt63.a \ rtty/librtty.a \ throb/libthrob.a \ psk31/libpsk31.a \ feld/libfeld.a \ cw/libcw.a \ olivia/libolivia.a \ misc/libmisc.a \ samplerate/libsamplerate.a \ @PACKAGE_LIBS@ $(INTLLIBS) # Force linking with g++, otherwise the MT63 won't work... # gmfsk_LINK = $(CXX) $(AM_FLAGS) $(FLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ gmfsk-0.7pre1/src/Makefile.in0000644000076400007640000004707210206155265011620 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = misc samplerate mfsk rtty throb psk31 mt63 feld cw olivia INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src/misc \ -I$(top_srcdir)/src/samplerate bin_PROGRAMS = gmfsk gmfsk_SOURCES = \ main.c main.h \ support.c support.h \ interface.c interface.h \ callbacks.c callbacks.h \ waterfall.c waterfall.h \ miniscope.c miniscope.h \ papertape.c papertape.h \ gtkdial.c gtkdial.h \ ascii.h \ conf.c conf.h \ confdialog.c confdialog.h \ druid.c druid.h \ hamlib.c hamlib.h \ log.c log.h \ macro.c macro.h \ ptt.c ptt.h \ qsodata.c qsodata.h \ remlog.h \ snd.c snd.h \ trx.c trx.h \ cwirc.c cwirc.h \ picture.c picture.h gmfsk_LDADD = \ mfsk/libmfsk.a \ mt63/libmt63.a \ rtty/librtty.a \ throb/libthrob.a \ psk31/libpsk31.a \ feld/libfeld.a \ cw/libcw.a \ olivia/libolivia.a \ misc/libmisc.a \ samplerate/libsamplerate.a \ @PACKAGE_LIBS@ $(INTLLIBS) # Force linking with g++, otherwise the MT63 won't work... # gmfsk_LINK = $(CXX) $(AM_FLAGS) $(FLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = bin_PROGRAMS = gmfsk$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) am_gmfsk_OBJECTS = main.$(OBJEXT) support.$(OBJEXT) interface.$(OBJEXT) \ callbacks.$(OBJEXT) waterfall.$(OBJEXT) miniscope.$(OBJEXT) \ papertape.$(OBJEXT) gtkdial.$(OBJEXT) conf.$(OBJEXT) \ confdialog.$(OBJEXT) druid.$(OBJEXT) hamlib.$(OBJEXT) \ log.$(OBJEXT) macro.$(OBJEXT) ptt.$(OBJEXT) qsodata.$(OBJEXT) \ snd.$(OBJEXT) trx.$(OBJEXT) cwirc.$(OBJEXT) picture.$(OBJEXT) gmfsk_OBJECTS = $(am_gmfsk_OBJECTS) gmfsk_DEPENDENCIES = mfsk/libmfsk.a mt63/libmt63.a rtty/librtty.a \ throb/libthrob.a psk31/libpsk31.a feld/libfeld.a cw/libcw.a \ olivia/libolivia.a misc/libmisc.a samplerate/libsamplerate.a gmfsk_LDFLAGS = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/callbacks.Po ./$(DEPDIR)/conf.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/confdialog.Po ./$(DEPDIR)/cwirc.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/druid.Po ./$(DEPDIR)/gtkdial.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/hamlib.Po ./$(DEPDIR)/interface.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/log.Po ./$(DEPDIR)/macro.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/main.Po ./$(DEPDIR)/miniscope.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/papertape.Po ./$(DEPDIR)/picture.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/ptt.Po ./$(DEPDIR)/qsodata.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/snd.Po ./$(DEPDIR)/support.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/trx.Po ./$(DEPDIR)/waterfall.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(gmfsk_SOURCES) RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ps-recursive install-info-recursive uninstall-info-recursive \ all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive \ check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) SOURCES = $(gmfsk_SOURCES) all: all-recursive .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(bindir) @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ rm -f $(DESTDIR)$(bindir)/$$f; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gmfsk$(EXEEXT): $(gmfsk_OBJECTS) $(gmfsk_DEPENDENCIES) @rm -f gmfsk$(EXEEXT) $(gmfsk_LINK) $(gmfsk_LDFLAGS) $(gmfsk_OBJECTS) $(gmfsk_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/callbacks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conf.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/confdialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cwirc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/druid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkdial.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hamlib.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/macro.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/miniscope.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/papertape.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/picture.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/qsodata.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/snd.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/support.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/trx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/waterfall.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile $(PROGRAMS) installdirs: installdirs-recursive installdirs-am: $(mkinstalldirs) $(DESTDIR)$(bindir) install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-binPROGRAMS install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-recursive ctags \ ctags-recursive distclean distclean-compile distclean-depend \ distclean-generic distclean-recursive distclean-tags distdir \ dvi dvi-am dvi-recursive info info-am info-recursive install \ install-am install-binPROGRAMS install-data install-data-am \ install-data-recursive install-exec install-exec-am \ install-exec-recursive install-info install-info-am \ install-info-recursive install-man install-recursive \ install-strip installcheck installcheck-am installdirs \ installdirs-am installdirs-recursive maintainer-clean \ maintainer-clean-generic maintainer-clean-recursive mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-recursive \ pdf pdf-am pdf-recursive ps ps-am ps-recursive tags \ tags-recursive uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-info-am uninstall-info-recursive uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/main.c0000644000076400007640000004434310171275046010642 /* * main.c -- gMFSK main * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include "interface.h" #include "support.h" #include "waterfall.h" #include "gtkdial.h" #include "miniscope.h" #include "papertape.h" #include "main.h" #include "conf.h" #include "druid.h" #include "ascii.h" #include "trx.h" #include "macro.h" #include "log.h" #include "ptt.h" #include "picture.h" #include "fft.h" #include "hamlib.h" #include "cwirc.h" #include "snd.h" #include "qsodata.h" GtkWidget *appwindow; GtkWidget *WFPopupMenu; Waterfall *waterfall; GtkTextTag *rxtag; GtkTextTag *txtag; GtkTextTag *hltag; gchar *SoftString = "gMFSK v" VERSION " (Gnome MFSK) by OH2BNS"; /* * These get used a lot so lets have static pointers to them. */ static GtkScrolledWindow *rxscrolledwindow; static GtkSpinButton *freqspinbutton; static GtkDial *metricdial; static GtkTextView *rxtextview; static GtkTextView *txtextview; static GtkTextBuffer *rxbuffer; static GtkTextBuffer *txbuffer; /* ---------------------------------------------------------------------- */ static gboolean errmsg_idle_func(gpointer data) { GtkWidget *dialog; gchar *msg = (gchar *) data; gdk_threads_enter(); dialog = gtk_message_dialog_new(GTK_WINDOW(appwindow), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", msg); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); g_free(data); gdk_threads_leave(); return FALSE; } void errmsg(const gchar *fmt, ...) { va_list args; gchar *msg; va_start(args, fmt); msg = g_strdup_vprintf(fmt, args); va_end(args); g_idle_add(errmsg_idle_func, (gpointer) msg); } /* ---------------------------------------------------------------------- */ void push_button(const gchar *name) { GtkToggleButton *button; button = GTK_TOGGLE_BUTTON(lookup_widget(appwindow, name)); gtk_toggle_button_set_active(button, TRUE); } /* ---------------------------------------------------------------------- */ struct statusbar { GtkStatusbar *bar; gchar *str; }; static guint main_timeout_id = 0; static gboolean statusbar_timeout_callback(gpointer data) { GtkStatusbar *b; gdk_threads_enter(); b = GTK_STATUSBAR(lookup_widget(appwindow, "mainstatusbar")); gtk_statusbar_pop(b, 0); gtk_statusbar_push(b, 0, ""); gdk_threads_leave(); return FALSE; } static gboolean statusbar_callback(gpointer data) { struct statusbar *s = (struct statusbar *) data; gdk_threads_enter(); gtk_statusbar_pop(s->bar, 0); gtk_statusbar_push(s->bar, 0, s->str); gdk_threads_leave(); g_free(s->str); g_free(s); return FALSE; } void statusbar_set_main(const gchar *message) { struct statusbar *s; s = g_new(struct statusbar, 1); s->bar = GTK_STATUSBAR(lookup_widget(appwindow, "mainstatusbar")); s->str = g_strdup(message); g_idle_add(statusbar_callback, s); if (main_timeout_id) g_source_remove(main_timeout_id); main_timeout_id = g_timeout_add(10000, statusbar_timeout_callback, NULL); } void statusbar_set_mode(gint mode) { struct statusbar *s; s = g_new(struct statusbar, 1); s->bar = GTK_STATUSBAR(lookup_widget(appwindow, "modestatusbar")); s->str = g_strdup(trx_mode_names[mode]); g_idle_add(statusbar_callback, s); } void statusbar_set_trxstate(gint state) { struct statusbar *s; s = g_new(struct statusbar, 1); s->bar = GTK_STATUSBAR(lookup_widget(appwindow, "trxstatusbar")); s->str = g_strdup(trx_state_names[state]); g_idle_add(statusbar_callback, s); } /* ---------------------------------------------------------------------- */ void textview_insert_pixbuf(gchar *name, GdkPixbuf *pixbuf) { GtkTextView *view; GtkTextBuffer *buffer; GtkTextIter iter; view = GTK_TEXT_VIEW(lookup_widget(appwindow, name)); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert_pixbuf(buffer, &iter, pixbuf); } void textbuffer_insert_end(GtkTextBuffer *buf, const gchar *str, int len) { GtkTextIter end; gtk_text_buffer_get_end_iter(buf, &end); gtk_text_buffer_insert(buf, &end, str, len); } void textbuffer_delete_end(GtkTextBuffer *buffer, gint count) { GtkTextIter start, end; gtk_text_buffer_get_end_iter(buffer, &start); gtk_text_buffer_get_end_iter(buffer, &end); gtk_text_iter_backward_chars(&start, count); gtk_text_buffer_delete(buffer, &start, &end); } void textview_scroll_end(GtkTextView *view) { GtkTextBuffer *buffer; GtkTextMark *mark; buffer = gtk_text_view_get_buffer(view); mark = gtk_text_buffer_get_mark(buffer, "end"); gtk_text_view_scroll_mark_onscreen(view, mark); } /* ---------------------------------------------------------------------- */ void send_char(gunichar c) { GtkEditable *editable; gchar str[8]; gint pos, len; len = g_unichar_to_utf8(c, str); switch (trx_get_mode()) { case MODE_FELDHELL: case MODE_FMHELL: editable = GTK_EDITABLE(lookup_widget(appwindow, "txentry")); pos = gtk_editable_get_position(editable); gtk_editable_insert_text(editable, str, len, &pos); gtk_editable_set_position(editable, pos); break; default: textbuffer_insert_end(txbuffer, str, len); textview_scroll_end(txtextview); break; } } void send_string(const gchar *str) { GtkEditable *editable; gint pos, len; len = strlen(str); switch (trx_get_mode()) { case MODE_FELDHELL: case MODE_FMHELL: editable = GTK_EDITABLE(lookup_widget(appwindow, "txentry")); pos = gtk_editable_get_position(editable); gtk_editable_insert_text(editable, str, len, &pos); gtk_editable_set_position(editable, pos); break; default: textbuffer_insert_end(txbuffer, str, len); textview_scroll_end(txtextview); break; } } static gboolean clear_tx_text_idle_func(gpointer data) { gdk_threads_enter(); gtk_text_buffer_set_text(txbuffer, "", -1); gdk_threads_leave(); return FALSE; } void clear_tx_text(void) { g_idle_add(clear_tx_text_idle_func, NULL); } /* ---------------------------------------------------------------------- */ void insert_rx_text(gchar *tag, gchar *str, int len) { GtkTextIter end; GError *err = NULL; gchar *to = "UTF-8"; gchar *fm = "ISO-8859-1"; // gchar *fm = "KOI8-R"; gchar *fb = "."; gtk_text_buffer_get_end_iter(rxbuffer, &end); str = g_convert_with_fallback(str, len, to, fm, fb, NULL, NULL, &err); if (!str) { if (err) { g_warning(_("insert_rx_text: conversion failed: %s"), err->message); g_error_free(err); } return; } gtk_text_buffer_insert_with_tags_by_name(rxbuffer, &end, str, len, tag, NULL); g_free(str); } static gboolean main_loop(gpointer unused) { static gboolean crflag = FALSE; static guchar databuf[30]; static gint dataptr = 0; gboolean textflag = FALSE; gchar *p, *tag; gint c; gdk_threads_enter(); /* * Check for received picture data. */ while ((c = trx_get_rx_picdata()) >= 0) { if ((c & 0xFF000000) > 0) { gint width, height, color; color = (c & 0xFF000000) >> 24; width = (c & 0x00FFF000) >> 12; height = (c & 0x00000FFF); if (color == 'C') color = 1; else color = 0; picture_start(width, height, color); continue; } picture_write(c & 0xFF); } /* * Check for received papertape data. */ while ((c = trx_get_rx_data()) >= 0) { Papertape *t1, *t2; databuf[dataptr++] = c; if (dataptr < 30) continue; t1 = PAPERTAPE(lookup_widget(appwindow, "rxtape1")); c = papertape_set_data(t1, databuf, 30); if (c == 0) { t1 = PAPERTAPE(lookup_widget(appwindow, "rxtape4")); t2 = PAPERTAPE(lookup_widget(appwindow, "rxtape3")); papertape_copy_data(t1, t2); t1 = PAPERTAPE(lookup_widget(appwindow, "rxtape3")); t2 = PAPERTAPE(lookup_widget(appwindow, "rxtape2")); papertape_copy_data(t1, t2); t1 = PAPERTAPE(lookup_widget(appwindow, "rxtape2")); t2 = PAPERTAPE(lookup_widget(appwindow, "rxtape1")); papertape_copy_data(t1, t2); t1 = PAPERTAPE(lookup_widget(appwindow, "rxtape1")); papertape_clear(t1); } dataptr = 0; } /* * Check for received characters. */ while ((c = trx_get_rx_char()) >= 0) { if (c == 0) continue; /* CR-LF reduced to a single LF */ if (crflag && c == 10) { crflag = FALSE; continue; } else if (c == 13) crflag = TRUE; /* backspace is a special case */ if (c == 8) { textbuffer_delete_end(rxbuffer, 1); log_to_file(LOG_RX, ""); continue; } if (c < 32) { p = g_strdup(ascii[c]); tag = "hltag"; } else { p = g_strdup_printf("%c", c); tag = "rxtag"; } insert_rx_text(tag, p, -1); log_to_file(LOG_RX, p); g_free(p); textflag = TRUE; } /* * Check for transmitted characters. */ while ((c = trx_get_echo_char()) >= 0) { if (c == 0) continue; /* backspace is a special case */ if (c == 8) { textbuffer_delete_end(rxbuffer, 1); log_to_file(LOG_TX, ""); continue; } if (c < 32) p = g_strdup(ascii[c]); else p = g_strdup_printf("%c", c); insert_rx_text("txtag", p, -1); log_to_file(LOG_TX, p); g_free(p); textflag = TRUE; } if (textflag == TRUE) textview_scroll_end(rxtextview); gtk_dial_set_value(metricdial, trx_get_metric()); if (!GTK_WIDGET_HAS_FOCUS(freqspinbutton)) gtk_spin_button_set_value(freqspinbutton, trx_get_freq()); gdk_threads_leave(); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); return TRUE; } /* ---------------------------------------------------------------------- */ static gchar *timestring(void) { static gchar buf[64]; struct tm *tm; time_t t; time(&t); tm = gmtime(&t); strftime(buf, sizeof(buf), "%H:%M:%SZ", tm); buf[sizeof(buf) - 1] = 0; return buf; } /* ---------------------------------------------------------------------- */ static gint clock_cb(gpointer ptr) { GtkWidget *widget; gdk_threads_enter(); widget = lookup_widget(appwindow, "clocklabel"); gtk_label_set_text(GTK_LABEL(widget), timestring()); gdk_threads_leave(); return TRUE; } static void frequency_set_cb(GtkWidget *widget, gfloat freq, gpointer data) { trx_set_freq(freq); } /* ---------------------------------------------------------------------- */ /* * Workaround for old versions of popt */ #ifndef POPT_ARGFLAG_OPTIONAL #define POPT_ARGFLAG_OPTIONAL 0 #endif static gint rundruid = 0; static gint cwircshmid = 0; static gchar *testmode = "none"; static gint modem = -1; static const struct poptOption options[] = { { "modem", '\0', POPT_ARG_INT, &modem, 1, N_("Start with specified modem"), N_("MODEM") }, { "run-druid", '\0', POPT_ARG_NONE, &rundruid, 1, N_("Run first-time configuration druid"), NULL }, { "cwirc", '\0', POPT_ARG_INT, &cwircshmid, 1, N_("Enable CWirc slave mode"), N_("SHMID") }, { "testmode", '\0', POPT_ARG_STRING | POPT_ARGFLAG_OPTIONAL, &testmode, 1, N_("Enable test mode (write audio data to stdin/stdout)"), N_("MODE") }, { NULL, '\0', 0, NULL, 0 } }; GtkWidget *find_menu_item(const gchar *path) { GtkWidget *w1, *w2; gint i; w1 = gnome_app_find_menu_pos(GNOME_APP(appwindow)->menubar, path, &i); if (w1 == NULL) { g_warning(_("Menu item \"%s\" not found!\n"), path); return NULL; } w2 = GTK_WIDGET(g_list_nth_data(GTK_MENU_SHELL(w1)->children, i - 1)); return w2; } int main(int argc, char *argv[]) { GtkStatusbar *statusbar; GnomeUIInfo *uiinfo; GtkTextIter iter; GtkTextTag *tag; gchar *wisdom; #ifdef ENABLE_NLS bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); #endif g_thread_init(NULL); gdk_threads_init(); /* FIXME: options needs to be run through gettext() */ gnome_program_init(PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, GNOME_PARAM_POPT_TABLE, options, GNOME_PARAM_APP_DATADIR, PACKAGE_DATA_DIR, NULL); if (cwircshmid && cwirc_init(cwircshmid)) return 1; /* Init GConf */ conf_init(); if (rundruid || conf_get_int("misc/druidlevel") < DRUID_LEVEL) if (druid_run() == FALSE) return 1; wisdom = conf_get_string("misc/fftwwisdom"); if (wisdom[0]) fft_set_wisdom(wisdom); else g_warning(_("FFTW wisdom not found. This is normal if you are running gMFSK for the first time.")); g_free(wisdom); /* create main window */ appwindow = create_appwindow(); qsodata_init(); /* parse testmode option */ if (!testmode || strcasecmp(testmode, "none")) { guint flags; sound_get_flags(&flags); flags &= ~SND_FLAG_TESTMODE_MASK; if (!testmode || !strcasecmp(testmode, "both")) { flags |= SND_FLAG_TESTMODE_TX; flags |= SND_FLAG_TESTMODE_RX; gtk_window_set_title(GTK_WINDOW(appwindow), _("gMFSK -- testmode (both)")); } else if (!strcasecmp(testmode, "rx")) { flags |= SND_FLAG_TESTMODE_RX; gtk_window_set_title(GTK_WINDOW(appwindow), _("gMFSK -- testmode (rx)")); } else if (!strcasecmp(testmode, "tx")) { flags |= SND_FLAG_TESTMODE_TX; gtk_window_set_title(GTK_WINDOW(appwindow), _("gMFSK -- testmode (tx)")); } else { g_warning(_("Invalid testmode '%s'\n"), testmode); return 2; } sound_set_flags(flags); } /* connect waterfall "frequency set" signal */ waterfall = WATERFALL(lookup_widget(appwindow, "waterfall")); gtk_signal_connect(GTK_OBJECT(waterfall), "frequency_set", GTK_SIGNAL_FUNC(frequency_set_cb), NULL); /* create waterfall popup menu */ WFPopupMenu = create_wfpopupmenu(); rxscrolledwindow = GTK_SCROLLED_WINDOW(lookup_widget(appwindow, "rxscrolledwindow")); freqspinbutton = GTK_SPIN_BUTTON(lookup_widget(appwindow, "freqspinbutton")); metricdial = GTK_DIAL(lookup_widget(appwindow, "metricdial")); rxtextview = GTK_TEXT_VIEW(lookup_widget(appwindow, "rxtext")); txtextview = GTK_TEXT_VIEW(lookup_widget(appwindow, "txtext")); rxbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(rxtextview)); txbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(txtextview)); statusbar = GTK_STATUSBAR(lookup_widget(appwindow, "mainstatusbar")); uiinfo = (GnomeUIInfo *) gtk_object_get_data(GTK_OBJECT(appwindow), "menubar1_uiinfo"); if (uiinfo) gnome_app_install_statusbar_menu_hints(statusbar, uiinfo); rxtag = gtk_text_buffer_create_tag(rxbuffer, "rxtag", NULL); txtag = gtk_text_buffer_create_tag(rxbuffer, "txtag", NULL); hltag = gtk_text_buffer_create_tag(rxbuffer, "hltag", NULL); /* editability tag and mark for the TX buffer */ tag = gtk_text_buffer_create_tag(txbuffer, "editabletag", NULL); g_object_set(G_OBJECT(tag), "editable", FALSE, NULL); g_object_set(G_OBJECT(tag), "foreground", "grey30", NULL); g_object_set(G_OBJECT(tag), "background", "grey90", NULL); gtk_text_buffer_get_start_iter(txbuffer, &iter); gtk_text_buffer_create_mark(txbuffer, "editablemark", &iter, TRUE); /* load config files and configure things */ conf_load(); macroconfig_load(); /* set word wrap for rx window */ gtk_text_view_set_wrap_mode(rxtextview, GTK_WRAP_WORD); /* create end marks for tx and rx buffers */ gtk_text_buffer_get_end_iter(txbuffer, &iter); gtk_text_buffer_create_mark(txbuffer, "end", &iter, FALSE); gtk_text_buffer_get_end_iter(rxbuffer, &iter); gtk_text_buffer_create_mark(rxbuffer, "end", &iter, FALSE); /* periodic task - main loop */ g_timeout_add(100, main_loop, NULL); /* periodic task - update clock */ g_timeout_add(1000, clock_cb, NULL); /* show the main window */ gtk_widget_show(appwindow); /* make trx thread start in correct mode */ if (cwirc_extension_mode) trx_set_mode(MODE_FELDHELL); else if (modem >= 0) trx_set_mode(modem); else trx_set_mode(conf_get_int("misc/lastmode")); statusbar_set_mode(trx_get_mode()); /* initialize the trx queues */ trx_init_queues(); /* start the trx thread */ trx_set_state(TRX_STATE_RX); waterfall_set_samplerate(waterfall, 8000); waterfall_set_frequency(waterfall, 1000.0); waterfall_set_center_frequency(waterfall, 1500.0); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); if (cwirc_extension_mode) { GtkWidget *w; /* Force FELDHELL mode */ w = find_menu_item("Mode/FELDHELL"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), TRUE); /* Disable the Mode menu */ w = find_menu_item("Mode"); gtk_widget_set_sensitive(w, FALSE); } else { GtkWidget *w = NULL; switch (trx_get_mode()) { default: case MODE_MFSK16: w = find_menu_item("_Mode/MFSK16"); break; case MODE_MFSK8: w = find_menu_item("_Mode/MFSK8"); break; case MODE_OLIVIA: w = find_menu_item("_Mode/OLIVIA"); break; case MODE_RTTY: w = find_menu_item("_Mode/RTTY"); break; case MODE_THROB1: w = find_menu_item("_Mode/THROB (1 tps)"); break; case MODE_THROB2: w = find_menu_item("_Mode/THROB (2 tps)"); break; case MODE_THROB4: w = find_menu_item("_Mode/THROB (4 tps)"); break; case MODE_BPSK31: w = find_menu_item("_Mode/PSK31 (BPSK)"); break; case MODE_QPSK31: w = find_menu_item("_Mode/PSK31 (QPSK)"); break; case MODE_PSK63: w = find_menu_item("_Mode/PSK63"); break; case MODE_MT63: w = find_menu_item("_Mode/MT63"); break; case MODE_FELDHELL: w = find_menu_item("_Mode/FELDHELL"); break; case MODE_CW: w = find_menu_item("_Mode/CW"); break; } gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), TRUE); } /* Initialize hamlib */ #if WANT_HAMLIB hamlib_init(); #endif /* Open PTT and set to RX */ conf_set_ptt(); ptt_set(0); /* let GTK do it's job */ gdk_threads_enter(); gtk_main(); gdk_threads_leave(); ptt_close(); #if WANT_HAMLIB hamlib_close(); #endif log_to_file_activate(FALSE); wisdom = fft_get_wisdom(); conf_set_string("misc/fftwwisdom", wisdom); fftw_free(wisdom); conf_set_int("misc/lastmode", trx_get_mode()); conf_clear(); return 0; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/main.h0000644000076400007640000000365010172025320010630 /* * main.h -- gMFSK main * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _MAIN_H #define _MAIN_H #ifdef HAVE_CONFIG_H # include #endif #include #include "waterfall.h" #ifdef __cplusplus extern "C" { #endif extern GtkWidget *appwindow; extern GtkWidget *WFPopupMenu; extern Waterfall *waterfall; extern GtkTextTag *rxtag; extern GtkTextTag *txtag; extern GtkTextTag *hltag; extern gchar *SoftString; extern void errmsg(const gchar *fmt, ...); extern void statusbar_set_main(const gchar *message); extern void statusbar_set_mode(gint mode); extern void statusbar_set_trxstate(gint state); extern void push_button(const gchar *name); extern void send_char(gunichar c); extern void send_string(const gchar *str); extern void clear_tx_text(void); extern void textview_insert_pixbuf(gchar *name, GdkPixbuf *pixbuf); extern void textbuffer_insert_end(GtkTextBuffer *buf, const gchar *str, int len); extern void textbuffer_delete_end(GtkTextBuffer *buffer, gint count); extern void textview_scroll_end(GtkTextView *view); extern GtkWidget *find_menu_item(const gchar *path); #ifdef __cplusplus } #endif #endif gmfsk-0.7pre1/src/support.c0000644000076400007640000000562010206176466011432 /* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "support.h" GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget; for (;;) { if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else parent = widget->parent; if (!parent) parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); if (parent == NULL) break; widget = parent; } found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), widget_name); if (!found_widget) g_warning ("Widget not found: %s", widget_name); return found_widget; } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename) { GtkWidget *pixmap; gchar *pathname; if (!filename || !filename[0]) return gtk_image_new (); pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, filename, TRUE, NULL); if (!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return gtk_image_new (); } pixmap = gtk_image_new_from_file (pathname); g_free (pathname); return pixmap; } /* This is an internally used function to create pixmaps. */ GdkPixbuf* create_pixbuf (const gchar *filename) { gchar *pathname = NULL; GdkPixbuf *pixbuf; GError *error = NULL; if (!filename || !filename[0]) return NULL; pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, filename, TRUE, NULL); if (!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return NULL; } pixbuf = gdk_pixbuf_new_from_file (pathname, &error); if (!pixbuf) { fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", pathname, error->message); g_error_free (error); } g_free (pathname); return pixbuf; } /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description) { gint n_actions, i; n_actions = atk_action_get_n_actions (action); for (i = 0; i < n_actions; i++) { if (!strcmp (atk_action_get_name (action, i), action_name)) atk_action_set_description (action, i, description); } } gmfsk-0.7pre1/src/support.h0000644000076400007640000000215710206176466011441 /* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #include /* * Public Functions. */ /* * This function returns a widget in a component created by Glade. * Call it with the toplevel widget in the component (i.e. a window/dialog), * or alternatively any widget in the component, and the name of the widget * you want returned. */ GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name); /* * Private Functions. */ /* This is used to create the pixmaps used in the interface. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename); /* This is used to create the pixbufs used in the interface. */ GdkPixbuf* create_pixbuf (const gchar *filename); /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description); gmfsk-0.7pre1/src/interface.c0000644000076400007640000062542310206176466011667 /* * DO NOT EDIT THIS FILE - it is generated by Glade. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include "callbacks.h" #include "interface.h" #include "support.h" #define GLADE_HOOKUP_OBJECT(component,widget,name) \ g_object_set_data_full (G_OBJECT (component), name, \ gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref) #define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ g_object_set_data (G_OBJECT (component), name, widget) static GnomeUIInfo file1_menu_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("_Send file..."), NULL, (gpointer) on_send_file1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_TOGGLEITEM, N_("_Log to file"), NULL, (gpointer) on_log_to_file1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Clear _TX window"), NULL, (gpointer) on_clear_tx_window1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Clear _RX window"), NULL, (gpointer) on_clear_rx_window1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_EXIT_ITEM (on_exit1_activate, NULL), GNOMEUIINFO_END }; static GnomeUIInfo mfsk1_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("MFSK16"), NULL, (gpointer) on_mfsk1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("MFSK8"), NULL, (gpointer) on_mfsk2_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("OLIVIA"), NULL, (gpointer) on_olivia1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("RTTY"), NULL, (gpointer) on_rtty1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("THROB (1 tps)"), NULL, (gpointer) on_throb1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("THROB (2 tps)"), NULL, (gpointer) on_throb2_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("THROB (4 tps)"), NULL, (gpointer) on_throb4_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("PSK31 (BPSK)"), NULL, (gpointer) on_bpsk31_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("PSK31 (QPSK)"), NULL, (gpointer) on_qpsk31_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("PSK63"), NULL, (gpointer) on_psk63_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("MT63"), NULL, (gpointer) on_mt63_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("FELDHELL"), NULL, (gpointer) on_feldhell1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("CW"), NULL, (gpointer) on_cw1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo mode1_menu_uiinfo[] = { { GNOME_APP_UI_RADIOITEMS, NULL, NULL, mfsk1_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo configure_macros1_menu_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("macro 1"), NULL, (gpointer) on_macroconfig1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 2"), NULL, (gpointer) on_macroconfig2_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 3"), NULL, (gpointer) on_macroconfig3_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 4"), NULL, (gpointer) on_macroconfig4_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 5"), NULL, (gpointer) on_macroconfig5_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 6"), NULL, (gpointer) on_macroconfig6_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 7"), NULL, (gpointer) on_macroconfig7_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 8"), NULL, (gpointer) on_macroconfig8_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 9"), NULL, (gpointer) on_macroconfig9_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 10"), NULL, (gpointer) on_macroconfig10_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 11"), NULL, (gpointer) on_macroconfig11_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("macro 12"), NULL, (gpointer) on_macroconfig12_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo settings1_menu_uiinfo[] = { GNOMEUIINFO_MENU_PREFERENCES_ITEM (on_preferences1_activate, NULL), { GNOME_APP_UI_SUBTREE, N_("_Configure macros"), NULL, configure_macros1_menu_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo help1_menu_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("_Contents"), NULL, (gpointer) on_contents1_activate, NULL, NULL, GNOME_APP_PIXMAP_STOCK, "gtk-help", 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_MENU_ABOUT_ITEM (on_about1_activate, NULL), GNOMEUIINFO_END }; static GnomeUIInfo menubar1_uiinfo[] = { { GNOME_APP_UI_SUBTREE, N_("_File"), NULL, file1_menu_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_SUBTREE, N_("_Mode"), NULL, mode1_menu_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_SUBTREE, N_("_Settings"), NULL, settings1_menu_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_SUBTREE, N_("_Help"), NULL, help1_menu_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; GtkWidget* create_appwindow (void) { GtkWidget *appwindow; GtkWidget *dock1; GtkWidget *toolbar1; GtkWidget *tmp_toolbar_icon; GtkWidget *pausebutton; GSList *pausebutton_group = NULL; GtkWidget *rxbutton; GtkWidget *txbutton; GtkWidget *abortbutton; GtkWidget *tunebutton; GtkWidget *vbox1; GtkWidget *qsodatatable; GtkWidget *label25; GtkWidget *label24; GtkWidget *label23; GtkWidget *label21; GtkWidget *label22; GtkWidget *qsotxrstentry; GtkWidget *qsorxrstentry; GtkWidget *qsocallentry; GtkWidget *qsoqthentry; GtkWidget *qsonotesentry; GtkWidget *label27; GtkWidget *label207; GtkWidget *label26; GtkWidget *newbutton; GtkWidget *qsonameentry; GtkWidget *qsolocentry; GtkWidget *logbutton; GtkWidget *trxnotebook; GtkWidget *vbox28; GtkWidget *rxscrolledwindow; GtkWidget *rxtext; GtkWidget *txscrolledwindow; GtkWidget *txtext; GtkWidget *label179; GtkWidget *vbox29; GtkWidget *vbox30; GtkWidget *rxtape4; GtkWidget *rxtape3; GtkWidget *rxtape2; GtkWidget *rxtape1; GtkWidget *txentry; GtkWidget *label180; GtkWidget *hbox2; GtkWidget *hbox3; GtkWidget *macrobutton1; GtkWidget *macrobutton2; GtkWidget *macrobutton3; GtkWidget *hbox4; GtkWidget *macrobutton4; GtkWidget *macrobutton5; GtkWidget *macrobutton6; GtkWidget *hbox11; GtkWidget *hbox12; GtkWidget *macrobutton7; GtkWidget *macrobutton8; GtkWidget *macrobutton9; GtkWidget *hbox13; GtkWidget *macrobutton10; GtkWidget *macrobutton11; GtkWidget *macrobutton12; GtkWidget *hseparator1; GtkWidget *hbox1; GtkWidget *waterfall; GtkWidget *vseparator2; GtkWidget *vbox9; GtkWidget *hbox16; GtkWidget *freqlabel; GtkObject *freqspinbutton_adj; GtkWidget *freqspinbutton; GtkWidget *qsybutton; GtkWidget *image2; GtkWidget *hbox17; GtkWidget *afcbutton; GtkWidget *squelchbutton; GtkWidget *reversebutton; GtkWidget *hbox18; GtkWidget *miniscope; GtkWidget *metricdial; GtkWidget *hbox20; GtkWidget *mainstatusbar; GtkWidget *trxstatusbar; GtkWidget *modeeventbox; GtkWidget *modestatusbar; GtkWidget *clocklabel; GtkAccelGroup *accel_group; GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); accel_group = gtk_accel_group_new (); appwindow = gnome_app_new ("gMFSK", _("gMFSK")); dock1 = GNOME_APP (appwindow)->dock; gtk_widget_show (dock1); gnome_app_create_menus (GNOME_APP (appwindow), menubar1_uiinfo); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (mfsk1_uiinfo[0].widget), TRUE); toolbar1 = gtk_toolbar_new (); gtk_widget_show (toolbar1); gnome_app_add_toolbar (GNOME_APP (appwindow), GTK_TOOLBAR (toolbar1), "toolbar1", BONOBO_DOCK_ITEM_BEH_EXCLUSIVE, BONOBO_DOCK_TOP, 1, 0, 0); gtk_toolbar_set_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_ICONS); tmp_toolbar_icon = create_pixmap (appwindow, "gmfsk/pause.xpm"); pausebutton = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_CHILD_RADIOBUTTON, NULL, _("Pause"), _("Suspend the modem and release soundcard (Ctl+Z)"), NULL, tmp_toolbar_icon, NULL, NULL); gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar1)->children)->data))->label), TRUE); gtk_widget_show (pausebutton); gtk_widget_add_accelerator (pausebutton, "clicked", accel_group, GDK_Z, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_radio_button_set_group (GTK_RADIO_BUTTON (pausebutton), pausebutton_group); pausebutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (pausebutton)); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (pausebutton), FALSE); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar1)); tmp_toolbar_icon = create_pixmap (appwindow, "gmfsk/rx.xpm"); rxbutton = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_CHILD_RADIOBUTTON, pausebutton, _("Receive"), _("Switch to receive (Ctl+R)"), NULL, tmp_toolbar_icon, NULL, NULL); gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar1)->children)->data))->label), TRUE); gtk_widget_show (rxbutton); gtk_widget_add_accelerator (rxbutton, "clicked", accel_group, GDK_R, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_radio_button_set_group (GTK_RADIO_BUTTON (rxbutton), pausebutton_group); pausebutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (rxbutton)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (rxbutton), TRUE); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (rxbutton), FALSE); tmp_toolbar_icon = create_pixmap (appwindow, "gmfsk/tx.xpm"); txbutton = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_CHILD_RADIOBUTTON, pausebutton, _("Transmit"), _("Switch to transmit (Ctl+T)"), NULL, tmp_toolbar_icon, NULL, NULL); gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar1)->children)->data))->label), TRUE); gtk_widget_show (txbutton); gtk_widget_add_accelerator (txbutton, "clicked", accel_group, GDK_T, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_radio_button_set_group (GTK_RADIO_BUTTON (txbutton), pausebutton_group); pausebutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (txbutton)); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (txbutton), FALSE); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar1)); tmp_toolbar_icon = gtk_image_new_from_stock ("gtk-stop", gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar1))); abortbutton = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_CHILD_BUTTON, NULL, _("Abort"), _("Abort transmission immediately (Ctl+X)"), NULL, tmp_toolbar_icon, NULL, NULL); gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar1)->children)->data))->label), TRUE); gtk_widget_show (abortbutton); gtk_widget_add_accelerator (abortbutton, "clicked", accel_group, GDK_X, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_toolbar_append_space (GTK_TOOLBAR (toolbar1)); tmp_toolbar_icon = create_pixmap (appwindow, "gmfsk/tune.xpm"); tunebutton = gtk_toolbar_append_element (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_CHILD_RADIOBUTTON, pausebutton, _("Tune"), _("Send tune signal (Ctl+U)"), NULL, tmp_toolbar_icon, NULL, NULL); gtk_label_set_use_underline (GTK_LABEL (((GtkToolbarChild*) (g_list_last (GTK_TOOLBAR (toolbar1)->children)->data))->label), TRUE); gtk_widget_show (tunebutton); gtk_widget_add_accelerator (tunebutton, "clicked", accel_group, GDK_U, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); gtk_radio_button_set_group (GTK_RADIO_BUTTON (tunebutton), pausebutton_group); pausebutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (tunebutton)); gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (tunebutton), FALSE); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox1); gnome_app_set_contents (GNOME_APP (appwindow), vbox1); qsodatatable = gtk_table_new (2, 9, FALSE); gtk_widget_show (qsodatatable); gtk_box_pack_start (GTK_BOX (vbox1), qsodatatable, FALSE, FALSE, 4); gtk_table_set_row_spacings (GTK_TABLE (qsodatatable), 1); label25 = gtk_label_new (_("Name")); gtk_widget_show (label25); gtk_table_attach (GTK_TABLE (qsodatatable), label25, 4, 5, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label25), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label25), 0, 0.5); label24 = gtk_label_new (_("Rcvd RST")); gtk_widget_show (label24); gtk_table_attach (GTK_TABLE (qsodatatable), label24, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label24), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label24), 0, 0.5); label23 = gtk_label_new (_("Sent RST")); gtk_widget_show (label23); gtk_table_attach (GTK_TABLE (qsodatatable), label23, 2, 3, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label23), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label23), 0, 0.5); label21 = gtk_label_new (_("Call")); gtk_widget_show (label21); gtk_table_attach (GTK_TABLE (qsodatatable), label21, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label21), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label21), 0, 0.5); label22 = gtk_label_new (_("Band")); gtk_widget_show (label22); gtk_table_attach (GTK_TABLE (qsodatatable), label22, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label22), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label22), 0, 0.5); qsotxrstentry = gtk_entry_new (); gtk_widget_show (qsotxrstentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsotxrstentry, 3, 4, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_entry_set_width_chars (GTK_ENTRY (qsotxrstentry), 6); qsorxrstentry = gtk_entry_new (); gtk_widget_show (qsorxrstentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsorxrstentry, 3, 4, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_entry_set_width_chars (GTK_ENTRY (qsorxrstentry), 6); qsocallentry = gtk_entry_new (); gtk_widget_show (qsocallentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsocallentry, 1, 2, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request (qsocallentry, 70, -1); qsoqthentry = gtk_entry_new (); gtk_widget_show (qsoqthentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsoqthentry, 7, 8, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); qsonotesentry = gtk_entry_new (); gtk_widget_show (qsonotesentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsonotesentry, 7, 8, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); label27 = gtk_label_new (_("QTH")); gtk_widget_show (label27); gtk_table_attach (GTK_TABLE (qsodatatable), label27, 6, 7, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label27), GTK_JUSTIFY_CENTER); label207 = gtk_label_new (_("Notes")); gtk_widget_show (label207); gtk_table_attach (GTK_TABLE (qsodatatable), label207, 6, 7, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_misc_set_alignment (GTK_MISC (label207), 0, 0.5); label26 = gtk_label_new (_("Locator")); gtk_widget_show (label26); gtk_table_attach (GTK_TABLE (qsodatatable), label26, 4, 5, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label26), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label26), 0, 0.5); newbutton = gtk_button_new_with_mnemonic (_("New entry")); gtk_widget_show (newbutton); gtk_table_attach (GTK_TABLE (qsodatatable), newbutton, 8, 9, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_tooltips_set_tip (tooltips, newbutton, _("Clear QSO data fields (Ctl-N)"), NULL); gtk_widget_add_accelerator (newbutton, "clicked", accel_group, GDK_N, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); qsonameentry = gtk_entry_new (); gtk_widget_show (qsonameentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsonameentry, 5, 6, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_set_size_request (qsonameentry, 70, -1); qsolocentry = gtk_entry_new (); gtk_widget_show (qsolocentry); gtk_table_attach (GTK_TABLE (qsodatatable), qsolocentry, 5, 6, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_widget_set_size_request (qsolocentry, 70, -1); logbutton = gtk_button_new_with_mnemonic (_("Log entry")); gtk_widget_show (logbutton); gtk_table_attach (GTK_TABLE (qsodatatable), logbutton, 8, 9, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_tooltips_set_tip (tooltips, logbutton, _("Send QSO data to xlog (Ctl-L)"), NULL); gtk_widget_add_accelerator (logbutton, "clicked", accel_group, GDK_L, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE); trxnotebook = gtk_notebook_new (); gtk_widget_show (trxnotebook); gtk_box_pack_start (GTK_BOX (vbox1), trxnotebook, TRUE, TRUE, 0); GTK_WIDGET_UNSET_FLAGS (trxnotebook, GTK_CAN_FOCUS); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (trxnotebook), FALSE); vbox28 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox28); gtk_container_add (GTK_CONTAINER (trxnotebook), vbox28); rxscrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (rxscrolledwindow); gtk_box_pack_start (GTK_BOX (vbox28), rxscrolledwindow, TRUE, TRUE, 0); GTK_WIDGET_UNSET_FLAGS (rxscrolledwindow, GTK_CAN_FOCUS); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (rxscrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (rxscrolledwindow), GTK_SHADOW_IN); rxtext = gtk_text_view_new (); gtk_widget_show (rxtext); gtk_container_add (GTK_CONTAINER (rxscrolledwindow), rxtext); gtk_widget_set_size_request (rxtext, -1, 200); gtk_container_set_border_width (GTK_CONTAINER (rxtext), 2); GTK_WIDGET_UNSET_FLAGS (rxtext, GTK_CAN_FOCUS); gtk_text_view_set_editable (GTK_TEXT_VIEW (rxtext), FALSE); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (rxtext), GTK_WRAP_WORD); txscrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (txscrolledwindow); gtk_box_pack_start (GTK_BOX (vbox28), txscrolledwindow, TRUE, TRUE, 0); GTK_WIDGET_UNSET_FLAGS (txscrolledwindow, GTK_CAN_FOCUS); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (txscrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (txscrolledwindow), GTK_SHADOW_IN); txtext = gtk_text_view_new (); gtk_widget_show (txtext); gtk_container_add (GTK_CONTAINER (txscrolledwindow), txtext); gtk_widget_set_size_request (txtext, -1, 50); gtk_container_set_border_width (GTK_CONTAINER (txtext), 2); gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (txtext), GTK_WRAP_WORD); label179 = gtk_label_new (_("textmodes")); gtk_widget_show (label179); gtk_notebook_set_tab_label (GTK_NOTEBOOK (trxnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (trxnotebook), 0), label179); vbox29 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox29); gtk_container_add (GTK_CONTAINER (trxnotebook), vbox29); vbox30 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox30); gtk_box_pack_start (GTK_BOX (vbox29), vbox30, TRUE, TRUE, 0); rxtape4 = papertape_new ("rxtape4", NULL, NULL, 0, 0); gtk_widget_show (rxtape4); gtk_box_pack_start (GTK_BOX (vbox30), rxtape4, TRUE, TRUE, 1); GTK_WIDGET_UNSET_FLAGS (rxtape4, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (rxtape4, GTK_CAN_DEFAULT); rxtape3 = papertape_new ("rxtape3", NULL, NULL, 0, 0); gtk_widget_show (rxtape3); gtk_box_pack_start (GTK_BOX (vbox30), rxtape3, TRUE, TRUE, 1); GTK_WIDGET_UNSET_FLAGS (rxtape3, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (rxtape3, GTK_CAN_DEFAULT); rxtape2 = papertape_new ("rxtape2", NULL, NULL, 0, 0); gtk_widget_show (rxtape2); gtk_box_pack_start (GTK_BOX (vbox30), rxtape2, TRUE, TRUE, 1); GTK_WIDGET_UNSET_FLAGS (rxtape2, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (rxtape2, GTK_CAN_DEFAULT); rxtape1 = papertape_new ("rxtape1", NULL, NULL, 0, 0); gtk_widget_show (rxtape1); gtk_box_pack_start (GTK_BOX (vbox30), rxtape1, TRUE, TRUE, 1); GTK_WIDGET_UNSET_FLAGS (rxtape1, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (rxtape1, GTK_CAN_DEFAULT); txentry = gtk_entry_new (); gtk_widget_show (txentry); gtk_box_pack_start (GTK_BOX (vbox29), txentry, FALSE, FALSE, 2); label180 = gtk_label_new (_("hellmodes")); gtk_widget_show (label180); gtk_notebook_set_tab_label (GTK_NOTEBOOK (trxnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (trxnotebook), 1), label180); hbox2 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox2); gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 4); hbox3 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox3); gtk_box_pack_start (GTK_BOX (hbox2), hbox3, TRUE, TRUE, 4); macrobutton1 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton1); gtk_box_pack_start (GTK_BOX (hbox3), macrobutton1, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton1, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton1, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton1, "clicked", accel_group, GDK_F1, 0, GTK_ACCEL_VISIBLE); macrobutton2 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton2); gtk_box_pack_start (GTK_BOX (hbox3), macrobutton2, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton2, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton2, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton2, "clicked", accel_group, GDK_F2, 0, GTK_ACCEL_VISIBLE); macrobutton3 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton3); gtk_box_pack_start (GTK_BOX (hbox3), macrobutton3, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton3, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton3, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton3, "clicked", accel_group, GDK_F3, 0, GTK_ACCEL_VISIBLE); hbox4 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox4); gtk_box_pack_start (GTK_BOX (hbox2), hbox4, TRUE, TRUE, 4); macrobutton4 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton4); gtk_box_pack_start (GTK_BOX (hbox4), macrobutton4, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton4, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton4, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton4, "clicked", accel_group, GDK_F4, 0, GTK_ACCEL_VISIBLE); macrobutton5 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton5); gtk_box_pack_start (GTK_BOX (hbox4), macrobutton5, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton5, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton5, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton5, "clicked", accel_group, GDK_F5, 0, GTK_ACCEL_VISIBLE); macrobutton6 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton6); gtk_box_pack_start (GTK_BOX (hbox4), macrobutton6, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton6, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton6, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton6, "clicked", accel_group, GDK_F6, 0, GTK_ACCEL_VISIBLE); hbox11 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox11); gtk_box_pack_start (GTK_BOX (vbox1), hbox11, FALSE, FALSE, 0); hbox12 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox12); gtk_box_pack_start (GTK_BOX (hbox11), hbox12, TRUE, TRUE, 4); macrobutton7 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton7); gtk_box_pack_start (GTK_BOX (hbox12), macrobutton7, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton7, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton7, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton7, "clicked", accel_group, GDK_F7, 0, GTK_ACCEL_VISIBLE); macrobutton8 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton8); gtk_box_pack_start (GTK_BOX (hbox12), macrobutton8, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton8, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton8, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton8, "clicked", accel_group, GDK_F8, 0, GTK_ACCEL_VISIBLE); macrobutton9 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton9); gtk_box_pack_start (GTK_BOX (hbox12), macrobutton9, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton9, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton9, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton9, "clicked", accel_group, GDK_F9, 0, GTK_ACCEL_VISIBLE); hbox13 = gtk_hbox_new (TRUE, 0); gtk_widget_show (hbox13); gtk_box_pack_start (GTK_BOX (hbox11), hbox13, TRUE, TRUE, 4); macrobutton10 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton10); gtk_box_pack_start (GTK_BOX (hbox13), macrobutton10, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton10, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton10, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton10, "clicked", accel_group, GDK_F10, 0, GTK_ACCEL_VISIBLE); macrobutton11 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton11); gtk_box_pack_start (GTK_BOX (hbox13), macrobutton11, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton11, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton11, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton11, "clicked", accel_group, GDK_F11, 0, GTK_ACCEL_VISIBLE); macrobutton12 = gtk_button_new_with_mnemonic (""); gtk_widget_show (macrobutton12); gtk_box_pack_start (GTK_BOX (hbox13), macrobutton12, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (macrobutton12, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, macrobutton12, _("Click right button to edit macro"), NULL); gtk_widget_add_accelerator (macrobutton12, "clicked", accel_group, GDK_F12, 0, GTK_ACCEL_VISIBLE); hseparator1 = gtk_hseparator_new (); gtk_widget_show (hseparator1); gtk_box_pack_start (GTK_BOX (vbox1), hseparator1, FALSE, FALSE, 2); hbox1 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox1); gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0); waterfall = waterfall_new ("waterfall", NULL, NULL, 0, 0); gtk_widget_show (waterfall); gtk_box_pack_start (GTK_BOX (hbox1), waterfall, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (waterfall, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (waterfall, GTK_CAN_DEFAULT); vseparator2 = gtk_vseparator_new (); gtk_widget_show (vseparator2); gtk_box_pack_start (GTK_BOX (hbox1), vseparator2, FALSE, FALSE, 4); vbox9 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox9); gtk_box_pack_start (GTK_BOX (hbox1), vbox9, FALSE, FALSE, 0); hbox16 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox16); gtk_box_pack_start (GTK_BOX (vbox9), hbox16, TRUE, TRUE, 2); freqlabel = gtk_label_new (_("Freq")); gtk_widget_show (freqlabel); gtk_box_pack_start (GTK_BOX (hbox16), freqlabel, FALSE, FALSE, 4); gtk_label_set_justify (GTK_LABEL (freqlabel), GTK_JUSTIFY_CENTER); freqspinbutton_adj = gtk_adjustment_new (1001, 0, 4000, 1, 10, 10); freqspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (freqspinbutton_adj), 1, 1); gtk_widget_show (freqspinbutton); gtk_box_pack_start (GTK_BOX (hbox16), freqspinbutton, TRUE, TRUE, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (freqspinbutton), TRUE); qsybutton = gtk_button_new (); gtk_widget_show (qsybutton); gtk_box_pack_start (GTK_BOX (hbox16), qsybutton, FALSE, FALSE, 2); gtk_tooltips_set_tip (tooltips, qsybutton, _("Center frequency on RX pass band"), NULL); image2 = gtk_image_new_from_stock ("gtk-justify-center", GTK_ICON_SIZE_BUTTON); gtk_widget_show (image2); gtk_container_add (GTK_CONTAINER (qsybutton), image2); gtk_widget_set_size_request (image2, -1, 15); hbox17 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox17); gtk_box_pack_start (GTK_BOX (vbox9), hbox17, TRUE, TRUE, 2); afcbutton = gtk_check_button_new_with_mnemonic (_("AFC")); gtk_widget_show (afcbutton); gtk_box_pack_start (GTK_BOX (hbox17), afcbutton, FALSE, FALSE, 1); GTK_WIDGET_UNSET_FLAGS (afcbutton, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, afcbutton, _("Automatic frequency control"), NULL); squelchbutton = gtk_check_button_new_with_mnemonic (_("SQL")); gtk_widget_show (squelchbutton); gtk_box_pack_start (GTK_BOX (hbox17), squelchbutton, FALSE, FALSE, 1); GTK_WIDGET_UNSET_FLAGS (squelchbutton, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, squelchbutton, _("Squelch"), NULL); reversebutton = gtk_check_button_new_with_mnemonic (_("REV")); gtk_widget_show (reversebutton); gtk_box_pack_start (GTK_BOX (hbox17), reversebutton, FALSE, FALSE, 1); GTK_WIDGET_UNSET_FLAGS (reversebutton, GTK_CAN_FOCUS); gtk_tooltips_set_tip (tooltips, reversebutton, _("Reverse polarity"), NULL); hbox18 = gtk_hbox_new (FALSE, 2); gtk_widget_show (hbox18); gtk_box_pack_start (GTK_BOX (vbox9), hbox18, TRUE, TRUE, 2); miniscope = miniscope_new ("miniscope", NULL, NULL, 0, 0); gtk_widget_show (miniscope); gtk_box_pack_start (GTK_BOX (hbox18), miniscope, TRUE, TRUE, 2); GTK_WIDGET_UNSET_FLAGS (miniscope, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (miniscope, GTK_CAN_DEFAULT); metricdial = gtk_dial_new ("metricdial", NULL, NULL, 0, 100); gtk_widget_show (metricdial); gtk_box_pack_start (GTK_BOX (hbox18), metricdial, FALSE, TRUE, 2); gtk_widget_set_size_request (metricdial, 64, 64); GTK_WIDGET_UNSET_FLAGS (metricdial, GTK_CAN_FOCUS); GTK_WIDGET_UNSET_FLAGS (metricdial, GTK_CAN_DEFAULT); hbox20 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox20); gtk_box_pack_start (GTK_BOX (vbox1), hbox20, FALSE, FALSE, 0); mainstatusbar = gtk_statusbar_new (); gtk_widget_show (mainstatusbar); gtk_box_pack_start (GTK_BOX (hbox20), mainstatusbar, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (mainstatusbar), 2); gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (mainstatusbar), FALSE); trxstatusbar = gtk_statusbar_new (); gtk_widget_show (trxstatusbar); gtk_box_pack_start (GTK_BOX (hbox20), trxstatusbar, FALSE, TRUE, 2); gtk_widget_set_size_request (trxstatusbar, 90, -1); gtk_container_set_border_width (GTK_CONTAINER (trxstatusbar), 2); gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (trxstatusbar), FALSE); modeeventbox = gtk_event_box_new (); gtk_widget_show (modeeventbox); gtk_box_pack_start (GTK_BOX (hbox20), modeeventbox, FALSE, TRUE, 2); gtk_widget_set_events (modeeventbox, GDK_BUTTON_PRESS_MASK); modestatusbar = gtk_statusbar_new (); gtk_widget_show (modestatusbar); gtk_container_add (GTK_CONTAINER (modeeventbox), modestatusbar); gtk_widget_set_size_request (modestatusbar, 80, -1); gtk_container_set_border_width (GTK_CONTAINER (modestatusbar), 2); gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (modestatusbar), FALSE); clocklabel = gtk_label_new (_("clock")); gtk_widget_show (clocklabel); gtk_box_pack_start (GTK_BOX (hbox20), clocklabel, FALSE, FALSE, 4); gtk_label_set_justify (GTK_LABEL (clocklabel), GTK_JUSTIFY_CENTER); g_signal_connect ((gpointer) appwindow, "delete_event", G_CALLBACK (on_appwindow_delete_event), NULL); g_signal_connect ((gpointer) pausebutton, "toggled", G_CALLBACK (on_pausebutton_toggled), NULL); g_signal_connect ((gpointer) rxbutton, "toggled", G_CALLBACK (on_rxbutton_toggled), NULL); g_signal_connect ((gpointer) txbutton, "toggled", G_CALLBACK (on_txbutton_toggled), NULL); g_signal_connect ((gpointer) abortbutton, "clicked", G_CALLBACK (on_abortbutton_clicked), NULL); g_signal_connect ((gpointer) tunebutton, "toggled", G_CALLBACK (on_tunebutton_toggled), NULL); g_signal_connect ((gpointer) newbutton, "clicked", G_CALLBACK (on_newbutton_clicked), NULL); g_signal_connect ((gpointer) logbutton, "clicked", G_CALLBACK (on_logbutton_clicked), NULL); g_signal_connect ((gpointer) rxtext, "populate_popup", G_CALLBACK (on_rxtext_populate_popup), NULL); g_signal_connect ((gpointer) rxtext, "button_press_event", G_CALLBACK (on_rxtext_button_press_event), NULL); g_signal_connect ((gpointer) txtext, "populate_popup", G_CALLBACK (on_txtext_populate_popup), NULL); g_signal_connect ((gpointer) txtext, "delete_from_cursor", G_CALLBACK (on_txtext_delete_from_cursor), NULL); g_signal_connect ((gpointer) macrobutton1, "clicked", G_CALLBACK (on_macrobutton1_clicked), NULL); g_signal_connect ((gpointer) macrobutton1, "button_press_event", G_CALLBACK (on_macrobutton1_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton2, "clicked", G_CALLBACK (on_macrobutton2_clicked), NULL); g_signal_connect ((gpointer) macrobutton2, "button_press_event", G_CALLBACK (on_macrobutton2_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton3, "clicked", G_CALLBACK (on_macrobutton3_clicked), NULL); g_signal_connect ((gpointer) macrobutton3, "button_press_event", G_CALLBACK (on_macrobutton3_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton4, "clicked", G_CALLBACK (on_macrobutton4_clicked), NULL); g_signal_connect ((gpointer) macrobutton4, "button_press_event", G_CALLBACK (on_macrobutton4_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton5, "clicked", G_CALLBACK (on_macrobutton5_clicked), NULL); g_signal_connect ((gpointer) macrobutton5, "button_press_event", G_CALLBACK (on_macrobutton5_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton6, "clicked", G_CALLBACK (on_macrobutton6_clicked), NULL); g_signal_connect ((gpointer) macrobutton6, "button_press_event", G_CALLBACK (on_macrobutton6_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton7, "clicked", G_CALLBACK (on_macrobutton7_clicked), NULL); g_signal_connect ((gpointer) macrobutton7, "button_press_event", G_CALLBACK (on_macrobutton7_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton8, "clicked", G_CALLBACK (on_macrobutton8_clicked), NULL); g_signal_connect ((gpointer) macrobutton8, "button_press_event", G_CALLBACK (on_macrobutton8_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton9, "clicked", G_CALLBACK (on_macrobutton9_clicked), NULL); g_signal_connect ((gpointer) macrobutton9, "button_press_event", G_CALLBACK (on_macrobutton9_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton10, "clicked", G_CALLBACK (on_macrobutton10_clicked), NULL); g_signal_connect ((gpointer) macrobutton10, "button_press_event", G_CALLBACK (on_macrobutton10_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton11, "clicked", G_CALLBACK (on_macrobutton11_clicked), NULL); g_signal_connect ((gpointer) macrobutton11, "button_press_event", G_CALLBACK (on_macrobutton11_button_press_event), NULL); g_signal_connect ((gpointer) macrobutton12, "clicked", G_CALLBACK (on_macrobutton12_clicked), NULL); g_signal_connect ((gpointer) macrobutton12, "button_press_event", G_CALLBACK (on_macrobutton12_button_press_event), NULL); g_signal_connect ((gpointer) waterfall, "button_press_event", G_CALLBACK (on_waterfall_button_press_event), NULL); g_signal_connect ((gpointer) freqspinbutton, "changed", G_CALLBACK (on_freqspinbutton_changed), NULL); g_signal_connect ((gpointer) qsybutton, "clicked", G_CALLBACK (on_qsybutton_clicked), NULL); g_signal_connect ((gpointer) afcbutton, "toggled", G_CALLBACK (on_afcbutton_toggled), NULL); g_signal_connect ((gpointer) squelchbutton, "toggled", G_CALLBACK (on_squelchbutton_toggled), NULL); g_signal_connect ((gpointer) reversebutton, "toggled", G_CALLBACK (on_reversebutton_toggled), NULL); g_signal_connect ((gpointer) modeeventbox, "button_press_event", G_CALLBACK (on_modeeventbox_button_press_event), NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (appwindow, appwindow, "appwindow"); GLADE_HOOKUP_OBJECT (appwindow, dock1, "dock1"); GLADE_HOOKUP_OBJECT (appwindow, menubar1_uiinfo[0].widget, "file1"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[0].widget, "send_file1"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[1].widget, "separator1"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[2].widget, "log_to_file1"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[3].widget, "separator4"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[4].widget, "clear_tx_window1"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[5].widget, "clear_rx_window1"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[6].widget, "separator3"); GLADE_HOOKUP_OBJECT (appwindow, file1_menu_uiinfo[7].widget, "exit1"); GLADE_HOOKUP_OBJECT (appwindow, menubar1_uiinfo[1].widget, "mode1"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[0].widget, "mfsk1"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[1].widget, "mfsk2"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[2].widget, "olivia1"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[3].widget, "rtty1"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[4].widget, "throb1"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[5].widget, "throb2"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[6].widget, "throb4"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[7].widget, "bpsk31"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[8].widget, "qpsk31"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[9].widget, "psk63"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[10].widget, "mt63"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[11].widget, "feldhell1"); GLADE_HOOKUP_OBJECT (appwindow, mfsk1_uiinfo[12].widget, "cw1"); GLADE_HOOKUP_OBJECT (appwindow, menubar1_uiinfo[2].widget, "settings1"); GLADE_HOOKUP_OBJECT (appwindow, settings1_menu_uiinfo[0].widget, "preferences1"); GLADE_HOOKUP_OBJECT (appwindow, settings1_menu_uiinfo[1].widget, "configure_macros1"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[0].widget, "macro_1"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[1].widget, "macro_2"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[2].widget, "macro_3"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[3].widget, "macro_4"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[4].widget, "macro_5"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[5].widget, "macro_6"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[6].widget, "macro_7"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[7].widget, "macro_8"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[8].widget, "macro_9"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[9].widget, "macro_10"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[10].widget, "macro_11"); GLADE_HOOKUP_OBJECT (appwindow, configure_macros1_menu_uiinfo[11].widget, "macro_12"); GLADE_HOOKUP_OBJECT (appwindow, menubar1_uiinfo[3].widget, "help1"); GLADE_HOOKUP_OBJECT (appwindow, help1_menu_uiinfo[0].widget, "contents1"); GLADE_HOOKUP_OBJECT (appwindow, help1_menu_uiinfo[1].widget, "about1"); GLADE_HOOKUP_OBJECT (appwindow, toolbar1, "toolbar1"); GLADE_HOOKUP_OBJECT (appwindow, pausebutton, "pausebutton"); GLADE_HOOKUP_OBJECT (appwindow, rxbutton, "rxbutton"); GLADE_HOOKUP_OBJECT (appwindow, txbutton, "txbutton"); GLADE_HOOKUP_OBJECT (appwindow, abortbutton, "abortbutton"); GLADE_HOOKUP_OBJECT (appwindow, tunebutton, "tunebutton"); GLADE_HOOKUP_OBJECT (appwindow, vbox1, "vbox1"); GLADE_HOOKUP_OBJECT (appwindow, qsodatatable, "qsodatatable"); GLADE_HOOKUP_OBJECT (appwindow, label25, "label25"); GLADE_HOOKUP_OBJECT (appwindow, label24, "label24"); GLADE_HOOKUP_OBJECT (appwindow, label23, "label23"); GLADE_HOOKUP_OBJECT (appwindow, label21, "label21"); GLADE_HOOKUP_OBJECT (appwindow, label22, "label22"); GLADE_HOOKUP_OBJECT (appwindow, qsotxrstentry, "qsotxrstentry"); GLADE_HOOKUP_OBJECT (appwindow, qsorxrstentry, "qsorxrstentry"); GLADE_HOOKUP_OBJECT (appwindow, qsocallentry, "qsocallentry"); GLADE_HOOKUP_OBJECT (appwindow, qsoqthentry, "qsoqthentry"); GLADE_HOOKUP_OBJECT (appwindow, qsonotesentry, "qsonotesentry"); GLADE_HOOKUP_OBJECT (appwindow, label27, "label27"); GLADE_HOOKUP_OBJECT (appwindow, label207, "label207"); GLADE_HOOKUP_OBJECT (appwindow, label26, "label26"); GLADE_HOOKUP_OBJECT (appwindow, newbutton, "newbutton"); GLADE_HOOKUP_OBJECT (appwindow, qsonameentry, "qsonameentry"); GLADE_HOOKUP_OBJECT (appwindow, qsolocentry, "qsolocentry"); GLADE_HOOKUP_OBJECT (appwindow, logbutton, "logbutton"); GLADE_HOOKUP_OBJECT (appwindow, trxnotebook, "trxnotebook"); GLADE_HOOKUP_OBJECT (appwindow, vbox28, "vbox28"); GLADE_HOOKUP_OBJECT (appwindow, rxscrolledwindow, "rxscrolledwindow"); GLADE_HOOKUP_OBJECT (appwindow, rxtext, "rxtext"); GLADE_HOOKUP_OBJECT (appwindow, txscrolledwindow, "txscrolledwindow"); GLADE_HOOKUP_OBJECT (appwindow, txtext, "txtext"); GLADE_HOOKUP_OBJECT (appwindow, label179, "label179"); GLADE_HOOKUP_OBJECT (appwindow, vbox29, "vbox29"); GLADE_HOOKUP_OBJECT (appwindow, vbox30, "vbox30"); GLADE_HOOKUP_OBJECT (appwindow, rxtape4, "rxtape4"); GLADE_HOOKUP_OBJECT (appwindow, rxtape3, "rxtape3"); GLADE_HOOKUP_OBJECT (appwindow, rxtape2, "rxtape2"); GLADE_HOOKUP_OBJECT (appwindow, rxtape1, "rxtape1"); GLADE_HOOKUP_OBJECT (appwindow, txentry, "txentry"); GLADE_HOOKUP_OBJECT (appwindow, label180, "label180"); GLADE_HOOKUP_OBJECT (appwindow, hbox2, "hbox2"); GLADE_HOOKUP_OBJECT (appwindow, hbox3, "hbox3"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton1, "macrobutton1"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton2, "macrobutton2"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton3, "macrobutton3"); GLADE_HOOKUP_OBJECT (appwindow, hbox4, "hbox4"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton4, "macrobutton4"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton5, "macrobutton5"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton6, "macrobutton6"); GLADE_HOOKUP_OBJECT (appwindow, hbox11, "hbox11"); GLADE_HOOKUP_OBJECT (appwindow, hbox12, "hbox12"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton7, "macrobutton7"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton8, "macrobutton8"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton9, "macrobutton9"); GLADE_HOOKUP_OBJECT (appwindow, hbox13, "hbox13"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton10, "macrobutton10"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton11, "macrobutton11"); GLADE_HOOKUP_OBJECT (appwindow, macrobutton12, "macrobutton12"); GLADE_HOOKUP_OBJECT (appwindow, hseparator1, "hseparator1"); GLADE_HOOKUP_OBJECT (appwindow, hbox1, "hbox1"); GLADE_HOOKUP_OBJECT (appwindow, waterfall, "waterfall"); GLADE_HOOKUP_OBJECT (appwindow, vseparator2, "vseparator2"); GLADE_HOOKUP_OBJECT (appwindow, vbox9, "vbox9"); GLADE_HOOKUP_OBJECT (appwindow, hbox16, "hbox16"); GLADE_HOOKUP_OBJECT (appwindow, freqlabel, "freqlabel"); GLADE_HOOKUP_OBJECT (appwindow, freqspinbutton, "freqspinbutton"); GLADE_HOOKUP_OBJECT (appwindow, qsybutton, "qsybutton"); GLADE_HOOKUP_OBJECT (appwindow, image2, "image2"); GLADE_HOOKUP_OBJECT (appwindow, hbox17, "hbox17"); GLADE_HOOKUP_OBJECT (appwindow, afcbutton, "afcbutton"); GLADE_HOOKUP_OBJECT (appwindow, squelchbutton, "squelchbutton"); GLADE_HOOKUP_OBJECT (appwindow, reversebutton, "reversebutton"); GLADE_HOOKUP_OBJECT (appwindow, hbox18, "hbox18"); GLADE_HOOKUP_OBJECT (appwindow, miniscope, "miniscope"); GLADE_HOOKUP_OBJECT (appwindow, metricdial, "metricdial"); GLADE_HOOKUP_OBJECT (appwindow, hbox20, "hbox20"); GLADE_HOOKUP_OBJECT (appwindow, mainstatusbar, "mainstatusbar"); GLADE_HOOKUP_OBJECT (appwindow, trxstatusbar, "trxstatusbar"); GLADE_HOOKUP_OBJECT (appwindow, modeeventbox, "modeeventbox"); GLADE_HOOKUP_OBJECT (appwindow, modestatusbar, "modestatusbar"); GLADE_HOOKUP_OBJECT (appwindow, clocklabel, "clocklabel"); GLADE_HOOKUP_OBJECT_NO_REF (appwindow, tooltips, "tooltips"); gtk_widget_grab_focus (txtext); gtk_window_add_accel_group (GTK_WINDOW (appwindow), accel_group); return appwindow; } GtkWidget* create_aboutwindow (void) { const gchar *authors[] = { "Author:", "Tomi Manninen, OH2BNS .", "MFSK modem:", "Help for pictures support from Denis, UU9JDR.", "RTTY modem:", "Ideas from Jesús, EB1DIX.", "THROB modem:", "Ideas from Lionel, G3PPT.", "PSK31 modem:", "Ideas from Hansi, DL9RDZ.", "MT63 and OLIVIA modem:", "Written by Pawel, SP9VRC.", "CW modem:", "Written by Lawrence, VE7IT with ideas and code", "from the Unix-Cw project by Simon, G0FRD.", "Original FeldHell font:", "Peter, G3PLX.", "Other FeldHell fonts:", "Nino, IZ8BLY.", NULL }; const gchar *documenters[] = { NULL }; /* TRANSLATORS: Replace this string with your names, one name per line. */ gchar *translators = _("translator_credits"); GdkPixbuf *aboutwindow_logo_pixbuf; GtkWidget *aboutwindow; if (!strcmp (translators, "translator_credits")) translators = NULL; aboutwindow_logo_pixbuf = create_pixbuf ("gmfsk/mfsk.png"); aboutwindow = gnome_about_new ("gMFSK", VERSION, _("Copyright 2001-2005 Tomi Manninen, OH2BNS"), _("A Gnome terminal program for HF conversation modes (MFSK, OLIVIA, RTTY, THROB, PSK31, MT63 and FeldHell)"), authors, documenters, translators, aboutwindow_logo_pixbuf); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (aboutwindow, aboutwindow, "aboutwindow"); return aboutwindow; } GtkWidget* create_txfileselection (void) { GtkWidget *txfileselection; GtkWidget *txfileselect_ok_button; GtkWidget *txfileselect_cancel_button; txfileselection = gtk_file_selection_new (_("Select File to Transmit")); gtk_container_set_border_width (GTK_CONTAINER (txfileselection), 10); gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (txfileselection)); txfileselect_ok_button = GTK_FILE_SELECTION (txfileselection)->ok_button; gtk_widget_show (txfileselect_ok_button); GTK_WIDGET_SET_FLAGS (txfileselect_ok_button, GTK_CAN_DEFAULT); txfileselect_cancel_button = GTK_FILE_SELECTION (txfileselection)->cancel_button; gtk_widget_show (txfileselect_cancel_button); GTK_WIDGET_SET_FLAGS (txfileselect_cancel_button, GTK_CAN_DEFAULT); g_signal_connect ((gpointer) txfileselection, "delete_event", G_CALLBACK (on_txfileselection_delete_event), NULL); g_signal_connect ((gpointer) txfileselect_ok_button, "clicked", G_CALLBACK (on_txfileselect_ok_button_clicked), NULL); g_signal_connect ((gpointer) txfileselect_cancel_button, "clicked", G_CALLBACK (on_txfileselect_cancel_button_clicked), NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (txfileselection, txfileselection, "txfileselection"); GLADE_HOOKUP_OBJECT_NO_REF (txfileselection, txfileselect_ok_button, "txfileselect_ok_button"); GLADE_HOOKUP_OBJECT_NO_REF (txfileselection, txfileselect_cancel_button, "txfileselect_cancel_button"); return txfileselection; } static GnomeUIInfo waterfall1_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("Waterfall"), NULL, (gpointer) on_waterfall1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Spectrum"), NULL, (gpointer) on_spectrum1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Scope"), NULL, (gpointer) on_scope1_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo wfpopupmenu_uiinfo[] = { { GNOME_APP_UI_TOGGLEITEM, N_("Pause"), NULL, (gpointer) on_wfpause_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_RADIOITEMS, NULL, NULL, waterfall1_uiinfo, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Waterfall properties..."), NULL, (gpointer) on_wfproperties_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; GtkWidget* create_wfpopupmenu (void) { GtkWidget *wfpopupmenu; wfpopupmenu = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (wfpopupmenu), wfpopupmenu_uiinfo, NULL, FALSE, 0); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (waterfall1_uiinfo[0].widget), TRUE); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (wfpopupmenu, wfpopupmenu, "wfpopupmenu"); GLADE_HOOKUP_OBJECT (wfpopupmenu, wfpopupmenu_uiinfo[0].widget, "wfpause"); GLADE_HOOKUP_OBJECT (wfpopupmenu, wfpopupmenu_uiinfo[1].widget, "separator7"); GLADE_HOOKUP_OBJECT (wfpopupmenu, waterfall1_uiinfo[0].widget, "waterfall1"); GLADE_HOOKUP_OBJECT (wfpopupmenu, waterfall1_uiinfo[1].widget, "spectrum1"); GLADE_HOOKUP_OBJECT (wfpopupmenu, waterfall1_uiinfo[2].widget, "scope1"); GLADE_HOOKUP_OBJECT (wfpopupmenu, wfpopupmenu_uiinfo[3].widget, "separator9"); GLADE_HOOKUP_OBJECT (wfpopupmenu, wfpopupmenu_uiinfo[4].widget, "wfproperties"); return wfpopupmenu; } static GnomeUIInfo menu12_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("125 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("250 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("500 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("1000 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("2000 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu13_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("4"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("8"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("16"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("32"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("64"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("128"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("256"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo convertwidget56_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("none"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("even"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("odd"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("zero"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("one"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo convertwidget62_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("1"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("1.5"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("2"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo convertwidget66_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("5 (BAUDOT)"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("7 (ASCII)"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("8 (ASCII)"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu1_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("32 (short)"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("64 (long)"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu3_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("500 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("1000 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("2000 Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu7_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("Waterfall"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Spectrum"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Scope"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu8_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("x 1"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("x 2"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("x 4"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu6_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("Half"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Normal"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Double"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu4_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("Boxcar"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Triangular"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Hamming"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo menu9_uiinfo[] = { GNOMEUIINFO_END }; static GnomeUIInfo menu11_uiinfo[] = { GNOMEUIINFO_END }; static GnomeUIInfo menu10_uiinfo[] = { { GNOME_APP_UI_ITEM, N_("MHz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("kHz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("Hz"), NULL, (gpointer) NULL, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; GtkWidget* create_confdialog (void) { GtkWidget *confdialog; GtkWidget *dialog_vbox1; GtkWidget *hbox21; GtkWidget *vbox15; GtkWidget *scrolledwindow4; GtkWidget *conftreeview; GtkWidget *confnotebook; GtkWidget *label178; GtkWidget *label151; GtkWidget *vbox4; GtkWidget *vbox16; GtkWidget *label152; GtkWidget *table2; GtkWidget *label9; GtkWidget *label10; GtkWidget *label11; GtkWidget *label12; GtkWidget *label13; GtkWidget *callentry; GtkWidget *nameentry; GtkWidget *qthentry; GtkWidget *locentry; GtkWidget *emailentry; GtkWidget *label6; GtkWidget *vbox19; GtkWidget *label156; GtkWidget *table8; GtkWidget *label44; GtkWidget *label46; GtkWidget *timeentry; GtkWidget *dateentry; GtkWidget *label153; GtkWidget *vbox18; GtkWidget *label155; GtkWidget *qsobandsentry; GtkWidget *label154; GtkWidget *vbox26; GtkWidget *label169; GtkWidget *table17; GtkWidget *logfileentry; GtkWidget *label167; GtkWidget *label211; GtkWidget *label212; GtkWidget *txpicdirentry; GtkWidget *rxpicdirentry; GtkWidget *label43; GtkWidget *vbox20; GtkWidget *label159; GtkWidget *table13; GtkWidget *rxcolorpicker; GtkWidget *txcolorpicker; GtkWidget *hlcolorpicker; GtkWidget *rxwincolorpicker; GtkWidget *txwincolorpicker; GtkWidget *label14; GtkWidget *label15; GtkWidget *label16; GtkWidget *label29; GtkWidget *label30; GtkWidget *label158; GtkWidget *vbox3; GtkWidget *label165; GtkWidget *table4; GtkWidget *label17; GtkWidget *label18; GtkWidget *txfontpicker; GtkWidget *rxfontpicker; GtkWidget *label7; GtkWidget *vbox12; GtkWidget *label157; GtkWidget *table12; GtkObject *txoffsetspinbutton_adj; GtkWidget *txoffsetspinbutton; GtkWidget *label19; GtkWidget *label168; GtkWidget *vbox31; GtkWidget *label185; GtkWidget *hbox24; GtkWidget *frame1; GtkWidget *mfsksqlvscale; GtkWidget *label195; GtkWidget *mfskrestartbutton; GtkWidget *label181; GtkWidget *vbox50; GtkWidget *label251; GtkWidget *hbox34; GtkWidget *frame18; GtkWidget *oliviasqlvscale; GtkWidget *label252; GtkWidget *frame19; GtkWidget *vbox51; GtkWidget *table24; GtkWidget *oliviabwoptionmenu; GtkWidget *menu12; GtkWidget *oliviatonesoptionmenu; GtkWidget *menu13; GtkWidget *label253; GtkWidget *label254; GtkWidget *label256; GtkWidget *label257; GtkObject *oliviasmargspinbutton_adj; GtkWidget *oliviasmargspinbutton; GtkObject *oliviasintegspinbutton_adj; GtkWidget *oliviasintegspinbutton; GtkWidget *oliviaesccheckbutton; GtkWidget *label255; GtkWidget *oliviarestartbutton; GtkWidget *label250; GtkWidget *vbox21; GtkWidget *label161; GtkWidget *hbox25; GtkWidget *frame2; GtkWidget *rttysqlvscale; GtkWidget *label196; GtkWidget *frame6; GtkWidget *vbox39; GtkWidget *table7; GtkWidget *parityoptionmenu; GtkWidget *convertwidget56; GtkWidget *stopoptionmenu; GtkWidget *convertwidget62; GtkWidget *bitsoptionmenu; GtkWidget *convertwidget66; GtkWidget *rttyshiftcombo; GList *rttyshiftcombo_items = NULL; GtkWidget *rttyshiftentry; GtkWidget *rttybaudcombo; GList *rttybaudcombo_items = NULL; GtkWidget *rttybaudentry; GtkWidget *label35; GtkWidget *label36; GtkWidget *label37; GtkWidget *label38; GtkWidget *label39; GtkWidget *reversecheckbutton; GtkWidget *msbcheckbutton; GtkWidget *label200; GtkWidget *rttyrestartbutton; GtkWidget *label34; GtkWidget *vbox32; GtkWidget *label186; GtkWidget *hbox31; GtkWidget *frame13; GtkWidget *throbsqlvscale; GtkWidget *label210; GtkWidget *throbrestartbutton; GtkWidget *label182; GtkWidget *vbox33; GtkWidget *label187; GtkWidget *hbox26; GtkWidget *frame3; GtkWidget *psk31sqlvscale; GtkWidget *label197; GtkWidget *psk31restartbutton; GtkWidget *label183; GtkWidget *vbox27; GtkWidget *label171; GtkWidget *hbox27; GtkWidget *frame4; GtkWidget *mt63sqlvscale; GtkWidget *label198; GtkWidget *frame5; GtkWidget *vbox38; GtkWidget *table14; GtkWidget *ileaveoptionmenu; GtkWidget *menu1; GtkWidget *bwoptionmenu; GtkWidget *menu3; GtkWidget *label174; GtkWidget *label175; GtkWidget *cwidcheckbutton; GtkWidget *mt63esccheckbutton; GtkWidget *label199; GtkWidget *mt63restartbutton; GtkWidget *label170; GtkWidget *vbox34; GtkWidget *label188; GtkWidget *vbox36; GtkWidget *table16; GtkWidget *label208; GtkWidget *label209; GtkWidget *hellcheckbutton; GtkWidget *hellfontpicker; GtkWidget *hbox28; GtkWidget *frame7; GtkWidget *hellfiltvscale; GtkWidget *label201; GtkWidget *frame8; GtkWidget *hellagc1vscale; GtkWidget *label202; GtkWidget *frame9; GtkWidget *hellagc2vscale; GtkWidget *label203; GtkWidget *label184; GtkWidget *vbox49; GtkWidget *label246; GtkWidget *hbox33; GtkWidget *frame15; GtkWidget *cwsqlvscale; GtkWidget *label247; GtkWidget *frame17; GtkWidget *cwbwvscale; GtkWidget *label249; GtkWidget *frame16; GtkWidget *cwspeedvscale; GtkWidget *label248; GtkWidget *cwrestartbutton; GtkWidget *label245; GtkWidget *vbox35; GtkWidget *label190; GtkWidget *hbox29; GtkWidget *frame10; GtkWidget *wfrefvscale; GtkWidget *label204; GtkWidget *frame11; GtkWidget *wfampvscale; GtkWidget *label205; GtkWidget *frame12; GtkWidget *vbox40; GtkWidget *table15; GtkWidget *label191; GtkWidget *label192; GtkWidget *label193; GtkWidget *label194; GtkWidget *wfmodeoptionmenu; GtkWidget *menu7; GtkWidget *wfzoomoptionmenu; GtkWidget *menu8; GtkWidget *wfspeedoptionmenu; GtkWidget *menu6; GtkWidget *wfwindowoptionmenu; GtkWidget *menu4; GtkWidget *wfdircheckbutton; GtkWidget *label206; GtkWidget *label189; GtkWidget *vbox5; GtkWidget *vbox22; GtkWidget *label162; GtkWidget *table23; GtkWidget *eightbitcheckbutton; GtkWidget *stereocheckbutton; GtkWidget *rwcheckbutton; GtkWidget *label28; GtkWidget *soundcombo; GList *soundcombo_items = NULL; GtkWidget *soundentry; GtkWidget *label242; GtkWidget *label243; GtkWidget *label244; GtkObject *ratespinbutton_adj; GtkWidget *ratespinbutton; GtkObject *txppmspinbutton_adj; GtkWidget *txppmspinbutton; GtkObject *rxppmspinbutton_adj; GtkWidget *rxppmspinbutton; GtkWidget *soundrestartbutton; GtkWidget *label8; GtkWidget *vbox23; GtkWidget *label163; GtkWidget *vbox7; GtkWidget *table10; GtkWidget *pttrtsradiobutton; GSList *pttrtsradiobutton_group = NULL; GtkWidget *pttdtrradiobutton; GtkWidget *pttbothradiobutton; GtkWidget *pttcombo; GList *pttcombo_items = NULL; GtkWidget *pttentry; GtkWidget *label32; GtkWidget *label49; GtkWidget *pttinvcheckbutton; GtkWidget *label31; GtkWidget *vbox41; GtkWidget *label214; GtkWidget *hamlibcheckbutton; GtkWidget *frame14; GtkWidget *table18; GtkWidget *label216; GtkWidget *hamliboptionmenu; GtkWidget *menu9; GtkWidget *label217; GtkWidget *hamlibcombo; GList *hamlibcombo_items = NULL; GtkWidget *hamlibentry; GtkWidget *label223; GtkWidget *hamlibspeedoptionmenu; GtkWidget *menu11; GtkWidget *hamlibconfentry; GtkWidget *label241; GtkWidget *label215; GtkWidget *label123; GtkWidget *vbox42; GtkWidget *label219; GtkWidget *table19; GtkWidget *hlwfcheckbutton; GtkWidget *hlqsocheckbutton; GtkWidget *hlpttcheckbutton; GtkWidget *label222; GtkWidget *hlresoptionmenu; GtkWidget *menu10; GtkObject *qsyspinbutton_adj; GtkWidget *qsyspinbutton; GtkWidget *label258; GtkWidget *label218; GtkWidget *dialog_action_area1; GtkWidget *confhelpbutton; GtkWidget *confclosebutton; GtkTooltips *tooltips; tooltips = gtk_tooltips_new (); confdialog = gtk_dialog_new (); gtk_window_set_title (GTK_WINDOW (confdialog), _("Preferences")); dialog_vbox1 = GTK_DIALOG (confdialog)->vbox; gtk_widget_show (dialog_vbox1); hbox21 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox21); gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox21, TRUE, TRUE, 0); vbox15 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox15); gtk_box_pack_start (GTK_BOX (hbox21), vbox15, TRUE, TRUE, 6); scrolledwindow4 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow4); gtk_box_pack_start (GTK_BOX (vbox15), scrolledwindow4, TRUE, TRUE, 0); gtk_widget_set_size_request (scrolledwindow4, 160, 350); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow4), GTK_SHADOW_ETCHED_IN); conftreeview = gtk_tree_view_new (); gtk_widget_show (conftreeview); gtk_container_add (GTK_CONTAINER (scrolledwindow4), conftreeview); gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (conftreeview), FALSE); confnotebook = gtk_notebook_new (); gtk_widget_show (confnotebook); gtk_box_pack_start (GTK_BOX (hbox21), confnotebook, TRUE, TRUE, 0); GTK_WIDGET_UNSET_FLAGS (confnotebook, GTK_CAN_FOCUS); gtk_notebook_set_show_tabs (GTK_NOTEBOOK (confnotebook), FALSE); label178 = gtk_label_new (_("gMFSK")); gtk_widget_show (label178); gtk_container_add (GTK_CONTAINER (confnotebook), label178); gtk_label_set_use_markup (GTK_LABEL (label178), TRUE); label151 = gtk_label_new (_("Logo")); gtk_widget_show (label151); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 0), label151); vbox4 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox4); gtk_container_add (GTK_CONTAINER (confnotebook), vbox4); vbox16 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox16); gtk_box_pack_start (GTK_BOX (vbox4), vbox16, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox16), 4); label152 = gtk_label_new (_("The station information is used in the macros like $mycall, $myname, etc. ")); gtk_widget_show (label152); gtk_box_pack_start (GTK_BOX (vbox16), label152, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label152), TRUE); gtk_misc_set_alignment (GTK_MISC (label152), 0, 0.5); table2 = gtk_table_new (5, 2, FALSE); gtk_widget_show (table2); gtk_box_pack_start (GTK_BOX (vbox16), table2, TRUE, TRUE, 0); label9 = gtk_label_new (_("Callsign")); gtk_widget_show (label9); gtk_table_attach (GTK_TABLE (table2), label9, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label9), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label9), 0, 0.5); label10 = gtk_label_new (_("Name")); gtk_widget_show (label10); gtk_table_attach (GTK_TABLE (table2), label10, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label10), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label10), 7.45058e-09, 0.5); label11 = gtk_label_new (_("QTH")); gtk_widget_show (label11); gtk_table_attach (GTK_TABLE (table2), label11, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label11), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label11), 7.45058e-09, 0.5); label12 = gtk_label_new (_("Locator")); gtk_widget_show (label12); gtk_table_attach (GTK_TABLE (table2), label12, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label12), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label12), 7.45058e-09, 0.5); label13 = gtk_label_new (_("E-mail")); gtk_widget_show (label13); gtk_table_attach (GTK_TABLE (table2), label13, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label13), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label13), 7.45058e-09, 0.5); callentry = gtk_entry_new (); gtk_widget_show (callentry); gtk_table_attach (GTK_TABLE (table2), callentry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); nameentry = gtk_entry_new (); gtk_widget_show (nameentry); gtk_table_attach (GTK_TABLE (table2), nameentry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); qthentry = gtk_entry_new (); gtk_widget_show (qthentry); gtk_table_attach (GTK_TABLE (table2), qthentry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); locentry = gtk_entry_new (); gtk_widget_show (locentry); gtk_table_attach (GTK_TABLE (table2), locentry, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); emailentry = gtk_entry_new (); gtk_widget_show (emailentry); gtk_table_attach (GTK_TABLE (table2), emailentry, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); label6 = gtk_label_new (_("Station")); gtk_widget_show (label6); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 1), label6); gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_CENTER); vbox19 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox19); gtk_container_add (GTK_CONTAINER (confnotebook), vbox19); gtk_container_set_border_width (GTK_CONTAINER (vbox19), 4); label156 = gtk_label_new (_("These are used in the $date and $date macros. See the strftime manual page for an explanation of the format.")); gtk_widget_show (label156); gtk_box_pack_start (GTK_BOX (vbox19), label156, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label156), TRUE); gtk_misc_set_alignment (GTK_MISC (label156), 0, 0.5); table8 = gtk_table_new (2, 2, FALSE); gtk_widget_show (table8); gtk_box_pack_start (GTK_BOX (vbox19), table8, TRUE, TRUE, 0); label44 = gtk_label_new (_("Time format string")); gtk_widget_show (label44); gtk_table_attach (GTK_TABLE (table8), label44, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label44), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label44), 0, 0.5); label46 = gtk_label_new (_("Date format string")); gtk_widget_show (label46); gtk_table_attach (GTK_TABLE (table8), label46, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label46), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label46), 0, 0.5); timeentry = gtk_entry_new (); gtk_widget_show (timeentry); gtk_table_attach (GTK_TABLE (table8), timeentry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_tooltips_set_tip (tooltips, timeentry, _("See the strftime manual page for explanation of this field"), NULL); dateentry = gtk_entry_new (); gtk_widget_show (dateentry); gtk_table_attach (GTK_TABLE (table8), dateentry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_tooltips_set_tip (tooltips, dateentry, _("See the strftime manual page for explanation of this field"), NULL); label153 = gtk_label_new (_("Time")); gtk_widget_show (label153); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 2), label153); vbox18 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox18); gtk_container_add (GTK_CONTAINER (confnotebook), vbox18); gtk_container_set_border_width (GTK_CONTAINER (vbox18), 4); label155 = gtk_label_new (_("This is a comma separated list of bands you want to appear in the Bands popdown list.")); gtk_widget_show (label155); gtk_box_pack_start (GTK_BOX (vbox18), label155, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label155), TRUE); gtk_misc_set_alignment (GTK_MISC (label155), 0, 0.5); qsobandsentry = gtk_entry_new (); gtk_widget_show (qsobandsentry); gtk_box_pack_start (GTK_BOX (vbox18), qsobandsentry, FALSE, FALSE, 8); label154 = gtk_label_new (_("Bands")); gtk_widget_show (label154); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 3), label154); vbox26 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox26); gtk_container_add (GTK_CONTAINER (confnotebook), vbox26); gtk_container_set_border_width (GTK_CONTAINER (vbox26), 4); label169 = gtk_label_new (_("Files and directories used by gMFSK.")); gtk_widget_show (label169); gtk_box_pack_start (GTK_BOX (vbox26), label169, FALSE, FALSE, 8); gtk_label_set_line_wrap (GTK_LABEL (label169), TRUE); gtk_misc_set_alignment (GTK_MISC (label169), 0, 0.5); table17 = gtk_table_new (3, 2, FALSE); gtk_widget_show (table17); gtk_box_pack_start (GTK_BOX (vbox26), table17, TRUE, TRUE, 0); logfileentry = gtk_entry_new (); gtk_widget_show (logfileentry); gtk_table_attach (GTK_TABLE (table17), logfileentry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); label167 = gtk_label_new (_("Log file name")); gtk_widget_show (label167); gtk_table_attach (GTK_TABLE (table17), label167, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_misc_set_alignment (GTK_MISC (label167), 0, 0.5); label211 = gtk_label_new (_("TX pictures directory")); gtk_widget_show (label211); gtk_table_attach (GTK_TABLE (table17), label211, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_misc_set_alignment (GTK_MISC (label211), 0, 0.5); label212 = gtk_label_new (_("RX pictures directory")); gtk_widget_show (label212); gtk_table_attach (GTK_TABLE (table17), label212, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_misc_set_alignment (GTK_MISC (label212), 0, 0.5); txpicdirentry = gtk_entry_new (); gtk_widget_show (txpicdirentry); gtk_table_attach (GTK_TABLE (table17), txpicdirentry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); rxpicdirentry = gtk_entry_new (); gtk_widget_show (rxpicdirentry); gtk_table_attach (GTK_TABLE (table17), rxpicdirentry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); label43 = gtk_label_new (_("Files")); gtk_widget_show (label43); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 4), label43); gtk_label_set_justify (GTK_LABEL (label43), GTK_JUSTIFY_CENTER); vbox20 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox20); gtk_container_add (GTK_CONTAINER (confnotebook), vbox20); gtk_container_set_border_width (GTK_CONTAINER (vbox20), 4); label159 = gtk_label_new (_("The color settings let you configure the colors used in the RX and TX windows.")); gtk_widget_show (label159); gtk_box_pack_start (GTK_BOX (vbox20), label159, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label159), TRUE); gtk_misc_set_alignment (GTK_MISC (label159), 0, 0.5); table13 = gtk_table_new (5, 2, FALSE); gtk_widget_show (table13); gtk_box_pack_start (GTK_BOX (vbox20), table13, TRUE, TRUE, 0); rxcolorpicker = gnome_color_picker_new (); gtk_widget_show (rxcolorpicker); gtk_table_attach (GTK_TABLE (table13), rxcolorpicker, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); txcolorpicker = gnome_color_picker_new (); gtk_widget_show (txcolorpicker); gtk_table_attach (GTK_TABLE (table13), txcolorpicker, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); hlcolorpicker = gnome_color_picker_new (); gtk_widget_show (hlcolorpicker); gtk_table_attach (GTK_TABLE (table13), hlcolorpicker, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); rxwincolorpicker = gnome_color_picker_new (); gtk_widget_show (rxwincolorpicker); gtk_table_attach (GTK_TABLE (table13), rxwincolorpicker, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); txwincolorpicker = gnome_color_picker_new (); gtk_widget_show (txwincolorpicker); gtk_table_attach (GTK_TABLE (table13), txwincolorpicker, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); label14 = gtk_label_new (_("Received text color")); gtk_widget_show (label14); gtk_table_attach (GTK_TABLE (table13), label14, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 0); gtk_label_set_justify (GTK_LABEL (label14), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label14), 7.45058e-09, 0.5); label15 = gtk_label_new (_("Transmitted text color")); gtk_widget_show (label15); gtk_table_attach (GTK_TABLE (table13), label15, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 0); gtk_label_set_justify (GTK_LABEL (label15), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label15), 7.45058e-09, 0.5); label16 = gtk_label_new (_("HIghlighted text color")); gtk_widget_show (label16); gtk_table_attach (GTK_TABLE (table13), label16, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 0); gtk_label_set_justify (GTK_LABEL (label16), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label16), 7.45058e-09, 0.5); label29 = gtk_label_new (_("RX window background color")); gtk_widget_show (label29); gtk_table_attach (GTK_TABLE (table13), label29, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 0); gtk_label_set_justify (GTK_LABEL (label29), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label29), 0, 0.5); label30 = gtk_label_new (_("TX window background color")); gtk_widget_show (label30); gtk_table_attach (GTK_TABLE (table13), label30, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 0); gtk_label_set_justify (GTK_LABEL (label30), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label30), 0, 0.5); label158 = gtk_label_new (_("Colors")); gtk_widget_show (label158); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 5), label158); vbox3 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox3); gtk_container_add (GTK_CONTAINER (confnotebook), vbox3); gtk_container_set_border_width (GTK_CONTAINER (vbox3), 4); label165 = gtk_label_new (_("The fonts settings let you configure the fonts used in the RX and TX windows.")); gtk_widget_show (label165); gtk_box_pack_start (GTK_BOX (vbox3), label165, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label165), TRUE); gtk_misc_set_alignment (GTK_MISC (label165), 0, 0.5); table4 = gtk_table_new (2, 2, FALSE); gtk_widget_show (table4); gtk_box_pack_start (GTK_BOX (vbox3), table4, TRUE, TRUE, 0); label17 = gtk_label_new (_("Received text font")); gtk_widget_show (label17); gtk_table_attach (GTK_TABLE (table4), label17, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label17), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label17), 7.45058e-09, 0.5); label18 = gtk_label_new (_("Transmitted text font")); gtk_widget_show (label18); gtk_table_attach (GTK_TABLE (table4), label18, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 0); gtk_label_set_justify (GTK_LABEL (label18), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label18), 7.45058e-09, 0.5); txfontpicker = gnome_font_picker_new (); gtk_widget_show (txfontpicker); gtk_table_attach (GTK_TABLE (table4), txfontpicker, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); rxfontpicker = gnome_font_picker_new (); gtk_widget_show (rxfontpicker); gtk_table_attach (GTK_TABLE (table4), rxfontpicker, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); label7 = gtk_label_new (_("Fonts")); gtk_widget_show (label7); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 6), label7); gtk_label_set_justify (GTK_LABEL (label7), GTK_JUSTIFY_CENTER); vbox12 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox12); gtk_container_add (GTK_CONTAINER (confnotebook), vbox12); gtk_container_set_border_width (GTK_CONTAINER (vbox12), 4); label157 = gtk_label_new (_("These settings affect all modems.")); gtk_widget_show (label157); gtk_box_pack_start (GTK_BOX (vbox12), label157, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label157), TRUE); gtk_misc_set_alignment (GTK_MISC (label157), 0, 0.5); table12 = gtk_table_new (1, 2, FALSE); gtk_widget_show (table12); gtk_box_pack_start (GTK_BOX (vbox12), table12, FALSE, TRUE, 0); txoffsetspinbutton_adj = gtk_adjustment_new (0, -1000, 1000, 1, 10, 10); txoffsetspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (txoffsetspinbutton_adj), 1, 1); gtk_widget_show (txoffsetspinbutton); gtk_table_attach (GTK_TABLE (table12), txoffsetspinbutton, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 2); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (txoffsetspinbutton), TRUE); gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (txoffsetspinbutton), GTK_UPDATE_IF_VALID); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (txoffsetspinbutton), TRUE); label19 = gtk_label_new (_("TX offset frequency")); gtk_widget_show (label19); gtk_table_attach (GTK_TABLE (table12), label19, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label19), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label19), 0, 0.5); label168 = gtk_label_new (_("All")); gtk_widget_show (label168); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 7), label168); vbox31 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox31); gtk_container_add (GTK_CONTAINER (confnotebook), vbox31); gtk_notebook_set_tab_label_packing (GTK_NOTEBOOK (confnotebook), vbox31, TRUE, TRUE, GTK_PACK_START); gtk_container_set_border_width (GTK_CONTAINER (vbox31), 4); label185 = gtk_label_new (_("MFSK16 and MFSK8 modem parameters.\nNew parametes take effect after restarting the modem.")); gtk_widget_show (label185); gtk_box_pack_start (GTK_BOX (vbox31), label185, FALSE, FALSE, 8); gtk_label_set_line_wrap (GTK_LABEL (label185), TRUE); gtk_misc_set_alignment (GTK_MISC (label185), 0, 0.5); hbox24 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox24); gtk_box_pack_start (GTK_BOX (vbox31), hbox24, TRUE, TRUE, 0); frame1 = gtk_frame_new (NULL); gtk_widget_show (frame1); gtk_box_pack_start (GTK_BOX (hbox24), frame1, FALSE, TRUE, 2); mfsksqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (mfsksqlvscale); gtk_container_add (GTK_CONTAINER (frame1), mfsksqlvscale); gtk_scale_set_value_pos (GTK_SCALE (mfsksqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (mfsksqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (mfsksqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (mfsksqlvscale), TRUE); label195 = gtk_label_new (_("Squelch")); gtk_widget_show (label195); gtk_frame_set_label_widget (GTK_FRAME (frame1), label195); mfskrestartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (mfskrestartbutton); gtk_box_pack_start (GTK_BOX (vbox31), mfskrestartbutton, FALSE, FALSE, 0); label181 = gtk_label_new (_("MFSK")); gtk_widget_show (label181); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 8), label181); vbox50 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox50); gtk_container_add (GTK_CONTAINER (confnotebook), vbox50); gtk_container_set_border_width (GTK_CONTAINER (vbox50), 4); label251 = gtk_label_new (_("OLIVIA modem parameters.\nNew parametes take effect after restarting the modem.")); gtk_widget_show (label251); gtk_box_pack_start (GTK_BOX (vbox50), label251, FALSE, FALSE, 8); gtk_label_set_line_wrap (GTK_LABEL (label251), TRUE); gtk_misc_set_alignment (GTK_MISC (label251), 0, 0.5); hbox34 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox34); gtk_box_pack_start (GTK_BOX (vbox50), hbox34, TRUE, TRUE, 0); frame18 = gtk_frame_new (NULL); gtk_widget_show (frame18); gtk_box_pack_start (GTK_BOX (hbox34), frame18, FALSE, TRUE, 2); oliviasqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (oliviasqlvscale); gtk_container_add (GTK_CONTAINER (frame18), oliviasqlvscale); gtk_scale_set_value_pos (GTK_SCALE (oliviasqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (oliviasqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (oliviasqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (oliviasqlvscale), TRUE); label252 = gtk_label_new (_("Squelch")); gtk_widget_show (label252); gtk_frame_set_label_widget (GTK_FRAME (frame18), label252); frame19 = gtk_frame_new (NULL); gtk_widget_show (frame19); gtk_box_pack_start (GTK_BOX (hbox34), frame19, TRUE, TRUE, 2); vbox51 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox51); gtk_container_add (GTK_CONTAINER (frame19), vbox51); table24 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table24); gtk_box_pack_start (GTK_BOX (vbox51), table24, FALSE, FALSE, 0); oliviabwoptionmenu = gtk_option_menu_new (); gtk_widget_show (oliviabwoptionmenu); gtk_table_attach (GTK_TABLE (table24), oliviabwoptionmenu, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (oliviabwoptionmenu), 2); menu12 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu12), menu12_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (oliviabwoptionmenu), menu12); oliviatonesoptionmenu = gtk_option_menu_new (); gtk_widget_show (oliviatonesoptionmenu); gtk_table_attach (GTK_TABLE (table24), oliviatonesoptionmenu, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (oliviatonesoptionmenu), 2); menu13 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu13), menu13_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (oliviatonesoptionmenu), menu13); label253 = gtk_label_new (_("Tones")); gtk_widget_show (label253); gtk_table_attach (GTK_TABLE (table24), label253, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label253), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label253), 0, 0.5); label254 = gtk_label_new (_("Bandwidth")); gtk_widget_show (label254); gtk_table_attach (GTK_TABLE (table24), label254, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label254), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label254), 0, 0.5); label256 = gtk_label_new (_("RX sync search margin")); gtk_widget_show (label256); gtk_table_attach (GTK_TABLE (table24), label256, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label256), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label256), 0, 0.5); label257 = gtk_label_new (_("RX sync integration period")); gtk_widget_show (label257); gtk_table_attach (GTK_TABLE (table24), label257, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label257), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label257), 0, 0.5); oliviasmargspinbutton_adj = gtk_adjustment_new (8, 2, 128, 1, 10, 10); oliviasmargspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (oliviasmargspinbutton_adj), 1, 0); gtk_widget_show (oliviasmargspinbutton); gtk_table_attach (GTK_TABLE (table24), oliviasmargspinbutton, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 2); oliviasintegspinbutton_adj = gtk_adjustment_new (4, 2, 128, 1, 10, 10); oliviasintegspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (oliviasintegspinbutton_adj), 1, 0); gtk_widget_show (oliviasintegspinbutton); gtk_table_attach (GTK_TABLE (table24), oliviasintegspinbutton, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 2); oliviaesccheckbutton = gtk_check_button_new_with_mnemonic (_("Allow 8 bit characters (escape-127 method)")); gtk_widget_show (oliviaesccheckbutton); gtk_box_pack_start (GTK_BOX (vbox51), oliviaesccheckbutton, FALSE, FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (oliviaesccheckbutton), 4); label255 = gtk_label_new (_("Modem settings")); gtk_widget_show (label255); gtk_frame_set_label_widget (GTK_FRAME (frame19), label255); oliviarestartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (oliviarestartbutton); gtk_box_pack_start (GTK_BOX (vbox50), oliviarestartbutton, FALSE, FALSE, 0); label250 = gtk_label_new (_("OLIVIA")); gtk_widget_show (label250); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 9), label250); vbox21 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox21); gtk_container_add (GTK_CONTAINER (confnotebook), vbox21); gtk_container_set_border_width (GTK_CONTAINER (vbox21), 4); label161 = gtk_label_new (_("RTTY modem parameters.\nNew parametes take effect after restarting the modem.")); gtk_widget_show (label161); gtk_box_pack_start (GTK_BOX (vbox21), label161, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label161), TRUE); gtk_misc_set_alignment (GTK_MISC (label161), 0, 0.5); hbox25 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox25); gtk_box_pack_start (GTK_BOX (vbox21), hbox25, TRUE, TRUE, 0); frame2 = gtk_frame_new (NULL); gtk_widget_show (frame2); gtk_box_pack_start (GTK_BOX (hbox25), frame2, FALSE, TRUE, 2); rttysqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (rttysqlvscale); gtk_container_add (GTK_CONTAINER (frame2), rttysqlvscale); gtk_scale_set_value_pos (GTK_SCALE (rttysqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (rttysqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (rttysqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (rttysqlvscale), TRUE); label196 = gtk_label_new (_("Squelch")); gtk_widget_show (label196); gtk_frame_set_label_widget (GTK_FRAME (frame2), label196); frame6 = gtk_frame_new (NULL); gtk_widget_show (frame6); gtk_box_pack_start (GTK_BOX (hbox25), frame6, TRUE, TRUE, 2); vbox39 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox39); gtk_container_add (GTK_CONTAINER (frame6), vbox39); table7 = gtk_table_new (5, 2, FALSE); gtk_widget_show (table7); gtk_box_pack_start (GTK_BOX (vbox39), table7, FALSE, FALSE, 0); parityoptionmenu = gtk_option_menu_new (); gtk_widget_show (parityoptionmenu); gtk_table_attach (GTK_TABLE (table7), parityoptionmenu, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (parityoptionmenu), 2); convertwidget56 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (convertwidget56), convertwidget56_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (parityoptionmenu), convertwidget56); stopoptionmenu = gtk_option_menu_new (); gtk_widget_show (stopoptionmenu); gtk_table_attach (GTK_TABLE (table7), stopoptionmenu, 1, 2, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (stopoptionmenu), 2); convertwidget62 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (convertwidget62), convertwidget62_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (stopoptionmenu), convertwidget62); bitsoptionmenu = gtk_option_menu_new (); gtk_widget_show (bitsoptionmenu); gtk_table_attach (GTK_TABLE (table7), bitsoptionmenu, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (bitsoptionmenu), 2); convertwidget66 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (convertwidget66), convertwidget66_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (bitsoptionmenu), convertwidget66); rttyshiftcombo = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (rttyshiftcombo)->popwin), "GladeParentKey", rttyshiftcombo); gtk_widget_show (rttyshiftcombo); gtk_table_attach (GTK_TABLE (table7), rttyshiftcombo, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (rttyshiftcombo), 2); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("23")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("85")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("160")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("170")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("182")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("200")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("240")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("350")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("425")); rttyshiftcombo_items = g_list_append (rttyshiftcombo_items, (gpointer) _("850")); gtk_combo_set_popdown_strings (GTK_COMBO (rttyshiftcombo), rttyshiftcombo_items); g_list_free (rttyshiftcombo_items); rttyshiftentry = GTK_COMBO (rttyshiftcombo)->entry; gtk_widget_show (rttyshiftentry); rttybaudcombo = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (rttybaudcombo)->popwin), "GladeParentKey", rttybaudcombo); gtk_widget_show (rttybaudcombo); gtk_table_attach (GTK_TABLE (table7), rttybaudcombo, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (rttybaudcombo), 2); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("45")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("45.45")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("50")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("56")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("75")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("100")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("110")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("150")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("200")); rttybaudcombo_items = g_list_append (rttybaudcombo_items, (gpointer) _("300")); gtk_combo_set_popdown_strings (GTK_COMBO (rttybaudcombo), rttybaudcombo_items); g_list_free (rttybaudcombo_items); rttybaudentry = GTK_COMBO (rttybaudcombo)->entry; gtk_widget_show (rttybaudentry); label35 = gtk_label_new (_("Shift")); gtk_widget_show (label35); gtk_table_attach (GTK_TABLE (table7), label35, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label35), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label35), 0, 0.5); label36 = gtk_label_new (_("Baudrate")); gtk_widget_show (label36); gtk_table_attach (GTK_TABLE (table7), label36, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label36), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label36), 0, 0.5); label37 = gtk_label_new (_("Bits")); gtk_widget_show (label37); gtk_table_attach (GTK_TABLE (table7), label37, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label37), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label37), 0, 0.5); label38 = gtk_label_new (_("Parity")); gtk_widget_show (label38); gtk_table_attach (GTK_TABLE (table7), label38, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label38), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label38), 0, 0.5); label39 = gtk_label_new (_("Stopbits")); gtk_widget_show (label39); gtk_table_attach (GTK_TABLE (table7), label39, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label39), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label39), 0, 0.5); reversecheckbutton = gtk_check_button_new_with_mnemonic (_("Reverse polarity")); gtk_widget_show (reversecheckbutton); gtk_box_pack_start (GTK_BOX (vbox39), reversecheckbutton, FALSE, FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (reversecheckbutton), 4); gtk_tooltips_set_tip (tooltips, reversecheckbutton, _("If tones should be reversed for RTTY"), NULL); msbcheckbutton = gtk_check_button_new_with_mnemonic (_("Send MSB first")); gtk_widget_show (msbcheckbutton); gtk_box_pack_start (GTK_BOX (vbox39), msbcheckbutton, FALSE, FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (msbcheckbutton), 4); gtk_tooltips_set_tip (tooltips, msbcheckbutton, _("If most significant bit should the transmitted first"), NULL); label200 = gtk_label_new (_("Modem settings")); gtk_widget_show (label200); gtk_frame_set_label_widget (GTK_FRAME (frame6), label200); rttyrestartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (rttyrestartbutton); gtk_box_pack_start (GTK_BOX (vbox21), rttyrestartbutton, FALSE, FALSE, 0); label34 = gtk_label_new (_("RTTY")); gtk_widget_show (label34); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 10), label34); gtk_label_set_justify (GTK_LABEL (label34), GTK_JUSTIFY_CENTER); vbox32 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox32); gtk_container_add (GTK_CONTAINER (confnotebook), vbox32); gtk_container_set_border_width (GTK_CONTAINER (vbox32), 4); label186 = gtk_label_new (_("THROB modem parameters. \nNew parametes take effect after restarting the modem.")); gtk_widget_show (label186); gtk_box_pack_start (GTK_BOX (vbox32), label186, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label186), TRUE); gtk_misc_set_alignment (GTK_MISC (label186), 0, 0.5); hbox31 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox31); gtk_box_pack_start (GTK_BOX (vbox32), hbox31, TRUE, TRUE, 0); frame13 = gtk_frame_new (NULL); gtk_widget_show (frame13); gtk_box_pack_start (GTK_BOX (hbox31), frame13, FALSE, TRUE, 2); throbsqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (throbsqlvscale); gtk_container_add (GTK_CONTAINER (frame13), throbsqlvscale); gtk_scale_set_value_pos (GTK_SCALE (throbsqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (throbsqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (throbsqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (throbsqlvscale), TRUE); label210 = gtk_label_new (_("Squelch")); gtk_widget_show (label210); gtk_frame_set_label_widget (GTK_FRAME (frame13), label210); throbrestartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (throbrestartbutton); gtk_box_pack_start (GTK_BOX (vbox32), throbrestartbutton, FALSE, FALSE, 0); label182 = gtk_label_new (_("THROB")); gtk_widget_show (label182); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 11), label182); vbox33 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox33); gtk_container_add (GTK_CONTAINER (confnotebook), vbox33); gtk_container_set_border_width (GTK_CONTAINER (vbox33), 4); label187 = gtk_label_new (_("BPSK31, QPSK31 and PSK63 modem parameters.\nNew parametes take effect after restarting the modem.")); gtk_widget_show (label187); gtk_box_pack_start (GTK_BOX (vbox33), label187, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label187), TRUE); gtk_misc_set_alignment (GTK_MISC (label187), 0, 0.5); hbox26 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox26); gtk_box_pack_start (GTK_BOX (vbox33), hbox26, TRUE, TRUE, 0); frame3 = gtk_frame_new (NULL); gtk_widget_show (frame3); gtk_box_pack_start (GTK_BOX (hbox26), frame3, FALSE, TRUE, 2); psk31sqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (psk31sqlvscale); gtk_container_add (GTK_CONTAINER (frame3), psk31sqlvscale); gtk_scale_set_value_pos (GTK_SCALE (psk31sqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (psk31sqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (psk31sqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (psk31sqlvscale), TRUE); label197 = gtk_label_new (_("Squelch")); gtk_widget_show (label197); gtk_frame_set_label_widget (GTK_FRAME (frame3), label197); psk31restartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (psk31restartbutton); gtk_box_pack_start (GTK_BOX (vbox33), psk31restartbutton, FALSE, FALSE, 0); label183 = gtk_label_new (_("PSK31")); gtk_widget_show (label183); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 12), label183); vbox27 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox27); gtk_container_add (GTK_CONTAINER (confnotebook), vbox27); gtk_container_set_border_width (GTK_CONTAINER (vbox27), 4); label171 = gtk_label_new (_("MT63 modem parameters. \nNew parametes take effect after restarting the modem.")); gtk_widget_show (label171); gtk_box_pack_start (GTK_BOX (vbox27), label171, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label171), TRUE); gtk_misc_set_alignment (GTK_MISC (label171), 0, 0.5); hbox27 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox27); gtk_box_pack_start (GTK_BOX (vbox27), hbox27, TRUE, TRUE, 0); frame4 = gtk_frame_new (NULL); gtk_widget_show (frame4); gtk_box_pack_start (GTK_BOX (hbox27), frame4, FALSE, TRUE, 2); mt63sqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (mt63sqlvscale); gtk_container_add (GTK_CONTAINER (frame4), mt63sqlvscale); gtk_scale_set_value_pos (GTK_SCALE (mt63sqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (mt63sqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (mt63sqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (mt63sqlvscale), TRUE); label198 = gtk_label_new (_("Squelch")); gtk_widget_show (label198); gtk_frame_set_label_widget (GTK_FRAME (frame4), label198); frame5 = gtk_frame_new (NULL); gtk_widget_show (frame5); gtk_box_pack_start (GTK_BOX (hbox27), frame5, TRUE, TRUE, 2); vbox38 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox38); gtk_container_add (GTK_CONTAINER (frame5), vbox38); table14 = gtk_table_new (2, 2, FALSE); gtk_widget_show (table14); gtk_box_pack_start (GTK_BOX (vbox38), table14, FALSE, FALSE, 0); ileaveoptionmenu = gtk_option_menu_new (); gtk_widget_show (ileaveoptionmenu); gtk_table_attach (GTK_TABLE (table14), ileaveoptionmenu, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (ileaveoptionmenu), 2); menu1 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu1), menu1_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (ileaveoptionmenu), menu1); bwoptionmenu = gtk_option_menu_new (); gtk_widget_show (bwoptionmenu); gtk_table_attach (GTK_TABLE (table14), bwoptionmenu, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (bwoptionmenu), 2); menu3 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu3), menu3_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (bwoptionmenu), menu3); label174 = gtk_label_new (_("Bandwidth")); gtk_widget_show (label174); gtk_table_attach (GTK_TABLE (table14), label174, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label174), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label174), 0, 0.5); label175 = gtk_label_new (_("Interleave")); gtk_widget_show (label175); gtk_table_attach (GTK_TABLE (table14), label175, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label175), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label175), 0, 0.5); cwidcheckbutton = gtk_check_button_new_with_mnemonic (_("CW Identification")); gtk_widget_show (cwidcheckbutton); gtk_box_pack_start (GTK_BOX (vbox38), cwidcheckbutton, FALSE, FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (cwidcheckbutton), 4); mt63esccheckbutton = gtk_check_button_new_with_mnemonic (_("Allow 8 bit characters (escape-127 method)")); gtk_widget_show (mt63esccheckbutton); gtk_box_pack_start (GTK_BOX (vbox38), mt63esccheckbutton, FALSE, FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (mt63esccheckbutton), 4); label199 = gtk_label_new (_("Modem settings")); gtk_widget_show (label199); gtk_frame_set_label_widget (GTK_FRAME (frame5), label199); mt63restartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (mt63restartbutton); gtk_box_pack_start (GTK_BOX (vbox27), mt63restartbutton, FALSE, FALSE, 0); label170 = gtk_label_new (_("MT63")); gtk_widget_show (label170); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 13), label170); vbox34 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox34); gtk_container_add (GTK_CONTAINER (confnotebook), vbox34); gtk_container_set_border_width (GTK_CONTAINER (vbox34), 4); label188 = gtk_label_new (_("FELDHELL modem parameters.")); gtk_widget_show (label188); gtk_box_pack_start (GTK_BOX (vbox34), label188, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label188), TRUE); gtk_misc_set_alignment (GTK_MISC (label188), 0, 0.5); vbox36 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox36); gtk_box_pack_start (GTK_BOX (vbox34), vbox36, TRUE, TRUE, 0); table16 = gtk_table_new (2, 2, FALSE); gtk_widget_show (table16); gtk_box_pack_start (GTK_BOX (vbox36), table16, FALSE, FALSE, 0); label208 = gtk_label_new (_("Force upper case")); gtk_widget_show (label208); gtk_table_attach (GTK_TABLE (table16), label208, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label208), 0, 0.5); label209 = gtk_label_new (_("Hellschreiber font")); gtk_widget_show (label209); gtk_table_attach (GTK_TABLE (table16), label209, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label209), 0, 0.5); hellcheckbutton = gtk_check_button_new_with_mnemonic (""); gtk_widget_show (hellcheckbutton); gtk_table_attach (GTK_TABLE (table16), hellcheckbutton, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); hellfontpicker = gnome_font_picker_new (); gtk_widget_show (hellfontpicker); gtk_table_attach (GTK_TABLE (table16), hellfontpicker, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); hbox28 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox28); gtk_box_pack_start (GTK_BOX (vbox36), hbox28, TRUE, TRUE, 4); gtk_container_set_border_width (GTK_CONTAINER (hbox28), 4); frame7 = gtk_frame_new (NULL); gtk_widget_show (frame7); gtk_box_pack_start (GTK_BOX (hbox28), frame7, FALSE, TRUE, 2); hellfiltvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (250, 0, 500, 5, 5, 0))); gtk_widget_show (hellfiltvscale); gtk_container_add (GTK_CONTAINER (frame7), hellfiltvscale); gtk_scale_set_value_pos (GTK_SCALE (hellfiltvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (hellfiltvscale), 0); gtk_range_set_update_policy (GTK_RANGE (hellfiltvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (hellfiltvscale), TRUE); label201 = gtk_label_new (_("Filter BW")); gtk_widget_show (label201); gtk_frame_set_label_widget (GTK_FRAME (frame7), label201); frame8 = gtk_frame_new (NULL); gtk_widget_show (frame8); gtk_box_pack_start (GTK_BOX (hbox28), frame8, FALSE, TRUE, 2); hellagc1vscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (5, 0, 10, 1, 1, 0))); gtk_widget_show (hellagc1vscale); gtk_container_add (GTK_CONTAINER (frame8), hellagc1vscale); gtk_scale_set_value_pos (GTK_SCALE (hellagc1vscale), GTK_POS_BOTTOM); gtk_range_set_update_policy (GTK_RANGE (hellagc1vscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (hellagc1vscale), TRUE); label202 = gtk_label_new (_("AGC attack")); gtk_widget_show (label202); gtk_frame_set_label_widget (GTK_FRAME (frame8), label202); frame9 = gtk_frame_new (NULL); gtk_widget_show (frame9); gtk_box_pack_start (GTK_BOX (hbox28), frame9, FALSE, TRUE, 2); hellagc2vscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (500, 0, 1000, 10, 10, 0))); gtk_widget_show (hellagc2vscale); gtk_container_add (GTK_CONTAINER (frame9), hellagc2vscale); gtk_scale_set_value_pos (GTK_SCALE (hellagc2vscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (hellagc2vscale), 0); gtk_range_set_update_policy (GTK_RANGE (hellagc2vscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (hellagc2vscale), TRUE); label203 = gtk_label_new (_("AGC decay")); gtk_widget_show (label203); gtk_frame_set_label_widget (GTK_FRAME (frame9), label203); label184 = gtk_label_new (_("HELL")); gtk_widget_show (label184); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 14), label184); vbox49 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox49); gtk_container_add (GTK_CONTAINER (confnotebook), vbox49); gtk_container_set_border_width (GTK_CONTAINER (vbox49), 4); label246 = gtk_label_new (_("CW modem parameters.\nNew parametes take effect after restarting the modem.")); gtk_widget_show (label246); gtk_box_pack_start (GTK_BOX (vbox49), label246, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label246), TRUE); gtk_misc_set_alignment (GTK_MISC (label246), 0, 0.5); hbox33 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox33); gtk_box_pack_start (GTK_BOX (vbox49), hbox33, TRUE, TRUE, 0); frame15 = gtk_frame_new (NULL); gtk_widget_show (frame15); gtk_box_pack_start (GTK_BOX (hbox33), frame15, FALSE, TRUE, 2); cwsqlvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (0, 0, 100, 1, 5, 0))); gtk_widget_show (cwsqlvscale); gtk_container_add (GTK_CONTAINER (frame15), cwsqlvscale); gtk_scale_set_value_pos (GTK_SCALE (cwsqlvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (cwsqlvscale), 0); gtk_range_set_update_policy (GTK_RANGE (cwsqlvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (cwsqlvscale), TRUE); label247 = gtk_label_new (_("Squelch")); gtk_widget_show (label247); gtk_frame_set_label_widget (GTK_FRAME (frame15), label247); frame17 = gtk_frame_new (NULL); gtk_widget_show (frame17); gtk_box_pack_start (GTK_BOX (hbox33), frame17, FALSE, FALSE, 2); cwbwvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (75, 0, 300, 1, 5, 0))); gtk_widget_show (cwbwvscale); gtk_container_add (GTK_CONTAINER (frame17), cwbwvscale); gtk_scale_set_value_pos (GTK_SCALE (cwbwvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (cwbwvscale), 0); gtk_range_set_update_policy (GTK_RANGE (cwbwvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (cwbwvscale), TRUE); label249 = gtk_label_new (_("Filter BW")); gtk_widget_show (label249); gtk_frame_set_label_widget (GTK_FRAME (frame17), label249); frame16 = gtk_frame_new (NULL); gtk_widget_show (frame16); gtk_box_pack_start (GTK_BOX (hbox33), frame16, FALSE, FALSE, 2); cwspeedvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (18, 5, 60, 1, 5, 0))); gtk_widget_show (cwspeedvscale); gtk_container_add (GTK_CONTAINER (frame16), cwspeedvscale); gtk_scale_set_value_pos (GTK_SCALE (cwspeedvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (cwspeedvscale), 0); gtk_range_set_update_policy (GTK_RANGE (cwspeedvscale), GTK_UPDATE_DISCONTINUOUS); gtk_range_set_inverted (GTK_RANGE (cwspeedvscale), TRUE); label248 = gtk_label_new (_("Speed (WPM)")); gtk_widget_show (label248); gtk_frame_set_label_widget (GTK_FRAME (frame16), label248); cwrestartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (cwrestartbutton); gtk_box_pack_start (GTK_BOX (vbox49), cwrestartbutton, FALSE, FALSE, 0); label245 = gtk_label_new (_("CW")); gtk_widget_show (label245); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 15), label245); vbox35 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox35); gtk_container_add (GTK_CONTAINER (confnotebook), vbox35); gtk_container_set_border_width (GTK_CONTAINER (vbox35), 4); label190 = gtk_label_new (_("Settings for the waterfall/scope display.")); gtk_widget_show (label190); gtk_box_pack_start (GTK_BOX (vbox35), label190, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label190), TRUE); gtk_misc_set_alignment (GTK_MISC (label190), 0, 0.5); hbox29 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox29); gtk_box_pack_start (GTK_BOX (vbox35), hbox29, TRUE, TRUE, 0); frame10 = gtk_frame_new (NULL); gtk_widget_show (frame10); gtk_box_pack_start (GTK_BOX (hbox29), frame10, FALSE, TRUE, 2); wfrefvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (-0, -50, 0, 5, 5, 0))); gtk_widget_show (wfrefvscale); gtk_container_add (GTK_CONTAINER (frame10), wfrefvscale); gtk_scale_set_value_pos (GTK_SCALE (wfrefvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (wfrefvscale), 0); gtk_range_set_inverted (GTK_RANGE (wfrefvscale), TRUE); label204 = gtk_label_new (_("Ref level")); gtk_widget_show (label204); gtk_frame_set_label_widget (GTK_FRAME (frame10), label204); frame11 = gtk_frame_new (NULL); gtk_widget_show (frame11); gtk_box_pack_start (GTK_BOX (hbox29), frame11, FALSE, TRUE, 2); wfampvscale = gtk_vscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 10, 100, 5, 5, 0))); gtk_widget_show (wfampvscale); gtk_container_add (GTK_CONTAINER (frame11), wfampvscale); gtk_scale_set_value_pos (GTK_SCALE (wfampvscale), GTK_POS_BOTTOM); gtk_scale_set_digits (GTK_SCALE (wfampvscale), 0); gtk_range_set_inverted (GTK_RANGE (wfampvscale), TRUE); label205 = gtk_label_new (_("Amp span")); gtk_widget_show (label205); gtk_frame_set_label_widget (GTK_FRAME (frame11), label205); frame12 = gtk_frame_new (NULL); gtk_widget_show (frame12); gtk_box_pack_start (GTK_BOX (hbox29), frame12, TRUE, TRUE, 2); vbox40 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox40); gtk_container_add (GTK_CONTAINER (frame12), vbox40); table15 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table15); gtk_box_pack_start (GTK_BOX (vbox40), table15, FALSE, FALSE, 0); label191 = gtk_label_new (_("Mode")); gtk_widget_show (label191); gtk_table_attach (GTK_TABLE (table15), label191, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label191), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label191), 0, 0.5); label192 = gtk_label_new (_("Zoom")); gtk_widget_show (label192); gtk_table_attach (GTK_TABLE (table15), label192, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label192), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label192), 0, 0.5); label193 = gtk_label_new (_("Speed")); gtk_widget_show (label193); gtk_table_attach (GTK_TABLE (table15), label193, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label193), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label193), 0, 0.5); label194 = gtk_label_new (_("Window")); gtk_widget_show (label194); gtk_table_attach (GTK_TABLE (table15), label194, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label194), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label194), 0, 0.5); wfmodeoptionmenu = gtk_option_menu_new (); gtk_widget_show (wfmodeoptionmenu); gtk_table_attach (GTK_TABLE (table15), wfmodeoptionmenu, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (wfmodeoptionmenu), 2); menu7 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu7), menu7_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (wfmodeoptionmenu), menu7); wfzoomoptionmenu = gtk_option_menu_new (); gtk_widget_show (wfzoomoptionmenu); gtk_table_attach (GTK_TABLE (table15), wfzoomoptionmenu, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (wfzoomoptionmenu), 2); menu8 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu8), menu8_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (wfzoomoptionmenu), menu8); wfspeedoptionmenu = gtk_option_menu_new (); gtk_widget_show (wfspeedoptionmenu); gtk_table_attach (GTK_TABLE (table15), wfspeedoptionmenu, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (wfspeedoptionmenu), 2); menu6 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu6), menu6_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (wfspeedoptionmenu), menu6); wfwindowoptionmenu = gtk_option_menu_new (); gtk_widget_show (wfwindowoptionmenu); gtk_table_attach (GTK_TABLE (table15), wfwindowoptionmenu, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (wfwindowoptionmenu), 2); menu4 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu4), menu4_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (wfwindowoptionmenu), menu4); wfdircheckbutton = gtk_check_button_new_with_mnemonic (_("Waterfall scrolls upwards")); gtk_widget_show (wfdircheckbutton); gtk_box_pack_start (GTK_BOX (vbox40), wfdircheckbutton, FALSE, FALSE, 2); gtk_container_set_border_width (GTK_CONTAINER (wfdircheckbutton), 4); label206 = gtk_label_new (_("Settings")); gtk_widget_show (label206); gtk_frame_set_label_widget (GTK_FRAME (frame12), label206); label189 = gtk_label_new (_("WF")); gtk_widget_show (label189); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 16), label189); vbox5 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox5); gtk_container_add (GTK_CONTAINER (confnotebook), vbox5); vbox22 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox22); gtk_box_pack_start (GTK_BOX (vbox5), vbox22, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox22), 4); label162 = gtk_label_new (_("Sound card settings take effect after restarting the modem.")); gtk_widget_show (label162); gtk_box_pack_start (GTK_BOX (vbox22), label162, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label162), TRUE); gtk_misc_set_alignment (GTK_MISC (label162), 0, 0.5); table23 = gtk_table_new (7, 2, FALSE); gtk_widget_show (table23); gtk_box_pack_start (GTK_BOX (vbox22), table23, TRUE, TRUE, 0); eightbitcheckbutton = gtk_check_button_new_with_mnemonic (_("8-bit sound I/O")); gtk_widget_show (eightbitcheckbutton); gtk_table_attach (GTK_TABLE (table23), eightbitcheckbutton, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (eightbitcheckbutton), 4); stereocheckbutton = gtk_check_button_new_with_mnemonic (_("Stereo sound I/O")); gtk_widget_show (stereocheckbutton); gtk_table_attach (GTK_TABLE (table23), stereocheckbutton, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (stereocheckbutton), 4); rwcheckbutton = gtk_check_button_new_with_mnemonic (_("Full duplex I/O (unsupported!)")); gtk_widget_show (rwcheckbutton); gtk_table_attach (GTK_TABLE (table23), rwcheckbutton, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (rwcheckbutton), 4); label28 = gtk_label_new (_("Sound card device")); gtk_widget_show (label28); gtk_table_attach (GTK_TABLE (table23), label28, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label28), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label28), 0, 0.5); soundcombo = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (soundcombo)->popwin), "GladeParentKey", soundcombo); gtk_widget_show (soundcombo); gtk_table_attach (GTK_TABLE (table23), soundcombo, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (soundcombo), 8); soundcombo_items = g_list_append (soundcombo_items, (gpointer) _("/dev/dsp")); soundcombo_items = g_list_append (soundcombo_items, (gpointer) _("/dev/dsp0")); soundcombo_items = g_list_append (soundcombo_items, (gpointer) _("/dev/dsp1")); soundcombo_items = g_list_append (soundcombo_items, (gpointer) _("/dev/dsp2")); gtk_combo_set_popdown_strings (GTK_COMBO (soundcombo), soundcombo_items); g_list_free (soundcombo_items); soundentry = GTK_COMBO (soundcombo)->entry; gtk_widget_show (soundentry); label242 = gtk_label_new (_("Requested sample rate")); gtk_widget_show (label242); gtk_table_attach (GTK_TABLE (table23), label242, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label242), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label242), 0, 0.5); label243 = gtk_label_new (_("TX rate offset (ppm)")); gtk_widget_show (label243); gtk_table_attach (GTK_TABLE (table23), label243, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label243), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label243), 0, 0.5); label244 = gtk_label_new (_("RX rate offset (ppm)")); gtk_widget_show (label244); gtk_table_attach (GTK_TABLE (table23), label244, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label244), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label244), 0, 0.5); ratespinbutton_adj = gtk_adjustment_new (8000, 667, 96000, 1, 10, 10); ratespinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (ratespinbutton_adj), 1, 0); gtk_widget_show (ratespinbutton); gtk_table_attach (GTK_TABLE (table23), ratespinbutton, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 8, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (ratespinbutton), TRUE); gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (ratespinbutton), GTK_UPDATE_IF_VALID); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (ratespinbutton), TRUE); txppmspinbutton_adj = gtk_adjustment_new (0, -1e+06, 1e+06, 1, 10, 10); txppmspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (txppmspinbutton_adj), 1, 0); gtk_widget_show (txppmspinbutton); gtk_table_attach (GTK_TABLE (table23), txppmspinbutton, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 8, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (txppmspinbutton), TRUE); gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (txppmspinbutton), GTK_UPDATE_IF_VALID); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (txppmspinbutton), TRUE); rxppmspinbutton_adj = gtk_adjustment_new (0, -1e+06, 1e+06, 1, 10, 10); rxppmspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (rxppmspinbutton_adj), 1, 0); gtk_widget_show (rxppmspinbutton); gtk_table_attach (GTK_TABLE (table23), rxppmspinbutton, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 8, 4); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (rxppmspinbutton), TRUE); gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (rxppmspinbutton), GTK_UPDATE_IF_VALID); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (rxppmspinbutton), TRUE); soundrestartbutton = gtk_button_new_with_mnemonic (_("Restart modem")); gtk_widget_show (soundrestartbutton); gtk_box_pack_start (GTK_BOX (vbox22), soundrestartbutton, FALSE, FALSE, 0); label8 = gtk_label_new (_("Sound")); gtk_widget_show (label8); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 17), label8); gtk_label_set_justify (GTK_LABEL (label8), GTK_JUSTIFY_CENTER); vbox23 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox23); gtk_container_add (GTK_CONTAINER (confnotebook), vbox23); gtk_container_set_border_width (GTK_CONTAINER (vbox23), 4); label163 = gtk_label_new (_("Push-To-Talk settings. \nNew setting take effect next time PTT is toggled.")); gtk_widget_show (label163); gtk_box_pack_start (GTK_BOX (vbox23), label163, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label163), TRUE); gtk_misc_set_alignment (GTK_MISC (label163), 0, 0.5); vbox7 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox7); gtk_box_pack_start (GTK_BOX (vbox23), vbox7, TRUE, TRUE, 0); table10 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table10); gtk_box_pack_start (GTK_BOX (vbox7), table10, FALSE, FALSE, 0); pttrtsradiobutton = gtk_radio_button_new_with_mnemonic (NULL, _("RTS")); gtk_widget_show (pttrtsradiobutton); gtk_table_attach (GTK_TABLE (table10), pttrtsradiobutton, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 8, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (pttrtsradiobutton), pttrtsradiobutton_group); pttrtsradiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (pttrtsradiobutton)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (pttrtsradiobutton), TRUE); pttdtrradiobutton = gtk_radio_button_new_with_mnemonic (NULL, _("DTR")); gtk_widget_show (pttdtrradiobutton); gtk_table_attach (GTK_TABLE (table10), pttdtrradiobutton, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 8, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (pttdtrradiobutton), pttrtsradiobutton_group); pttrtsradiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (pttdtrradiobutton)); pttbothradiobutton = gtk_radio_button_new_with_mnemonic (NULL, _("both")); gtk_widget_show (pttbothradiobutton); gtk_table_attach (GTK_TABLE (table10), pttbothradiobutton, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 8, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (pttbothradiobutton), pttrtsradiobutton_group); pttrtsradiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (pttbothradiobutton)); pttcombo = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (pttcombo)->popwin), "GladeParentKey", pttcombo); gtk_widget_show (pttcombo); gtk_table_attach (GTK_TABLE (table10), pttcombo, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (pttcombo), 8); pttcombo_items = g_list_append (pttcombo_items, (gpointer) _("none")); pttcombo_items = g_list_append (pttcombo_items, (gpointer) _("/dev/ttyS0")); pttcombo_items = g_list_append (pttcombo_items, (gpointer) _("/dev/ttyS1")); pttcombo_items = g_list_append (pttcombo_items, (gpointer) _("/dev/parport0")); pttcombo_items = g_list_append (pttcombo_items, (gpointer) _("/dev/parport1")); gtk_combo_set_popdown_strings (GTK_COMBO (pttcombo), pttcombo_items); g_list_free (pttcombo_items); pttentry = GTK_COMBO (pttcombo)->entry; gtk_widget_show (pttentry); label32 = gtk_label_new (_("PTT device")); gtk_widget_show (label32); gtk_table_attach (GTK_TABLE (table10), label32, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label32), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label32), 7.45058e-09, 0.5); label49 = gtk_label_new (_("PTT line (serial)")); gtk_widget_show (label49); gtk_table_attach (GTK_TABLE (table10), label49, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label49), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label49), 0, 0.5); pttinvcheckbutton = gtk_check_button_new_with_mnemonic (_("Use inverted PTT logic")); gtk_widget_show (pttinvcheckbutton); gtk_box_pack_start (GTK_BOX (vbox7), pttinvcheckbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (pttinvcheckbutton), 4); label31 = gtk_label_new (_("PTT")); gtk_widget_show (label31); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 18), label31); gtk_label_set_justify (GTK_LABEL (label31), GTK_JUSTIFY_CENTER); vbox41 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox41); gtk_container_add (GTK_CONTAINER (confnotebook), vbox41); gtk_container_set_border_width (GTK_CONTAINER (vbox41), 4); label214 = gtk_label_new (_("Hamlib support enables the rig control features in gMFSK.")); gtk_widget_show (label214); gtk_box_pack_start (GTK_BOX (vbox41), label214, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label214), TRUE); gtk_misc_set_alignment (GTK_MISC (label214), 0, 0.5); hamlibcheckbutton = gtk_check_button_new_with_mnemonic (_("Enable hamlib support")); gtk_widget_show (hamlibcheckbutton); gtk_box_pack_start (GTK_BOX (vbox41), hamlibcheckbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (hamlibcheckbutton), 4); frame14 = gtk_frame_new (NULL); gtk_widget_show (frame14); gtk_box_pack_start (GTK_BOX (vbox41), frame14, TRUE, TRUE, 2); table18 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table18); gtk_container_add (GTK_CONTAINER (frame14), table18); label216 = gtk_label_new (_("Radio model")); gtk_widget_show (label216); gtk_table_attach (GTK_TABLE (table18), label216, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label216), 0, 0.5); hamliboptionmenu = gtk_option_menu_new (); gtk_widget_show (hamliboptionmenu); gtk_table_attach (GTK_TABLE (table18), hamliboptionmenu, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (hamliboptionmenu), 2); menu9 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu9), menu9_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (hamliboptionmenu), menu9); label217 = gtk_label_new (_("Port")); gtk_widget_show (label217); gtk_table_attach (GTK_TABLE (table18), label217, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label217), 0, 0.5); hamlibcombo = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (hamlibcombo)->popwin), "GladeParentKey", hamlibcombo); gtk_widget_show (hamlibcombo); gtk_table_attach (GTK_TABLE (table18), hamlibcombo, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (hamlibcombo), 2); hamlibcombo_items = g_list_append (hamlibcombo_items, (gpointer) ""); hamlibcombo_items = g_list_append (hamlibcombo_items, (gpointer) _("localhost")); hamlibcombo_items = g_list_append (hamlibcombo_items, (gpointer) _("/dev/ttyS0")); hamlibcombo_items = g_list_append (hamlibcombo_items, (gpointer) _("/dev/ttyS1")); hamlibcombo_items = g_list_append (hamlibcombo_items, (gpointer) _("/dev/ttyS2")); hamlibcombo_items = g_list_append (hamlibcombo_items, (gpointer) _("/dev/ttyS3")); gtk_combo_set_popdown_strings (GTK_COMBO (hamlibcombo), hamlibcombo_items); g_list_free (hamlibcombo_items); hamlibentry = GTK_COMBO (hamlibcombo)->entry; gtk_widget_show (hamlibentry); gtk_tooltips_set_tip (tooltips, hamlibentry, _("Serial port name or hostname for RPC rig"), NULL); label223 = gtk_label_new (_("Speed")); gtk_widget_show (label223); gtk_table_attach (GTK_TABLE (table18), label223, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label223), 0, 0.5); hamlibspeedoptionmenu = gtk_option_menu_new (); gtk_widget_show (hamlibspeedoptionmenu); gtk_table_attach (GTK_TABLE (table18), hamlibspeedoptionmenu, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (hamlibspeedoptionmenu), 2); menu11 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu11), menu11_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (hamlibspeedoptionmenu), menu11); hamlibconfentry = gtk_entry_new (); gtk_widget_show (hamlibconfentry); gtk_table_attach (GTK_TABLE (table18), hamlibconfentry, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 2, 2); gtk_tooltips_set_tip (tooltips, hamlibconfentry, _("A comma separated list of parameter=value hamlib config parameters."), NULL); label241 = gtk_label_new (_("Config")); gtk_widget_show (label241); gtk_table_attach (GTK_TABLE (table18), label241, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label241), 0, 0.5); label215 = gtk_label_new (_("Settings")); gtk_widget_show (label215); gtk_frame_set_label_widget (GTK_FRAME (frame14), label215); label123 = gtk_label_new (_("Hamlib")); gtk_widget_show (label123); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 19), label123); vbox42 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox42); gtk_container_add (GTK_CONTAINER (confnotebook), vbox42); gtk_container_set_border_width (GTK_CONTAINER (vbox42), 4); label219 = gtk_label_new (_("Here you can select the rig control features to use.")); gtk_widget_show (label219); gtk_box_pack_start (GTK_BOX (vbox42), label219, FALSE, TRUE, 8); gtk_label_set_line_wrap (GTK_LABEL (label219), TRUE); gtk_misc_set_alignment (GTK_MISC (label219), 0, 0.5); table19 = gtk_table_new (4, 3, FALSE); gtk_widget_show (table19); gtk_box_pack_start (GTK_BOX (vbox42), table19, TRUE, TRUE, 0); hlwfcheckbutton = gtk_check_button_new_with_mnemonic (_("Use real frequencies in waterfall")); gtk_widget_show (hlwfcheckbutton); gtk_table_attach (GTK_TABLE (table19), hlwfcheckbutton, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (hlwfcheckbutton), 4); hlqsocheckbutton = gtk_check_button_new_with_mnemonic (_("Set QSO data frequency")); gtk_widget_show (hlqsocheckbutton); gtk_table_attach (GTK_TABLE (table19), hlqsocheckbutton, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (hlqsocheckbutton), 4); hlpttcheckbutton = gtk_check_button_new_with_mnemonic (_("Use hamlib PTT")); gtk_widget_show (hlpttcheckbutton); gtk_table_attach (GTK_TABLE (table19), hlpttcheckbutton, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (hlpttcheckbutton), 4); label222 = gtk_label_new (_("Resolution:")); gtk_widget_show (label222); gtk_table_attach (GTK_TABLE (table19), label222, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 9, 0); gtk_misc_set_alignment (GTK_MISC (label222), 0, 0.5); hlresoptionmenu = gtk_option_menu_new (); gtk_widget_show (hlresoptionmenu); gtk_table_attach (GTK_TABLE (table19), hlresoptionmenu, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); menu10 = gtk_menu_new (); gnome_app_fill_menu (GTK_MENU_SHELL (menu10), menu10_uiinfo, NULL, FALSE, 0); gtk_option_menu_set_menu (GTK_OPTION_MENU (hlresoptionmenu), menu10); qsyspinbutton_adj = gtk_adjustment_new (1000, 0, 4000, 1, 10, 10); qsyspinbutton = gtk_spin_button_new (GTK_ADJUSTMENT (qsyspinbutton_adj), 1, 0); gtk_widget_show (qsyspinbutton); gtk_table_attach (GTK_TABLE (table19), qsyspinbutton, 2, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 2); label258 = gtk_label_new (_("RX pass band center frequency")); gtk_widget_show (label258); gtk_table_attach (GTK_TABLE (table19), label258, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_misc_set_alignment (GTK_MISC (label258), 0, 0.5); label218 = gtk_label_new (_("Hamlib2")); gtk_widget_show (label218); gtk_notebook_set_tab_label (GTK_NOTEBOOK (confnotebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (confnotebook), 20), label218); dialog_action_area1 = GTK_DIALOG (confdialog)->action_area; gtk_widget_show (dialog_action_area1); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); confhelpbutton = gtk_button_new_from_stock ("gtk-help"); gtk_widget_show (confhelpbutton); gtk_dialog_add_action_widget (GTK_DIALOG (confdialog), confhelpbutton, GTK_RESPONSE_HELP); GTK_WIDGET_SET_FLAGS (confhelpbutton, GTK_CAN_DEFAULT); confclosebutton = gtk_button_new_from_stock ("gtk-close"); gtk_widget_show (confclosebutton); gtk_dialog_add_action_widget (GTK_DIALOG (confdialog), confclosebutton, GTK_RESPONSE_CLOSE); GTK_WIDGET_SET_FLAGS (confclosebutton, GTK_CAN_DEFAULT); g_signal_connect ((gpointer) mfskrestartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) oliviarestartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) rttyrestartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) throbrestartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) psk31restartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) mt63restartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) cwrestartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); g_signal_connect ((gpointer) soundrestartbutton, "clicked", G_CALLBACK (on_confrestartbutton_clicked), NULL); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (confdialog, confdialog, "confdialog"); GLADE_HOOKUP_OBJECT_NO_REF (confdialog, dialog_vbox1, "dialog_vbox1"); GLADE_HOOKUP_OBJECT (confdialog, hbox21, "hbox21"); GLADE_HOOKUP_OBJECT (confdialog, vbox15, "vbox15"); GLADE_HOOKUP_OBJECT (confdialog, scrolledwindow4, "scrolledwindow4"); GLADE_HOOKUP_OBJECT (confdialog, conftreeview, "conftreeview"); GLADE_HOOKUP_OBJECT (confdialog, confnotebook, "confnotebook"); GLADE_HOOKUP_OBJECT (confdialog, label178, "label178"); GLADE_HOOKUP_OBJECT (confdialog, label151, "label151"); GLADE_HOOKUP_OBJECT (confdialog, vbox4, "vbox4"); GLADE_HOOKUP_OBJECT (confdialog, vbox16, "vbox16"); GLADE_HOOKUP_OBJECT (confdialog, label152, "label152"); GLADE_HOOKUP_OBJECT (confdialog, table2, "table2"); GLADE_HOOKUP_OBJECT (confdialog, label9, "label9"); GLADE_HOOKUP_OBJECT (confdialog, label10, "label10"); GLADE_HOOKUP_OBJECT (confdialog, label11, "label11"); GLADE_HOOKUP_OBJECT (confdialog, label12, "label12"); GLADE_HOOKUP_OBJECT (confdialog, label13, "label13"); GLADE_HOOKUP_OBJECT (confdialog, callentry, "callentry"); GLADE_HOOKUP_OBJECT (confdialog, nameentry, "nameentry"); GLADE_HOOKUP_OBJECT (confdialog, qthentry, "qthentry"); GLADE_HOOKUP_OBJECT (confdialog, locentry, "locentry"); GLADE_HOOKUP_OBJECT (confdialog, emailentry, "emailentry"); GLADE_HOOKUP_OBJECT (confdialog, label6, "label6"); GLADE_HOOKUP_OBJECT (confdialog, vbox19, "vbox19"); GLADE_HOOKUP_OBJECT (confdialog, label156, "label156"); GLADE_HOOKUP_OBJECT (confdialog, table8, "table8"); GLADE_HOOKUP_OBJECT (confdialog, label44, "label44"); GLADE_HOOKUP_OBJECT (confdialog, label46, "label46"); GLADE_HOOKUP_OBJECT (confdialog, timeentry, "timeentry"); GLADE_HOOKUP_OBJECT (confdialog, dateentry, "dateentry"); GLADE_HOOKUP_OBJECT (confdialog, label153, "label153"); GLADE_HOOKUP_OBJECT (confdialog, vbox18, "vbox18"); GLADE_HOOKUP_OBJECT (confdialog, label155, "label155"); GLADE_HOOKUP_OBJECT (confdialog, qsobandsentry, "qsobandsentry"); GLADE_HOOKUP_OBJECT (confdialog, label154, "label154"); GLADE_HOOKUP_OBJECT (confdialog, vbox26, "vbox26"); GLADE_HOOKUP_OBJECT (confdialog, label169, "label169"); GLADE_HOOKUP_OBJECT (confdialog, table17, "table17"); GLADE_HOOKUP_OBJECT (confdialog, logfileentry, "logfileentry"); GLADE_HOOKUP_OBJECT (confdialog, label167, "label167"); GLADE_HOOKUP_OBJECT (confdialog, label211, "label211"); GLADE_HOOKUP_OBJECT (confdialog, label212, "label212"); GLADE_HOOKUP_OBJECT (confdialog, txpicdirentry, "txpicdirentry"); GLADE_HOOKUP_OBJECT (confdialog, rxpicdirentry, "rxpicdirentry"); GLADE_HOOKUP_OBJECT (confdialog, label43, "label43"); GLADE_HOOKUP_OBJECT (confdialog, vbox20, "vbox20"); GLADE_HOOKUP_OBJECT (confdialog, label159, "label159"); GLADE_HOOKUP_OBJECT (confdialog, table13, "table13"); GLADE_HOOKUP_OBJECT (confdialog, rxcolorpicker, "rxcolorpicker"); GLADE_HOOKUP_OBJECT (confdialog, txcolorpicker, "txcolorpicker"); GLADE_HOOKUP_OBJECT (confdialog, hlcolorpicker, "hlcolorpicker"); GLADE_HOOKUP_OBJECT (confdialog, rxwincolorpicker, "rxwincolorpicker"); GLADE_HOOKUP_OBJECT (confdialog, txwincolorpicker, "txwincolorpicker"); GLADE_HOOKUP_OBJECT (confdialog, label14, "label14"); GLADE_HOOKUP_OBJECT (confdialog, label15, "label15"); GLADE_HOOKUP_OBJECT (confdialog, label16, "label16"); GLADE_HOOKUP_OBJECT (confdialog, label29, "label29"); GLADE_HOOKUP_OBJECT (confdialog, label30, "label30"); GLADE_HOOKUP_OBJECT (confdialog, label158, "label158"); GLADE_HOOKUP_OBJECT (confdialog, vbox3, "vbox3"); GLADE_HOOKUP_OBJECT (confdialog, label165, "label165"); GLADE_HOOKUP_OBJECT (confdialog, table4, "table4"); GLADE_HOOKUP_OBJECT (confdialog, label17, "label17"); GLADE_HOOKUP_OBJECT (confdialog, label18, "label18"); GLADE_HOOKUP_OBJECT (confdialog, txfontpicker, "txfontpicker"); GLADE_HOOKUP_OBJECT (confdialog, rxfontpicker, "rxfontpicker"); GLADE_HOOKUP_OBJECT (confdialog, label7, "label7"); GLADE_HOOKUP_OBJECT (confdialog, vbox12, "vbox12"); GLADE_HOOKUP_OBJECT (confdialog, label157, "label157"); GLADE_HOOKUP_OBJECT (confdialog, table12, "table12"); GLADE_HOOKUP_OBJECT (confdialog, txoffsetspinbutton, "txoffsetspinbutton"); GLADE_HOOKUP_OBJECT (confdialog, label19, "label19"); GLADE_HOOKUP_OBJECT (confdialog, label168, "label168"); GLADE_HOOKUP_OBJECT (confdialog, vbox31, "vbox31"); GLADE_HOOKUP_OBJECT (confdialog, label185, "label185"); GLADE_HOOKUP_OBJECT (confdialog, hbox24, "hbox24"); GLADE_HOOKUP_OBJECT (confdialog, frame1, "frame1"); GLADE_HOOKUP_OBJECT (confdialog, mfsksqlvscale, "mfsksqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label195, "label195"); GLADE_HOOKUP_OBJECT (confdialog, mfskrestartbutton, "mfskrestartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label181, "label181"); GLADE_HOOKUP_OBJECT (confdialog, vbox50, "vbox50"); GLADE_HOOKUP_OBJECT (confdialog, label251, "label251"); GLADE_HOOKUP_OBJECT (confdialog, hbox34, "hbox34"); GLADE_HOOKUP_OBJECT (confdialog, frame18, "frame18"); GLADE_HOOKUP_OBJECT (confdialog, oliviasqlvscale, "oliviasqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label252, "label252"); GLADE_HOOKUP_OBJECT (confdialog, frame19, "frame19"); GLADE_HOOKUP_OBJECT (confdialog, vbox51, "vbox51"); GLADE_HOOKUP_OBJECT (confdialog, table24, "table24"); GLADE_HOOKUP_OBJECT (confdialog, oliviabwoptionmenu, "oliviabwoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu12, "menu12"); GLADE_HOOKUP_OBJECT (confdialog, menu12_uiinfo[0].widget, "bwmenu125"); GLADE_HOOKUP_OBJECT (confdialog, menu12_uiinfo[1].widget, "bwmenu250"); GLADE_HOOKUP_OBJECT (confdialog, menu12_uiinfo[2].widget, "bwmenu500"); GLADE_HOOKUP_OBJECT (confdialog, menu12_uiinfo[3].widget, "bwmenu1000"); GLADE_HOOKUP_OBJECT (confdialog, menu12_uiinfo[4].widget, "bwmenu2000"); GLADE_HOOKUP_OBJECT (confdialog, oliviatonesoptionmenu, "oliviatonesoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu13, "menu13"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[0].widget, "tmenu4"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[1].widget, "tmenu8"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[2].widget, "tmenu16"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[3].widget, "tmenu32"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[4].widget, "tmenu64"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[5].widget, "tmenu128"); GLADE_HOOKUP_OBJECT (confdialog, menu13_uiinfo[6].widget, "tmenu256"); GLADE_HOOKUP_OBJECT (confdialog, label253, "label253"); GLADE_HOOKUP_OBJECT (confdialog, label254, "label254"); GLADE_HOOKUP_OBJECT (confdialog, label256, "label256"); GLADE_HOOKUP_OBJECT (confdialog, label257, "label257"); GLADE_HOOKUP_OBJECT (confdialog, oliviasmargspinbutton, "oliviasmargspinbutton"); GLADE_HOOKUP_OBJECT (confdialog, oliviasintegspinbutton, "oliviasintegspinbutton"); GLADE_HOOKUP_OBJECT (confdialog, oliviaesccheckbutton, "oliviaesccheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label255, "label255"); GLADE_HOOKUP_OBJECT (confdialog, oliviarestartbutton, "oliviarestartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label250, "label250"); GLADE_HOOKUP_OBJECT (confdialog, vbox21, "vbox21"); GLADE_HOOKUP_OBJECT (confdialog, label161, "label161"); GLADE_HOOKUP_OBJECT (confdialog, hbox25, "hbox25"); GLADE_HOOKUP_OBJECT (confdialog, frame2, "frame2"); GLADE_HOOKUP_OBJECT (confdialog, rttysqlvscale, "rttysqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label196, "label196"); GLADE_HOOKUP_OBJECT (confdialog, frame6, "frame6"); GLADE_HOOKUP_OBJECT (confdialog, vbox39, "vbox39"); GLADE_HOOKUP_OBJECT (confdialog, table7, "table7"); GLADE_HOOKUP_OBJECT (confdialog, parityoptionmenu, "parityoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget56, "convertwidget56"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget56_uiinfo[0].widget, "convertwidget57"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget56_uiinfo[1].widget, "convertwidget58"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget56_uiinfo[2].widget, "convertwidget59"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget56_uiinfo[3].widget, "convertwidget60"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget56_uiinfo[4].widget, "convertwidget61"); GLADE_HOOKUP_OBJECT (confdialog, stopoptionmenu, "stopoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget62, "convertwidget62"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget62_uiinfo[0].widget, "convertwidget63"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget62_uiinfo[1].widget, "convertwidget64"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget62_uiinfo[2].widget, "convertwidget65"); GLADE_HOOKUP_OBJECT (confdialog, bitsoptionmenu, "bitsoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget66, "convertwidget66"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget66_uiinfo[0].widget, "convertwidget67"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget66_uiinfo[1].widget, "convertwidget68"); GLADE_HOOKUP_OBJECT (confdialog, convertwidget66_uiinfo[2].widget, "convertwidget69"); GLADE_HOOKUP_OBJECT (confdialog, rttyshiftcombo, "rttyshiftcombo"); GLADE_HOOKUP_OBJECT (confdialog, rttyshiftentry, "rttyshiftentry"); GLADE_HOOKUP_OBJECT (confdialog, rttybaudcombo, "rttybaudcombo"); GLADE_HOOKUP_OBJECT (confdialog, rttybaudentry, "rttybaudentry"); GLADE_HOOKUP_OBJECT (confdialog, label35, "label35"); GLADE_HOOKUP_OBJECT (confdialog, label36, "label36"); GLADE_HOOKUP_OBJECT (confdialog, label37, "label37"); GLADE_HOOKUP_OBJECT (confdialog, label38, "label38"); GLADE_HOOKUP_OBJECT (confdialog, label39, "label39"); GLADE_HOOKUP_OBJECT (confdialog, reversecheckbutton, "reversecheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, msbcheckbutton, "msbcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label200, "label200"); GLADE_HOOKUP_OBJECT (confdialog, rttyrestartbutton, "rttyrestartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label34, "label34"); GLADE_HOOKUP_OBJECT (confdialog, vbox32, "vbox32"); GLADE_HOOKUP_OBJECT (confdialog, label186, "label186"); GLADE_HOOKUP_OBJECT (confdialog, hbox31, "hbox31"); GLADE_HOOKUP_OBJECT (confdialog, frame13, "frame13"); GLADE_HOOKUP_OBJECT (confdialog, throbsqlvscale, "throbsqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label210, "label210"); GLADE_HOOKUP_OBJECT (confdialog, throbrestartbutton, "throbrestartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label182, "label182"); GLADE_HOOKUP_OBJECT (confdialog, vbox33, "vbox33"); GLADE_HOOKUP_OBJECT (confdialog, label187, "label187"); GLADE_HOOKUP_OBJECT (confdialog, hbox26, "hbox26"); GLADE_HOOKUP_OBJECT (confdialog, frame3, "frame3"); GLADE_HOOKUP_OBJECT (confdialog, psk31sqlvscale, "psk31sqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label197, "label197"); GLADE_HOOKUP_OBJECT (confdialog, psk31restartbutton, "psk31restartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label183, "label183"); GLADE_HOOKUP_OBJECT (confdialog, vbox27, "vbox27"); GLADE_HOOKUP_OBJECT (confdialog, label171, "label171"); GLADE_HOOKUP_OBJECT (confdialog, hbox27, "hbox27"); GLADE_HOOKUP_OBJECT (confdialog, frame4, "frame4"); GLADE_HOOKUP_OBJECT (confdialog, mt63sqlvscale, "mt63sqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label198, "label198"); GLADE_HOOKUP_OBJECT (confdialog, frame5, "frame5"); GLADE_HOOKUP_OBJECT (confdialog, vbox38, "vbox38"); GLADE_HOOKUP_OBJECT (confdialog, table14, "table14"); GLADE_HOOKUP_OBJECT (confdialog, ileaveoptionmenu, "ileaveoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu1, "menu1"); GLADE_HOOKUP_OBJECT (confdialog, menu1_uiinfo[0].widget, "menuitem1"); GLADE_HOOKUP_OBJECT (confdialog, menu1_uiinfo[1].widget, "menuitem2"); GLADE_HOOKUP_OBJECT (confdialog, bwoptionmenu, "bwoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu3, "menu3"); GLADE_HOOKUP_OBJECT (confdialog, menu3_uiinfo[0].widget, "menuitem9"); GLADE_HOOKUP_OBJECT (confdialog, menu3_uiinfo[1].widget, "menuitem10"); GLADE_HOOKUP_OBJECT (confdialog, menu3_uiinfo[2].widget, "menuitem11"); GLADE_HOOKUP_OBJECT (confdialog, label174, "label174"); GLADE_HOOKUP_OBJECT (confdialog, label175, "label175"); GLADE_HOOKUP_OBJECT (confdialog, cwidcheckbutton, "cwidcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, mt63esccheckbutton, "mt63esccheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label199, "label199"); GLADE_HOOKUP_OBJECT (confdialog, mt63restartbutton, "mt63restartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label170, "label170"); GLADE_HOOKUP_OBJECT (confdialog, vbox34, "vbox34"); GLADE_HOOKUP_OBJECT (confdialog, label188, "label188"); GLADE_HOOKUP_OBJECT (confdialog, vbox36, "vbox36"); GLADE_HOOKUP_OBJECT (confdialog, table16, "table16"); GLADE_HOOKUP_OBJECT (confdialog, label208, "label208"); GLADE_HOOKUP_OBJECT (confdialog, label209, "label209"); GLADE_HOOKUP_OBJECT (confdialog, hellcheckbutton, "hellcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, hellfontpicker, "hellfontpicker"); GLADE_HOOKUP_OBJECT (confdialog, hbox28, "hbox28"); GLADE_HOOKUP_OBJECT (confdialog, frame7, "frame7"); GLADE_HOOKUP_OBJECT (confdialog, hellfiltvscale, "hellfiltvscale"); GLADE_HOOKUP_OBJECT (confdialog, label201, "label201"); GLADE_HOOKUP_OBJECT (confdialog, frame8, "frame8"); GLADE_HOOKUP_OBJECT (confdialog, hellagc1vscale, "hellagc1vscale"); GLADE_HOOKUP_OBJECT (confdialog, label202, "label202"); GLADE_HOOKUP_OBJECT (confdialog, frame9, "frame9"); GLADE_HOOKUP_OBJECT (confdialog, hellagc2vscale, "hellagc2vscale"); GLADE_HOOKUP_OBJECT (confdialog, label203, "label203"); GLADE_HOOKUP_OBJECT (confdialog, label184, "label184"); GLADE_HOOKUP_OBJECT (confdialog, vbox49, "vbox49"); GLADE_HOOKUP_OBJECT (confdialog, label246, "label246"); GLADE_HOOKUP_OBJECT (confdialog, hbox33, "hbox33"); GLADE_HOOKUP_OBJECT (confdialog, frame15, "frame15"); GLADE_HOOKUP_OBJECT (confdialog, cwsqlvscale, "cwsqlvscale"); GLADE_HOOKUP_OBJECT (confdialog, label247, "label247"); GLADE_HOOKUP_OBJECT (confdialog, frame17, "frame17"); GLADE_HOOKUP_OBJECT (confdialog, cwbwvscale, "cwbwvscale"); GLADE_HOOKUP_OBJECT (confdialog, label249, "label249"); GLADE_HOOKUP_OBJECT (confdialog, frame16, "frame16"); GLADE_HOOKUP_OBJECT (confdialog, cwspeedvscale, "cwspeedvscale"); GLADE_HOOKUP_OBJECT (confdialog, label248, "label248"); GLADE_HOOKUP_OBJECT (confdialog, cwrestartbutton, "cwrestartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label245, "label245"); GLADE_HOOKUP_OBJECT (confdialog, vbox35, "vbox35"); GLADE_HOOKUP_OBJECT (confdialog, label190, "label190"); GLADE_HOOKUP_OBJECT (confdialog, hbox29, "hbox29"); GLADE_HOOKUP_OBJECT (confdialog, frame10, "frame10"); GLADE_HOOKUP_OBJECT (confdialog, wfrefvscale, "wfrefvscale"); GLADE_HOOKUP_OBJECT (confdialog, label204, "label204"); GLADE_HOOKUP_OBJECT (confdialog, frame11, "frame11"); GLADE_HOOKUP_OBJECT (confdialog, wfampvscale, "wfampvscale"); GLADE_HOOKUP_OBJECT (confdialog, label205, "label205"); GLADE_HOOKUP_OBJECT (confdialog, frame12, "frame12"); GLADE_HOOKUP_OBJECT (confdialog, vbox40, "vbox40"); GLADE_HOOKUP_OBJECT (confdialog, table15, "table15"); GLADE_HOOKUP_OBJECT (confdialog, label191, "label191"); GLADE_HOOKUP_OBJECT (confdialog, label192, "label192"); GLADE_HOOKUP_OBJECT (confdialog, label193, "label193"); GLADE_HOOKUP_OBJECT (confdialog, label194, "label194"); GLADE_HOOKUP_OBJECT (confdialog, wfmodeoptionmenu, "wfmodeoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu7, "menu7"); GLADE_HOOKUP_OBJECT (confdialog, menu7_uiinfo[0].widget, "menuitem33"); GLADE_HOOKUP_OBJECT (confdialog, menu7_uiinfo[1].widget, "menuitem34"); GLADE_HOOKUP_OBJECT (confdialog, menu7_uiinfo[2].widget, "menuitem35"); GLADE_HOOKUP_OBJECT (confdialog, wfzoomoptionmenu, "wfzoomoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu8, "menu8"); GLADE_HOOKUP_OBJECT (confdialog, menu8_uiinfo[0].widget, "menuitem36"); GLADE_HOOKUP_OBJECT (confdialog, menu8_uiinfo[1].widget, "menuitem37"); GLADE_HOOKUP_OBJECT (confdialog, menu8_uiinfo[2].widget, "menuitem38"); GLADE_HOOKUP_OBJECT (confdialog, wfspeedoptionmenu, "wfspeedoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu6, "menu6"); GLADE_HOOKUP_OBJECT (confdialog, menu6_uiinfo[0].widget, "menuitem30"); GLADE_HOOKUP_OBJECT (confdialog, menu6_uiinfo[1].widget, "menuitem31"); GLADE_HOOKUP_OBJECT (confdialog, menu6_uiinfo[2].widget, "menuitem32"); GLADE_HOOKUP_OBJECT (confdialog, wfwindowoptionmenu, "wfwindowoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu4, "menu4"); GLADE_HOOKUP_OBJECT (confdialog, menu4_uiinfo[0].widget, "menuitem22"); GLADE_HOOKUP_OBJECT (confdialog, menu4_uiinfo[1].widget, "menuitem23"); GLADE_HOOKUP_OBJECT (confdialog, menu4_uiinfo[2].widget, "menuitem24"); GLADE_HOOKUP_OBJECT (confdialog, wfdircheckbutton, "wfdircheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label206, "label206"); GLADE_HOOKUP_OBJECT (confdialog, label189, "label189"); GLADE_HOOKUP_OBJECT (confdialog, vbox5, "vbox5"); GLADE_HOOKUP_OBJECT (confdialog, vbox22, "vbox22"); GLADE_HOOKUP_OBJECT (confdialog, label162, "label162"); GLADE_HOOKUP_OBJECT (confdialog, table23, "table23"); GLADE_HOOKUP_OBJECT (confdialog, eightbitcheckbutton, "eightbitcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, stereocheckbutton, "stereocheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, rwcheckbutton, "rwcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label28, "label28"); GLADE_HOOKUP_OBJECT (confdialog, soundcombo, "soundcombo"); GLADE_HOOKUP_OBJECT (confdialog, soundentry, "soundentry"); GLADE_HOOKUP_OBJECT (confdialog, label242, "label242"); GLADE_HOOKUP_OBJECT (confdialog, label243, "label243"); GLADE_HOOKUP_OBJECT (confdialog, label244, "label244"); GLADE_HOOKUP_OBJECT (confdialog, ratespinbutton, "ratespinbutton"); GLADE_HOOKUP_OBJECT (confdialog, txppmspinbutton, "txppmspinbutton"); GLADE_HOOKUP_OBJECT (confdialog, rxppmspinbutton, "rxppmspinbutton"); GLADE_HOOKUP_OBJECT (confdialog, soundrestartbutton, "soundrestartbutton"); GLADE_HOOKUP_OBJECT (confdialog, label8, "label8"); GLADE_HOOKUP_OBJECT (confdialog, vbox23, "vbox23"); GLADE_HOOKUP_OBJECT (confdialog, label163, "label163"); GLADE_HOOKUP_OBJECT (confdialog, vbox7, "vbox7"); GLADE_HOOKUP_OBJECT (confdialog, table10, "table10"); GLADE_HOOKUP_OBJECT (confdialog, pttrtsradiobutton, "pttrtsradiobutton"); GLADE_HOOKUP_OBJECT (confdialog, pttdtrradiobutton, "pttdtrradiobutton"); GLADE_HOOKUP_OBJECT (confdialog, pttbothradiobutton, "pttbothradiobutton"); GLADE_HOOKUP_OBJECT (confdialog, pttcombo, "pttcombo"); GLADE_HOOKUP_OBJECT (confdialog, pttentry, "pttentry"); GLADE_HOOKUP_OBJECT (confdialog, label32, "label32"); GLADE_HOOKUP_OBJECT (confdialog, label49, "label49"); GLADE_HOOKUP_OBJECT (confdialog, pttinvcheckbutton, "pttinvcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label31, "label31"); GLADE_HOOKUP_OBJECT (confdialog, vbox41, "vbox41"); GLADE_HOOKUP_OBJECT (confdialog, label214, "label214"); GLADE_HOOKUP_OBJECT (confdialog, hamlibcheckbutton, "hamlibcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, frame14, "frame14"); GLADE_HOOKUP_OBJECT (confdialog, table18, "table18"); GLADE_HOOKUP_OBJECT (confdialog, label216, "label216"); GLADE_HOOKUP_OBJECT (confdialog, hamliboptionmenu, "hamliboptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu9, "menu9"); GLADE_HOOKUP_OBJECT (confdialog, label217, "label217"); GLADE_HOOKUP_OBJECT (confdialog, hamlibcombo, "hamlibcombo"); GLADE_HOOKUP_OBJECT (confdialog, hamlibentry, "hamlibentry"); GLADE_HOOKUP_OBJECT (confdialog, label223, "label223"); GLADE_HOOKUP_OBJECT (confdialog, hamlibspeedoptionmenu, "hamlibspeedoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu11, "menu11"); GLADE_HOOKUP_OBJECT (confdialog, hamlibconfentry, "hamlibconfentry"); GLADE_HOOKUP_OBJECT (confdialog, label241, "label241"); GLADE_HOOKUP_OBJECT (confdialog, label215, "label215"); GLADE_HOOKUP_OBJECT (confdialog, label123, "label123"); GLADE_HOOKUP_OBJECT (confdialog, vbox42, "vbox42"); GLADE_HOOKUP_OBJECT (confdialog, label219, "label219"); GLADE_HOOKUP_OBJECT (confdialog, table19, "table19"); GLADE_HOOKUP_OBJECT (confdialog, hlwfcheckbutton, "hlwfcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, hlqsocheckbutton, "hlqsocheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, hlpttcheckbutton, "hlpttcheckbutton"); GLADE_HOOKUP_OBJECT (confdialog, label222, "label222"); GLADE_HOOKUP_OBJECT (confdialog, hlresoptionmenu, "hlresoptionmenu"); GLADE_HOOKUP_OBJECT (confdialog, menu10, "menu10"); GLADE_HOOKUP_OBJECT (confdialog, menu10_uiinfo[0].widget, "mhz1"); GLADE_HOOKUP_OBJECT (confdialog, menu10_uiinfo[1].widget, "khz1"); GLADE_HOOKUP_OBJECT (confdialog, menu10_uiinfo[2].widget, "hz1"); GLADE_HOOKUP_OBJECT (confdialog, qsyspinbutton, "qsyspinbutton"); GLADE_HOOKUP_OBJECT (confdialog, label258, "label258"); GLADE_HOOKUP_OBJECT (confdialog, label218, "label218"); GLADE_HOOKUP_OBJECT_NO_REF (confdialog, dialog_action_area1, "dialog_action_area1"); GLADE_HOOKUP_OBJECT (confdialog, confhelpbutton, "confhelpbutton"); GLADE_HOOKUP_OBJECT (confdialog, confclosebutton, "confclosebutton"); GLADE_HOOKUP_OBJECT_NO_REF (confdialog, tooltips, "tooltips"); return confdialog; } GtkWidget* create_macroconfigdialog (void) { GtkWidget *macroconfigdialog; GtkWidget *dialog_vbox2; GtkWidget *vbox25; GtkWidget *hbox22; GtkWidget *label166; GtkWidget *macroconfigentry; GtkWidget *scrolledwindow5; GtkWidget *macroconfigtext; GtkWidget *dialog_action_area2; GtkWidget *helpbutton1; GtkWidget *button1; GtkWidget *button2; GtkWidget *button3; macroconfigdialog = gtk_dialog_new (); gtk_window_set_resizable (GTK_WINDOW (macroconfigdialog), FALSE); dialog_vbox2 = GTK_DIALOG (macroconfigdialog)->vbox; gtk_widget_show (dialog_vbox2); vbox25 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox25); gtk_box_pack_start (GTK_BOX (dialog_vbox2), vbox25, TRUE, TRUE, 4); gtk_container_set_border_width (GTK_CONTAINER (vbox25), 4); hbox22 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox22); gtk_box_pack_start (GTK_BOX (vbox25), hbox22, FALSE, TRUE, 4); label166 = gtk_label_new (_("Macro name")); gtk_widget_show (label166); gtk_box_pack_start (GTK_BOX (hbox22), label166, FALSE, FALSE, 4); macroconfigentry = gtk_entry_new (); gtk_widget_show (macroconfigentry); gtk_box_pack_start (GTK_BOX (hbox22), macroconfigentry, TRUE, TRUE, 4); scrolledwindow5 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_show (scrolledwindow5); gtk_box_pack_start (GTK_BOX (vbox25), scrolledwindow5, TRUE, TRUE, 4); gtk_widget_set_size_request (scrolledwindow5, 400, 200); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_SHADOW_ETCHED_IN); macroconfigtext = gtk_text_view_new (); gtk_widget_show (macroconfigtext); gtk_container_add (GTK_CONTAINER (scrolledwindow5), macroconfigtext); dialog_action_area2 = GTK_DIALOG (macroconfigdialog)->action_area; gtk_widget_show (dialog_action_area2); gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area2), GTK_BUTTONBOX_END); helpbutton1 = gtk_button_new_from_stock ("gtk-help"); gtk_widget_show (helpbutton1); gtk_dialog_add_action_widget (GTK_DIALOG (macroconfigdialog), helpbutton1, GTK_RESPONSE_HELP); GTK_WIDGET_SET_FLAGS (helpbutton1, GTK_CAN_DEFAULT); button1 = gtk_button_new_from_stock ("gtk-clear"); gtk_widget_show (button1); gtk_dialog_add_action_widget (GTK_DIALOG (macroconfigdialog), button1, GTK_RESPONSE_REJECT); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); button2 = gtk_button_new_from_stock ("gtk-cancel"); gtk_widget_show (button2); gtk_dialog_add_action_widget (GTK_DIALOG (macroconfigdialog), button2, GTK_RESPONSE_CANCEL); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); button3 = gtk_button_new_from_stock ("gtk-ok"); gtk_widget_show (button3); gtk_dialog_add_action_widget (GTK_DIALOG (macroconfigdialog), button3, GTK_RESPONSE_OK); GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (macroconfigdialog, macroconfigdialog, "macroconfigdialog"); GLADE_HOOKUP_OBJECT_NO_REF (macroconfigdialog, dialog_vbox2, "dialog_vbox2"); GLADE_HOOKUP_OBJECT (macroconfigdialog, vbox25, "vbox25"); GLADE_HOOKUP_OBJECT (macroconfigdialog, hbox22, "hbox22"); GLADE_HOOKUP_OBJECT (macroconfigdialog, label166, "label166"); GLADE_HOOKUP_OBJECT (macroconfigdialog, macroconfigentry, "macroconfigentry"); GLADE_HOOKUP_OBJECT (macroconfigdialog, scrolledwindow5, "scrolledwindow5"); GLADE_HOOKUP_OBJECT (macroconfigdialog, macroconfigtext, "macroconfigtext"); GLADE_HOOKUP_OBJECT_NO_REF (macroconfigdialog, dialog_action_area2, "dialog_action_area2"); GLADE_HOOKUP_OBJECT (macroconfigdialog, helpbutton1, "helpbutton1"); GLADE_HOOKUP_OBJECT (macroconfigdialog, button1, "button1"); GLADE_HOOKUP_OBJECT (macroconfigdialog, button2, "button2"); GLADE_HOOKUP_OBJECT (macroconfigdialog, button3, "button3"); return macroconfigdialog; } GtkWidget* create_picwindow (void) { GtkWidget *picwindow; GtkWidget *vbox37; GtkWidget *alignment1; GtkWidget *pictureframe; GtkWidget *hseparator2; GtkWidget *hbox30; GtkWidget *picturesavebutton; GtkWidget *pictureclosebutton; picwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (picwindow), _("gMFSK picture")); vbox37 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox37); gtk_container_add (GTK_CONTAINER (picwindow), vbox37); alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0); gtk_widget_show (alignment1); gtk_box_pack_start (GTK_BOX (vbox37), alignment1, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (alignment1), 4); pictureframe = gtk_frame_new (NULL); gtk_widget_show (pictureframe); gtk_container_add (GTK_CONTAINER (alignment1), pictureframe); gtk_frame_set_shadow_type (GTK_FRAME (pictureframe), GTK_SHADOW_IN); hseparator2 = gtk_hseparator_new (); gtk_widget_show (hseparator2); gtk_box_pack_start (GTK_BOX (vbox37), hseparator2, FALSE, FALSE, 4); hbox30 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox30); gtk_box_pack_end (GTK_BOX (vbox37), hbox30, FALSE, FALSE, 0); picturesavebutton = gtk_button_new_from_stock ("gtk-save"); gtk_widget_show (picturesavebutton); gtk_box_pack_start (GTK_BOX (hbox30), picturesavebutton, FALSE, FALSE, 4); gtk_container_set_border_width (GTK_CONTAINER (picturesavebutton), 4); pictureclosebutton = gtk_button_new_from_stock ("gtk-close"); gtk_widget_show (pictureclosebutton); gtk_box_pack_end (GTK_BOX (hbox30), pictureclosebutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (pictureclosebutton), 4); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (picwindow, picwindow, "picwindow"); GLADE_HOOKUP_OBJECT (picwindow, vbox37, "vbox37"); GLADE_HOOKUP_OBJECT (picwindow, alignment1, "alignment1"); GLADE_HOOKUP_OBJECT (picwindow, pictureframe, "pictureframe"); GLADE_HOOKUP_OBJECT (picwindow, hseparator2, "hseparator2"); GLADE_HOOKUP_OBJECT (picwindow, hbox30, "hbox30"); GLADE_HOOKUP_OBJECT (picwindow, picturesavebutton, "picturesavebutton"); GLADE_HOOKUP_OBJECT (picwindow, pictureclosebutton, "pictureclosebutton"); return picwindow; } GtkWidget* create_txpicfileselection (void) { GtkWidget *txpicfileselection; GtkWidget *ok_button1; GtkWidget *cancel_button1; txpicfileselection = gtk_file_selection_new (_("Select Picture to Transmit")); gtk_container_set_border_width (GTK_CONTAINER (txpicfileselection), 10); gtk_window_set_destroy_with_parent (GTK_WINDOW (txpicfileselection), TRUE); gtk_file_selection_hide_fileop_buttons (GTK_FILE_SELECTION (txpicfileselection)); ok_button1 = GTK_FILE_SELECTION (txpicfileselection)->ok_button; gtk_widget_show (ok_button1); GTK_WIDGET_SET_FLAGS (ok_button1, GTK_CAN_DEFAULT); cancel_button1 = GTK_FILE_SELECTION (txpicfileselection)->cancel_button; gtk_widget_show (cancel_button1); GTK_WIDGET_SET_FLAGS (cancel_button1, GTK_CAN_DEFAULT); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (txpicfileselection, txpicfileselection, "txpicfileselection"); GLADE_HOOKUP_OBJECT_NO_REF (txpicfileselection, ok_button1, "ok_button1"); GLADE_HOOKUP_OBJECT_NO_REF (txpicfileselection, cancel_button1, "cancel_button1"); return txpicfileselection; } GtkWidget* create_rxpicfileselection (void) { GtkWidget *rxpicfileselection; GtkWidget *ok_button2; GtkWidget *cancel_button2; rxpicfileselection = gtk_file_selection_new (_("Select File")); gtk_container_set_border_width (GTK_CONTAINER (rxpicfileselection), 10); ok_button2 = GTK_FILE_SELECTION (rxpicfileselection)->ok_button; gtk_widget_show (ok_button2); GTK_WIDGET_SET_FLAGS (ok_button2, GTK_CAN_DEFAULT); cancel_button2 = GTK_FILE_SELECTION (rxpicfileselection)->cancel_button; gtk_widget_show (cancel_button2); GTK_WIDGET_SET_FLAGS (cancel_button2, GTK_CAN_DEFAULT); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (rxpicfileselection, rxpicfileselection, "rxpicfileselection"); GLADE_HOOKUP_OBJECT_NO_REF (rxpicfileselection, ok_button2, "ok_button2"); GLADE_HOOKUP_OBJECT_NO_REF (rxpicfileselection, cancel_button2, "cancel_button2"); return rxpicfileselection; } GtkWidget* create_druidwindow (void) { GtkWidget *druidwindow; GtkWidget *gmfskdruid; GtkWidget *druidpagestart1; GtkWidget *druidpagestandard1; GtkWidget *druid_vbox1; GtkWidget *vbox43; GtkWidget *label224; GtkWidget *table20; GtkWidget *label225; GtkWidget *label226; GtkWidget *label227; GtkWidget *label228; GtkWidget *label229; GtkWidget *druid_callentry; GtkWidget *druid_nameentry; GtkWidget *druid_qthentry; GtkWidget *druid_locentry; GtkWidget *druid_emailentry; GtkWidget *druidpagestandard2; GtkWidget *druid_vbox2; GtkWidget *vbox44; GtkWidget *label232; GtkWidget *table21; GtkWidget *druid_logfileentry; GtkWidget *label233; GtkWidget *label234; GtkWidget *label235; GtkWidget *druid_txpicentry; GtkWidget *druid_rxpicentry; GtkWidget *druid_filesbutton; GtkWidget *druidpagestandard3; GtkWidget *druid_vbox3; GtkWidget *vbox45; GtkWidget *label236; GtkWidget *vbox46; GtkWidget *hbox32; GtkWidget *label237; GtkWidget *druid_soundcombo; GList *druid_soundcombo_items = NULL; GtkWidget *druid_soundentry; GtkWidget *druid_eightbitcheckbutton; GtkWidget *druid_stereocheckbutton; GtkWidget *druid_soundtestbutton; GtkWidget *druidpagestandard4; GtkWidget *druid_vbox4; GtkWidget *vbox47; GtkWidget *label238; GtkWidget *vbox48; GtkWidget *table22; GtkWidget *druid_pttrtsradiobutton; GSList *druid_pttrtsradiobutton_group = NULL; GtkWidget *druid_pttdtrradiobutton; GtkWidget *druid_pttbothradiobutton; GtkWidget *combo2; GList *combo2_items = NULL; GtkWidget *druid_pttentry; GtkWidget *label239; GtkWidget *label240; GtkWidget *druid_pttinvcheckbutton; GtkWidget *druid_ptttestbutton; GtkWidget *gmfskdruidpagefinish; druidwindow = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (druidwindow), _("gMFSK configuration druid")); gmfskdruid = gnome_druid_new (); gtk_widget_show (gmfskdruid); gtk_container_add (GTK_CONTAINER (druidwindow), gmfskdruid); gtk_widget_set_size_request (gmfskdruid, 500, 350); gtk_container_set_border_width (GTK_CONTAINER (gmfskdruid), 4); druidpagestart1 = gnome_druid_page_edge_new (GNOME_EDGE_START); gtk_widget_show (druidpagestart1); gnome_druid_append_page (GNOME_DRUID (gmfskdruid), GNOME_DRUID_PAGE (druidpagestart1)); gnome_druid_page_edge_set_title (GNOME_DRUID_PAGE_EDGE (druidpagestart1), _("Welcome to gMFSK")); gnome_druid_page_edge_set_text (GNOME_DRUID_PAGE_EDGE (druidpagestart1), _("This is the first time you run this version of gMFSK. On the following pages you will be guided through the initial setup of gMFSK.\n\nAll settings can also be done later in the main program Settings->Preferences dialog.\n\nThis druid can be run again by starting gMFSK with the \"--run-druid\" flag.")); druidpagestandard1 = gnome_druid_page_standard_new (); gtk_widget_show_all (druidpagestandard1); gnome_druid_append_page (GNOME_DRUID (gmfskdruid), GNOME_DRUID_PAGE (druidpagestandard1)); gnome_druid_page_standard_set_title (GNOME_DRUID_PAGE_STANDARD (druidpagestandard1), _("Station information")); druid_vbox1 = GNOME_DRUID_PAGE_STANDARD (druidpagestandard1)->vbox; gtk_widget_show (druid_vbox1); gtk_container_set_border_width (GTK_CONTAINER (druid_vbox1), 16); vbox43 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox43); gtk_box_pack_start (GTK_BOX (druid_vbox1), vbox43, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox43), 4); label224 = gtk_label_new (_("Fill in your station information. This data is used in the fixtext macros.")); gtk_widget_show (label224); gtk_box_pack_start (GTK_BOX (vbox43), label224, FALSE, TRUE, 8); gtk_label_set_justify (GTK_LABEL (label224), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (label224), TRUE); gtk_misc_set_alignment (GTK_MISC (label224), 0, 0.5); table20 = gtk_table_new (5, 2, FALSE); gtk_widget_show (table20); gtk_box_pack_start (GTK_BOX (vbox43), table20, TRUE, TRUE, 0); label225 = gtk_label_new (_("Callsign")); gtk_widget_show (label225); gtk_table_attach (GTK_TABLE (table20), label225, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label225), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label225), 0, 0.5); label226 = gtk_label_new (_("Name")); gtk_widget_show (label226); gtk_table_attach (GTK_TABLE (table20), label226, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label226), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label226), 7.45058e-09, 0.5); label227 = gtk_label_new (_("QTH")); gtk_widget_show (label227); gtk_table_attach (GTK_TABLE (table20), label227, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label227), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label227), 7.45058e-09, 0.5); label228 = gtk_label_new (_("Locator")); gtk_widget_show (label228); gtk_table_attach (GTK_TABLE (table20), label228, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label228), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label228), 7.45058e-09, 0.5); label229 = gtk_label_new (_("E-mail")); gtk_widget_show (label229); gtk_table_attach (GTK_TABLE (table20), label229, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label229), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label229), 7.45058e-09, 0.5); druid_callentry = gtk_entry_new (); gtk_widget_show (druid_callentry); gtk_table_attach (GTK_TABLE (table20), druid_callentry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druid_nameentry = gtk_entry_new (); gtk_widget_show (druid_nameentry); gtk_table_attach (GTK_TABLE (table20), druid_nameentry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druid_qthentry = gtk_entry_new (); gtk_widget_show (druid_qthentry); gtk_table_attach (GTK_TABLE (table20), druid_qthentry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druid_locentry = gtk_entry_new (); gtk_widget_show (druid_locentry); gtk_table_attach (GTK_TABLE (table20), druid_locentry, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druid_emailentry = gtk_entry_new (); gtk_widget_show (druid_emailentry); gtk_table_attach (GTK_TABLE (table20), druid_emailentry, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druidpagestandard2 = gnome_druid_page_standard_new (); gtk_widget_show_all (druidpagestandard2); gnome_druid_append_page (GNOME_DRUID (gmfskdruid), GNOME_DRUID_PAGE (druidpagestandard2)); gnome_druid_page_standard_set_title (GNOME_DRUID_PAGE_STANDARD (druidpagestandard2), _("Files and directories")); druid_vbox2 = GNOME_DRUID_PAGE_STANDARD (druidpagestandard2)->vbox; gtk_widget_show (druid_vbox2); gtk_container_set_border_width (GTK_CONTAINER (druid_vbox2), 16); vbox44 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox44); gtk_box_pack_start (GTK_BOX (druid_vbox2), vbox44, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox44), 4); label232 = gtk_label_new (_("These files and directories are used by gMFSK. Click the button to actually create the files and directories.")); gtk_widget_show (label232); gtk_box_pack_start (GTK_BOX (vbox44), label232, FALSE, FALSE, 8); gtk_label_set_justify (GTK_LABEL (label232), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (label232), TRUE); gtk_misc_set_alignment (GTK_MISC (label232), 0, 0.5); table21 = gtk_table_new (3, 2, FALSE); gtk_widget_show (table21); gtk_box_pack_start (GTK_BOX (vbox44), table21, TRUE, TRUE, 0); druid_logfileentry = gtk_entry_new (); gtk_widget_show (druid_logfileentry); gtk_table_attach (GTK_TABLE (table21), druid_logfileentry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); label233 = gtk_label_new (_("Log file name")); gtk_widget_show (label233); gtk_table_attach (GTK_TABLE (table21), label233, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_misc_set_alignment (GTK_MISC (label233), 0, 0.5); label234 = gtk_label_new (_("TX pictures directory")); gtk_widget_show (label234); gtk_table_attach (GTK_TABLE (table21), label234, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_misc_set_alignment (GTK_MISC (label234), 0, 0.5); label235 = gtk_label_new (_("RX pictures directory")); gtk_widget_show (label235); gtk_table_attach (GTK_TABLE (table21), label235, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 2); gtk_misc_set_alignment (GTK_MISC (label235), 0, 0.5); druid_txpicentry = gtk_entry_new (); gtk_widget_show (druid_txpicentry); gtk_table_attach (GTK_TABLE (table21), druid_txpicentry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druid_rxpicentry = gtk_entry_new (); gtk_widget_show (druid_rxpicentry); gtk_table_attach (GTK_TABLE (table21), druid_rxpicentry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 4, 2); druid_filesbutton = gtk_button_new_with_mnemonic (_("Create files and directories")); gtk_widget_show (druid_filesbutton); gtk_box_pack_start (GTK_BOX (vbox44), druid_filesbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_filesbutton), 4); druidpagestandard3 = gnome_druid_page_standard_new (); gtk_widget_show_all (druidpagestandard3); gnome_druid_append_page (GNOME_DRUID (gmfskdruid), GNOME_DRUID_PAGE (druidpagestandard3)); gnome_druid_page_standard_set_title (GNOME_DRUID_PAGE_STANDARD (druidpagestandard3), _("Sound card configuration")); druid_vbox3 = GNOME_DRUID_PAGE_STANDARD (druidpagestandard3)->vbox; gtk_widget_show (druid_vbox3); gtk_container_set_border_width (GTK_CONTAINER (druid_vbox3), 16); vbox45 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox45); gtk_box_pack_start (GTK_BOX (druid_vbox3), vbox45, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox45), 4); label236 = gtk_label_new (_("Some sound cards don't support the default setting (16 bit mono sampling). You should hear a short sound sample when you click the test button below.")); gtk_widget_show (label236); gtk_box_pack_start (GTK_BOX (vbox45), label236, FALSE, TRUE, 8); gtk_label_set_justify (GTK_LABEL (label236), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (label236), TRUE); gtk_misc_set_alignment (GTK_MISC (label236), 0, 0.5); vbox46 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox46); gtk_box_pack_start (GTK_BOX (vbox45), vbox46, TRUE, TRUE, 0); hbox32 = gtk_hbox_new (FALSE, 0); gtk_widget_show (hbox32); gtk_box_pack_start (GTK_BOX (vbox46), hbox32, FALSE, FALSE, 0); label237 = gtk_label_new (_("Sound card device")); gtk_widget_show (label237); gtk_box_pack_start (GTK_BOX (hbox32), label237, FALSE, FALSE, 4); gtk_label_set_justify (GTK_LABEL (label237), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label237), 0, 0.5); druid_soundcombo = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (druid_soundcombo)->popwin), "GladeParentKey", druid_soundcombo); gtk_widget_show (druid_soundcombo); gtk_box_pack_start (GTK_BOX (hbox32), druid_soundcombo, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_soundcombo), 8); druid_soundcombo_items = g_list_append (druid_soundcombo_items, (gpointer) _("/dev/dsp")); druid_soundcombo_items = g_list_append (druid_soundcombo_items, (gpointer) _("/dev/dsp0")); druid_soundcombo_items = g_list_append (druid_soundcombo_items, (gpointer) _("/dev/dsp1")); druid_soundcombo_items = g_list_append (druid_soundcombo_items, (gpointer) _("/dev/dsp2")); gtk_combo_set_popdown_strings (GTK_COMBO (druid_soundcombo), druid_soundcombo_items); g_list_free (druid_soundcombo_items); druid_soundentry = GTK_COMBO (druid_soundcombo)->entry; gtk_widget_show (druid_soundentry); druid_eightbitcheckbutton = gtk_check_button_new_with_mnemonic (_("8-bit sound I/O")); gtk_widget_show (druid_eightbitcheckbutton); gtk_box_pack_start (GTK_BOX (vbox46), druid_eightbitcheckbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_eightbitcheckbutton), 4); druid_stereocheckbutton = gtk_check_button_new_with_mnemonic (_("Stereo sound I/O")); gtk_widget_show (druid_stereocheckbutton); gtk_box_pack_start (GTK_BOX (vbox46), druid_stereocheckbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_stereocheckbutton), 4); druid_soundtestbutton = gtk_button_new_with_mnemonic (_("Test sound card")); gtk_widget_show (druid_soundtestbutton); gtk_box_pack_start (GTK_BOX (vbox45), druid_soundtestbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_soundtestbutton), 4); druidpagestandard4 = gnome_druid_page_standard_new (); gtk_widget_show_all (druidpagestandard4); gnome_druid_append_page (GNOME_DRUID (gmfskdruid), GNOME_DRUID_PAGE (druidpagestandard4)); gnome_druid_page_standard_set_title (GNOME_DRUID_PAGE_STANDARD (druidpagestandard4), _("PTT configuration")); druid_vbox4 = GNOME_DRUID_PAGE_STANDARD (druidpagestandard4)->vbox; gtk_widget_show (druid_vbox4); gtk_container_set_border_width (GTK_CONTAINER (druid_vbox4), 16); vbox47 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox47); gtk_box_pack_start (GTK_BOX (druid_vbox4), vbox47, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (vbox47), 4); label238 = gtk_label_new (_("gMFSK can control PTT via the serial port control lines or the parallel port.")); gtk_widget_show (label238); gtk_box_pack_start (GTK_BOX (vbox47), label238, FALSE, TRUE, 8); gtk_label_set_justify (GTK_LABEL (label238), GTK_JUSTIFY_FILL); gtk_label_set_line_wrap (GTK_LABEL (label238), TRUE); gtk_misc_set_alignment (GTK_MISC (label238), 0, 0.5); vbox48 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox48); gtk_box_pack_start (GTK_BOX (vbox47), vbox48, TRUE, TRUE, 0); table22 = gtk_table_new (4, 2, FALSE); gtk_widget_show (table22); gtk_box_pack_start (GTK_BOX (vbox48), table22, FALSE, FALSE, 0); druid_pttrtsradiobutton = gtk_radio_button_new_with_mnemonic (NULL, _("RTS")); gtk_widget_show (druid_pttrtsradiobutton); gtk_table_attach (GTK_TABLE (table22), druid_pttrtsradiobutton, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 8, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (druid_pttrtsradiobutton), druid_pttrtsradiobutton_group); druid_pttrtsradiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (druid_pttrtsradiobutton)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (druid_pttrtsradiobutton), TRUE); druid_pttdtrradiobutton = gtk_radio_button_new_with_mnemonic (NULL, _("DTR")); gtk_widget_show (druid_pttdtrradiobutton); gtk_table_attach (GTK_TABLE (table22), druid_pttdtrradiobutton, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 8, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (druid_pttdtrradiobutton), druid_pttrtsradiobutton_group); druid_pttrtsradiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (druid_pttdtrradiobutton)); druid_pttbothradiobutton = gtk_radio_button_new_with_mnemonic (NULL, _("both")); gtk_widget_show (druid_pttbothradiobutton); gtk_table_attach (GTK_TABLE (table22), druid_pttbothradiobutton, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 8, 0); gtk_radio_button_set_group (GTK_RADIO_BUTTON (druid_pttbothradiobutton), druid_pttrtsradiobutton_group); druid_pttrtsradiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (druid_pttbothradiobutton)); combo2 = gtk_combo_new (); g_object_set_data (G_OBJECT (GTK_COMBO (combo2)->popwin), "GladeParentKey", combo2); gtk_widget_show (combo2); gtk_table_attach (GTK_TABLE (table22), combo2, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_container_set_border_width (GTK_CONTAINER (combo2), 8); combo2_items = g_list_append (combo2_items, (gpointer) _("none")); combo2_items = g_list_append (combo2_items, (gpointer) _("/dev/ttyS0")); combo2_items = g_list_append (combo2_items, (gpointer) _("/dev/ttyS1")); combo2_items = g_list_append (combo2_items, (gpointer) _("/dev/parport0")); combo2_items = g_list_append (combo2_items, (gpointer) _("/dev/parport1")); gtk_combo_set_popdown_strings (GTK_COMBO (combo2), combo2_items); g_list_free (combo2_items); druid_pttentry = GTK_COMBO (combo2)->entry; gtk_widget_show (druid_pttentry); label239 = gtk_label_new (_("PTT device")); gtk_widget_show (label239); gtk_table_attach (GTK_TABLE (table22), label239, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label239), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label239), 7.45058e-09, 0.5); label240 = gtk_label_new (_("PTT line (serial)")); gtk_widget_show (label240); gtk_table_attach (GTK_TABLE (table22), label240, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 4, 4); gtk_label_set_justify (GTK_LABEL (label240), GTK_JUSTIFY_CENTER); gtk_misc_set_alignment (GTK_MISC (label240), 0, 0.5); druid_pttinvcheckbutton = gtk_check_button_new_with_mnemonic (_("Use inverted PTT logic")); gtk_widget_show (druid_pttinvcheckbutton); gtk_box_pack_start (GTK_BOX (vbox48), druid_pttinvcheckbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_pttinvcheckbutton), 4); druid_ptttestbutton = gtk_button_new_with_mnemonic (_("Test PTT")); gtk_widget_show (druid_ptttestbutton); gtk_box_pack_start (GTK_BOX (vbox47), druid_ptttestbutton, FALSE, FALSE, 0); gtk_container_set_border_width (GTK_CONTAINER (druid_ptttestbutton), 4); gmfskdruidpagefinish = gnome_druid_page_edge_new (GNOME_EDGE_FINISH); gtk_widget_show (gmfskdruidpagefinish); gnome_druid_append_page (GNOME_DRUID (gmfskdruid), GNOME_DRUID_PAGE (gmfskdruidpagefinish)); gnome_druid_page_edge_set_title (GNOME_DRUID_PAGE_EDGE (gmfskdruidpagefinish), _("Configuration complete!")); gnome_druid_page_edge_set_text (GNOME_DRUID_PAGE_EDGE (gmfskdruidpagefinish), _("Initial setup is now complete.\n")); /* Store pointers to all widgets, for use by lookup_widget(). */ GLADE_HOOKUP_OBJECT_NO_REF (druidwindow, druidwindow, "druidwindow"); GLADE_HOOKUP_OBJECT (druidwindow, gmfskdruid, "gmfskdruid"); GLADE_HOOKUP_OBJECT (druidwindow, druidpagestart1, "druidpagestart1"); GLADE_HOOKUP_OBJECT (druidwindow, druidpagestandard1, "druidpagestandard1"); GLADE_HOOKUP_OBJECT (druidwindow, druid_vbox1, "druid_vbox1"); GLADE_HOOKUP_OBJECT (druidwindow, vbox43, "vbox43"); GLADE_HOOKUP_OBJECT (druidwindow, label224, "label224"); GLADE_HOOKUP_OBJECT (druidwindow, table20, "table20"); GLADE_HOOKUP_OBJECT (druidwindow, label225, "label225"); GLADE_HOOKUP_OBJECT (druidwindow, label226, "label226"); GLADE_HOOKUP_OBJECT (druidwindow, label227, "label227"); GLADE_HOOKUP_OBJECT (druidwindow, label228, "label228"); GLADE_HOOKUP_OBJECT (druidwindow, label229, "label229"); GLADE_HOOKUP_OBJECT (druidwindow, druid_callentry, "druid_callentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_nameentry, "druid_nameentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_qthentry, "druid_qthentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_locentry, "druid_locentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_emailentry, "druid_emailentry"); GLADE_HOOKUP_OBJECT (druidwindow, druidpagestandard2, "druidpagestandard2"); GLADE_HOOKUP_OBJECT (druidwindow, druid_vbox2, "druid_vbox2"); GLADE_HOOKUP_OBJECT (druidwindow, vbox44, "vbox44"); GLADE_HOOKUP_OBJECT (druidwindow, label232, "label232"); GLADE_HOOKUP_OBJECT (druidwindow, table21, "table21"); GLADE_HOOKUP_OBJECT (druidwindow, druid_logfileentry, "druid_logfileentry"); GLADE_HOOKUP_OBJECT (druidwindow, label233, "label233"); GLADE_HOOKUP_OBJECT (druidwindow, label234, "label234"); GLADE_HOOKUP_OBJECT (druidwindow, label235, "label235"); GLADE_HOOKUP_OBJECT (druidwindow, druid_txpicentry, "druid_txpicentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_rxpicentry, "druid_rxpicentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_filesbutton, "druid_filesbutton"); GLADE_HOOKUP_OBJECT (druidwindow, druidpagestandard3, "druidpagestandard3"); GLADE_HOOKUP_OBJECT (druidwindow, druid_vbox3, "druid_vbox3"); GLADE_HOOKUP_OBJECT (druidwindow, vbox45, "vbox45"); GLADE_HOOKUP_OBJECT (druidwindow, label236, "label236"); GLADE_HOOKUP_OBJECT (druidwindow, vbox46, "vbox46"); GLADE_HOOKUP_OBJECT (druidwindow, hbox32, "hbox32"); GLADE_HOOKUP_OBJECT (druidwindow, label237, "label237"); GLADE_HOOKUP_OBJECT (druidwindow, druid_soundcombo, "druid_soundcombo"); GLADE_HOOKUP_OBJECT (druidwindow, druid_soundentry, "druid_soundentry"); GLADE_HOOKUP_OBJECT (druidwindow, druid_eightbitcheckbutton, "druid_eightbitcheckbutton"); GLADE_HOOKUP_OBJECT (druidwindow, druid_stereocheckbutton, "druid_stereocheckbutton"); GLADE_HOOKUP_OBJECT (druidwindow, druid_soundtestbutton, "druid_soundtestbutton"); GLADE_HOOKUP_OBJECT (druidwindow, druidpagestandard4, "druidpagestandard4"); GLADE_HOOKUP_OBJECT (druidwindow, druid_vbox4, "druid_vbox4"); GLADE_HOOKUP_OBJECT (druidwindow, vbox47, "vbox47"); GLADE_HOOKUP_OBJECT (druidwindow, label238, "label238"); GLADE_HOOKUP_OBJECT (druidwindow, vbox48, "vbox48"); GLADE_HOOKUP_OBJECT (druidwindow, table22, "table22"); GLADE_HOOKUP_OBJECT (druidwindow, druid_pttrtsradiobutton, "druid_pttrtsradiobutton"); GLADE_HOOKUP_OBJECT (druidwindow, druid_pttdtrradiobutton, "druid_pttdtrradiobutton"); GLADE_HOOKUP_OBJECT (druidwindow, druid_pttbothradiobutton, "druid_pttbothradiobutton"); GLADE_HOOKUP_OBJECT (druidwindow, combo2, "combo2"); GLADE_HOOKUP_OBJECT (druidwindow, druid_pttentry, "druid_pttentry"); GLADE_HOOKUP_OBJECT (druidwindow, label239, "label239"); GLADE_HOOKUP_OBJECT (druidwindow, label240, "label240"); GLADE_HOOKUP_OBJECT (druidwindow, druid_pttinvcheckbutton, "druid_pttinvcheckbutton"); GLADE_HOOKUP_OBJECT (druidwindow, druid_ptttestbutton, "druid_ptttestbutton"); GLADE_HOOKUP_OBJECT (druidwindow, gmfskdruidpagefinish, "gmfskdruidpagefinish"); return druidwindow; } gmfsk-0.7pre1/src/interface.h0000644000076400007640000000071410206176466011662 /* * DO NOT EDIT THIS FILE - it is generated by Glade. */ GtkWidget* create_appwindow (void); GtkWidget* create_aboutwindow (void); GtkWidget* create_txfileselection (void); GtkWidget* create_wfpopupmenu (void); GtkWidget* create_confdialog (void); GtkWidget* create_macroconfigdialog (void); GtkWidget* create_picwindow (void); GtkWidget* create_txpicfileselection (void); GtkWidget* create_rxpicfileselection (void); GtkWidget* create_druidwindow (void); gmfsk-0.7pre1/src/callbacks.c0000644000076400007640000012331010175007050011615 /* * callbacks.c -- GUI callbacks * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include "callbacks.h" #include "interface.h" #include "support.h" #include "main.h" #include "conf.h" #include "confdialog.h" #include "trx.h" #include "macro.h" #include "log.h" #include "qsodata.h" #include "hamlib.h" /* ---------------------------------------------------------------------- */ gboolean on_appwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { trx_set_state(TRX_STATE_ABORT); gtk_main_quit(); return TRUE; } /* ---------------------------------------------------------------------- */ void on_send_file1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *widget; widget = g_object_get_data(G_OBJECT(appwindow), "txfileselectdialog"); if (widget) { gtk_window_present(GTK_WINDOW(widget)); return; } widget = create_txfileselection(); gtk_widget_show(widget); g_object_set_data(G_OBJECT(appwindow), "txfileselectdialog", widget); } void on_log_to_file1_activate (GtkMenuItem *menuitem, gpointer user_data) { if (log_to_file_activate(GTK_CHECK_MENU_ITEM(menuitem)->active) == FALSE) errmsg(_("Unable to open log file")); } void on_clear_tx_window1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkEditable *editable; GtkTextView *view; GtkTextBuffer *buffer; switch (trx_get_mode()) { case MODE_FELDHELL: case MODE_FMHELL: editable = GTK_EDITABLE(lookup_widget(appwindow, "txentry")); gtk_editable_delete_text(editable, 0, -1); break; default: view = GTK_TEXT_VIEW(lookup_widget(appwindow, "txtext")); buffer = gtk_text_view_get_buffer(view); gtk_text_buffer_set_text(buffer, "", -1); break; } } void on_clear_rx_window1_activate (GtkMenuItem *menuitem, gpointer user_data) { Papertape *tape; GtkTextView *view; GtkTextBuffer *buffer; switch (trx_get_mode()) { case MODE_FELDHELL: case MODE_FMHELL: tape = PAPERTAPE(lookup_widget(appwindow, "rxtape1")); papertape_clear(tape); tape = PAPERTAPE(lookup_widget(appwindow, "rxtape2")); papertape_clear(tape); tape = PAPERTAPE(lookup_widget(appwindow, "rxtape3")); papertape_clear(tape); tape = PAPERTAPE(lookup_widget(appwindow, "rxtape4")); papertape_clear(tape); break; default: view = GTK_TEXT_VIEW(lookup_widget(appwindow, "rxtext")); buffer = gtk_text_view_get_buffer(view); gtk_text_buffer_set_text(buffer, "", -1); break; } } void on_exit1_activate (GtkMenuItem *menuitem, gpointer user_data) { trx_set_state(TRX_STATE_ABORT); gtk_main_quit(); } /* ---------------------------------------------------------------------- */ static void set_sens(gboolean afc, gboolean sql, gboolean rev, gboolean frq) { GtkWidget *w; w = lookup_widget(appwindow, "afcbutton"); gtk_widget_set_sensitive(w, afc); w = lookup_widget(appwindow, "squelchbutton"); gtk_widget_set_sensitive(w, sql); w = lookup_widget(appwindow, "reversebutton"); gtk_widget_set_sensitive(w, rev); w = lookup_widget(appwindow, "freqspinbutton"); gtk_widget_set_sensitive(w, frq); w = lookup_widget(appwindow, "freqlabel"); gtk_widget_set_sensitive(w, frq); w = lookup_widget(appwindow, "qsybutton"); #if WANT_HAMLIB gtk_widget_set_sensitive(w, frq && hamlib_active()); #else gtk_widget_set_sensitive(w, FALSE); #endif } static void set_scope_mode(miniscope_mode_t mode) { GtkWidget *widget; widget = lookup_widget(appwindow, "miniscope"); miniscope_set_mode(MINISCOPE(widget), mode); } void on_mfsk1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_MFSK16) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_MFSK16); trx_set_state_wait(state); } set_sens(TRUE, TRUE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_mfsk2_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_MFSK8) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_MFSK8); trx_set_state_wait(state); } set_sens(TRUE, TRUE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_olivia1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_OLIVIA) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_OLIVIA); trx_set_state_wait(state); } waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); set_sens(FALSE, TRUE, FALSE, FALSE); set_scope_mode(MINISCOPE_MODE_BLANK); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, TRUE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_rtty1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_RTTY) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_RTTY); trx_set_state_wait(state); } set_sens(TRUE, FALSE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_throb1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_THROB1) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_THROB1); trx_set_state_wait(state); } set_sens(TRUE, FALSE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, TRUE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_throb2_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_THROB2) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_THROB2); trx_set_state_wait(state); } set_sens(TRUE, FALSE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, TRUE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_throb4_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_THROB4) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_THROB4); trx_set_state_wait(state); } set_sens(TRUE, FALSE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, TRUE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_bpsk31_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_BPSK31) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_BPSK31); trx_set_state_wait(state); } set_sens(TRUE, TRUE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_PHASE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_qpsk31_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_QPSK31) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_QPSK31); trx_set_state_wait(state); } set_sens(TRUE, TRUE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_PHASE); waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_psk63_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_PSK63) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_PSK63); trx_set_state_wait(state); } waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); set_sens(TRUE, TRUE, TRUE, TRUE); set_scope_mode(MINISCOPE_MODE_PHASE); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_mt63_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_MT63) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_MT63); trx_set_state_wait(state); } waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); set_sens(FALSE, TRUE, FALSE, FALSE); set_scope_mode(MINISCOPE_MODE_BLANK); waterfall_set_centerline(waterfall, FALSE); waterfall_set_fixed(waterfall, TRUE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_feldhell1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_FELDHELL) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_FELDHELL); trx_set_state_wait(state); } waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); set_sens(FALSE, FALSE, FALSE, TRUE); set_scope_mode(MINISCOPE_MODE_BLANK); waterfall_set_centerline(waterfall, TRUE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 1); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "%"); statusbar_set_mode(trx_get_mode()); } } void on_cw1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkCheckMenuItem *item = GTK_CHECK_MENU_ITEM(menuitem); GtkWidget *w; if (item->active) { if (trx_get_mode() != MODE_CW) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_mode(MODE_CW); trx_set_state_wait(state); } waterfall_set_samplerate(waterfall, trx_get_samplerate()); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); set_sens(FALSE, TRUE, FALSE, TRUE); set_scope_mode(MINISCOPE_MODE_SCOPE); waterfall_set_centerline(waterfall, TRUE); waterfall_set_fixed(waterfall, FALSE); w = lookup_widget(appwindow, "trxnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(w), 0); w = lookup_widget(appwindow, "metricdial"); gtk_dial_set_unit(GTK_DIAL(w), "WPM"); statusbar_set_mode(trx_get_mode()); } } /* ---------------------------------------------------------------------- */ void on_preferences1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *widget; widget = g_object_get_data(G_OBJECT(appwindow), "configdialog"); if (widget) { gtk_window_present(GTK_WINDOW(widget)); return; } widget = confdialog_init(); if (widget) { gtk_widget_show(widget); g_object_set_data(G_OBJECT(appwindow), "configdialog", widget); } } void on_macroconfig1_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(1); } void on_macroconfig2_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(2); } void on_macroconfig3_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(3); } void on_macroconfig4_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(4); } void on_macroconfig5_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(5); } void on_macroconfig6_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(6); } void on_macroconfig7_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(7); } void on_macroconfig8_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(8); } void on_macroconfig9_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(9); } void on_macroconfig10_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(10); } void on_macroconfig11_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(11); } void on_macroconfig12_activate (GtkMenuItem *menuitem, gpointer user_data) { macroconfig(12); } /* ---------------------------------------------------------------------- */ void on_about1_activate (GtkMenuItem *menuitem, gpointer user_data) { GtkWidget *aboutwindow; aboutwindow = create_aboutwindow(); gtk_widget_show(aboutwindow); } void on_contents1_activate (GtkMenuItem *menuitem, gpointer user_data) { GError *error = NULL; gnome_help_display("gmfsk.xml", NULL, &error); if (error != NULL) { errmsg(error->message); g_error_free(error); } } /* ---------------------------------------------------------------------- */ void on_pausebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { gboolean b = gtk_toggle_button_get_active(togglebutton); if (b && trx_get_state() != TRX_STATE_ABORT) { trx_set_state(TRX_STATE_PAUSE); } } void on_rxbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { gboolean b = gtk_toggle_button_get_active(togglebutton); if (b) trx_set_state(TRX_STATE_RX); } void on_txbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { GtkWidget *widget; gboolean b = gtk_toggle_button_get_active(togglebutton); if (b) { trx_set_state(TRX_STATE_TX); /* set focus to the tx widget */ switch (trx_get_mode()) { case MODE_FELDHELL: case MODE_FMHELL: widget = lookup_widget(appwindow, "txentry"); gtk_widget_grab_focus(widget); break; default: widget = lookup_widget(appwindow, "txtext"); gtk_widget_grab_focus(widget); break; } } } void on_abortbutton_clicked (GtkButton *button, gpointer user_data) { gint state = trx_get_state(); if (state != TRX_STATE_ABORT && state != TRX_STATE_PAUSE) { trx_set_state_wait(TRX_STATE_ABORT); // /* clear tx typeahead buffer */ // while (trx_get_tx_char() != -1); /* switch to rx */ trx_set_state_wait(TRX_STATE_RX); push_button("rxbutton"); } } static gint tune_timeout_cb (gpointer unused) { gdk_threads_enter(); if (trx_get_state() == TRX_STATE_TUNE) push_button("rxbutton"); gdk_threads_leave(); return FALSE; } void on_tunebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { gboolean b = gtk_toggle_button_get_active(togglebutton); if (b) { trx_set_state(TRX_STATE_TUNE); g_timeout_add(30000, tune_timeout_cb, NULL); } } /* ---------------------------------------------------------------------- */ void on_qsoentry_changed (GtkEditable *editable, gpointer user_data) { qsodata_set_starttime(FALSE); } void on_logbutton_clicked (GtkButton *button, gpointer user_data) { qsodata_log(); } void on_newbutton_clicked (GtkButton *button, gpointer user_data) { qsodata_clear(); } /* ---------------------------------------------------------------------- */ void on_txtext_delete_from_cursor (GtkTextView *textview, GtkDeleteType type, gint count, gpointer user_data) { GtkTextBuffer *textbuffer; GtkTextMark *mark1, *mark2; GtkTextIter iter1, iter2; if (type != GTK_DELETE_CHARS || count != -1) return; textbuffer = gtk_text_view_get_buffer(textview); /* get the iterator at TX mark */ mark1 = gtk_text_buffer_get_mark(textbuffer, "editablemark"); gtk_text_buffer_get_iter_at_mark(textbuffer, &iter1, mark1); /* get the iterator at the insert mark */ mark2 = gtk_text_buffer_get_insert(textbuffer); gtk_text_buffer_get_iter_at_mark(textbuffer, &iter2, mark2); /* If they're not the same we have nothing to do */ if (!gtk_text_iter_equal(&iter1, &iter2)) return; /* * User hit backspace at the TX mark, queue a BS character * and delete the previous char. It should be non-editable * so the default handler won't delete it. */ trx_queue_backspace(); gtk_text_iter_backward_char(&iter1); gtk_text_buffer_delete(textbuffer, &iter1, &iter2); } void on_txtext_populate_popup (GtkTextView *textview, GtkMenu *menu, gpointer user_data) { GtkWidget *menu_item; /* Add the separator */ menu_item = gtk_separator_menu_item_new(); gtk_widget_show(menu_item); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menu_item); /* Add clear button */ menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, NULL); // gtk_widget_set_sensitive(menu_item, TRUE); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_clear_tx_window1_activate), NULL); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menu_item); } /* ---------------------------------------------------------------------- */ void on_macrobutton1_clicked (GtkButton *button, gpointer user_data) { send_macro(1); } gboolean on_macrobutton1_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(1); return FALSE; } void on_macrobutton2_clicked (GtkButton *button, gpointer user_data) { send_macro(2); } gboolean on_macrobutton2_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(2); return FALSE; } void on_macrobutton3_clicked (GtkButton *button, gpointer user_data) { send_macro(3); } gboolean on_macrobutton3_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(3); return FALSE; } void on_macrobutton4_clicked (GtkButton *button, gpointer user_data) { send_macro(4); } gboolean on_macrobutton4_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(4); return FALSE; } void on_macrobutton5_clicked (GtkButton *button, gpointer user_data) { send_macro(5); } gboolean on_macrobutton5_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(5); return FALSE; } void on_macrobutton6_clicked (GtkButton *button, gpointer user_data) { send_macro(6); } gboolean on_macrobutton6_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(6); return FALSE; } void on_macrobutton7_clicked (GtkButton *button, gpointer user_data) { send_macro(7); } gboolean on_macrobutton7_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(7); return FALSE; } void on_macrobutton8_clicked (GtkButton *button, gpointer user_data) { send_macro(8); } gboolean on_macrobutton8_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(8); return FALSE; } void on_macrobutton9_clicked (GtkButton *button, gpointer user_data) { send_macro(9); } gboolean on_macrobutton9_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(9); return FALSE; } void on_macrobutton10_clicked (GtkButton *button, gpointer user_data) { send_macro(10); } gboolean on_macrobutton10_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(10); return FALSE; } void on_macrobutton11_clicked (GtkButton *button, gpointer user_data) { send_macro(11); } gboolean on_macrobutton11_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(11); return FALSE; } void on_macrobutton12_clicked (GtkButton *button, gpointer user_data) { send_macro(12); } gboolean on_macrobutton12_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { if (event->button == 3) macroconfig(12); return FALSE; } /* ---------------------------------------------------------------------- */ gboolean on_waterfall_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GtkWidget *w = WFPopupMenu; gint i; /* we are interested in button three */ if (event->button != 3) return FALSE; /* activate the correct mode radiobutton */ i = conf_get_int("wf/mode") + 2; w = GTK_WIDGET(g_list_nth_data(GTK_MENU_SHELL(w)->children, i)); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), TRUE); gtk_menu_popup(GTK_MENU(WFPopupMenu), NULL, NULL, NULL, NULL, event->button, event->time); return FALSE; } void on_waterfall1_activate (GtkMenuItem *menuitem, gpointer user_data) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) conf_set_int("wf/mode", 0); } void on_spectrum1_activate (GtkMenuItem *menuitem, gpointer user_data) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) conf_set_int("wf/mode", 1); } void on_scope1_activate (GtkMenuItem *menuitem, gpointer user_data) { if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) conf_set_int("wf/mode", 2); } void on_wfpause_activate (GtkMenuItem *menuitem, gpointer user_data) { waterfall_set_pause(waterfall, GTK_CHECK_MENU_ITEM(menuitem)->active); } void on_wfproperties_activate (GtkMenuItem *menuitem, gpointer user_data) { confdialog_select_node("Waterfall:Settings"); } /* ---------------------------------------------------------------------- */ void on_freqspinbutton_changed (GtkEditable *editable, gpointer user_data) { GtkSpinButton *spin; gfloat freq; spin = GTK_SPIN_BUTTON(editable); freq = gtk_spin_button_get_value_as_float(spin); waterfall_set_frequency(waterfall, freq); } void on_afcbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { trx_set_afc(gtk_toggle_button_get_active(togglebutton)); } void on_squelchbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { trx_set_squelch(gtk_toggle_button_get_active(togglebutton)); } void on_reversebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data) { trx_set_reverse(gtk_toggle_button_get_active(togglebutton)); } /* ---------------------------------------------------------------------- */ static void destroy_txfileselection(void) { GtkWidget *w; w = g_object_get_data(G_OBJECT(appwindow), "txfileselectdialog"); if (w != NULL) gtk_widget_destroy(w); g_object_set_data(G_OBJECT(appwindow), "txfileselectdialog", NULL); } gboolean on_txfileselection_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { destroy_txfileselection(); return FALSE; } void on_txfileselect_ok_button_clicked (GtkButton *button, gpointer user_data) { GtkFileSelection *f; GtkWidget *w; gchar *filename, *contents, *converted; GError *err = NULL; w = g_object_get_data(G_OBJECT(appwindow), "txfileselectdialog"); f = GTK_FILE_SELECTION(w); filename = g_strdup(gtk_file_selection_get_filename(f)); destroy_txfileselection(); if (g_file_get_contents(filename, &contents, NULL, &err) == FALSE) { if (err != NULL) { errmsg(_("Error reading file: %s"), err->message); g_free(filename); } return; } if ((converted = g_locale_to_utf8(contents, -1, NULL, NULL, &err)) == NULL) { if (err != NULL) { errmsg(_("Error converting file to UTF8: %s"), err->message); g_free(filename); g_free(contents); } return; } send_string(converted); g_free(filename); g_free(contents); g_free(converted); } void on_txfileselect_cancel_button_clicked (GtkButton *button, gpointer user_data) { destroy_txfileselection(); } /* ---------------------------------------------------------------------- */ static gchar *qsodatatext = NULL; static void word_start(GtkTextIter *iter) { while (gtk_text_iter_backward_char(iter)) if (!g_unichar_isalnum(gtk_text_iter_get_char(iter))) break; if (!g_unichar_isalnum(gtk_text_iter_get_char(iter))) gtk_text_iter_forward_char(iter); } static void word_end(GtkTextIter *iter) { while (gtk_text_iter_forward_char(iter)) if (!g_unichar_isalnum(gtk_text_iter_get_char(iter))) break; } gboolean on_rxtext_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data) { GtkTextIter iter, start, end; GtkTextBuffer *buffer; gint x, y; g_free(qsodatatext); qsodatatext = NULL; if (event->button != 3) return FALSE; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); /* If there already is a selection, use it */ if (gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) { qsodatatext = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); return FALSE; } gtk_text_view_window_to_buffer_coords(GTK_TEXT_VIEW(widget), GTK_TEXT_WINDOW_WIDGET, event->x, event->y, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &iter, x, y); if (!gtk_text_iter_inside_word(&iter)) return FALSE; start = iter; end = iter; word_start(&start); word_end(&end); qsodatatext = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); gtk_text_buffer_move_mark_by_name(buffer, "selection_bound", &start); gtk_text_buffer_move_mark_by_name(buffer, "insert", &end); return FALSE; } static void on_rxtext_qsodata_activated (GtkMenuItem *menuitem, gpointer data) { gchar *widgetname = (gchar *) data; GtkWidget *w; if ((w = lookup_widget(appwindow, widgetname)) != NULL) gtk_entry_set_text(GTK_ENTRY(w), qsodatatext); } static void on_rxtext_menu_selection_done (GtkMenuShell *menushell, gpointer data) { GtkTextView *view; GtkTextBuffer *buffer; GtkTextIter iter; view = GTK_TEXT_VIEW(lookup_widget(appwindow, "rxtext")); buffer = gtk_text_view_get_buffer(view); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_move_mark_by_name(buffer, "selection_bound", &iter); gtk_text_buffer_move_mark_by_name(buffer, "insert", &iter); } void on_rxtext_populate_popup (GtkTextView *textview, GtkMenu *menu, gpointer user_data) { GtkWidget *menu_item; gboolean flag = FALSE; if (qsodatatext != NULL) flag = TRUE; g_signal_connect(G_OBJECT(menu), "selection-done", G_CALLBACK(on_rxtext_menu_selection_done), NULL); /* Prepend separator */ menu_item = gtk_separator_menu_item_new(); gtk_widget_show(menu_item); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menu_item); /* Prepend clear button */ menu_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLEAR, NULL); // gtk_widget_set_sensitive(menu_item, TRUE); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_clear_rx_window1_activate), NULL); gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menu_item); /* Append separator */ menu_item = gtk_separator_menu_item_new(); gtk_widget_show(menu_item); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); /* Append qsodata buttons */ menu_item = gtk_menu_item_new_with_label(_("Callsign")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsocallentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label(_("Name")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsonameentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label(_("QTH")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsoqthentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label(_("Locator")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsolocentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label(_("Sent RST")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsotxrstentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label(_("Received RST")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsorxrstentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); menu_item = gtk_menu_item_new_with_label(_("Notes")); gtk_widget_set_sensitive(menu_item, flag); gtk_widget_show(menu_item); g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(on_rxtext_qsodata_activated), (gpointer) "qsonotesentry"); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); } /* ---------------------------------------------------------------------- */ void on_confrestartbutton_clicked (GtkButton *button, gpointer user_data) { gint state = trx_get_state(); trx_set_state_wait(TRX_STATE_ABORT); trx_set_state_wait(state); waterfall_set_bandwidth(waterfall, trx_get_bandwidth()); waterfall_set_frequency(waterfall, trx_get_freq()); } /* ---------------------------------------------------------------------- */ gboolean on_modeeventbox_button_press_event (GtkWidget *eventwidget, GdkEventButton *event, gpointer user_data) { switch (trx_get_mode()) { case MODE_MFSK16: case MODE_MFSK8: confdialog_select_node("Modems:MFSK"); break; case MODE_OLIVIA: confdialog_select_node("Modems:OLIVIA"); break; case MODE_RTTY: confdialog_select_node("Modems:RTTY"); break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: confdialog_select_node("Modems:THROB"); break; case MODE_BPSK31: case MODE_QPSK31: case MODE_PSK63: confdialog_select_node("Modems:PSK31"); break; case MODE_MT63: confdialog_select_node("Modems:MT63"); break; case MODE_FELDHELL: case MODE_FMHELL: confdialog_select_node("Modems:HELL"); break; case MODE_CW: confdialog_select_node("Modems:CW"); break; } return TRUE; } /* ---------------------------------------------------------------------- */ void on_qsybutton_clicked (GtkButton *button, gpointer user_data) { #if WANT_HAMLIB hamlib_set_qsy(); #else g_warning("on_qsybutton_clicked: Hamlib support not compiled in"); #endif } gmfsk-0.7pre1/src/callbacks.h0000644000076400007640000003602010174550426011634 /* * callbacks.h -- GUI callbacks * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include /* ---------------------------------------------------------------------- */ #include "waterfall.h" #include "miniscope.h" #include "gtkdial.h" #include "papertape.h" /* ---------------------------------------------------------------------- */ gboolean on_appwindow_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_send_file1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_log_to_file1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_clear_tx_window1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_clear_rx_window1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_exit1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_mfsk1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_mfsk2_activate (GtkMenuItem *menuitem, gpointer user_data); void on_rtty1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_throb1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_throb2_activate (GtkMenuItem *menuitem, gpointer user_data); void on_throb4_activate (GtkMenuItem *menuitem, gpointer user_data); void on_bpsk31_activate (GtkMenuItem *menuitem, gpointer user_data); void on_qpsk31_activate (GtkMenuItem *menuitem, gpointer user_data); void on_feldhell1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_preferences1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig2_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig3_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig4_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig5_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig6_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig7_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig8_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig9_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig10_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig11_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macroconfig12_activate (GtkMenuItem *menuitem, gpointer user_data); void on_about1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_pausebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_rxbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_txbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_abortbutton_clicked (GtkButton *button, gpointer user_data); void on_tunebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_qsoentry_changed (GtkEditable *editable, gpointer user_data); void on_logbutton_clicked (GtkButton *button, gpointer user_data); void on_newbutton_clicked (GtkButton *button, gpointer user_data); gboolean on_rxtext_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); gboolean on_waterfall_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_freqspinbutton_changed (GtkEditable *editable, gpointer user_data); void on_afcbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_squelchbutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_reversebutton_toggled (GtkToggleButton *togglebutton, gpointer user_data); gboolean on_txfileselection_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data); void on_txfileselect_ok_button_clicked (GtkButton *button, gpointer user_data); void on_txfileselect_cancel_button_clicked (GtkButton *button, gpointer user_data); void on_wfpause_activate (GtkMenuItem *menuitem, gpointer user_data); void on_macrobutton1_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton1_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton2_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton2_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton3_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton3_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton4_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton4_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton5_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton5_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton6_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton6_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton7_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton7_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton8_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton8_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton9_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton9_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton10_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton10_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton11_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton11_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_macrobutton12_clicked (GtkButton *button, gpointer user_data); gboolean on_macrobutton12_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_rxtext_populate_popup (GtkTextView *textview, GtkMenu *menu, gpointer user_data); void on_txtext_populate_popup (GtkTextView *textview, GtkMenu *menu, gpointer user_data); void on_mt63_activate (GtkMenuItem *menuitem, gpointer user_data); void on_confrestartbutton_clicked (GtkButton *button, gpointer user_data); gboolean on_rxtext_button_press_event (GtkWidget *widget, GdkEventButton *event, gpointer user_data); void on_wfspeed_half_activate (GtkMenuItem *menuitem, gpointer user_data); void on_wfspeed_normal_activate (GtkMenuItem *menuitem, gpointer user_data); void on_wfspeed_double_activate (GtkMenuItem *menuitem, gpointer user_data); gboolean on_modeeventbox_button_press_event (GtkWidget *eventwidget, GdkEventButton *event, gpointer user_data); void on_contents1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_wfproperties_activate (GtkMenuItem *menuitem, gpointer user_data); void on_txtext_delete_from_cursor (GtkTextView *textview, GtkDeleteType type, gint count, gpointer user_data); void on_waterfall1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_spectrum1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_scope1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_psk63_activate (GtkMenuItem *menuitem, gpointer user_data); void on_cw1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_olivia1_activate (GtkMenuItem *menuitem, gpointer user_data); void on_qsybutton_clicked (GtkButton *button, gpointer user_data); gmfsk-0.7pre1/src/waterfall.c0000644000076400007640000010203610165600217011664 /* * Waterfall Spectrum Analyzer Widget * Copyright (C) 2001,2002,2003 Tomi Manninen * * Based on the Spectrum Widget by Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "waterfall.h" #include #include #include #include #include #include #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #define fftw_new(type, n) ((type *) fftw_malloc(sizeof(type) * (n))) #define RULER_HEIGHT 20 static void waterfall_class_init(WaterfallClass *klass); static void waterfall_init(Waterfall *wf); static void waterfall_destroy(GtkObject *object); static gint waterfall_expose(GtkWidget *widget, GdkEventExpose *event); static void waterfall_realize(GtkWidget *widget); static void waterfall_unrealize(GtkWidget *widget); static void waterfall_size_allocate(GtkWidget *widget, GtkAllocation *allocation); static gint waterfall_button_press(GtkWidget *widget, GdkEventButton *event); static gint waterfall_button_release(GtkWidget *widget, GdkEventButton *event); static gint waterfall_motion_notify(GtkWidget *widget, GdkEventMotion *event); static gint waterfall_leave_notify(GtkWidget *widget, GdkEventCrossing *event); static void waterfall_send_configure (Waterfall *wf); static void set_idle_callback(Waterfall *wf); static gint idle_callback(gpointer data); static void setwindow(gdouble *window, gint len, wf_window_t type); static void calculate_frequencies(Waterfall *wf); /* ---------------------------------------------------------------------- */ static GtkWidgetClass *parent_class = NULL; static WaterfallClass *waterfall_class = NULL; enum { FREQUENCY_SET_SIGNAL, LAST_SIGNAL }; static gint waterfall_signals[LAST_SIGNAL] = { 0 }; /* ---------------------------------------------------------------------- */ GType waterfall_get_type(void) { static GType waterfall_type = 0; if (!waterfall_type) { static const GTypeInfo waterfall_info = { sizeof(WaterfallClass), NULL, NULL, (GClassInitFunc) waterfall_class_init, NULL, NULL, sizeof(Waterfall), 0, (GInstanceInitFunc) waterfall_init }; waterfall_type = g_type_register_static(GTK_TYPE_WIDGET, "Waterfall", &waterfall_info, 0); } return waterfall_type; } static void waterfall_class_init(WaterfallClass *class) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; parent_class = gtk_type_class(gtk_widget_get_type()); waterfall_class = class; gdk_rgb_init(); // gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); // gtk_widget_set_default_visual(gdk_rgb_get_visual()); object_class->destroy = waterfall_destroy; // object_class->finalize = waterfall_finalize; widget_class->expose_event = waterfall_expose; widget_class->realize = waterfall_realize; widget_class->unrealize = waterfall_unrealize; widget_class->size_allocate = waterfall_size_allocate; widget_class->button_press_event = waterfall_button_press; widget_class->button_release_event = waterfall_button_release; widget_class->motion_notify_event = waterfall_motion_notify; widget_class->leave_notify_event = waterfall_leave_notify; waterfall_signals[FREQUENCY_SET_SIGNAL] = \ g_signal_new("frequency_set", G_TYPE_FROM_CLASS(object_class), G_SIGNAL_RUN_FIRST, 0, NULL, NULL, g_cclosure_marshal_VOID__FLOAT, GTK_TYPE_NONE, 1, GTK_TYPE_FLOAT); class->frequency_set = NULL; } static void waterfall_init(Waterfall *wf) { GtkWidget *widget = GTK_WIDGET(wf); guint32 colormap[256]; gint i; widget->requisition.width = WATERFALL_DEFAULT_WIDTH; widget->requisition.height = WATERFALL_DEFAULT_HEIGHT; wf->mutex = g_mutex_new(); wf->running = TRUE; wf->paused = FALSE; wf->idlefunc = 0; /* initialize the colors */ gdk_color_parse("magenta", &wf->pointer1col); wf->pointer1_gc = NULL; gdk_color_parse("blue", &wf->pointer2col); wf->pointer2_gc = NULL; gdk_color_parse("red", &wf->pointer3col); wf->pointer3_gc = NULL; gdk_color_parse("grey75", &wf->gridcol); wf->grid_gc = NULL; gdk_color_parse("green", &wf->tracecol); wf->trace_gc = NULL; /* compute cmap */ #if 0 for (i = 0; i < 256; i++) { guchar r, g, b; if (i < 128) { r = 0; b = 256 - 2 * i; g = 2 * i; } else { r = 2 * (i - 128); b = 0; g = 256 - 2 * (i - 128); } colormap[i] = (r << 16) + (g << 8) + b; } #else for (i = 0; i < 256; i++) colormap[i] = 65793 * i; #endif wf->cmap = gdk_rgb_cmap_new(colormap, 256); wf->pixmap = NULL; wf->pixbufsize = 0; wf->pixbuf = NULL; wf->pixptr = 0; wf->pointer = -1; wf->centerline = FALSE; wf->fixed = FALSE; wf->config.magnification = WATERFALL_MAG_1; wf->config.window = WATERFALL_WINDOW_TRIA; wf->config.mode = WATERFALL_MODE_NORMAL; wf->config.overlap = 1024; wf->config.ampspan = 100.0; wf->config.reflevel = 0.0; wf->config.direction = TRUE; wf->fftlen = WATERFALL_FFTLEN_1; wf->samplerate = 8000.0; wf->centerfreq = 1500.0; wf->frequency = 1000.0; wf->carrierfreq = 0.0; wf->bw = 200.0; calculate_frequencies(wf); wf->lsb = FALSE; wf->ruler_cursor = gdk_cursor_new(GDK_SB_H_DOUBLE_ARROW); wf->ruler_cursor_set = FALSE; wf->ruler_drag = FALSE; wf->ruler_ref_f = 0.0; wf->ruler_ref_x = 0; wf->fft_plan = fftw_create_plan(wf->fftlen, FFTW_FORWARD, FFTW_MEASURE | \ FFTW_OUT_OF_PLACE | \ FFTW_USE_WISDOM); wf->specbuf = g_new(gdouble, WATERFALL_FFTLEN_MAX); wf->peakbuf = g_new(gdouble, WATERFALL_FFTLEN_MAX); wf->fft_ibuf = fftw_new(fftw_complex, WATERFALL_FFTLEN_MAX); wf->fft_obuf = fftw_new(fftw_complex, WATERFALL_FFTLEN_MAX); wf->fft_window = g_new(gdouble, WATERFALL_FFTLEN_MAX); wf->inbuf = g_new(gdouble, WATERFALL_FFTLEN_MAX); for (i = 0; i < WATERFALL_FFTLEN_MAX; i++) { wf->specbuf[i] = -1.0; wf->peakbuf[i] = -1.0; c_re(wf->fft_ibuf[i]) = 0.0; c_im(wf->fft_ibuf[i]) = 0.0; c_re(wf->fft_obuf[i]) = 0.0; c_im(wf->fft_obuf[i]) = 0.0; wf->inbuf[i] = 0.0; } wf->inptr = 0; setwindow(wf->fft_window, wf->fftlen, WATERFALL_WINDOW_TRIA); } static void alloc_pixbuf(Waterfall *wf, gboolean restart) { gint w, h, oldsize, newsize; guchar *oldbuf, *oldptr; w = wf->fftlen / 2; h = GTK_WIDGET(wf)->allocation.height - RULER_HEIGHT; oldsize = wf->pixbufsize; newsize = 2 * w * h; if (newsize < 0) return; if (!restart && wf->pixbuf && oldsize == newsize) return; oldbuf = wf->pixbuf; oldptr = wf->pixptr; wf->pixbuf = g_new0(guchar, newsize); wf->pixptr = wf->pixbuf; if (!restart && oldbuf) { memcpy(wf->pixbuf, oldbuf, MIN(oldsize, newsize)); wf->pixptr += oldptr - oldbuf; } wf->pixbufsize = newsize; } static void waterfall_realize(GtkWidget *widget) { Waterfall *wf; GdkWindowAttr attributes; gint attributes_mask; GdkGCValues gc_values; g_return_if_fail(widget != NULL); g_return_if_fail(IS_WATERFALL(widget)); wf = WATERFALL(widget); g_mutex_lock(wf->mutex); GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.colormap = gtk_widget_get_colormap(widget); attributes.event_mask = \ gtk_widget_get_events(widget) | \ GDK_EXPOSURE_MASK | \ GDK_BUTTON_PRESS_MASK | \ GDK_BUTTON_RELEASE_MASK | \ GDK_POINTER_MOTION_MASK | \ GDK_POINTER_MOTION_HINT_MASK | \ GDK_LEAVE_NOTIFY_MASK; attributes_mask = \ GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gdk_window_set_user_data(widget->window, wf); widget->style = gtk_style_attach(widget->style, widget->window); gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL); if (!gdk_color_alloc(widget->style->colormap, &wf->pointer1col)) g_warning(_("unable to allocate color: ( %d %d %d )"), wf->pointer1col.red, wf->pointer1col.green, wf->pointer1col.blue); gc_values.foreground = wf->pointer1col; wf->pointer1_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (!gdk_color_alloc(widget->style->colormap, &wf->pointer2col)) g_warning(_("unable to allocate color: ( %d %d %d )"), wf->pointer2col.red, wf->pointer2col.green, wf->pointer2col.blue); gc_values.foreground = wf->pointer2col; wf->pointer2_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (!gdk_color_alloc(widget->style->colormap, &wf->pointer3col)) g_warning(_("unable to allocate color: ( %d %d %d )"), wf->pointer3col.red, wf->pointer3col.green, wf->pointer3col.blue); gc_values.foreground = wf->pointer3col; wf->pointer3_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (!gdk_color_alloc(widget->style->colormap, &wf->gridcol)) g_warning(_("unable to allocate color: ( %d %d %d )"), wf->gridcol.red, wf->gridcol.green, wf->gridcol.blue); gc_values.foreground = wf->gridcol; wf->grid_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (!gdk_color_alloc(widget->style->colormap, &wf->tracecol)) g_warning(_("unable to allocate color: ( %d %d %d )"), wf->tracecol.red, wf->tracecol.green, wf->tracecol.blue); gc_values.foreground = wf->tracecol; wf->trace_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); if (wf->pixmap) gdk_pixmap_unref(wf->pixmap); wf->pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); alloc_pixbuf(wf, FALSE); calculate_frequencies(wf); g_mutex_unlock(wf->mutex); waterfall_send_configure(WATERFALL(widget)); } static void waterfall_unrealize(GtkWidget *widget) { Waterfall *wf; g_return_if_fail(widget != NULL); g_return_if_fail(IS_WATERFALL(widget)); wf = WATERFALL(widget); g_mutex_lock(wf->mutex); if (wf->idlefunc) gtk_idle_remove(wf->idlefunc); if (wf->pointer1_gc) gtk_gc_release(wf->pointer1_gc); wf->pointer1_gc = NULL; if (wf->pointer2_gc) gtk_gc_release(wf->pointer2_gc); wf->pointer2_gc = NULL; if (wf->pixmap) gdk_pixmap_unref(wf->pixmap); wf->pixmap = NULL; if (wf->cmap) gdk_rgb_cmap_free(wf->cmap); wf->cmap = NULL; g_free(wf->pixbuf); wf->pixbuf = NULL; wf->pixptr = NULL; wf->pixbufsize = 0; g_free(wf->specbuf); g_free(wf->peakbuf); wf->specbuf = NULL; wf->peakbuf = NULL; fftw_free(wf->fft_ibuf); fftw_free(wf->fft_obuf); wf->fft_ibuf = NULL; wf->fft_obuf = NULL; g_free(wf->inbuf); wf->inbuf = NULL; if (wf->fft_plan) fftw_destroy_plan(wf->fft_plan); wf->fft_plan = NULL; if (wf->ruler_cursor) gdk_cursor_unref(wf->ruler_cursor); wf->ruler_cursor = NULL; if (GTK_WIDGET_CLASS(parent_class)->unrealize) (*GTK_WIDGET_CLASS(parent_class)->unrealize)(widget); g_mutex_unlock(wf->mutex); } static void waterfall_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { Waterfall *wf; gint width, height; g_return_if_fail(widget != NULL); g_return_if_fail(IS_WATERFALL(widget)); g_return_if_fail(allocation != NULL); wf = WATERFALL(widget); g_mutex_lock(wf->mutex); width = MIN(allocation->width, wf->fftlen / 2); height = allocation->height; widget->allocation = *allocation; widget->allocation.width = width; widget->allocation.height = height; wf->inptr = 0; alloc_pixbuf(wf, FALSE); calculate_frequencies(wf); if (GTK_WIDGET_REALIZED(widget)) { if (wf->pixmap) gdk_pixmap_unref(wf->pixmap); wf->pixmap = gdk_pixmap_new(widget->window, width, height, -1); gdk_window_move_resize(widget->window, allocation->x, allocation->y, allocation->width, allocation->height); waterfall_send_configure(WATERFALL(widget)); } g_mutex_unlock(wf->mutex); } static void waterfall_send_configure(Waterfall *wf) { GtkWidget *widget; GdkEventConfigure event; widget = GTK_WIDGET(wf); event.type = GDK_CONFIGURE; event.window = widget->window; event.send_event = TRUE; event.x = widget->allocation.x; event.y = widget->allocation.y; event.width = widget->allocation.width; event.height = widget->allocation.height; gtk_widget_event(widget, (GdkEvent*)&event); } static gint waterfall_button_press(GtkWidget *widget, GdkEventButton *event) { Waterfall *wf = WATERFALL(widget); gdouble resolution, span, f; if (wf->config.mode == WATERFALL_MODE_SCOPE) return FALSE; if (event->button != 1) return FALSE; if (event->y < RULER_HEIGHT) { gtk_grab_add(widget); wf->ruler_drag = TRUE; wf->ruler_ref_x = event->x; wf->ruler_ref_f = wf->centerfreq; return FALSE; } if (wf->fixed) return FALSE; resolution = wf->samplerate / wf->fftlen; span = resolution * widget->allocation.width; f = wf->centerfreq - span / 2 + event->x * resolution; f = MAX(f, wf->bw / 2.0); f = MIN(f, wf->samplerate / 2.0 - wf->bw / 2.0); wf->frequency = f; calculate_frequencies(wf); gtk_signal_emit(GTK_OBJECT(wf), waterfall_signals[FREQUENCY_SET_SIGNAL], wf->frequency); return FALSE; } static gint waterfall_button_release(GtkWidget *widget, GdkEventButton *event) { Waterfall *wf = WATERFALL(widget); if (wf->ruler_drag) { wf->ruler_drag = FALSE; gtk_grab_remove(widget); } return FALSE; } static gint waterfall_motion_notify(GtkWidget *widget, GdkEventMotion *event) { Waterfall *wf = WATERFALL(widget); GdkModifierType mods; gint x, y; if (wf->config.mode == WATERFALL_MODE_SCOPE) return FALSE; if (event->is_hint || (event->window != widget->window)) { gdk_window_get_pointer(widget->window, &x, &y, &mods); } else { x = event->x; y = event->y; mods = event->state; } if (wf->ruler_drag && (mods & GDK_BUTTON1_MASK)) { gdouble res = wf->samplerate / wf->fftlen; wf->centerfreq = wf->ruler_ref_f + res * (wf->ruler_ref_x - x); calculate_frequencies(wf); return FALSE; } if (y < RULER_HEIGHT) { wf->pointer = -1; if (!wf->ruler_cursor_set) { gdk_window_set_cursor(widget->window, wf->ruler_cursor); wf->ruler_cursor_set = TRUE; } } else { if (wf->fixed) wf->pointer = -1; else wf->pointer = x; if (wf->ruler_cursor_set) { gdk_window_set_cursor(widget->window, NULL); wf->ruler_cursor_set = FALSE; } } set_idle_callback(wf); return FALSE; } static gint waterfall_leave_notify(GtkWidget *widget, GdkEventCrossing *event) { WATERFALL(widget)->pointer = -1; set_idle_callback(WATERFALL(widget)); return FALSE; } /* ---------------------------------------------------------------------- */ GtkWidget *waterfall_new(const char *name, void *dummy0, void *dummy1, unsigned int dummy2, unsigned int dummy3) { return GTK_WIDGET(gtk_type_new(waterfall_get_type())); } static void waterfall_destroy(GtkObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(IS_WATERFALL(object)); if (GTK_OBJECT_CLASS(parent_class)->destroy) (*GTK_OBJECT_CLASS(parent_class)->destroy) (object); } static gint waterfall_expose(GtkWidget *widget, GdkEventExpose *event) { g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_WATERFALL(widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); set_idle_callback(WATERFALL(widget)); return FALSE; } /* ---------------------------------------------------------------------- */ static inline gint ftox(Waterfall *wf, gdouble f) { return (gint) ((f - wf->startfreq) / wf->resolution + 0.5); } static inline gint ftow(Waterfall *wf, gdouble f) { return (gint) (f / wf->resolution + 0.5); } static inline gdouble xtof(Waterfall *wf, gint x) { return wf->startfreq + x * wf->resolution; } static void draw_markers(Waterfall *wf) { gint x1, x2, x3; GdkGC *gc; x1 = ftox(wf, wf->frequency - (wf->bw / 2.0)); x2 = ftox(wf, wf->frequency); x3 = ftox(wf, wf->frequency + (wf->bw / 2.0)); gc = (wf->fixed) ? wf->pointer3_gc : wf->pointer2_gc; gdk_draw_line(wf->pixmap, gc, x1, RULER_HEIGHT, x1, GTK_WIDGET(wf)->allocation.height - 1); if (wf->centerline) { gdk_draw_line(wf->pixmap, gc, x2, RULER_HEIGHT, x2, GTK_WIDGET(wf)->allocation.height - 1); } gdk_draw_line(wf->pixmap, gc, x3, RULER_HEIGHT, x3, GTK_WIDGET(wf)->allocation.height - 1); if (wf->fixed || wf->pointer == -1) return; x1 = ftox(wf, xtof(wf, wf->pointer) - wf->bw / 2); x2 = wf->pointer; x3 = ftox(wf, xtof(wf, wf->pointer) + wf->bw / 2); gc = wf->pointer1_gc; gdk_draw_line(wf->pixmap, gc, x1, RULER_HEIGHT, x1, GTK_WIDGET(wf)->allocation.height - 1); if (wf->centerline) { gdk_draw_line(wf->pixmap, gc, x2, RULER_HEIGHT, x2, GTK_WIDGET(wf)->allocation.height - 1); } gdk_draw_line(wf->pixmap, gc, x3, RULER_HEIGHT, x3, GTK_WIDGET(wf)->allocation.height - 1); } struct tic { gboolean major; gdouble freq; gchar str[32]; gint strw; gint strh; gint strx; gint x; struct tic *next; }; static struct tic *build_tics(Waterfall *wf) { struct tic *list, *p; gdouble realfreq, f; gint i, freq, width; list = NULL; width = GTK_WIDGET(wf)->allocation.width; f = wf->startfreq; for (i = 0; i < width; i++) { if (wf->lsb) realfreq = f - wf->carrierfreq; else realfreq = f + wf->carrierfreq; realfreq = fabs(realfreq); freq = 100 * floor(realfreq / 100.0 + 0.5); if (freq < realfreq || freq >= realfreq + wf->resolution) { f += wf->resolution; continue; } p = g_new0(struct tic, 1); p->major = FALSE; p->freq = freq; p->x = i; if ((freq % 500) == 0) { GdkFont *font; gint hz, khz; khz = freq / 1000; hz = freq % 1000; if (khz > 9) sprintf(p->str, "%d.%03d", khz, hz); else sprintf(p->str, "%d", freq); font = gtk_style_get_font(GTK_WIDGET(wf)->style); p->strw = gdk_string_width(font, p->str); p->strh = gdk_string_height(font, p->str); p->strx = CLAMP(i - p->strw / 2, 0, width - p->strw); p->major = TRUE; } f += wf->resolution; p->next = list; list = p; } return list; } static void free_tics(struct tic *list) { while (list) { struct tic *p = list; list = list->next; g_free(p); } } static void draw_waterfall(Waterfall *wf) { GtkWidget *widget; struct tic *tics, *list; guchar *ptr; widget = GTK_WIDGET(wf); ptr = wf->pixptr + (gint) (wf->startfreq / wf->resolution); /* draw waterfall */ gdk_draw_indexed_image(wf->pixmap, widget->style->base_gc[widget->state], 0, RULER_HEIGHT, widget->allocation.width, widget->allocation.height - RULER_HEIGHT, GDK_RGB_DITHER_NORMAL, ptr, wf->fftlen / 2, wf->cmap); /* draw ruler */ gdk_draw_rectangle(wf->pixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, RULER_HEIGHT); list = build_tics(wf); tics = list; while (tics) { if (tics->major) { gdk_draw_line(wf->pixmap, wf->grid_gc, tics->x, RULER_HEIGHT - 9, tics->x, RULER_HEIGHT - 1); gdk_draw_string(wf->pixmap, gtk_style_get_font(widget->style), wf->grid_gc, tics->strx, tics->strh + 2, tics->str); } else { gdk_draw_line(wf->pixmap, wf->grid_gc, tics->x, RULER_HEIGHT - 5, tics->x, RULER_HEIGHT - 1); } tics = tics->next; } free_tics(list); /* draw markers */ draw_markers(wf); /* draw to screen */ gdk_draw_pixmap(widget->window, widget->style->base_gc[widget->state], wf->pixmap, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height); } static void draw_spectrum(Waterfall *wf, gboolean peak) { GtkWidget *widget; GdkSegment seg[6]; GdkPoint *pnt; gint i, h; struct tic *tics, *list; widget = GTK_WIDGET(wf); /* clear window */ gdk_draw_rectangle(wf->pixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); /* draw grid */ h = widget->allocation.height - RULER_HEIGHT - 1; for (i = 0; i < 6; i++) { seg[i].x1 = 0; seg[i].x2 = widget->allocation.width - 1; seg[i].y1 = RULER_HEIGHT + i * h / 5; seg[i].y2 = RULER_HEIGHT + i * h / 5; } gdk_draw_segments(wf->pixmap, wf->grid_gc, seg, 6); /* draw ruler */ list = build_tics(wf); tics = list; while (tics) { if (tics->major) { gdk_draw_line(wf->pixmap, wf->grid_gc, tics->x, RULER_HEIGHT - 9, tics->x, widget->allocation.height - 1); gdk_draw_string(wf->pixmap, gtk_style_get_font(widget->style), wf->grid_gc, tics->strx, tics->strh + 2, tics->str); } else { gdk_draw_line(wf->pixmap, wf->grid_gc, tics->x, RULER_HEIGHT - 5, tics->x, RULER_HEIGHT - 1); } tics = tics->next; } free_tics(list); /* draw trace */ pnt = g_new(GdkPoint, widget->allocation.width); h = 1 + RULER_HEIGHT - widget->allocation.height; for (i = 0; i < widget->allocation.width; i++) { gint f = i + (gint) (wf->startfreq / wf->resolution); if (peak) wf->peakbuf[i] = MAX(wf->peakbuf[f], wf->specbuf[f]); else wf->peakbuf[i] = wf->specbuf[f]; pnt[i].x = i; pnt[i].y = RULER_HEIGHT + h * wf->peakbuf[i]; } gdk_draw_lines(wf->pixmap, wf->trace_gc, pnt, widget->allocation.width); /* draw markers */ draw_markers(wf); /* draw to screen */ gdk_draw_pixmap(widget->window, widget->style->base_gc[widget->state], wf->pixmap, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height); g_free(pnt); } static void draw_scope(Waterfall *wf) { GtkWidget *widget; GdkPoint *pnt; GdkSegment *seg, *segp; gint w, h, i, nseg; widget = GTK_WIDGET(wf); w = widget->allocation.width; h = widget->allocation.height; pnt = g_new(GdkPoint, w); seg = g_new(GdkSegment, w / 8 + 2); /* calculate grid */ for (segp = seg, nseg = 0, i = 0; i < w; i += w / 8, segp++, nseg++) { segp->x1 = i; segp->x2 = i; segp->y1 = h / 2 - 5; segp->y2 = h / 2 + 5; } segp->x1 = 0; segp->x2 = w - 1; segp->y1 = h / 2; segp->y2 = h / 2; segp++; nseg++; segp->x1 = w / 2; segp->x2 = w / 2; segp->y1 = 0; segp->y2 = h - 1; segp++; nseg++; /* copy trace */ for (i = 0; i < w; i++) { pnt[i].x = i; pnt[i].y = wf->inbuf[i] * h / 2 + h / 2; } /* clear window */ gdk_draw_rectangle(wf->pixmap, widget->style->black_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); /* draw grid */ gdk_draw_segments(wf->pixmap, wf->grid_gc, seg, nseg); /* draw trace */ gdk_draw_lines(wf->pixmap, wf->trace_gc, pnt, w); /* draw to screen */ gdk_draw_pixmap(widget->window, widget->style->base_gc[widget->state], wf->pixmap, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height); g_free(pnt); g_free(seg); } static void draw(Waterfall *wf) { GtkWidget *widget; widget = GTK_WIDGET(wf); g_return_if_fail(wf->pixmap); g_return_if_fail(wf->pixbuf); g_return_if_fail(wf->pixptr); switch (wf->config.mode) { case WATERFALL_MODE_NORMAL: draw_waterfall(wf); break; case WATERFALL_MODE_SPECTRUM: draw_spectrum(wf, FALSE); break; case WATERFALL_MODE_SPECTRUM_PEAK: draw_spectrum(wf, TRUE); break; case WATERFALL_MODE_SCOPE: draw_scope(wf); break; default: g_warning(_("Unknown waterfall mode: %d\n"), wf->config.mode); break; } } /* ---------------------------------------------------------------------- */ static void set_idle_callback(Waterfall *wf) { g_mutex_lock(wf->mutex); if (!wf->idlefunc) wf->idlefunc = gtk_idle_add_priority(G_PRIORITY_LOW, idle_callback, wf); g_mutex_unlock(wf->mutex); } static gint idle_callback(gpointer data) { Waterfall *wf; g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(IS_WATERFALL(data), FALSE); wf = WATERFALL(data); gdk_threads_enter(); if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(data))) draw(wf); gdk_threads_leave(); g_mutex_lock(wf->mutex); wf->idlefunc = 0; g_mutex_unlock(wf->mutex); return FALSE; /* don't call this callback again */ } /* ---------------------------------------------------------------------- */ #define cabs(z) (sqrt(c_re(z) * c_re(z) + c_im(z) * c_im(z))) static void setdata(Waterfall *wf) { gint i, width, size; guchar *ptr; for (i = 0; i < wf->fftlen; i++) { c_re(wf->fft_ibuf[i]) = wf->inbuf[i] * wf->fft_window[i]; c_im(wf->fft_ibuf[i]) = 0.0; } fftw_one(wf->fft_plan, wf->fft_ibuf, wf->fft_obuf); width = wf->fftlen / 2; size = wf->pixbufsize / 2; if (wf->config.direction) { wf->pixptr += width; if (wf->pixptr > wf->pixbuf + size) { memcpy(wf->pixbuf, wf->pixbuf + size, size); wf->pixptr = wf->pixbuf; } ptr = wf->pixptr + size - width; } else { wf->pixptr -= width; if (wf->pixptr < wf->pixbuf) { memcpy(wf->pixbuf + size, wf->pixbuf, size); wf->pixptr = wf->pixbuf + size; } ptr = wf->pixptr; } for (i = 0; i < width; i++) { fftw_complex z; gdouble x; z = wf->fft_obuf[i]; x = 20 * log10(cabs(z) + 1e-10) - wf->config.reflevel; x = CLAMP((x / wf->config.ampspan), -1.0, 0.0); /* waterfall data */ *ptr++ = (guchar) (255.0 + 255.0 * x); /* spectrum data */ wf->specbuf[i] = x; } } void waterfall_set_data(Waterfall *wf, gfloat *data, int len) { GtkWidget *widget; gboolean flag; gint i; g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); if (wf->paused == TRUE) return; g_return_if_fail(wf->fft_plan); widget = GTK_WIDGET(wf); g_mutex_lock(wf->mutex); flag = FALSE; while (len-- > 0) { wf->inbuf[wf->inptr++] = *data++; if (wf->inptr >= wf->fftlen) { setdata(wf); for (i = 0; i < wf->inptr - wf->config.overlap; i++) wf->inbuf[i] = wf->inbuf[i + wf->config.overlap]; wf->inptr -= wf->config.overlap; flag = TRUE; } } g_mutex_unlock(wf->mutex); if (flag == TRUE) set_idle_callback(wf); } /* ---------------------------------------------------------------------- */ static inline double hamming(double x) { return 0.54 - 0.46 * cos(2.0 * M_PI * x); } static void setwindow(gdouble *window, gint len, wf_window_t type) { gdouble pwr = 0.0; gint i; switch (type) { case WATERFALL_WINDOW_RECT: for (i = 0; i < len; i++) window[i] = 1.0; break; case WATERFALL_WINDOW_TRIA: for (i = 0; i < len; i++) { if (i < len / 2) window[i] = 2.0 * i / len; else window[i] = 2.0 * (len - i) / len; } break; case WATERFALL_WINDOW_HAMM: for (i = 0; i < len; i++) window[i] = hamming(i / (len - 1.0)); break; default: g_warning(_("Invalid window function: %d\n"), type); return; } for (i = 0; i < len; i++) pwr += window[i] * window[i]; for (i = 0; i < len; i++) window[i] /= pwr; } void waterfall_set_window(Waterfall *wf, wf_window_t type) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); g_mutex_lock(wf->mutex); setwindow(wf->fft_window, wf->fftlen, type); g_mutex_unlock(wf->mutex); wf->config.window = type; } /* ---------------------------------------------------------------------- */ void calculate_frequencies(Waterfall *wf) { gdouble start, stop, span, res; gint width; width = GTK_WIDGET(wf)->allocation.width; res = wf->samplerate / wf->fftlen; span = res * width; start = wf->centerfreq - span / 2; if (start > (wf->frequency - wf->bw / 2)) start = wf->frequency - wf->bw / 2; if (start < 0) start = 0; stop = start + span; if (stop < (wf->frequency + wf->bw / 2)) stop = wf->frequency + wf->bw / 2; if (stop > wf->samplerate / 2) stop = wf->samplerate / 2; wf->centerfreq = stop - span / 2; wf->startfreq = stop - span; wf->stopfreq = stop; wf->resolution = res; } void waterfall_set_frequency(Waterfall *wf, gdouble f) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); f = MAX(f, wf->bw / 2.0); f = MIN(f, wf->samplerate / 2.0 - wf->bw / 2.0); wf->frequency = f; calculate_frequencies(wf); gtk_signal_emit(GTK_OBJECT(wf), waterfall_signals[FREQUENCY_SET_SIGNAL], wf->frequency); set_idle_callback(wf); } void waterfall_set_center_frequency(Waterfall *wf, gdouble f) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->centerfreq = f; calculate_frequencies(wf); set_idle_callback(wf); } void waterfall_set_carrier_frequency(Waterfall *wf, gdouble f) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->carrierfreq = f; set_idle_callback(wf); } /* ---------------------------------------------------------------------- */ void waterfall_set_samplerate(Waterfall *wf, gint samplerate) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); g_mutex_lock(wf->mutex); if (wf->samplerate != samplerate) { memset(wf->pixbuf, 0, wf->pixbufsize); wf->samplerate = samplerate; } g_mutex_unlock(wf->mutex); set_idle_callback(wf); } void waterfall_set_bandwidth(Waterfall *wf, gdouble bw) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); if (wf->bw != bw) { wf->bw = bw; set_idle_callback(wf); } } void waterfall_set_centerline(Waterfall *wf, gboolean flag) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->centerline = flag; set_idle_callback(wf); } void waterfall_set_magnification(Waterfall *wf, wf_mag_t mag) { gint i; g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); g_mutex_lock(wf->mutex); switch (mag) { case WATERFALL_MAG_1: if (wf->fftlen == WATERFALL_FFTLEN_1) { g_mutex_unlock(wf->mutex); return; } wf->fftlen = WATERFALL_FFTLEN_1; break; case WATERFALL_MAG_2: if (wf->fftlen == WATERFALL_FFTLEN_2) { g_mutex_unlock(wf->mutex); return; } wf->fftlen = WATERFALL_FFTLEN_2; break; case WATERFALL_MAG_4: if (wf->fftlen == WATERFALL_FFTLEN_4) { g_mutex_unlock(wf->mutex); return; } wf->fftlen = WATERFALL_FFTLEN_4; break; default: g_warning(_("Unsupported magnification: %d\n"), mag); g_mutex_unlock(wf->mutex); return; } wf->config.magnification = mag; alloc_pixbuf(wf, TRUE); if (wf->fft_plan) fftw_destroy_plan(wf->fft_plan); wf->fft_plan = fftw_create_plan(wf->fftlen, FFTW_FORWARD, FFTW_ESTIMATE | \ FFTW_OUT_OF_PLACE | \ FFTW_USE_WISDOM); setwindow(wf->fft_window, wf->fftlen, WATERFALL_WINDOW_TRIA); for (i = 0; i < WATERFALL_FFTLEN_MAX; i++) { c_re(wf->fft_ibuf[i]) = 0.0; c_im(wf->fft_ibuf[i]) = 0.0; c_re(wf->fft_obuf[i]) = 0.0; c_im(wf->fft_obuf[i]) = 0.0; wf->specbuf[i] = -1.0; wf->peakbuf[i] = -1.0; wf->inbuf[i] = 0.0; } wf->inptr = 0; calculate_frequencies(wf); g_mutex_unlock(wf->mutex); } void waterfall_set_speed(Waterfall *wf, wf_speed_t speed) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); switch (speed) { case WATERFALL_SPEED_HALF: wf->config.overlap = 2048; break; case WATERFALL_SPEED_NORMAL: wf->config.overlap = 1024; break; case WATERFALL_SPEED_DOUBLE: wf->config.overlap = 512; break; } } void waterfall_set_mode(Waterfall *wf, wf_mode_t mode) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->config.mode = mode; set_idle_callback(wf); } void waterfall_set_ampspan(Waterfall *wf, gdouble ampspan) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->config.ampspan = ampspan; set_idle_callback(wf); } void waterfall_set_reflevel(Waterfall *wf, gdouble reflevel) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->config.reflevel = reflevel; set_idle_callback(wf); } void waterfall_set_dir(Waterfall *wf, gboolean dir) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->config.direction = dir; } void waterfall_set_pause(Waterfall *wf, gboolean flag) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->paused = flag; } void waterfall_set_fixed(Waterfall *wf, gboolean flag) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->fixed = flag; } void waterfall_set_lsb(Waterfall *wf, gboolean flag) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); wf->lsb = flag; set_idle_callback(wf); } /* ---------------------------------------------------------------------- */ void waterfall_get_config(Waterfall *wf, wf_config_t *config) { g_return_if_fail(wf != NULL); g_return_if_fail(IS_WATERFALL(wf)); g_return_if_fail(config != NULL); *config = wf->config; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/waterfall.h0000644000076400007640000001140110037772763011702 /* * Waterfall Spectrum Analyzer Widget * Copyright (C) 2001 Tomi Manninen * * Based on the Spectrum Widget by Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __WATERFALL_H__ #define __WATERFALL_H__ #ifdef HAVE_CONFIG_H # include #endif #include #include #ifdef HAVE_DFFTW_H # include #endif #ifdef HAVE_FFTW_H # include #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define WATERFALL(obj) GTK_CHECK_CAST(obj, waterfall_get_type(), Waterfall) #define WATERFALL_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, waterfall_get_type(), WaterfallClass) #define IS_WATERFALL(obj) GTK_CHECK_TYPE(obj, waterfall_get_type()) typedef struct _Waterfall Waterfall; typedef struct _WaterfallClass WaterfallClass; typedef enum { WATERFALL_WINDOW_RECT, WATERFALL_WINDOW_TRIA, WATERFALL_WINDOW_HAMM } wf_window_t; typedef enum { WATERFALL_MODE_NORMAL, WATERFALL_MODE_SPECTRUM, WATERFALL_MODE_SCOPE, WATERFALL_MODE_SPECTRUM_PEAK } wf_mode_t; typedef enum { WATERFALL_MAG_1, WATERFALL_MAG_2, WATERFALL_MAG_4 } wf_mag_t; typedef enum { WATERFALL_SPEED_HALF, WATERFALL_SPEED_NORMAL, WATERFALL_SPEED_DOUBLE } wf_speed_t; typedef struct { wf_mag_t magnification; wf_window_t window; wf_mode_t mode; wf_speed_t overlap; gdouble ampspan; gdouble reflevel; gboolean direction; } wf_config_t; #define WATERFALL_FFTLEN_1 2048 #define WATERFALL_FFTLEN_2 (WATERFALL_FFTLEN_1 * 2) #define WATERFALL_FFTLEN_4 (WATERFALL_FFTLEN_1 * 4) #define WATERFALL_FFTLEN_MAX WATERFALL_FFTLEN_4 /* * These are only defaults now. */ #define WATERFALL_DEFAULT_WIDTH 512 #define WATERFALL_DEFAULT_HEIGHT 96 struct _Waterfall { GtkWidget widget; GMutex *mutex; gboolean running; gboolean paused; guint idlefunc; GdkGC *pointer1_gc; GdkColor pointer1col; GdkGC *pointer2_gc; GdkColor pointer2col; GdkGC *pointer3_gc; GdkColor pointer3col; GdkGC *grid_gc; GdkColor gridcol; GdkGC *trace_gc; GdkColor tracecol; GdkRgbCmap *cmap; GdkPixmap *pixmap; gboolean fixed; /* markers */ gint pointer; gint width; gboolean centerline; gdouble samplerate; gdouble frequency; gdouble carrierfreq; gdouble bw; gdouble centerfreq; gdouble startfreq; gdouble stopfreq; gdouble resolution; gboolean lsb; gint pixbufsize; guchar *pixbuf; guchar *pixptr; gdouble *inbuf; gint inptr; gint fftlen; gdouble *fft_window; fftw_complex *fft_ibuf; fftw_complex *fft_obuf; fftw_plan fft_plan; gdouble *specbuf; gdouble *peakbuf; GdkCursor *ruler_cursor; gboolean ruler_cursor_set; gboolean ruler_drag; gdouble ruler_ref_f; gint ruler_ref_x; wf_config_t config; }; struct _WaterfallClass { GtkWidgetClass parent_class; void (* frequency_set) (Waterfall *wf, gint i, gdouble f); }; GType waterfall_get_type(void); GtkWidget *waterfall_new(const char *name, void *dummy0, void *dummy1, unsigned int dummy2, unsigned int dummy3); void waterfall_set_data(Waterfall *wf, gfloat *data, int len); void waterfall_set_window(Waterfall *wf, wf_window_t type); void waterfall_set_frequency(Waterfall *wf, gdouble f); void waterfall_set_center_frequency(Waterfall *wf, gdouble f); void waterfall_set_carrier_frequency(Waterfall *wf, gdouble f); void waterfall_set_samplerate(Waterfall *wf, gint samplerate); void waterfall_set_bandwidth(Waterfall *wf, gdouble bw); void waterfall_set_centerline(Waterfall *wf, gboolean flag); void waterfall_set_magnification(Waterfall *wf, wf_mag_t mag); void waterfall_set_speed(Waterfall *wf, wf_speed_t speed); void waterfall_set_mode(Waterfall *wf, wf_mode_t mode); void waterfall_set_pause(Waterfall *wf, gboolean flag); void waterfall_set_ampspan(Waterfall *wf, gdouble ampspan); void waterfall_set_reflevel(Waterfall *wf, gdouble reflevel); void waterfall_set_dir(Waterfall *wf, gboolean dir); void waterfall_set_fixed(Waterfall *wf, gboolean fixed); void waterfall_set_lsb(Waterfall *wf, gboolean lsb); void waterfall_get_config(Waterfall *wf, wf_config_t *config); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __WATERFALL_H__ */ gmfsk-0.7pre1/src/miniscope.c0000644000076400007640000003110310165600360011664 /* * Miniature Oscilloscope/Phasescope Widget * Copyright (C) 2001,2002,2003 Tomi Manninen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #include #include #define _(String) gettext (String) #define gettext_noop(String) String #define N_(String) gettext_noop (String) #include "miniscope.h" static void miniscope_class_init(MiniscopeClass *klass); static void miniscope_init(Miniscope *m); static void miniscope_destroy(GtkObject *object); static gint miniscope_expose(GtkWidget *widget, GdkEventExpose *event); static void miniscope_realize(GtkWidget *widget); static void miniscope_unrealize(GtkWidget *widget); static void miniscope_size_allocate(GtkWidget *widget, GtkAllocation *allocation); static void set_idle_callback(Miniscope *m); static gint idle_callback(gpointer data); /* ---------------------------------------------------------------------- */ static GtkWidgetClass *parent_class = NULL; static MiniscopeClass *miniscope_class = NULL; /* ---------------------------------------------------------------------- */ GType miniscope_get_type(void) { static GType miniscope_type = 0; if (!miniscope_type) { static const GTypeInfo miniscope_info = { sizeof(MiniscopeClass), NULL, NULL, (GClassInitFunc) miniscope_class_init, NULL, NULL, sizeof(Miniscope), 0, (GInstanceInitFunc) miniscope_init }; miniscope_type = g_type_register_static(GTK_TYPE_WIDGET, "Miniscope", &miniscope_info, 0); } return miniscope_type; } static void miniscope_class_init(MiniscopeClass *class) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; parent_class = gtk_type_class(gtk_widget_get_type()); miniscope_class = class; gdk_rgb_init(); // gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); // gtk_widget_set_default_visual(gdk_rgb_get_visual()); object_class->destroy = miniscope_destroy; widget_class->expose_event = miniscope_expose; widget_class->realize = miniscope_realize; widget_class->unrealize = miniscope_unrealize; widget_class->size_allocate = miniscope_size_allocate; } static void miniscope_init(Miniscope *m) { GtkWidget *widget = GTK_WIDGET(m); widget->requisition.width = MINISCOPE_DEFAULT_WIDTH; widget->requisition.height = MINISCOPE_DEFAULT_HEIGHT; m->mutex = g_mutex_new(); m->idlefunc = 0; m->mode = MINISCOPE_MODE_SCOPE; /* initialize the colors */ m->redcol.red = 0xFFFF; m->redcol.green = 0; m->redcol.blue = 0; m->red_gc = NULL; m->greencol.red = 0; m->greencol.green = 0xFFFF; m->greencol.blue = 0; m->green_gc = NULL; m->yellowcol.red = 0xFFFF; m->yellowcol.green = 0xFFFF; m->yellowcol.blue = 0; m->yellow_gc = NULL; m->pixmap = NULL; m->len = 0; m->phase = 0; m->highlight = FALSE; } static void miniscope_realize(GtkWidget *widget) { Miniscope *m; GdkWindowAttr attributes; gint attributes_mask; GdkGCValues gc_values; g_return_if_fail(widget != NULL); g_return_if_fail(IS_MINISCOPE(widget)); m = MINISCOPE(widget); GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.colormap = gtk_widget_get_colormap(widget); attributes.event_mask = \ gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK; attributes_mask = \ GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gdk_window_set_user_data(widget->window, m); widget->style = gtk_style_attach(widget->style, widget->window); gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL); /* allocate red color GC */ if (!gdk_color_alloc(widget->style->colormap, &m->redcol)) g_warning(_("unable to allocate color: ( %d %d %d )"), m->redcol.red, m->redcol.green, m->redcol.blue); gc_values.foreground = m->redcol; m->red_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); /* allocate green color GC */ if (!gdk_color_alloc(widget->style->colormap, &m->greencol)) g_warning(_("unable to allocate color: ( %d %d %d )"), m->greencol.red, m->greencol.green, m->greencol.blue); gc_values.foreground = m->greencol; m->green_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); /* allocate yellow color GC */ if (!gdk_color_alloc(widget->style->colormap, &m->yellowcol)) g_warning(_("unable to allocate color: ( %d %d %d )"), m->yellowcol.red, m->yellowcol.green, m->yellowcol.blue); gc_values.foreground = m->yellowcol; m->yellow_gc = gtk_gc_get(widget->style->depth, widget->style->colormap, &gc_values, GDK_GC_FOREGROUND); /* allocate pixmap */ m->pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); } static void miniscope_unrealize(GtkWidget *widget) { Miniscope *m; g_return_if_fail(widget != NULL); g_return_if_fail(IS_MINISCOPE(widget)); m = MINISCOPE(widget); m->len = 0; if (m->idlefunc) gtk_idle_remove(m->idlefunc); m->idlefunc = 0; if (m->red_gc) gtk_gc_release(m->red_gc); m->red_gc = NULL; if (m->green_gc) gtk_gc_release(m->green_gc); m->green_gc = NULL; if (m->yellow_gc) gtk_gc_release(m->yellow_gc); m->yellow_gc = NULL; if (m->pixmap) gdk_pixmap_unref(m->pixmap); m->pixmap = NULL; if (GTK_WIDGET_CLASS(parent_class)->unrealize) (*GTK_WIDGET_CLASS(parent_class)->unrealize)(widget); } static void miniscope_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { g_return_if_fail(widget != NULL); g_return_if_fail(IS_MINISCOPE(widget)); g_return_if_fail(allocation != NULL); widget->allocation = *allocation; widget->allocation.width = MIN(allocation->width, MINISCOPE_MAX_LEN); if (GTK_WIDGET_REALIZED(widget)) { Miniscope *m = MINISCOPE(widget); if (m->pixmap) gdk_pixmap_unref(m->pixmap); m->pixmap = gdk_pixmap_new(widget->window, allocation->width, allocation->height, -1); gdk_window_move_resize(widget->window, allocation->x, allocation->y, allocation->width, allocation->height); } } /* ---------------------------------------------------------------------- */ GtkWidget *miniscope_new(const char *name, void *dummy0, void *dummy1, unsigned int dummy2, unsigned int dummy3) { return GTK_WIDGET(g_object_new(miniscope_get_type(), NULL)); } static void miniscope_destroy(GtkObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(IS_MINISCOPE(object)); if (GTK_OBJECT_CLASS(parent_class)->destroy) (*GTK_OBJECT_CLASS(parent_class)->destroy) (object); } static gint miniscope_expose(GtkWidget *widget, GdkEventExpose *event) { g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_MINISCOPE(widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); set_idle_callback(MINISCOPE(widget)); return FALSE; } /* ---------------------------------------------------------------------- */ static void draw_scope(Miniscope *m) { GtkWidget *widget; gint w, h, npts, i; widget = GTK_WIDGET(m); w = widget->allocation.width; h = widget->allocation.height; gdk_draw_rectangle(m->pixmap, widget->style->black_gc, TRUE, 0, 0, w, h); npts = MIN(w, m->len); if (npts == 1) { GdkPoint pts[2]; pts[0].x = 0; pts[0].y = (1.0 - m->buf[0]) * (h - 1); pts[1].x = w; pts[1].y = (1.0 - m->buf[0]) * (h - 1); if (m->highlight) gdk_draw_lines(m->pixmap, m->yellow_gc, pts, 2); else gdk_draw_lines(m->pixmap, m->green_gc, pts, 2); } if (npts > 1) { GdkPoint *pts; /* g_malloc can't fail */ pts = g_malloc(npts * sizeof(GdkPoint)); for (i = 0; i < npts; i++) { pts[i].x = i * w / (npts - 1); pts[i].y = (1.0 - m->buf[i * m->len / npts]) * (h - 1); } if (m->highlight) gdk_draw_lines(m->pixmap, m->yellow_gc, pts, npts); else gdk_draw_lines(m->pixmap, m->green_gc, pts, npts); g_free(pts); } gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], m->pixmap, 0, 0, 0, 0, w, h); } static void draw_phase(Miniscope *m) { GtkWidget *widget; GdkSegment seg; gint x, y, w, h, d; widget = GTK_WIDGET(m); w = widget->allocation.width; h = widget->allocation.height; gdk_draw_rectangle(m->pixmap, widget->style->black_gc, TRUE, 0, 0, w, h); d = 0.9 * MIN(w, h); x = w / 2 - d / 2; y = h / 2 - d / 2; gdk_draw_arc(m->pixmap, m->green_gc, FALSE, x, y, d, d, 0, 360 * 64); seg.x1 = w / 2; seg.y1 = h / 2; seg.x2 = seg.x1 + 0.4 * d * cos(m->phase - M_PI_2); seg.y2 = seg.y1 + 0.4 * d * sin(m->phase - M_PI_2); if (m->highlight) gdk_draw_segments(m->pixmap, m->yellow_gc, &seg, 1); else gdk_draw_segments(m->pixmap, m->green_gc, &seg, 1); gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE(widget)], m->pixmap, 0, 0, 0, 0, w, h); } static void draw_blank(Miniscope *m) { GtkWidget *widget; gint w, h; widget = GTK_WIDGET(m); w = widget->allocation.width; h = widget->allocation.height; gdk_draw_rectangle(widget->window, widget->style->black_gc, TRUE, 0, 0, w, h); } static void draw(Miniscope *m) { g_return_if_fail(m->pixmap); switch (m->mode) { case MINISCOPE_MODE_SCOPE: draw_scope(m); break; case MINISCOPE_MODE_PHASE: draw_phase(m); break; case MINISCOPE_MODE_BLANK: draw_blank(m); break; default: g_warning(_("miniscope: invalid mode %d\n"), m->mode); break; } } /* ---------------------------------------------------------------------- */ static void set_idle_callback(Miniscope *m) { g_mutex_lock(m->mutex); if (!m->idlefunc) m->idlefunc = gtk_idle_add_priority(G_PRIORITY_LOW, idle_callback, m); g_mutex_unlock(m->mutex); } static gint idle_callback(gpointer data) { Miniscope *m; g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(IS_MINISCOPE(data), FALSE); m = MINISCOPE(data); g_mutex_lock(m->mutex); m->idlefunc = 0; g_mutex_unlock(m->mutex); gdk_threads_enter(); if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(m))) draw(m); gdk_threads_leave(); return FALSE; /* don't call this callback again */ } /* ---------------------------------------------------------------------- */ void miniscope_set_data(Miniscope *m, gfloat *data, int len, gboolean scale) { gint i; g_return_if_fail(m != NULL); g_return_if_fail(IS_MINISCOPE(m)); if (data == NULL || len == 0) return; g_mutex_lock(m->mutex); m->len = MIN(len, MINISCOPE_MAX_LEN); memcpy(m->buf, data, m->len * sizeof(gfloat)); if (scale) { gfloat max = 1E-6; gfloat min = 1E6; for (i = 0; i < m->len; i++) { max = MAX(max, m->buf[i]); min = MIN(min, m->buf[i]); } for (i = 0; i < m->len; i++) m->buf[i] = (m->buf[i] - min) / (max - min); } else { for (i = 0; i < m->len; i++) m->buf[i] = CLAMP(m->buf[i], 0.0, 1.0); } g_mutex_unlock(m->mutex); set_idle_callback(m); } void miniscope_set_phase(Miniscope *m, gfloat phase, gboolean highlight) { g_return_if_fail(m != NULL); g_return_if_fail(IS_MINISCOPE(m)); m->phase = phase; m->highlight = highlight; set_idle_callback(m); } void miniscope_set_highlight(Miniscope *m, gboolean highlight) { g_return_if_fail(m != NULL); g_return_if_fail(IS_MINISCOPE(m)); m->highlight = highlight; set_idle_callback(m); } void miniscope_set_mode(Miniscope *m, miniscope_mode_t mode) { g_return_if_fail(m != NULL); g_return_if_fail(IS_MINISCOPE(m)); m->mode = mode; set_idle_callback(m); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/miniscope.h0000644000076400007640000000474410107505564011712 /* * Miniature Oscilloscope Widget * Copyright (C) 2001 Tomi Manninen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __MINISCOPE_H__ #define __MINISCOPE_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define MINISCOPE(obj) GTK_CHECK_CAST(obj, miniscope_get_type(), Miniscope) #define MINISCOPE_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, miniscope_get_type(), MiniscopeClass) #define IS_MINISCOPE(obj) GTK_CHECK_TYPE(obj, miniscope_get_type()) typedef struct _Miniscope Miniscope; typedef struct _MiniscopeClass MiniscopeClass; /* * These are only defaults now. */ #define MINISCOPE_DEFAULT_WIDTH 64 #define MINISCOPE_DEFAULT_HEIGHT 64 #define MINISCOPE_MAX_LEN 2048 typedef enum { MINISCOPE_MODE_SCOPE, MINISCOPE_MODE_PHASE, MINISCOPE_MODE_BLANK } miniscope_mode_t; struct _Miniscope { GtkWidget widget; GMutex *mutex; guint idlefunc; miniscope_mode_t mode; GdkGC *red_gc; GdkColor redcol; GdkGC *green_gc; GdkColor greencol; GdkGC *yellow_gc; GdkColor yellowcol; GdkPixmap *pixmap; gfloat buf[MINISCOPE_MAX_LEN]; gint len; gfloat phase; gboolean highlight; }; struct _MiniscopeClass { GtkWidgetClass parent_class; void (* sync_set) (Miniscope *m, gint i, gfloat f); }; GType miniscope_get_type(void); GtkWidget *miniscope_new(const char *name, void *dummy0, void *dummy1, unsigned int dummy2, unsigned int dummy3); void miniscope_set_data(Miniscope *m, gfloat *data, int len, gboolean scale); void miniscope_set_phase(Miniscope *m, gfloat phase, gboolean highlight); void miniscope_set_mode(Miniscope *m, miniscope_mode_t mode); void miniscope_set_highlight(Miniscope *m, gboolean highlight); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __MINISCOPE_H__ */ gmfsk-0.7pre1/src/papertape.c0000644000076400007640000002636507705641144011710 /* * Papertape Widget * Copyright (C) 2002,2003 Tomi Manninen * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "papertape.h" #include #include #include #include #include #define PRIO G_PRIORITY_LOW static void papertape_class_init(PapertapeClass *klass); static void papertape_init(Papertape *tape); static void papertape_destroy(GtkObject *object); static gint papertape_expose(GtkWidget *widget, GdkEventExpose *event); static void papertape_realize(GtkWidget *widget); static void papertape_unrealize(GtkWidget *widget); static void papertape_size_allocate(GtkWidget *widget, GtkAllocation *allocation); static void papertape_send_configure (Papertape *tape); static void set_idle_callback(Papertape *tape); static gint idle_callback(gpointer data); static GtkWidgetClass *parent_class = NULL; static PapertapeClass *papertape_class = NULL; GType papertape_get_type(void) { static GType papertape_type = 0; if (!papertape_type) { static const GTypeInfo papertape_info = { sizeof(PapertapeClass), NULL, NULL, (GClassInitFunc) papertape_class_init, NULL, NULL, sizeof(Papertape), 0, (GInstanceInitFunc) papertape_init }; papertape_type = g_type_register_static(GTK_TYPE_WIDGET, "Papertape", &papertape_info, 0); } return papertape_type; } static void papertape_class_init(PapertapeClass *class) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; parent_class = gtk_type_class(gtk_widget_get_type()); papertape_class = class; gdk_rgb_init(); // gtk_widget_set_default_colormap(gdk_rgb_get_cmap()); // gtk_widget_set_default_visual(gdk_rgb_get_visual()); object_class->destroy = papertape_destroy; widget_class->expose_event = papertape_expose; widget_class->realize = papertape_realize; widget_class->unrealize = papertape_unrealize; widget_class->size_allocate = papertape_size_allocate; } static void papertape_init(Papertape *tape) { GtkWidget *widget = GTK_WIDGET(tape); widget->requisition.width = PAPERTAPE_WIDTH; widget->requisition.height = PAPERTAPE_HEIGHT; tape->mutex = g_mutex_new(); tape->idlefunc = 0; tape->pixmap = NULL; tape->pixbuf = NULL; tape->pixptr = 0; } static void papertape_realize(GtkWidget *widget) { Papertape *tape; GdkWindowAttr attributes; gint attributes_mask; gint size; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PAPERTAPE(widget)); tape = PAPERTAPE(widget); GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED); attributes.window_type = GDK_WINDOW_CHILD; attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.visual = gtk_widget_get_visual(widget); attributes.colormap = gtk_widget_get_colormap(widget); attributes.event_mask = \ gtk_widget_get_events(widget) | GDK_EXPOSURE_MASK; attributes_mask = \ GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gdk_window_set_user_data(widget->window, tape); widget->style = gtk_style_attach(widget->style, widget->window); gtk_style_set_background(widget->style, widget->window, GTK_STATE_NORMAL); /* create backing store */ tape->pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); size = widget->allocation.width * widget->allocation.height; tape->pixbuf = g_malloc(size * sizeof(guchar)); memset(tape->pixbuf, 255, size * sizeof(guchar)); memset(tape->save, 255, sizeof(tape->save)); papertape_send_configure(PAPERTAPE(widget)); } static void papertape_unrealize(GtkWidget *widget) { Papertape *tape; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PAPERTAPE(widget)); tape = PAPERTAPE(widget); if (tape->idlefunc) gtk_idle_remove(tape->idlefunc); tape->idlefunc = 0; if (tape->pixmap) gdk_pixmap_unref(tape->pixmap); tape->pixmap = NULL; g_free(tape->pixbuf); tape->pixbuf = NULL; if (tape->mutex) g_mutex_free(tape->mutex); tape->mutex = NULL; if (GTK_WIDGET_CLASS(parent_class)->unrealize) (*GTK_WIDGET_CLASS(parent_class)->unrealize)(widget); } static void papertape_size_allocate(GtkWidget *widget, GtkAllocation *allocation) { Papertape *tape; gint neww, newh, oldw, oldh, w, h, x, y; guchar *newbuf, *oldbuf; g_return_if_fail(widget != NULL); g_return_if_fail(IS_PAPERTAPE(widget)); g_return_if_fail(allocation != NULL); tape = PAPERTAPE(widget); g_mutex_lock(tape->mutex); oldw = widget->allocation.width; oldh = widget->allocation.height; neww = 2 * (allocation->width / 2); newh = PAPERTAPE_HEIGHT; // g_print("old w=%d h=%d, new w=%d h=%d\n", oldw, oldh, neww, newh); widget->allocation = *allocation; widget->allocation.width = neww; widget->allocation.height = newh; if (!tape->pixbuf) tape->pixbuf = g_malloc(neww * newh * sizeof(guchar)); if (neww != oldw || newh != oldh) { newbuf = g_malloc(neww * newh * sizeof(guchar)); oldbuf = tape->pixbuf; memset(newbuf, 255, neww * newh * sizeof(guchar)); w = MIN(oldw, neww); h = MIN(oldh, newh); for (y = 0; y < h; y++) for (x = 0; x < w; x++) newbuf[y * neww + x] = oldbuf[y * oldw + x]; g_free(oldbuf); tape->pixbuf = newbuf; } if (GTK_WIDGET_REALIZED(widget)) { if (tape->pixmap) gdk_pixmap_unref(tape->pixmap); tape->pixmap = gdk_pixmap_new(widget->window, neww, newh, -1); gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); papertape_send_configure(PAPERTAPE(widget)); } g_mutex_unlock(tape->mutex); } static void papertape_send_configure(Papertape *tape) { GtkWidget *widget; GdkEventConfigure event; widget = GTK_WIDGET(tape); event.type = GDK_CONFIGURE; event.window = widget->window; event.send_event = TRUE; event.x = widget->allocation.x; event.y = widget->allocation.y; event.width = widget->allocation.width; event.height = widget->allocation.height; gtk_widget_event(widget, (GdkEvent*)&event); } /* ---------------------------------------------------------------------- */ GtkWidget *papertape_new(const char *name, void *dummy0, void *dummy1, unsigned int dummy2, unsigned int dummy3) { return GTK_WIDGET(gtk_type_new(papertape_get_type())); } static void papertape_destroy(GtkObject *object) { g_return_if_fail(object != NULL); g_return_if_fail(IS_PAPERTAPE(object)); if (GTK_OBJECT_CLASS(parent_class)->destroy) (*GTK_OBJECT_CLASS(parent_class)->destroy) (object); } static gint papertape_expose(GtkWidget *widget, GdkEventExpose *event) { g_return_val_if_fail(widget != NULL, FALSE); g_return_val_if_fail(IS_PAPERTAPE(widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); set_idle_callback(PAPERTAPE(widget)); return FALSE; } /* ---------------------------------------------------------------------- */ static void draw(Papertape *tape) { GtkWidget *widget; widget = GTK_WIDGET(tape); g_return_if_fail(GTK_WIDGET_DRAWABLE(widget)); g_return_if_fail(tape->pixmap); /* draw the papertape */ gdk_draw_gray_image(tape->pixmap, widget->style->base_gc[widget->state], 0, 0, widget->allocation.width, widget->allocation.height, GDK_RGB_DITHER_NORMAL, tape->pixbuf, widget->allocation.width); /* draw to screen */ gdk_draw_pixmap(widget->window, widget->style->base_gc[widget->state], tape->pixmap, 0, 0, 0, 0, widget->allocation.width, widget->allocation.height); } /* ---------------------------------------------------------------------- */ static void set_idle_callback(Papertape *tape) { g_mutex_lock(tape->mutex); if (!tape->idlefunc) tape->idlefunc = gtk_idle_add_priority(G_PRIORITY_LOW, idle_callback, tape); g_mutex_unlock(tape->mutex); } static gint idle_callback(gpointer data) { Papertape *tape; g_return_val_if_fail(data != NULL, FALSE); g_return_val_if_fail(IS_PAPERTAPE(data), FALSE); tape = PAPERTAPE(data); gdk_threads_enter(); if (GTK_WIDGET_DRAWABLE(GTK_WIDGET(data))) draw(tape); gdk_threads_leave(); g_mutex_lock(tape->mutex); PAPERTAPE(data)->idlefunc = 0; g_mutex_unlock(tape->mutex); return FALSE; /* don't call this callback again */ } /* ---------------------------------------------------------------------- */ gint papertape_set_data(Papertape *tape, guchar *data, guint len) { GtkWidget *widget; gint i, n, pos, width, height, size; g_return_val_if_fail(tape != NULL, -1); g_return_val_if_fail(IS_PAPERTAPE(tape), -1); g_mutex_lock(tape->mutex); widget = GTK_WIDGET(tape); width = widget->allocation.width; height = widget->allocation.height; size = width * height; n = MIN(len, height / 2); pos = (tape->pixptr % width) + (size - width); for (i = 0; i < height / 2; i++) { tape->pixbuf[pos] = tape->save[i]; tape->pixbuf[pos + 1] = tape->save[i]; pos = (pos - width) % size; } for (i = 0; i < height / 2; i++) { if (i < n) { tape->pixbuf[pos] = data[i]; tape->pixbuf[pos + 1] = data[i]; } else { tape->pixbuf[pos] = 0; tape->pixbuf[pos + 1] = 0; } pos = (pos - width) % size; } for (i = 0; i < height / 2; i++) { if (i < n) tape->save[i] = data[i]; else tape->save[i] = 0; } tape->pixptr = (tape->pixptr + 2) % width; g_mutex_unlock(tape->mutex); set_idle_callback(tape); return tape->pixptr; } void papertape_clear(Papertape *tape) { GtkWidget *widget; gint size; g_return_if_fail(tape != NULL); g_return_if_fail(IS_PAPERTAPE(tape)); widget = GTK_WIDGET(tape); size = widget->allocation.width * widget->allocation.height; memset(tape->pixbuf, 255, size * sizeof(guchar)); tape->pixptr = 0; set_idle_callback(tape); } void papertape_copy_data(Papertape *dst, Papertape *src) { GtkWidget *srcwidget, *dstwidget; gint srcsize, dstsize; g_return_if_fail(dst != NULL); g_return_if_fail(src != NULL); g_return_if_fail(IS_PAPERTAPE(dst)); g_return_if_fail(IS_PAPERTAPE(src)); g_return_if_fail(dst->pixbuf != NULL); g_return_if_fail(src->pixbuf != NULL); dstwidget = GTK_WIDGET(dst); srcwidget = GTK_WIDGET(src); srcsize = srcwidget->allocation.width * srcwidget->allocation.height; dstsize = dstwidget->allocation.width * dstwidget->allocation.height; g_return_if_fail(dstsize == srcsize); memcpy(dst->pixbuf, src->pixbuf, dstsize * sizeof(guchar)); set_idle_callback(dst); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/papertape.h0000644000076400007640000000410707660535117011705 /* * Papertape Widget * Copyright (C) 2002 Tomi Manninen * * Based on the Spectrum Widget by Thomas Sailer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __PAPERTAPE_H__ #define __PAPERTAPE_H__ #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define PAPERTAPE(obj) GTK_CHECK_CAST(obj, papertape_get_type(), Papertape) #define PAPERTAPE_CLASS(klass) GTK_CHECK_CLASS_CAST(klass, papertape_get_type(), PapertapeClass) #define IS_PAPERTAPE(obj) GTK_CHECK_TYPE(obj, papertape_get_type()) typedef struct _Papertape Papertape; typedef struct _PapertapeClass PapertapeClass; #define PAPERTAPE_WIDTH 512 /* must be even */ #define PAPERTAPE_HEIGHT 60 struct _Papertape { GtkWidget widget; GMutex *mutex; guint idlefunc; GdkPixmap *pixmap; guchar *pixbuf; gint pixptr; guchar save[PAPERTAPE_HEIGHT / 2]; }; struct _PapertapeClass { GtkWidgetClass parent_class; }; GType papertape_get_type(void); GtkWidget *papertape_new(const char *name, void *dummy0, void *dummy1, unsigned int dummy2, unsigned int dummy3); extern gint papertape_set_data(Papertape *tape, guchar *data, guint len); extern void papertape_clear(Papertape *tape); extern void papertape_copy_data(Papertape *dst, Papertape *src); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __PAPERTAPE_H__ */ gmfsk-0.7pre1/src/gtkdial.c0000644000076400007640000004212210107501052011312 /* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * Modified for use in gMFSK by Tomi Manninen * (some code borrowed from the old GnomeUI version) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include "gtkdial.h" #define SCROLL_DELAY_LENGTH 300 #define DIAL_DEFAULT_SIZE 100 /* Forward declarations */ static void gtk_dial_class_init (GtkDialClass *klass); static void gtk_dial_init (GtkDial *dial); static void gtk_dial_destroy (GtkObject *object); static void gtk_dial_realize (GtkWidget *widget); static void gtk_dial_size_request (GtkWidget *widget, GtkRequisition *requisition); static void gtk_dial_size_allocate (GtkWidget *widget, GtkAllocation *allocation); static gint gtk_dial_expose (GtkWidget *widget, GdkEventExpose *event); static gint gtk_dial_button_press (GtkWidget *widget, GdkEventButton *event); static gint gtk_dial_button_release (GtkWidget *widget, GdkEventButton *event); static gint gtk_dial_motion_notify (GtkWidget *widget, GdkEventMotion *event); static gint gtk_dial_timer (GtkDial *dial); static void gtk_dial_update_mouse (GtkDial *dial, gint x, gint y); static void gtk_dial_update (GtkDial *dial); static void gtk_dial_adjustment_changed (GtkAdjustment *adjustment, gpointer data); static void gtk_dial_adjustment_value_changed (GtkAdjustment *adjustment, gpointer data); /* Local data */ static GtkWidgetClass *parent_class = NULL; GType gtk_dial_get_type () { static GType dial_type = 0; if (!dial_type) { static const GTypeInfo dial_info = { sizeof (GtkDialClass), NULL, NULL, (GClassInitFunc) gtk_dial_class_init, NULL, NULL, sizeof (GtkDial), 0, (GInstanceInitFunc) gtk_dial_init, }; dial_type = g_type_register_static (GTK_TYPE_WIDGET, "GtkDial", &dial_info, 0); } return dial_type; } static void gtk_dial_class_init (GtkDialClass *class) { GtkObjectClass *object_class; GtkWidgetClass *widget_class; object_class = (GtkObjectClass*) class; widget_class = (GtkWidgetClass*) class; parent_class = gtk_type_class (gtk_widget_get_type ()); object_class->destroy = gtk_dial_destroy; widget_class->realize = gtk_dial_realize; widget_class->expose_event = gtk_dial_expose; widget_class->size_request = gtk_dial_size_request; widget_class->size_allocate = gtk_dial_size_allocate; widget_class->button_press_event = gtk_dial_button_press; widget_class->button_release_event = gtk_dial_button_release; widget_class->motion_notify_event = gtk_dial_motion_notify; } static void gtk_dial_init (GtkDial *dial) { dial->button = 0; dial->policy = GTK_UPDATE_CONTINUOUS; dial->view_only = TRUE; dial->timer = 0; dial->radius = 0; dial->pointer_width = 0; dial->angle = 0.0; dial->last_angle = 0.0; dial->old_value = 0.0; dial->old_lower = 0.0; dial->old_upper = 0.0; dial->adjustment = NULL; dial->unit = NULL; } GtkWidget* gtk_dial_new (const char *name, void *dummy0, void *dummy1, unsigned int lower, unsigned int upper) { GtkDial *dial; GtkAdjustment *adj; dial = g_object_new (gtk_dial_get_type (), NULL); adj = (GtkAdjustment*) gtk_adjustment_new (0.0, lower, upper, 0.0, 0.0, 0.0); gtk_dial_set_adjustment (dial, adj); return GTK_WIDGET (dial); } static void gtk_dial_destroy (GtkObject *object) { GtkDial *dial; g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_DIAL (object)); dial = GTK_DIAL (object); if (dial->adjustment) g_object_unref (GTK_OBJECT (dial->adjustment)); g_free(dial->unit); if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } GtkAdjustment* gtk_dial_get_adjustment (GtkDial *dial) { g_return_val_if_fail (dial != NULL, NULL); g_return_val_if_fail (GTK_IS_DIAL (dial), NULL); return dial->adjustment; } void gtk_dial_set_view_only (GtkDial *dial, gboolean view_only) { g_return_if_fail(dial != NULL); g_return_if_fail(GTK_IS_DIAL (dial)); dial->view_only = view_only; } void gtk_dial_set_update_policy (GtkDial *dial, GtkUpdateType policy) { g_return_if_fail (dial != NULL); g_return_if_fail (GTK_IS_DIAL (dial)); dial->policy = policy; } void gtk_dial_set_adjustment (GtkDial *dial, GtkAdjustment *adjustment) { g_return_if_fail (dial != NULL); g_return_if_fail (GTK_IS_DIAL (dial)); if (dial->adjustment) { g_signal_handlers_disconnect_by_func (GTK_OBJECT (dial->adjustment), NULL, (gpointer) dial); g_object_unref (GTK_OBJECT (dial->adjustment)); } dial->adjustment = adjustment; g_object_ref (GTK_OBJECT (dial->adjustment)); g_signal_connect (GTK_OBJECT (adjustment), "changed", GTK_SIGNAL_FUNC (gtk_dial_adjustment_changed), (gpointer) dial); g_signal_connect (GTK_OBJECT (adjustment), "value_changed", GTK_SIGNAL_FUNC (gtk_dial_adjustment_value_changed), (gpointer) dial); dial->old_value = adjustment->value; dial->old_lower = adjustment->lower; dial->old_upper = adjustment->upper; gtk_dial_update (dial); } gfloat gtk_dial_get_value (GtkDial *dial) { g_return_val_if_fail (dial != NULL, 0.0); g_return_val_if_fail (GTK_IS_DIAL (dial), 0.0); return dial->adjustment->value; } gfloat gtk_dial_set_value (GtkDial *dial, gfloat value) { g_return_val_if_fail (dial != NULL, 0.0); g_return_val_if_fail (GTK_IS_DIAL (dial), 0.0); if (value <= dial->adjustment->upper) { dial->adjustment->value = value; gtk_dial_update (dial); } return dial->adjustment->value; } void gtk_dial_set_unit (GtkDial *dial, gchar *unit) { g_return_if_fail (dial != NULL); g_return_if_fail (GTK_IS_DIAL (dial)); g_free(dial->unit); dial->unit = g_strdup(unit); } static void gtk_dial_realize (GtkWidget *widget) { GtkDial *dial; GdkWindowAttr attributes; gint attributes_mask; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_DIAL (widget)); GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); dial = GTK_DIAL (widget); attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; attributes.height = widget->allocation.height; attributes.wclass = GDK_INPUT_OUTPUT; attributes.window_type = GDK_WINDOW_CHILD; attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK; attributes.visual = gtk_widget_get_visual (widget); attributes.colormap = gtk_widget_get_colormap (widget); attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask); widget->style = gtk_style_attach (widget->style, widget->window); gdk_window_set_user_data (widget->window, widget); gtk_style_set_background (widget->style, widget->window, GTK_STATE_ACTIVE); } static void gtk_dial_size_request (GtkWidget *widget, GtkRequisition *requisition) { requisition->width = DIAL_DEFAULT_SIZE; requisition->height = DIAL_DEFAULT_SIZE; } static void gtk_dial_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { GtkDial *dial; g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_DIAL (widget)); g_return_if_fail (allocation != NULL); widget->allocation = *allocation; dial = GTK_DIAL (widget); if (GTK_WIDGET_REALIZED (widget)) { gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height); } dial->radius = MIN (allocation->width, allocation->height) * 0.45; dial->pointer_width = dial->radius / 5; } static gint gtk_dial_expose (GtkWidget *widget, GdkEventExpose *event) { GtkDial *dial; GdkPoint points[6]; gdouble s,c; gdouble theta, last, increment; gdouble percentage; // GtkStyle *blankstyle; gint xc, yc; gint upper, lower; gint tick_length; gint i, inc; gchar *str; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); if (event->count > 0) return FALSE; dial = GTK_DIAL (widget); /* gdk_window_clear_area (widget->window, 0, 0, widget->allocation.width, widget->allocation.height); */ xc = widget->allocation.width / 2; yc = widget->allocation.height / 2; upper = dial->adjustment->upper; lower = dial->adjustment->lower; /* Draw ticks */ if ((upper - lower) == 0) return FALSE; increment = (100*M_PI) / (dial->radius*dial->radius); inc = (upper - lower); while (inc < 100) inc *= 10; while (inc >= 1000) inc /= 10; last = -1; for (i = 0; i <= inc; i++) { theta = ((gfloat)i*M_PI / (18*inc/24.) - M_PI/6.); if ((theta - last) < (increment)) continue; last = theta; s = sin (theta); c = cos (theta); tick_length = (i%(inc/10) == 0) ? dial->pointer_width : dial->pointer_width / 2; gdk_draw_line (widget->window, widget->style->fg_gc[widget->state], xc + c*(dial->radius - tick_length), yc - s*(dial->radius - tick_length), xc + c*dial->radius, yc - s*dial->radius); } /* Draw pointer */ s = sin (dial->angle); c = cos (dial->angle); dial->last_angle = dial->angle; points[0].x = xc + s*dial->pointer_width/2; points[0].y = yc + c*dial->pointer_width/2; points[1].x = xc + c*dial->radius; points[1].y = yc - s*dial->radius; points[2].x = xc - s*dial->pointer_width/2; points[2].y = yc - c*dial->pointer_width/2; points[3].x = xc - c*dial->radius/10; points[3].y = yc + s*dial->radius/10; points[4].x = points[0].x; points[4].y = points[0].y; gtk_paint_polygon (widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, widget, NULL, points, 5, TRUE); percentage = (dial->adjustment->value - dial->adjustment->lower) / (dial->adjustment->upper - dial->adjustment->lower) * 100.0; str = g_strdup_printf ("%3.0f%s", percentage, dial->unit ? dial->unit : "%"); i = gdk_string_width (gtk_style_get_font(widget->style), str) / 2; gdk_draw_string (widget->window, gtk_style_get_font(widget->style), widget->style->black_gc, xc - i, widget->allocation.height - 5, str); g_free(str); return FALSE; } static gint gtk_dial_button_press (GtkWidget *widget, GdkEventButton *event) { GtkDial *dial; gint dx, dy; double s, c; double d_parallel; double d_perpendicular; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); dial = GTK_DIAL (widget); /* Determine if button press was within pointer region - we do this by computing the parallel and perpendicular distance of the point where the mouse was pressed from the line passing through the pointer */ dx = event->x - widget->allocation.width / 2; dy = widget->allocation.height / 2 - event->y; s = sin (dial->angle); c = cos (dial->angle); d_parallel = s*dy + c*dx; d_perpendicular = fabs (s*dx - c*dy); if (!dial->button && (d_perpendicular < dial->pointer_width/2) && (d_parallel > - dial->pointer_width)) { gtk_grab_add (widget); dial->button = event->button; gtk_dial_update_mouse (dial, event->x, event->y); } return FALSE; } static gint gtk_dial_button_release (GtkWidget *widget, GdkEventButton *event) { GtkDial *dial; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); dial = GTK_DIAL (widget); if (dial->button == event->button) { gtk_grab_remove (widget); dial->button = 0; if (dial->policy == GTK_UPDATE_DELAYED) gtk_timeout_remove (dial->timer); if ((dial->policy != GTK_UPDATE_CONTINUOUS) && (dial->old_value != dial->adjustment->value)) g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed"); } return FALSE; } static gint gtk_dial_motion_notify (GtkWidget *widget, GdkEventMotion *event) { GtkDial *dial; GdkModifierType mods; gint x, y, mask; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_DIAL (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); dial = GTK_DIAL (widget); if (dial->button != 0) { x = event->x; y = event->y; if (event->is_hint || (event->window != widget->window)) gdk_window_get_pointer (widget->window, &x, &y, &mods); switch (dial->button) { case 1: mask = GDK_BUTTON1_MASK; break; case 2: mask = GDK_BUTTON2_MASK; break; case 3: mask = GDK_BUTTON3_MASK; break; default: mask = 0; break; } if (mods & mask) gtk_dial_update_mouse (dial, x,y); } return FALSE; } static gint gtk_dial_timer (GtkDial *dial) { g_return_val_if_fail (dial != NULL, FALSE); g_return_val_if_fail (GTK_IS_DIAL (dial), FALSE); if (dial->policy == GTK_UPDATE_DELAYED) g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed"); return FALSE; } static void gtk_dial_update_mouse (GtkDial *dial, gint x, gint y) { gint xc, yc; gfloat old_value; g_return_if_fail (dial != NULL); g_return_if_fail (GTK_IS_DIAL (dial)); if (dial->view_only) return; xc = GTK_WIDGET(dial)->allocation.width / 2; yc = GTK_WIDGET(dial)->allocation.height / 2; old_value = dial->adjustment->value; dial->angle = atan2(yc-y, x-xc); if (dial->angle < -M_PI/2.) dial->angle += 2*M_PI; if (dial->angle < -M_PI/6) dial->angle = -M_PI/6; if (dial->angle > 7.*M_PI/6.) dial->angle = 7.*M_PI/6.; dial->adjustment->value = dial->adjustment->lower + (7.*M_PI/6 - dial->angle) * (dial->adjustment->upper - dial->adjustment->lower) / (4.*M_PI/3.); if (dial->adjustment->value != old_value) { if (dial->policy == GTK_UPDATE_CONTINUOUS) { g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed"); } else { gtk_widget_queue_draw (GTK_WIDGET (dial)); if (dial->policy == GTK_UPDATE_DELAYED) { if (dial->timer) gtk_timeout_remove (dial->timer); dial->timer = gtk_timeout_add (SCROLL_DELAY_LENGTH, (GtkFunction) gtk_dial_timer, (gpointer) dial); } } } } static void gtk_dial_update (GtkDial *dial) { gfloat new_value; g_return_if_fail (dial != NULL); g_return_if_fail (GTK_IS_DIAL (dial)); new_value = dial->adjustment->value; if (new_value < dial->adjustment->lower) new_value = dial->adjustment->lower; if (new_value > dial->adjustment->upper) new_value = dial->adjustment->upper; if (new_value != dial->adjustment->value) { dial->adjustment->value = new_value; g_signal_emit_by_name (GTK_OBJECT (dial->adjustment), "value_changed"); } dial->angle = 7.*M_PI/6. - (new_value - dial->adjustment->lower) * 4.*M_PI/3. / (dial->adjustment->upper - dial->adjustment->lower); gtk_widget_queue_draw (GTK_WIDGET (dial)); } static void gtk_dial_adjustment_changed (GtkAdjustment *adjustment, gpointer data) { GtkDial *dial; g_return_if_fail (adjustment != NULL); g_return_if_fail (data != NULL); dial = GTK_DIAL (data); if ((dial->old_value != adjustment->value) || (dial->old_lower != adjustment->lower) || (dial->old_upper != adjustment->upper)) { gtk_dial_update (dial); dial->old_value = adjustment->value; dial->old_lower = adjustment->lower; dial->old_upper = adjustment->upper; } } static void gtk_dial_adjustment_value_changed (GtkAdjustment *adjustment, gpointer data) { GtkDial *dial; g_return_if_fail (adjustment != NULL); g_return_if_fail (data != NULL); dial = GTK_DIAL (data); if (dial->old_value != adjustment->value) { gtk_dial_update (dial); dial->old_value = adjustment->value; } } gmfsk-0.7pre1/src/gtkdial.h0000644000076400007640000000643010107503241011323 /* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * Modified for use in gMFSK by Tomi Manninen * (some code borrowed from the old GnomeUI version) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __GTK_DIAL_H__ #define __GTK_DIAL_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #define GTK_DIAL(obj) GTK_CHECK_CAST (obj, gtk_dial_get_type (), GtkDial) #define GTK_DIAL_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, gtk_dial_get_type (), GtkDialClass) #define GTK_IS_DIAL(obj) GTK_CHECK_TYPE (obj, gtk_dial_get_type ()) typedef struct _GtkDial GtkDial; typedef struct _GtkDialClass GtkDialClass; struct _GtkDial { GtkWidget widget; /* update policy (GTK_UPDATE_[CONTINUOUS/DELAYED/DISCONTINUOUS]) */ guint policy : 2; /* Whether the user is able to edit the dial value */ guint view_only : 1; /* Button currently pressed or 0 if none */ guint8 button; /* Dimensions of dial components */ gint radius; gint pointer_width; /* ID of update timer, or 0 if none */ guint32 timer; /* Current angle */ gfloat angle; gfloat last_angle; /* Old values from adjustment stored so we know when something changes */ gfloat old_value; gfloat old_lower; gfloat old_upper; /* The adjustment object that stores the data for this dial */ GtkAdjustment *adjustment; /* The unit to diplay under the dial */ gchar *unit; }; struct _GtkDialClass { GtkWidgetClass parent_class; }; GtkWidget* gtk_dial_new (const char *name, void *dummy0, void *dummy1, unsigned int lower, unsigned int upper); GtkType gtk_dial_get_type (void); GtkAdjustment* gtk_dial_get_adjustment (GtkDial *dial); void gtk_dial_set_update_policy (GtkDial *dial, GtkUpdateType policy); void gtk_dial_set_adjustment (GtkDial *dial, GtkAdjustment *adjustment); gfloat gtk_dial_set_value (GtkDial *dial, gfloat value); gfloat gtk_dial_get_value (GtkDial *dial); void gtk_dial_set_view_only (GtkDial *dial, gboolean view_only); void gtk_dial_set_unit (GtkDial *dial, gchar *unit); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __GTK_DIAL_H__ */ gmfsk-0.7pre1/src/ascii.h0000644000076400007640000000627307725503071011016 /* * ascii.h -- ASCII table * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ static char *ascii[256] = { "", "", "", "", "", "", "", "", "", "\t", "\n", "", "", "\n", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", " ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "", "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", "<216>", "<217>", "<220>", "<221>", "<222>", "<223>", "<224>", "<225>", "<226>", "<227>", "<230>", "<231>", "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "\240", "\241", "\242", "\243", "\244", "\245", "\246", "\247", "\250", "\251", "\252", "\253", "\254", "\255", "\256", "\257", "\260", "\261", "\262", "\263", "\264", "\265", "\266", "\267", "\270", "\271", "\272", "\273", "\274", "\275", "\276", "\277", "\300", "\301", "\302", "\303", "\304", "\305", "\306", "\307", "\310", "\311", "\312", "\313", "\314", "\315", "\316", "\317", "\320", "\321", "\322", "\323", "\324", "\325", "\326", "\327", "\330", "\331", "\332", "\333", "\334", "\335", "\336", "\337", "\340", "\341", "\342", "\343", "\344", "\345", "\346", "\347", "\350", "\351", "\352", "\353", "\354", "\355", "\356", "\357", "\360", "\361", "\362", "\363", "\364", "\365", "\366", "\367", "\370", "\371", "\372", "\373", "\374", "\375", "\376", "\377" }; gmfsk-0.7pre1/src/conf.c0000644000076400007640000005312310175006403010630 /* * conf.c -- Configuration * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "interface.h" #include "support.h" #include "conf.h" #include "main.h" #include "trx.h" #include "ptt.h" #include "snd.h" #include "hamlib.h" static GConfClient *client = NULL; /* ---------------------------------------------------------------------- */ static gchar *mkkey(const gchar *key) { static gchar buf[256]; g_snprintf(buf, sizeof(buf), "/apps/%s/%s", PACKAGE, key); buf[sizeof(buf) - 1] = 0; return buf; } /* ---------------------------------------------------------------------- */ void conf_set_string(const gchar *key, const gchar *val) { g_return_if_fail(client); g_return_if_fail(key); gconf_client_set_string(client, mkkey(key), val, NULL); } void conf_set_bool(const gchar *key, gboolean val) { g_return_if_fail(client); g_return_if_fail(key); gconf_client_set_bool(client, mkkey(key), val, NULL); } void conf_set_int(const gchar *key, gint val) { g_return_if_fail(client); g_return_if_fail(key); gconf_client_set_int(client, mkkey(key), val, NULL); } void conf_set_float(const gchar *key, gdouble val) { g_return_if_fail(client); g_return_if_fail(key); gconf_client_set_float(client, mkkey(key), val, NULL); } /* ---------------------------------------------------------------------- */ /* * These config defaults are only used as a last resort. * Normally the gconf schema system provides these defaults. * (see gmfsk.schemas). */ typedef enum { D_INT, D_BOOL, D_FLOAT, D_STRING } conf_data_t; struct conf_default { const gchar *key; conf_data_t type; union { gint i; gboolean b; gdouble f; const gchar *s; } value; }; static struct conf_default conf_defs[] = { { "info/mycall", D_STRING, { .s = "" } }, { "info/myname", D_STRING, { .s = "" } }, { "info/myqth", D_STRING, { .s = "" } }, { "info/myloc", D_STRING, { .s = "" } }, { "info/myemail", D_STRING, { .s = "" } }, { "colors/tx", D_STRING, { .s = "red" } }, { "colors/rx", D_STRING, { .s = "black" } }, { "colors/hl", D_STRING, { .s = "blue" } }, { "colors/txwin", D_STRING, { .s = "white" } }, { "colors/rxwin", D_STRING, { .s = "white" } }, { "fonts/txfont", D_STRING, { .s = "Sans 10" } }, { "fonts/rxfont", D_STRING, { .s = "Sans 10" } }, { "sound/dev", D_STRING, { .s = "/dev/dsp" } }, { "ptt/dev", D_STRING, { .s = "none" } }, { "misc/datefmt", D_STRING, { .s = "%d.%m.%Y" } }, { "misc/timefmt", D_STRING, { .s = "%H:%M:%S %Z" } }, { "misc/bands", D_STRING, { .s = ",1.8,3.5,7,10,14,18,21,24,28" } }, { "misc/logfile", D_STRING, { .s = "~/gMFSK.log" } }, { "misc/picrxdir", D_STRING, { .s = "~/gMFSK/" } }, { "misc/pictxdir", D_STRING, { .s = "~/gMFSK/" } }, { "misc/fftwwisdom", D_STRING, { .s = "" } }, { "hell/font", D_STRING, { .s = "FeldNarr 14" } }, { "hamlib/conf", D_STRING, { .s = "" } }, { "hamlib/port", D_STRING, { .s = "" } }, { "sound/8bit", D_BOOL, { .b = FALSE } }, { "sound/stereo", D_BOOL, { .b = FALSE } }, { "sound/fulldup", D_BOOL, { .b = FALSE } }, { "ptt/inverted", D_BOOL, { .b = FALSE } }, { "misc/afc", D_BOOL, { .b = FALSE } }, { "misc/squelch", D_BOOL, { .b = TRUE } }, { "misc/reverse", D_BOOL, { .b = FALSE } }, { "olivia/escape", D_BOOL, { .b = TRUE } }, { "rtty/reverse", D_BOOL, { .b = TRUE } }, { "rtty/msbfirst", D_BOOL, { .b = FALSE } }, { "mt63/cwid", D_BOOL, { .b = FALSE } }, { "mt63/escape", D_BOOL, { .b = TRUE } }, { "hell/uppercase", D_BOOL, { .b = TRUE } }, { "wf/direction", D_BOOL, { .b = FALSE } }, { "hamlib/enable", D_BOOL, { .b = FALSE } }, { "hamlib/wf", D_BOOL, { .b = TRUE } }, { "hamlib/qsodata", D_BOOL, { .b = TRUE } }, { "hamlib/ptt", D_BOOL, { .b = TRUE } }, { "ptt/mode", D_INT, { .i = 2 } }, { "wf/mode", D_INT, { .i = 0 } }, { "wf/zoom", D_INT, { .i = 0 } }, { "wf/speed", D_INT, { .i = 1 } }, { "wf/window", D_INT, { .i = 1 } }, { "misc/druidlevel", D_INT, { .i = 0 } }, { "misc/lastmode", D_INT, { .i = 0 } }, { "olivia/tones", D_INT, { .i = 3 } }, { "olivia/bw", D_INT, { .i = 3 } }, { "olivia/smargin", D_INT, { .i = 8 } }, { "olivia/sinteg", D_INT, { .i = 4 } }, { "rtty/bits", D_INT, { .i = 0 } }, { "rtty/parity", D_INT, { .i = 0 } }, { "rtty/stop", D_INT, { .i = 1 } }, { "mt63/bandwidth", D_INT, { .i = 1 } }, { "mt63/interleave", D_INT, { .i = 1 } }, { "hamlib/rig", D_INT, { .i = 1 } }, { "hamlib/wf_res", D_INT, { .i = 1 } }, { "hamlib/speed", D_INT, { .i = 9600 } }, { "sound/srate", D_FLOAT, { .f = 8000.0 } }, { "sound/txoffset", D_FLOAT, { .f = 0.0 } }, { "sound/rxoffset", D_FLOAT, { .f = 0.0 } }, { "wf/reflevel", D_FLOAT, { .f = -10.0 } }, { "wf/ampspan", D_FLOAT, { .f = 100.0 } }, { "misc/txoffset", D_FLOAT, { .f = 0.0 } }, { "mfsk/squelch", D_FLOAT, { .f = 15.0 } }, { "olivia/squelch", D_FLOAT, { .f = 4.0 } }, { "rtty/shift", D_FLOAT, { .f = 170.0 } }, { "rtty/baud", D_FLOAT, { .f = 45.45 } }, { "rtty/squelch", D_FLOAT, { .f = 15.0 } }, { "throb/squelch", D_FLOAT, { .f = 15.0 } }, { "psk31/squelch", D_FLOAT, { .f = 15.0 } }, { "mt63/squelch", D_FLOAT, { .f = 15.0 } }, { "hell/bandwidth", D_FLOAT, { .f = 245.0 } }, { "hell/agcattack", D_FLOAT, { .f = 5.0 } }, { "hell/agcdecay", D_FLOAT, { .f = 500.0 } }, { "cw/squelch", D_FLOAT, { .f = 15.0 } }, { "cw/speed", D_FLOAT, { .f = 18.0 } }, { "cw/bandwidth", D_FLOAT, { .f = 75.0 } }, { "hamlib/cfreq", D_FLOAT, { .f = 1000.0 } }, { NULL } }; /* ---------------------------------------------------------------------- */ gchar *conf_get_string(const gchar *key) { struct conf_default *defs = conf_defs; gchar *s; g_return_val_if_fail(client, NULL); g_return_val_if_fail(key, NULL); s = gconf_client_get_string(client, mkkey(key), NULL); if (s == NULL) { while (defs->key) { if (!strcmp(defs->key, key) && defs->type == D_STRING) return g_strdup(defs->value.s); defs++; } return g_strdup(""); } return g_strdup(s); } gboolean conf_get_bool(const gchar *key) { struct conf_default *defs = conf_defs; GConfValue *value; g_return_val_if_fail(client, FALSE); g_return_val_if_fail(key, FALSE); value = gconf_client_get(client, mkkey(key), NULL); if (!value || value->type != GCONF_VALUE_BOOL) { while (defs->key) { if (!strcmp(defs->key, key) && defs->type == D_BOOL) return defs->value.b; defs++; } return FALSE; } return gconf_value_get_bool(value); } gint conf_get_int(const gchar *key) { struct conf_default *defs = conf_defs; GConfValue *value; g_return_val_if_fail(client, 0); g_return_val_if_fail(key, 0); value = gconf_client_get(client, mkkey(key), NULL); if (!value || value->type != GCONF_VALUE_INT) { while (defs->key) { if (!strcmp(defs->key, key) && defs->type == D_INT) return defs->value.i; defs++; } return 0; } return gconf_value_get_int(value); } gdouble conf_get_float(const gchar *key) { struct conf_default *defs = conf_defs; GConfValue *value; g_return_val_if_fail(client, 0.0); g_return_val_if_fail(key, 0.0); value = gconf_client_get(client, mkkey(key), NULL); if (!value || value->type != GCONF_VALUE_FLOAT) { while (defs->key) { if (!strcmp(defs->key, key) && defs->type == D_FLOAT) return defs->value.f; defs++; } return 0.0; } return gconf_value_get_float(value); } /* ---------------------------------------------------------------------- */ gchar *conf_get_filename(const gchar *key) { GError *error = NULL; gchar *str, *name; str = conf_get_string(key); name = g_filename_from_utf8(str, -1, NULL, NULL, &error); if (name == NULL) { if (error != NULL) { errmsg(_("Error converting filename (%s=%s): %s"), key, str, error->message); g_error_free(error); } return NULL; } g_free(str); if (name[0] == '~' && name[1] == G_DIR_SEPARATOR) { gchar *tmp; tmp = g_strdup_printf("%s%c%s", g_get_home_dir(), G_DIR_SEPARATOR, name + 2); g_free(name); name = tmp; } return name; } /* ---------------------------------------------------------------------- */ void conf_set_tag_color(GtkTextTag *tag, const gchar *color) { g_return_if_fail(color); g_object_set(G_OBJECT(tag), "foreground", color, NULL); } void conf_set_bg_color(GtkWidget *widget, const gchar *color) { GdkColormap *map; GdkColor *clr; g_return_if_fail(color); clr = g_malloc(sizeof(GdkColor)); // FIXME: leaking memory!! gdk_color_parse(color, clr); map = gdk_colormap_get_system(); if (!gdk_colormap_alloc_color(map, clr, FALSE, TRUE)) { g_warning(_("Couldn't allocate color")); return; } gtk_widget_modify_base(widget, GTK_STATE_NORMAL, clr); } void conf_set_font(GtkWidget *widget, const gchar *font) { PangoFontDescription *font_desc; g_return_if_fail(font); font_desc = pango_font_description_from_string(font); gtk_widget_modify_font(widget, font_desc); pango_font_description_free(font_desc); } void conf_set_ptt(void) { const gchar *dev; gboolean inv; gint mode; dev = conf_get_string("ptt/dev"); inv = conf_get_bool("ptt/inverted"); mode = conf_get_int("ptt/mode"); ptt_init(dev, inv, mode); } void conf_set_qso_bands(const gchar *bandlist) { GtkCombo *qsobandcombo; GList *list = NULL; gchar *bands, **bandp, **p; bands = g_strdup(bandlist); g_strdelimit(bands, ", \t\r\n", ','); bandp = g_strsplit(bands, ",", 64); for (p = bandp; *p; p++) list = g_list_append(list, (gpointer) *p); qsobandcombo = GTK_COMBO(lookup_widget(appwindow, "qsobandcombo")); gtk_combo_set_popdown_strings(qsobandcombo, list); g_free(bands); g_strfreev(bandp); g_list_free(list); } void conf_set_mfsk_config(void) { trx_set_mfsk_parms(conf_get_float("mfsk/squelch")); } void conf_set_olivia_config(void) { trx_set_olivia_parms(conf_get_float("olivia/squelch"), conf_get_int("olivia/tones"), conf_get_int("olivia/bw"), conf_get_float("olivia/smargin"), conf_get_float("olivia/sinteg"), conf_get_bool("olivia/escape")); } void conf_set_rtty_config(void) { trx_set_rtty_parms(conf_get_float("rtty/squelch"), conf_get_float("rtty/shift"), conf_get_float("rtty/baud"), conf_get_int("rtty/bits"), conf_get_int("rtty/parity"), conf_get_int("rtty/stop"), conf_get_bool("rtty/reverse"), conf_get_bool("rtty/msbfirst")); } void conf_set_throb_config(void) { trx_set_throb_parms(conf_get_float("throb/squelch")); } void conf_set_psk31_config(void) { trx_set_psk31_parms(conf_get_float("psk31/squelch")); } void conf_set_mt63_config(void) { trx_set_mt63_parms(conf_get_float("mt63/squelch"), conf_get_int("mt63/bandwidth"), conf_get_int("mt63/interleave"), conf_get_bool("mt63/cwid"), conf_get_bool("mt63/escape")); } void conf_set_hell_config(void) { trx_set_hell_parms(conf_get_string("hell/font"), conf_get_bool("hell/uppercase"), conf_get_float("hell/bandwidth"), conf_get_float("hell/agcattack"), conf_get_float("hell/agcdecay")); } void conf_set_cw_config(void) { trx_set_cw_parms(conf_get_float("cw/squelch"), conf_get_float("cw/speed"), conf_get_float("cw/bandwidth")); } void conf_set_waterfall_config(void) { waterfall_set_ampspan(waterfall, conf_get_float("wf/ampspan")); waterfall_set_reflevel(waterfall, conf_get_float("wf/reflevel")); waterfall_set_mode(waterfall, conf_get_int("wf/mode")); waterfall_set_magnification(waterfall, conf_get_int("wf/zoom")); waterfall_set_speed(waterfall, conf_get_int("wf/speed")); waterfall_set_window(waterfall, conf_get_int("wf/window")); waterfall_set_dir(waterfall, conf_get_bool("wf/direction")); } void conf_set_hamlib_config(void) { #if WANT_HAMLIB hamlib_set_conf(conf_get_bool("hamlib/wf"), conf_get_bool("hamlib/qsodata"), conf_get_bool("hamlib/ptt"), conf_get_int("hamlib/wf_res")); #endif } void conf_set_sound_config(void) { snd_config_t cfg; guint flags; cfg.device = conf_get_filename("sound/dev"); cfg.samplerate = conf_get_float("sound/srate"); cfg.txoffset = conf_get_float("sound/txoffset"); cfg.rxoffset = conf_get_float("sound/rxoffset"); /* get testmode flags */ sound_get_flags(&flags); flags &= SND_FLAG_TESTMODE_MASK; if (conf_get_bool("sound/8bit")) flags |= SND_FLAG_8BIT; if (conf_get_bool("sound/stereo")) flags |= SND_FLAG_STEREO; if (conf_get_bool("sound/fulldup")) flags |= SND_FLAG_FULLDUP; sound_set_conf(&cfg); sound_set_flags(flags); g_free(cfg.device); } /* ---------------------------------------------------------------------- */ static void tag_color_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { GtkTextTag *tag = GTK_TEXT_TAG(data); GConfValue *value = gconf_entry_get_value(entry); if (value && value->type == GCONF_VALUE_STRING) conf_set_tag_color(tag, gconf_value_get_string(value)); } static void bg_color_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { GtkWidget *widget = GTK_WIDGET(data); GConfValue *value = gconf_entry_get_value(entry); if (value && value->type == GCONF_VALUE_STRING) conf_set_bg_color(widget, gconf_value_get_string(value)); } static void font_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { GtkWidget *widget = GTK_WIDGET(data); GConfValue *value = gconf_entry_get_value(entry); if (value && value->type == GCONF_VALUE_STRING) conf_set_font(widget, gconf_value_get_string(value)); } static void txoffset_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { GConfValue *value = gconf_entry_get_value(entry); if (value && value->type == GCONF_VALUE_FLOAT) trx_set_txoffset(gconf_value_get_float(value)); } static void qso_bands_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { GConfValue *value = gconf_entry_get_value(entry); if (value && value->type == GCONF_VALUE_STRING) conf_set_qso_bands(gconf_value_get_string(value)); } static void hamlib_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { #if WANT_HAMLIB GConfValue *value = gconf_entry_get_value(entry); if (value && value->type == GCONF_VALUE_BOOL) { if (gconf_value_get_bool(value)) hamlib_init(); else hamlib_close(); } #endif } /* ---------------------------------------------------------------------- */ static void generic_config_changed_notify(GConfClient *client, guint id, GConfEntry *entry, gpointer data) { void (*func) (void) = data; func(); } /* ---------------------------------------------------------------------- */ void conf_init(void) { g_return_if_fail(!client); client = gconf_client_get_default(); if (!client) { g_warning(_("GConf client init failed!!!\n")); exit(1); } gconf_client_add_dir(client, "/apps/" PACKAGE, GCONF_CLIENT_PRELOAD_RECURSIVE, NULL); } void conf_load(void) { GtkWidget *w; const gchar *s; gboolean b; gfloat f; g_return_if_fail(client); s = conf_get_string("colors/hl"); conf_set_tag_color(hltag, s); gconf_client_notify_add(client, mkkey("colors/hl"), tag_color_changed_notify, hltag, NULL, NULL); s = conf_get_string("colors/rx"); conf_set_tag_color(rxtag, s); gconf_client_notify_add(client, mkkey("colors/rx"), tag_color_changed_notify, rxtag, NULL, NULL); s = conf_get_string("colors/tx"); conf_set_tag_color(txtag, s); gconf_client_notify_add(client, mkkey("colors/tx"), tag_color_changed_notify, txtag, NULL, NULL); s = conf_get_string("colors/rxwin"); w = lookup_widget(appwindow, "rxtext"); conf_set_bg_color(w, s); gconf_client_notify_add(client, mkkey("colors/rxwin"), bg_color_changed_notify, w, NULL, NULL); s = conf_get_string("colors/txwin"); w = lookup_widget(appwindow, "txtext"); conf_set_bg_color(w, s); gconf_client_notify_add(client, mkkey("colors/txwin"), bg_color_changed_notify, w, NULL, NULL); s = conf_get_string("fonts/rxfont"); w = lookup_widget(appwindow, "rxtext"); conf_set_font(w, s); gconf_client_notify_add(client, mkkey("fonts/rxfont"), font_changed_notify, w, NULL, NULL); s = conf_get_string("hell/font"); w = lookup_widget(appwindow, "txentry"); conf_set_font(w, s); gconf_client_notify_add(client, mkkey("hell/font"), font_changed_notify, w, NULL, NULL); s = conf_get_string("fonts/txfont"); w = lookup_widget(appwindow, "txtext"); conf_set_font(w, s); gconf_client_notify_add(client, mkkey("fonts/txfont"), font_changed_notify, w, NULL, NULL); f = conf_get_float("misc/txoffset"); trx_set_txoffset(f); gconf_client_notify_add(client, mkkey("misc/txoffset"), txoffset_changed_notify, NULL, NULL, NULL); conf_set_ptt(); gconf_client_notify_add(client, mkkey("ptt"), generic_config_changed_notify, conf_set_ptt, NULL, NULL); s = conf_get_qsobands(); conf_set_qso_bands(s); gconf_client_notify_add(client, mkkey("misc/bands"), qso_bands_changed_notify, NULL, NULL, NULL); conf_set_mfsk_config(); gconf_client_notify_add(client, mkkey("mfsk"), generic_config_changed_notify, conf_set_mfsk_config, NULL, NULL); conf_set_olivia_config(); gconf_client_notify_add(client, mkkey("olivia"), generic_config_changed_notify, conf_set_olivia_config, NULL, NULL); conf_set_rtty_config(); gconf_client_notify_add(client, mkkey("rtty"), generic_config_changed_notify, conf_set_rtty_config, NULL, NULL); conf_set_throb_config(); gconf_client_notify_add(client, mkkey("throb"), generic_config_changed_notify, conf_set_throb_config, NULL, NULL); conf_set_psk31_config(); gconf_client_notify_add(client, mkkey("psk31"), generic_config_changed_notify, conf_set_psk31_config, NULL, NULL); conf_set_mt63_config(); gconf_client_notify_add(client, mkkey("mt63"), generic_config_changed_notify, conf_set_mt63_config, NULL, NULL); conf_set_hell_config(); gconf_client_notify_add(client, mkkey("hell"), generic_config_changed_notify, conf_set_hell_config, NULL, NULL); conf_set_cw_config(); gconf_client_notify_add(client, mkkey("cw"), generic_config_changed_notify, conf_set_cw_config, NULL, NULL); conf_set_waterfall_config(); gconf_client_notify_add(client, mkkey("wf"), generic_config_changed_notify, conf_set_waterfall_config, NULL, NULL); gconf_client_notify_add(client, mkkey("hamlib/enable"), hamlib_changed_notify, NULL, NULL, NULL); conf_set_hamlib_config(); gconf_client_notify_add(client, mkkey("hamlib"), generic_config_changed_notify, conf_set_hamlib_config, NULL, NULL); conf_set_sound_config(); gconf_client_notify_add(client, mkkey("sound"), generic_config_changed_notify, conf_set_sound_config, NULL, NULL); /* * Load misc settings */ b = conf_get_bool("misc/afc"); w = lookup_widget(appwindow, "afcbutton"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b); b = conf_get_bool("misc/squelch"); w = lookup_widget(appwindow, "squelchbutton"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b); b = conf_get_bool("misc/reverse"); w = lookup_widget(appwindow, "reversebutton"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b); b = conf_get_bool("misc/log"); w = find_menu_item("_File/_Log to file"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), b); } void conf_clear(void) { GtkWidget *w; gboolean b; g_return_if_fail(client); /* * Save misc settings */ w = lookup_widget(appwindow, "afcbutton"); b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); gconf_client_set_bool(client, mkkey("misc/afc"), b, NULL); w = lookup_widget(appwindow, "squelchbutton"); b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); gconf_client_set_bool(client, mkkey("misc/squelch"), b, NULL); w = lookup_widget(appwindow, "reversebutton"); b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); gconf_client_set_bool(client, mkkey("misc/reverse"), b, NULL); w = find_menu_item("_File/_Log to file"); b = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(w)); gconf_client_set_bool(client, mkkey("misc/log"), b, NULL); /* * Clear GConfClient */ g_object_unref(G_OBJECT(client)); client = NULL; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/conf.h0000644000076400007640000000457507725667232010670 /* * conf.h -- Configuration * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _CONF_H #define _CONF_H #include #ifdef __cplusplus extern "C" { #endif extern void conf_init(void); extern void conf_load(void); extern void conf_clear(void); extern void conf_set_ptt(void); extern void conf_set_string(const gchar *key, const gchar *val); extern void conf_set_bool(const gchar *key, gboolean val); extern void conf_set_int(const gchar *key, gint val); extern void conf_set_float(const gchar *key, gdouble val); extern gchar *conf_get_string(const gchar *key); extern gboolean conf_get_bool(const gchar *key); extern gint conf_get_int(const gchar *key); extern gdouble conf_get_float(const gchar *key); extern gchar *conf_get_filename(const gchar *key); #define conf_get_mycall() conf_get_string("info/mycall") #define conf_get_myname() conf_get_string("info/myname") #define conf_get_myqth() conf_get_string("info/myqth") #define conf_get_myloc() conf_get_string("info/myloc") #define conf_get_myemail() conf_get_string("info/myemail") #define conf_get_timefmt() conf_get_string("misc/timefmt") #define conf_get_datefmt() conf_get_string("misc/datefmt") #define conf_get_qsobands() conf_get_string("misc/bands") #define conf_get_logfile() conf_get_filename("misc/logfile") #define conf_get_picrxdir() conf_get_filename("misc/picrxdir") #define conf_get_pictxdir() conf_get_filename("misc/pictxdir") #define conf_get_pttdev() conf_get_filename("ptt/dev") #define conf_get_pttinv() conf_get_bool("ptt/8bit") #define conf_get_pttmode() conf_get_int("ptt/mode") #ifdef __cplusplus } #endif #endif gmfsk-0.7pre1/src/confdialog.c0000644000076400007640000004650410175006477012030 /* * confdialog.c -- Configuration dialog * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include "callbacks.h" #include "interface.h" #include "support.h" #include "main.h" #include "confdialog.h" #include "conf.h" #include "hamlib.h" static GtkWidget *ConfDialog = NULL; /* ---------------------------------------------------------------------- */ enum { CATEGORY_COLUMN = 0, PAGE_NUM_COLUMN, NUM_COLUMNS }; typedef struct _TreeItem TreeItem; struct _TreeItem { const gchar *label; gint number; TreeItem *children; }; /* tree data */ static TreeItem treeitem_general[] = { {N_("Station info"), 1, NULL }, {N_("Date & Time"), 2, NULL }, {N_("Bands"), 3, NULL }, {N_("Files & Dirs"), 4, NULL }, { NULL } }; static TreeItem treeitem_appearance[] = { {N_("Colors"), 5, NULL }, {N_("Fonts"), 6, NULL }, { NULL } }; static TreeItem treeitem_modems[] = { {N_("All"), 7, NULL }, {N_("MFSK"), 8, NULL }, {N_("OLIVIA"), 9, NULL }, {N_("RTTY"), 10, NULL }, {N_("THROB"), 11, NULL }, {N_("PSK31"), 12, NULL }, {N_("MT63"), 13, NULL }, {N_("HELL"), 14, NULL }, {N_("CW"), 15, NULL }, { NULL } }; static TreeItem treeitem_waterfall[] = { {N_("Settings"), 16, NULL }, { NULL } }; static TreeItem treeitem_devices[] = { {N_("Sound"), 17, NULL }, {N_("PTT"), 18, NULL }, { NULL } }; #if WANT_HAMLIB static TreeItem treeitem_hamlib[] = { {N_("Settings"), 19, NULL }, {N_("Features"), 20, NULL }, { NULL } }; #endif static TreeItem treeitem_toplevel[] = { {N_("General"), 0, treeitem_general }, {N_("Appearance"), 0, treeitem_appearance }, {N_("Modems"), 0, treeitem_modems }, {N_("Waterfall"), 0, treeitem_waterfall }, {N_("Devices"), 0, treeitem_devices }, #if WANT_HAMLIB {N_("Hamlib"), 0, treeitem_hamlib }, #endif { NULL } }; static GtkTreeStore *confdialog_build_tree_store(void) { GtkTreeStore *store; GtkTreeIter iter, childiter; TreeItem *toplevel, *child; store = gtk_tree_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_INT); toplevel = treeitem_toplevel; while (toplevel->label) { gtk_tree_store_append(store, &iter, NULL); gtk_tree_store_set(store, &iter, CATEGORY_COLUMN, _(toplevel->label), PAGE_NUM_COLUMN, toplevel->number, -1); child = toplevel->children; while (child->label) { gtk_tree_store_append(store, &childiter, &iter); gtk_tree_store_set(store, &childiter, CATEGORY_COLUMN, _(child->label), PAGE_NUM_COLUMN, child->number, -1); child++; } toplevel++; } return store; } /* ---------------------------------------------------------------------- */ typedef enum { T_ENTRY, T_ENTRY_FLOAT, T_COLORPICKER, T_FONTPICKER, T_OPTIONMENU, T_SPINBUTTON, T_TOGGLEBUTTON, T_RADIOBUTTON, T_SCALE } conf_type_t; #define CONFITEM(c) ((ConfItem *) (c)) typedef struct _ConfItem ConfItem; struct _ConfItem { const gchar *path; conf_type_t type; const gchar *widgetname; gint radiodata; }; static ConfItem confitems[] = { {"info/mycall", T_ENTRY, "callentry"}, {"info/myname", T_ENTRY, "nameentry"}, {"info/myqth", T_ENTRY, "qthentry"}, {"info/myloc", T_ENTRY, "locentry"}, {"info/myemail", T_ENTRY, "emailentry"}, {"colors/tx", T_COLORPICKER, "txcolorpicker"}, {"colors/rx", T_COLORPICKER, "rxcolorpicker"}, {"colors/hl", T_COLORPICKER, "hlcolorpicker"}, {"colors/txwin", T_COLORPICKER, "txwincolorpicker"}, {"colors/rxwin", T_COLORPICKER, "rxwincolorpicker"}, {"fonts/txfont", T_FONTPICKER, "txfontpicker"}, {"fonts/rxfont", T_FONTPICKER, "rxfontpicker"}, {"sound/dev", T_ENTRY, "soundentry"}, {"sound/8bit", T_TOGGLEBUTTON, "eightbitcheckbutton"}, {"sound/stereo", T_TOGGLEBUTTON, "stereocheckbutton"}, {"sound/fulldup", T_TOGGLEBUTTON, "rwcheckbutton"}, {"sound/srate", T_SPINBUTTON, "ratespinbutton"}, {"sound/txoffset", T_SPINBUTTON, "txppmspinbutton"}, {"sound/rxoffset", T_SPINBUTTON, "rxppmspinbutton"}, {"ptt/dev", T_ENTRY, "pttentry"}, {"ptt/inverted", T_TOGGLEBUTTON, "pttinvcheckbutton"}, {"ptt/mode", T_RADIOBUTTON, "pttrtsradiobutton", 0}, {"ptt/mode", T_RADIOBUTTON, "pttdtrradiobutton", 1}, {"ptt/mode", T_RADIOBUTTON, "pttbothradiobutton", 2}, {"wf/reflevel", T_SCALE, "wfrefvscale"}, {"wf/ampspan", T_SCALE, "wfampvscale"}, {"wf/mode", T_OPTIONMENU, "wfmodeoptionmenu"}, {"wf/zoom", T_OPTIONMENU, "wfzoomoptionmenu"}, {"wf/speed", T_OPTIONMENU, "wfspeedoptionmenu"}, {"wf/window", T_OPTIONMENU, "wfwindowoptionmenu"}, {"wf/direction", T_TOGGLEBUTTON, "wfdircheckbutton"}, {"misc/datefmt", T_ENTRY, "dateentry"}, {"misc/timefmt", T_ENTRY, "timeentry"}, {"misc/bands", T_ENTRY, "qsobandsentry"}, {"misc/logfile", T_ENTRY, "logfileentry"}, {"misc/pictxdir", T_ENTRY, "txpicdirentry"}, {"misc/picrxdir", T_ENTRY, "rxpicdirentry"}, {"misc/txoffset", T_SPINBUTTON, "txoffsetspinbutton"}, {"mfsk/squelch", T_SCALE, "mfsksqlvscale"}, {"olivia/tones", T_OPTIONMENU, "oliviatonesoptionmenu"}, {"olivia/bw", T_OPTIONMENU, "oliviabwoptionmenu"}, {"olivia/escape", T_TOGGLEBUTTON, "oliviaesccheckbutton"}, {"olivia/squelch", T_SCALE, "oliviasqlvscale"}, {"olivia/smargin", T_SPINBUTTON, "oliviasmargspinbutton"}, {"olivia/sinteg", T_SPINBUTTON, "oliviasintegspinbutton"}, {"rtty/shift", T_ENTRY_FLOAT, "rttyshiftentry"}, {"rtty/baud", T_ENTRY_FLOAT, "rttybaudentry"}, {"rtty/bits", T_OPTIONMENU, "bitsoptionmenu"}, {"rtty/parity", T_OPTIONMENU, "parityoptionmenu"}, {"rtty/stop", T_OPTIONMENU, "stopoptionmenu"}, {"rtty/reverse", T_TOGGLEBUTTON, "reversecheckbutton"}, {"rtty/msbfirst", T_TOGGLEBUTTON, "msbcheckbutton"}, {"rtty/squelch", T_SCALE, "rttysqlvscale"}, {"throb/squelch", T_SCALE, "throbsqlvscale"}, {"psk31/squelch", T_SCALE, "psk31sqlvscale"}, {"mt63/bandwidth", T_OPTIONMENU, "bwoptionmenu"}, {"mt63/interleave", T_OPTIONMENU, "ileaveoptionmenu"}, {"mt63/cwid", T_TOGGLEBUTTON, "cwidcheckbutton"}, {"mt63/escape", T_TOGGLEBUTTON, "mt63esccheckbutton"}, {"mt63/squelch", T_SCALE, "mt63sqlvscale"}, {"hell/uppercase", T_TOGGLEBUTTON, "hellcheckbutton"}, {"hell/font", T_FONTPICKER, "hellfontpicker"}, {"hell/bandwidth", T_SCALE, "hellfiltvscale"}, {"hell/agcattack", T_SCALE, "hellagc1vscale"}, {"hell/agcdecay", T_SCALE, "hellagc2vscale"}, {"cw/squelch", T_SCALE, "cwsqlvscale"}, {"cw/speed", T_SCALE, "cwspeedvscale"}, {"cw/bandwidth", T_SCALE, "cwbwvscale"}, {"hamlib/enable", T_TOGGLEBUTTON, "hamlibcheckbutton"}, {"hamlib/port", T_ENTRY, "hamlibentry"}, {"hamlib/conf", T_ENTRY, "hamlibconfentry"}, {"hamlib/wf", T_TOGGLEBUTTON, "hlwfcheckbutton"}, {"hamlib/qsodata", T_TOGGLEBUTTON, "hlqsocheckbutton"}, {"hamlib/ptt", T_TOGGLEBUTTON, "hlpttcheckbutton"}, {"hamlib/wf_res", T_OPTIONMENU, "hlresoptionmenu"}, {"hamlib/cfreq", T_SPINBUTTON, "qsyspinbutton"}, { NULL } }; static void confdialog_entry_changed(GtkEditable *editable, gpointer data) { gchar *s; gdouble f; s = gtk_editable_get_chars(editable, 0, -1); f = atof(s); if (CONFITEM(data)->type == T_ENTRY_FLOAT) conf_set_float(CONFITEM(data)->path, f); else conf_set_string(CONFITEM(data)->path, s); } static void confdialog_spinbutton_changed(GtkSpinButton *spin, gpointer data) { gdouble f; f = gtk_spin_button_get_value_as_float(spin); conf_set_float(CONFITEM(data)->path, f); } static void confdialog_colorpicker_set(GnomeColorPicker *colorpicker, guint arg1, guint arg2, guint arg3, guint arg4, gpointer data) { gchar *s = g_strdup_printf("#%02X%02X%02X", (arg1 & 0xff00) >> 8, (arg2 & 0xff00) >> 8, (arg3 & 0xff00) >> 8); conf_set_string(CONFITEM(data)->path, s); g_free(s); } static void color_picker_set_string(GnomeColorPicker *cp, const gchar *str) { GdkColor clr; gdk_color_parse(str, &clr); gnome_color_picker_set_i16(cp, clr.red, clr.green, clr.blue, 0); } static void confdialog_fontpicker_set(GnomeFontPicker *fontpicker, gchar *arg, gpointer data) { conf_set_string(CONFITEM(data)->path, arg); } static void confdialog_menu_selected(GtkMenuShell *menushell, gpointer data) { GtkWidget *activeitem; gint index; activeitem = gtk_menu_get_active(GTK_MENU(menushell)); index = g_list_index(menushell->children, activeitem); conf_set_int(CONFITEM(data)->path, index); } static void confdialog_button_toggled(GtkToggleButton *button, gpointer data) { conf_set_bool(CONFITEM(data)->path, button->active); } static void confdialog_radio_button_toggled(GtkToggleButton *button, gpointer data) { if (button->active) conf_set_int(CONFITEM(data)->path, CONFITEM(data)->radiodata); } static void confdialog_scale_changed(GtkAdjustment *adjustment, gpointer data) { conf_set_float(CONFITEM(data)->path, adjustment->value); } /* ---------------------------------------------------------------------- */ #if WANT_HAMLIB static void confdialog_speed_selected(GtkMenuShell *menushell, gpointer data) { GtkWidget *activeitem; gint i; activeitem = gtk_menu_get_active(GTK_MENU(menushell)); i = g_list_index(menushell->children, activeitem); i = riglist_get_speed_from_index(conf_get_int("hamlib/rig"), i); conf_set_int("hamlib/speed", i); } static void fill_speeds_menu(GtkWidget *dialog) { GtkWidget *menu, *menuitem, *optionmenu; gint i, s, rigid, len, *speeds; gchar *string; rigid = conf_get_int("hamlib/rig"); len = riglist_get_speeds(rigid, &speeds); optionmenu = lookup_widget(dialog, "hamlibspeedoptionmenu"); gtk_option_menu_remove_menu(GTK_OPTION_MENU(optionmenu)); menu = gtk_menu_new(); for (i = 0; i < len; i++) { string = g_strdup_printf("%d", speeds[i]); menuitem = gtk_menu_item_new_with_label(string); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show(menuitem); g_free(string); } gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu); s = conf_get_int("hamlib/speed"); i = riglist_get_index_from_speed(rigid, s); s = riglist_get_speed_from_index(rigid, i); conf_set_int("hamlib/speed", s); gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), i); g_signal_connect((gpointer) (GTK_OPTION_MENU(optionmenu)->menu), "deactivate", G_CALLBACK(confdialog_speed_selected), NULL); g_free(speeds); } static void confdialog_rig_selected(GtkMenuShell *menushell, gpointer data) { GtkWidget *activeitem; gint i; activeitem = gtk_menu_get_active(GTK_MENU(menushell)); i = g_list_index(menushell->children, activeitem); i = riglist_get_id_from_index(i); conf_set_int("hamlib/rig", i); fill_speeds_menu(GTK_WIDGET(data)); } static void fill_rigs_menu(GtkWidget *dialog) { GtkWidget *menu, *menuitem, *optionmenu; GPtrArray *list; gchar *string; gint i, len; len = riglist_get_names(&list); menu = gtk_menu_new(); for (i = 0; i < len; i++) { string = g_ptr_array_index(list, i); menuitem = gtk_menu_item_new_with_label(string); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); gtk_widget_show(menuitem); } optionmenu = lookup_widget(dialog, "hamliboptionmenu"); gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu); i = riglist_get_index_from_id(conf_get_int("hamlib/rig")); gtk_option_menu_set_history(GTK_OPTION_MENU(optionmenu), i); g_signal_connect((gpointer) (GTK_OPTION_MENU(optionmenu)->menu), "deactivate", G_CALLBACK(confdialog_rig_selected), (gpointer) dialog); } #endif /* ---------------------------------------------------------------------- */ static void confdialog_fill(GtkWidget *dialog) { ConfItem *item = confitems; GtkWidget *w; GtkAdjustment *a; gpointer obj; gchar *sig; GCallback cb; gchar *s; gint i; gdouble f; gboolean b; #if WANT_HAMLIB fill_rigs_menu(dialog); fill_speeds_menu(dialog); #endif for (item = confitems; item->path; item++) { obj = NULL; sig = NULL; cb = NULL; w = lookup_widget(dialog, item->widgetname); switch (item->type) { case T_ENTRY: s = conf_get_string(item->path); gtk_entry_set_text(GTK_ENTRY(w), s); g_free(s); obj = (gpointer) w; sig = "changed"; cb = G_CALLBACK(confdialog_entry_changed); break; case T_ENTRY_FLOAT: f = conf_get_float(item->path); s = g_strdup_printf("%g", f); gtk_entry_set_text(GTK_ENTRY(w), s); g_free(s); obj = (gpointer) w; sig = "changed"; cb = G_CALLBACK(confdialog_entry_changed); break; case T_COLORPICKER: s = conf_get_string(item->path); color_picker_set_string(GNOME_COLOR_PICKER(w), s); g_free(s); obj = (gpointer) w; sig = "color_set"; cb = G_CALLBACK(confdialog_colorpicker_set); break; case T_FONTPICKER: s = conf_get_string(item->path); gnome_font_picker_set_font_name(GNOME_FONT_PICKER(w), s); gnome_font_picker_set_mode(GNOME_FONT_PICKER(w), GNOME_FONT_PICKER_MODE_FONT_INFO); g_free(s); obj = (gpointer) w; sig = "font_set"; cb = G_CALLBACK(confdialog_fontpicker_set); break; case T_SPINBUTTON: f = conf_get_float(item->path); gtk_spin_button_set_value(GTK_SPIN_BUTTON(w), f); obj = (gpointer) w; sig = "value-changed"; cb = G_CALLBACK(confdialog_spinbutton_changed); break; case T_OPTIONMENU: i = conf_get_int(item->path); gtk_option_menu_set_history(GTK_OPTION_MENU(w), i); obj = (gpointer) (GTK_OPTION_MENU(w)->menu); sig = "deactivate"; cb = G_CALLBACK(confdialog_menu_selected); break; case T_TOGGLEBUTTON: b = conf_get_bool(item->path); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b); obj = (gpointer) w; sig = "toggled"; cb = G_CALLBACK(confdialog_button_toggled); break; case T_RADIOBUTTON: if (item->radiodata == conf_get_int(item->path)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE); obj = (gpointer) w; sig = "toggled"; cb = G_CALLBACK(confdialog_radio_button_toggled); break; case T_SCALE: f = conf_get_float(item->path); a = gtk_range_get_adjustment(GTK_RANGE(w)); gtk_adjustment_set_value(a, f); obj = (gpointer) a; sig = "value-changed"; cb = G_CALLBACK(confdialog_scale_changed); break; } g_signal_connect(obj, sig, cb, (gpointer) item); } } /* ---------------------------------------------------------------------- */ static void confdialog_respose_callback(GtkDialog *dialog, gint id, gpointer data) { GError *error = NULL; if (id == GTK_RESPONSE_HELP) { gnome_help_display("gmfsk.xml", "gmfsk-prefs", &error); if (error != NULL) { g_warning(error->message); g_error_free(error); } return; } gtk_widget_destroy(GTK_WIDGET(dialog)); g_object_set_data(G_OBJECT(appwindow), "configdialog", NULL); ConfDialog = NULL; } static void confdialog_selection_changed_callback(GtkTreeSelection *selection, gpointer data) { GtkTreeView *view; GtkTreeModel *model; GtkTreePath *path; GtkTreeIter iter; GtkWidget *notebook; GValue value = { 0 }; gint page; view = gtk_tree_selection_get_tree_view(selection); if (!gtk_tree_selection_get_selected(selection, &model, &iter)) return; gtk_tree_model_get_value(model, &iter, PAGE_NUM_COLUMN, &value); page = g_value_get_int(&value); g_value_unset(&value); notebook = lookup_widget(ConfDialog, "confnotebook"); gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), page); if (page == 0) { path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_expand_row(view, path, FALSE); } } GtkWidget *confdialog_init(void) { GtkTreeView *treeview; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreeViewColumn *column; GtkTreeModel *model; gint offset; ConfDialog = create_confdialog(); confdialog_fill(ConfDialog); g_signal_connect(G_OBJECT(ConfDialog), "response", G_CALLBACK(confdialog_respose_callback), NULL); model = GTK_TREE_MODEL(confdialog_build_tree_store()); treeview = GTK_TREE_VIEW(lookup_widget(ConfDialog, "conftreeview")); gtk_tree_view_set_model(treeview, model); g_object_unref(G_OBJECT(model)); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "xalign", 0.0, NULL); offset = gtk_tree_view_insert_column_with_attributes(treeview, -1, _("Categories"), renderer, "text", CATEGORY_COLUMN, NULL); column = gtk_tree_view_get_column(treeview, offset - 1); gtk_tree_view_column_set_clickable(column, FALSE); g_signal_connect(G_OBJECT(selection), "changed", G_CALLBACK(confdialog_selection_changed_callback), NULL); return ConfDialog; } void confdialog_select_node(const char *confpath) { TreeItem *item; GtkTreeView *view; GtkTreeModel *model; GtkTreeSelection *selection; GtkTreePath *path; GtkTreeIter iter; gchar **confpathv, **v, pathstr[8] = ""; confpathv = g_strsplit(confpath, ":", 0); item = treeitem_toplevel; v = confpathv; while (item && *v) { gint idx = 0; while (item->label && strcmp(item->label, *v)) item++, idx++; g_snprintf(pathstr + strlen(pathstr), sizeof(pathstr) - strlen(pathstr), "%d:", idx); item = item->children; v++; } if (pathstr[strlen(pathstr) - 1] == ':') pathstr[strlen(pathstr) - 1] = 0; g_strfreev(confpathv); if (!ConfDialog && !confdialog_init()) { g_warning(_("confdialog_select_node: ConfDialog init failed\n")); return; } gtk_window_present(GTK_WINDOW(ConfDialog)); view = GTK_TREE_VIEW(lookup_widget(ConfDialog, "conftreeview")); model = gtk_tree_view_get_model(view); selection = gtk_tree_view_get_selection(view); gtk_tree_view_collapse_all(view); if (!gtk_tree_model_get_iter_from_string(model, &iter, pathstr)) { g_warning(_("confdialog_select_node: tree path '%s' not found (%s)\n"), confpath, pathstr); return; } path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_expand_to_path(view, path); gtk_tree_path_free(path); gtk_tree_selection_select_iter(selection, &iter); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/confdialog.h0000644000076400007640000000203010121112023011767 /* * confdialog.h -- Configuration dialog * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _CONFDIALOG_H #define _CONFDIALOG_H extern GtkWidget *confdialog_init(void); extern void confdialog_select_node(const char *path); #endif gmfsk-0.7pre1/src/druid.c0000644000076400007640000003307510165060727011026 /* * druid.c -- First install configuration wizard. * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "interface.h" #include "support.h" #include "druid.h" #include "conf.h" #include "snd.h" /* ---------------------------------------------------------------------- */ static GtkWidget *druid; static gboolean druid_delete_cb(GtkWidget *w, GdkEvent *e, gpointer p); static void gmfskdruid_cancel_cb(GnomeDruid *g, gpointer data); static void gmfskdruid_finish_cb(GnomeDruidPage *g, GtkWidget *w, gpointer p); static void druid_fileentry_changed_cb(GtkEditable *e, gpointer p); static void druid_create_files_cb(GtkButton *b, gpointer p); static void druid_test_sound_cb(GtkButton *b, gpointer p); static gboolean druid_test_ptt_pressed_cb(GtkWidget *w, GdkEventButton *e, gpointer p); static gboolean druid_test_ptt_released_cb(GtkWidget *w, GdkEventButton *e, gpointer p); static gboolean druid_create_file(gchar *filename); static gboolean druid_create_dir(gchar *dirname); static void druid_test_sound(const gchar *path, gboolean eb, gboolean st); static void druid_init_ptt(const gchar *path, gint inv, gint mode); static void druid_set_ptt(gint ptt); static void druid_close_ptt(void); static void druid_errmsg(const gchar *fmt, ...); /* ---------------------------------------------------------------------- */ typedef enum { T_ENTRY, T_TOGGLEBUTTON, T_RADIOBUTTON, } conf_type_t; #define CONFITEM(c) ((ConfItem *) (c)) typedef struct _ConfItem ConfItem; struct _ConfItem { const gchar *path; conf_type_t type; const gchar *widgetname; gint radiodata; }; static ConfItem confitems[] = { { "info/mycall", T_ENTRY, "druid_callentry" }, { "info/myname", T_ENTRY, "druid_nameentry" }, { "info/myqth", T_ENTRY, "druid_qthentry" }, { "info/myloc", T_ENTRY, "druid_locentry" }, { "info/myemail", T_ENTRY, "druid_emailentry" }, { "misc/logfile", T_ENTRY, "druid_logfileentry" }, { "misc/pictxdir", T_ENTRY, "druid_txpicentry" }, { "misc/picrxdir", T_ENTRY, "druid_rxpicentry" }, { "info/myemail", T_ENTRY, "druid_emailentry" }, { "sound/dev", T_ENTRY, "druid_soundentry" }, { "ptt/dev", T_ENTRY, "druid_pttentry" }, {"sound/8bit", T_TOGGLEBUTTON, "druid_eightbitcheckbutton"}, {"sound/stereo", T_TOGGLEBUTTON, "druid_stereocheckbutton"}, {"ptt/inverted", T_TOGGLEBUTTON, "druid_pttinvcheckbutton"}, {"ptt/mode", T_RADIOBUTTON, "druid_pttrtsradiobutton", 0}, {"ptt/mode", T_RADIOBUTTON, "druid_pttdtrradiobutton", 1}, {"ptt/mode", T_RADIOBUTTON, "druid_pttbothradiobutton", 2}, { NULL } }; struct druidsignal { const gchar *widgetname; const gchar *signalname; GCallback callback; }; static struct druidsignal signals[] = { { "gmfskdruid", "cancel", G_CALLBACK(gmfskdruid_cancel_cb) }, { "gmfskdruidpagefinish", "finish", G_CALLBACK(gmfskdruid_finish_cb) }, { "druid_filesbutton", "clicked", G_CALLBACK(druid_create_files_cb) }, { "druid_soundtestbutton", "clicked", G_CALLBACK(druid_test_sound_cb) }, { "druid_ptttestbutton", "pressed", G_CALLBACK(druid_test_ptt_pressed_cb) }, { "druid_ptttestbutton", "released", G_CALLBACK(druid_test_ptt_released_cb) }, { "druid_logfileentry", "changed", G_CALLBACK(druid_fileentry_changed_cb) }, { "druid_txpicentry", "changed", G_CALLBACK(druid_fileentry_changed_cb) }, { "druid_rxpicentry", "changed", G_CALLBACK(druid_fileentry_changed_cb) }, { NULL } }; gboolean druid_run(void) { struct druidsignal *sig; ConfItem *item; GtkWidget *w; gchar *s; gboolean b; druid = create_druidwindow(); g_signal_connect((gpointer) druid, "delete_event", G_CALLBACK(druid_delete_cb), NULL); for (sig = signals; sig->widgetname; sig++) { w = lookup_widget(druid, sig->widgetname); g_signal_connect((gpointer) w, sig->signalname, sig->callback, NULL); } for (item = confitems; item->path; item++) { w = lookup_widget(druid, item->widgetname); switch (item->type) { case T_ENTRY: s = conf_get_string(item->path); gtk_entry_set_text(GTK_ENTRY(w), s); g_free(s); break; case T_TOGGLEBUTTON: b = conf_get_bool(item->path); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), b); break; case T_RADIOBUTTON: if (item->radiodata == conf_get_int(item->path)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE); break; default: break; } } gtk_widget_show(druid); gdk_threads_enter(); gtk_main(); gdk_threads_leave(); sound_set_conf(NULL); sound_set_flags(0); druid_close_ptt(); return TRUE; } /* ---------------------------------------------------------------------- */ gboolean druid_delete_cb(GtkWidget *w, GdkEvent *e, gpointer p) { gtk_widget_destroy(druid); gtk_main_quit(); return TRUE; } void gmfskdruid_cancel_cb(GnomeDruid *g, gpointer data) { gtk_widget_destroy(druid); gtk_main_quit(); } void gmfskdruid_finish_cb(GnomeDruidPage *g, GtkWidget *wid, gpointer p) { ConfItem *item = confitems; GtkWidget *w; gchar *s; gboolean b; for (item = confitems; item->path; item++) { w = lookup_widget(druid, item->widgetname); switch (item->type) { case T_ENTRY: s = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1); conf_set_string(item->path, s); g_free(s); break; case T_TOGGLEBUTTON: b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); conf_set_bool(item->path, b); break; case T_RADIOBUTTON: b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); if (b == TRUE) conf_set_int(item->path, item->radiodata); break; default: break; } } conf_set_int("misc/druidlevel", DRUID_LEVEL); gtk_widget_destroy(druid); gtk_main_quit(); } static void druid_fileentry_changed_cb(GtkEditable *e, gpointer p) { GtkWidget *w; w = lookup_widget(druid, "druid_filesbutton"); gtk_widget_set_sensitive(w, TRUE); } static gchar *druid_get_filename(const char *widgetname) { GtkWidget *w; GError *error = NULL; gchar *s, *name; w = lookup_widget(druid, widgetname); s = gtk_editable_get_chars(GTK_EDITABLE(w), 0, -1); name = g_filename_from_utf8(s, -1, NULL, NULL, &error); if (name == NULL) { if (error != NULL) { druid_errmsg(_("Error converting filename (%s=%s): %s"), widgetname, s, error->message); g_error_free(error); } return NULL; } g_free(s); if (name[0] == '~' && name[1] == G_DIR_SEPARATOR) { gchar *tmp; tmp = g_strdup_printf("%s%c%s", g_get_home_dir(), G_DIR_SEPARATOR, name + 2); g_free(name); name = tmp; } return name; } static void druid_create_files_cb(GtkButton *b, gpointer p) { gchar *s; s = druid_get_filename("druid_logfileentry"); if (druid_create_file(s) == FALSE) { g_free(s); return; } g_free(s); s = druid_get_filename("druid_txpicentry"); if (druid_create_dir(s) == FALSE) { g_free(s); return; } g_free(s); s = druid_get_filename("druid_rxpicentry"); if (druid_create_dir(s) == FALSE) { g_free(s); return; } g_free(s); gtk_widget_set_sensitive(GTK_WIDGET(b), FALSE); } static void druid_test_sound_cb(GtkButton *b, gpointer p) { GtkWidget *w; gboolean b1, b2; gchar *s; s = druid_get_filename("druid_soundentry"); w = lookup_widget(druid, "druid_eightbitcheckbutton"); b1 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); w = lookup_widget(druid, "druid_stereocheckbutton"); b2 = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); druid_test_sound(s, b1, b2); g_free(s); } static gboolean druid_test_ptt_pressed_cb(GtkWidget *wid, GdkEventButton *e, gpointer p) { GtkWidget *w; gboolean b; gchar *s; gint i = 0; s = druid_get_filename("druid_pttentry"); w = lookup_widget(druid, "druid_pttinvcheckbutton"); b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); w = lookup_widget(druid, "druid_pttrtsradiobutton"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)) == TRUE) i = 0; w = lookup_widget(druid, "druid_pttdtrradiobutton"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)) == TRUE) i = 1; w = lookup_widget(druid, "druid_pttbothradiobutton"); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)) == TRUE) i = 2; druid_init_ptt(s, b, i); druid_set_ptt(1); return FALSE; } static gboolean druid_test_ptt_released_cb(GtkWidget *w, GdkEventButton *e, gpointer p) { druid_set_ptt(0); return FALSE; } /* ---------------------------------------------------------------------- */ static gboolean druid_mkdir(const gchar *name) { /* don't try to create "/" */ if (*name == 0) return TRUE; if (g_file_test(name, G_FILE_TEST_EXISTS) == FALSE) { if (mkdir(name, 0755) < 0) { druid_errmsg(_("Error creating directory: %s: %m"), name); return FALSE; } return TRUE; } if (g_file_test(name, G_FILE_TEST_IS_DIR) == FALSE) { druid_errmsg(_("Error creating directory: %s exists but is not a directory"), name); return FALSE; } return TRUE; } static gboolean druid_create_file(gchar *filename) { gchar *dirname = g_path_get_dirname(filename); if (druid_create_dir(dirname) == FALSE) { g_free(dirname); return FALSE; } g_free(dirname); if (g_file_test(filename, G_FILE_TEST_EXISTS) == FALSE) { if (creat(filename, 0644) < 0) { druid_errmsg(_("Error creating file: %s: %m"), filename); return FALSE; } return TRUE; } if (g_file_test(filename, G_FILE_TEST_IS_REGULAR) == FALSE) { druid_errmsg(_("Error creating file: %s exists but is not a regular file"), filename); return FALSE; } if (access(filename, R_OK | W_OK) < 0) { druid_errmsg(_("Error: %s is not writable: %m"), filename); return FALSE; } return TRUE; } static gboolean druid_create_dir(gchar *dirname) { gchar *p; p = strchr(dirname, G_DIR_SEPARATOR); while (p) { *p = 0; if (druid_mkdir(dirname) == FALSE) return FALSE; *p = G_DIR_SEPARATOR; p = strchr(++p, G_DIR_SEPARATOR); } if (druid_mkdir(dirname) == FALSE) return FALSE; return TRUE; } /* ---------------------------------------------------------------------- */ #define SAMPLERATE 8000 #define BUFSIZE 8000 static void druid_test_sound(const gchar *path, gboolean eb, gboolean st) { snd_config_t cfg; guint flags = 0; gfloat buf[BUFSIZE], *p; gdouble f, phi = 0.0; gint i; cfg.device = path; cfg.samplerate = SAMPLERATE; cfg.txoffset = 0; cfg.rxoffset = 0; if (eb) flags |= SND_FLAG_8BIT; if (st) flags |= SND_FLAG_STEREO; sound_set_conf(&cfg); sound_set_flags(flags); g_printerr("Testing read...\n"); if (sound_open_for_read(SAMPLERATE) < 0) { druid_errmsg(_("Sound card open for read failed: %s"), sound_error()); return; } i = BUFSIZE / 4; if (sound_read(&p, &i) < 0) { druid_errmsg(_("Reading from sound card failed: %s"), sound_error()); sound_close(); return; } sound_close(); g_printerr("Testing write...\n"); if (sound_open_for_write(SAMPLERATE) < 0) { druid_errmsg(_("Sound card open for write failed: %s"), sound_error()); return; } for (i = 0; i < BUFSIZE; i++) { f = 1000.0 * sin(2.0 * M_PI * 4.0 * i / SAMPLERATE) + 1500.0; phi += 2.0 * M_PI * f / SAMPLERATE; if (phi > M_PI) phi -= 2.0 * M_PI; buf[i] = 0.5 * sin(phi); } if (sound_write(buf, BUFSIZE) < 0) { druid_errmsg(_("Reading from sound card failed: %s"), sound_error()); sound_close(); return; } sound_close(); } /* ---------------------------------------------------------------------- */ static gint pttfd = -1; static gint pttinv = 0; static gint pttarg = TIOCM_RTS | TIOCM_DTR; static void druid_init_ptt(const gchar *path, gint inv, gint mode) { druid_close_ptt(); pttinv = inv; switch (mode) { case 0: pttarg = TIOCM_RTS; break; case 1: pttarg = TIOCM_DTR; break; case 2: pttarg = TIOCM_RTS | TIOCM_DTR; break; } if (!strcasecmp(path, "none")) return; if ((pttfd = open(path, O_RDWR, 0)) < 0) druid_errmsg(_("Cannot open PTT device '%s': %m"), path); } static void druid_set_ptt(gint ptt) { int arg = pttarg; if (pttfd == -1) return; if (pttinv) ptt = !ptt; if (ioctl(pttfd, ptt ? TIOCMBIS : TIOCMBIC, &arg) < 0) druid_errmsg(_("set_ptt: ioctl: %m")); } static void druid_close_ptt(void) { if (pttfd == -1) return; close(pttfd); } /* ---------------------------------------------------------------------- */ static void druid_errmsg(const gchar *fmt, ...) { GtkWidget *dialog; va_list args; gchar *msg; va_start(args, fmt); msg = g_strdup_vprintf(fmt, args); va_end(args); dialog = gtk_message_dialog_new(GTK_WINDOW(druid), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "%s", msg); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); g_free(msg); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/druid.h0000644000076400007640000000206607761165370011037 /* * druid.h -- First install configuration wizard. * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _DRUID_H #define _DRUID_H #ifdef __cplusplus extern "C" { #endif #define DRUID_LEVEL 1 extern gboolean druid_run(void); #ifdef __cplusplus } #endif #endif gmfsk-0.7pre1/src/hamlib.c0000644000076400007640000002746510175006655011162 /* * hamlib.c -- Hamlib (rig control) interface * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #if WANT_HAMLIB #include #include #include #include "support.h" #include "hamlib.h" #include "main.h" #include "conf.h" #include "qsodata.h" #include "trx.h" static GSList *riglist = NULL; static GPtrArray *rignames = NULL; static gint riglist_compare_func(gconstpointer a, gconstpointer b); static gint riglist_make_list(const struct rig_caps *caps, gpointer data); /* ---------------------------------------------------------------------- */ GSList *riglist_get_list(void) { if (riglist == NULL) { rig_set_debug(RIG_DEBUG_NONE); rig_load_all_backends(); rig_set_debug(RIG_DEBUG_ERR); rig_list_foreach(riglist_make_list, NULL); } return riglist; } gint riglist_get_names(GPtrArray **list) { gint i, len; if (riglist == NULL) riglist_get_list(); if (rignames != NULL) { *list = rignames; return g_slist_length(riglist); } len = g_slist_length(riglist); rignames = g_ptr_array_sized_new(len); for (i = 0; i < len; i++) { struct rig_caps *rig = g_slist_nth_data(riglist, i); gchar *name; name = g_strdup_printf("%s %s", rig->mfg_name, rig->model_name); g_ptr_array_add(rignames, (gpointer) name); } *list = rignames; return len; } gint riglist_get_id_from_index(gint idx) { struct rig_caps *rig; g_return_val_if_fail(riglist != NULL, 0); if ((rig = g_slist_nth_data(riglist, idx)) == NULL) return 0; return rig->rig_model; } gint riglist_get_index_from_id(gint id) { gint i, len; g_return_val_if_fail(riglist != NULL, 0); len = g_slist_length(riglist); for (i = 0; i < len; i++) { struct rig_caps *rig = g_slist_nth_data(riglist, i); if (rig->rig_model == id) return i; } return 0; } /* ---------------------------------------------------------------------- */ static const gint speedlist[] = { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, -1 }; gint riglist_get_speeds(gint rigid, gint **speeds) { struct rig_caps *rig; gint i, n, len, *list; if (riglist == NULL) riglist_get_list(); rig = g_slist_nth_data(riglist, riglist_get_index_from_id(rigid)); for (len = i = 0; speedlist[i] > 0; i++) { if (speedlist[i] > rig->serial_rate_max) break; if (speedlist[i] >= rig->serial_rate_min) len++; } list = g_new(gint, len); for (n = i = 0; speedlist[i] > 0; i++) { if (speedlist[i] > rig->serial_rate_max) break; if (speedlist[i] >= rig->serial_rate_min) list[n++] = speedlist[i]; } *speeds = list; return len; } gint riglist_get_index_from_speed(gint rigid, gint speed) { gint i, len, *speeds; if ((len = riglist_get_speeds(rigid, &speeds)) == 0) return 0; for (i = 0; i < len; i++) if (speeds[i] == speed) break; /* default to the largest speed */ if (i == len) i = len - 1; g_free(speeds); return i; } gint riglist_get_speed_from_index(gint rigid, gint idx) { gint i, len, *speeds; if ((len = riglist_get_speeds(rigid, &speeds)) == 0) return 0; if (idx >= 0 && idx < len) i = speeds[idx]; else i = 0; g_free(speeds); return i; } /* ---------------------------------------------------------------------- */ static gint riglist_make_list(const struct rig_caps *caps, gpointer data) { riglist = g_slist_insert_sorted(riglist, (gpointer) caps, riglist_compare_func); return 1; } static gint riglist_compare_func(gconstpointer a, gconstpointer b) { const struct rig_caps *rig1 = a; const struct rig_caps *rig2 = b; gint ret; if ((ret = strcmp(rig1->mfg_name, rig2->mfg_name)) != 0) return ret; if ((ret = strcmp(rig1->model_name, rig2->model_name)) != 0) return ret; return rig1->rig_model - rig2->rig_model; } /* ---------------------------------------------------------------------- */ G_LOCK_DEFINE_STATIC(hamlib_mutex); static RIG *rig = NULL; static pthread_t hamlib_thread; static gboolean hamlib_exit = FALSE; static gboolean hamlib_waterfall; static gboolean hamlib_qsodata; static gboolean hamlib_ptt; static gboolean hamlib_qsy; static gint hamlib_res; static gboolean need_freq; static gboolean need_mode; static void *hamlib_loop(void *args); void hamlib_set_conf(gboolean wf, gboolean qd, gboolean ptt, gint res) { hamlib_waterfall = wf; hamlib_qsodata = qd; hamlib_ptt = ptt; hamlib_res = res; need_freq = (wf == TRUE || qd == TRUE) ? TRUE : FALSE; need_mode = need_freq; if (!hamlib_waterfall) { waterfall_set_carrier_frequency(waterfall, 0.0); waterfall_set_lsb(waterfall, FALSE); } if (!hamlib_qsodata) qsodata_set_band_mode(QSODATA_BAND_COMBO); } static gboolean hamlib_set_param(const gchar *par, const gchar *val) { token_t t; gint ret; g_return_val_if_fail(rig != NULL, FALSE); if ((t = rig_token_lookup(rig, par)) == RIG_CONF_END) { errmsg(_("Hamlib init: Bad rig config parameter: '%s'"), par); return FALSE; } if ((ret = rig_set_conf(rig, t, val)) != RIG_OK) { errmsg(_("Hamlib init: rig_set_conf failed (%s=%s): %s"), par, val, rigerror(ret)); return FALSE; } return TRUE; } void hamlib_init(void) { rig_model_t model; struct timespec sleep; freq_t freq; rmode_t mode; pbwidth_t width; gboolean enable; gchar *port, *conf, *spd; gint ret, speed; if (rig != NULL) return; enable = conf_get_bool("hamlib/enable"); model = conf_get_int("hamlib/rig"); port = conf_get_filename("hamlib/port"); speed = conf_get_int("hamlib/speed"); conf = conf_get_string("hamlib/conf"); if (!enable || !model || port[0] == 0) return; rig_set_debug(RIG_DEBUG_ERR); rig = rig_init(model); if (rig == NULL) { errmsg(_("Hamlib init: rig_init failed (model=%d)"), model); return; } g_strstrip(conf); if (conf[0]) { gchar **v, **p, *q; v = g_strsplit(conf, ",", 0); for (p = v; *p; p++) { if ((q = strchr(*p, '=')) == NULL) { errmsg(_("Hamlib init: Bad param=value pair: '%s'"), *p); break; } *q++ = 0; g_strstrip(*p); g_strstrip(q); if (hamlib_set_param(*p, q) == FALSE) break; } g_strfreev(v); } g_free(conf); hamlib_set_param("rig_pathname", port); g_free(port); spd = g_strdup_printf("%d", speed); hamlib_set_param("serial_speed", spd); g_free(spd); ret = rig_open(rig); if (ret != RIG_OK) { errmsg(_("Hamlib init: rig_open failed: %s"), rigerror(ret)); rig_cleanup(rig); rig = NULL; return; } /* Polling the rig sometimes fails right after opening it */ sleep.tv_sec = 0; sleep.tv_nsec = 100000000L; /* 100ms */ nanosleep(&sleep, NULL); if (need_freq == TRUE && \ (ret = rig_get_freq(rig, RIG_VFO_CURR, &freq)) != RIG_OK) { errmsg(_("Hamlib init: rig_get_freq failed: %s"), rigerror(ret)); hamlib_waterfall = FALSE; hamlib_qsodata = FALSE; need_freq = FALSE; need_mode = FALSE; } if (need_mode == TRUE && (ret = rig_get_mode(rig, RIG_VFO_CURR, &mode, &width)) != RIG_OK) { errmsg(_("Hamlib init: rig_get_mode failed: %s.\nAssuming USB mode."), rigerror(ret)); need_mode = FALSE; } if (hamlib_ptt == TRUE && (ret = rig_set_ptt(rig, RIG_VFO_CURR, RIG_PTT_OFF)) != RIG_OK) { errmsg(_("Hamlib init: rig_set_ptt failed: %s.\nHamlib PTT disabled"), rigerror(ret)); hamlib_ptt = FALSE; } /* Don't create the thread if frequency data is not needed */ if (need_freq == FALSE) { /* If PTT isn't needed either then close everything */ if (hamlib_ptt == FALSE) { rig_close(rig); rig_cleanup(rig); rig = NULL; } return; } if (pthread_create(&hamlib_thread, NULL, hamlib_loop, NULL) < 0) { errmsg(_("Hamlib init: pthread_create: %m")); rig_close(rig); rig_cleanup(rig); rig = NULL; } } void hamlib_close(void) { if (rig == NULL) return; /* tell the hamlib thread to kill it self */ hamlib_exit = TRUE; /* and the wait for it to die */ pthread_join(hamlib_thread, NULL); hamlib_exit = FALSE; G_LOCK(hamlib_mutex); rig_close(rig); rig_cleanup(rig); rig = NULL; G_UNLOCK(hamlib_mutex); } gboolean hamlib_active(void) { return (rig != NULL); } void hamlib_set_ptt(gint ptt) { gint ret; if (!rig || !hamlib_ptt) return; G_LOCK(hamlib_mutex); ret = rig_set_ptt(rig, RIG_VFO_CURR, ptt ? RIG_PTT_ON : RIG_PTT_OFF); if (ret != RIG_OK) { errmsg(_("rig_set_ptt failed: %s.\nHamlib PTT disabled.\n"), rigerror(ret)); hamlib_ptt = FALSE; } G_UNLOCK(hamlib_mutex); } void hamlib_set_qsy(void) { if (rig == NULL) return; hamlib_qsy = TRUE; } static void *hamlib_loop(void *args) { struct timespec sleep; gdouble freq = 0.0; rmode_t mode = RIG_MODE_USB; gint ret; gchar *str; sleep.tv_sec = 0; sleep.tv_nsec = 100000000L; /* 100ms */ for (;;) { nanosleep(&sleep, NULL); // need_freq = (hamlib_waterfall || hamlib_qsodata || hamlib_qsy); // need_mode = need_freq; /* see if we are being canceled */ if (hamlib_exit) break; if (need_freq) { freq_t f; G_LOCK(hamlib_mutex); ret = rig_get_freq(rig, RIG_VFO_CURR, &f); G_UNLOCK(hamlib_mutex); if (ret != RIG_OK) { str = g_strdup_printf(_("rig_get_freq failed: %s"), rigerror(ret)); statusbar_set_main(str); g_free(str); continue; } freq = (gdouble) f; } /* see if we are being canceled */ if (hamlib_exit) break; if (need_mode) { pbwidth_t width; G_LOCK(hamlib_mutex); ret = rig_get_mode(rig, RIG_VFO_CURR, &mode, &width); G_UNLOCK(hamlib_mutex); if (ret != RIG_OK) { str = g_strdup_printf(_("rig_get_mode failed: %s"), rigerror(ret)); statusbar_set_main(str); g_free(str); continue; } } if (hamlib_qsy) { gfloat f = conf_get_float("hamlib/cfreq"); hamlib_qsy = FALSE; G_LOCK(hamlib_mutex); ret = rig_set_freq(rig, RIG_VFO_CURR, ((gdouble) freq) + trx_get_freq() - f); G_UNLOCK(hamlib_mutex); if (ret != RIG_OK) { str = g_strdup_printf(_("rig_set_freq failed: %s"), rigerror(ret)); statusbar_set_main(str); g_free(str); continue; } waterfall_set_frequency(waterfall, f); } if (hamlib_waterfall) { waterfall_set_carrier_frequency(waterfall, freq); if (mode == RIG_MODE_LSB) waterfall_set_lsb(waterfall, TRUE); else waterfall_set_lsb(waterfall, FALSE); } if (hamlib_qsodata) { gchar *str, *fmt; if (mode == RIG_MODE_LSB) freq -= trx_get_freq(); else freq += trx_get_freq(); switch (hamlib_res) { case 2: fmt = "%.6f"; break; case 1: fmt = "%.3f"; break; case 0: default: fmt = "%.0f"; break; } str = g_strdup_printf(fmt, freq / 1000000.0); gdk_threads_enter(); qsodata_set_band_mode(QSODATA_BAND_ENTRY); qsodata_set_freq(str); gdk_threads_leave(); g_free(str); } /* see if we are being canceled */ if (hamlib_exit) break; } if (hamlib_waterfall) { waterfall_set_carrier_frequency(waterfall, 0.0); waterfall_set_lsb(waterfall, FALSE); } if (hamlib_qsodata) { gdk_threads_enter(); qsodata_set_band_mode(QSODATA_BAND_COMBO); qsodata_set_freq(""); gdk_threads_leave(); } /* this will exit the hamlib thread */ return NULL; } /* ---------------------------------------------------------------------- */ #endif gmfsk-0.7pre1/src/hamlib.h0000644000076400007640000000304010174551365011150 /* * hamlib.h -- Hamlib (rig control) interface * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _HAMLIB_H #define _HAMLIB_H extern GSList *riglist_get_list(void); extern gint riglist_get_names(GPtrArray **list); extern gint riglist_get_id_from_index(gint idx); extern gint riglist_get_index_from_id(gint id); extern gint riglist_get_speeds(gint rigid, gint **speeds); extern gint riglist_get_index_from_speed(gint rigid, gint speed); extern gint riglist_get_speed_from_index(gint rigid, gint idx); extern void hamlib_init(void); extern void hamlib_close(void); extern gboolean hamlib_active(void); extern void hamlib_set_ptt(gint ptt); extern void hamlib_set_qsy(void); extern void hamlib_set_conf(gboolean, gboolean, gboolean, gint); #endif gmfsk-0.7pre1/src/log.c0000644000076400007640000000562210165573622010500 /* * log.c -- Received text logging * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "support.h" #include "main.h" #include "conf.h" #include "log.h" G_LOCK_DEFINE_STATIC(log_mutex); static FILE *logfile = NULL; static gboolean retflag = TRUE; static log_t logtype = LOG_RX; static gchar *lognames[] = { "RX", "TX" }; /* ---------------------------------------------------------------------- */ #define TIMESTR_BUF_LEN 64 void log_to_file(log_t type, const gchar *s) { gchar timestr[TIMESTR_BUF_LEN]; struct tm *tm; time_t t; G_LOCK(log_mutex); if (!logfile) { G_UNLOCK(log_mutex); return; } /* add timestamp to logged data */ time(&t); tm = gmtime(&t); strftime(timestr, TIMESTR_BUF_LEN, "%Y-%m-%d %H:%M", tm); timestr[TIMESTR_BUF_LEN - 1] = 0; if (retflag) fprintf(logfile, "%s (%sZ): ", lognames[type], timestr); else if (logtype != type) fprintf(logfile, "\n%s (%sZ): ", lognames[type], timestr); if (fputs(s, logfile) == EOF || fflush(logfile) == EOF) { errmsg(_("Error writing to log file: %m")); fclose(logfile); logfile = NULL; } if (s[strlen(s) - 1] == '\n') retflag = TRUE; else retflag = FALSE; logtype = type; G_UNLOCK(log_mutex); } static void log_to_file_start(void) { time_t t; gchar *str; time(&t); str = asctime(gmtime(&t)); str[strlen(str) - 1] = 0; fprintf(logfile, _("\n--- Logging started at %s UTC ---\n"), str); } static void log_to_file_stop(void) { time_t t; gchar *str; time(&t); str = asctime(gmtime(&t)); str[strlen(str) - 1] = 0; fprintf(logfile, _("\n--- Logging stopped at %s UTC ---\n"), str); } gboolean log_to_file_activate(gboolean start) { gchar *logfilename; gboolean ret = TRUE; G_LOCK(log_mutex); if (start) { if (!logfile) { logfilename = conf_get_logfile(); if ((logfile = fopen(logfilename, "a")) == NULL) ret = FALSE; else log_to_file_start(); g_free(logfilename); } } else { if (logfile) { log_to_file_stop(); fclose(logfile); logfile = NULL; } } G_UNLOCK(log_mutex); return ret; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/log.h0000644000076400007640000000210207725503071010472 /* * log.h -- Received text logging * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _LOG_H #define _LOG_H typedef enum { LOG_RX = 0, LOG_TX = 1 } log_t; extern gboolean log_to_file_activate(gboolean start); extern void log_to_file(log_t type, const gchar *s); #endif gmfsk-0.7pre1/src/macro.c0000644000076400007640000002274210165060727011017 /* * macro.c -- Fixtexts and macros * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "support.h" #include "main.h" #include "conf.h" #include "qsodata.h" #include "macro.h" #include "interface.h" #include "trx.h" #include "picture.h" #define NUMMACROS 12 struct macro { gchar *name; gchar *text; }; static struct macro macros[NUMMACROS]; #define confcpy(d,s) { strncpy((d),(s),sizeof(d)); d[sizeof(d)-1] = 0; } static GtkWidget *macroconfigwin = NULL; /* ---------------------------------------------------------------------- */ static void set_macro_button_names(void) { GtkButton *button; GtkLabel *label; gchar *str; gint i; for (i = 0; i < NUMMACROS; i++) { str = g_strdup_printf("macrobutton%d", i + 1); button = GTK_BUTTON(lookup_widget(appwindow, str)); label = GTK_LABEL(GTK_BIN(button)->child); g_free(str); str = g_strdup_printf("%s (F%d)", macros[i].name, i + 1); gtk_label_set_text(label, str); g_free(str); } } /* ---------------------------------------------------------------------- */ static void fill_macroconfig(GtkWidget *win, gint n) { GtkEntry *entry; GtkTextView *view; GtkTextBuffer *buffer; gchar *str; /* should not happen... */ if (n < 1 || n > NUMMACROS) { errmsg(_("fill_macroconfig: invalid macro number %d\n"), n); return; } str = g_strdup_printf("Macro %d", n); gtk_window_set_title(GTK_WINDOW(win), str); g_free(str); g_object_set_data(G_OBJECT(win), "macronumber", GINT_TO_POINTER(n)); entry = GTK_ENTRY(lookup_widget(win, "macroconfigentry")); gtk_entry_set_text(entry, macros[n - 1].name); if (!macros[n - 1].text) return; view = GTK_TEXT_VIEW(lookup_widget(win, "macroconfigtext")); buffer = gtk_text_view_get_buffer(view); gtk_text_buffer_set_text(buffer, macros[n - 1].text, -1); } static void apply_macroconfig(GtkWidget *win) { GtkEditable *editable; GtkTextView *view; GtkTextBuffer *buf; GtkTextIter start, end; gchar *key; gint n; n = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(win), "macronumber")); if (n < 1 || n > NUMMACROS) { errmsg(_("apply_macroconfig: invalid macro number %d\n"), n); return; } editable = GTK_EDITABLE(lookup_widget(win, "macroconfigentry")); g_free(macros[n - 1].name); macros[n - 1].name = gtk_editable_get_chars(editable, 0, -1); view = GTK_TEXT_VIEW(lookup_widget(win, "macroconfigtext")); buf = gtk_text_view_get_buffer(view); gtk_text_buffer_get_bounds(buf, &start, &end); g_free(macros[n - 1].text); macros[n - 1].text = gtk_text_buffer_get_text(buf, &start, &end, FALSE); key = g_strdup_printf("macro/name%d", n); conf_set_string(key, macros[n - 1].name); g_free(key); key = g_strdup_printf("macro/text%d", n); conf_set_string(key, macros[n - 1].text); g_free(key); set_macro_button_names(); } /* ---------------------------------------------------------------------- */ void macroconfig_load(void) { gchar *key; gint i; for (i = 0; i < NUMMACROS; i++) { key = g_strdup_printf("macro/name%d", i + 1); macros[i].name = conf_get_string(key); g_free(key); key = g_strdup_printf("macro/text%d", i + 1); macros[i].text = conf_get_string(key); g_free(key); } set_macro_button_names(); } /* ---------------------------------------------------------------------- */ static void macroconfig_response_callback(GtkDialog *dialog, gint id, gpointer data) { GError *error = NULL; GtkWidget *w; GtkTextBuffer *b; switch (id) { case GTK_RESPONSE_HELP: gnome_help_display("gmfsk.xml", "gmfsk-settings-menu", &error); if (error != NULL) { errmsg(error->message); g_error_free(error); } return; case GTK_RESPONSE_REJECT: w = lookup_widget(GTK_WIDGET(dialog), "macroconfigentry"); gtk_editable_delete_text(GTK_EDITABLE(w), 0, -1); w = lookup_widget(GTK_WIDGET(dialog), "macroconfigtext"); b = gtk_text_view_get_buffer(GTK_TEXT_VIEW(w)); gtk_text_buffer_set_text(b, "", -1); break; case GTK_RESPONSE_OK: apply_macroconfig(GTK_WIDGET(dialog)); /* note fall-trough */ default: /* CANCEL and NONE */ gtk_widget_destroy(GTK_WIDGET(dialog)); macroconfigwin = NULL; break; } } void macroconfig(gint n) { if (macroconfigwin) { gtk_window_present(GTK_WINDOW(macroconfigwin)); return; } macroconfigwin = create_macroconfigdialog(); fill_macroconfig(macroconfigwin, n); g_signal_connect(G_OBJECT(macroconfigwin), "response", G_CALLBACK(macroconfig_response_callback), NULL); gtk_widget_show(macroconfigwin); } /* ---------------------------------------------------------------------- */ static void run_command(gchar *cmd) { gchar *outbuf; GError *error = NULL; gboolean ret; cmd++; /* skip '(' */ cmd[strlen(cmd) - 1] = 0; /* delete ')' */ ret = g_spawn_command_line_sync(cmd, &outbuf, NULL, NULL, &error); if (ret == FALSE || outbuf == NULL) { if (error) { errmsg(_("run_command: %s"), error->message); g_error_free(error); } } if (outbuf == NULL) return; /* delete the last end-of-line if there is one */ if (outbuf[strlen(outbuf) - 1] == '\n') outbuf[strlen(outbuf) - 1] = 0; send_string(outbuf); g_free(outbuf); } static void send_time(const gchar *fmt, gboolean utc) { gchar buf[256]; struct tm *tm; time_t t; time(&t); if (utc) tm = gmtime(&t); else tm = localtime(&t); strftime(buf, sizeof(buf), fmt, tm); buf[sizeof(buf) - 1] = 0; send_string(buf); } /* ---------------------------------------------------------------------- */ static gchar *getword(gchar **ptr) { gchar *word, *p; switch (**ptr) { case '(': if ((p = strchr(*ptr, ')')) == NULL) return NULL; p++; break; case '{': if ((p = strchr(*ptr, '}')) == NULL) return NULL; p++; break; default: for (p = *ptr; *p && isalnum(*p); p++) ; break; } word = g_memdup(*ptr, p - *ptr + 1); word[p - *ptr] = 0; *ptr = p; return word; } void send_macro(gint n) { gchar *p, *str, *word; gunichar c; /* should not happen... */ if (n < 1 || n > NUMMACROS) { errmsg(_("send_macro: invalid macro number %d\n"), n); return; } str = g_strdup(macros[n - 1].text); p = str; while (p && *p) { c = g_utf8_get_char(p); p = g_utf8_next_char(p); if (c == '$') { gchar *cmd = NULL; gchar *arg = NULL; word = getword(&p); if (word == NULL) continue; switch (*word) { case '(': run_command(word); g_free(word); continue; case '{': cmd = word + 1; word[strlen(word) - 1] = 0; break; default: cmd = word; break; } if ((arg = strchr(cmd, ':')) != NULL) *arg++ = 0; if (!strcasecmp(cmd, "$")) send_char('$'); /* * Version string */ if (!strcasecmp(cmd, "soft")) send_string(SoftString); /* * Buttons */ if (!strcasecmp(cmd, "tx")) push_button("txbutton"); if (!strcasecmp(cmd, "rx")) send_char(TRX_RX_CMD); /* * My station info */ if (!strcasecmp(cmd, "mycall")) send_string(conf_get_mycall()); if (!strcasecmp(cmd, "myname")) send_string(conf_get_myname()); if (!strcasecmp(cmd, "myqth")) send_string(conf_get_myqth()); if (!strcasecmp(cmd, "myloc")) send_string(conf_get_myloc()); if (!strcasecmp(cmd, "myemail")) send_string(conf_get_myemail()); /* * Time and date */ if (!strcasecmp(cmd, "time")) send_time(conf_get_timefmt(), FALSE); if (!strcasecmp(cmd, "utctime")) send_time(conf_get_timefmt(), TRUE); if (!strcasecmp(cmd, "date")) send_time(conf_get_datefmt(), FALSE); if (!strcasecmp(cmd, "utcdate")) send_time(conf_get_datefmt(), TRUE); /* * QSO data */ if (!strcasecmp(cmd, "call")) send_string(qsodata_get_call()); if (!strcasecmp(cmd, "band")) send_string(qsodata_get_band()); if (!strcasecmp(cmd, "rxrst")) send_string(qsodata_get_rxrst()); if (!strcasecmp(cmd, "txrst")) send_string(qsodata_get_txrst()); if (!strcasecmp(cmd, "name")) send_string(qsodata_get_name()); if (!strcasecmp(cmd, "qth")) send_string(qsodata_get_qth()); if (!strcasecmp(cmd, "notes")) send_string(qsodata_get_notes()); /* * QSO logging */ if (!strcasecmp(cmd, "startqso")) qsodata_set_starttime(TRUE); if (!strcasecmp(cmd, "logqso")) qsodata_log(); if (!strcasecmp(cmd, "clearqso")) qsodata_clear(); /* * Mode */ if (!strcasecmp(cmd, "mode")) send_string(trx_get_mode_name()); /* * Pictures */ if (!strcasecmp(cmd, "pic")) picture_send(arg, FALSE); if (!strcasecmp(cmd, "picc")) picture_send(arg, TRUE); /* an unknown macro gets ignored */ g_free(word); continue; } send_char(c); } g_free(str); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/macro.h0000644000076400007640000000547007725503071011025 /* * macro.h -- Fixtexts and macros * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _MACRO_H #define _MACRO_H 1 /* ---------------------------------------------------------------------- */ extern void macroconfig_load(void); extern void macroconfig(gint n); extern void macroconfig_clear(void); extern void macroconfig_close(gboolean save); extern void macroconfig_delete(void); extern void send_macro(gint n); /* ---------------------------------------------------------------------- */ #define MACRODEF1NAME "" #define MACRODEF1TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF2NAME "" #define MACRODEF2TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF3NAME "" #define MACRODEF3TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF4NAME "" #define MACRODEF4TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF5NAME "" #define MACRODEF5TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF6NAME "" #define MACRODEF6TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF7NAME "" #define MACRODEF7TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF8NAME "" #define MACRODEF8TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF9NAME "" #define MACRODEF9TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF10NAME "" #define MACRODEF10TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF11NAME "" #define MACRODEF11TEXT "" /* ---------------------------------------------------------------------- */ #define MACRODEF12NAME "" #define MACRODEF12TEXT "" /* ---------------------------------------------------------------------- */ #endif gmfsk-0.7pre1/src/ptt.c0000644000076400007640000000677710165060727010537 /* * ptt.c -- PTT control * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #ifdef HAVE_LINUX_PPDEV_H #include #endif #include "main.h" #include "ptt.h" #include "hamlib.h" #include "cwirc.h" /* ---------------------------------------------------------------------- */ static gint openptt(void); static gint pttfd = -1; static gint pttinv = 0; static gint pttarg = TIOCM_RTS | TIOCM_DTR; static gchar *pttpath = NULL; static enum { NOPORT, SERPORT, PARPORT } pttmode = NOPORT; /* ---------------------------------------------------------------------- */ void ptt_init(const gchar *path, gint inverted, gint mode) { if (cwirc_extension_mode) return; /* If it's open then close it */ ptt_close(); pttinv = inverted; switch (mode) { case 0: pttarg = TIOCM_RTS; break; case 1: pttarg = TIOCM_DTR; break; case 2: pttarg = TIOCM_RTS | TIOCM_DTR; break; } g_free(pttpath); if (!strcasecmp(path, "none")) pttpath = NULL; else pttpath = g_strdup(path); } void ptt_close(void) { if (pttfd != -1) { #ifdef HAVE_LINUX_PPDEV_H if (pttmode == PARPORT) ioctl(pttfd, PPRELEASE); #endif close(pttfd); pttfd = -1; } } void ptt_set(gint ptt) { if (cwirc_extension_mode) return; #if WANT_HAMLIB /* try hamlib ptt first */ hamlib_set_ptt(ptt); #endif if (!pttpath) return; /* If it's closed, try to open it */ if (pttfd < 0 && (pttfd = openptt()) < 0) return; if (pttinv) ptt = !ptt; else ptt = !!ptt; if (pttmode == SERPORT) { guint arg = pttarg; if (ioctl(pttfd, ptt ? TIOCMBIS : TIOCMBIC, &arg) < 0) errmsg(_("set_ptt: ioctl: %m")); } #ifdef HAVE_LINUX_PPDEV_H if (pttmode == PARPORT) { guchar arg = ptt; if (ioctl(pttfd, PPWDATA, &arg) < 0) errmsg(_("set_ptt: ioctl: %m")); } #endif } /* ---------------------------------------------------------------------- */ static gint openptt(void) { gint fd; guint serarg = TIOCM_RTS | TIOCM_DTR; #ifdef HAVE_LINUX_PPDEV_H guchar pararg; #endif if ((fd = open(pttpath, O_RDWR, 0)) < 0) { errmsg(_("Cannot open PTT device '%s': %m"), pttpath); return -1; } pttmode = NOPORT; #ifdef HAVE_LINUX_PPDEV_H if (!ioctl(fd, PPCLAIM, 0) && !ioctl(fd, PPRDATA, ¶rg)) pttmode = PARPORT; #endif if (pttmode == NOPORT && !ioctl(fd, TIOCMBIC, &serarg)) pttmode = SERPORT; if (pttmode == NOPORT) { #ifdef HAVE_LINUX_PPDEV_H errmsg(_("Device '%s' is neither a parallel nor a serial port"), pttpath); #else errmsg(_("Device '%s' is not a serial port"), pttpath); #endif return -1; } return fd; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/ptt.h0000644000076400007640000000204010015252257010512 /* * ptt.h -- PTT control * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _PTT_H #define _PTT_H extern void ptt_init(const gchar *path, gint inverted, gint mode); extern void ptt_close(void); extern void ptt_set(gint ptt); #endif gmfsk-0.7pre1/src/qsodata.c0000644000076400007640000002100610165574345011350 /* * qsodata.c -- QSO data area functions * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "support.h" #include "main.h" #include "qsodata.h" #include "remlog.h" #include "trx.h" #define FIELD_LEN 256 static gchar call[FIELD_LEN] = ""; static gchar band[FIELD_LEN] = ""; static gchar txrst[FIELD_LEN] = ""; static gchar rxrst[FIELD_LEN] = ""; static gchar name[FIELD_LEN] = ""; static gchar qth[FIELD_LEN] = ""; static gchar loc[FIELD_LEN] = ""; static gchar notes[FIELD_LEN] = ""; static time_t starttime = 0; static GtkWidget *qsobandcombo = NULL; static GtkWidget *qsobandentry = NULL; /* ---------------------------------------------------------------------- */ static msgtype msgbuf; static void log_msg_reset(void) { msgbuf.mtext[0] = 0; } static void log_msg_append(gchar *type, gchar *data) { gchar *entry; entry = g_strdup_printf("%s:%s%c", type, data, LOG_MSEPARATOR); if (strlen(msgbuf.mtext) + strlen(entry) + 1 > LOG_MSG_LEN) { g_warning(_("log message too long, entry dropped: %s\n"), entry); g_free(entry); return; } strcat(msgbuf.mtext, entry); g_free(entry); } static int log_msg_send(void) { gint msqid, len; if ((msqid = msgget(LOG_MKEY, 0666 | IPC_CREAT)) == -1) { g_print("msgget: %s\n", strerror(errno)); return -1; } msgbuf.mtype = LOG_MTYPE; /* allow for the NUL */ len = strlen(msgbuf.mtext) + 1; if (msgsnd(msqid, &msgbuf, len, IPC_NOWAIT) < 0) { g_print("msgsnd: %m\n"); return -1; } #if 0 g_print("msg sent: (%02ld) '%s'\n", msgbuf.mtype, msgbuf.mtext); #endif return 0; } /* ---------------------------------------------------------------------- */ static void qsodata_set_entry(const gchar *name, gchar *str) { GtkWidget *w; if ((w = lookup_widget(appwindow, name)) != NULL) gtk_entry_set_text(GTK_ENTRY(w), str); } static void qsodata_init_band(void) { GtkWidget *e; gchar *s; g_return_if_fail(qsobandcombo); e = GTK_COMBO(qsobandcombo)->entry; s = gtk_editable_get_chars(GTK_EDITABLE(e), 0, -1); g_strlcpy(band, s, FIELD_LEN); g_free(s); } void qsodata_clear(void) { qsodata_set_entry("qsocallentry", ""); qsodata_set_entry("qsotxrstentry", ""); qsodata_set_entry("qsorxrstentry", ""); qsodata_set_entry("qsonameentry", ""); qsodata_set_entry("qsoqthentry", ""); qsodata_set_entry("qsolocentry", ""); qsodata_set_entry("qsonotesentry", ""); qsodata_init_band(); call[0] = '\0'; txrst[0] = '\0'; rxrst[0] = '\0'; name[0] = '\0'; qth[0] = '\0'; loc[0] = '\0'; notes[0] = '\0'; starttime = 0; } void qsodata_log(void) { char date[32], stime[32], etime[32], *mode; struct tm *tm; time_t t; g_strup(call); tm = gmtime(&starttime); strftime(date, sizeof(date), "%d %b %Y", tm); strftime(stime, sizeof(stime), "%H%M", tm); time(&t); tm = gmtime(&t); strftime(etime, sizeof(etime), "%H%M", tm); mode = trx_get_mode_name(); log_msg_reset(); log_msg_append("program", "gMFSK v" VERSION); log_msg_append("version", LOG_MVERSION); log_msg_append("date", date); log_msg_append("time", stime); log_msg_append("endtime", etime); log_msg_append("call", call); log_msg_append("mhz", band); log_msg_append("mode", mode); log_msg_append("tx", txrst); log_msg_append("rx", rxrst); log_msg_append("name", name); log_msg_append("qth", qth); log_msg_append("locator", loc); log_msg_append("notes", notes); log_msg_send(); } /* ---------------------------------------------------------------------- */ void qsodata_set_starttime(gboolean force) { if (force || starttime == 0) time(&starttime); } /* ---------------------------------------------------------------------- */ static void qsodata_entry_changed_cb(GtkEditable *e, gpointer p) { gchar *data = (gchar *) p; gchar *str; str = gtk_editable_get_chars(e, 0, -1); g_strlcpy(data, str, FIELD_LEN); g_free(str); qsodata_set_starttime(FALSE); } /* ---------------------------------------------------------------------- */ void qsodata_init(void) { GtkWidget *w, *table = lookup_widget(appwindow, "qsodatatable"); /* * Create and show the band combo. */ qsobandcombo = gtk_combo_new(); gtk_table_attach(GTK_TABLE(table), qsobandcombo, 1, 2, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request(qsobandcombo, 70, -1); gtk_widget_show(qsobandcombo); gtk_widget_show(GTK_COMBO(qsobandcombo)->entry); g_object_set_data(G_OBJECT(appwindow), "qsobandcombo", qsobandcombo); /* * Create the band entry (leave hidden). */ qsobandentry = gtk_entry_new(); gtk_table_attach(GTK_TABLE(table), qsobandentry, 1, 2, 1, 2, (GtkAttachOptions) (0), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request(qsobandentry, 70, -1); gtk_editable_set_editable(GTK_EDITABLE(qsobandentry), FALSE); /* * Band data doesn't get initialized otherwise... */ qsodata_init_band(); /* * Connect all of them (except the band entry) to the 'changed' signal. */ g_signal_connect(G_OBJECT(GTK_COMBO(qsobandcombo)->entry), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) band); w = lookup_widget(appwindow, "qsocallentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) call); w = lookup_widget(appwindow, "qsotxrstentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) txrst); w = lookup_widget(appwindow, "qsorxrstentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) rxrst); w = lookup_widget(appwindow, "qsonameentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) name); w = lookup_widget(appwindow, "qsoqthentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) qth); w = lookup_widget(appwindow, "qsolocentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) loc); w = lookup_widget(appwindow, "qsonotesentry"); g_signal_connect(G_OBJECT(w), "changed", G_CALLBACK(qsodata_entry_changed_cb), (gpointer) notes); } /* ---------------------------------------------------------------------- */ G_CONST_RETURN gchar *qsodata_get_call(void) { return call; } G_CONST_RETURN gchar *qsodata_get_band(void) { return band; } G_CONST_RETURN gchar *qsodata_get_txrst(void) { return txrst; } G_CONST_RETURN gchar *qsodata_get_rxrst(void) { return rxrst; } G_CONST_RETURN gchar *qsodata_get_name(void) { return name; } G_CONST_RETURN gchar *qsodata_get_qth(void) { return qth; } G_CONST_RETURN gchar *qsodata_get_loc(void) { return loc; } G_CONST_RETURN gchar *qsodata_get_notes(void) { return notes; } /* ---------------------------------------------------------------------- */ void qsodata_set_band_mode(band_mode_t mode) { static band_mode_t qsodata_band_mode = QSODATA_BAND_COMBO; g_return_if_fail(qsobandcombo); g_return_if_fail(qsobandentry); if (qsodata_band_mode == mode) return; switch (mode) { case QSODATA_BAND_COMBO: gtk_widget_hide(qsobandentry); gtk_widget_show(qsobandcombo); gtk_widget_show(GTK_COMBO(qsobandcombo)->entry); qsodata_init_band(); break; case QSODATA_BAND_ENTRY: gtk_widget_hide(qsobandcombo); gtk_widget_hide(GTK_COMBO(qsobandcombo)->entry); gtk_widget_show(qsobandentry); break; } qsodata_band_mode = mode; } void qsodata_set_freq(const gchar *freq) { g_return_if_fail(qsobandentry); gtk_entry_set_text(GTK_ENTRY(qsobandentry), freq); g_strlcpy(band, freq, FIELD_LEN); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/qsodata.h0000644000076400007640000000324110015163611011336 /* * qsodata.h -- QSO data area functions * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _QSODATA_H #define _QSODATA_H typedef enum { QSODATA_BAND_COMBO, QSODATA_BAND_ENTRY } band_mode_t; extern void qsodata_init(void); extern void qsodata_clear(void); extern void qsodata_log(void); extern void qsodata_set_starttime(gboolean force); extern G_CONST_RETURN gchar *qsodata_get_call(void); extern G_CONST_RETURN gchar *qsodata_get_band(void); extern G_CONST_RETURN gchar *qsodata_get_txrst(void); extern G_CONST_RETURN gchar *qsodata_get_rxrst(void); extern G_CONST_RETURN gchar *qsodata_get_name(void); extern G_CONST_RETURN gchar *qsodata_get_qth(void); extern G_CONST_RETURN gchar *qsodata_get_loc(void); extern G_CONST_RETURN gchar *qsodata_get_notes(void); extern void qsodata_set_band_mode(band_mode_t mode); extern void qsodata_set_freq(const gchar *freq); #endif gmfsk-0.7pre1/src/remlog.h0000644000076400007640000000215007725503071011201 /* * remlog.h -- Remote logging (IPC) * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _REMLOG_H #define _REMLOG_H #define LOG_MVERSION "1" #define LOG_MKEY 1238 #define LOG_MTYPE 88 #define LOG_MSEPARATOR 1 #define LOG_MSG_LEN 1024 typedef struct { long mtype; char mtext[LOG_MSG_LEN]; } msgtype; #endif gmfsk-0.7pre1/src/snd.c0000644000076400007640000003424110165574404010501 /* * snd.c -- Sound card routines. * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include #include #include #include #include "snd.h" #include "misc.h" #include "cwirc.h" #include "samplerate.h" #define SND_DEBUG 0 /* ---------------------------------------------------------------------- */ #define SND_BUF_LEN 65536 #define SRC_BUF_LEN (8*SND_BUF_LEN) #define SND_VOL 0.5 static snd_config_t config; static snd_config_t newconfig; static gint snd_fd = -1; static gint snd_dir = 0; static gint16 snd_w_buffer[2 * SND_BUF_LEN]; static guint8 snd_b_buffer[2 * SND_BUF_LEN]; static gfloat snd_buffer[SND_BUF_LEN]; static gfloat src_buffer[SRC_BUF_LEN]; SRC_STATE *tx_src_state = NULL; SRC_DATA *tx_src_data; SRC_STATE *rx_src_state = NULL; SRC_DATA *rx_src_data; static gchar snd_error_str[1024]; static gint write_samples(gfloat *buf, gint count); static gint read_samples(gfloat *buf, gint count); /* ---------------------------------------------------------------------- */ void sound_set_conf(snd_config_t *cfg) { g_free(newconfig.device); if (cfg) { newconfig.device = g_strdup(cfg->device); newconfig.samplerate = cfg->samplerate; newconfig.txoffset = cfg->txoffset; newconfig.rxoffset = cfg->rxoffset; } else { newconfig.device = NULL; newconfig.samplerate = 0; newconfig.txoffset = 0; newconfig.rxoffset = 0; } } void sound_set_flags(guint flags) { newconfig.flags = flags; } void sound_get_flags(guint *flags) { *flags = newconfig.flags; } /* ---------------------------------------------------------------------- */ static void snderr(const gchar *fmt, ...) { va_list args; va_start(args, fmt); vsnprintf(snd_error_str, sizeof(snd_error_str), fmt, args); snd_error_str[sizeof(snd_error_str) - 1] = 0; va_end(args); fprintf(stderr, "*** %s ***\n", snd_error_str); } #if SND_DEBUG static void dprintf(const char *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } #endif /* ---------------------------------------------------------------------- */ static gint opensnd(gint direction) { #if SND_DEBUG audio_buf_info info; gchar *str; #endif guint sndparam, wanted; gint fd; if (!config.device) { snderr(_("opensnd: device not set")); return -1; } #if SND_DEBUG switch (direction) { case O_RDONLY: str = "reading"; break; case O_WRONLY: str = "writing"; break; case O_RDWR: str = "read/write"; break; default: str = "???"; break; } dprintf("Opening %s for %s...\n", config.device, str); #endif /* non-blocking open */ if ((fd = open(config.device, direction | O_NONBLOCK)) < 0) { snderr(_("opensnd: open: %s: %m"), config.device); return -1; } /* make it block again - (SNDCTL_DSP_NONBLOCK ???) */ if (fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) & ~O_NONBLOCK) < 0) { snderr(_("opensnd: ioctl: SNDCTL_DSP_NONBLOCK: %m")); goto error; } #if SND_DEBUG if (config.flags & SND_FLAG_8BIT) str = "8 bit unsigned"; else str = "16 bit signed, native byteorder"; dprintf("Setting sample format (%s)...\n", str); #endif if (config.flags & SND_FLAG_8BIT) wanted = AFMT_U8; /* 8 bit unsigned */ else wanted = AFMT_S16_NE; /* 16 bit signed, native byteorder */ sndparam = wanted; if (ioctl(fd, SNDCTL_DSP_SETFMT, &sndparam) < 0) { snderr(_("opensnd: ioctl: SNDCTL_DSP_SETFMT: %m")); goto error; } if (sndparam != wanted) { snderr(_("opensnd: Requested sample format not supported")); goto error; } #if SND_DEBUG dprintf("Setting %s audio...\n", (config.flags & SND_FLAG_STEREO) ? "stereo" : "mono"); #endif if (config.flags & SND_FLAG_STEREO) wanted = 1; /* stereo */ else wanted = 0; /* mono */ sndparam = wanted; if (ioctl(fd, SNDCTL_DSP_STEREO, &sndparam) < 0) { snderr(_("opensnd: ioctl: SNDCTL_DSP_STEREO: %m")); goto error; } if (sndparam != wanted) { snderr(_("opensnd: Cannot set %s audio"), (config.flags & SND_FLAG_STEREO) ? "stereo" : "mono"); goto error; } #if SND_DEBUG dprintf("Setting samplerate to %u...\n", config.samplerate); #endif sndparam = config.samplerate; if (ioctl(fd, SNDCTL_DSP_SPEED, &sndparam) < 0) { snderr(_("opensnd: ioctl: SNDCTL_DSP_SPEED: %m")); goto error; } if (sndparam != config.samplerate) { g_warning(_("Sampling rate is %u, requested %u\n"), sndparam, config.samplerate); } config.samplerate = sndparam; /* Try to get ~100ms worth of samples per fragment */ sndparam = log2(config.samplerate * 100 / 1000); /* double if we are using 16 bit samples */ if (!(config.flags & SND_FLAG_8BIT)) sndparam += 1; /* double if we are using stereo */ if (config.flags & SND_FLAG_STEREO) sndparam += 1; /* Unlimited amount of buffers for RX, four for TX */ if (direction == O_RDONLY) sndparam |= 0x7FFF0000; else sndparam |= 0x00040000; #if SND_DEBUG dprintf("Setting fragment size (param = 0x%08X)...\n", sndparam); #endif if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &sndparam) < 0) { snderr(_("opensnd: ioctl: SNDCTL_DSP_SETFRAGMENT: %m")); goto error; } #if SND_DEBUG if (direction == O_RDONLY) { if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) < 0) { dprintf("ioctl: SNDCTL_DSP_GETISPACE: %m"); } } else { if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) < 0) { dprintf("ioctl: SNDCTL_DSP_GETOSPACE: %m"); } } dprintf("Audio buffer size: %d bytes, number of buffers: %d\n", info.fragsize, info.fragstotal); #endif #if SND_DEBUG dprintf("-- \n"); #endif return fd; error: close(fd); return -1; } /* ---------------------------------------------------------------------- */ gint sound_open_for_write(gint rate) { gdouble real_rate; gdouble ratio; gint err; /* copy current config */ memcpy(&config, &newconfig, sizeof(snd_config_t)); if (cwirc_extension_mode) { config.samplerate = CWIRC_SRATE; config.txoffset = 0; } if (cwirc_extension_mode) snd_fd = 0; else if (config.flags & SND_FLAG_TESTMODE_MASK) snd_fd = 1; else if (!(config.flags & SND_FLAG_FULLDUP)) snd_fd = opensnd(O_WRONLY); else if (snd_fd < 0) snd_fd = opensnd(O_RDWR); if (snd_fd < 0) return -1; snd_dir = O_WRONLY; real_rate = config.samplerate * (1.0 + config.txoffset / 1e6); if (rate == real_rate) { if (tx_src_state) { src_delete(tx_src_state); tx_src_state = NULL; } return snd_fd; } ratio = real_rate / rate; if (tx_src_state && tx_src_data && tx_src_data->src_ratio == ratio) { src_reset(tx_src_state); return snd_fd; } #if SND_DEBUG dprintf("Resampling output from %d to %.1f (%f)\n", rate, real_rate, ratio); #endif if (tx_src_state) src_delete(tx_src_state); tx_src_state = src_new(SRC_SINC_FASTEST, 1, &err); if (tx_src_state == NULL) { snderr(_("sound_open_for_write: src_new failed: %s"), src_strerror(err)); snd_fd = -1; return -1; } if (!tx_src_data) tx_src_data = g_new(SRC_DATA, 1); tx_src_data->src_ratio = ratio; return snd_fd; } gint sound_open_for_read(gint rate) { gdouble real_rate; gdouble ratio; gint err; /* copy current config */ memcpy(&config, &newconfig, sizeof(snd_config_t)); if (cwirc_extension_mode) { config.samplerate = CWIRC_SRATE; config.rxoffset = 0; } if (cwirc_extension_mode) snd_fd = 0; else if (config.flags & SND_FLAG_TESTMODE_MASK) snd_fd = 0; else if (!(config.flags & SND_FLAG_FULLDUP)) snd_fd = opensnd(O_RDONLY); else if (snd_fd < 0) snd_fd = opensnd(O_RDWR); if (snd_fd < 0) return -1; snd_dir = O_RDONLY; real_rate = config.samplerate * (1.0 + config.rxoffset / 1e6); if (rate == real_rate) { if (rx_src_state) { src_delete(rx_src_state); rx_src_state = NULL; } return snd_fd; } ratio = rate / real_rate; if (rx_src_state && rx_src_data && rx_src_data->src_ratio == ratio) { src_reset(rx_src_state); return snd_fd; } #if SND_DEBUG dprintf("Resampling input from %.1f to %d (%f)\n", real_rate, rate, ratio); #endif if (rx_src_state) src_delete(rx_src_state); rx_src_state = src_new(SRC_SINC_FASTEST, 1, &err); if (rx_src_state == NULL) { snderr(_("sound_open_for_read: src_new failed: %s"), src_strerror(err)); snd_fd = -1; return -1; } if (!rx_src_data) rx_src_data = g_new(SRC_DATA, 1); rx_src_data->src_ratio = ratio; return snd_fd; } void sound_close(void) { if (cwirc_extension_mode) return; if (config.flags & SND_FLAG_TESTMODE_MASK) { snd_fd = -1; return; } if (config.flags & SND_FLAG_FULLDUP) return; #if 0 /* this doesn't seem to work like it should... */ if (tx_src_state && snd_dir == O_WRONLY) { tx_src_data->data_in = NULL; tx_src_data->input_frames = 0; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SRC_BUF_LEN; tx_src_data->end_of_input = 1; src_process(tx_src_state, tx_src_data); write_samples(src_buffer, tx_src_data->output_frames_gen); } #endif /* never close stdin/out/err */ if (snd_fd > 2) { if (ioctl(snd_fd, SNDCTL_DSP_SYNC, 0) < 0) snderr(_("sound_close: ioctl: SNDCTL_DSP_SYNC: %m")); close(snd_fd); snd_fd = -1; } } char *sound_error(void) { return snd_error_str; } /* ---------------------------------------------------------------------- */ gint sound_write(gfloat *buf, gint cnt) { gint n; #if SND_DEBUG > 1 dprintf("sound_write(%d)\n", cnt); #endif if (cwirc_extension_mode) return cwirc_sound_write(buf, cnt); if ((config.flags & SND_FLAG_TESTMODE_MASK) == SND_FLAG_TESTMODE_RX) return cnt; if (snd_fd < 0) { snderr(_("sound_write: fd < 0")); return -1; } if (tx_src_state == NULL) return write_samples(buf, cnt); tx_src_data->data_in = buf; tx_src_data->input_frames = cnt; tx_src_data->data_out = src_buffer; tx_src_data->output_frames = SRC_BUF_LEN; tx_src_data->end_of_input = 0; if ((n = src_process(tx_src_state, tx_src_data)) != 0) { snderr(_("sound_write: src_process: %s"), src_strerror(n)); return -1; } write_samples(src_buffer, tx_src_data->output_frames_gen); return cnt; } static gint write_samples(gfloat *buf, gint count) { void *p; gint i, j; #if SND_DEBUG > 1 dprintf("write_samples(%d)\n", count); #endif if (count <= 0) { snderr(_("write_samples: count <= 0 (%d)"), count); return -1; } if (count > SND_BUF_LEN) { snderr(_("write_samples: count > SND_BUF_LEN (%d)"), count); return -1; } if (cwirc_extension_mode) return cwirc_sound_write(buf, count); if (config.flags & SND_FLAG_8BIT) { for (i = j = 0; i < count; i++) { snd_b_buffer[j++] = (buf[i] * 127.0 * SND_VOL) + 128.0; if (config.flags & SND_FLAG_STEREO) snd_b_buffer[j++] = 128; } count *= sizeof(guint8); p = snd_b_buffer; } else { for (i = j = 0; i < count; i++) { snd_w_buffer[j++] = buf[i] * 32767.0 * SND_VOL; if (config.flags & SND_FLAG_STEREO) snd_w_buffer[j++] = 0; } count *= sizeof(gint16); p = snd_w_buffer; } if (config.flags & SND_FLAG_STEREO) count *= 2; if ((i = write(snd_fd, p, count)) < 0) snderr(_("write_samples: write: %m")); return i; } /* ---------------------------------------------------------------------- */ gint sound_read(gfloat **buffer, gint *count) { struct timespec ts; gint n; #if SND_DEBUG > 1 dprintf("sound_read(%d)\n", *count); #endif *count = MIN(*count, SND_BUF_LEN); if ((config.flags & SND_FLAG_TESTMODE_MASK) == SND_FLAG_TESTMODE_TX) { ts.tv_sec = 0; ts.tv_nsec = *count * (1000000000L / 8000); nanosleep(&ts, NULL); for (n = 0; n < *count; n++) snd_buffer[n] = (g_random_double() - 0.5) / 100.0; *buffer = snd_buffer; return 0; } if (snd_fd < 0) { snderr(_("sound_read: fd < 0")); return -1; } if (rx_src_state == NULL) { *count = read_samples(snd_buffer, *count); *buffer = snd_buffer; return 0; } n = floor(*count / rx_src_data->src_ratio / 512 + 0.5) * 512; n = read_samples(src_buffer, n); rx_src_data->data_in = src_buffer; rx_src_data->input_frames = n; rx_src_data->data_out = snd_buffer; rx_src_data->output_frames = SND_BUF_LEN; rx_src_data->end_of_input = 0; if ((n = src_process(rx_src_state, rx_src_data)) != 0) { snderr(_("sound_read: src_process: %s"), src_strerror(n)); return -1; } *count = rx_src_data->output_frames_gen; *buffer = snd_buffer; return 0; } static gint read_samples(gfloat *buf, gint count) { gint len, i, j; #if SND_DEBUG > 1 dprintf("read_samples(%d)\n", count); #endif if (count <= 0) { snderr(_("read_samples: count <= 0 (%d)"), count); return -1; } if (count > SND_BUF_LEN) { snderr(_("read_samples: count > SND_BUF_LEN (%d)"), count); return -1; } if (cwirc_extension_mode) return cwirc_sound_read(buf, count); if (config.flags & SND_FLAG_STEREO) count *= 2; if (config.flags & SND_FLAG_8BIT) { count *= sizeof(guint8); if ((len = read(snd_fd, snd_b_buffer, count)) < 0) goto error; len /= sizeof(guint8); if (config.flags & SND_FLAG_STEREO) len /= 2; for (i = j = 0; i < len; i++) { buf[i] = (snd_b_buffer[j++] - 128) / 128.0; if (config.flags & SND_FLAG_STEREO) j++; } } else { count *= sizeof(gint16); if ((len = read(snd_fd, snd_w_buffer, count)) < 0) goto error; len /= sizeof(gint16); if (config.flags & SND_FLAG_STEREO) len /= 2; for (i = j = 0; i < len; i++) { buf[i] = snd_w_buffer[j++] / 32768.0; if (config.flags & SND_FLAG_STEREO) j++; } } return len; error: if (errno != EAGAIN) snderr(_("sound_read: read: %m")); return len; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/snd.h0000644000076400007640000000332010031407226010465 /* * snd.h -- Sound card routines. * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _SND_H #define _SND_H #ifdef __cplusplus extern "C" { #endif #define SND_FLAG_TESTMODE_RX (1 << 0) #define SND_FLAG_TESTMODE_TX (1 << 1) #define SND_FLAG_8BIT (1 << 2) #define SND_FLAG_STEREO (1 << 3) #define SND_FLAG_FULLDUP (1 << 4) #define SND_FLAG_TESTMODE_MASK (SND_FLAG_TESTMODE_RX|SND_FLAG_TESTMODE_TX) typedef struct { gchar *device; gint samplerate; gint txoffset; gint rxoffset; guint flags; } snd_config_t; extern void sound_set_conf(snd_config_t *cfg); extern void sound_set_flags(guint); extern void sound_get_flags(guint *); extern int sound_open_for_write(int srate); extern int sound_open_for_read(int srate); extern void sound_close(void); extern int sound_write(float *buf, int count); extern int sound_read(float **buf, int *count); extern char *sound_error(void); #ifdef __cplusplus } #endif #endif gmfsk-0.7pre1/src/trx.c0000644000076400007640000003752410172043207010527 /* * trx.c -- Modem engine * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "main.h" #include "trx.h" #include "snd.h" #include "ptt.h" #include "misc.h" #include "picture.h" #include "waterfall.h" #include "miniscope.h" #include "support.h" #define TRX_DEBUG 0 extern void mfsk_init(struct trx *trx); extern void olivia_init(struct trx *trx); extern void rtty_init(struct trx *trx); extern void throb_init(struct trx *trx); extern void psk31_init(struct trx *trx); extern void mt63_init(struct trx *trx); extern void feld_init(struct trx *trx); extern void cw_init(struct trx *trx); /* ---------------------------------------------------------------------- */ char *trx_mode_names[] = { "MFSK16", "MFSK8", "OLIVIA", "RTTY", "THROB1", "THROB2", "THROB4", "BPSK31", "QPSK31", "PSK63", "MT63", "FELDHELL", "FMHELL", "CW" }; char *trx_state_names[] = { "PAUSED", "RECEIVE", "TRANSMIT", "TUNING", "ABORTED", "FLUSHING" }; /* ---------------------------------------------------------------------- */ static pthread_mutex_t trx_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t trx_cond = PTHREAD_COND_INITIALIZER; static pthread_t trx_thread; static struct trx trx; /* ---------------------------------------------------------------------- */ #define BLOCKLEN 512 static void receive_loop(void) { gfloat *buf; gint len; if (sound_open_for_read(trx.samplerate) < 0) { errmsg(_("sound_open_for_read: %s"), sound_error()); trx_set_state(TRX_STATE_ABORT); return; } trx.rxinit(&trx); statusbar_set_trxstate(TRX_STATE_RX); for (;;) { pthread_mutex_lock(&trx_mutex); if (trx.state != TRX_STATE_RX) { pthread_mutex_unlock(&trx_mutex); break; } pthread_mutex_unlock(&trx_mutex); len = BLOCKLEN; if (sound_read(&buf, &len) < 0) { errmsg(_("%s"), sound_error()); trx_set_state(TRX_STATE_ABORT); break; } waterfall_set_data(waterfall, buf, len); trx.rxprocess(&trx, buf, len); } sound_close(); } static void transmit_loop(void) { gfloat f = 0.0; if (sound_open_for_write(trx.samplerate) < 0) { errmsg(_("sound_open_for_write: %s"), sound_error()); trx_set_state(TRX_STATE_ABORT); return; } trx_set_scope(&f, 1, FALSE); trx_set_phase(0.0, FALSE); trx.metric = 0.0; trx.txinit(&trx); ptt_set(1); for (;;) { pthread_mutex_lock(&trx_mutex); if (trx.state == TRX_STATE_ABORT) { pthread_mutex_unlock(&trx_mutex); break; } if (trx.state == TRX_STATE_RX || trx.state == TRX_STATE_PAUSE) { statusbar_set_trxstate(TRX_STATE_FLUSH); trx.stopflag = 1; } if (trx.state == TRX_STATE_TUNE) { statusbar_set_trxstate(TRX_STATE_TUNE); trx.tune = 1; } if (trx.state == TRX_STATE_TX) { statusbar_set_trxstate(TRX_STATE_TX); } pthread_mutex_unlock(&trx_mutex); if (trx.txprocess(&trx) < 0) break; } sound_close(); ptt_set(0); pthread_mutex_lock(&trx_mutex); g_free(trx.txstr); trx.txptr = NULL; trx.txstr = NULL; trx.backspaces = 0; trx.stopflag = 0; trx.tune = 0; pthread_mutex_unlock(&trx_mutex); clear_tx_text(); } static void *trx_loop(void *args) { for (;;) { pthread_mutex_lock(&trx_mutex); if (trx.state == TRX_STATE_PAUSE || \ trx.state == TRX_STATE_ABORT) break; /* signal a state change (other than pause or abort) */ pthread_cond_signal(&trx_cond); switch (trx.state) { case TRX_STATE_RX: pthread_mutex_unlock(&trx_mutex); receive_loop(); break; case TRX_STATE_TX: case TRX_STATE_TUNE: pthread_mutex_unlock(&trx_mutex); transmit_loop(); break; default: pthread_mutex_unlock(&trx_mutex); break; } } trx.destructor(&trx); trx.modem = NULL; trx.state = TRX_STATE_PAUSE; trx.metric = 0.0; g_free(trx.txstr); trx.txstr = NULL; trx.txptr = NULL; /* do this before sending the signal, otherwise there is a race */ statusbar_set_trxstate(TRX_STATE_PAUSE); /* signal a state change */ pthread_cond_signal(&trx_cond); pthread_mutex_unlock(&trx_mutex); /* this will exit the trx thread */ return NULL; } /* ---------------------------------------------------------------------- */ gint trx_init(void) { pthread_mutex_lock(&trx_mutex); if (trx.modem) { pthread_mutex_unlock(&trx_mutex); return -1; } switch (trx.mode) { case MODE_MFSK16: case MODE_MFSK8: mfsk_init(&trx); break; case MODE_OLIVIA: olivia_init(&trx); break; case MODE_RTTY: rtty_init(&trx); break; case MODE_THROB1: case MODE_THROB2: case MODE_THROB4: throb_init(&trx); break; case MODE_BPSK31: case MODE_QPSK31: case MODE_PSK63: psk31_init(&trx); break; case MODE_MT63: mt63_init(&trx); break; case MODE_FELDHELL: case MODE_FMHELL: feld_init(&trx); break; case MODE_CW: cw_init(&trx); break; } if (trx.modem == NULL) { errmsg(_("Modem initialization failed!")); pthread_mutex_unlock(&trx_mutex); return -1; } trx.stopflag = 0; pthread_mutex_unlock(&trx_mutex); if (pthread_create(&trx_thread, NULL, trx_loop, NULL) < 0) { errmsg(_("pthread_create: %m")); trx.state = TRX_STATE_PAUSE; return -1; } return 0; } /* ---------------------------------------------------------------------- */ void trx_set_mode(trx_mode_t mode) { #if TRX_DEBUG fprintf(stderr, "trx_set_mode: old=%s new=%s\n", trx_mode_names[trx.mode], trx_mode_names[mode]); #endif trx.mode = mode; } trx_mode_t trx_get_mode(void) { return trx.mode; } char *trx_get_mode_name(void) { return trx_mode_names[trx.mode]; } void trx_set_state(trx_state_t state) { #if TRX_DEBUG fprintf(stderr, "trx_set_state: old=%s new=%s\n", trx_state_names[trx.state], trx_state_names[state]); #endif pthread_mutex_lock(&trx_mutex); if (trx.state == state) { pthread_mutex_unlock(&trx_mutex); return; } trx.state = state; pthread_mutex_unlock(&trx_mutex); if (state == TRX_STATE_PAUSE || state == TRX_STATE_ABORT) return; /* (re-)initialize the trx */ trx_init(); } void trx_set_state_wait(trx_state_t state) { #if TRX_DEBUG fprintf(stderr, "trx_set_state_wait: old=%s new=%s\n", trx_state_names[trx.state], trx_state_names[state]); #endif pthread_mutex_lock(&trx_mutex); if (trx.state == state) { pthread_mutex_unlock(&trx_mutex); return; } trx.state = state; if (trx.modem) { /* now wait for the main trx loop to respond */ pthread_cond_wait(&trx_cond, &trx_mutex); } pthread_mutex_unlock(&trx_mutex); if (state == TRX_STATE_PAUSE || state == TRX_STATE_ABORT) return; /* (re-)initialize the trx */ trx_init(); } trx_state_t trx_get_state(void) { return trx.state; } void trx_set_freq(gfloat freq) { trx.frequency = freq; } gfloat trx_get_freq(void) { return trx.frequency; } gfloat trx_get_bandwidth(void) { return trx.bandwidth; } void trx_set_afc(gboolean on) { trx.afcon = on; } void trx_set_squelch(gboolean on) { trx.squelchon = on; } void trx_set_reverse(gboolean on) { trx.reverse = on; } void trx_set_metric(gfloat metric) { trx.metric = metric; } gfloat trx_get_metric(void) { return trx.metric; } void trx_set_sync(gfloat sync) { trx.syncpos = CLAMP(sync, 0.0, 1.0); } gfloat trx_get_sync(void) { trx_mode_t mode; gfloat sync; pthread_mutex_lock(&trx_mutex); mode = trx.mode; sync = trx.syncpos; pthread_mutex_unlock(&trx_mutex); if (mode == MODE_THROB1 || mode == MODE_THROB2 || mode == MODE_THROB4) return sync; return -1.0; } void trx_set_txoffset(gfloat txoffset) { trx.txoffset = txoffset; } gfloat trx_get_txoffset(void) { return trx.txoffset; } void trx_set_mfsk_parms(gfloat squelch) { trx.mfsk_squelch = squelch; } void trx_set_olivia_parms(gfloat squelch, gint tones, gint bw, gint smargin, gint sinteg, gboolean esc) { trx.olivia_squelch = squelch; trx.olivia_tones = tones; trx.olivia_bw = bw; trx.olivia_smargin = smargin; trx.olivia_sinteg = sinteg; trx.olivia_esc = esc; } void trx_set_rtty_parms(gfloat squelch, gfloat shift, gfloat baud, gint bits, gint parity, gint stop, gboolean reverse, gboolean msbfirst) { trx.rtty_squelch = squelch; trx.rtty_shift = shift; trx.rtty_baud = baud; trx.rtty_bits = bits; trx.rtty_stop = stop; trx.rtty_reverse = reverse; trx.rtty_msbfirst = msbfirst; } void trx_set_throb_parms(gfloat squelch) { trx.throb_squelch = squelch; } void trx_set_psk31_parms(gfloat squelch) { trx.psk31_squelch = squelch; } void trx_set_mt63_parms(gfloat squelch, gint bandwidth, gint interleave, gboolean cwid, gboolean esc) { trx.mt63_squelch = squelch; trx.mt63_bandwidth = bandwidth; trx.mt63_interleave = interleave; trx.mt63_cwid = cwid; trx.mt63_esc = esc; } void trx_set_hell_parms(gchar *font, gboolean upper, gfloat bandwidth, gfloat agcattack, gfloat agcdecay) { trx.hell_font = font; trx.hell_upper = upper; trx.hell_bandwidth = bandwidth; trx.hell_agcattack = agcattack; trx.hell_agcdecay = agcdecay; } void trx_set_cw_parms(gfloat squelch, gfloat speed, gfloat bandwidth) { trx.cw_squelch = squelch; trx.cw_speed = speed; trx.cw_bandwidth = bandwidth; } void trx_set_scope(gfloat *data, gint len, gboolean autoscale) { Miniscope *m = MINISCOPE(lookup_widget(appwindow, "miniscope")); miniscope_set_data(m, data, len, autoscale); } void trx_set_phase(gfloat phase, gboolean highlight) { Miniscope *m = MINISCOPE(lookup_widget(appwindow, "miniscope")); miniscope_set_phase(m, phase, highlight); } void trx_set_highlight(gboolean highlight) { Miniscope *m = MINISCOPE(lookup_widget(appwindow, "miniscope")); miniscope_set_highlight(m, highlight); } gint trx_get_samplerate(void) { return trx.samplerate; } /* ---------------------------------------------------------------------- */ static GAsyncQueue *rx_queue = NULL; static GAsyncQueue *rx_hell_data_queue = NULL; static GAsyncQueue *rx_picture_data_queue = NULL; static GAsyncQueue *echo_queue = NULL; static GAsyncQueue *tx_picture_queue = NULL; void trx_init_queues(void) { rx_queue = g_async_queue_new(); rx_hell_data_queue = g_async_queue_new(); rx_picture_data_queue = g_async_queue_new(); echo_queue = g_async_queue_new(); tx_picture_queue = g_async_queue_new(); } /* * A very ugly hack. You can not g_async_queue_push() a 0 ... */ static inline gpointer gint_to_pointer(gint data) { return (data == 0) ? GINT_TO_POINTER(-1) : GINT_TO_POINTER(data); } static inline gint gpointer_to_int(gpointer data) { return (GPOINTER_TO_INT(data) == -1) ? 0 : GPOINTER_TO_INT(data); } void trx_put_rx_char(guint data) { g_return_if_fail(rx_queue); g_async_queue_push(rx_queue, gint_to_pointer(data)); } gint trx_get_rx_char(void) { gpointer data; g_return_val_if_fail(rx_queue, -1); data = g_async_queue_try_pop(rx_queue); return data ? gpointer_to_int(data) : -1; } void trx_put_rx_data(guint data) { g_return_if_fail(rx_hell_data_queue); g_async_queue_push(rx_hell_data_queue, gint_to_pointer(data)); } gint trx_get_rx_data(void) { gpointer data; g_return_val_if_fail(rx_hell_data_queue, -1); data = g_async_queue_try_pop(rx_hell_data_queue); return data ? gpointer_to_int(data) : -1; } void trx_put_rx_picdata(guint data) { g_return_if_fail(rx_picture_data_queue); g_async_queue_push(rx_picture_data_queue, gint_to_pointer(data)); } gint trx_get_rx_picdata(void) { gpointer data; g_return_val_if_fail(rx_picture_data_queue, -1); data = g_async_queue_try_pop(rx_picture_data_queue); return data ? gpointer_to_int(data) : -1; } void trx_put_echo_char(guint data) { g_return_if_fail(echo_queue); g_async_queue_push(echo_queue, gint_to_pointer(data)); } gint trx_get_echo_char(void) { gpointer data; g_return_val_if_fail(echo_queue, -1); data = g_async_queue_try_pop(echo_queue); return data ? gpointer_to_int(data) : -1; } void trx_put_tx_picture(gpointer picbuf) { g_return_if_fail(tx_picture_queue); g_return_if_fail(picbuf); g_async_queue_push(tx_picture_queue, picbuf); } gpointer trx_get_tx_picture(void) { g_return_val_if_fail(tx_picture_queue, NULL); return g_async_queue_try_pop(tx_picture_queue); } /* ---------------------------------------------------------------------- */ void trx_queue_backspace(void) { trx.backspaces++; } /* * Check if 'str' contains any space characters or the RX_CMD character. */ static gboolean check_for_spaces(gchar *str) { gunichar chr; while (*str) { chr = g_utf8_get_char(str); if (g_unichar_isspace(chr) || chr == TRX_RX_CMD) return TRUE; str = g_utf8_next_char(str); } return FALSE; } gunichar trx_get_hell_tx_char(void) { GtkEditable *editable; gunichar chr; gchar *str; gint pos; gboolean spc; gdk_threads_enter(); editable = GTK_EDITABLE(lookup_widget(appwindow, "txentry")); str = gtk_editable_get_chars(editable, 0, -1); chr = g_utf8_get_char(str); spc = check_for_spaces(str); g_free(str); /* * If there are no spaces in the text, then send idle. */ if ((chr == 0) || (spc == FALSE && trx.state == TRX_STATE_TX)) { gdk_threads_leave(); return -1; } /* * Delete the first character and move cursor one step * backwards. */ pos = gtk_editable_get_position(editable); gtk_editable_delete_text(editable, 0, 1); gtk_editable_set_position(editable, pos - 1); if (chr == TRX_RX_CMD) { push_button("rxbutton"); chr = -1; } gdk_threads_leave(); return chr; } gunichar trx_get_normal_tx_char(void) { GtkTextView *view; GtkTextBuffer *buffer; GtkTextIter iter1, iter2; GtkTextMark *mark1, *mark2; gunichar chr; gdk_threads_enter(); view = GTK_TEXT_VIEW(lookup_widget(appwindow, "txtext")); buffer = gtk_text_view_get_buffer(view); /* get the iterator at TX mark */ mark1 = gtk_text_buffer_get_mark(buffer, "editablemark"); gtk_text_buffer_get_iter_at_mark(buffer, &iter1, mark1); /* get the iterator at the insert mark */ mark2 = gtk_text_buffer_get_insert(buffer); gtk_text_buffer_get_iter_at_mark(buffer, &iter2, mark2); if (gtk_text_iter_equal(&iter1, &iter2)) { gdk_threads_leave(); return -1; } chr = gtk_text_iter_get_char(&iter1); if (chr == 0) { gdk_threads_leave(); return -1; } gtk_text_iter_forward_char(&iter1); gtk_text_buffer_get_start_iter(buffer, &iter2); gtk_text_buffer_apply_tag_by_name(buffer, "editabletag", &iter2, &iter1); gtk_text_buffer_move_mark_by_name(buffer, "editablemark", &iter1); if (chr == TRX_RX_CMD) { push_button("rxbutton"); chr = -1; } gdk_threads_leave(); return chr; } gunichar trx_get_tx_char(void) { GError *err = NULL; guchar utf[8], *str; gunichar chr; gint len; gchar *to = "ISO-8859-1"; gchar *fm = "UTF-8"; gchar *fb = "."; if (trx.mode == MODE_FELDHELL || trx.mode == MODE_FMHELL) return trx_get_hell_tx_char(); if (trx.txstr && trx.txptr && *trx.txptr) return *trx.txptr++; g_free(trx.txstr); trx.txptr = NULL; trx.txstr = NULL; if (trx.backspaces > 0) { trx.backspaces--; return 8; } chr = trx_get_normal_tx_char(); if (chr == -1 || 0xFFFC) return chr; len = g_unichar_to_utf8(chr, utf); str = g_convert_with_fallback(utf, len, to, fm, fb, NULL, NULL, &err); if (!str) { if (err) { g_warning(_("trx_get_tx_char: conversion failed: %s"), err->message); g_error_free(err); } return -1; } trx.txptr = trx.txstr = str; return *trx.txptr++; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/trx.h0000644000076400007640000001224710172043012010521 /* * trx.h -- Modem engine * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _TRX_H #define _TRX_H #include #include #ifdef __cplusplus extern "C" { #endif /* ---------------------------------------------------------------------- */ #define TRX_RX_CMD 0x21AF /* special character for switching to rx */ #define OUTBUFSIZE 16384 /* ---------------------------------------------------------------------- */ typedef enum { MODE_MFSK16 = 0, MODE_MFSK8, MODE_OLIVIA, MODE_RTTY, MODE_THROB1, MODE_THROB2, MODE_THROB4, MODE_BPSK31, MODE_QPSK31, MODE_PSK63, MODE_MT63, MODE_FELDHELL, MODE_FMHELL, MODE_CW } trx_mode_t; extern char *trx_mode_names[]; typedef enum { TRX_STATE_PAUSE = 0, TRX_STATE_RX, TRX_STATE_TX, TRX_STATE_TUNE, TRX_STATE_ABORT, TRX_STATE_FLUSH } trx_state_t; extern char *trx_state_names[]; struct trx { trx_mode_t mode; trx_state_t state; gint samplerate; gint fragmentsize; gint afcon; gint squelchon; gint stopflag; gint tune; gint reverse; gfloat frequency; gfloat bandwidth; gfloat metric; gfloat syncpos; gfloat txoffset; gint backspaces; guchar *txstr; guchar *txptr; gfloat outbuf[OUTBUFSIZE]; gfloat mfsk_squelch; gfloat olivia_squelch; gint olivia_tones; gint olivia_bw; gint olivia_smargin; gint olivia_sinteg; gboolean olivia_esc; gfloat rtty_squelch; gfloat rtty_shift; gfloat rtty_baud; gint rtty_bits; gint rtty_parity; gint rtty_stop; gboolean rtty_reverse; gboolean rtty_msbfirst; gfloat throb_squelch; gfloat psk31_squelch; gfloat mt63_squelch; gint mt63_bandwidth; gint mt63_interleave; gboolean mt63_cwid; gboolean mt63_esc; gchar *hell_font; gboolean hell_upper; gfloat hell_bandwidth; gfloat hell_agcattack; gfloat hell_agcdecay; gfloat cw_squelch; gfloat cw_speed; gfloat cw_bandwidth; void *modem; void (*txinit) (struct trx *trx); void (*rxinit) (struct trx *trx); gint (*txprocess) (struct trx *trx); gint (*rxprocess) (struct trx *trx, gfloat *buf, gint len); void (*destructor) (struct trx *trx); }; /* ---------------------------------------------------------------------- */ extern gint trx_init(void); extern void trx_set_mode(trx_mode_t); extern trx_mode_t trx_get_mode(void); extern char *trx_get_mode_name(void); extern void trx_set_state(trx_state_t); extern void trx_set_state_wait(trx_state_t); extern trx_state_t trx_get_state(void); extern void trx_set_freq(gfloat); extern gfloat trx_get_freq(void); extern void trx_set_metric(gfloat); extern gfloat trx_get_metric(void); extern void trx_set_sync(gfloat); extern gfloat trx_get_sync(void); extern void trx_set_txoffset(gfloat); extern gfloat trx_get_txoffset(void); extern void trx_set_mfsk_parms(gfloat); extern void trx_set_olivia_parms(gfloat, gint, gint, gint, gint, gboolean); extern void trx_set_rtty_parms(gfloat, gfloat, gfloat, gint, gint, gint, gboolean, gboolean); extern void trx_set_throb_parms(gfloat); extern void trx_set_psk31_parms(gfloat); extern void trx_set_mt63_parms(gfloat, gint, gint, gboolean, gboolean); extern void trx_set_hell_parms(gchar *, gboolean, gfloat, gfloat, gfloat); extern void trx_set_cw_parms(gfloat, gfloat, gfloat); extern void trx_set_afc(gboolean on); extern void trx_set_squelch(gboolean on); extern void trx_set_reverse(gboolean on); extern gfloat trx_get_bandwidth(void); extern void trx_set_scope(gfloat *data, gint len, gboolean autoscale); extern void trx_set_phase(gfloat phase, gboolean highlight); extern void trx_set_highlight(gboolean highlight); extern gint trx_get_samplerate(void); /* ---------------------------------------------------------------------- */ extern void trx_init_queues(void); extern void trx_put_echo_char(guint c); extern gint trx_get_echo_char(void); extern void trx_put_rx_char(guint c); extern gint trx_get_rx_char(void); extern void trx_put_rx_data(guint c); extern gint trx_get_rx_data(void); extern void trx_put_rx_picdata(guint c); extern gint trx_get_rx_picdata(void); extern void trx_put_tx_picture(gpointer picbuf); extern gpointer trx_get_tx_picture(void); /* ---------------------------------------------------------------------- */ extern void trx_queue_backspace(void); extern gunichar trx_get_tx_char(void); /* ---------------------------------------------------------------------- */ #ifdef __cplusplus } #endif #endif gmfsk-0.7pre1/src/cwirc.c0000644000076400007640000001331010166327763011023 /* * cwirc.c -- CWirc interface * * Copyright (C) 2003 * Pierre-Philippe Coupard (pcoupard@easyconnect.fr) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include #include #include #include #include "cwirc.h" /* Definitions */ #define AUDIOBUF_SIZE 22050 /* Samples */ /* Global variables */ gboolean cwirc_extension_mode = FALSE; struct cwirc_extension_api { gint semid; gint16 out_audiobuf[AUDIOBUF_SIZE]; gint out_audiobuf_start; gint out_audiobuf_end; gint in_key; gint pid; }; static gint gmfsk_srate = CWIRC_SRATE; static struct cwirc_extension_api *cwirc_api_shm; /* * Init CWirc mode: attach to the shared memory segment and set * the cwirc_extension_mode flag. */ gint cwirc_init(gint shmid) { cwirc_api_shm = shmat(shmid, NULL, 0); if (cwirc_api_shm == (struct cwirc_extension_api *) -1) { g_critical(_("Can't attach to the CWirc API shared memory block!\n")); return -1; } g_message(_("Working in CWirc slave mode.\n")); cwirc_extension_mode = TRUE; return 0; } /* * Sound write routine replacement that keys CWirc instead of writing * sound to a sound device */ gint cwirc_sound_write(gfloat *buf, gint count) { struct sembuf sops; static gint semno = 0; static gint samplebuf_size = 0; static gdouble srates_conv_ratio; static gint sbi = 0; static gdouble sbd = 0; static gint keycnt = 0; gint i; srates_conv_ratio = (gdouble) gmfsk_srate / 44100; while (1) { /* Is the sample buffer empty ? */ if (samplebuf_size == 0) { /* Acquire semaphore to get samples from CWirc */ sops.sem_num = semno; sops.sem_op = -1; sops.sem_flg = SEM_UNDO; if (semop(cwirc_api_shm->semid, &sops, 1) == -1) continue; /* Count samples, adjust ring buffer pointers */ while (cwirc_api_shm->out_audiobuf_start != cwirc_api_shm->out_audiobuf_end) { cwirc_api_shm->out_audiobuf_start++; if (cwirc_api_shm->out_audiobuf_start >= AUDIOBUF_SIZE) cwirc_api_shm->out_audiobuf_start -= AUDIOBUF_SIZE; samplebuf_size++; } /* Release the semaphore and switch semaphore */ sops.sem_num = semno; sops.sem_op = 1; sops.sem_flg = SEM_UNDO; if (semop(cwirc_api_shm->semid, &sops, 1) == -1) continue; semno = semno ? 0 : 1; } i = sbd; /* Key CWirc */ if (buf[i] < -.25 || buf[i] > .25) keycnt = 10; if (keycnt > 0) { keycnt--; cwirc_api_shm->in_key = 1; } else cwirc_api_shm->in_key = 0; sbi++; sbd += srates_conv_ratio; i = sbd; if (sbi == samplebuf_size) samplebuf_size = sbi = 0; if (i == count) { sbd -= count; break; } } return count; } /* * Sound read routine that grab samples from CWirc instead of a sound device */ gint cwirc_sound_read(gfloat *buf, gint count) { struct sembuf sops; static gint semno = 0; static gint16 samplebuf[AUDIOBUF_SIZE * 2]; static gint samplebuf_size = 0; static gdouble srates_conv_ratio; static gint sbi = 0; static gdouble sbd = 0; static gdouble prev_val = 0,val; gdouble prev_val_weight,val_weight; gint i; srates_conv_ratio = (gdouble) gmfsk_srate / 44100; while (1) { /* Is the sample buffer empty ? */ if (samplebuf_size == 0) { /* Acquire semaphore to get samples from CWirc */ sops.sem_num = semno; sops.sem_op = -1; sops.sem_flg = SEM_UNDO; if (semop(cwirc_api_shm->semid, &sops, 1) == -1) continue; /* Grab samples, adjust ring buffer pointers */ while (cwirc_api_shm->out_audiobuf_start != cwirc_api_shm->out_audiobuf_end) { samplebuf[samplebuf_size] = cwirc_api_shm->out_audiobuf[cwirc_api_shm->out_audiobuf_start++]; if (cwirc_api_shm->out_audiobuf_start >= AUDIOBUF_SIZE) cwirc_api_shm->out_audiobuf_start -= AUDIOBUF_SIZE; samplebuf_size++; } /* Release the semaphore and switch semaphore */ sops.sem_num = semno; sops.sem_op = 1; sops.sem_flg = SEM_UNDO; if (semop(cwirc_api_shm->semid, &sops, 1) == -1) continue; semno = semno ? 0 : 1; } i = sbd; /* Perform cheap downsampling here just in case gmfsk_srate != 44100 */ val = samplebuf[sbi] / 32768.0; val_weight=((double)i + 1) - sbd; prev_val_weight=srates_conv_ratio - val_weight; buf[i] = (prev_val * prev_val_weight + val * val_weight) / srates_conv_ratio; prev_val = val; sbi++; sbd += srates_conv_ratio; i = sbd; if (sbi == samplebuf_size) samplebuf_size = sbi = 0; if (i == count) { /* Introduces a little noise, otherwise the feldhell module gMFSK doesn't seem to start (???) */ for (i = 0; i < count; i++) { buf[i] += (((double) rand() * 2) / RAND_MAX - 1) / 100000; if (buf[i] < -1) buf[i] = -1; else if (buf[i] > 1) buf[i] = 1; } /* Cap the samples (paranoia feature) */ for(i = 0; i < count; i++) { if (buf[i] < -1.0) buf[i] = -1.0; else if (buf[i] > 1.0) buf[i] = 1.0; } sbd -= count; break; } } return count; } gmfsk-0.7pre1/src/cwirc.h0000644000076400007640000000224110102724454011015 /* * cwirc.h -- CWirc interface * * Copyright (C) 2003 * Pierre-Philippe Coupard (pcoupard@easyconnect.fr) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _CWIRC_H /* Defines */ #define CWIRC_SRATE 44100 /* Variables */ extern gboolean cwirc_extension_mode; /* Prototypes */ extern gint cwirc_init(gint shmid); extern gint cwirc_sound_write(gfloat *buf, gint count); extern gint cwirc_sound_read(gfloat *buf, gint count); #endif gmfsk-0.7pre1/src/picture.c0000644000076400007640000002277310165574315011400 /* * picture.c -- MFSK pictures support * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "main.h" #include "picture.h" #include "conf.h" #include "trx.h" #include "qsodata.h" #include "interface.h" #include "support.h" /* ---------------------------------------------------------------------- */ gboolean picture_check_header(gchar *str, gint *w, gint *h, gboolean *color) { gchar *p; *w = 0; *h = 0; *color = FALSE; if ((p = strstr(str, "Pic:")) == NULL) return FALSE; p += 4; while (isdigit(*p)) *w = (*w * 10) + (*p++ - '0'); if (*p++ != 'x') return FALSE; while (isdigit(*p)) *h = (*h * 10) + (*p++ - '0'); if (*p == 'C') { *color = TRUE; p++; } if (*p != ';') return FALSE; if (*w == 0 || *h == 0 || *w > 4095 || *h > 4095) return FALSE; return TRUE; } /* ---------------------------------------------------------------------- */ typedef struct _Picture Picture; struct _Picture { gboolean active; GtkWidget *window; GtkWidget *image; GdkPixbuf *pixbuf; gint width; gint height; gint rowstride; gboolean color; gint x; gint y; gint rgb; }; static Picture *picture = NULL; /* ---------------------------------------------------------------------- */ static gboolean delete_callback(GtkWidget *widget, GdkEvent *event, gpointer data) { Picture *p = (Picture *) data; p->active = FALSE; g_object_unref(G_OBJECT(p->pixbuf)); return FALSE; } void on_pictureclosebutton_clicked(GtkButton *button, gpointer data) { Picture *p = (Picture *) data; GtkWidget *w; p->active = FALSE; g_object_unref(G_OBJECT(p->pixbuf)); w = gtk_widget_get_toplevel(GTK_WIDGET(button)); gtk_widget_destroy(w); } void on_picturesavebutton_clicked(GtkButton *button, gpointer data) { Picture *pic = (Picture *) data; GtkWidget *widget; GtkFileSelection *f; GError *error = NULL; gboolean ret; gint resp; gchar *dir, *file; struct tm *tm; time_t t; widget = create_rxpicfileselection(); f = GTK_FILE_SELECTION(widget); time(&t); tm = gmtime(&t); dir = conf_get_picrxdir(); file = g_strdup_printf("%s%cPic_%s_%02d%02d%02d_%02d%02d%02d.png", dir, G_DIR_SEPARATOR, qsodata_get_call(), tm->tm_year % 100, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); gtk_file_selection_set_filename(f, file); g_free(dir); g_free(file); resp = gtk_dialog_run(GTK_DIALOG(widget)); if (resp != GTK_RESPONSE_OK) { gtk_widget_destroy(widget); return; } file = g_strdup(gtk_file_selection_get_filename(f)); gtk_widget_destroy(widget); ret = gdk_pixbuf_save(pic->pixbuf, file, "png", &error, NULL); if (ret == FALSE && error != NULL) { errmsg(_("Error saving picture: %s: %s"), file, error->message); g_error_free(error); } g_free(file); } /* ---------------------------------------------------------------------- */ void picture_start(gint w, gint h, gboolean color) { GtkWidget *widget; picture_stop(); picture = g_new0(Picture, 1); picture->width = w; picture->height = h; picture->color = color; picture->x = 0; picture->y = 0; picture->rgb = 0; picture->pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, w, h); picture->rowstride = gdk_pixbuf_get_rowstride(picture->pixbuf); gdk_pixbuf_fill(picture->pixbuf, 0xaaaaaaff); if (TRUE) { picture->window = create_picwindow(); picture->image = gtk_image_new_from_pixbuf(picture->pixbuf); widget = lookup_widget(picture->window, "pictureframe"); gtk_container_add(GTK_CONTAINER(widget), picture->image); gtk_widget_show_all(picture->window); g_signal_connect((gpointer) picture->window, "delete_event", G_CALLBACK(delete_callback), (gpointer) picture); widget = lookup_widget(picture->window, "picturesavebutton"); g_signal_connect((gpointer) widget, "clicked", G_CALLBACK(on_picturesavebutton_clicked), (gpointer) picture); widget = lookup_widget(picture->window, "pictureclosebutton"); g_signal_connect((gpointer) widget, "clicked", G_CALLBACK(on_pictureclosebutton_clicked), (gpointer) picture); } else { textview_insert_pixbuf("rxtext", picture->pixbuf); } picture->active = TRUE; } void picture_stop(void) { if (picture) { picture->active = FALSE; picture = NULL; } } void picture_write(guchar data) { guchar *ptr; if (picture == NULL || picture->active == FALSE) return; ptr = gdk_pixbuf_get_pixels(picture->pixbuf); if (picture->x >= picture->width) { g_warning(_("picture write: x >= width (%d >= %d)"), picture->x, picture->width); return; } if (picture->y >= picture->height) { g_warning(_("picture write: y >= height (%d >= %d)"), picture->y, picture->height); return; } ptr += picture->y * picture->rowstride + picture->x * 3; if (picture->color) { ptr[picture->rgb] = data; } else { ptr[0] = data; ptr[1] = data; ptr[2] = data; } if (++picture->x == picture->width) { picture->x = 0; if (picture->color && ++picture->rgb < 3) return; picture->rgb = 0; picture->y++; } if (picture->image) gtk_widget_queue_draw(picture->image); } /* ---------------------------------------------------------------------- */ void picture_send(gchar *filename, gboolean color) { GError *error = NULL; GdkPixbuf *pixbuf; Picbuf *picbuf; gchar *file; if (!filename || !strcmp(filename, "?")) { GtkFileSelection *f; GtkWidget *w; gchar *dir; gint res; w = create_txpicfileselection(); f = GTK_FILE_SELECTION(w); dir = conf_get_pictxdir(); file = g_strdup_printf("%s%c", dir, G_DIR_SEPARATOR); gtk_file_selection_set_filename(f, file); g_free(dir); g_free(file); res = gtk_dialog_run(GTK_DIALOG(w)); switch (res) { case GTK_RESPONSE_OK: file = g_strdup(gtk_file_selection_get_filename(f)); gtk_widget_destroy(w); break; default: gtk_widget_destroy(w); return; } } else file = g_strdup(filename); pixbuf = gdk_pixbuf_new_from_file(file, &error); g_free(file); if (!pixbuf) { if (error) { errmsg(_("send_picture: %s"), error->message); g_error_free(error); } return; } picbuf = picbuf_new_from_pixbuf(pixbuf, color); g_object_unref(G_OBJECT(pixbuf)); if (!picbuf) { errmsg(_("send_picture: pixbuf conversion failed!")); return; } pixbuf = create_pixbuf("gmfsk/gnome-screenshot.png"); if (!pixbuf) { errmsg(_("send_picture: couldn't load picture icon!")); picbuf_free(picbuf); return; } textview_insert_pixbuf("txtext", pixbuf); g_object_unref(G_OBJECT(pixbuf)); trx_put_tx_picture(picbuf); } /* ---------------------------------------------------------------------- */ struct _Picbuf { gboolean color; gint width; gint height; gint datalen; guchar *data; gint dataptr; }; Picbuf *picbuf_new_from_pixbuf(GdkPixbuf *pixbuf, gboolean color) { Picbuf *picbuf; guchar *pixels, *src, *dst; gint channels, rowstride, x, y; g_return_val_if_fail(pixbuf != NULL, NULL); g_return_val_if_fail(gdk_pixbuf_get_colorspace(pixbuf) == GDK_COLORSPACE_RGB, NULL); g_return_val_if_fail(gdk_pixbuf_get_bits_per_sample(pixbuf) == 8, NULL); picbuf = g_new0(Picbuf, 1); picbuf->color = color; picbuf->width = gdk_pixbuf_get_width(pixbuf); picbuf->height = gdk_pixbuf_get_height(pixbuf); picbuf->datalen = picbuf->width * picbuf->height * (color ? 3 : 1); picbuf->data = g_malloc(picbuf->datalen); picbuf->dataptr = 0; channels = gdk_pixbuf_get_n_channels(pixbuf); rowstride = gdk_pixbuf_get_rowstride(pixbuf); pixels = gdk_pixbuf_get_pixels(pixbuf); for (y = 0; y < picbuf->height; y++) { src = pixels + y * rowstride; dst = picbuf->data + y * picbuf->width * (color ? 3 : 1); for (x = 0; x < picbuf->width; x++) { if (color) { dst[0 * picbuf->width] = src[0]; dst[1 * picbuf->width] = src[1]; dst[2 * picbuf->width] = src[2]; } else { dst[0] = (src[0] + src[1] + src[2]) / 3; } src += channels; dst += 1; } } return picbuf; } gboolean picbuf_get_color(Picbuf *picbuf) { return picbuf->color; } gint picbuf_get_width(Picbuf *picbuf) { return picbuf->width; } gint picbuf_get_height(Picbuf *picbuf) { return picbuf->height; } gchar *picbuf_make_header(Picbuf *picbuf) { return g_strdup_printf("Pic:%dx%d%s;", picbuf->width, picbuf->height, picbuf->color ? "C" : ""); } gboolean picbuf_get_data(Picbuf *picbuf, guchar *data, gint *len) { gint n = 0; while ((n < *len) && (picbuf->dataptr < picbuf->datalen)) data[n++] = picbuf->data[picbuf->dataptr++]; *len = n; return (picbuf->dataptr == picbuf->datalen) ? FALSE : TRUE; } gdouble picbuf_get_percentage(Picbuf *picbuf) { return 100.0 * picbuf->dataptr / picbuf->datalen; } void picbuf_free(Picbuf *picbuf) { g_free(picbuf->data); g_free(picbuf); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/picture.h0000644000076400007640000000402710037737510011371 /* * picture.h -- MFSK pictures support * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _PICTURE_H #define _PICTURE_H #include #include /* ---------------------------------------------------------------------- */ typedef struct _Picbuf Picbuf; /* ---------------------------------------------------------------------- */ extern gboolean picture_check_header(gchar *str, gint *w, gint *h, gboolean *color); extern void picture_start(gint width, gint height, gboolean color); extern void picture_stop(void); extern void picture_write(guchar data); extern void picture_send(gchar *filename, gboolean color); /* ---------------------------------------------------------------------- */ extern Picbuf *picbuf_new_from_pixbuf(GdkPixbuf *pixbuf, gboolean color); extern gboolean picbuf_get_color(Picbuf *picbuf); extern gint picbuf_get_width(Picbuf *picbuf); extern gint picbuf_get_height(Picbuf *picbuf); extern gchar *picbuf_make_header(Picbuf *picbuf); extern gboolean picbuf_get_data(Picbuf *picbuf, guchar *data, gint *len); extern gdouble picbuf_get_percentage(Picbuf *picbuf); extern void picbuf_free(Picbuf *picbuf); /* ---------------------------------------------------------------------- */ #endif gmfsk-0.7pre1/src/misc/0000777000076400007640000000000010206176676010571 5gmfsk-0.7pre1/src/misc/Makefile.am0000644000076400007640000000067610145452117012537 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ noinst_PROGRAMS = genfilt genfilt_SOURCES = genfilt.c noinst_LIBRARIES = libmisc.a libmisc_a_SOURCES = \ cmplx.c cmplx.h \ misc.c misc.h \ delay.c delay.h \ fft.c fft.h \ fftfilt.c fftfilt.h \ filter-i386.h filter.c filter.h \ sfft.c sfft.h \ viterbi.c viterbi.h genfilt_LDADD = -lm gmfsk-0.7pre1/src/misc/Makefile.in0000644000076400007640000003262710206155266012554 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ noinst_PROGRAMS = genfilt genfilt_SOURCES = genfilt.c noinst_LIBRARIES = libmisc.a libmisc_a_SOURCES = \ cmplx.c cmplx.h \ misc.c misc.h \ delay.c delay.h \ fft.c fft.h \ fftfilt.c fftfilt.h \ filter-i386.h filter.c filter.h \ sfft.c sfft.h \ viterbi.c viterbi.h genfilt_LDADD = -lm subdir = src/misc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libmisc_a_AR = $(AR) cru libmisc_a_LIBADD = am_libmisc_a_OBJECTS = cmplx.$(OBJEXT) misc.$(OBJEXT) delay.$(OBJEXT) \ fft.$(OBJEXT) fftfilt.$(OBJEXT) filter.$(OBJEXT) sfft.$(OBJEXT) \ viterbi.$(OBJEXT) libmisc_a_OBJECTS = $(am_libmisc_a_OBJECTS) noinst_PROGRAMS = genfilt$(EXEEXT) PROGRAMS = $(noinst_PROGRAMS) am_genfilt_OBJECTS = genfilt.$(OBJEXT) genfilt_OBJECTS = $(am_genfilt_OBJECTS) genfilt_DEPENDENCIES = genfilt_LDFLAGS = DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/cmplx.Po ./$(DEPDIR)/delay.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/fft.Po ./$(DEPDIR)/fftfilt.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/filter.Po ./$(DEPDIR)/genfilt.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/misc.Po ./$(DEPDIR)/sfft.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/viterbi.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libmisc_a_SOURCES) $(genfilt_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libmisc_a_SOURCES) $(genfilt_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/misc/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmisc.a: $(libmisc_a_OBJECTS) $(libmisc_a_DEPENDENCIES) -rm -f libmisc.a $(libmisc_a_AR) libmisc.a $(libmisc_a_OBJECTS) $(libmisc_a_LIBADD) $(RANLIB) libmisc.a clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) genfilt$(EXEEXT): $(genfilt_OBJECTS) $(genfilt_DEPENDENCIES) @rm -f genfilt$(EXEEXT) $(LINK) $(genfilt_LDFLAGS) $(genfilt_OBJECTS) $(genfilt_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmplx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/delay.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fftfilt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genfilt.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sfft.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/viterbi.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES clean-noinstPROGRAMS \ mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES clean-noinstPROGRAMS ctags distclean \ distclean-compile distclean-depend distclean-generic \ distclean-tags distdir dvi dvi-am info info-am install \ install-am install-data install-data-am install-exec \ install-exec-am install-info install-info-am install-man \ install-strip installcheck installcheck-am installdirs \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ tags uninstall uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/misc/cmplx.c0000644000076400007640000000546010066124013011757 /* * cmplx.c -- Complex arithmetic (non-optimized version) * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef __OPTIMIZE__ #include "cmplx.h" /* * Complex multiplication. */ complex cmul(complex x, complex y) { complex z; c_re(z) = c_re(x) * c_re(y) - c_im(x) * c_im(y); c_im(z) = c_re(x) * c_im(y) + c_im(x) * c_re(y); return z; } /* * Complex addition. */ complex cadd(complex x, complex y) { complex z; c_re(z) = c_re(x) + c_re(y); c_im(z) = c_im(x) + c_im(y); return z; } /* * Complex subtraction. */ complex csub(complex x, complex y) { complex z; c_re(z) = c_re(x) - c_re(y); c_im(z) = c_im(x) - c_im(y); return z; } /* * Complex multiply-accumulate. */ complex cmac(complex *a, complex *b, int ptr, int len) { complex z; int i; c_re(z) = 0.0; c_im(z) = 0.0; ptr = ptr % len; for (i = 0; i < len; i++) { z = cadd(z, cmul(a[i], b[ptr])); ptr = (ptr + 1) % len; } return z; } /* * Complex ... yeah, what??? Returns a complex number that has the * properties: |z| = |x| * |y| and arg(z) = arg(y) - arg(x) */ complex ccor(complex x, complex y) { complex z; c_re(z) = c_re(x) * c_re(y) + c_im(x) * c_im(y); c_im(z) = c_re(x) * c_im(y) - c_im(x) * c_re(y); return z; } /* * Real part of the complex ??? */ double ccorI(complex x, complex y) { return c_re(x) * c_re(y) + c_im(x) * c_im(y); } /* * Imaginary part of the complex ??? */ double ccorQ(complex x, complex y) { return c_re(x) * c_im(y) - c_im(x) * c_re(y); } /* * Modulo (absolute value) of a complex number. */ double cmod(complex x) { return sqrt(c_re(x) * c_re(x) + c_im(x) * c_im(x)); } /* * Square of the absolute value (power). */ double cpwr(complex x) { return (c_re(x) * c_re(x) + c_im(x) * c_im(x)); } /* * Argument of a complex number. */ double carg(complex x) { return atan2(c_im(x), c_re(x)); } /* * Complex square root. */ complex csqrt(complex x) { complex z; c_re(z) = sqrt(cmod(x) + c_re(x)) / M_SQRT2; c_im(z) = c_im(x) / c_re(z) / 2; return z; } #endif /* __OPTIMIZE__ */ gmfsk-0.7pre1/src/misc/cmplx.h0000644000076400007640000000622710166577756012021 /* * cmplx.h -- Complex arithmetic * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _COMPLEX_H #define _COMPLEX_H #ifdef HAVE_CONFIG_H # include #endif #include #include #ifdef HAVE_DFFTW_H #include #endif #ifdef HAVE_FFTW_H #include #endif typedef fftw_complex complex; /* * Complex multiplication. */ extern __inline__ complex cmul(complex x, complex y) { complex z; c_re(z) = c_re(x) * c_re(y) - c_im(x) * c_im(y); c_im(z) = c_re(x) * c_im(y) + c_im(x) * c_re(y); return z; } /* * Complex addition. */ extern __inline__ complex cadd(complex x, complex y) { complex z; c_re(z) = c_re(x) + c_re(y); c_im(z) = c_im(x) + c_im(y); return z; } /* * Complex subtraction. */ extern __inline__ complex csub(complex x, complex y) { complex z; c_re(z) = c_re(x) - c_re(y); c_im(z) = c_im(x) - c_im(y); return z; } /* * Complex multiply-accumulate. */ extern __inline__ complex cmac(complex *a, complex *b, gint ptr, gint len) { complex z; int i; c_re(z) = 0.0; c_im(z) = 0.0; ptr = ptr % len; for (i = 0; i < len; i++) { z = cadd(z, cmul(a[i], b[ptr])); ptr = (ptr + 1) % len; } return z; } /* * Complex ... yeah, what??? Returns a complex number that has the * properties: |z| = |x| * |y| and arg(z) = arg(y) - arg(x) */ extern __inline__ complex ccor(complex x, complex y) { complex z; c_re(z) = c_re(x) * c_re(y) + c_im(x) * c_im(y); c_im(z) = c_re(x) * c_im(y) - c_im(x) * c_re(y); return z; } /* * Real part of the complex ??? */ extern __inline__ double ccorI(complex x, complex y) { return c_re(x) * c_re(y) + c_im(x) * c_im(y); } /* * Imaginary part of the complex ??? */ extern __inline__ double ccorQ(complex x, complex y) { return c_re(x) * c_im(y) - c_im(x) * c_re(y); } /* * Modulo (absolute value) of a complex number. */ extern __inline__ double cmod(complex x) { return sqrt(c_re(x) * c_re(x) + c_im(x) * c_im(x)); } /* * Square of the absolute value (power). */ extern __inline__ double cpwr(complex x) { return (c_re(x) * c_re(x) + c_im(x) * c_im(x)); } /* * Argument of a complex number. */ extern __inline__ double carg(complex x) { return atan2(c_im(x), c_re(x)); } /* * Complex square root. */ extern __inline__ complex csqrt(complex x) { complex z; c_re(z) = sqrt(cmod(x) + c_re(x)) / M_SQRT2; c_im(z) = c_im(x) / c_re(z) / 2; return z; } #endif gmfsk-0.7pre1/src/misc/misc.c0000644000076400007640000001050410166602636011577 /* * misc.c -- Miscellaneous helper functions (non-optimized version) * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "misc.h" #ifndef __OPTIMIZE__ /* ---------------------------------------------------------------------- */ /* * Hamming weight (number of bits that are ones). */ guint32 hweight32(guint32 w) { w = (w & 0x55555555) + ((w >> 1) & 0x55555555); w = (w & 0x33333333) + ((w >> 2) & 0x33333333); w = (w & 0x0F0F0F0F) + ((w >> 4) & 0x0F0F0F0F); w = (w & 0x00FF00FF) + ((w >> 8) & 0x00FF00FF); w = (w & 0x0000FFFF) + ((w >> 16) & 0x0000FFFF); return w; } guint16 hweight16(guint16 w) { w = (w & 0x5555) + ((w >> 1) & 0x5555); w = (w & 0x3333) + ((w >> 2) & 0x3333); w = (w & 0x0F0F) + ((w >> 4) & 0x0F0F); w = (w & 0x00FF) + ((w >> 8) & 0x00FF); return w; } guint8 hweight8(guint8 w) { w = (w & 0x55) + ((w >> 1) & 0x55); w = (w & 0x33) + ((w >> 2) & 0x33); w = (w & 0x0F) + ((w >> 4) & 0x0F); return w; } /* ---------------------------------------------------------------------- */ /* * Parity function. Return one if `w' has odd number of ones, zero otherwise. */ gint parity(guint32 w) { return hweight32(w) & 1; } /* ---------------------------------------------------------------------- */ /* * Reverse order of bits. */ guint32 rbits32(guint32 w) { w = ((w >> 1) & 0x55555555) | ((w << 1) & 0xAAAAAAAA); w = ((w >> 2) & 0x33333333) | ((w << 2) & 0xCCCCCCCC); w = ((w >> 4) & 0x0F0F0F0F) | ((w << 4) & 0xF0F0F0F0); w = ((w >> 8) & 0x00FF00FF) | ((w << 8) & 0xFF00FF00); w = ((w >> 16) & 0x0000FFFF) | ((w << 16) & 0xFFFF0000); return w; } guint16 rbits16(guint16 w) { w = ((w >> 1) & 0x5555) | ((w << 1) & 0xAAAA); w = ((w >> 2) & 0x3333) | ((w << 2) & 0xCCCC); w = ((w >> 4) & 0x0F0F) | ((w << 4) & 0xF0F0); w = ((w >> 8) & 0x00FF) | ((w << 8) & 0xFF00); return w; } guint8 rbits8(guint8 w) { w = ((w >> 1) & 0x55) | ((w << 1) & 0xFF); w = ((w >> 2) & 0x33) | ((w << 2) & 0xCC); w = ((w >> 4) & 0x0F) | ((w << 4) & 0xF0); return w; } /* ---------------------------------------------------------------------- */ /* * Integer base-2 logarithm */ guint log2(guint x) { int y = 0; x >>= 1; while (x) { x >>= 1; y++; } return y; } /* ---------------------------------------------------------------------- */ /* * Gray encoding and decoding (8 bit) */ guint8 grayencode(guint8 data) { guint8 bits = data; bits ^= data >> 1; bits ^= data >> 2; bits ^= data >> 3; bits ^= data >> 4; bits ^= data >> 5; bits ^= data >> 6; bits ^= data >> 7; return bits; } guint8 graydecode(guint8 data) { return data ^ (data >> 1); } /* ---------------------------------------------------------------------- */ /* * Hamming window function */ gdouble hamming(gdouble x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } /* ---------------------------------------------------------------------- */ /* * Sinc etc... */ gdouble sinc(gdouble x) { return (fabs(x) < 1e-10) ? 1.0 : (sin(M_PI * x) / (M_PI * x)); } gdouble cosc(gdouble x) { return (fabs(x) < 1e-10) ? 0.0 : ((1.0 - cos(M_PI * x)) / (M_PI * x)); } /* ---------------------------------------------------------------------- */ gfloat clamp(gfloat x, gfloat min, gfloat max) { return (x < min) ? min : ((x > max) ? max : x); } /* ---------------------------------------------------------------------- */ gfloat decayavg(gfloat average, gfloat input, gfloat weight) { return input * (1.0 / weight) + average * (1.0 - (1.0 / weight)); } /* ---------------------------------------------------------------------- */ #endif /* __OPTIMIZE__ */ gmfsk-0.7pre1/src/misc/misc.h0000644000076400007640000001102710166602405011577 /* * misc.h -- Miscellaneous helper functions * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _MISC_H #define _MISC_H #include #include /* ---------------------------------------------------------------------- */ /* * Hamming weight (number of bits that are ones). */ extern inline guint32 hweight32(guint32 w) { w = (w & 0x55555555) + ((w >> 1) & 0x55555555); w = (w & 0x33333333) + ((w >> 2) & 0x33333333); w = (w & 0x0F0F0F0F) + ((w >> 4) & 0x0F0F0F0F); w = (w & 0x00FF00FF) + ((w >> 8) & 0x00FF00FF); w = (w & 0x0000FFFF) + ((w >> 16) & 0x0000FFFF); return w; } extern inline guint16 hweight16(guint16 w) { w = (w & 0x5555) + ((w >> 1) & 0x5555); w = (w & 0x3333) + ((w >> 2) & 0x3333); w = (w & 0x0F0F) + ((w >> 4) & 0x0F0F); w = (w & 0x00FF) + ((w >> 8) & 0x00FF); return w; } extern inline guint8 hweight8(guint8 w) { w = (w & 0x55) + ((w >> 1) & 0x55); w = (w & 0x33) + ((w >> 2) & 0x33); w = (w & 0x0F) + ((w >> 4) & 0x0F); return w; } /* ---------------------------------------------------------------------- */ /* * Parity function. Return one if `w' has odd number of ones, zero otherwise. */ extern inline gint parity(guint32 w) { return hweight32(w) & 1; } /* ---------------------------------------------------------------------- */ /* * Reverse order of bits. */ extern inline guint32 rbits32(guint32 w) { w = ((w >> 1) & 0x55555555) | ((w << 1) & 0xAAAAAAAA); w = ((w >> 2) & 0x33333333) | ((w << 2) & 0xCCCCCCCC); w = ((w >> 4) & 0x0F0F0F0F) | ((w << 4) & 0xF0F0F0F0); w = ((w >> 8) & 0x00FF00FF) | ((w << 8) & 0xFF00FF00); w = ((w >> 16) & 0x0000FFFF) | ((w << 16) & 0xFFFF0000); return w; } extern inline guint16 rbits16(guint16 w) { w = ((w >> 1) & 0x5555) | ((w << 1) & 0xAAAA); w = ((w >> 2) & 0x3333) | ((w << 2) & 0xCCCC); w = ((w >> 4) & 0x0F0F) | ((w << 4) & 0xF0F0); w = ((w >> 8) & 0x00FF) | ((w << 8) & 0xFF00); return w; } extern inline guint8 rbits8(guint8 w) { w = ((w >> 1) & 0x55) | ((w << 1) & 0xFF); w = ((w >> 2) & 0x33) | ((w << 2) & 0xCC); w = ((w >> 4) & 0x0F) | ((w << 4) & 0xF0); return w; } /* ---------------------------------------------------------------------- */ /* * Integer base-2 logarithm */ extern inline guint log2(guint x) { int y = 0; x >>= 1; while (x) { x >>= 1; y++; } return y; } /* ---------------------------------------------------------------------- */ /* * Gray encoding and decoding (8 bit) */ extern inline guint8 grayencode(guint8 data) { guint8 bits = data; bits ^= data >> 1; bits ^= data >> 2; bits ^= data >> 3; bits ^= data >> 4; bits ^= data >> 5; bits ^= data >> 6; bits ^= data >> 7; return bits; } extern inline guint8 graydecode(guint8 data) { return data ^ (data >> 1); } /* ---------------------------------------------------------------------- */ /* * Hamming window function */ extern inline gdouble hamming(gdouble x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } /* ---------------------------------------------------------------------- */ /* * Sinc etc... */ extern inline gdouble sinc(gdouble x) { return (fabs(x) < 1e-10) ? 1.0 : (sin(M_PI * x) / (M_PI * x)); } extern inline gdouble cosc(gdouble x) { return (fabs(x) < 1e-10) ? 0.0 : ((1.0 - cos(M_PI * x)) / (M_PI * x)); } /* ---------------------------------------------------------------------- */ extern inline gfloat clamp(gfloat x, gfloat min, gfloat max) { return (x < min) ? min : ((x > max) ? max : x); } /* ---------------------------------------------------------------------- */ extern inline gfloat decayavg(gfloat average, gfloat input, gfloat weight) { return input * (1.0 / weight) + average * (1.0 - (1.0 / weight)); } /* ---------------------------------------------------------------------- */ #endif /* _MISC_H */ gmfsk-0.7pre1/src/misc/delay.c0000644000076400007640000000304110166600153011730 /* * delay.c -- Delay line * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include "delay.h" /* ---------------------------------------------------------------------- */ struct delay *delay_init(gint len) { struct delay *s; s = g_new0(struct delay, 1); s->delayline = g_new0(guchar, len); s->len = len; s->ptr = 0; return s; } void delay_free(struct delay *s) { if (s) { g_free(s->delayline); g_free(s); } } guchar delay_run(struct delay *s, guchar data) { unsigned char ret; ret = s->delayline[s->ptr]; s->delayline[s->ptr] = data; s->ptr = (s->ptr + 1) % s->len; return ret; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/misc/delay.h0000644000076400007640000000217510166600114011741 /* * delay.h -- Delay line * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _DELAY_H #define _DELAY_H #include struct delay { guchar *delayline; gint len; gint ptr; }; extern struct delay *delay_init(gint len); extern void delay_free(struct delay *s); extern guchar delay_run(struct delay *s, guchar data); #endif gmfsk-0.7pre1/src/misc/fft.c0000644000076400007640000000633210166600457011426 /* * fft.c -- Fast Fourier Transform * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "fft.h" #include "misc.h" /* ---------------------------------------------------------------------- */ #define FLAGS (FFTW_MEASURE | FFTW_OUT_OF_PLACE | FFTW_USE_WISDOM) struct fft *fft_init(gint len, gint dir) { struct fft *s; s = g_new0(struct fft, 1); if ((s->in = fftw_malloc(len * sizeof(fftw_complex))) == NULL) { fft_free(s); return NULL; } if ((s->out = fftw_malloc(len * sizeof(fftw_complex))) == NULL) { fft_free(s); return NULL; } #if 1 s->plan = fftw_create_plan(len, dir, FLAGS); #else s->plan = fftw_plan_dft_1d(len, s->in, s->out, FFTW_FORWARD, FFTW_MEASURE); #endif if (!s->plan) { fft_free(s); return NULL; } s->len = len; fft_clear_inbuf(s); fft_clear_outbuf(s); return s; } void fft_free(struct fft *s) { if (s) { if (s->plan) fftw_destroy_plan(s->plan); if (s->in) fftw_free(s->in); if (s->out) fftw_free(s->out); g_free(s); } } void fft_clear_inbuf(struct fft *s) { gint i; for (i = 0; i < s->len; i++) { c_re(s->in[i]) = 0.0; c_im(s->in[i]) = 0.0; } } void fft_clear_outbuf(struct fft *s) { int i; for (i = 0; i < s->len; i++) { c_re(s->out[i]) = 0.0; c_im(s->out[i]) = 0.0; } } void fft_run(struct fft *s) { #if 1 fftw_one(s->plan, s->in, s->out); #else fftw_execute(s->plan); #endif } /* ---------------------------------------------------------------------- */ void fft_load_wisdom(const gchar *filename) { FILE *fp; if (filename == NULL) return; if ((fp = fopen(filename, "r")) == NULL) { g_warning("fft_load_wisdom: %s: %m\n", filename); return; } if (fftw_import_wisdom_from_file(fp) == FFTW_FAILURE) g_warning("fftw_import_wisdom_from_file failed!"); fclose(fp); } void fft_save_wisdom(const gchar *filename) { FILE *fp; if (filename == NULL) return; if ((fp = fopen(filename, "w")) == NULL) { g_warning("fft_save_wisdom: %s: %m\n", filename); return; } fftw_export_wisdom_to_file(fp); fclose(fp); } void fft_set_wisdom(const char *wisdom) { if (wisdom == NULL) return; if (fftw_import_wisdom_from_string(wisdom) == FFTW_FAILURE) g_warning("Error importing FFTW wisdom!!!\n"); } char *fft_get_wisdom(void) { return fftw_export_wisdom_to_string(); } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/misc/fft.h0000644000076400007640000000311710166600450011422 /* * fft.h -- Fast Fourier Transform * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _FFT_H #define _FFT_H #include #ifdef HAVE_DFFTW_H #include #endif #ifdef HAVE_FFTW_H #include #endif #define FFT_FWD FFTW_FORWARD #define FFT_REV FFTW_BACKWARD #include "cmplx.h" struct fft { gint len; fftw_plan plan; fftw_complex *in; fftw_complex *out; }; extern struct fft *fft_init(gint len, gint dir); extern void fft_free(struct fft *s); extern void fft_clear_inbuf(struct fft *s); extern void fft_clear_outbuf(struct fft *s); extern void fft_run(struct fft *s); extern void fft_load_wisdom(const gchar *filename); extern void fft_save_wisdom(const gchar *filename); extern void fft_set_wisdom(const gchar *wisdom); extern char *fft_get_wisdom(void); #endif gmfsk-0.7pre1/src/misc/fftfilt.c0000644000076400007640000000700110166600530012267 /* * fftfilt.c -- Fast convolution FIR filter * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "fftfilt.h" #include "fft.h" #include "misc.h" #undef DEBUG struct fftfilt *fftfilt_init(gdouble f1, gdouble f2, gint len) { struct fftfilt *s; s = g_new0(struct fftfilt, 1); if ((s->fft = fft_init(len, FFT_FWD)) == NULL) { fftfilt_free(s); return NULL; } if ((s->ift = fft_init(len, FFT_REV)) == NULL) { fftfilt_free(s); return NULL; } if ((s->tmpfft = fft_init(len, FFT_FWD)) == NULL) { fftfilt_free(s); return NULL; } s->ovlbuf = g_new0(complex, len / 2); s->filter = g_new0(complex, len); s->filterlen = len; s->inptr = 0; fftfilt_set_freqs(s, f1, f2); return s; } void fftfilt_free(struct fftfilt *s) { if (s) { fft_free(s->fft); fft_free(s->ift); fft_free(s->tmpfft); g_free(s->ovlbuf); g_free(s->filter); g_free(s); } } void fftfilt_set_freqs(struct fftfilt *s, gdouble f1, gdouble f2) { gint len = s->filterlen / 2 + 1; gdouble t, h, x; gint i; fft_clear_inbuf(s->tmpfft); for (i = 0; i < len; i++) { t = i - (len - 1.0) / 2.0; h = i / (len - 1.0); x = (2 * f2 * sinc(2 * f2 * t) - 2 * f1 * sinc(2 * f1 * t)) * hamming(h); c_re(s->tmpfft->in[i]) = x; c_im(s->tmpfft->in[i]) = 0.0; #ifdef DEBUG fprintf(stderr, "% e\t", x); #endif } fft_run(s->tmpfft); /* * Scale down by 'filterlen' because inverse transform is * unscaled in FFTW. */ for (i = 0; i < s->filterlen; i++) { c_re(s->filter[i]) = c_re(s->tmpfft->out[i]) / s->filterlen; c_im(s->filter[i]) = c_im(s->tmpfft->out[i]) / s->filterlen; } #ifdef DEBUG for (i = 0; i < s->filterlen; i++) fprintf(stderr, "% e\n", 10 * log10(cpwr(s->filter[i]))); #endif } /* * Filter with fast convolution (overlap-add algorithm). */ gint fftfilt_run(struct fftfilt *s, complex in, complex **out) { gint i; /* collect filterlen/2 input samples */ s->fft->in[s->inptr++] = in; if (s->inptr < s->filterlen / 2) return 0; /* FFT */ fft_run(s->fft); /* multiply with the filter shape */ for (i = 0; i < s->filterlen; i++) s->ift->in[i] = cmul(s->fft->out[i], s->filter[i]); /* IFFT */ fft_run(s->ift); /* overlap and add */ for (i = 0; i < s->filterlen / 2; i++) { c_re(s->ift->out[i]) += c_re(s->ovlbuf[i]); c_im(s->ift->out[i]) += c_im(s->ovlbuf[i]); } *out = s->ift->out; /* save the second half for overlapping */ for (i = 0; i < s->filterlen / 2; i++) { c_re(s->ovlbuf[i]) = c_re(s->ift->out[i + s->filterlen / 2]); c_im(s->ovlbuf[i]) = c_im(s->ift->out[i + s->filterlen / 2]); } /* clear inbuf */ fft_clear_inbuf(s->fft); s->inptr = 0; /* signal the caller there is filterlen/2 samples ready */ return s->filterlen / 2; } gmfsk-0.7pre1/src/misc/fftfilt.h0000644000076400007640000000321010166600424012274 /* * fftfilt.h -- Fast convolution FIR filter * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _FFTFILT_H #define _FFTFILT_H #include #include "cmplx.h" #include "fft.h" /* ---------------------------------------------------------------------- */ struct fftfilt { gint filterlen; struct fft *fft; struct fft *ift; struct fft *tmpfft; complex *filter; gint inptr; complex *ovlbuf; }; /* ---------------------------------------------------------------------- */ extern struct fftfilt *fftfilt_init(gdouble f1, gdouble f2, gint len); extern void fftfilt_free(struct fftfilt *s); extern void fftfilt_set_freqs(struct fftfilt *s, gdouble f1, gdouble f2); extern gint fftfilt_run(struct fftfilt *, complex in, complex **out); /* ---------------------------------------------------------------------- */ #endif gmfsk-0.7pre1/src/misc/filter-i386.h0000644000076400007640000006420710064127115012625 /* * filter-i386.h -- optimized filter routines * * Copyright (C) 1996 * Thomas Sailer (sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* ---------------------------------------------------------------------- */ #ifndef _FILTER_I386_H #define _FILTER_I386_H /* ---------------------------------------------------------------------- */ #define __HAVE_ARCH_MAC #define mac(a,b,size) \ (__builtin_constant_p(size) ? __mac_c((a),(b),(size)) : __mac_g((a),(b),(size))) #include extern inline float __mac_g(const float *a, const float *b, unsigned int size) { float sum = 0; unsigned int i; for (i = 0; i < size; i++) sum += (*a++) * (*b++); return sum; } extern inline float __mac_c(const float *a, const float *b, unsigned int size) { float f; /* * inspired from Phil Karn, KA9Q's home page */ switch (size) { case 37: asm volatile ("flds (%1);\n\t" "fmuls (%2);\n\t" "flds 4(%1);\n\t" "fmuls 4(%2);\n\t" "flds 8(%1);\n\t" "fmuls 8(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 12(%1);\n\t" "fmuls 12(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 16(%1);\n\t" "fmuls 16(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 20(%1);\n\t" "fmuls 20(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 24(%1);\n\t" "fmuls 24(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 28(%1);\n\t" "fmuls 28(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 32(%1);\n\t" "fmuls 32(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 36(%1);\n\t" "fmuls 36(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 40(%1);\n\t" "fmuls 40(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 44(%1);\n\t" "fmuls 44(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 48(%1);\n\t" "fmuls 48(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 52(%1);\n\t" "fmuls 52(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 56(%1);\n\t" "fmuls 56(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 60(%1);\n\t" "fmuls 60(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 64(%1);\n\t" "fmuls 64(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 68(%1);\n\t" "fmuls 68(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 72(%1);\n\t" "fmuls 72(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 76(%1);\n\t" "fmuls 76(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 80(%1);\n\t" "fmuls 80(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 84(%1);\n\t" "fmuls 84(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 88(%1);\n\t" "fmuls 88(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 92(%1);\n\t" "fmuls 92(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 96(%1);\n\t" "fmuls 96(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 100(%1);\n\t" "fmuls 100(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 104(%1);\n\t" "fmuls 104(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 108(%1);\n\t" "fmuls 108(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 112(%1);\n\t" "fmuls 112(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 116(%1);\n\t" "fmuls 116(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 120(%1);\n\t" "fmuls 120(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 124(%1);\n\t" "fmuls 124(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 128(%1);\n\t" "fmuls 128(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 132(%1);\n\t" "fmuls 132(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 136(%1);\n\t" "fmuls 136(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 140(%1);\n\t" "fmuls 140(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 144(%1);\n\t" "fmuls 144(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "faddp;\n\t" : "=t" (f) : "r" (a) , "r" (b) : "memory"); return f; case 64: asm volatile ("flds (%1);\n\t" "fmuls (%2);\n\t" "flds 4(%1);\n\t" "fmuls 4(%2);\n\t" "flds 8(%1);\n\t" "fmuls 8(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 12(%1);\n\t" "fmuls 12(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 16(%1);\n\t" "fmuls 16(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 20(%1);\n\t" "fmuls 20(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 24(%1);\n\t" "fmuls 24(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 28(%1);\n\t" "fmuls 28(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 32(%1);\n\t" "fmuls 32(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 36(%1);\n\t" "fmuls 36(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 40(%1);\n\t" "fmuls 40(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 44(%1);\n\t" "fmuls 44(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 48(%1);\n\t" "fmuls 48(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 52(%1);\n\t" "fmuls 52(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 56(%1);\n\t" "fmuls 56(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 60(%1);\n\t" "fmuls 60(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 64(%1);\n\t" "fmuls 64(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 68(%1);\n\t" "fmuls 68(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 72(%1);\n\t" "fmuls 72(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 76(%1);\n\t" "fmuls 76(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 80(%1);\n\t" "fmuls 80(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 84(%1);\n\t" "fmuls 84(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 88(%1);\n\t" "fmuls 88(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 92(%1);\n\t" "fmuls 92(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 96(%1);\n\t" "fmuls 96(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 100(%1);\n\t" "fmuls 100(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 104(%1);\n\t" "fmuls 104(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 108(%1);\n\t" "fmuls 108(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 112(%1);\n\t" "fmuls 112(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 116(%1);\n\t" "fmuls 116(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 120(%1);\n\t" "fmuls 120(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 124(%1);\n\t" "fmuls 124(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 128(%1);\n\t" "fmuls 128(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 132(%1);\n\t" "fmuls 132(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 136(%1);\n\t" "fmuls 136(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 140(%1);\n\t" "fmuls 140(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 144(%1);\n\t" "fmuls 144(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 148(%1);\n\t" "fmuls 148(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 152(%1);\n\t" "fmuls 152(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 156(%1);\n\t" "fmuls 156(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 160(%1);\n\t" "fmuls 160(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 164(%1);\n\t" "fmuls 164(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 168(%1);\n\t" "fmuls 168(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 172(%1);\n\t" "fmuls 172(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 176(%1);\n\t" "fmuls 176(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 180(%1);\n\t" "fmuls 180(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 184(%1);\n\t" "fmuls 184(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 188(%1);\n\t" "fmuls 188(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 192(%1);\n\t" "fmuls 192(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 196(%1);\n\t" "fmuls 196(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 200(%1);\n\t" "fmuls 200(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 204(%1);\n\t" "fmuls 204(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 208(%1);\n\t" "fmuls 208(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 212(%1);\n\t" "fmuls 212(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 216(%1);\n\t" "fmuls 216(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 220(%1);\n\t" "fmuls 220(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 224(%1);\n\t" "fmuls 224(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 228(%1);\n\t" "fmuls 228(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 232(%1);\n\t" "fmuls 232(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 236(%1);\n\t" "fmuls 236(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 240(%1);\n\t" "fmuls 240(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 244(%1);\n\t" "fmuls 244(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 248(%1);\n\t" "fmuls 248(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 252(%1);\n\t" "fmuls 252(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "faddp;\n\t" : "=t" (f) : "r" (a) , "r" (b) : "memory"); return f; case 127: asm volatile ("flds (%1);\n\t" "fmuls (%2);\n\t" "flds 4(%1);\n\t" "fmuls 4(%2);\n\t" "flds 8(%1);\n\t" "fmuls 8(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 12(%1);\n\t" "fmuls 12(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 16(%1);\n\t" "fmuls 16(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 20(%1);\n\t" "fmuls 20(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 24(%1);\n\t" "fmuls 24(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 28(%1);\n\t" "fmuls 28(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 32(%1);\n\t" "fmuls 32(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 36(%1);\n\t" "fmuls 36(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 40(%1);\n\t" "fmuls 40(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 44(%1);\n\t" "fmuls 44(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 48(%1);\n\t" "fmuls 48(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 52(%1);\n\t" "fmuls 52(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 56(%1);\n\t" "fmuls 56(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 60(%1);\n\t" "fmuls 60(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 64(%1);\n\t" "fmuls 64(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 68(%1);\n\t" "fmuls 68(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 72(%1);\n\t" "fmuls 72(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 76(%1);\n\t" "fmuls 76(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 80(%1);\n\t" "fmuls 80(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 84(%1);\n\t" "fmuls 84(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 88(%1);\n\t" "fmuls 88(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 92(%1);\n\t" "fmuls 92(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 96(%1);\n\t" "fmuls 96(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 100(%1);\n\t" "fmuls 100(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 104(%1);\n\t" "fmuls 104(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 108(%1);\n\t" "fmuls 108(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 112(%1);\n\t" "fmuls 112(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 116(%1);\n\t" "fmuls 116(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 120(%1);\n\t" "fmuls 120(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 124(%1);\n\t" "fmuls 124(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 128(%1);\n\t" "fmuls 128(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 132(%1);\n\t" "fmuls 132(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 136(%1);\n\t" "fmuls 136(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 140(%1);\n\t" "fmuls 140(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 144(%1);\n\t" "fmuls 144(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 148(%1);\n\t" "fmuls 148(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 152(%1);\n\t" "fmuls 152(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 156(%1);\n\t" "fmuls 156(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 160(%1);\n\t" "fmuls 160(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 164(%1);\n\t" "fmuls 164(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 168(%1);\n\t" "fmuls 168(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 172(%1);\n\t" "fmuls 172(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 176(%1);\n\t" "fmuls 176(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 180(%1);\n\t" "fmuls 180(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 184(%1);\n\t" "fmuls 184(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 188(%1);\n\t" "fmuls 188(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 192(%1);\n\t" "fmuls 192(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 196(%1);\n\t" "fmuls 196(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 200(%1);\n\t" "fmuls 200(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 204(%1);\n\t" "fmuls 204(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 208(%1);\n\t" "fmuls 208(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 212(%1);\n\t" "fmuls 212(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 216(%1);\n\t" "fmuls 216(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 220(%1);\n\t" "fmuls 220(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 224(%1);\n\t" "fmuls 224(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 228(%1);\n\t" "fmuls 228(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 232(%1);\n\t" "fmuls 232(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 236(%1);\n\t" "fmuls 236(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 240(%1);\n\t" "fmuls 240(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 244(%1);\n\t" "fmuls 244(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 248(%1);\n\t" "fmuls 248(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 252(%1);\n\t" "fmuls 252(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 256(%1);\n\t" "fmuls 256(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 260(%1);\n\t" "fmuls 260(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 264(%1);\n\t" "fmuls 264(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 268(%1);\n\t" "fmuls 268(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 272(%1);\n\t" "fmuls 272(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 276(%1);\n\t" "fmuls 276(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 280(%1);\n\t" "fmuls 280(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 284(%1);\n\t" "fmuls 284(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 288(%1);\n\t" "fmuls 288(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 292(%1);\n\t" "fmuls 292(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 296(%1);\n\t" "fmuls 296(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 300(%1);\n\t" "fmuls 300(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 304(%1);\n\t" "fmuls 304(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 308(%1);\n\t" "fmuls 308(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 312(%1);\n\t" "fmuls 312(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 316(%1);\n\t" "fmuls 316(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 320(%1);\n\t" "fmuls 320(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 324(%1);\n\t" "fmuls 324(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 328(%1);\n\t" "fmuls 328(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 332(%1);\n\t" "fmuls 332(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 336(%1);\n\t" "fmuls 336(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 340(%1);\n\t" "fmuls 340(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 344(%1);\n\t" "fmuls 344(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 348(%1);\n\t" "fmuls 348(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 352(%1);\n\t" "fmuls 352(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 356(%1);\n\t" "fmuls 356(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 360(%1);\n\t" "fmuls 360(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 364(%1);\n\t" "fmuls 364(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 368(%1);\n\t" "fmuls 368(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 372(%1);\n\t" "fmuls 372(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 376(%1);\n\t" "fmuls 376(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 380(%1);\n\t" "fmuls 380(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 384(%1);\n\t" "fmuls 384(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 388(%1);\n\t" "fmuls 388(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 392(%1);\n\t" "fmuls 392(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 396(%1);\n\t" "fmuls 396(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 400(%1);\n\t" "fmuls 400(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 404(%1);\n\t" "fmuls 404(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 408(%1);\n\t" "fmuls 408(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 412(%1);\n\t" "fmuls 412(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 416(%1);\n\t" "fmuls 416(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 420(%1);\n\t" "fmuls 420(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 424(%1);\n\t" "fmuls 424(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 428(%1);\n\t" "fmuls 428(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 432(%1);\n\t" "fmuls 432(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 436(%1);\n\t" "fmuls 436(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 440(%1);\n\t" "fmuls 440(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 444(%1);\n\t" "fmuls 444(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 448(%1);\n\t" "fmuls 448(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 452(%1);\n\t" "fmuls 452(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 456(%1);\n\t" "fmuls 456(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 460(%1);\n\t" "fmuls 460(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 464(%1);\n\t" "fmuls 464(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 468(%1);\n\t" "fmuls 468(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 472(%1);\n\t" "fmuls 472(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 476(%1);\n\t" "fmuls 476(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 480(%1);\n\t" "fmuls 480(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 484(%1);\n\t" "fmuls 484(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 488(%1);\n\t" "fmuls 488(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 492(%1);\n\t" "fmuls 492(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 496(%1);\n\t" "fmuls 496(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 500(%1);\n\t" "fmuls 500(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "flds 504(%1);\n\t" "fmuls 504(%2);\n\t" "fxch %%st(2);\n\t" "faddp;\n\t" "faddp;\n\t" : "=t" (f) : "r" (a) , "r" (b) : "memory"); return f; default: fprintf(stderr, "Warning: optimize __mac_c(..., ..., %d)\n", size); return __mac_g(a, b, size); } } /* ---------------------------------------------------------------------- */ #endif /* _FILTER_I386_H */ gmfsk-0.7pre1/src/misc/filter.c0000644000076400007640000001403010166601102012112 /* * filter.c -- FIR filter * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "filter.h" #undef DEBUG #ifdef DEBUG #include #endif /* ---------------------------------------------------------------------- */ /* * This gets used when not optimising */ #ifndef __OPTIMIZE__ gfloat mac(const gfloat *a, const gfloat *b, guint len) { float sum = 0; guint i; for (i = 0; i < len; i++) sum += (*a++) * (*b++); return sum; } #endif /* ---------------------------------------------------------------------- */ /* * Sinc done properly. */ static inline gdouble sinc(gdouble x) { if (fabs(x) < 1e-10) return 1.0; else return sin(M_PI * x) / (M_PI * x); } /* * Don't ask... */ static inline gdouble cosc(gdouble x) { if (fabs(x) < 1e-10) return 0.0; else return (1.0 - cos(M_PI * x)) / (M_PI * x); } /* * Hamming window function. */ static inline gdouble hamming(gdouble x) { return 0.54 - 0.46 * cos(2 * M_PI * x); } /* ---------------------------------------------------------------------- */ /* * Create a band pass FIR filter with 6 dB corner frequencies * of 'f1' and 'f2'. (0 <= f1 < f2 <= 0.5) */ static gfloat *mk_filter(gint len, gint hilbert, gfloat f1, gfloat f2) { gfloat *fir; gfloat t, h, x; gint i; fir = g_new(gfloat, len); for (i = 0; i < len; i++) { t = i - (len - 1.0) / 2.0; h = i * (1.0 / (len - 1.0)); if (!hilbert) { x = (2 * f2 * sinc(2 * f2 * t) - 2 * f1 * sinc(2 * f1 * t)) * hamming(h); } else { x = (2 * f2 * cosc(2 * f2 * t) - 2 * f1 * cosc(2 * f1 * t)) * hamming(h); /* * The actual filter code assumes the impulse response * is in time reversed order. This will be anti- * symmetric so the minus sign handles that for us. */ x = -x; } fir[i] = x; } return fir; } struct filter *filter_init(gint len, gint dec, gfloat *itaps, gfloat *qtaps) { struct filter *f; f = g_new0(struct filter, 1); f->length = len; f->decimateratio = dec; if (itaps) f->ifilter = g_memdup(itaps, len * sizeof(gfloat)); if (qtaps) f->qfilter = g_memdup(qtaps, len * sizeof(gfloat)); f->pointer = len; f->counter = 0; return f; } struct filter *filter_init_lowpass(gint len, gint dec, gfloat freq) { struct filter *f; gfloat *i, *q; i = mk_filter(len, 0, 0.0, freq); q = mk_filter(len, 0, 0.0, freq); f = filter_init(len, dec, i, q); g_free(i); g_free(q); return f; } struct filter *filter_init_bandpass(gint len, gint dec, gfloat f1, gfloat f2) { struct filter *f; gfloat *i, *q; i = mk_filter(len, 0, f1, f2); q = mk_filter(len, 0, f1, f2); f = filter_init(len, dec, i, q); g_free(i); g_free(q); return f; } struct filter *filter_init_hilbert(gint len, gint dec) { struct filter *f; gfloat *i, *q; i = mk_filter(len, 0, 0.05, 0.45); q = mk_filter(len, 1, 0.05, 0.45); f = filter_init(len, dec, i, q); g_free(i); g_free(q); return f; } void filter_free(struct filter *f) { if (f) { g_free(f->ifilter); g_free(f->qfilter); g_free(f); } } /* ---------------------------------------------------------------------- */ gint filter_run(struct filter *f, complex in, complex *out) { gfloat *iptr = f->ibuffer + f->pointer; gfloat *qptr = f->qbuffer + f->pointer; f->pointer++; f->counter++; *iptr = c_re(in); *qptr = c_im(in); if (f->counter == f->decimateratio) { out->re = mac(iptr - f->length, f->ifilter, f->length); out->im = mac(qptr - f->length, f->qfilter, f->length); } if (f->pointer == BufferLen) { iptr = f->ibuffer + BufferLen - f->length; qptr = f->qbuffer + BufferLen - f->length; memcpy(f->ibuffer, iptr, f->length * sizeof(float)); memcpy(f->qbuffer, qptr, f->length * sizeof(float)); f->pointer = f->length; } if (f->counter == f->decimateratio) { f->counter = 0; return 1; } return 0; } gint filter_I_run(struct filter *f, gfloat in, gfloat *out) { gfloat *iptr = f->ibuffer + f->pointer; f->pointer++; f->counter++; *iptr = in; if (f->counter == f->decimateratio) { *out = mac(iptr - f->length, f->ifilter, f->length); } if (f->pointer == BufferLen) { iptr = f->ibuffer + BufferLen - f->length; memcpy(f->ibuffer, iptr, f->length * sizeof(float)); f->pointer = f->length; } if (f->counter == f->decimateratio) { f->counter = 0; return 1; } return 0; } gint filter_Q_run(struct filter *f, gfloat in, gfloat *out) { gfloat *qptr = f->ibuffer + f->pointer; f->pointer++; f->counter++; *qptr = in; if (f->counter == f->decimateratio) { *out = mac(qptr - f->length, f->qfilter, f->length); } if (f->pointer == BufferLen) { qptr = f->qbuffer + BufferLen - f->length; memcpy(f->qbuffer, qptr, f->length * sizeof(float)); f->pointer = f->length; } if (f->counter == f->decimateratio) { f->counter = 0; return 1; } return 0; } /* ---------------------------------------------------------------------- */ void filter_dump(struct filter *f) { gint i; fprintf(stderr, "# len = %d\n", f->length); for (i = 0; i < f->length; i++) { if (f->ifilter) fprintf(stderr, "% .10f ", f->ifilter[i]); else fprintf(stderr, " "); if (f->qfilter) fprintf(stderr, "% .10f\n", f->qfilter[i]); else fprintf(stderr, "\n"); } } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/misc/filter.h0000644000076400007640000000451510166601270012134 /* * filter.h -- FIR filter * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _FILTER_H #define _FILTER_H #include #include "cmplx.h" #define BufferLen 1024 /* ---------------------------------------------------------------------- */ #ifdef __OPTIMIZE__ #ifdef __i386__ #include "filter-i386.h" #endif /* __i386__ */ #ifndef __HAVE_ARCH_MAC extern __inline__ float mac(const gfloat *a, const gfloat *b, guint size) { gfloat sum = 0; guint i; for (i = 0; i < size; i++) sum += (*a++) * (*b++); return sum; } #endif /* __HAVE_ARCH_MAC */ #endif /* __OPTIMIZE__ */ /* ---------------------------------------------------------------------- */ struct filter { gint length; gint decimateratio; gfloat *ifilter; gfloat *qfilter; gfloat ibuffer[BufferLen]; gfloat qbuffer[BufferLen]; gint pointer; gint counter; }; extern struct filter *filter_init(gint len, gint dec, gfloat *ifil, gfloat *qfil); extern struct filter *filter_init_lowpass(gint len, gint dec, gfloat freq); extern struct filter *filter_init_bandpass(gint len, gint dec, gfloat f1, gfloat f2); extern struct filter *filter_init_hilbert(gint len, gint dec); extern void filter_free(struct filter *f); extern gint filter_run(struct filter *f, complex in, complex *out); extern gint filter_I_run(struct filter *f, gfloat in, gfloat *out); extern gint filter_Q_run(struct filter *f, gfloat in, gfloat *out); extern void filter_dump(struct filter *f); /* ---------------------------------------------------------------------- */ #endif /* _FILTER_H */ gmfsk-0.7pre1/src/misc/sfft.c0000644000076400007640000000443110166602747011613 /* * sfft.c -- Sliding FFT * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "sfft.h" #include "misc.h" #define STABCOEFF 0.9999 /* ---------------------------------------------------------------------- */ struct sfft *sfft_init(gint len, gint first, gint last) { struct sfft *s; gint i; s = g_new0(struct sfft, 1); s->twiddles = g_new0(complex, len); s->history = g_new0(complex, len); s->bins = g_new0(complex, len); s->fftlen = len; s->first = first; s->last = last; for (i = 0; i < len; i++) { c_re(s->twiddles[i]) = cos(i * 2.0 * M_PI / len) * STABCOEFF; c_im(s->twiddles[i]) = sin(i * 2.0 * M_PI / len) * STABCOEFF; } s->corr = pow(STABCOEFF, len); return s; } void sfft_free(struct sfft *s) { if (s) { g_free(s->twiddles); g_free(s->history); g_free(s->bins); g_free(s); } } /* * Sliding FFT, complex input, complex output */ complex *sfft_run(struct sfft *s, complex new) { complex old, z; gint i; /* restore the sample fftlen samples back */ old = s->history[s->ptr]; c_re(old) *= s->corr; c_im(old) *= s->corr; /* save the new sample */ s->history[s->ptr] = new; /* advance the history pointer */ s->ptr = (s->ptr + 1) % s->fftlen; /* calculate the wanted bins */ for (i = s->first; i < s->last; i++) { z = s->bins[i]; z = csub(z, old); z = cadd(z, new); s->bins[i] = cmul(z, s->twiddles[i]); } return s->bins; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/misc/sfft.h0000644000076400007640000000233110166602701011603 /* * sfft.h -- Sliding FFT * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _SFFT_H #define _SFFT_H #include #include "cmplx.h" struct sfft { gint fftlen; gint first; gint last; gint ptr; complex *twiddles; complex *bins; complex *history; gdouble corr; }; extern struct sfft *sfft_init(gint, gint, gint); extern void sfft_free(struct sfft *); extern complex *sfft_run(struct sfft *, complex); #endif gmfsk-0.7pre1/src/misc/viterbi.c0000644000076400007640000001250310166603223012302 /* * viterbi.c -- Viterbi decoder * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "viterbi.h" #include "misc.h" /* ---------------------------------------------------------------------- */ struct viterbi *viterbi_init(gint k, gint poly1, gint poly2) { struct viterbi *v; gint i; v = g_new0(struct viterbi, 1); v->traceback = PATHMEM - 1; v->chunksize = 8; v->nstates = 1 << (k - 1); v->output = g_new0(int, 1 << k); for (i = 0; i < (1 << k); i++) v->output[i] = parity(poly1 & i) | (parity(poly2 & i) << 1); for (i = 0; i < PATHMEM; i++) { v->metrics[i] = g_new0(int, v->nstates); v->history[i] = g_new0(int, v->nstates); } for (i = 0; i < 256; i++) { v->mettab[0][i] = 128 - i; v->mettab[1][i] = i - 128; } v->ptr = 0; return v; } gint viterbi_set_traceback(struct viterbi *v, gint traceback) { if (traceback < 0 || traceback > PATHMEM - 1) return -1; v->traceback = traceback; return 0; } gint viterbi_set_chunksize(struct viterbi *v, gint chunksize) { if (chunksize < 1 || chunksize > v->traceback) return -1; v->chunksize = chunksize; return 0; } void viterbi_reset(struct viterbi *v) { int i; for (i = 0; i < PATHMEM; i++) { memset(v->metrics[i], 0, v->nstates * sizeof(int)); memset(v->history[i], 0, v->nstates * sizeof(int)); } v->ptr = 0; } void viterbi_free(struct viterbi *v) { int i; if (v) { g_free(v->output); for (i = 0; i < v->nstates; i++) { g_free(v->metrics[i]); g_free(v->history[i]); } g_free(v); } } static gint traceback(struct viterbi *v, gint *metric); gint viterbi_decode(struct viterbi *v, guchar *sym, gint *metric) { guint currptr, prevptr; gint i, j, met[4], n; currptr = v->ptr; prevptr = (currptr - 1) % PATHMEM; #if 0 sym[0] = (sym[0] < 128) ? 0 : 255; sym[1] = (sym[1] < 128) ? 0 : 255; #endif met[0] = v->mettab[0][sym[1]] + v->mettab[0][sym[0]]; met[1] = v->mettab[0][sym[1]] + v->mettab[1][sym[0]]; met[2] = v->mettab[1][sym[1]] + v->mettab[0][sym[0]]; met[3] = v->mettab[1][sym[1]] + v->mettab[1][sym[0]]; for (n = 0; n < v->nstates; n++) { int p0, p1, s0, s1, m0, m1; s0 = n; s1 = n + v->nstates; p0 = s0 >> 1; p1 = s1 >> 1; m0 = v->metrics[prevptr][p0] + met[v->output[s0]]; m1 = v->metrics[prevptr][p1] + met[v->output[s1]]; if (m0 > m1) { v->metrics[currptr][n] = m0; v->history[currptr][n] = p0; } else { v->metrics[currptr][n] = m1; v->history[currptr][n] = p1; } } v->ptr = (v->ptr + 1) % PATHMEM; if ((v->ptr % v->chunksize) == 0) return traceback(v, metric); if (v->metrics[currptr][0] > INT_MAX / 2) { for (i = 0; i < PATHMEM; i++) for (j = 0; j < v->nstates; j++) v->metrics[i][j] -= INT_MAX / 2; } if (v->metrics[currptr][0] < INT_MIN / 2) { for (i = 0; i < PATHMEM; i++) for (j = 0; j < v->nstates; j++) v->metrics[i][j] += INT_MIN / 2; } return -1; } static gint traceback(struct viterbi *v, gint *metric) { gint i, bestmetric, beststate; guint p, c; p = (v->ptr - 1) % PATHMEM; /* * Find the state with the best metric */ bestmetric = INT_MIN; beststate = 0; for (i = 0; i < v->nstates; i++) { if (v->metrics[p][i] > bestmetric) { bestmetric = v->metrics[p][i]; beststate = i; } } /* * Trace back 'traceback' steps, starting from the best state */ v->sequence[p] = beststate; for (i = 0; i < v->traceback; i++) { unsigned int prev = (p - 1) % PATHMEM; v->sequence[prev] = v->history[p][v->sequence[p]]; p = prev; } if (metric) *metric = v->metrics[p][v->sequence[p]]; /* * Decode 'chunksize' bits */ for (c = i = 0; i < v->chunksize; i++) { /* * low bit of state is the previous input bit */ c = (c << 1) | (v->sequence[p] & 1); p = (p + 1) % PATHMEM; } if (metric) *metric = v->metrics[p][v->sequence[p]] - *metric; return c; } /* ---------------------------------------------------------------------- */ struct encoder *encoder_init(gint k, gint poly1, gint poly2) { struct encoder *e; gint i, size; e = g_new0(struct encoder, 1); size = 1 << k; /* size of the output table */ e->output = g_new0(int, size); for (i = 0; i < size; i++) e->output[i] = parity(poly1 & i) | (parity(poly2 & i) << 1); e->shreg = 0; e->shregmask = size - 1; return e; } void encoder_free(struct encoder *e) { if (e) { g_free(e->output); g_free(e); } } gint encoder_encode(struct encoder *e, gint bit) { e->shreg = (e->shreg << 1) | !!bit; return e->output[e->shreg & e->shregmask]; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/misc/viterbi.h0000644000076400007640000000375210166603076012323 /* * viterbi.h -- Viterbi decoder * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _VITERBI_H #define _VITERBI_H #include /* ---------------------------------------------------------------------- */ #define PATHMEM 64 struct viterbi { gint traceback; gint chunksize; gint nstates; gint *output; gint *metrics[PATHMEM]; gint *history[PATHMEM]; gint sequence[PATHMEM]; gint mettab[2][256]; guint ptr; }; extern struct viterbi *viterbi_init(gint k, gint poly1, gint poly2); extern gint viterbi_set_traceback(struct viterbi *v, gint traceback); extern gint viterbi_set_chunksize(struct viterbi *v, gint chunksize); extern gint viterbi_decode(struct viterbi *v, guchar *sym, gint *metric); extern void viterbi_reset(struct viterbi *v); extern void viterbi_free(struct viterbi *v); /* ---------------------------------------------------------------------- */ struct encoder { gint *output; guint shreg; guint shregmask; }; extern struct encoder *encoder_init(gint k, gint poly1, gint poly2); extern void encoder_free(struct encoder *e); extern gint encoder_encode(struct encoder *e, gint bit); /* ---------------------------------------------------------------------- */ #endif gmfsk-0.7pre1/src/misc/genfilt.c0000644000076400007640000000374207725503072012303 /* * genfilt.c -- Generate an inline assembler FIR filter optimized * for the Pentium. * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This is inspired by the works of Phil Karn and Thomas Sailer. * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #define asmline(s) puts("\t\t\"" s ";\\n\\t\"") #define asmline2(s1,d,s2) printf("\t\t\"%s%d%s;\\n\\t\"\n", s1, d, s2) int main(int argc, char **argv) { int i, len; if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return 1; } len = atoi(argv[1]); #if 0 puts("#ifndef _FILTER_I386_H"); puts("#define _FILTER_I386_H"); puts("#define __HAVE_ARCH_MAC"); puts("extern inline float mac(const float *a, const float *b)"); puts("{"); puts("\tfloat f;"); #endif puts("\tasm volatile ("); asmline("flds (%1)"); asmline("fmuls (%2)"); asmline("flds 4(%1)"); asmline("fmuls 4(%2)"); for (i = 2; i < len; i++) { asmline2("flds ", i * 4, "(%1)"); asmline2("fmuls ", i * 4, "(%2)"); asmline("fxch %%st(2)"); asmline("faddp"); } asmline("faddp"); puts("\t\t: \"=t\" (f) : \"r\" (a) , \"r\" (b) : \"memory\");"); #if 0 puts("\treturn f;"); puts("}"); puts("#endif"); #endif return 0; } gmfsk-0.7pre1/src/samplerate/0000777000076400007640000000000010206176676011773 5gmfsk-0.7pre1/src/samplerate/Makefile.am0000644000076400007640000000044510023615256013733 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ noinst_LIBRARIES = libsamplerate.a libsamplerate_a_SOURCES = \ common.h \ fastest_coeffs.h \ float_cast.h \ samplerate.c \ samplerate.h \ src_sinc.c gmfsk-0.7pre1/src/samplerate/Makefile.in0000644000076400007640000003015110206155267013745 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ noinst_LIBRARIES = libsamplerate.a libsamplerate_a_SOURCES = \ common.h \ fastest_coeffs.h \ float_cast.h \ samplerate.c \ samplerate.h \ src_sinc.c subdir = src/samplerate ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libsamplerate_a_AR = $(AR) cru libsamplerate_a_LIBADD = am_libsamplerate_a_OBJECTS = samplerate.$(OBJEXT) src_sinc.$(OBJEXT) libsamplerate_a_OBJECTS = $(am_libsamplerate_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/samplerate.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/src_sinc.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libsamplerate_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libsamplerate_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/samplerate/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libsamplerate.a: $(libsamplerate_a_OBJECTS) $(libsamplerate_a_DEPENDENCIES) -rm -f libsamplerate.a $(libsamplerate_a_AR) libsamplerate.a $(libsamplerate_a_OBJECTS) $(libsamplerate_a_LIBADD) $(RANLIB) libsamplerate.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/samplerate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/src_sinc.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/samplerate/common.h0000644000076400007640000000414010031602237013326 /* ** Copyright (C) 2002,2003 Erik de Castro Lopo ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifndef COMMON_H_INCLUDED #define COMMON_H_INCLUDED #define SRC_MAX_RATIO 12 #define SRC_MIN_RATIO_DIFF (1e-20) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAKE_MAGIC(a,b,c,d,e,f) ((a)+((b)<<4)+((c)<<8)+((d)<<12)+((e)<<16)+((f)<<20)) #include "samplerate.h" enum { SRC_FALSE = 0, SRC_TRUE = 1 } ; enum { SRC_ERR_NO_ERROR = 0, SRC_ERR_MALLOC_FAILED, SRC_ERR_BAD_STATE, SRC_ERR_BAD_DATA, SRC_ERR_BAD_DATA_PTR, SRC_ERR_NO_PRIVATE, SRC_ERR_BAD_SRC_RATIO, SRC_ERR_BAD_PROC_PTR, SRC_ERR_SHIFT_BITS, SRC_ERR_FILTER_LEN, SRC_ERR_BAD_CONVERTER, SRC_ERR_BAD_CHANNEL_COUNT, SRC_ERR_SINC_BAD_BUFFER_LEN, SRC_ERR_SIZE_INCOMPATIBILITY, SRC_ERR_BAD_PRIV_PTR, SRC_ERR_BAD_SINC_STATE, SRC_ERR_DATA_OVERLAP, /* This must be the last error number. */ SRC_ERR_MAX_ERROR } ; typedef struct SRC_PRIVATE_tag { double last_ratio, last_position ; void *private_data ; int (*process) (struct SRC_PRIVATE_tag *psrc, SRC_DATA *data) ; void (*reset) (struct SRC_PRIVATE_tag *psrc) ; int error ; int channels ; } SRC_PRIVATE ; /* In src_sinc.c */ int sinc_process (SRC_PRIVATE *psrc, SRC_DATA *data) ; const char* sinc_get_name (int src_enum) ; const char* sinc_get_description (int src_enum) ; int sinc_set_converter (SRC_PRIVATE *psrc, int src_enum) ; #endif /* COMMON_H_INCLUDED */ gmfsk-0.7pre1/src/samplerate/fastest_coeffs.h0000644000076400007640000021543710023615072015053 /* ** Copyright (C) 2002,2003 Erik de Castro Lopo ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* ** f = make_filter (8, 128, 100.3) ; ** Pass band width : 0.0039062 (should be 0.0039062) ** Stop band atten. : 100.71 dB ** -3dB band width : 0.484 ** half length : 2463 ** increment : 128 */ 8.31472372954840555082e-01, 8.31414005540308198583e-01, 8.31238918266223869580e-01, 8.30947156036480505392e-01, 8.30538793675450581766e-01, 8.30013935904800659316e-01, 8.29372717311066987023e-01, 8.28615302303967515840e-01, 8.27741885065490623496e-01, 8.26752689489751890761e-01, 8.25647969113678215081e-01, 8.24428007038499943704e-01, 8.23093115842108757896e-01, 8.21643637482293187624e-01, 8.20079943190897053817e-01, 8.18402433358933589780e-01, 8.16611537412689103554e-01, 8.14707713680854150873e-01, 8.12691449252757824873e-01, 8.10563259827706050764e-01, 8.08323689555523805517e-01, 8.05973310868314363198e-01, 8.03512724303517833491e-01, 8.00942558318331943035e-01, 7.98263469095534694553e-01, 7.95476140340800830231e-01, 7.92581283071560838138e-01, 7.89579635397499868255e-01, 7.86471962292734527722e-01, 7.83259055359786127148e-01, 7.79941732585400893107e-01, 7.76520838088307852054e-01, 7.72997241859018080490e-01, 7.69371839491718167992e-01, 7.65645551908390675777e-01, 7.61819325075220210586e-01, 7.57894129711408459649e-01, 7.53870960990470018181e-01, 7.49750838234153449413e-01, 7.45534804599028211314e-01, 7.41223926755909090502e-01, 7.36819294562192195208e-01, 7.32322020727209643809e-01, 7.27733240470738174110e-01, 7.23054111174766811487e-01, 7.18285812028632841830e-01, 7.13429543667664534112e-01, 7.08486527805442301009e-01, 7.03458006859804640953e-01, 6.98345243572719653891e-01, 6.93149520624175785599e-01, 6.87872140240182283755e-01, 6.82514423795047564525e-01, 6.77077711408058502407e-01, 6.71563361534684655219e-01, 6.65972750552474845875e-01, 6.60307272341742135247e-01, 6.54568337861228477514e-01, 6.48757374718860524432e-01, 6.42875826737744904271e-01, 6.36925153517562181449e-01, 6.30906829991492501541e-01, 6.24822345978837789815e-01, 6.18673205733470954470e-01, 6.12460927488293727095e-01, 6.06187042995817604307e-01, 5.99853097065060292259e-01, 5.93460647094893878339e-01, 5.87011262603992944875e-01, 5.80506524757569142281e-01, 5.73948025891025337408e-01, 5.67337369030688098981e-01, 5.60676167411809700525e-01, 5.53966043993961543279e-01, 5.47208630974010734604e-01, 5.40405569296826038261e-01, 5.33558508163880174102e-01, 5.26669104539922661168e-01, 5.19739022657876970079e-01, 5.12769933522119303326e-01, 5.05763514410336290084e-01, 4.98721448374081555155e-01, 4.91645423738241937883e-01, 4.84537133599546865348e-01, 4.77398275324308896117e-01, 4.70230550045545592219e-01, 4.63035662159660077464e-01, 4.55815318822846149427e-01, 4.48571229447379538069e-01, 4.41305105197960123586e-01, 4.34018658488283970431e-01, 4.26713602477997000495e-01, 4.19391650570203500248e-01, 4.12054515909689722530e-01, 4.04703910882034223473e-01, 3.97341546613763640927e-01, 3.89969132473721613596e-01, 3.82588375575806771689e-01, 3.75200980283257823356e-01, 3.67808647714624070701e-01, 3.60413075251609871241e-01, 3.53015956048925771960e-01, 3.45618978546330835044e-01, 3.38223825983006376461e-01, 3.30832175914426429575e-01, 3.23445699731881031180e-01, 3.16066062184803764357e-01, 3.08694920906066150312e-01, 3.01333925940378832831e-01, 2.93984719275965256102e-01, 2.86648934379644393378e-01, 2.79328195735489559492e-01, 2.72024118387182545220e-01, 2.64738307484245039003e-01, 2.57472357832259801658e-01, 2.50227853447243409057e-01, 2.43006367114305704691e-01, 2.35809459950733935063e-01, 2.28638680973647728800e-01, 2.21495566672345989279e-01, 2.14381640585498134399e-01, 2.07298412883298144305e-01, 2.00247379954717363848e-01, 1.93230023999986955108e-01, 1.86247812628430653437e-01, 1.79302198461779749294e-01, 1.72394618743085786816e-01, 1.65526494951356295537e-01, 1.58699232422028796430e-01, 1.51914219973401071195e-01, 1.45172829539132269838e-01, 1.38476415806921215879e-01, 1.31826315863480453272e-01, 1.25223848845901208904e-01, 1.18670315599523901184e-01, 1.12166998342411894374e-01, 1.05715160336527447260e-01, 9.93160455657086521652e-02, 9.29708784205405536216e-02, 8.66808633902153846673e-02, 8.04471847614677826321e-02, 7.42710063246745516574e-02, 6.81534710872001986415e-02, 6.20957009940759641076e-02, 5.60987966560835549235e-02, 5.01638370853247708703e-02, 4.42918794383505357026e-02, 3.84839587669171534490e-02, 3.27410877764400740086e-02, 2.70642565922108620236e-02, 2.14544325334371267788e-02, 1.59125598951669576520e-02, 1.04395597381551803740e-02, 5.03632968672305773861e-03, -2.96256265336385191805e-04, -5.55734794075828358179e-03, -1.07461191566687631893e-02, -1.58617678942645466689e-02, -2.09035164602743607498e-02, -2.58706116401622790435e-02, -3.07623248430414844568e-02, -3.55779522382659724178e-02, -4.03168148836769782428e-02, -4.49782588454727128013e-02, -4.95616553096875425699e-02, -5.40664006852556791594e-02, -5.84919166986474642345e-02, -6.28376504800633867154e-02, -6.71030746411782619276e-02, -7.12876873444269476554e-02, -7.53910123638282386738e-02, -7.94125991373483691715e-02, -8.33520228108008270906e-02, -8.72088842732959695914e-02, -9.09828101842390379872e-02, -9.46734529918955292072e-02, -9.82804909435327500589e-02, -1.01803628087157427284e-01, -1.05242594264867719844e-01, -1.08597145097841310535e-01, -1.11867061962988789681e-01, -1.15052151961296145188e-01, -1.18152247877890054228e-01, -1.21167208133862752684e-01, -1.24096916729885473063e-01, -1.26941283181660202750e-01, -1.29700242447243679900e-01, -1.32373754846295377252e-01, -1.34961805971292009287e-01, -1.37464406590764143257e-01, -1.39881592544604443917e-01, -1.42213424631507739937e-01, -1.44459988488595730827e-01, -1.46621394463294696386e-01, -1.48697777477524800682e-01, -1.50689296884269657850e-01, -1.52596136316595465399e-01, -1.54418503529190731527e-01, -1.56156630232500315270e-01, -1.57810771919529219121e-01, -1.59381207685401427021e-01, -1.60868240039743037872e-01, -1.62272194711985145998e-01, -1.63593420449666626659e-01, -1.64832288809824062392e-01, -1.65989193943563151379e-01, -1.67064552373901109572e-01, -1.68058802766975601273e-01, -1.68972405696717037360e-01, -1.69805843403086798027e-01, -1.70559619543971530131e-01, -1.71234258940853617537e-01, -1.71830307318344255307e-01, -1.72348331037702334756e-01, -1.72788916824434257702e-01, -1.73152671490098081231e-01, -1.73440221648409775845e-01, -1.73652213425782242506e-01, -1.73789312166397952319e-01, -1.73852202131942051855e-01, -1.73841586196111674845e-01, -1.73758185534021086793e-01, -1.73602739306629005878e-01, -1.73376004340306061335e-01, -1.73078754801670009478e-01, -1.72711781867818603420e-01, -1.72275893392080048372e-01, -1.71771913565416961545e-01, -1.71200682573611373538e-01, -1.70563056250360139954e-01, -1.69859905726417126370e-01, -1.69092117074913228514e-01, -1.68260590952989147473e-01, -1.67366242239875284703e-01, -1.66409999671557895518e-01, -1.65392805472166642966e-01, -1.64315614982222552021e-01, -1.63179396283883837437e-01, -1.61985129823331186483e-01, -1.60733808030429803360e-01, -1.59426434935813571281e-01, -1.58064025785527417778e-01, -1.56647606653372045704e-01, -1.55178214051094831571e-01, -1.53656894536566474008e-01, -1.52084704320088470730e-01, -1.50462708868975059140e-01, -1.48791982510548842500e-01, -1.47073608033699704256e-01, -1.45308676289147314931e-01, -1.43498285788550977715e-01, -1.41643542302611558092e-01, -1.39745558458309881988e-01, -1.37805453335422323224e-01, -1.35824352062461073398e-01, -1.33803385412180564362e-01, -1.31743689396791985313e-01, -1.29646404863030306753e-01, -1.27512677087215337002e-01, -1.25343655370452389253e-01, -1.23140492634104758984e-01, -1.20904345015691472298e-01, -1.18636371465341922127e-01, -1.16337733342949820048e-01, -1.14009594016166518338e-01, -1.11653118459372716065e-01, -1.09269472853762789066e-01, -1.06859824188683741331e-01, -1.04425339864360325337e-01, -1.01967187296145456177e-01, -9.94865335204263567803e-02, -9.69845448023236023083e-02, -9.44623862453117940641e-02, -9.19212214028948121358e-02, -8.93622118924671249296e-02, -8.67865170114848205607e-02, -8.41952933560805999447e-02, -8.15896944422443981537e-02, -7.89708703296961439522e-02, -7.63399672485739477779e-02, -7.36981272290610500697e-02, -7.10464877340710454501e-02, -6.83861812951113146042e-02, -6.57183351514422919859e-02, -6.30440708926501142129e-02, -6.03645041047437408421e-02, -5.76807440198948140342e-02, -5.49938931699267691267e-02, -5.23050470436661057994e-02, -4.96152937482609926456e-02, -4.69257136745778041798e-02, -4.42373791667729082677e-02, -4.15513541961495605492e-02, -3.88686940393953503370e-02, -3.61904449613011935938e-02, -3.35176439020573244121e-02, -3.08513181692228674602e-02, -2.81924851344595717162e-02, -2.55421519351213023585e-02, -2.29013151807887539724e-02, -2.02709606648342685609e-02, -1.76520630811025022733e-02, -1.50455857457888787787e-02, -1.24524803245954687053e-02, -9.87368656524285036313e-03, -7.31013203541311037958e-03, -4.76273186619807602227e-03, -2.23238850112297869746e-03, 2.80008549183706099625e-04, 2.77358294660976899965e-03, 5.24747175940274562800e-03, 7.70082569017439908660e-03, 1.01328092980087648006e-02, 1.25426012146140665460e-02, 1.49293943544662570388e-02, 1.72923961188884665885e-02, 1.96308285940195309527e-02, 2.19439287426209730936e-02, 2.42309485896793734561e-02, 2.64911554017603391442e-02, 2.87238318600733545660e-02, 3.09282762272103349532e-02, 3.31038025075217068327e-02, 3.52497406010981520486e-02, 3.73654364513253609004e-02, 3.94502521859858221176e-02, 4.15035662518817155542e-02, 4.35247735429537541130e-02, 4.55132855218787699125e-02, 4.74685303351244439196e-02, 4.93899529214478216765e-02, 5.12770151138242716304e-02, 5.31291957347935772660e-02, 5.49459906852194576721e-02, 5.67269130264521220797e-02, 5.84714930558940249039e-02, 6.01792783759655322551e-02, 6.18498339564735599705e-02, 6.34827421903864652641e-02, 6.50776029430226859995e-02, 6.66340335946605799577e-02, 6.81516690765814614483e-02, 6.96301619005592065115e-02, 7.10691821818139612965e-02, 7.24684176554465098175e-02, 7.38275736863740761340e-02, 7.51463732727930683319e-02, 7.64245570431912463194e-02, 7.76618832469397474272e-02, 7.88581277384926976337e-02, 8.00130839552289779837e-02, 8.11265628889681067459e-02, 8.21983930512013155623e-02, 8.32284204320703352442e-02, 8.42165084531432683868e-02, 8.51625379140240473808e-02, 8.60664069328434949702e-02, 8.69280308806818224898e-02, 8.77473423099686122839e-02, 8.85242908769151987114e-02, 8.92588432580306151420e-02, 8.99509830607803234637e-02, 9.06007107284422380511e-02, 9.12080434392217309636e-02, 9.17730149996878741270e-02, 9.22956757325926607782e-02, 9.27760923591415126443e-02, 9.32143478757788968014e-02, 9.36105414255621187669e-02, 9.39647881641913207407e-02, 9.42772191207702781046e-02, 9.45479810533706027664e-02, 9.47772362994778183598e-02, 9.49651626213951355338e-02, 9.51119530466846413441e-02, 9.52178157037280176178e-02, 9.52829736524876819148e-02, 9.53076647105531166160e-02, 9.52921412745576373871e-02, 9.52366701370536278271e-02, 9.51415322989309503177e-02, 9.50070227774735681647e-02, 9.48334504101390751707e-02, 9.46211376541590265532e-02, 9.43704203820504156086e-02, 9.40816476731309581094e-02, 9.37551816011396865758e-02, 9.33913970180541563870e-02, 9.29906813342047527948e-02, 9.25534342947849225647e-02, 9.20800677528557931506e-02, 9.15710054389489019888e-02, 9.10266827273659706599e-02, 9.04475463992783224043e-02, 8.98340544027328158361e-02, 8.91866756096650198371e-02, 8.85058895700238101867e-02, 8.77921862631190763615e-02, 8.70460658462897246546e-02, 8.62680384010083983748e-02, 8.54586236765221690659e-02, 8.46183508311429133375e-02, 8.37477581712920277068e-02, 8.28473928884114751980e-02, 8.19178107938471483651e-02, 8.09595760518180135312e-02, 7.99732609105757996648e-02, 7.89594454318716387764e-02, 7.79187172188340326784e-02, 7.68516711423724852015e-02, 7.57589090662164482692e-02, 7.46410395707000073884e-02, 7.34986776754032733461e-02, 7.23324445607601979047e-02, 7.11429672887474440213e-02, 6.99308785227581580779e-02, 6.86968162467783832748e-02, 6.74414234839716131287e-02, 6.61653480147834510694e-02, 6.48692420946761771905e-02, 6.35537621716019962559e-02, 6.22195686033254202751e-02, 6.08673253747022482973e-02, 5.94976998150253330588e-02, 5.81113623155428762890e-02, 5.67089860472591994478e-02, 5.52912466791220663653e-02, 5.38588220967053943333e-02, 5.24123921214928872869e-02, 5.09526382308646275110e-02, 4.94802432788957607945e-02, 4.79958912180662375380e-02, 4.65002668219884549017e-02, 4.49940554092515265783e-02, 4.34779425684853407241e-02, 4.19526138847447563340e-02, 4.04187546673120054463e-02, 3.88770496790168534895e-02, 3.73281828671714888124e-02, 3.57728370962169389680e-02, 3.42116938821758476141e-02, 3.26454331290065291604e-02, 3.10747328669506231447e-02, 2.95002689929673225788e-02, 2.79227150133440210622e-02, 2.63427417885741359249e-02, 2.47610172805882329528e-02, 2.31782063024293799591e-02, 2.15949702704538760989e-02, 2.00119669591453143431e-02, 1.84298502586232419709e-02, 1.68492699349288496680e-02, 1.52708713931675090641e-02, 1.36952954435869880129e-02, 1.21231780706691841254e-02, 1.05551502053105091677e-02, 8.99183750016553651196e-03, 7.43386010822696258193e-03, 5.88183246471273707412e-03, 4.33636307232945251988e-03, 2.79805428998205086427e-03, 1.26750212499337003291e-03, -2.54703971099550386531e-04, -1.76798130311027175757e-03, -3.27175412906725469539e-03, -4.76545385331804925710e-03, -6.24851921581533794464e-03, -7.72039647752874400727e-03, -9.18053960192777122884e-03, -1.06284104324833178490e-02, -1.20634788661366718077e-02, -1.34852230226875247771e-02, -1.48931294100519973078e-02, -1.62866930853476296615e-02, -1.76654178117594401476e-02, -1.90288162111466874205e-02, -2.03764099123495759369e-02, -2.17077296951579609696e-02, -2.30223156299061669505e-02, -2.43197172126588360974e-02, -2.55994934959561624976e-02, -2.68612132150869431513e-02, -2.81044549098614510063e-02, -2.93288070418574950415e-02, -3.05338681071131295974e-02, -3.17192467442452205595e-02, -3.28845618379712614776e-02, -3.40294426180154721551e-02, -3.51535287533818185945e-02, -3.62564704419792716017e-02, -3.73379284955845242022e-02, -3.83975744201309962533e-02, -3.94350904913155775322e-02, -4.04501698255130062720e-02, -4.14425164459938585870e-02, -4.24118453444415760556e-02, -4.33578825377650758921e-02, -4.42803651202084772032e-02, -4.51790413107587551789e-02, -4.60536704958539877541e-02, -4.69040232673985507672e-02, -4.77298814560914094751e-02, -4.85310381600771723054e-02, -4.93072977689298017068e-02, -5.00584759829825892696e-02, -5.07843998280173986037e-02, -5.14849076653303427964e-02, -5.21598491971914657306e-02, -5.28090854677170859488e-02, -5.34324888591782357072e-02, -5.40299430837655400572e-02, -5.46013431708381041796e-02, -5.51465954496810906171e-02, -5.56656175277993395256e-02, -5.61583382647804357779e-02, -5.66246977417538960298e-02, -5.70646472264832865795e-02, -5.74781491341238848225e-02, -5.78651769836829588112e-02, -5.82257153502198851469e-02, -5.85597598128258789441e-02, -5.88673168984241990120e-02, -5.91484040214318093631e-02, -5.94030494193287308957e-02, -5.96312920841784027681e-02, -5.98331816901454746627e-02, -6.00087785170606569096e-02, -6.01581533700810480725e-02, -6.02813874954959694197e-02, -6.03785724927326447609e-02, -6.04498102226119424230e-02, -6.04952127119116611631e-02, -6.05149020542914278797e-02, -6.05090103076376881197e-02, -6.04776793878847099273e-02, -6.04210609593744951695e-02, -6.03393163218124903291e-02, -6.02326162938837256222e-02, -6.01011410935896536745e-02, -5.99450802153716350018e-02, -5.97646323040843391317e-02, -5.95600050258849322837e-02, -5.93314149361059764431e-02, -5.90790873441773764507e-02, -5.88032561756684640786e-02, -5.85041638315173181950e-02, -5.81820610445198463379e-02, -5.78372067331465664064e-02, -5.74698678527617162759e-02, -5.70803192443151696800e-02, -5.66688434805820984153e-02, -5.62357307100216502471e-02, -5.57812784983319834287e-02, -5.53057916677746758127e-02, -5.48095821343453915020e-02, -5.42929687428649263015e-02, -5.37562771000702349644e-02, -5.31998394057807341695e-02, -5.26239942822169029513e-02, -5.20290866015511582754e-02, -5.14154673117670768523e-02, -5.07834932609073572141e-02, -5.01335270197884388943e-02, -4.94659367032617980353e-02, -4.87810957901005926018e-02, -4.80793829415919610204e-02, -4.73611818189140221236e-02, -4.66268808993793651418e-02, -4.58768732916221277929e-02, -4.51115565498113532672e-02, -4.43313324869706107401e-02, -4.35366069874822472774e-02, -4.27277898188581847783e-02, -4.19052944428566706558e-02, -4.10695378260253277092e-02, -4.02209402497498702544e-02, -3.93599251198885058400e-02, -3.84869187760717781921e-02, -3.76023503007467674308e-02, -3.67066513280452297319e-02, -3.58002558525536487832e-02, -3.48836000380640318119e-02, -3.39571220263849699039e-02, -3.30212617462878818553e-02, -3.20764607226682249563e-02, -3.11231618859974003277e-02, -3.01618093821427596390e-02, -2.91928483826300218251e-02, -2.82167248954252464221e-02, -2.72338855763107207109e-02, -2.62447775409285488646e-02, -2.52498481775659533444e-02, -2.42495449607560524530e-02, -2.32443152657647901516e-02, -2.22346061840382018537e-02, -2.12208643396787077773e-02, -2.02035357070221716080e-02, -1.91830654293842946256e-02, -1.81598976390459701524e-02, -1.71344752785447841659e-02, -1.61072399233397958729e-02, -1.50786316059164128556e-02, -1.40490886413957953571e-02, -1.30190474547137412242e-02, -1.19889424094323342185e-02, -1.09592056382471266657e-02, -9.93026687525074697183e-03, -8.90255329001433948211e-03, -7.87648932354562125724e-03, -6.85249652618241146540e-03, -5.83099339747908569642e-03, -4.81239522814202146106e-03, -3.79711394406930576734e-03, -2.78555795254968683455e-03, -1.77813199067227692071e-03, -7.75236976000132386663e-04, 2.22730140442126654798e-04, 1.21537651881706244492e-03, 2.20231357271108733539e-03, 3.18315710891246220898e-03, 4.15752746468348553799e-03, 5.12504964248380791986e-03, 6.08535344210042478813e-03, 7.03807359014245199208e-03, 7.98284986685961206465e-03, 8.91932723024580452476e-03, 9.84715593738785290034e-03, 1.07659916630240357766e-02, 1.16754956152756248638e-02, 1.25753346485176220604e-02, 1.34651813733560731662e-02, 1.43447142636787781933e-02, 1.52136177607511777904e-02, 1.60715823743268690360e-02, 1.69183047807457617728e-02, 1.77534879179936204430e-02, 1.85768410776981605925e-02, 1.93880799940382604618e-02, 2.01869269295435888045e-02, 2.09731107577651766649e-02, 2.17463670427963037812e-02, 2.25064381156266125894e-02, 2.32530731473125917841e-02, 2.39860282189490944815e-02, 2.47050663884288181082e-02, 2.54099577539762186418e-02, 2.61004795144461655687e-02, 2.67764160263764816605e-02, 2.74375588577874841845e-02, 2.80837068387202806741e-02, 2.87146661085097808230e-02, 2.93302501597869115513e-02, 2.99302798792087168533e-02, 3.05145835849139068774e-02, 3.10829970607048658437e-02, 3.16353635869560598226e-02, 3.21715339682534032240e-02, 3.26913665577675052742e-02, 3.31947272783659833029e-02, 3.36814896404726560331e-02, 3.41515347566807569990e-02, 3.46047513531298478462e-02, 3.50410357776568884280e-02, 3.54602920047340924858e-02, 3.58624316372060172875e-02, 3.62473739048404727803e-02, 3.66150456597097023748e-02, 3.69653813684179058385e-02, 3.72983231011940682964e-02, 3.76138205178691634178e-02, 3.79118308507581658340e-02, 3.81923188844700278732e-02, 3.84552569326661666804e-02, 3.87006248117945095277e-02, 3.89284098118221136287e-02, 3.91386066639944005252e-02, 3.93312175056476295842e-02, 3.95062518421033306848e-02, 3.96637265056755394799e-02, 3.98036656118202977761e-02, 3.99261005124597820326e-02, 4.00310697465144360585e-02, 4.01186189876763035778e-02, 4.01888009894591641258e-02, 4.02416755275608953313e-02, 4.02773093395744422041e-02, 4.02957760620868618573e-02, 4.02971561652026855072e-02, 4.02815368845340013304e-02, 4.02490121506946865737e-02, 4.01996825163432602857e-02, 4.01336550808131173329e-02, 4.00510434123766412284e-02, 3.99519674681838021790e-02, 3.98365535119223901361e-02, 3.97049340292425986809e-02, 3.95572476409943238340e-02, 3.93936390143226622396e-02, 3.92142587716682866628e-02, 3.90192633977227906761e-02, 3.88088151443859719070e-02, 3.85830819337740632546e-02, 3.83422372593309676581e-02, 3.80864600850902706997e-02, 3.78159347431409609275e-02, 3.75308508293468318096e-02, 3.72314030973733209318e-02, 3.69177913510723085255e-02, 3.65902203352790472701e-02, 3.62488996250740352911e-02, 3.58940435135636018438e-02, 3.55258708982338911042e-02, 3.51446051659309519066e-02, 3.47504740765239503175e-02, 3.43437096453047957523e-02, 3.39245480241803926136e-02, 3.34932293817127510471e-02, 3.30499977820627663383e-02, 3.25951010628938789293e-02, 3.21287907122915217251e-02, 3.16513217447548164674e-02, 3.11629525763171093267e-02, 3.06639448988514501382e-02, 3.01545635536184866710e-02, 2.96350764041116987446e-02, 2.91057542082603579181e-02, 2.85668704900414009706e-02, 2.80187014105628129368e-02, 2.74615256386703497637e-02, 2.68956242211381771345e-02, 2.63212804524964143205e-02, 2.57387797445546746833e-02, 2.51484094956766456030e-02, 2.45504589598617914414e-02, 2.39452191156906725455e-02, 2.33329825351894608321e-02, 2.27140432526683408443e-02, 2.20886966335908999093e-02, 2.14572392435271874778e-02, 2.08199687172471933905e-02, 2.01771836280079629178e-02, 1.95291833570884962312e-02, 1.88762679636269269101e-02, 1.82187380548123403767e-02, 1.75568946564845403124e-02, 1.68910390841945853846e-02, 1.62214728147774996103e-02, 1.55484973584896369464e-02, 1.48724141317607399387e-02, 1.41935243306124080076e-02, 1.35121288047925294795e-02, 1.28285279326754275003e-02, 1.21430214969758445281e-02, 1.14559085613274869858e-02, 1.07674873477713456404e-02, 1.00780551152029641815e-02, 9.38790803882408146641e-03, 8.69734109064560119429e-03, 8.00664792108640895052e-03, 7.31612074171312902482e-03, 6.62605020916498532735e-03, 5.93672531030635993593e-03, 5.24843324865020312286e-03, 4.56145933209378684481e-03, 3.87608686200798923521e-03, 3.19259702372048361982e-03, 2.51126877843176705626e-03, 1.83237875660391988202e-03, 1.15620115285868549186e-03, 4.83007622422852007059e-04, -1.86932820843070034112e-04, -8.53353904797455329115e-04, -1.51599219771675255281e-03, -2.17458720530792556924e-03, -2.82888146600037857989e-03, -3.47862064448672828401e-03, -4.12355362347965707925e-03, -4.76343259365718217635e-03, -5.39801314176371720144e-03, -6.02705433684159932323e-03, -6.65031881456398799024e-03, -7.26757285964317947813e-03, -7.87858648628854928153e-03, -8.48313351669007821576e-03, -9.08099165750268083608e-03, -9.67194257431004678072e-03, -1.02557719640449674509e-02, -1.08322696253466653482e-02, -1.14012295268339416271e-02, -1.19624498732761111452e-02, -1.25157331696445651287e-02, -1.30608862830260651078e-02, -1.35977205023845738180e-02, -1.41260515961539080687e-02, -1.46456998676501564532e-02, -1.51564902082884610246e-02, -1.56582521485937077588e-02, -1.61508199069943896020e-02, -1.66340324363880263936e-02, -1.71077334684716746149e-02, -1.75717715558275228149e-02, -1.80260001117568194329e-02, -1.84702774478586080609e-02, -1.89044668093441003975e-02, -1.93284364080869922042e-02, -1.97420594534034529732e-02, -2.01452141805614354242e-02, -2.05377838770183090977e-02, -2.09196569063852221004e-02, -2.12907267301215390176e-02, -2.16508919269584217127e-02, -2.20000562100566773860e-02, -2.23381284419012192399e-02, -2.26650226469371808558e-02, -2.29806580219539050014e-02, -2.32849589442222955349e-02, -2.35778549773940013234e-02, -2.38592808751701725145e-02, -2.41291765827496146324e-02, -2.43874872360661625048e-02, -2.46341631588262027774e-02, -2.48691598573592027865e-02, -2.50924380132932847709e-02, -2.53039634740697960691e-02, -2.55037072413113186098e-02, -2.56916454570593408291e-02, -2.58677593878966008423e-02, -2.60320354069717534162e-02, -2.61844649739453247395e-02, -2.63250446128731642459e-02, -2.64537758880496950975e-02, -2.65706653778289558776e-02, -2.66757246464459155111e-02, -2.67689702138592805492e-02, -2.68504235236379437679e-02, -2.69201109089152179621e-02, -2.69780635564342181898e-02, -2.70243174687087896191e-02, -2.70589134243261995871e-02, -2.70818969364167577707e-02, -2.70933182093176481986e-02, -2.70932320934577017257e-02, -2.70816980384915410862e-02, -2.70587800447114543156e-02, -2.70245466127663376554e-02, -2.69790706917171427270e-02, -2.69224296254590607369e-02, -2.68547050975419879237e-02, -2.67759830744198866481e-02, -2.66863537471611969587e-02, -2.65859114716531889921e-02, -2.64747547073322930800e-02, -2.63529859544745573285e-02, -2.62207116900796607939e-02, -2.60780423023825730366e-02, -2.59250920240284947471e-02, -2.57619788639449828760e-02, -2.55888245379471308827e-02, -2.54057543981124761556e-02, -2.52128973609604678519e-02, -2.50103858344739478359e-02, -2.47983556439997539222e-02, -2.45769459570643403201e-02, -2.43462992071435090080e-02, -2.41065610164222128564e-02, -2.38578801175844575078e-02, -2.36004082746693114037e-02, -2.33343002030331689300e-02, -2.30597134884559483436e-02, -2.27768085054302904524e-02, -2.24857483346725776918e-02, -2.21866986798954189675e-02, -2.18798277838799307138e-02, -2.15653063438876642366e-02, -2.12433074264517691987e-02, -2.09140063815867055519e-02, -2.05775807564556566243e-02, -2.02342102085360346642e-02, -1.98840764183222142025e-02, -1.95273630016047500257e-02, -1.91642554213670816832e-02, -1.87949408993371563925e-02, -1.84196083272362247374e-02, -1.80384481777610752862e-02, -1.76516524153425696797e-02, -1.72594144067167720724e-02, -1.68619288313498413845e-02, -1.64593915917550098760e-02, -1.60519997237402040069e-02, -1.56399513066264282679e-02, -1.52234453734734331148e-02, -1.48026818213531103502e-02, -1.43778613217079923037e-02, -1.39491852308316760523e-02, -1.35168555005115483686e-02, -1.30810745888681710658e-02, -1.26420453714316226301e-02, -1.21999710524887047813e-02, -1.17550550767402828961e-02, -1.13075010413035727252e-02, -1.08575126080952908542e-02, -1.04052934166326063736e-02, -9.95104699728536351566e-03, -9.49497668501652312967e-03, -9.03728553364356763933e-03, -8.57817623065582068875e-03, -8.11785101262214349449e-03, -7.65651158122056946231e-03, -7.19435901992488725798e-03, -6.73159371137851351291e-03, -6.26841525548942068990e-03, -5.80502238827697216589e-03, -5.34161290150089295564e-03, -4.87838356310490647849e-03, -4.41553003850264462471e-03, -3.95324681273798422126e-03, -3.49172711354636287548e-03, -3.03116283534747218975e-03, -2.57174446419663202748e-03, -2.11366100372138449731e-03, -1.65709990207213789248e-03, -1.20224697991074881177e-03, -7.49286359465203312402e-04, -2.98400394673150758020e-04, 1.50230397559290287587e-04, 5.96427404960260163468e-04, 1.04001398633389997676e-03, 1.48081553681653948010e-03, 1.91865955192711671630e-03, 2.35337569038958404136e-03, 2.78479583570576333731e-03, 3.21275415646031688166e-03, 3.63708716533605539573e-03, 4.05763377682291995208e-03, 4.47423536360066955581e-03, 4.88673581157838838457e-03, 5.29498157357465894235e-03, 5.69882172162047926506e-03, 6.09810799787139853900e-03, 6.49269486411187517899e-03, 6.88243954983998491859e-03, 7.26720209891677272618e-03, 7.64684541476874993227e-03, 8.02123530413159993580e-03, 8.39024051932213063565e-03, 8.75373279902990839019e-03, 9.11158690761618844656e-03, 9.46368067291306243327e-03, 9.80989502251233651264e-03, 1.01501140185368699670e-02, 1.04842248908878447194e-02, 1.08121180689596009528e-02, 1.11336872118183785596e-02, 1.14488292368375710328e-02, 1.17574443467867335855e-02, 1.20594360553697797084e-02, 1.23547112112087492664e-02, 1.26431800202723137322e-02, 1.29247560667452802280e-02, 1.31993563323394361153e-02, 1.34669012140451026943e-02, 1.37273145403230718842e-02, 1.39805235857388930609e-02, 1.42264590840399576116e-02, 1.44650552396788801418e-02, 1.46962497377853603536e-02, 1.49199837525900817770e-02, 1.51362019543059365262e-02, 1.53448525144697818512e-02, 1.55458871097522988158e-02, 1.57392609242401407266e-02, 1.59249326501989980909e-02, 1.61028644873237487822e-02, 1.62730221404839558996e-02, 1.64353748159745995105e-02, 1.65898952162792344411e-02, 1.67365595333573702330e-02, 1.68753474404654685292e-02, 1.70062420825228405308e-02, 1.71292300650343690127e-02, 1.72443014415816948948e-02, 1.73514496998961910423e-02, 1.74506717465267233158e-02, 1.75419678901157470585e-02, 1.76253418232991503067e-02, 1.77008006032431768062e-02, 1.77683546308354950449e-02, 1.78280176285450023266e-02, 1.78798066169677284665e-02, 1.79237418900749095885e-02, 1.79598469891815541721e-02, 1.79881486756524357207e-02, 1.80086769023645003329e-02, 1.80214647839439801036e-02, 1.80265485657978320744e-02, 1.80239675919585257136e-02, 1.80137642717629609113e-02, 1.79959840453853894826e-02, 1.79706753482452019632e-02, 1.79378895743111561878e-02, 1.78976810383233188306e-02, 1.78501069369546815080e-02, 1.77952273089348571300e-02, 1.77331049941585293384e-02, 1.76638055918014250101e-02, 1.75873974174670689996e-02, 1.75039514593883366311e-02, 1.74135413337067820883e-02, 1.73162432388551425222e-02, 1.72121359090659648006e-02, 1.71013005670323306462e-02, 1.69838208757447130248e-02, 1.68597828895295613616e-02, 1.67292750043147309125e-02, 1.65923879071472879509e-02, 1.64492145249898746862e-02, 1.62998499728209574056e-02, 1.61443915010654574782e-02, 1.59829384423819872985e-02, 1.58155921578329479449e-02, 1.56424559824643004402e-02, 1.54636351703211580993e-02, 1.52792368389266484952e-02, 1.50893699132506348831e-02, 1.48941450691946284529e-02, 1.46936746766213478105e-02, 1.44880727419542387757e-02, 1.42774548503756936596e-02, 1.40619381076500047506e-02, 1.38416410815988405458e-02, 1.36166837432563775367e-02, 1.33871874077307433104e-02, 1.31532746747999255282e-02, 1.29150693692685249875e-02, 1.26726964811125480254e-02, 1.24262821054400597609e-02, 1.21759533822933443264e-02, 1.19218384363212748234e-02, 1.16640663163469111840e-02, 1.14027669348586990772e-02, 1.11380710074510391738e-02, 1.08701099922405512027e-02, 1.05990160292857588803e-02, 1.03249218800347264402e-02, 1.00479608668283364181e-02, 9.76826681248407595326e-03, 9.48597397998680001707e-03, 9.20121701231205180171e-03, 8.91413087240663405686e-03, 8.62485078335300560382e-03, 8.33351216874106057175e-03, 8.04025059327335284154e-03, 7.74520170362733365033e-03, 7.44850116959968472363e-03, 7.15028462555652392224e-03, 6.85068761221313375642e-03, 6.54984551876693164157e-03, 6.24789352540736173808e-03, 5.94496654622468298501e-03, 5.64119917254172174859e-03, 5.33672561668945780872e-03, 5.03167965625017643561e-03, 4.72619457878821046942e-03, 4.42040312709122713147e-03, 4.11443744494245557813e-03, 3.80842902344421868274e-03, 3.50250864791438413365e-03, 3.19680634537424174582e-03, 2.89145133264915015631e-03, 2.58657196509964968506e-03, 2.28229568600325869593e-03, 1.97874897660506266980e-03, 1.67605730685465247574e-03, 1.37434508684857771554e-03, 1.07373561899400072825e-03, 7.74351050912206037222e-04, 4.76312329096932108620e-04, 1.79739153344913828647e-04, -1.15250068026150436743e-04, -4.08538262157430215240e-04, -7.00009734810518881830e-04, -9.89550212697529359140e-04, -1.27704688496522110984e-03, -1.56238844381914230262e-03, -1.84546512427596291067e-03, -2.12616874302977649017e-03, -2.40439273642179809562e-03, -2.68003219750039467159e-03, -2.95298391216083011210e-03, -3.22314639435426720723e-03, -3.49041992035452591087e-03, -3.75470656207426648626e-03, -4.01591021941965966441e-03, -4.27393665167596914500e-03, -4.52869350791463860101e-03, -4.78009035641408387002e-03, -5.02803871308742881402e-03, -5.27245206890878791856e-03, -5.51324591633307794364e-03, -5.75033777470175880286e-03, -5.98364721463032038506e-03, -6.21309588137129026331e-03, -6.43860751714846711591e-03, -6.66010798245885143193e-03, -6.87752527633716734257e-03, -7.09078955558135361203e-03, -7.29983315293484570641e-03, -7.50459059422442856246e-03, -7.70499861445137022159e-03, -7.90099617283428028169e-03, -8.09252446680348673513e-03, -8.27952694494581836748e-03, -8.46194931890021165288e-03, -8.63973957420479179992e-03, -8.81284798009584514900e-03, -8.98122709826090423468e-03, -9.14483179054685624276e-03, -9.30361922562642808254e-03, -9.45754888462495800494e-03, -9.60658256571109842037e-03, -9.75068438765514661215e-03, -9.88982079235872779677e-03, -1.00239605463608785763e-02, -1.01530747413246837108e-02, -1.02771367935108499936e-02, -1.03961224422430293518e-02, -1.05100097473716045521e-02, -1.06187790857425311958e-02, -1.07224131466778661165e-02, -1.08208969264758890494e-02, -1.09142177219381259629e-02, -1.10023651229317290939e-02, -1.10853310039956218930e-02, -1.11631095149994884197e-02, -1.12356970708646971419e-02, -1.13030923403568215463e-02, -1.13652962339602110059e-02, -1.14223118908440956359e-02, -1.14741446649318026840e-02, -1.15208021100836454503e-02, -1.15622939644049946284e-02, -1.15986321336910645080e-02, -1.16298306740207010868e-02, -1.16559057735113307669e-02, -1.16768757332475214827e-02, -1.16927609473963332182e-02, -1.17035838825226608945e-02, -1.17093690561177760784e-02, -1.17101430143551586693e-02, -1.17059343090872795129e-02, -1.16967734740980097013e-02, -1.16826930006248379257e-02, -1.16637273121658596037e-02, -1.16399127385864407935e-02, -1.16112874895409699111e-02, -1.15778916272246922003e-02, -1.15397670384720374415e-02, -1.14969574062164479888e-02, -1.14495081803284975280e-02, -1.13974665478479546959e-02, -1.13408814026266253211e-02, -1.12798033143984600957e-02, -1.12142844972935168402e-02, -1.11443787778127377519e-02, -1.10701415622809114236e-02, -1.09916298037944538957e-02, -1.09089019686816925125e-02, -1.08220180024931385970e-02, -1.07310392955389764802e-02, -1.06360286479915983754e-02, -1.05370502345710423397e-02, -1.04341695688310136247e-02, -1.03274534670632443106e-02, -1.02169700118386209270e-02, -1.01027885152025192345e-02, -9.98497948154308812008e-03, -9.86361457015006402871e-03, -9.73876655748246930488e-03, -9.61050929916365190286e-03, -9.47891769172138146105e-03, -9.34406763409175583623e-03, -9.20603598890469380922e-03, -9.06490054356958417647e-03, -8.92073997117914622990e-03, -8.77363379124968326139e-03, -8.62366233031589164704e-03, -8.47090668239862398803e-03, -8.31544866936306283078e-03, -8.15737080118616487978e-03, -7.99675623615058242533e-03, -7.83368874098351944402e-03, -7.66825265095798756787e-03, -7.50053282997436773782e-03, -7.33061463064018075525e-03, -7.15858385436481461928e-03, -6.98452671148786126409e-03, -6.80852978145714965441e-03, -6.63067997307481386826e-03, -6.45106448482760802543e-03, -6.26977076531890029770e-03, -6.08688647381931853542e-03, -5.90249944095203298716e-03, -5.71669762953000513278e-03, -5.52956909556100162373e-03, -5.34120194943696596085e-03, -5.15168431732329797079e-03, -4.96110430276443595266e-03, -4.76954994852103134756e-03, -4.57710919865432410564e-03, -4.38386986087277181340e-03, -4.18991956915663876782e-03, -3.99534574667439676410e-03, -3.80023556900675307108e-03, -3.60467592769156538676e-03, -3.40875339410503987864e-03, -3.21255418369197943973e-03, -3.01616412055992575564e-03, -2.81966860245005685598e-03, -2.62315256609809257030e-03, -2.42670045299875130826e-03, -2.23039617558575898118e-03, -2.03432308384080993632e-03, -1.83856393234277533909e-03, -1.64320084776991355742e-03, -1.44831529686655904529e-03, -1.25398805488530435195e-03, -1.06029917451672204415e-03, -8.67327955316482155854e-04, -6.75152913641518712638e-04, -4.83851753104545291573e-04, -2.93501335557769932588e-04, -1.04177652615230481180e-04, 8.40442022771478958144e-05, 2.71090061213828637746e-04, 4.56886708636217294885e-04, 6.41361907564611910364e-04, 8.24444425246958221068e-04, 1.00606405821750295726e-03, 1.18615165675600578790e-03, 1.36463914874257485378e-03, 1.54145956289825905236e-03, 1.71654705140769636706e-03, 1.88983691191461173828e-03, 2.06126560888645086675e-03, 2.23077079434063144103e-03, 2.39829132792830895110e-03, 2.56376729636941056573e-03, 2.72714003223500402184e-03, 2.88835213207216685155e-03, 3.04734747386685260462e-03, 3.20407123384176817371e-03, 3.35846990258462183704e-03, 3.51049130050470068257e-03, 3.66008459261367522647e-03, 3.80720030262936314294e-03, 3.95179032639856198800e-03, 4.09380794463911311387e-03, 4.23320783499702736619e-03, 4.36994608342004212803e-03, 4.50398019484403704799e-03, 4.63526910319382156461e-03, 4.76377318069614620610e-03, 4.88945424650618146178e-03, 5.01227557464674778470e-03, 5.13220190126144337750e-03, 5.24919943118207308480e-03, 5.36323584381190321402e-03, 5.47428029832571112767e-03, 5.58230343818897148389e-03, 5.68727739499729628703e-03, 5.78917579163970574818e-03, 5.88797374478673089110e-03, 5.98364786670789981782e-03, 6.07617626642060343345e-03, 6.16553855017385084303e-03, 6.25171582127166582804e-03, 6.33469067923863194541e-03, 6.41444721833308011821e-03, 6.49097102541174898749e-03, 6.56424917715103632687e-03, 6.63427023662958338657e-03, 6.70102424927795491810e-03, 6.76450273820044644529e-03, 6.82469869887525251023e-03, 6.88160659323871527759e-03, 6.93522234316026366108e-03, 6.98554332331408935064e-03, 7.03256835345506155222e-03, 7.07629769010476809138e-03, 7.11673301765615093362e-03, 7.15387743890304877992e-03, 7.18773546500291789924e-03, 7.21831300488032408247e-03, 7.24561735407938580650e-03, 7.26965718307318129604e-03, 7.29044252503875406940e-03, 7.30798476310635155423e-03, 7.32229661709144288850e-03, 7.33339212971884264747e-03, 7.34128665234775375920e-03, 7.34599683020745793799e-03, 7.34754058715258225737e-03, 7.34593710994830336597e-03, 7.34120683209452638829e-03, 7.33337141719967496728e-03, 7.32245374191355016119e-03, 7.30847787843014878861e-03, 7.29146907657012011139e-03, 7.27145374545387114529e-03, 7.24845943477565521351e-03, 7.22251481568945107037e-03, 7.19364966131744686118e-03, 7.16189482689201083881e-03, 7.12728222954231872138e-03, 7.08984482773655864257e-03, 7.04961660039112210374e-03, 7.00663252565801673161e-03, 6.96092855940177307472e-03, 6.91254161337735619636e-03, 6.86150953312070904788e-03, 6.80787107556324582597e-03, 6.75166588638215301593e-03, 6.69293447709806265528e-03, 6.63171820193170571955e-03, 6.56805923443159328512e-03, 6.50200054388410785683e-03, 6.43358587151825807998e-03, 6.36285970651646794888e-03, 6.28986726184373092646e-03, 6.21465444990643503531e-03, 6.13726785805332464285e-03, 6.05775472392990760317e-03, 5.97616291069856791357e-03, 5.89254088213594148099e-03, 5.80693767761965816410e-03, 5.71940288701587758180e-03, 5.62998662548002196115e-03, 5.53873950818146131014e-03, 5.44571262496510149348e-03, 5.35095751496040238082e-03, 5.25452614115022934027e-03, 5.15647086491062122543e-03, 5.05684442053339500839e-03, 4.95569988974256699088e-03, 4.85309067621648645985e-03, 4.74907048012647350216e-03, 4.64369327270371719946e-03, 4.53701327084515566163e-03, 4.42908491176951992635e-03, 4.31996282773485212186e-03, 4.20970182082771107734e-03, 4.09835683783572966160e-03, 3.98598294521311340144e-03, 3.87263530415101094040e-03, 3.75836914576165720403e-03, 3.64323974638825019007e-03, 3.52730240304928790995e-03, 3.41061240902878646739e-03, 3.29322502962129748730e-03, 3.17519547804233142826e-03, 3.05657889151338601694e-03, 2.93743030753160130203e-03, 2.81780464033296821486e-03, 2.69775665755896121301e-03, 2.57734095713514719389e-03, 2.45661194437134461702e-03, 2.33562380929147129019e-03, 2.21443050420279223534e-03, 2.09308572151161147862e-03, 1.97164287179554201940e-03, 1.85015506213867531038e-03, 1.72867507473943343883e-03, 1.60725534579748128607e-03, 1.48594794468843234732e-03, 1.36480455343317803527e-03, 1.24387644646943291808e-03, 1.12321447073277739387e-03, 1.00286902605367005473e-03, 8.82890045877847201225e-04, 7.63326978315998568199e-04, 6.44228767529792380013e-04, 5.25643835459782418976e-04, 4.07620063901896608968e-04, 2.90204776937506045247e-04, 1.73444723723805766706e-04, 5.73860616484244659592e-05, -5.79256601447129809831e-05, -1.72445516855139978872e-04, -2.86129223744603178401e-04, -3.98933151471683798521e-04, -5.10814341036775051638e-04, -6.21730518333987194034e-04, -7.31640108305292775383e-04, -8.40502248693749103720e-04, -9.48276803391555388537e-04, -1.05492437538016840815e-03, -1.16040631925863960139e-03, -1.26468475335793167046e-03, -1.36772257143744795961e-03, -1.46948345396231690001e-03, -1.56993187895820992227e-03, -1.66903313244173671925e-03, -1.76675331842487395514e-03, -1.86305936849075486246e-03, -1.95791905094055886799e-03, -2.05130097950870097026e-03, -2.14317462164644121497e-03, -2.23351030637205421117e-03, -2.32227923168745655630e-03, -2.40945347156019864382e-03, -2.49500598247101752769e-03, -2.57891060952624437755e-03, -2.66114209213571661222e-03, -2.74167606925580006200e-03, -2.82048908419860059130e-03, -2.89755858900738426376e-03, -2.97286294839969704451e-03, -3.04638144327833843006e-03, -3.11809427381250833106e-03, -3.18798256208930414976e-03, -3.25602835433819615824e-03, -3.32221462272949338845e-03, -3.38652526674922864716e-03, -3.44894511415224942069e-03, -3.50945992149601917673e-03, -3.56805637425754813494e-03, -3.62472208653601482564e-03, -3.67944560034401835918e-03, -3.73221638449032109761e-03, -3.78302483305743104600e-03, -3.83186226347697993233e-03, -3.87872091420681094562e-03, -3.92359394201303914723e-03, -3.96647541886111301701e-03, -4.00736032841956212047e-03, -4.04624456218095809173e-03, -4.08312491520368761599e-03, -4.11799908147960237043e-03, -4.15086564893147550587e-03, -4.18172409404541419592e-03, -4.21057477614258761356e-03, -4.23741893129556731340e-03, -4.26225866589410255086e-03, -4.28509694986558761776e-03, -4.30593760955555893838e-03, -4.32478532027361865092e-03, -4.34164559851025946141e-03, -4.35652479383043678834e-03, -4.36943008044940375129e-03, -4.38036944849687272935e-03, -4.38935169497548655082e-03, -4.39638641441941844384e-03, -4.40148398925969356471e-03, -4.40465557990201740657e-03, -4.40591311452397972614e-03, -4.40526927859759102890e-03, -4.40273750414399336200e-03, -4.39833195872687317957e-03, -4.39206753419116562726e-03, -4.38395983515392842489e-03, -4.37402516725410826781e-03, -4.36228052516814471251e-03, -4.34874358039834783829e-03, -4.33343266884099378305e-03, -4.31636677814128347924e-03, -4.29756553484226828249e-03, -4.27704919133478460302e-03, -4.25483861261575103258e-03, -4.23095526286197242544e-03, -4.20542119182673330285e-03, -4.17825902106652539991e-03, -4.14949193000528453179e-03, -4.11914364184333848390e-03, -4.08723840931864319803e-03, -4.05380100032764340012e-03, -4.01885668341308427420e-03, -3.98243121312639048598e-03, -3.94455081527187324114e-03, -3.90524217204034265055e-03, -3.86453240703949710971e-03, -3.82244907022857112119e-03, -3.77902012276458334344e-03, -3.73427392176791782957e-03, -3.68823920501411533363e-03, -3.64094507555994461798e-03, -3.59242098631046497328e-03, -3.54269672453505143905e-03, -3.49180239633924225512e-03, -3.43976841109999795926e-03, -3.38662546587152699790e-03, -3.33240452976901182711e-03, -3.27713682833726460339e-03, -3.22085382791172753977e-03, -3.16358721997866921757e-03, -3.10536890554190866259e-03, -3.04623097950279270868e-03, -2.98620571506079835605e-03, -2.92532554814109750294e-03, -2.86362306185669341502e-03, -2.80113097101106212072e-03, -2.73788210664884781517e-03, -2.67390940066071719841e-03, -2.60924587044905360173e-03, -2.54392460366138209102e-03, -2.47797874299740972931e-03, -2.41144147109654920225e-03, -2.34434599551184728525e-03, -2.27672553377682423265e-03, -2.20861329857108918892e-03, -2.14004248299099744321e-03, -2.07104624593109319652e-03, -2.00165769758243626206e-03, -1.93190988505322330110e-03, -1.86183577811795423693e-03, -1.79146825509988766485e-03, -1.72084008889326943795e-03, -1.64998393312966343087e-03, -1.57893230849462818527e-03, -1.50771758919912264932e-03, -1.43637198961127387532e-03, -1.36492755105304883201e-03, -1.29341612876705033125e-03, -1.22186937905778840625e-03, -1.15031874661246304344e-03, -1.07879545200534983015e-03, -1.00733047939059738862e-03, -9.35954564387392199190e-04, -8.64698182161781326270e-04, -7.93591535709335898878e-04, -7.22664544342259342231e-04, -6.51946832385152269008e-04, -5.81467718082645003419e-04, -5.11256202723101406751e-04, -4.41340959980976682391e-04, -3.71750325482115011495e-04, -3.02512286594312090893e-04, -2.33654472446860898751e-04, -1.65204144181543805632e-04, -9.71881854382950145007e-05, -2.96330930778333087529e-05, 3.74350318557888840534e-05, 1.03990492930665522531e-04, 1.70008006877860913661e-04, 2.35462711895771908792e-04, 3.00330175705594570618e-04, 3.64586403356421419591e-04, 4.28207844777551787079e-04, 4.91171402077186748311e-04, 5.53454436585029511952e-04, 6.15034775638214118408e-04, 6.75890719108685204992e-04, 7.36001045671158494674e-04, 7.95345018810736208159e-04, 8.53902392568785988461e-04, 9.11653417026953884206e-04, 9.68578843528107927274e-04, 1.02465992963409239201e-03, 1.07987844381954517861e-03, 1.13421666990184857697e-03, 1.18765741120669863183e-03, 1.24018399446962118877e-03, 1.29178027347317181048e-03, 1.34243063242041153760e-03, 1.39211998904448393775e-03, 1.44083379745542361494e-03, 1.48855805072399061464e-03, 1.53527928320389963832e-03, 1.58098457259274222282e-03, 1.62566154173287799080e-03, 1.66929836015300469068e-03, 1.71188374535185877309e-03, 1.75340696382495094506e-03, 1.79385783183615881223e-03, 1.83322671593499951850e-03, 1.87150453322187351919e-03, 1.90868275136241117781e-03, 1.94475338835288632730e-03, 1.97970901203875114180e-03, 2.01354273938795765367e-03, 2.04624823552140497340e-03, 2.07781971250251560127e-03, 2.10825192788842950831e-03, 2.13754018304492627786e-03, 2.16568032122775241954e-03, 2.19266872543273649843e-03, 2.21850231601753312277e-03, 2.24317854809751244041e-03, 2.26669540871874157159e-03, 2.28905141381085521987e-03, 2.31024560492300908704e-03, 2.33027754574556848419e-03, 2.34914731842113299123e-03, 2.36685551964774167771e-03, 2.38340325657774047483e-03, 2.39879214251553785076e-03, 2.41302429241780800814e-03, 2.42610231819949092105e-03, 2.43802932384921434983e-03, 2.44880890035772524199e-03, 2.45844512046309356806e-03, 2.46694253321619750424e-03, 2.47430615837057783779e-03, 2.48054148060029584083e-03, 2.48565444354972896537e-03, 2.48965144371932805070e-03, 2.49253932419119233338e-03, 2.49432536819870756192e-03, 2.49501729254406187306e-03, 2.49462324086802481049e-03, 2.49315177677595679884e-03, 2.49061187682437026880e-03, 2.48701292337218105022e-03, 2.48236469730101589823e-03, 2.47667737060877201499e-03, 2.46996149888082565729e-03, 2.46222801364318543901e-03, 2.45348821460201170497e-03, 2.44375376177385136151e-03, 2.43303666751100867299e-03, 2.42134928842652587602e-03, 2.40870431722312039469e-03, 2.39511477443066006163e-03, 2.38059400005651662299e-03, 2.36515564515335941637e-03, 2.34881366330883401689e-03, 2.33158230206161314751e-03, 2.31347609424828503169e-03, 2.29450984928561332182e-03, 2.27469864439260342423e-03, 2.25405781575686164908e-03, 2.23260294964972971082e-03, 2.21034987349466626252e-03, 2.18731464689328946802e-03, 2.16351355261355186160e-03, 2.13896308754443764677e-03, 2.11367995362164717843e-03, 2.08768104872860673846e-03, 2.06098345757712827012e-03, 2.03360444257223585765e-03, 2.00556143466523338278e-03, 1.97687202419953838434e-03, 1.94755395175337346625e-03, 1.91762509898370150235e-03, 1.88710347947544372464e-03, 1.85600722960030926380e-03, 1.82435459938927956557e-03, 1.79216394342290039413e-03, 1.75945371174334418141e-03, 1.72624244079242210488e-03, 1.69254874437936271916e-03, 1.65839130468247841071e-03, 1.62378886328829906069e-03, 1.58876021227249563002e-03, 1.55332418532590395277e-03, 1.51749964892962602506e-03, 1.48130549358308134279e-03, 1.44476062508820820261e-03, 1.40788395589385340219e-03, 1.37069439650360901800e-03, 1.33321084695073701146e-03, 1.29545218834344489506e-03, 1.25743727448406820806e-03, 1.21918492356532437090e-03, 1.18071390994699786103e-03, 1.14204295601606406994e-03, 1.10319072413361980722e-03, 1.06417580867146756643e-03, 1.02501672814153568618e-03, 9.85731917420752321024e-04, 9.46339720074761028661e-04, 9.06858380782653099826e-04, 8.67306037865940180828e-04, 8.27700715924154601863e-04, 7.88060318579825755218e-04, 7.48402621335140681366e-04, 7.08745264542995573667e-04, 6.69105746494616255432e-04, 6.29501416626196083105e-04, 5.89949468846577432593e-04, 5.50466934988384673337e-04, 5.11070678384569518186e-04, 4.71777387572266644969e-04, 4.32603570126133903009e-04, 3.93565546622840108093e-04, 3.54679444738640930936e-04, 3.15961193481461178213e-04, 2.77426517559644606348e-04, 2.39090931888283949464e-04, 2.00969736235134577339e-04, 1.63078010007227617185e-04, 1.25430607179671989044e-04, 8.80421513676910678318e-05, 5.09270310433270975443e-05, 1.40993948977051206995e-05, -2.24268526499689963992e-05, -5.86380557959355767418e-05, -9.45208115468090933828e-05, -1.30061973765318488264e-04, -1.65248657065980185041e-04, -2.00068240560348736649e-04, -2.34508371450769772170e-04, -2.68556968472767403858e-04, -3.02202225185153135114e-04, -3.35432613107714699702e-04, -3.68236884706315019053e-04, -4.00604076224976460123e-04, -4.32523510365022737217e-04, -4.63984798811095579957e-04, -4.94977844604242624843e-04, -5.25492844361963827582e-04, -5.55520290345540247376e-04, -5.85050972374773735341e-04, -6.14075979590610184985e-04, -6.42586702065795259929e-04, -6.70574832264203037069e-04, -6.98032366349193725621e-04, -7.24951605341828033552e-04, -7.51325156129156322866e-04, -7.77145932323820387393e-04, -8.02407154975299293648e-04, -8.27102353133903219450e-04, -8.51225364268258727699e-04, -8.74770334537431802288e-04, -8.97731718918501797773e-04, -9.20104281190827605862e-04, -9.41883093778050233848e-04, -9.63063537449165905750e-04, -9.83641300879760935652e-04, -1.00361238007481306557e-03, -1.02297307765449128208e-03, -1.04172000200423238610e-03, -1.05985006629069969386e-03, -1.07736048734502422482e-03, -1.09424878441514257174e-03, -1.11051277778848088776e-03, -1.12615058728708443934e-03, -1.14116063063659394818e-03, -1.15554162171100749217e-03, -1.16929256865495575027e-03, -1.18241277188544584124e-03, -1.19490182197486941203e-03, -1.20675959741726535404e-03, -1.21798626227982297217e-03, -1.22858226374166065384e-03, -1.23854832952187280184e-03, -1.24788546519901061629e-03, -1.25659495142406364872e-03, -1.26467834102919943727e-03, -1.27213745603428412742e-03, -1.27897438455362244883e-03, -1.28519147760499177768e-03, -1.29079134582336268501e-03, -1.29577685608154116216e-03, -1.30015112802015094483e-03, -1.30391753048923449490e-03, -1.30707967790388737521e-03, -1.30964142651636395419e-03, -1.31160687060702277167e-03, -1.31298033859659005196e-03, -1.31376638908218385492e-03, -1.31396980679961724973e-03, -1.31359559851441281067e-03, -1.31264898884408520024e-03, -1.31113541601419526274e-03, -1.30906052755070225271e-03, -1.30643017591116055581e-03, -1.30325041405731484843e-03, -1.29952749097163636725e-03, -1.29526784712039586857e-03, -1.29047810986578645812e-03, -1.28516508882973415524e-03, -1.27933577121191956356e-03, -1.27299731706460124078e-03, -1.26615705452684046764e-03, -1.25882247502064623448e-03, -1.25100122841167137044e-03, -1.24270111813698665680e-03, -1.23393009630251375940e-03, -1.22469625875265661526e-03, -1.21500784011470538623e-03, -1.20487320882053006339e-03, -1.19430086210808427544e-03, -1.18329942100529298017e-03, -1.17187762529875026674e-03, -1.16004432848981092231e-03, -1.14780849274044756403e-03, -1.13517918381147498753e-03, -1.12216556599544479457e-03, -1.10877689704675665670e-03, -1.09502252311132830878e-03, -1.08091187365826806380e-03, -1.06645445641585442931e-03, -1.05165985231426076241e-03, -1.03653771043727446592e-03, -1.02109774298538512859e-03, -1.00534972025243104707e-03, -9.89303465618205854493e-04, -9.72968850559070386023e-04, -9.56355789678956110487e-04, -9.39474235762757228438e-04, -9.22334174854466432199e-04, -9.04945621361946477522e-04, -8.87318613190598128385e-04, -8.69463206907894578697e-04, -8.51389472940857513876e-04, -8.33107490808391681729e-04, -8.14627344390523211622e-04, -7.95959117236444131487e-04, -7.77112887913182157074e-04, -7.58098725396869001399e-04, -7.38926684508335205812e-04, -7.19606801394884719458e-04, -7.00149089059903611230e-04, -6.80563532942129469604e-04, -6.60860086546161931871e-04, -6.41048667125920334890e-04, -6.21139151422514545521e-04, -6.01141371458319205383e-04, -5.81065110388481308873e-04, -5.60920098411564179222e-04, -5.40716008740645473485e-04, -5.20462453636329636791e-04, -5.00168980502928035153e-04, -4.79845068049252442000e-04, -4.59500122515179752151e-04, -4.39143473965308969373e-04, -4.18784372650737749064e-04, -3.98431985440370181519e-04, -3.78095392322528038760e-04, -3.57783582978218623466e-04, -3.37505453426840712917e-04, -3.17269802745462131330e-04, -2.97085329862539673351e-04, -2.76960630426857884294e-04, -2.56904193752789059696e-04, -2.36924399842341755311e-04, -2.17029516485020210204e-04, -1.97227696436049984184e-04, -1.77526974673721080374e-04, -1.57935265736364822877e-04, -1.38460361139671443579e-04, -1.19109926874780676581e-04, -9.98915009877096604120e-05, -8.08124912404658787314e-05, -6.18801728543761411219e-05, -4.31016863358901726119e-05, -2.44840353852607290751e-05, -6.03408488822807525549e-06, 1.22414410087942923482e-05, 3.03359607401630166279e-05, 4.82430370786643698930e-05, 6.59563788094303331657e-05, 8.34698423199615796228e-05, 1.00777433106333784039e-04, 1.17873307195481496850e-04, 1.34751772483674884346e-04, 1.51407289991337552218e-04, 1.67834475034225882872e-04, 1.84028098311239825778e-04, 1.99983086909011169297e-04, 2.15694525223608961004e-04, 2.31157655799539194473e-04, 2.46367880086458945071e-04, 2.61320759113890506518e-04, 2.76012014084471178285e-04, 2.90437526885940853344e-04, 3.04593340522622661477e-04, 3.18475659466672001308e-04, 3.32080849929764377465e-04, 3.45405440055728798956e-04, 3.58446120034815369788e-04, 3.71199742140139986053e-04, 3.83663320687053425832e-04, 3.95834031916090828447e-04, 4.07709213800306149479e-04, 4.19286365777668133727e-04, 4.30563148409382728376e-04, 4.41537382964913725693e-04, 4.52207050934656925797e-04, 4.62570293470961546242e-04, 4.72625410758635230730e-04, 4.82370861315684551149e-04, 4.91805261225328150740e-04, 5.00927383300294468485e-04, 5.09736156180340470138e-04, 5.18230663364083014855e-04, 5.26410142176160977465e-04, 5.34273982670858136115e-04, 5.41821726473215733132e-04, 5.49053065558819199977e-04, 5.55967840973343140065e-04, 5.62566041493084596781e-04, 5.68847802227587348751e-04, 5.74813403165606124842e-04, 5.80463267665585255090e-04, 5.85797960891953992807e-04, 5.90818188198352634011e-04, 5.95524793459205619046e-04, 5.99918757350793364382e-04, 6.04001195583171897330e-04, 6.07773357084216074402e-04, 6.11236622137123529822e-04, 6.14392500472671181100e-04, 6.17242629317575641247e-04, 6.19788771400296852575e-04, 6.22032812915646266330e-04, 6.23976761449542352556e-04, 6.25622743865282679096e-04, 6.26973004152734866845e-04, 6.28029901241785953013e-04, 6.28795906781460817864e-04, 6.29273602886090081127e-04, 6.29465679849935955126e-04, 6.29374933831637162034e-04, 6.29004264509917614644e-04, 6.28356672711923979618e-04, 6.27435258015602670238e-04, 6.26243216327530610385e-04, 6.24783837437580067548e-04, 6.23060502551831571320e-04, 6.21076681805128117189e-04, 6.18835931754663313292e-04, 6.16341892855999597296e-04, 6.13598286922899423257e-04, 6.10608914572360016171e-04, 6.07377652656219848941e-04, 6.03908451680720608987e-04, 6.00205333215381750360e-04, 5.96272387292547546150e-04, 5.92113769798962869678e-04, 5.87733699860716260477e-04, 5.83136457222883410056e-04, 5.78326379625196070923e-04, 5.73307860175058681823e-04, 5.68085344719199331932e-04, 5.62663329215264671791e-04, 5.57046357104629347515e-04, 5.51239016687691835844e-04, 5.45245938502918582949e-04, 5.39071792710859535452e-04, 5.32721286484389919269e-04, 5.26199161406370888652e-04, 5.19510190875949965511e-04, 5.12659177524647379116e-04, 5.05650950643461694588e-04, 4.98490363622070692395e-04, 4.91182291401325650700e-04, 4.83731627940122419548e-04, 4.76143283697776802978e-04, 4.68422183132952726740e-04, 4.60573262220249240485e-04, 4.52601465985464203410e-04, 4.44511746060588389465e-04, 4.36309058259498746754e-04, 4.27998360175392566791e-04, 4.19584608800889610671e-04, 4.11072758171783069880e-04, 4.02467757035333936928e-04, 3.93774546544049656484e-04, 3.84998057975832470683e-04, 3.76143210481313700240e-04, 3.67214908859312392543e-04, 3.58218041361136620669e-04, 3.49157477524604336044e-04, 3.40038066038525694287e-04, 3.30864632638427479810e-04, 3.21641978034209344382e-04, 3.12374875870502510550e-04, 3.03068070720368721877e-04, 2.93726276113044930307e-04, 2.84354172596324122988e-04, 2.74956405834251703824e-04, 2.65537584740686090270e-04, 2.56102279649332684359e-04, 2.46655020520732712157e-04, 2.37200295186851598233e-04, 2.27742547633623577692e-04, 2.18286176322046336163e-04, 2.08835532548216017655e-04, 1.99394918842769620351e-04, 1.89968587410093434423e-04, 1.80560738607737464008e-04, 1.71175519466368710516e-04, 1.61817022250571095152e-04, 1.52489283060860649410e-04, 1.43196280477158617963e-04, 1.33941934244020521144e-04, 1.24730103997818122337e-04, 1.15564588036148766046e-04, 1.06449122129624024050e-04, 9.73873783762444747338e-05, 8.83829640984437603628e-05, 7.94394207830501368397e-05, 7.05602230641164422306e-05, 6.17487777488439845697e-05, 5.30084228865277819307e-05, 4.43424268807018922721e-05, 3.57539876443504868529e-05, 2.72462317982963840894e-05, 1.88222139126731892130e-05, 1.04849157914673770899e-05, 2.23724580001398245952e-06, -5.91796176458841909860e-06, -1.39779472603022615363e-05, -2.19400262443108254274e-05, -2.98015899747312779436e-05, -3.75601058699388188874e-05, -4.52131179258346812058e-05, -5.27582470911579511194e-05, -6.01931916011169823111e-05, -6.75157272696155086192e-05, -7.47237077402686759994e-05, -8.18150646965978259242e-05, -8.87878080315813176041e-05, -9.56400259770174112402e-05, -1.02369885192932295447e-04, -1.08975630817447491838e-04, -1.15455586477445233109e-04, -1.21808154260462635915e-04, -1.28031814648165977134e-04, -1.34125126411867404445e-04, -1.40086726470483718130e-04, -1.45915329711446663599e-04, -1.51609728774925367391e-04, -1.57168793801964925671e-04, -1.62591472146915872604e-04, -1.67876788054762332352e-04, -1.73023842303760092562e-04, -1.78031811814023872061e-04, -1.82899949222519527144e-04, -1.87627582425063416539e-04, -1.92214114085866635134e-04, -1.96659021115234305434e-04, -2.00961854115964548605e-04, -2.05122236799067813760e-04, -2.09139865369424642018e-04, -2.13014507881963919287e-04, -2.16746003569016719827e-04, -2.20334262139455170628e-04, -2.23779263050288623272e-04, -2.27081054751326671731e-04, -2.30239753903598189230e-04, -2.33255544572162539776e-04, -2.36128677394024743099e-04, -2.38859468721759089912e-04, -2.41448299743606627134e-04, -2.43895615580664562507e-04, -2.46201924361897988517e-04, -2.48367796277648787261e-04, -2.50393862612362249915e-04, -2.52280814757210175570e-04, -2.54029403203337271477e-04, -2.55640436516424906718e-04, -2.57114780293308988878e-04, -2.58453356101321892260e-04, -2.59657140401130335366e-04, -2.60727163453730896234e-04, -2.61664508212373382850e-04, -2.62470309200077975623e-04, -2.63145751373508769710e-04, -2.63692068973905575490e-04, -2.64110544365773612825e-04, -2.64402506864084673854e-04, -2.64569331550674807438e-04, -2.64612438080565591254e-04, -2.64533289478916812908e-04, -2.64333390929326621406e-04, -2.64014288554176887285e-04, -2.63577568187730454374e-04, -2.63024854142685936189e-04, -2.62357807970878796362e-04, -2.61578127218826830911e-04, -2.60687544178804346540e-04, -2.59687824636131118095e-04, -2.58580766613355161020e-04, -2.57368199111998000473e-04, -2.56051980852535184582e-04, -2.54633999013272917245e-04, -2.53116167968770410229e-04, -2.51500428028467203686e-04, -2.49788744176148520739e-04, -2.47983104810888498049e-04, -2.46085520490098991209e-04, -2.44098022675305284133e-04, -2.42022662481256641692e-04, -2.39861509428983846149e-04, -2.37616650203396260988e-04, -2.35290187416002671578e-04, -2.32884238373345356290e-04, -2.30400933851706944807e-04, -2.27842416878660760553e-04, -2.25210841522004905167e-04, -2.22508371686640725982e-04, -2.19737179919906623887e-04, -2.16899446225907947382e-04, -2.13997356889345798732e-04, -2.11033103309352538255e-04, -2.08008880843819519632e-04, -2.04926887664708660573e-04, -2.01789323624807442155e-04, -1.98598389136399967663e-04, -1.95356284062287273917e-04, -1.92065206619610498147e-04, -1.88727352296894345393e-04, -1.85344912784731391314e-04, -1.81920074920499755819e-04, -1.78455019647530454055e-04, -1.74951920989073971512e-04, -1.71412945037461607323e-04, -1.67840248958807175192e-04, -1.64235980013589989322e-04, -1.60602274593463965847e-04, -1.56941257274607583660e-04, -1.53255039887926981963e-04, -1.49545720606400077326e-04, -1.45815383049865629223e-04, -1.42066095407511174204e-04, -1.38299909578337953649e-04, -1.34518860329830815736e-04, -1.30724964475093245915e-04, -1.26920220068654472992e-04, -1.23106605621173758290e-04, -1.19286079333219134950e-04, -1.15460578348350841244e-04, -1.11632018025632952099e-04, -1.07802291231779830637e-04, -1.03973267653065606659e-04, -1.00146793127148565233e-04, -9.63246889949230804435e-05, -9.25087514725346873358e-05, -8.87007510436452450671e-05, -8.49024318720545515026e-05, -8.11155112347393549661e-05, -7.73416789754019609908e-05, -7.35825969785674924512e-05, -6.98398986642887023612e-05, -6.61151885034750767074e-05, -6.24100415538899748772e-05, -5.87260030168200428450e-05, -5.50645878143974986741e-05, -5.14272801876128782695e-05, -4.78155333149380714058e-05, -4.42307689515766361233e-05, -4.06743770892715146635e-05, -3.71477156366324749162e-05, -3.36521101199027279356e-05, -3.01888534041130525139e-05, -2.67592054345224943665e-05, -2.33643929982665948157e-05, -2.00056095060906951114e-05, -1.66840147940797201324e-05, -1.34007349452439661363e-05, -1.01568621308437851693e-05, -6.95345447128813701427e-06, -3.79153591650250810366e-06, -6.72096145553293655593e-07, 2.40390951459279597616e-06, 5.43556015137456058426e-06, 8.42196931017640123499e-06, 1.13622850193110927676e-05, 1.42556897966238257746e-05, 1.71014006379341248229e-05, 1.98986689875390831126e-05, 2.26467806909793172563e-05, 2.53450559303131682314e-05, 2.79928491421220740245e-05, 3.05895489185053302676e-05, 3.31345778912925430443e-05, 3.56273925997451632237e-05, 3.80674833419947510364e-05, 4.04543740105068599521e-05, 4.27876219118044463113e-05, 4.50668175707753267513e-05, 4.72915845198089502860e-05, 4.94615790730713200283e-05, 5.15764900862005805371e-05, 5.36360387017334339240e-05, 5.56399780805481871900e-05, 5.75880931196438774090e-05, 5.94802001565561985590e-05, 6.13161466607366493955e-05, 6.30958109121965409621e-05, 6.48191016677504891876e-05, 6.64859578151715343739e-05, 6.80963480156043240521e-05, 6.96502703345347587470e-05, 7.11477518616810702089e-05, 7.25888483201263885920e-05, 7.39736436650163245096e-05, 7.53022496721903708853e-05, 7.65748055170595645635e-05, 7.77914773440878826866e-05, 7.89524578272120806021e-05, 8.00579657215541123884e-05, 8.11082454067584148567e-05, 8.21035664223097817662e-05, 8.30442229951717527346e-05, 8.39305335600990616227e-05, 8.47628402729624154692e-05, 8.55415085174379832356e-05, 8.62669264054029689666e-05, 8.69395042713942022743e-05, 8.75596741614536786501e-05, 8.81278893167311284636e-05, 8.86446236521661512422e-05, 8.91103712306026604075e-05, 8.95256457326717546962e-05, 8.98909799227875892661e-05, 9.02069251115862640782e-05, 9.04740506151490363976e-05, 9.06929432113401867103e-05, 9.08642065935940279782e-05, 9.09884608224771455898e-05, 9.10663417753510066833e-05, 9.10985005944656069544e-05, 9.10856031337957275460e-05, 9.10283294049456589850e-05, 9.09273730224310103125e-05, 9.07834406486567112131e-05, 9.05972514388884682737e-05, 9.03695364865346147717e-05, 9.01010382690298824038e-05, 8.97925100946232214449e-05, 8.94447155503604388049e-05, 8.90584279515538464710e-05, 8.86344297930203114553e-05, 8.81735122023717546660e-05, 8.76764743956322256668e-05, 8.71441231354561004216e-05, 8.65772721922116491981e-05, 8.59767418081955635050e-05, 8.53433581652348287718e-05, 8.46779528559294970011e-05, 8.39813623587842351167e-05, 8.32544275174723505482e-05, 8.24979930244696123580e-05, 8.17129069092911340059e-05, 8.09000200315580515319e-05, 8.00601855791177764851e-05, 7.91942585714318722121e-05, 7.83030953684469709260e-05, 7.73875531851490379041e-05, 7.64484896120066966278e-05, 7.54867621414943666810e-05, 7.45032277008856680736e-05, 7.34987421914997258445e-05, 7.24741600345781298914e-05, 7.14303337239639759421e-05, 7.03681133857495075701e-05, 6.92883463450485250238e-05, 6.81918767000556897513e-05, 6.70795449035298084342e-05, 6.59521873518545653477e-05, 6.48106359818019012913e-05, 6.36557178751403541801e-05, 6.24882548712000070136e-05, 6.13090631875229413088e-05, 6.01189530487050480105e-05, 5.89187283235398522627e-05, 5.77091861705600261078e-05, 5.64911166920768371556e-05, 5.52653025968012133018e-05, 5.40325188711331935503e-05, 5.27935324591918643858e-05, 5.15491019516612150597e-05, 5.02999772835162253098e-05, 4.90468994406823114189e-05, 4.77906001756943685883e-05, 4.65318017323872241855e-05, 4.52712165796745444508e-05, 4.40095471544385224527e-05, 4.27474856135762158195e-05, 4.14857135952114382585e-05, 4.02249019891050019768e-05, 3.89657107162695045101e-05, 3.77087885178019617646e-05, 3.64547727529321324196e-05, 3.52042892062907349744e-05, 3.39579519043854685862e-05, 3.27163629412759540162e-05, 3.14801123134230239524e-05, 3.02497777637023744978e-05, 2.90259246345387218443e-05, 2.78091057301432964695e-05, 2.65998611878025348972e-05, 2.53987183581919854364e-05, 2.42061916946511448772e-05, 2.30227826513813061706e-05, 2.18489795905047869758e-05, 2.06852576979222047276e-05, 1.95320789079097866306e-05, 1.83898918363816234168e-05, 1.72591317227478167385e-05, 1.61402203802856600485e-05, 1.50335661549492530784e-05, 1.39395638925266073790e-05, 1.28585949140593193966e-05, 1.17910269994264146578e-05, 1.07372143790027249535e-05, 9.69749773328629209753e-06, 8.67220420039572420566e-06, 7.66164739132314657512e-06, 6.66612741284622437347e-06, 5.68593089796976951548e-06, 4.72133104379410701050e-06, 3.77258765668374723169e-06, 2.83994720461857994069e-06, 1.92364287659795633360e-06, 1.02389464897677183691e-06, 1.40909358598783243636e-07, -7.25119217400925882488e-07, -1.57401027526573751796e-06, -2.40559589188401177682e-06, -3.21972092580435969379e-06, -4.01624291213239929447e-06, -4.79503195145223449727e-06, -5.55597059291959898474e-06, -6.29895371166915398527e-06, -7.02388838068995278969e-06, -7.73069373730662337714e-06, -8.41930084443043260571e-06, -9.08965254672049638874e-06, -9.74170332181420186798e-06, -1.03754191267770145960e-05, -1.09907772399306088372e-05, -1.15877660982095854786e-05, -1.21663851302071818753e-05, -1.27266445850638015879e-05, -1.32685653573596831328e-05, -1.37921788081646564831e-05, -1.42975265824070264185e-05, -1.47846604227169150120e-05, -1.52536419799077777845e-05, -1.57045426202454864190e-05, -1.61374432296745794440e-05, -1.65524340151509907705e-05, -1.69496143032443776877e-05, -1.73290923361651281922e-05, -1.76909850653765942752e-05, -1.80354179429455134585e-05, -1.83625247107888849940e-05, -1.86724471879742999741e-05, -1.89653350562250020523e-05, -1.92413456437866339777e-05, -1.95006437078064384194e-05, -1.97434012153796016272e-05, -1.99697971234102591856e-05, -2.01800171574394671614e-05, -2.03742535895865872536e-05, -2.05527050157544749519e-05, -2.07155761322383869926e-05, -2.08630775118898238230e-05, -2.09954253799722451970e-05, -2.11128413898529763743e-05, -2.12155523986690494219e-05, -2.13037902431062623279e-05, -2.13777915154254429865e-05, -2.14377973398712400380e-05, -2.14840531495946086989e-05, -2.15168084642204138245e-05, -2.15363166681862903517e-05, -2.15428347899803886579e-05, -2.15366232824005027408e-05, -2.15179458039577262574e-05, -2.14870690015422825217e-05, -2.14442622944694083432e-05, -2.13897976600211963056e-05, -2.13239494205938423077e-05, -2.12469940325636042692e-05, -2.11592098769767039874e-05, -2.10608770521689021838e-05, -2.09522771684173563140e-05, -2.08336931447246940868e-05, -2.07054090078323760555e-05, -2.05677096935581607638e-05, -2.04208808505498906150e-05, -2.02652086465450858026e-05, -2.01009795772225878085e-05, -1.99284802777307897448e-05, -1.97479973369733553508e-05, -1.95598171147313057406e-05, -1.93642255616965921713e-05, -1.91615080424908975211e-05, -1.89519491617392180451e-05, -1.87358325932659067312e-05, -1.85134409124775290410e-05, -1.82850554319945745078e-05, -1.80509560405904254164e-05, -1.78114210454942761765e-05, -1.75667270181107023892e-05, -1.73171486432067083623e-05, -1.70629585716134836285e-05, -1.68044272764881711800e-05, -1.65418229131769521309e-05, -1.62754111827191523261e-05, -1.60054551990284544996e-05, -1.57322153597849753270e-05, -1.54559492210684566130e-05, -1.51769113757617390406e-05, -1.48953533357483810943e-05, -1.46115234179280960335e-05, -1.43256666340692667526e-05, -1.40380245845161517285e-05, -1.37488353557644599467e-05, -1.34583334219182035850e-05, -1.31667495500361276861e-05, -1.28743107093750131593e-05, -1.25812399845332226092e-05, -1.22877564924967183814e-05, -1.19940753035859587103e-05, -1.17004073663007361519e-05, -1.14069594360560160192e-05, -1.11139340078022052344e-05, -1.08215292525168970740e-05, -1.05299389575568482923e-05, -1.02393524708539662493e-05, -9.94995464893742348120e-06, -9.66192580876271611343e-06, -9.37544168332491989210e-06, -9.09067338103246418157e-06, -8.80778734881422739372e-06, -8.52694533893248795902e-06, -8.24830437947059051977e-06, -7.97201674846333152320e-06, -7.69822995163491404110e-06, -7.42708670370925303302e-06, -7.15872491325360909230e-06, -6.89327767101633304933e-06, -6.63087324171573705124e-06, -6.37163505923899323223e-06, -6.11568172520321447157e-06, -5.86312701083429459631e-06, -5.61407986211404469277e-06, -5.36864440814655013182e-06, -5.12691997269171846217e-06, -4.88900108881444233564e-06, -4.65497751659457443244e-06, -4.42493426384305196255e-06, -4.19895160976678087265e-06, -3.97710513152554464493e-06, -3.75946573362158312445e-06, -3.54609968006129461300e-06, -3.33706862922910230812e-06, -3.13242967141053148128e-06, -2.93223536890220278037e-06, -2.73653379864365903313e-06, -2.54536859730841838172e-06, -2.35877900878616331091e-06, -2.17679993399191934131e-06, -1.99946198293410626841e-06, -1.82679152897453787459e-06, -1.65881076521146377169e-06, -1.49553776291791911430e-06, -1.33698653196547020166e-06, -1.18316708316432299485e-06, -1.03408549244911473199e-06, -8.89743966841013678409e-07, -7.50140912114827378233e-07, -6.15271002100918799020e-07, -4.85125249549975873449e-07, -3.59691078491283933177e-07, -2.38952398011216803052e-07, -1.22889677382464548894e-07, 0 /* Need a final zero coefficient */ gmfsk-0.7pre1/src/samplerate/float_cast.h0000644000076400007640000001076110030143636014165 /* ** Copyright (C) 2001-2003 Erik de Castro Lopo ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* Version 1.3 */ /*============================================================================ ** On Intel Pentium processors (especially PIII and probably P4), converting ** from float to int is very slow. To meet the C specs, the code produced by ** most C compilers targeting Pentium needs to change the FPU rounding mode ** before the float to int conversion is performed. ** ** Changing the FPU rounding mode causes the FPU pipeline to be flushed. It ** is this flushing of the pipeline which is so slow. ** ** Fortunately the ISO C99 specifications define the functions lrint, lrintf, ** llrint and llrintf which fix this problem as a side effect. ** ** On Unix-like systems, the configure process should have detected the ** presence of these functions. If they weren't found we have to replace them ** here with a standard C cast. */ /* ** The C99 prototypes for lrint and lrintf are as follows: ** ** long int lrintf (float x) ; ** long int lrint (double x) ; */ #ifdef HAVE_CONFIG_H # include #endif /* ** The presence of the required functions are detected during the configure ** process and the values HAVE_LRINT and HAVE_LRINTF are set accordingly in ** the config.h file. */ #define HAVE_LRINT_REPLACEMENT 0 #if (HAVE_LRINT && HAVE_LRINTF) /* ** These defines enable functionality introduced with the 1999 ISO C ** standard. They must be defined before the inclusion of math.h to ** engage them. If optimisation is enabled, these functions will be ** inlined. With optimisation switched off, you have to link in the ** maths library using -lm. */ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC9X 1 #define __USE_ISOC99 1 #include #elif (defined (WIN32) || defined (_WIN32)) #undef HAVE_LRINT_REPLACEMENT #define HAVE_LRINT_REPLACEMENT 1 #include /* ** Win32 doesn't seem to have these functions. ** Therefore implement inline versions of these functions here. */ __inline long int lrint (double flt) { int intgr; _asm { fld flt fistp intgr } ; return intgr ; } __inline long int lrintf (float flt) { int intgr; _asm { fld flt fistp intgr } ; return intgr ; } #elif (defined (__MWERKS__) && defined (macintosh)) /* This MacOS 9 solution was provided by Stephane Letz */ #undef HAVE_LRINT_REPLACEMENT #define HAVE_LRINT_REPLACEMENT 1 #include #undef lrint #undef lrintf #define lrint double2int #define lrintf float2int inline int float2int (register float in) { long res [2] ; asm { fctiw in,in stfd in,res } return res [1] ; } /* float2int */ inline int double2int (register double in) { long res [2] ; asm { fctiw in,in stfd in,res } return res [1] ; } /* double2int */ #elif (defined (__MACH__) && defined (__APPLE__)) /* For Apple MacOSX. */ #undef HAVE_LRINT_REPLACEMENT #define HAVE_LRINT_REPLACEMENT 1 #include #undef lrint #undef lrintf #define lrint double2int #define lrintf float2int inline static long int float2int (register float in) { int res [2] ; __asm__ __volatile__ ( "fctiw %1, %1\n\t" "stfd %1, %0" : "=m" (res) /* Output */ : "f" (in) /* Input */ : "memory" ) ; return res [1] ; } /* lrintf */ inline static long int double2int (register double in) { int res [2] ; __asm__ __volatile__ ( "fctiw %1, %1\n\t" "stfd %1, %0" : "=m" (res) /* Output */ : "f" (in) /* Input */ : "memory" ) ; return res [1] ; } /* lrint */ #else #ifndef __sgi #warning "Don't have the functions lrint() and lrintf()." #warning "Replacing these functions with a standard C cast." #endif #include #define lrint(dbl) ((int) (dbl)) #define lrintf(flt) ((int) (flt)) #endif gmfsk-0.7pre1/src/samplerate/samplerate.c0000644000076400007640000001624210030145160014170 /* ** Copyright (C) 2002,2003 Erik de Castro Lopo ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "samplerate.h" #include "common.h" SRC_STATE * src_new (int converter_type, int channels, int *error) { SRC_PRIVATE *psrc ; if (error) *error = SRC_ERR_NO_ERROR ; if (channels < 1) { if (error) *error = SRC_ERR_BAD_CHANNEL_COUNT ; return NULL ; } ; if ((psrc = g_malloc0 (sizeof (*psrc))) == NULL) { if (error) *error = SRC_ERR_MALLOC_FAILED ; return NULL ; } ; psrc->channels = channels ; if (sinc_set_converter (psrc, converter_type) != SRC_ERR_NO_ERROR) { if (error) *error = SRC_ERR_BAD_CONVERTER ; g_free (psrc) ; psrc = NULL ; } ; src_reset ((SRC_STATE*) psrc) ; return (SRC_STATE*) psrc ; } /* src_new */ SRC_STATE * src_delete (SRC_STATE *state) { SRC_PRIVATE *psrc ; psrc = (SRC_PRIVATE*) state ; if (psrc) { if (psrc->private_data) g_free (psrc->private_data) ; memset (psrc, 0, sizeof (SRC_PRIVATE)) ; g_free (psrc) ; } ; return NULL ; } /* src_state */ int src_process (SRC_STATE *state, SRC_DATA *data) { SRC_PRIVATE *psrc ; int error ; psrc = (SRC_PRIVATE*) state ; if (psrc == NULL) return SRC_ERR_BAD_STATE ; if (psrc->process == NULL) return SRC_ERR_BAD_PROC_PTR ; /* Check for valid SRC_DATA first. */ if (data == NULL) return SRC_ERR_BAD_DATA ; /* Check src_ratio is in range. */ if (data->src_ratio < (1.0 / SRC_MAX_RATIO) || data->src_ratio > (1.0 * SRC_MAX_RATIO)) return SRC_ERR_BAD_SRC_RATIO ; /* And that data_in and data_out are valid. */ if (data->data_in == NULL || data->data_out == NULL) return SRC_ERR_BAD_DATA_PTR ; if (data->data_in == NULL) data->input_frames = 0 ; if (data->data_in < data->data_out) { if (data->data_in + data->input_frames * psrc->channels > data->data_out) { /*-printf ("data_in: %p data_out: %p\n", data->data_in + data->input_frames * psrc->channels, data->data_out) ;-*/ return SRC_ERR_DATA_OVERLAP ; } ; } else if (data->data_out + data->output_frames * psrc->channels > data->data_in) { /*-printf ("data_out: %p (%p) data_in: %p\n", data->data_out, data->data_out + data->output_frames * psrc->channels, data->data_in) ;-*/ return SRC_ERR_DATA_OVERLAP ; } ; if (data->input_frames < 0) data->input_frames = 0 ; if (data->output_frames < 0) data->output_frames = 0 ; /* Set the input and output counts to zero. */ data->input_frames_used = 0 ; data->output_frames_gen = 0 ; /* Special case for when last_ratio has not been set. */ if (psrc->last_ratio < (1.0 / SRC_MAX_RATIO)) psrc->last_ratio = data->src_ratio ; /* Now process. */ error = psrc->process (psrc, data) ; return error ; } /* src_process */ int src_set_ratio (SRC_STATE *state, double new_ratio) { SRC_PRIVATE *psrc ; psrc = (SRC_PRIVATE*) state ; if (psrc == NULL) return SRC_ERR_BAD_STATE ; if (psrc->process == NULL) return SRC_ERR_BAD_PROC_PTR ; psrc->last_ratio = new_ratio ; return SRC_ERR_NO_ERROR ; } /* src_set_ratio */ int src_reset (SRC_STATE *state) { SRC_PRIVATE *psrc ; if ((psrc = (SRC_PRIVATE*) state) == NULL) return SRC_ERR_BAD_STATE ; if (psrc->reset != NULL) psrc->reset (psrc) ; psrc->last_position = 0.0 ; psrc->last_ratio = 0.0 ; psrc->error = SRC_ERR_NO_ERROR ; return SRC_ERR_NO_ERROR ; } /* src_reset */ /*============================================================================== ** Control functions. */ const char * src_get_name (int converter_type) { const char *desc ; if ((desc = sinc_get_name (converter_type)) != NULL) return desc ; return NULL ; } /* src_get_name */ const char * src_get_description (int converter_type) { const char *desc ; if ((desc = sinc_get_description (converter_type)) != NULL) return desc ; return NULL ; } /* src_get_description */ const char * src_get_version (void) { return PACKAGE "-" VERSION ; } /* src_get_version */ int src_is_valid_ratio (double ratio) { if (ratio < (1.0 / SRC_MAX_RATIO) || ratio > (1.0 * SRC_MAX_RATIO)) return SRC_FALSE ; return SRC_TRUE ; } /* src_is_valid_ratio */ /*============================================================================== ** Error reporting functions. */ int src_error (SRC_STATE *state) { if (state) return ((SRC_PRIVATE*) state)->error ; return SRC_ERR_NO_ERROR ; } /* src_error */ const char* src_strerror (int error) { switch (error) { case SRC_ERR_NO_ERROR : return "No error" ; case SRC_ERR_MALLOC_FAILED : return "Malloc failed." ; case SRC_ERR_BAD_STATE : return "SRC_STATE pointer is NULL." ; case SRC_ERR_BAD_DATA : return "SRC_DATA pointer is NULL." ; case SRC_ERR_BAD_DATA_PTR : return "SRC_DATA->data_out is NULL." ; case SRC_ERR_NO_PRIVATE : return "Internal error. No private data." ; case SRC_ERR_BAD_SRC_RATIO : return "SRC ratio outside [-12, 12] range." ; case SRC_ERR_BAD_SINC_STATE : return "src_process() called without reset after end_of_input." ; case SRC_ERR_BAD_PROC_PTR : return "Internal error. No process pointer." ; case SRC_ERR_SHIFT_BITS : return "Internal error. SHIFT_BITS too large." ; case SRC_ERR_FILTER_LEN : return "Internal error. Filter length too large." ; case SRC_ERR_BAD_CONVERTER : return "Bad converter number." ; case SRC_ERR_BAD_CHANNEL_COUNT : return "Channel count must be >= 1." ; case SRC_ERR_SINC_BAD_BUFFER_LEN : return "Internal error. Bad buffer length. Please report this." ; case SRC_ERR_SIZE_INCOMPATIBILITY : return "Internal error. Input data / internal buffer size difference. Please report this." ; case SRC_ERR_BAD_PRIV_PTR : return "Internal error. Private pointer is NULL. Please report this." ; case SRC_ERR_DATA_OVERLAP : return "Input and output data arrays overlap." ; case SRC_ERR_MAX_ERROR : return "Placeholder. No error defined for this error number." ; default : break ; } return NULL ; } /* src_strerror */ /*============================================================================== ** Simple interface for performing a single conversion from input buffer to ** output buffer at a fixed conversion ratio. */ int src_simple (SRC_DATA *src_data, int converter, int channels) { SRC_STATE *src_state ; int error ; if ((src_state = src_new (converter, channels, &error)) == NULL) return error ; src_data->end_of_input = 1 ; /* Only one buffer worth of input. */ error = src_process (src_state, src_data) ; src_state = src_delete (src_state) ; return error ; } /* src_simple */ gmfsk-0.7pre1/src/samplerate/samplerate.h0000644000076400007640000000636110023615072014204 /* ** Copyright (C) 2002,2003 Erik de Castro Lopo ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ /* ** API documentation is available here: ** http://www.mega-nerd.com/SRC/api.html */ #ifndef SAMPLERATE_H #define SAMPLERATE_H #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct SRC_STATE_tag SRC_STATE ; typedef struct { float *data_in, *data_out ; long input_frames, output_frames ; long input_frames_used, output_frames_gen ; int end_of_input ; double src_ratio ; } SRC_DATA ; /* ** Simple interface for performing a single conversion from input buffer to ** output buffer at a fixed conversion ratio. */ int src_simple (SRC_DATA *data, int converter_type, int channels) ; /* ** Initialisation function : return an anonymous pointer to the internal state ** of the converter. Choose a converter from the enums below. */ SRC_STATE* src_new (int converter_type, int channels, int *error) ; /* ** Cleanup all internal allocations. ** Always returns NULL. */ SRC_STATE* src_delete (SRC_STATE *state) ; /* ** This library contains a number of different sample rate converters, ** numbered 0 through N. ** ** Return a string giving either a name or a more full description of each ** sample rate converter or NULL if no sample rate converter exists for ** the given value. The converters are sequentially numbered from 0 to N. */ const char *src_get_name (int converter_type) ; const char *src_get_description (int converter_type) ; const char *src_get_version (void) ; /* ** Processing function. ** Returns non zero on error. */ int src_process (SRC_STATE *state, SRC_DATA *data) ; /* ** Set a new SRC ratio. This allows step responses ** in the conversion ratio. ** Returns non zero on error. */ int src_set_ratio (SRC_STATE *state, double new_ratio) ; /* ** Reset the internal SRC state. ** Does not modify the quality settings. ** Does not free any memory allocations. ** Returns non zero on error. */ int src_reset (SRC_STATE *state) ; /* ** Return TRUE if ratio is a valid conversion ratio, FALSE ** otherwise. */ int src_is_valid_ratio (double ratio) ; /* ** Return an error number. */ int src_error (SRC_STATE *state) ; /* ** Convert the error number into a string. */ const char* src_strerror (int error) ; /* ** The following enums can be used to set the interpolator type ** using the function src_set_converter(). */ enum { SRC_SINC_BEST_QUALITY = 0, SRC_SINC_MEDIUM_QUALITY = 1, SRC_SINC_FASTEST = 2, SRC_ZERO_ORDER_HOLD = 3, SRC_LINEAR = 4 } ; #ifdef __cplusplus } /* extern "C" */ #endif /* __cplusplus */ #endif /* SAMPLERATE_H */ gmfsk-0.7pre1/src/samplerate/src_sinc.c0000644000076400007640000003313610031602150013635 /* ** Copyright (C) 2002,2003 Erik de Castro Lopo ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include "float_cast.h" #include "common.h" #define SINC_MAGIC_MARKER MAKE_MAGIC(' ','s','i','n','c',' ') #define ARRAY_LEN(x) ((int) (sizeof (x) / sizeof ((x) [0]))) /*======================================================================================== ** Macros for handling the index into the array for the filter. ** Double precision floating point is not accurate enough so use a 64 bit ** fixed point value instead. SHIFT_BITS (current value of 48) is the number ** of bits to the right of the decimal point. ** The rest of the macros are for retrieving the fractional and integer parts ** and for converting floats and ints to the fixed point format or from the ** fixed point type back to integers and floats. */ #define MAKE_INCREMENT_T(x) ((increment_t) (x)) #define SHIFT_BITS 16 #define FP_ONE ((double) (((increment_t) 1) << SHIFT_BITS)) #define DOUBLE_TO_FP(x) (lrint ((x) * FP_ONE)) #define INT_TO_FP(x) (((increment_t) (x)) << SHIFT_BITS) #define FP_FRACTION_PART(x) ((x) & ((((increment_t) 1) << SHIFT_BITS) - 1)) #define FP_INTEGER_PART(x) ((x) & (((increment_t) -1) << SHIFT_BITS)) #define FP_TO_INT(x) (((x) >> SHIFT_BITS)) #define FP_TO_DOUBLE(x) (FP_FRACTION_PART (x) / FP_ONE) /*======================================================================================== */ typedef gint32 increment_t ; typedef gfloat coeff_t ; enum { STATE_BUFFER_START = 101, STATE_DATA_CONTINUE = 102, STATE_BUFFER_END = 103, STATE_FINISHED } ; typedef struct { int sinc_magic_marker ; int channels ; long in_count, in_used ; long out_count, out_gen ; int coeff_half_len, index_inc ; int has_diffs ; double src_ratio, input_index ; int coeff_len ; coeff_t const *coeffs ; int b_current, b_end, b_real_end, b_len ; float *pdata ; float buffer [1] ; } SINC_FILTER ; static double calc_output (SINC_FILTER *filter, increment_t increment, increment_t start_filter_index, int ch) ; static void prepare_data (SINC_FILTER *filter, SRC_DATA *data, int half_filter_chan_len) ; static void sinc_reset (SRC_PRIVATE *psrc) ; static coeff_t const fastest_coeffs [] = { #include "fastest_coeffs.h" } ; /* fastest_coeffs */ /*---------------------------------------------------------------------------------------- */ const char* sinc_get_name (int src_enum) { switch (src_enum) { case SRC_SINC_BEST_QUALITY : return "Best Sinc Interpolator" ; case SRC_SINC_MEDIUM_QUALITY : return "Medium Sinc Interpolator" ; case SRC_SINC_FASTEST : return "Fastest Sinc Interpolator" ; } ; return NULL ; } /* sinc_get_descrition */ const char* sinc_get_description (int src_enum) { switch (src_enum) { case SRC_SINC_BEST_QUALITY : return "Band limitied sinc interpolation, best quality, 97dB SNR, 96% BW." ; case SRC_SINC_MEDIUM_QUALITY : return "Band limitied sinc interpolation, medium quality, 97dB SNR, 90% BW." ; case SRC_SINC_FASTEST : return "Band limitied sinc interpolation, fastest, 97dB SNR, 80% BW." ; } ; return NULL ; } /* sinc_get_descrition */ int sinc_set_converter (SRC_PRIVATE *psrc, int src_enum) { SINC_FILTER *filter, temp_filter ; int count ; /* Quick sanity check. */ if (SHIFT_BITS >= sizeof (increment_t) * 8 - 1) return SRC_ERR_SHIFT_BITS ; if (psrc->private_data != NULL) { filter = (SINC_FILTER*) psrc->private_data ; if (filter->sinc_magic_marker != SINC_MAGIC_MARKER) { g_free (psrc->private_data) ; psrc->private_data = NULL ; } ; } ; memset (&temp_filter, 0, sizeof (temp_filter)) ; temp_filter.sinc_magic_marker = SINC_MAGIC_MARKER ; temp_filter.channels = psrc->channels ; psrc->process = sinc_process ; psrc->reset = sinc_reset ; switch (src_enum) { case SRC_SINC_FASTEST : temp_filter.coeffs = fastest_coeffs ; temp_filter.coeff_half_len = (sizeof (fastest_coeffs) / sizeof (coeff_t)) - 1 ; temp_filter.index_inc = 128 ; temp_filter.has_diffs = SRC_FALSE ; temp_filter.coeff_len = sizeof (fastest_coeffs) / sizeof (coeff_t) ; break ; default : return SRC_ERR_BAD_CONVERTER ; } ; /* ** FIXME : This needs to be looked at more closely to see if there is ** a better way. Need to look at prepare_data () at the same time. */ temp_filter.b_len = 1000 + 2 * lrint (ceil (temp_filter.coeff_len / (temp_filter.index_inc * 1.0) * SRC_MAX_RATIO)) ; temp_filter.b_len *= temp_filter.channels ; if ((filter = g_malloc0 (sizeof (SINC_FILTER) + sizeof (filter->buffer [0]) * (temp_filter.b_len + temp_filter.channels))) == NULL) return SRC_ERR_MALLOC_FAILED ; *filter = temp_filter ; memset (&temp_filter, 0xEE, sizeof (temp_filter)) ; psrc->private_data = filter ; sinc_reset (psrc) ; count = (filter->coeff_half_len * INT_TO_FP (1)) / FP_ONE ; if (abs (count - filter->coeff_half_len) >= 1) return SRC_ERR_FILTER_LEN ; return SRC_ERR_NO_ERROR ; } /* sinc_set_converter */ static void sinc_reset (SRC_PRIVATE *psrc) { SINC_FILTER *filter ; filter = (SINC_FILTER*) psrc->private_data ; if (filter == NULL) return ; filter->b_current = filter->b_end = 0 ; filter->b_real_end = -1 ; filter->src_ratio = filter->input_index = 0.0 ; memset (filter->buffer, 0, filter->b_len * sizeof (filter->buffer [0])) ; /* Set this for a sanity check */ memset (filter->buffer + filter->b_len, 0xAA, filter->channels * sizeof (filter->buffer [0])) ; } /* sinc_reset */ /*======================================================================================== ** Beware all ye who dare pass this point. There be dragons here. */ int sinc_process (SRC_PRIVATE *psrc, SRC_DATA *data) { SINC_FILTER *filter ; double input_index, src_ratio, count, float_increment, terminate ; increment_t increment, start_filter_index ; int half_filter_chan_len, samples_in_hand, ch ; if (psrc->private_data == NULL) return SRC_ERR_NO_PRIVATE ; filter = (SINC_FILTER*) psrc->private_data ; /* If there is not a problem, this will be optimised out. */ if (sizeof (filter->buffer [0]) != sizeof (data->data_in [0])) return SRC_ERR_SIZE_INCOMPATIBILITY ; filter->in_count = data->input_frames * filter->channels ; filter->out_count = data->output_frames * filter->channels ; filter->in_used = filter->out_gen = 0 ; src_ratio = psrc->last_ratio ; /* Check the sample rate ratio wrt the buffer len. */ count = (filter->coeff_half_len + 2.0) / filter->index_inc ; if (MIN (psrc->last_ratio, data->src_ratio) < 1.0) count /= MIN (psrc->last_ratio, data->src_ratio) ; count = lrint (ceil (count)) ; /* Maximum coefficientson either side of center point. */ half_filter_chan_len = filter->channels * (lrint (count) + 1) ; input_index = psrc->last_position ; if (input_index >= 1.0) { filter->b_current = (filter->b_current + filter->channels * lrint (floor (input_index))) % filter->b_len ; input_index -= floor (input_index) ; } ; float_increment = filter->index_inc ; filter->b_current = (filter->b_current + filter->channels * lrint (floor (input_index))) % filter->b_len ; input_index -= floor (input_index) ; terminate = 1.0 / src_ratio + 1e-20 ; /* Main processing loop. */ while (filter->out_gen < filter->out_count) { /* Need to reload buffer? */ samples_in_hand = (filter->b_end - filter->b_current + filter->b_len) % filter->b_len ; if (samples_in_hand <= half_filter_chan_len) { prepare_data (filter, data, half_filter_chan_len) ; samples_in_hand = (filter->b_end - filter->b_current + filter->b_len) % filter->b_len ; if (samples_in_hand <= half_filter_chan_len) break ; } ; /* This is the termination condition. */ if (filter->b_real_end >= 0) { if (filter->b_current + input_index + terminate >= filter->b_real_end) break ; } ; if (fabs (psrc->last_ratio - data->src_ratio) > 1e-10) src_ratio = psrc->last_ratio + filter->out_gen * (data->src_ratio - psrc->last_ratio) / (filter->out_count - 1) ; float_increment = filter->index_inc * 1.0 ; if (src_ratio < 1.0) float_increment = filter->index_inc * src_ratio ; increment = DOUBLE_TO_FP (float_increment) ; start_filter_index = DOUBLE_TO_FP (input_index * float_increment) ; for (ch = 0 ; ch < filter->channels ; ch++) { data->data_out [filter->out_gen] = (float_increment / filter->index_inc) * calc_output (filter, increment, start_filter_index, ch) ; filter->out_gen ++ ; } ; /* Figure out the next index. */ input_index += 1.0 / src_ratio ; filter->b_current = (filter->b_current + filter->channels * lrint (floor (input_index))) % filter->b_len ; input_index -= floor (input_index) ; } ; psrc->last_position = input_index ; /* Save current ratio rather then target ratio. */ psrc->last_ratio = src_ratio ; data->input_frames_used = filter->in_used / filter->channels ; data->output_frames_gen = filter->out_gen / filter->channels ; return SRC_ERR_NO_ERROR ; } /* sinc_process */ /*---------------------------------------------------------------------------------------- */ static void prepare_data (SINC_FILTER *filter, SRC_DATA *data, int half_filter_chan_len) { int len = 0 ; if (filter->b_real_end >= 0) return ; /* This doesn't make sense, so return. */ if (filter->b_current == 0) { /* Initial state. Set up zeros at the start of the buffer and ** then load new data after that. */ len = filter->b_len - 2 * half_filter_chan_len ; filter->b_current = filter->b_end = half_filter_chan_len ; } else if (filter->b_end + half_filter_chan_len + filter->channels < filter->b_len) { /* Load data at current end position. */ len = MAX (filter->b_len - filter->b_current - half_filter_chan_len, 0) ; } else { /* Move data at end of buffer back to the start of the buffer. */ len = filter->b_end - filter->b_current ; memmove (filter->buffer, filter->buffer + filter->b_current - half_filter_chan_len, (half_filter_chan_len + len) * sizeof (filter->buffer [0])) ; filter->b_current = half_filter_chan_len ; filter->b_end = filter->b_current + len ; /* Now load data at current end of buffer. */ len = MAX (filter->b_len - filter->b_current - half_filter_chan_len, 0) ; } ; len = MIN (filter->in_count - filter->in_used, len) ; len -= (len % filter->channels) ; memcpy (filter->buffer + filter->b_end, data->data_in + filter->in_used, len * sizeof (filter->buffer [0])) ; filter->b_end += len ; filter->in_used += len ; if (filter->in_used == filter->in_count && filter->b_end - filter->b_current < 2 * half_filter_chan_len && data->end_of_input) { /* Handle the case where all data in the current buffer has been ** consumed and this is the last buffer. */ if (filter->b_len - filter->b_end < half_filter_chan_len + 5) { /* If necessary, move data down to the start of the buffer. */ len = filter->b_end - filter->b_current ; memmove (filter->buffer, filter->buffer + filter->b_current - half_filter_chan_len, (half_filter_chan_len + len) * sizeof (filter->buffer [0])) ; filter->b_current = half_filter_chan_len ; filter->b_end = filter->b_current + len ; } ; filter->b_real_end = filter->b_end ; len = half_filter_chan_len + 5 ; memset (filter->buffer + filter->b_end, 0, len * sizeof (filter->buffer [0])) ; filter->b_end += len ; } ; return ; } /* prepare_data */ static double calc_output (SINC_FILTER *filter, increment_t increment, increment_t start_filter_index, int ch) { double fraction, left, right, icoeff ; increment_t filter_index, max_filter_index ; int data_index, coeff_count, indx ; /* Convert input parameters into fixed point. */ max_filter_index = INT_TO_FP (filter->coeff_half_len) ; /* First apply the left half of the filter. */ filter_index = start_filter_index ; coeff_count = (max_filter_index - filter_index) / increment ; filter_index = filter_index + coeff_count * increment ; data_index = filter->b_current - filter->channels * coeff_count ; left = 0.0 ; do { fraction = FP_TO_DOUBLE (filter_index) ; indx = FP_TO_INT (filter_index) ; icoeff = filter->coeffs [indx] + fraction * (filter->coeffs [indx + 1] - filter->coeffs [indx]) ; left += icoeff * filter->buffer [data_index + ch] ; filter_index -= increment ; data_index = data_index + filter->channels ; } while (filter_index >= MAKE_INCREMENT_T (0)) ; /* Now apply the right half of the filter. */ filter_index = increment - start_filter_index ; coeff_count = (max_filter_index - filter_index) / increment ; filter_index = filter_index + coeff_count * increment ; data_index = filter->b_current + filter->channels * (1 + coeff_count) ; right = 0.0 ; do { fraction = FP_TO_DOUBLE (filter_index) ; indx = FP_TO_INT (filter_index) ; icoeff = filter->coeffs [indx] + fraction * (filter->coeffs [indx + 1] - filter->coeffs [indx]) ; right += icoeff * filter->buffer [data_index + ch] ; filter_index -= increment ; data_index = data_index - filter->channels ; } while (filter_index > MAKE_INCREMENT_T (0)) ; return (left + right) ; } /* calc_output */ gmfsk-0.7pre1/src/mfsk/0000777000076400007640000000000010206176676010576 5gmfsk-0.7pre1/src/mfsk/Makefile.am0000644000076400007640000000052307641362105012537 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libmfsk.a libmfsk_a_SOURCES = \ interleave.c interleave.h \ mfsk.c mfsk.h \ mfskrx.c \ mfsktx.c \ varicode.c varicode.h gmfsk-0.7pre1/src/mfsk/Makefile.in0000644000076400007640000003057610206155266012562 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libmfsk.a libmfsk_a_SOURCES = \ interleave.c interleave.h \ mfsk.c mfsk.h \ mfskrx.c \ mfsktx.c \ varicode.c varicode.h subdir = src/mfsk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libmfsk_a_AR = $(AR) cru libmfsk_a_LIBADD = am_libmfsk_a_OBJECTS = interleave.$(OBJEXT) mfsk.$(OBJEXT) \ mfskrx.$(OBJEXT) mfsktx.$(OBJEXT) varicode.$(OBJEXT) libmfsk_a_OBJECTS = $(am_libmfsk_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/interleave.Po ./$(DEPDIR)/mfsk.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/mfskrx.Po ./$(DEPDIR)/mfsktx.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/varicode.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libmfsk_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libmfsk_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/mfsk/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmfsk.a: $(libmfsk_a_OBJECTS) $(libmfsk_a_DEPENDENCIES) -rm -f libmfsk.a $(libmfsk_a_AR) libmfsk.a $(libmfsk_a_OBJECTS) $(libmfsk_a_LIBADD) $(RANLIB) libmfsk.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/interleave.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mfsk.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mfskrx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mfsktx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varicode.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/mfsk/interleave.c0000644000076400007640000000457610166567153013027 /* * interleave.c -- MFSK (de)interleaver * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "interleave.h" /* ---------------------------------------------------------------------- */ struct interleave *interleave_init(int size, int dir) { struct interleave *s; s = g_new0(struct interleave, 1); s->table = g_new0(unsigned char, 10 * size * size); s->size = size; s->direction = dir; return s; } void interleave_free(struct interleave *s) { if (s) { g_free(s->table); g_free(s); } } static inline unsigned char *tab(struct interleave *s, int i, int j, int k) { return &s->table[(s->size * s->size * i) + (s->size * j) + k]; } void interleave_syms(struct interleave *s, unsigned char *syms) { int i, j, k; for (k = 0; k < 10; k++) { for (i = 0; i < s->size; i++) for (j = 0; j < s->size - 1; j++) *tab(s, k, i, j) = *tab(s, k, i, j + 1); for (i = 0; i < s->size; i++) *tab(s, k, i, s->size - 1) = syms[i]; for (i = 0; i < s->size; i++) { if (s->direction == INTERLEAVE_FWD) syms[i] = *tab(s, k, i, s->size - i - 1); else syms[i] = *tab(s, k, i, i); } } } void interleave_bits(struct interleave *s, unsigned int *bits) { unsigned char *syms; int i; syms = g_alloca(s->size * sizeof(unsigned char)); for (i = 0; i < s->size; i++) syms[i] = (*bits >> (s->size - i - 1)) & 1; interleave_syms(s, syms); for (*bits = i = 0; i < s->size; i++) *bits = (*bits << 1) | syms[i]; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/mfsk/interleave.h0000644000076400007640000000272207725503072013020 /* * interleave.h -- MFSK (de)interleaver * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _INTERLEAVE_H #define _INTERLEAVE_H /* ---------------------------------------------------------------------- */ #define INTERLEAVE_FWD 0 #define INTERLEAVE_REV 1 struct interleave { int size; int direction; unsigned char *table; }; extern struct interleave *interleave_init(int size, int dir); extern void interleave_free(struct interleave *s); extern void interleave_syms(struct interleave *s, unsigned char *syms); extern void interleave_bits(struct interleave *s, unsigned int *bits); /* ---------------------------------------------------------------------- */ #endif gmfsk-0.7pre1/src/mfsk/mfsk.c0000644000076400007640000001030510166567130011607 /* * mfsk.c -- MFSK modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "mfsk.h" #include "trx.h" #include "fft.h" #include "sfft.h" #include "filter.h" #include "interleave.h" #include "viterbi.h" static void mfsk_txinit(struct trx *trx) { struct mfsk *m = (struct mfsk *) trx->modem; m->txstate = TX_STATE_PREAMBLE; m->bitstate = 0; m->counter = 0; } static void mfsk_rxinit(struct trx *trx) { struct mfsk *m = (struct mfsk *) trx->modem; m->rxstate = RX_STATE_DATA; m->synccounter = 0; m->symcounter = 0; m->met1 = 0.0; m->met2 = 0.0; m->counter = 0; } static void mfsk_free(struct mfsk *s) { if (s) { fft_free(s->fft); sfft_free(s->sfft); filter_free(s->hilbert); g_free(s->pipe); encoder_free(s->enc); viterbi_free(s->dec1); viterbi_free(s->dec2); filter_free(s->filt); g_free(s); } } static void mfsk_destructor(struct trx *trx) { struct mfsk *s = (struct mfsk *) trx->modem; mfsk_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } void mfsk_init(struct trx *trx) { struct mfsk *s; double bw, cf, flo, fhi; s = g_new0(struct mfsk, 1); switch (trx->mode) { case MODE_MFSK16: s->symlen = 512; s->symbits = 4; s->basetone = 64; /* 1000 Hz */ break; case MODE_MFSK8: s->symlen = 1024; s->symbits = 5; s->basetone = 128; /* 1000 Hz */ break; default: mfsk_free(s); return; } s->numtones = 1 << s->symbits; s->tonespacing = (double) SampleRate / s->symlen; if (!(s->fft = fft_init(s->symlen, FFT_FWD))) { g_warning("mfsk_init: init_fft failed\n"); mfsk_free(s); return; } if (!(s->sfft = sfft_init(s->symlen, s->basetone, s->basetone + s->numtones))) { g_warning("mfsk_init: init_sfft failed\n"); mfsk_free(s); return; } if (!(s->hilbert = filter_init_hilbert(37, 1))) { g_warning("mfsk_init: init_hilbert failed\n"); mfsk_free(s); return; } s->pipe = g_new0(struct rxpipe, 2 * s->symlen); if (!(s->enc = encoder_init(K, POLY1, POLY2))) { g_warning("mfsk_init: encoder_init failed\n"); mfsk_free(s); return; } if (!(s->dec1 = viterbi_init(K, POLY1, POLY2))) { g_warning("mfsk_init: viterbi_init failed\n"); mfsk_free(s); return; } if (!(s->dec2 = viterbi_init(K, POLY1, POLY2))) { g_warning("mfsk_init: viterbi_init failed\n"); mfsk_free(s); return; } viterbi_set_traceback(s->dec1, 45); viterbi_set_traceback(s->dec2, 45); viterbi_set_chunksize(s->dec1, 1); viterbi_set_chunksize(s->dec2, 1); if (!(s->txinlv = interleave_init(s->symbits, INTERLEAVE_FWD))) { g_warning("mfsk_init: interleave_init failed\n"); mfsk_free(s); return; } if (!(s->rxinlv = interleave_init(s->symbits, INTERLEAVE_REV))) { g_warning("mfsk_init: interleave_init failed\n"); mfsk_free(s); return; } bw = (s->numtones - 1) * s->tonespacing; cf = 1000.0 + bw / 2.0; flo = (cf - bw) / SampleRate; fhi = (cf + bw) / SampleRate; if ((s->filt = filter_init_bandpass(127, 1, flo, fhi)) == NULL) { g_warning("mfsk_init: filter_init failed\n"); mfsk_free(s); return; } trx->modem = s; trx->txinit = mfsk_txinit; trx->rxinit = mfsk_rxinit; trx->txprocess = mfsk_txprocess; trx->rxprocess = mfsk_rxprocess; trx->destructor = mfsk_destructor; trx->samplerate = SampleRate; trx->fragmentsize = s->symlen; trx->bandwidth = (s->numtones - 1) * s->tonespacing; } gmfsk-0.7pre1/src/mfsk/mfsk.h0000644000076400007640000000513710037742125011617 /* * mfsk.h -- MFSK modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _MFSK_H #define _MFSK_H #include "cmplx.h" #include "trx.h" #include "viterbi.h" #include "interleave.h" #include "fftfilt.h" #include "delay.h" #include "picture.h" #define SampleRate (8000) #define SAMPLES_PER_PIXEL (SampleRate / 1000) /* 1 ms per pixel */ #define K 7 #define POLY1 0x6d #define POLY2 0x4f struct rxpipe { complex vector[32]; /* numtones <= 32 */ int symbol; }; struct mfsk { /* * Common stuff */ double phaseacc; int symlen; int symbits; int numtones; int basetone; double tonespacing; int counter; /* * RX related stuff */ int rxstate; struct filter *hilbert; struct sfft *sfft; struct filter *filt; struct viterbi *dec1; struct viterbi *dec2; struct interleave *rxinlv; struct rxpipe *pipe; unsigned int pipeptr; unsigned int datashreg; complex currvector; complex prev1vector; complex prev2vector; int currsymbol; int prev1symbol; int prev2symbol; float met1; float met2; int synccounter; unsigned char symbolpair[2]; int symcounter; int picturesize; char picheader[16]; complex prevz; double picf; int symbolbit; /* * TX related stuff */ int txstate; struct fft *fft; struct encoder *enc; struct interleave *txinlv; unsigned int bitshreg; int bitstate; Picbuf *picbuf; }; enum { TX_STATE_PREAMBLE, TX_STATE_START, TX_STATE_DATA, TX_STATE_END, TX_STATE_FLUSH, TX_STATE_FINISH, TX_STATE_TUNE, TX_STATE_PICTURE_START, TX_STATE_PICTURE }; enum { RX_STATE_DATA, RX_STATE_PICTURE_START_1, RX_STATE_PICTURE_START_2, RX_STATE_PICTURE }; /* in mfsk.c */ extern void mfsk_init(struct trx *trx); /* in mfskrx.c */ extern int mfsk_rxprocess(struct trx *trx, float *buf, int len); /* in mfsktx.c */ extern int mfsk_txprocess(struct trx *trx); #endif gmfsk-0.7pre1/src/mfsk/mfskrx.c0000644000076400007640000002035010037742214012155 /* * mfskrx.c -- MFSK demodulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif /* AIX requires this to be the first thing in the file. */ #ifndef __GNUC__ # if HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ char *alloca (); # endif # endif # endif #endif #include #include #include #include "mfsk.h" #include "filter.h" #include "sfft.h" #include "varicode.h" #include "misc.h" #include "picture.h" static void recvpic(struct trx *trx, complex z) { struct mfsk *m = (struct mfsk *) trx->modem; m->picf += carg(ccor(m->prevz, z)) * SampleRate / (2.0 * M_PI); m->prevz = z; if ((m->counter % SAMPLES_PER_PIXEL) == 0) { m->picf = 256 * (m->picf / SAMPLES_PER_PIXEL - 1000) / trx->bandwidth; trx_put_rx_picdata(CLAMP(m->picf, 0.0, 255.0)); m->picf = 0.0; } } static void recvchar(struct mfsk *m, int c) { gint h, w; gboolean color; if (c == -1) return; memmove(m->picheader, m->picheader + 1, sizeof(m->picheader) - 1); m->picheader[sizeof(m->picheader) - 2] = (c == 0) ? ' ' : c; m->picheader[sizeof(m->picheader) - 1] = 0; if (picture_check_header(m->picheader, &w, &h, &color)) { if (m->symbolbit == 4) m->rxstate = RX_STATE_PICTURE_START_1; else m->rxstate = RX_STATE_PICTURE_START_2; m->picturesize = SAMPLES_PER_PIXEL * w * h * (color ? 3 : 1); m->counter = 0; if (color) trx_put_rx_picdata(('C' << 24) | (w << 12) | h); else trx_put_rx_picdata(('M' << 24) | (w << 12) | h); memset(m->picheader, ' ', sizeof(m->picheader)); } trx_put_rx_char(c); } static void recvbit(struct mfsk *m, int bit) { int c; m->datashreg = (m->datashreg << 1) | !!bit; /* search for "001" */ if ((m->datashreg & 7) == 1) { /* the "1" belongs to the next symbol */ c = varidec(m->datashreg >> 1); recvchar(m, c); /* we already received this */ m->datashreg = 1; } } static void decodesymbol(struct trx *trx, unsigned char symbol) { struct mfsk *m = (struct mfsk *) trx->modem; int c, met; m->symbolpair[0] = m->symbolpair[1]; m->symbolpair[1] = symbol; m->symcounter = m->symcounter ? 0 : 1; /* MFSK16 doesn't need a vote */ if (trx->mode == MODE_MFSK16 && m->symcounter) return; if (m->symcounter) { if ((c = viterbi_decode(m->dec1, m->symbolpair, &met)) == -1) return; m->met1 = decayavg(m->met1, met, 32.0); if (m->met1 < m->met2) return; trx->metric = m->met1 / 2.5; } else { if ((c = viterbi_decode(m->dec2, m->symbolpair, &met)) == -1) return; m->met2 = decayavg(m->met2, met, 32.0); if (m->met2 < m->met1) return; trx->metric = m->met2 / 2.5; } if (trx->squelchon && trx->metric < trx->mfsk_squelch) return; recvbit(m, c); // fprintf(stderr, "met1=%-5.1f met2=%-5.1f %d\n", // m->met1, m->met2, m->met1 > m->met2 ? 1 : 2); } static void softdecode(struct trx *trx, complex *bins) { struct mfsk *m = (struct mfsk *) trx->modem; float tone, sum, *b; unsigned char *symbols; int i, j, k; b = alloca(m->symbits * sizeof(float)); symbols = alloca(m->symbits * sizeof(unsigned char)); for (i = 0; i < m->symbits; i++) b[i] = 0.0; /* avoid divide by zero later */ sum = 1e-10; /* gray decode and form soft decision samples */ for (i = 0; i < m->numtones; i++) { j = graydecode(i); if (trx->reverse) k = (m->numtones - 1) - i; else k = i; tone = cmod(bins[k + m->basetone]); for (k = 0; k < m->symbits; k++) b[k] += (j & (1 << (m->symbits - k - 1))) ? tone : -tone; sum += tone; } /* shift to range 0...255 */ for (i = 0; i < m->symbits; i++) symbols[i] = clamp(128.0 + (b[i] / sum * 128.0), 0, 255); interleave_syms(m->rxinlv, symbols); for (i = 0; i < m->symbits; i++) { /* * The picture decoder needs to know exactly when the * header is detected. */ m->symbolbit = i + 1; decodesymbol(trx, symbols[i]); } } static complex mixer(struct trx *trx, complex in) { struct mfsk *m = (struct mfsk *) trx->modem; complex z; float f; f = trx->frequency - trx->bandwidth / 2; /* Basetone is always 1000 Hz */ f -= 1000.0; c_re(z) = cos(m->phaseacc); c_im(z) = sin(m->phaseacc); z = cmul(z, in); m->phaseacc -= 2.0 * M_PI * f / SampleRate; if (m->phaseacc > M_PI) m->phaseacc -= 2.0 * M_PI; else if (m->phaseacc < M_PI) m->phaseacc += 2.0 * M_PI; return z; } static int harddecode(struct trx *trx, complex *in) { struct mfsk *m = (struct mfsk *) trx->modem; double x, max = 0.0; int i, symbol = 0; in += m->basetone; for (i = 0; i < m->numtones; i++) { if ((x = cmod(in[i])) > max) { max = x; symbol = i; } } return symbol; } static void update_syncscope(struct mfsk *m) { float *data; int i, j; data = alloca(2 * m->symlen * sizeof(float)); for (i = 0; i < 2 * m->symlen; i++) { j = (i + m->pipeptr) % (2 * m->symlen); data[i] = cmod(m->pipe[j].vector[m->prev1symbol]); } trx_set_scope(data, 2 * m->symlen, TRUE); } static void synchronize(struct mfsk *m) { int i, j, syn = -1; float val, max = 0.0; if (m->currsymbol == m->prev1symbol) return; if (m->prev1symbol == m->prev2symbol) return; j = m->pipeptr; for (i = 0; i < 2 * m->symlen; i++) { val = cmod(m->pipe[j].vector[m->prev1symbol]); if (val > max) { max = val; syn = i; } j = (j + 1) % (2 * m->symlen); } m->synccounter += (int) floor((syn - m->symlen) / 16.0 + 0.5); } static void afc(struct trx *trx) { struct mfsk *m = (struct mfsk *) trx->modem; complex z; float x; if (trx->afcon == FALSE || trx->metric < trx->mfsk_squelch) return; if (m->currsymbol != m->prev1symbol) return; z = ccor(m->prev1vector, m->currvector); x = carg(z) / m->symlen / (2.0 * M_PI / SampleRate); if (x > -m->tonespacing / 2.0 && x < m->tonespacing / 2.0) trx_set_freq(trx->frequency + (x / 8.0)); } int mfsk_rxprocess(struct trx *trx, float *buf, int len) { struct mfsk *m = (struct mfsk *) trx->modem; complex z, *bins; int i; while (len-- > 0) { /* create analytic signal... */ c_re(z) = c_im(z) = *buf++; filter_run(m->hilbert, z, &z); /* ...so it can be shifted in frequency */ z = mixer(trx, z); filter_run(m->filt, z, &z); if (m->rxstate == RX_STATE_PICTURE_START_2) { if (m->counter++ == 352) { m->counter = 0; m->rxstate = RX_STATE_PICTURE; } continue; } if (m->rxstate == RX_STATE_PICTURE_START_1) { if (m->counter++ == 352 + m->symlen) { m->counter = 0; m->rxstate = RX_STATE_PICTURE; } continue; } if (m->rxstate == RX_STATE_PICTURE) { if (m->counter++ == m->picturesize) { m->counter = 0; m->rxstate = RX_STATE_DATA; } else recvpic(trx, z); continue; } /* feed it to the sliding FFT */ bins = sfft_run(m->sfft, z); /* copy current vector to the pipe */ for (i = 0; i < m->numtones; i++) m->pipe[m->pipeptr].vector[i] = bins[i + m->basetone]; if (--m->synccounter <= 0) { m->synccounter = m->symlen; m->currsymbol = harddecode(trx, bins); m->currvector = bins[m->currsymbol + m->basetone]; /* decode symbol */ softdecode(trx, bins); /* update the scope */ update_syncscope(m); /* symbol sync */ synchronize(m); /* frequency tracking */ afc(trx); m->prev2symbol = m->prev1symbol; m->prev2vector = m->prev1vector; m->prev1symbol = m->currsymbol; m->prev1vector = m->currvector; } m->pipeptr = (m->pipeptr + 1) % (2 * m->symlen); } return 0; } gmfsk-0.7pre1/src/mfsk/mfsktx.c0000644000076400007640000001367710037744063012201 /* * mfsktx.c -- MFSK modulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include "mfsk.h" #include "trx.h" #include "fft.h" #include "viterbi.h" #include "varicode.h" #include "interleave.h" #include "misc.h" #include "snd.h" #include "picture.h" #include "filter.h" #include "main.h" static inline complex mixer(struct trx *trx, complex in) { struct mfsk *m = (struct mfsk *) trx->modem; complex z; float f; f = trx->frequency - trx->bandwidth / 2 + trx->txoffset; /* Basetone is always at 1000 Hz */ f -= 1000.0; c_re(z) = cos(m->phaseacc); c_im(z) = sin(m->phaseacc); z = cmul(z, in); m->phaseacc -= 2.0 * M_PI * f / SampleRate; if (m->phaseacc > M_PI) m->phaseacc -= 2.0 * M_PI; else if (m->phaseacc < M_PI) m->phaseacc += 2.0 * M_PI; return z; } static void sendsymbol(struct trx *trx, int sym) { struct mfsk *m = (struct mfsk *) trx->modem; complex z; int i; sym = grayencode(sym & (m->numtones - 1)); if (trx->reverse) sym = (m->numtones - 1) - sym; fft_clear_inbuf(m->fft); c_re(m->fft->in[sym + m->basetone]) = 1.0; fft_run(m->fft); for (i = 0; i < m->symlen; i++) { z = mixer(trx, m->fft->out[i]); trx->outbuf[i] = c_re(z); } sound_write(trx->outbuf, m->symlen); } static void sendbit(struct trx *trx, int bit) { struct mfsk *m = (struct mfsk *) trx->modem; int i, data; data = encoder_encode(m->enc, bit); for (i = 0; i < 2; i++) { m->bitshreg = (m->bitshreg << 1) | ((data >> i) & 1); m->bitstate++; if (m->bitstate == m->symbits) { interleave_bits(m->txinlv, &m->bitshreg); sendsymbol(trx, m->bitshreg); m->bitstate = 0; m->bitshreg = 0; } } } static void sendchar(struct trx *trx, unsigned char c) { char *code = varienc(c); while (*code) sendbit(trx, (*code++ - '0')); trx_put_echo_char(c); } static void sendidle(struct trx *trx) { int i; sendchar(trx, 0); /* */ sendbit(trx, 1); /* extended zero bit stream */ for (i = 0; i < 32; i++) sendbit(trx, 0); } static void flushtx(struct trx *trx) { struct mfsk *m = (struct mfsk *) trx->modem; int i; /* flush the varicode decoder at the other end */ sendbit(trx, 1); /* flush the convolutional encoder and interleaver */ for (i = 0; i < 107; i++) sendbit(trx, 0); m->bitstate = 0; } static int startpic(struct trx *trx) { struct mfsk *m = (struct mfsk *) trx->modem; char *header, *p; if ((m->picbuf = trx_get_tx_picture()) == NULL) return 0; header = picbuf_make_header(m->picbuf); for (p = header; *p != 0; p++) sendchar(trx, *p); g_free(header); flushtx(trx); return 1; } static void sendpic(struct trx *trx, guchar *data, gint len) { struct mfsk *m = (struct mfsk *) trx->modem; float *ptr; float freq, f; int i, j; if (SAMPLES_PER_PIXEL * len > OUTBUFSIZE) { g_warning("sendpic: buffer overrun\n"); return; } ptr = trx->outbuf; freq = trx->frequency + trx->txoffset; for (i = 0; i < len; i++) { f = freq + trx->bandwidth * (data[i] - 128) / 256.0; for (j = 0; j < SAMPLES_PER_PIXEL; j++) { *ptr++ = cos(m->phaseacc); m->phaseacc += 2.0 * M_PI * f / SampleRate; if (m->phaseacc > M_PI) m->phaseacc -= 2.0 * M_PI; } } sound_write(trx->outbuf, SAMPLES_PER_PIXEL * len); } int mfsk_txprocess(struct trx *trx) { struct mfsk *m = (struct mfsk *) trx->modem; unsigned char buf[64], *str; int i; if (trx->tune) { m->txstate = TX_STATE_TUNE; trx->tune = 0; } switch (m->txstate) { case TX_STATE_TUNE: sendsymbol(trx, 0); m->txstate = TX_STATE_FINISH; break; case TX_STATE_PREAMBLE: for (i = 0; i < 32; i++) sendbit(trx, 0); m->txstate = TX_STATE_START; break; case TX_STATE_START: sendchar(trx, '\r'); sendchar(trx, 2); /* STX */ sendchar(trx, '\r'); m->txstate = TX_STATE_DATA; break; case TX_STATE_DATA: i = trx_get_tx_char(); if (i == 0xFFFC) { statusbar_set_main("Send picture: start"); m->counter = 0; if (startpic(trx)) m->txstate = TX_STATE_PICTURE_START; break; } if (i == -1) sendidle(trx); else sendchar(trx, i); if (trx->stopflag) m->txstate = TX_STATE_END; break; case TX_STATE_END: i = trx_get_tx_char(); if (i == 0xFFFC) { if (startpic(trx)) m->txstate = TX_STATE_PICTURE; break; } if (i == -1) { sendchar(trx, '\r'); sendchar(trx, 4); /* EOT */ sendchar(trx, '\r'); m->txstate = TX_STATE_FLUSH; } else sendchar(trx, i); break; case TX_STATE_FLUSH: flushtx(trx); return -1; case TX_STATE_FINISH: return -1; case TX_STATE_PICTURE_START: memset(buf, 0, sizeof(buf)); sendpic(trx, buf, 44); m->txstate = TX_STATE_PICTURE; break; case TX_STATE_PICTURE: i = sizeof(buf); if (picbuf_get_data(m->picbuf, buf, &i) == FALSE) { picbuf_free(m->picbuf); m->picbuf = NULL; m->txstate = TX_STATE_DATA; sendpic(trx, buf, i); statusbar_set_main("Send picture: done"); m->counter = 0; break; } sendpic(trx, buf, i); if (++m->counter == 8) { gdouble x = picbuf_get_percentage(m->picbuf); str = g_strdup_printf("Send picture: %.0f%%", x); statusbar_set_main(str); g_free(str); m->counter = 0; } break; } return 0; } gmfsk-0.7pre1/src/mfsk/varicode.c0000644000076400007640000002532207725503072012452 /* * varicode.c -- MFSK Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "varicode.h" /* * The IZ8BLY MFSK Varicode as defined in * http://www.qsl.net/zl1bpu/MFSK/Varicode.html */ static unsigned char *varicode[] = { "11101011100", /* 000 - */ "11101100000", /* 001 - */ "11101101000", /* 002 - */ "11101101100", /* 003 - */ "11101110000", /* 004 - */ "11101110100", /* 005 - */ "11101111000", /* 006 - */ "11101111100", /* 007 - */ "10101000", /* 008 - */ "11110000000", /* 009 - */ "11110100000", /* 010 - */ "11110101000", /* 011 - */ "11110101100", /* 012 - */ "10101100", /* 013 - */ "11110110000", /* 014 - */ "11110110100", /* 015 - */ "11110111000", /* 016 - */ "11110111100", /* 017 - */ "11111000000", /* 018 - */ "11111010000", /* 019 - */ "11111010100", /* 020 - */ "11111011000", /* 021 - */ "11111011100", /* 022 - */ "11111100000", /* 023 - */ "11111101000", /* 024 - */ "11111101100", /* 025 - */ "11111110000", /* 026 - */ "11111110100", /* 027 - */ "11111111000", /* 028 - */ "11111111100", /* 029 - */ "100000000000", /* 030 - */ "101000000000", /* 031 - */ "100", /* 032 - */ "111000000", /* 033 - ! */ "111111100", /* 034 - '"' */ "1011011000", /* 035 - # */ "1010101000", /* 036 - $ */ "1010100000", /* 037 - % */ "1000000000", /* 038 - & */ "110111100", /* 039 - ' */ "111110100", /* 040 - ( */ "111110000", /* 041 - ) */ "1010110100", /* 042 - * */ "111100000", /* 043 - + */ "10100000", /* 044 - , */ "111011000", /* 045 - - */ "111010100", /* 046 - . */ "111101000", /* 047 - / */ "11100000", /* 048 - 0 */ "11110000", /* 049 - 1 */ "101000000", /* 050 - 2 */ "101010100", /* 051 - 3 */ "101110100", /* 052 - 4 */ "101100000", /* 053 - 5 */ "101101100", /* 054 - 6 */ "110100000", /* 055 - 7 */ "110000000", /* 056 - 8 */ "110101100", /* 057 - 9 */ "111101100", /* 058 - : */ "111111000", /* 059 - ; */ "1011000000", /* 060 - < */ "111011100", /* 061 - = */ "1010111100", /* 062 - > */ "111010000", /* 063 - ? */ "1010000000", /* 064 - @ */ "10111100", /* 065 - A */ "100000000", /* 066 - B */ "11010100", /* 067 - C */ "11011100", /* 068 - D */ "10111000", /* 069 - E */ "11111000", /* 070 - F */ "101010000", /* 071 - G */ "101011000", /* 072 - H */ "11000000", /* 073 - I */ "110110100", /* 074 - J */ "101111100", /* 075 - K */ "11110100", /* 076 - L */ "11101000", /* 077 - M */ "11111100", /* 078 - N */ "11010000", /* 079 - O */ "11101100", /* 080 - P */ "110110000", /* 081 - Q */ "11011000", /* 082 - R */ "10110100", /* 083 - S */ "10110000", /* 084 - T */ "101011100", /* 085 - U */ "110101000", /* 086 - V */ "101101000", /* 087 - W */ "101110000", /* 088 - X */ "101111000", /* 089 - Y */ "110111000", /* 090 - Z */ "1011101000", /* 091 - [ */ "1011010000", /* 092 - \ */ "1011101100", /* 093 - ] */ "1011010100", /* 094 - ^ */ "1010110000", /* 095 - _ */ "1010101100", /* 096 - ` */ "10100", /* 097 - a */ "1100000", /* 098 - b */ "111000", /* 099 - c */ "110100", /* 100 - d */ "1000", /* 101 - e */ "1010000", /* 102 - f */ "1011000", /* 103 - g */ "110000", /* 104 - h */ "11000", /* 105 - i */ "10000000", /* 106 - j */ "1110000", /* 107 - k */ "101100", /* 108 - l */ "1000000", /* 109 - m */ "11100", /* 110 - n */ "10000", /* 111 - o */ "1010100", /* 112 - p */ "1111000", /* 113 - q */ "100000", /* 114 - r */ "101000", /* 115 - s */ "1100", /* 116 - t */ "111100", /* 117 - u */ "1101100", /* 118 - v */ "1101000", /* 119 - w */ "1110100", /* 120 - x */ "1011100", /* 121 - y */ "1111100", /* 122 - z */ "1011011100", /* 123 - { */ "1010111000", /* 124 - | */ "1011100000", /* 125 - } */ "1011110000", /* 126 - ~ */ "101010000000", /* 127 - */ "101010100000", /* 128 - */ "101010101000", /* 129 - */ "101010101100", /* 130 - */ "101010110000", /* 131 - */ "101010110100", /* 132 - */ "101010111000", /* 133 - */ "101010111100", /* 134 - */ "101011000000", /* 135 - */ "101011010000", /* 136 - */ "101011010100", /* 137 - */ "101011011000", /* 138 - */ "101011011100", /* 139 - */ "101011100000", /* 140 - */ "101011101000", /* 141 - */ "101011101100", /* 142 - */ "101011110000", /* 143 - */ "101011110100", /* 144 - */ "101011111000", /* 145 - */ "101011111100", /* 146 - */ "101100000000", /* 147 - */ "101101000000", /* 148 - */ "101101010000", /* 149 - */ "101101010100", /* 150 - */ "101101011000", /* 151 - */ "101101011100", /* 152 - */ "101101100000", /* 153 - */ "101101101000", /* 154 - */ "101101101100", /* 155 - */ "101101110000", /* 156 - */ "101101110100", /* 157 - */ "101101111000", /* 158 - */ "101101111100", /* 159 - */ "1011110100", /* 160 - */ "1011111000", /* 161 - */ "1011111100", /* 162 - */ "1100000000", /* 163 - */ "1101000000", /* 164 - */ "1101010000", /* 165 - */ "1101010100", /* 166 - */ "1101011000", /* 167 - */ "1101011100", /* 168 - */ "1101100000", /* 169 - */ "1101101000", /* 170 - */ "1101101100", /* 171 - */ "1101110000", /* 172 - */ "1101110100", /* 173 - */ "1101111000", /* 174 - */ "1101111100", /* 175 - */ "1110000000", /* 176 - */ "1110100000", /* 177 - */ "1110101000", /* 178 - */ "1110101100", /* 179 - */ "1110110000", /* 180 - */ "1110110100", /* 181 - */ "1110111000", /* 182 - */ "1110111100", /* 183 - */ "1111000000", /* 184 - */ "1111010000", /* 185 - */ "1111010100", /* 186 - */ "1111011000", /* 187 - */ "1111011100", /* 188 - */ "1111100000", /* 189 - */ "1111101000", /* 190 - */ "1111101100", /* 191 - */ "1111110000", /* 192 - */ "1111110100", /* 193 - */ "1111111000", /* 194 - */ "1111111100", /* 195 - */ "10000000000", /* 196 - */ "10100000000", /* 197 - */ "10101000000", /* 198 - */ "10101010000", /* 199 - */ "10101010100", /* 200 - */ "10101011000", /* 201 - */ "10101011100", /* 202 - */ "10101100000", /* 203 - */ "10101101000", /* 204 - */ "10101101100", /* 205 - */ "10101110000", /* 206 - */ "10101110100", /* 207 - */ "10101111000", /* 208 - */ "10101111100", /* 209 - */ "10110000000", /* 210 - */ "10110100000", /* 211 - */ "10110101000", /* 212 - */ "10110101100", /* 213 - */ "10110110000", /* 214 - */ "10110110100", /* 215 - */ "10110111000", /* 216 - */ "10110111100", /* 217 - */ "10111000000", /* 218 - */ "10111010000", /* 219 - */ "10111010100", /* 220 - */ "10111011000", /* 221 - */ "10111011100", /* 222 - */ "10111100000", /* 223 - */ "10111101000", /* 224 - */ "10111101100", /* 225 - */ "10111110000", /* 226 - */ "10111110100", /* 227 - */ "10111111000", /* 228 - */ "10111111100", /* 229 - */ "11000000000", /* 230 - */ "11010000000", /* 231 - */ "11010100000", /* 232 - */ "11010101000", /* 233 - */ "11010101100", /* 234 - */ "11010110000", /* 235 - */ "11010110100", /* 236 - */ "11010111000", /* 237 - */ "11010111100", /* 238 - */ "11011000000", /* 239 - */ "11011010000", /* 240 - */ "11011010100", /* 241 - */ "11011011000", /* 242 - */ "11011011100", /* 243 - */ "11011100000", /* 244 - */ "11011101000", /* 245 - */ "11011101100", /* 246 - */ "11011110000", /* 247 - */ "11011110100", /* 248 - */ "11011111000", /* 249 - */ "11011111100", /* 250 - */ "11100000000", /* 251 - */ "11101000000", /* 252 - n */ "11101010000", /* 253 - */ "11101010100", /* 254 - */ "11101011000" /* 255 - */ }; /* * The same in a format more suitable for decoding. */ static unsigned int varidecode[] = { 0x75C, 0x760, 0x768, 0x76C, 0x770, 0x774, 0x778, 0x77C, 0x0A8, 0x780, 0x7A0, 0x7A8, 0x7AC, 0x0AC, 0x7B0, 0x7B4, 0x7B8, 0x7BC, 0x7C0, 0x7D0, 0x7D4, 0x7D8, 0x7DC, 0x7E0, 0x7E8, 0x7EC, 0x7F0, 0x7F4, 0x7F8, 0x7FC, 0x800, 0xA00, 0x004, 0x1C0, 0x1FC, 0x2D8, 0x2A8, 0x2A0, 0x200, 0x1BC, 0x1F4, 0x1F0, 0x2B4, 0x1E0, 0x0A0, 0x1D8, 0x1D4, 0x1E8, 0x0E0, 0x0F0, 0x140, 0x154, 0x174, 0x160, 0x16C, 0x1A0, 0x180, 0x1AC, 0x1EC, 0x1F8, 0x2C0, 0x1DC, 0x2BC, 0x1D0, 0x280, 0x0BC, 0x100, 0x0D4, 0x0DC, 0x0B8, 0x0F8, 0x150, 0x158, 0x0C0, 0x1B4, 0x17C, 0x0F4, 0x0E8, 0x0FC, 0x0D0, 0x0EC, 0x1B0, 0x0D8, 0x0B4, 0x0B0, 0x15C, 0x1A8, 0x168, 0x170, 0x178, 0x1B8, 0x2E8, 0x2D0, 0x2EC, 0x2D4, 0x2B0, 0x2AC, 0x014, 0x060, 0x038, 0x034, 0x008, 0x050, 0x058, 0x030, 0x018, 0x080, 0x070, 0x02C, 0x040, 0x01C, 0x010, 0x054, 0x078, 0x020, 0x028, 0x00C, 0x03C, 0x06C, 0x068, 0x074, 0x05C, 0x07C, 0x2DC, 0x2B8, 0x2E0, 0x2F0, 0xA80, 0xAA0, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xAE8, 0xAEC, 0xAF0, 0xAF4, 0xAF8, 0xAFC, 0xB00, 0xB40, 0xB50, 0xB54, 0xB58, 0xB5C, 0xB60, 0xB68, 0xB6C, 0xB70, 0xB74, 0xB78, 0xB7C, 0x2F4, 0x2F8, 0x2FC, 0x300, 0x340, 0x350, 0x354, 0x358, 0x35C, 0x360, 0x368, 0x36C, 0x370, 0x374, 0x378, 0x37C, 0x380, 0x3A0, 0x3A8, 0x3AC, 0x3B0, 0x3B4, 0x3B8, 0x3BC, 0x3C0, 0x3D0, 0x3D4, 0x3D8, 0x3DC, 0x3E0, 0x3E8, 0x3EC, 0x3F0, 0x3F4, 0x3F8, 0x3FC, 0x400, 0x500, 0x540, 0x550, 0x554, 0x558, 0x55C, 0x560, 0x568, 0x56C, 0x570, 0x574, 0x578, 0x57C, 0x580, 0x5A0, 0x5A8, 0x5AC, 0x5B0, 0x5B4, 0x5B8, 0x5BC, 0x5C0, 0x5D0, 0x5D4, 0x5D8, 0x5DC, 0x5E0, 0x5E8, 0x5EC, 0x5F0, 0x5F4, 0x5F8, 0x5FC, 0x600, 0x680, 0x6A0, 0x6A8, 0x6AC, 0x6B0, 0x6B4, 0x6B8, 0x6BC, 0x6C0, 0x6D0, 0x6D4, 0x6D8, 0x6DC, 0x6E0, 0x6E8, 0x6EC, 0x6F0, 0x6F4, 0x6F8, 0x6FC, 0x700, 0x740, 0x750, 0x754, 0x758 }; unsigned char *varienc(unsigned char c) { return varicode[c]; } int varidec(unsigned int symbol) { int i; for (i = 0; i < 256; i++) if (symbol == varidecode[i]) return i; return -1; } gmfsk-0.7pre1/src/mfsk/varicode.h0000644000076400007640000000200507725503072012450 /* * varicode.h -- MFSK Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _VARICODE_H #define _VARICODE_H extern unsigned char *varienc(unsigned char c); extern int varidec(unsigned int symbol); #endif gmfsk-0.7pre1/src/rtty/0000777000076400007640000000000010206176676010640 5gmfsk-0.7pre1/src/rtty/Makefile.am0000644000076400007640000000051207641121167012600 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = librtty.a librtty_a_SOURCES = \ baudot.c baudot.h \ rttypar.c rttypar.h \ rtty.c rtty.h \ rttyrx.c \ rttytx.c gmfsk-0.7pre1/src/rtty/Makefile.in0000644000076400007640000003054510206155267012621 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = librtty.a librtty_a_SOURCES = \ baudot.c baudot.h \ rttypar.c rttypar.h \ rtty.c rtty.h \ rttyrx.c \ rttytx.c subdir = src/rtty ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) librtty_a_AR = $(AR) cru librtty_a_LIBADD = am_librtty_a_OBJECTS = baudot.$(OBJEXT) rttypar.$(OBJEXT) rtty.$(OBJEXT) \ rttyrx.$(OBJEXT) rttytx.$(OBJEXT) librtty_a_OBJECTS = $(am_librtty_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/baudot.Po ./$(DEPDIR)/rtty.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/rttypar.Po ./$(DEPDIR)/rttyrx.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/rttytx.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(librtty_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(librtty_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/rtty/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) librtty.a: $(librtty_a_OBJECTS) $(librtty_a_DEPENDENCIES) -rm -f librtty.a $(librtty_a_AR) librtty.a $(librtty_a_OBJECTS) $(librtty_a_LIBADD) $(RANLIB) librtty.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/baudot.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtty.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rttypar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rttyrx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rttytx.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/rtty/baudot.c0000644000076400007640000000523507725503072012177 /* * baudot.c -- BAUDOT encoder/decoder * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "baudot.h" static unsigned char letters[32] = { '\0', 'E', '\n', 'A', ' ', 'S', 'I', 'U', '\r', 'D', 'R', 'J', 'N', 'F', 'C', 'K', 'T', 'Z', 'L', 'W', 'H', 'Y', 'P', 'Q', 'O', 'B', 'G', '', 'M', 'X', 'V', '' }; #if 0 /* * ITA-2 version of the figures case. */ static unsigned char figures[32] = { '\0', '3', '\n', '-', ' ', '\'', '8', '7', '\r', '', '4', '\a', ',', '', ':', '(', '5', '+', ')', '2', '', '6', '0', '1', '9', '?', '', '', '.', '/', '=', '' }; #endif #if 0 /* * U.S. version of the figures case. */ static unsigned char figures[32] = { '\0', '3', '\n', '-', ' ', '\a', '8', '7', '\r', '$', '4', '\'', ',', '!', ':', '(', '5', '"', ')', '2', '#', '6', '0', '1', '9', '?', '&', '', '.', '/', ';', '' }; #endif #if 1 /* * A mix of the two. This is what seems to be what people actually use. */ static unsigned char figures[32] = { '\0', '3', '\n', '-', ' ', '\'', '8', '7', '\r', '$', '4', '\a', ',', '!', ':', '(', '5', '+', ')', '2', 'H', '6', '0', '1', '9', '?', '&', '', '.', '/', '=', '' }; #endif int baudot_enc(unsigned char data) { int i, c, mode; mode = 0; c = -1; if (islower(data)) data = toupper(data); for (i = 0; i < 32; i++) { if (data == letters[i]) { mode |= BAUDOT_LETS; c = i; } if (data == figures[i]) { mode |= BAUDOT_FIGS; c = i; } if (c != -1) return (mode | c); } return -1; } char baudot_dec(int *mode, unsigned char data) { int out = 0; switch (data) { case 0x1F: /* letters */ *mode = BAUDOT_LETS; break; case 0x1B: /* figures */ *mode = BAUDOT_FIGS; break; case 0x04: /* unshift-on-space */ *mode = BAUDOT_LETS; return ' '; break; default: if (*mode == BAUDOT_LETS) out = letters[data]; else out = figures[data]; break; } return out; } gmfsk-0.7pre1/src/rtty/baudot.h0000644000076400007640000000210607725503072012176 /* * baudot.h -- BAUDOT encoder/decoder * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _BAUDOT_H #define _BAUDOT_H #define BAUDOT_LETS 0x100 #define BAUDOT_FIGS 0x200 extern int baudot_enc(unsigned char data); extern char baudot_dec(int *mode, unsigned char data); #endif gmfsk-0.7pre1/src/rtty/rttypar.c0000644000076400007640000000235407725503072012425 /* * rttypar.c -- RTTY parity encoder/decoder * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "rttypar.h" #include "rtty.h" #include "misc.h" int rtty_parity(unsigned int c, unsigned int nbits, parity_t par) { c &= (1 << nbits) - 1; switch (par) { default: case PARITY_NONE: return 0; case PARITY_ODD: return parity(c); case PARITY_EVEN: return !parity(c); case PARITY_ZERO: return 0; case PARITY_ONE: return 1; } } gmfsk-0.7pre1/src/rtty/rttypar.h0000644000076400007640000000202207725503072012422 /* * rttypar.h -- RTTY parity encoder/decoder * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _PARITY_H #define _PARITY_H #include "rtty.h" extern int rtty_parity(unsigned int c, unsigned int nbits, parity_t par); #endif gmfsk-0.7pre1/src/rtty/rtty.c0000644000076400007640000000710010166565462011720 /* * rtty.c -- RTTY modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "trx.h" #include "rtty.h" #include "baudot.h" #include "filter.h" #include "fftfilt.h" static void rtty_txinit(struct trx *trx) { struct rtty *r = (struct rtty *) trx->modem; r->rxmode = BAUDOT_LETS; r->txmode = BAUDOT_LETS; /* start each transmission with 440ms of MARK tone */ r->preamble = 20; } static void rtty_free(struct rtty *s) { if (s) { filter_free(s->hilbert); g_free(s); } } static void rtty_rxinit(struct trx *trx) { struct rtty *r = (struct rtty *) trx->modem; r->rxmode = BAUDOT_LETS; r->txmode = BAUDOT_LETS; } static void rtty_destructor(struct trx *trx) { struct rtty *s = (struct rtty *) trx->modem; rtty_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } void rtty_init(struct trx *trx) { struct rtty *s; double flo, fhi, bw; s = g_new0(struct rtty, 1); s->shift = trx->rtty_shift; s->symbollen = (int) (SampleRate / trx->rtty_baud + 0.5); switch (trx->rtty_bits) { case 0: s->nbits = 5; break; case 1: s->nbits = 7; break; case 2: s->nbits = 8; break; } switch (trx->rtty_parity) { case 0: s->parity = PARITY_NONE; break; case 1: s->parity = PARITY_EVEN; break; case 2: s->parity = PARITY_ODD; break; case 3: s->parity = PARITY_ZERO; break; case 4: s->parity = PARITY_ONE; break; } switch (trx->rtty_stop) { case 0: s->stoplen = (int) (1.0 * SampleRate / trx->rtty_baud + 0.5); break; case 1: s->stoplen = (int) (1.5 * SampleRate / trx->rtty_baud + 0.5); break; case 2: s->stoplen = (int) (2.0 * SampleRate / trx->rtty_baud + 0.5); break; } s->reverse = (trx->rtty_reverse == TRUE) ? 1 : 0; s->msb = (trx->rtty_msbfirst == TRUE) ? 1 : 0; if (s->symbollen > MaxSymLen || s->stoplen > MaxSymLen) { fprintf(stderr, "RTTY: symbol length too big\n"); rtty_free(s); return; } bw = trx->rtty_baud * 1.1; flo = (s->shift / 2 - bw) / SampleRate; fhi = (s->shift / 2 + bw) / SampleRate; flo = 0; // fhi = 0.25; // fprintf(stderr, "flo=%f fhi=%f\n", flo * SampleRate, fhi * SampleRate); if ((s->hilbert = filter_init_hilbert(37, 1)) == NULL) { g_warning("rtty_init: init_hilbert failed\n"); rtty_free(s); return; } if ((s->fftfilt = fftfilt_init(flo, fhi, 2048)) == NULL) { g_warning("rtty_init: init_fftfilt failed\n"); rtty_free(s); return; } trx->modem = s; trx->txinit = rtty_txinit; trx->rxinit = rtty_rxinit; trx->txprocess = rtty_txprocess; trx->rxprocess = rtty_rxprocess; trx->destructor = rtty_destructor; trx->samplerate = SampleRate; trx->fragmentsize = 256; trx->bandwidth = s->shift; } gmfsk-0.7pre1/src/rtty/rtty.h0000644000076400007640000000370707725503072011732 /* * rtty.h -- RTTY modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _RTTY_H #define _RTTY_H #include "cmplx.h" #include "trx.h" #define SampleRate 8000 #define MaxSymLen 1024 typedef enum { RTTY_RX_STATE_IDLE = 0, RTTY_RX_STATE_START, RTTY_RX_STATE_DATA, RTTY_RX_STATE_PARITY, RTTY_RX_STATE_STOP, RTTY_RX_STATE_STOP2 } rtty_rx_state_t; typedef enum { PARITY_NONE = 0, PARITY_EVEN, PARITY_ODD, PARITY_ZERO, PARITY_ONE } parity_t; struct rtty { /* * Common stuff */ double shift; int symbollen; int nbits; parity_t parity; int stoplen; int reverse; int msb; double phaseacc; /* * RX related stuff */ struct filter *hilbert; struct fftfilt *fftfilt; double pipe[MaxSymLen]; unsigned int pipeptr; double bbfilter[MaxSymLen]; unsigned int filterptr; rtty_rx_state_t rxstate; int counter; int bitcntr; int rxdata; double prevsymbol; int rxmode; /* * TX related stuff */ int txmode; int preamble; }; /* in rtty.c */ extern void rtty_init(struct trx *trx); /* in rttyrx.c */ extern int rtty_rxprocess(struct trx *trx, float *buf, int len); /* in rttytx.c */ extern int rtty_txprocess(struct trx *trx); #endif gmfsk-0.7pre1/src/rtty/rttyrx.c0000644000076400007640000001157607725503072012302 /* * rttyrx.c -- RTTY demodulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "trx.h" #include "rtty.h" #include "filter.h" #include "fftfilt.h" #include "misc.h" #include "baudot.h" #include "rttypar.h" static double bbfilt(struct rtty *s, double in) { double out; int i; s->bbfilter[s->filterptr] = in; s->filterptr = (s->filterptr + 1) % s->symbollen; out = s->bbfilter[0]; for (i = 1; i < s->symbollen; i++) out += s->bbfilter[i]; return out / s->symbollen; } static void update_syncscope(struct rtty *s) { float data[MaxSymLen]; int i, j; for (i = 0; i < s->symbollen; i++) { j = (i + s->pipeptr) % s->symbollen; data[i] = 0.5 + 0.85 * s->pipe[j] / s->shift; } trx_set_scope(data, s->symbollen, FALSE); } static inline complex mixer(struct trx *trx, complex in) { struct rtty *s = (struct rtty *) trx->modem; complex z; c_re(z) = cos(s->phaseacc); c_im(z) = sin(s->phaseacc); z = cmul(z, in); s->phaseacc -= 2.0 * M_PI * trx->frequency / SampleRate; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; else if (s->phaseacc < M_PI) s->phaseacc += 2.0 * M_PI; return z; } static unsigned char bitreverse(unsigned char in, int n) { unsigned char out = 0; int i; for (i = 0; i < n; i++) out = (out << 1) | ((in >> i) & 1); return out; } static int decode_char(struct rtty *s) { unsigned int parbit, par, data; parbit = (s->rxdata >> s->nbits) & 1; par = rtty_parity(s->rxdata, s->nbits, s->parity); if (s->parity != PARITY_NONE && parbit != par) { // fprintf(stderr, "P"); return 0; } data = s->rxdata & ((1 << s->nbits) - 1); if (s->msb) data = bitreverse(data, s->nbits); if (s->nbits == 5) return baudot_dec(&s->rxmode, data); return data; } static int rttyrx(struct rtty *s, int bit) { int flag = 0; unsigned char c; switch (s->rxstate) { case RTTY_RX_STATE_IDLE: if (!bit) { s->rxstate = RTTY_RX_STATE_START; s->counter = s->symbollen / 2; } break; case RTTY_RX_STATE_START: if (--s->counter == 0) { if (!bit) { s->rxstate = RTTY_RX_STATE_DATA; s->counter = s->symbollen; s->bitcntr = 0; s->rxdata = 0; flag = 1; } else s->rxstate = RTTY_RX_STATE_IDLE; } break; case RTTY_RX_STATE_DATA: if (--s->counter == 0) { s->rxdata |= bit << s->bitcntr++; s->counter = s->symbollen; flag = 1; } if (s->bitcntr == s->nbits) { if (s->parity == PARITY_NONE) s->rxstate = RTTY_RX_STATE_STOP; else s->rxstate = RTTY_RX_STATE_PARITY; } break; case RTTY_RX_STATE_PARITY: if (--s->counter == 0) { s->rxstate = RTTY_RX_STATE_STOP; s->rxdata |= bit << s->bitcntr++; s->counter = s->symbollen; flag = 1; } break; case RTTY_RX_STATE_STOP: if (--s->counter == 0) { if (bit) { c = decode_char(s); trx_put_rx_char(c); flag = 1; } else { // fprintf(stderr, "F"); } s->rxstate = RTTY_RX_STATE_STOP2; s->counter = s->symbollen / 2; } break; case RTTY_RX_STATE_STOP2: if (--s->counter == 0) s->rxstate = RTTY_RX_STATE_IDLE; break; } return flag; } int rtty_rxprocess(struct trx *trx, float *buf, int len) { struct rtty *s = (struct rtty *) trx->modem; complex z, *zp; int n, i, bit, rev; double f; rev = (trx->reverse != 0) ^ (s->reverse != 0); while (len-- > 0) { /* create analytic signal... */ c_re(z) = c_im(z) = *buf++; filter_run(s->hilbert, z, &z); /* ...so it can be shifted in frequency */ z = mixer(trx, z); n = fftfilt_run(s->fftfilt, z, &zp); for (i = 0; i < n; i++) { static complex prev; f = carg(ccor(prev, zp[i])) * SampleRate / (2 * M_PI); prev = zp[i]; f = bbfilt(s, f); s->pipe[s->pipeptr] = f; s->pipeptr = (s->pipeptr + 1) % s->symbollen; if (s->counter == s->symbollen / 2) update_syncscope(s); // f = bbfilt(s, f); if (rev) bit = (f > 0.0); else bit = (f < 0.0); if (rttyrx(s, bit) && trx->afcon) { if (f > 0.0) f = f - s->shift / 2; else f = f + s->shift / 2; // fprintf(stderr, "bit=%d f=% f\n", bit, f); if (fabs(f) < s->shift / 2) trx_set_freq(trx->frequency + f / 256); } } } return 0; } gmfsk-0.7pre1/src/rtty/rttytx.c0000644000076400007640000000732010037766227012277 /* * rttytx.c -- RTTY modulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "trx.h" #include "rtty.h" #include "snd.h" #include "baudot.h" #include "rttypar.h" static inline double nco(struct rtty *s, double freq) { s->phaseacc += 2.0 * M_PI * freq / SampleRate; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; return cos(s->phaseacc); } static void send_symbol(struct trx *trx, int symbol) { struct rtty *s = (struct rtty *) trx->modem; double freq; int i, rev; rev = (trx->reverse != 0) ^ (s->reverse != 0); if (rev) symbol = !symbol; if (symbol) freq = trx->frequency - s->shift / 2.0; else freq = trx->frequency + s->shift / 2.0; freq += trx->txoffset; for (i = 0; i < s->symbollen; i++) trx->outbuf[i] = nco(s, freq); sound_write(trx->outbuf, s->symbollen); } static void send_stop(struct trx *trx) { struct rtty *s = (struct rtty *) trx->modem; double freq; int i, rev; rev = (trx->reverse != 0) ^ (s->reverse != 0); if (rev) freq = trx->frequency + s->shift / 2.0; else freq = trx->frequency - s->shift / 2.0; freq += trx->txoffset; for (i = 0; i < s->stoplen; i++) trx->outbuf[i] = nco(s, freq); sound_write(trx->outbuf, s->stoplen); } static void send_char(struct trx *trx, int c) { struct rtty *s = (struct rtty *) trx->modem; int i, j; if (s->nbits == 5) { if (c == BAUDOT_LETS) c = 0x1F; if (c == BAUDOT_FIGS) c = 0x1B; } /* start bit */ send_symbol(trx, 0); /* data bits */ for (i = 0; i < s->nbits; i++) { j = (s->msb) ? (s->nbits - 1 - i) : i; send_symbol(trx, (c >> j) & 1); } /* parity bit */ if (s->parity != PARITY_NONE) send_symbol(trx, rtty_parity(c, s->nbits, s->parity)); /* stop bit(s) */ send_stop(trx); if (s->nbits == 5) c = baudot_dec(&s->rxmode, c); if (c != 0) trx_put_echo_char(c); } static void send_idle(struct trx *trx) { struct rtty *s = (struct rtty *) trx->modem; if (s->nbits == 5) send_char(trx, BAUDOT_LETS); else send_char(trx, 0); } int rtty_txprocess(struct trx *trx) { struct rtty *s = (struct rtty *) trx->modem; int c; if (trx->tune) { trx->tune = 0; send_symbol(trx, 1); return 0; } if (s->preamble > 0) { send_symbol(trx, 1); s->preamble--; return 0; } c = trx_get_tx_char(); /* TX buffer empty */ if (c == -1) { /* stop if requested to... */ if (trx->stopflag) return -1; /* send idle character */ send_idle(trx); s->txmode = BAUDOT_LETS; return 0; } if (s->nbits != 5) { send_char(trx, c); return 0; } /* unshift-on-space */ if (c == ' ') { send_char(trx, BAUDOT_LETS); send_char(trx, 0x04); s->txmode = BAUDOT_LETS; return 0; } if ((c = baudot_enc(c)) < 0) return 0; /* switch case if necessary */ if ((c & s->txmode) == 0) { if (s->txmode == BAUDOT_FIGS) { send_char(trx, BAUDOT_LETS); s->txmode = BAUDOT_LETS; } else { send_char(trx, BAUDOT_FIGS); s->txmode = BAUDOT_FIGS; } } send_char(trx, c & 0x1F); return 0; } gmfsk-0.7pre1/src/throb/0000777000076400007640000000000010206176676010754 5gmfsk-0.7pre1/src/throb/Makefile.am0000644000076400007640000000045407606111466012723 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libthrob.a libthrob_a_SOURCES = \ tab.c tab.h \ throb.c throb.h \ throbrx.c \ throbtx.c gmfsk-0.7pre1/src/throb/Makefile.in0000644000076400007640000003033210206155267012727 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libthrob.a libthrob_a_SOURCES = \ tab.c tab.h \ throb.c throb.h \ throbrx.c \ throbtx.c subdir = src/throb ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libthrob_a_AR = $(AR) cru libthrob_a_LIBADD = am_libthrob_a_OBJECTS = tab.$(OBJEXT) throb.$(OBJEXT) throbrx.$(OBJEXT) \ throbtx.$(OBJEXT) libthrob_a_OBJECTS = $(am_libthrob_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/tab.Po ./$(DEPDIR)/throb.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/throbrx.Po ./$(DEPDIR)/throbtx.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libthrob_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libthrob_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/throb/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libthrob.a: $(libthrob_a_OBJECTS) $(libthrob_a_DEPENDENCIES) -rm -f libthrob.a $(libthrob_a_AR) libthrob.a $(libthrob_a_OBJECTS) $(libthrob_a_LIBADD) $(RANLIB) libthrob.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tab.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throb.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throbrx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/throbtx.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/throb/tab.c0000644000076400007640000000446707725503072011611 /* * tab.c -- THROB tables * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "throb.h" #include "tab.h" unsigned int ThrobTonePairs[NumChars][2] = { {5, 5}, /* idle... no print */ {4, 5}, /* A */ {1, 2}, /* B */ {1, 3}, /* C */ {1, 4}, /* D */ {4, 6}, /* SHIFT (was E) */ {1, 5}, /* F */ {1, 6}, /* G */ {1, 7}, /* H */ {3, 7}, /* I */ {1, 8}, /* J */ {2, 3}, /* K */ {2, 4}, /* L */ {2, 8}, /* M */ {2, 5}, /* N */ {5, 6}, /* O */ {2, 6}, /* P */ {2, 9}, /* Q */ {3, 4}, /* R */ {3, 5}, /* S */ {1, 9}, /* T */ {3, 6}, /* U */ {8, 9}, /* V */ {3, 8}, /* W */ {3, 3}, /* X */ {2, 2}, /* Y */ {1, 1}, /* Z */ {3, 9}, /* 1 */ {4, 7}, /* 2 */ {4, 8}, /* 3 */ {4, 9}, /* 4 */ {5, 7}, /* 5 */ {5, 8}, /* 6 */ {5, 9}, /* 7 */ {6, 7}, /* 8 */ {6, 8}, /* 9 */ {6, 9}, /* 0 */ {7, 8}, /* , */ {7, 9}, /* . */ {8, 8}, /* ' */ {7, 7}, /* / */ {6, 6}, /* ) */ {4, 4}, /* ( */ {9, 9}, /* E */ {2, 7} /* space */ }; unsigned char ThrobCharSet[NumChars] = { '\0', /* idle */ 'A', 'B', 'C', 'D', '\0', /* shift */ 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', ',', '.', '\'', '/', ')', '(', 'E', ' ' }; double ThrobToneFreqsNar[NumTones] = {-32, -24, -16, -8, 0, 8, 16, 24, 32}; double ThrobToneFreqsWid[NumTones] = {-64, -48, -32, -16, 0, 16, 32, 48, 64}; gmfsk-0.7pre1/src/throb/tab.h0000644000076400007640000000212107725503072011577 /* * tab.h -- THROB tables * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _TAB_H #define _TAB_H extern unsigned int ThrobTonePairs[NumChars][2]; extern unsigned char ThrobCharSet[NumChars]; extern double ThrobToneFreqsNar[NumTones]; extern double ThrobToneFreqsWid[NumTones]; #endif gmfsk-0.7pre1/src/throb/throb.c0000644000076400007640000001116310166566063012152 /* * throb.c -- THROB modem * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "trx.h" #include "throb.h" #include "filter.h" #include "fft.h" #include "tab.h" #include "misc.h" #include "fftfilt.h" static void throb_txinit(struct trx *trx) { struct throb *s = (struct throb *) trx->modem; s->preamble = 4; } static void throb_rxinit(struct trx *trx) { struct throb *s = (struct throb *) trx->modem; s->rxcntr = s->rxsymlen; s->waitsync = 1; s->deccntr = 0; s->symptr = 0; s->shift = 0; } static void throb_free(struct throb *s) { int i; if (s) { g_free(s->txpulse); filter_free(s->hilbert); filter_free(s->syncfilt); fftfilt_free(s->fftfilt); for (i = 0; i < NumTones; i++) g_free(s->rxtone[i]); g_free(s); } } static void throb_destructor(struct trx *trx) { throb_free((struct throb *) trx->modem); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } /* * Make a semi raised cosine pulse of length 'len'. */ static float *mk_semi_pulse(int len) { float *pulse, x; int i, j; pulse = g_new0(gfloat, len); for (i = 0; i < len; i++) { if (i < len / 5) { x = M_PI * i / (len / 5.0); pulse[i] = 0.5 * (1 - cos(x)); } if (i >= len / 5 && i < len * 4 / 5) pulse[i] = 1.0; if (i >= len * 4 / 5) { j = i - len * 4 / 5; x = M_PI * j / (len / 5.0); pulse[i] = 0.5 * (1 + cos(x)); } } return pulse; } /* * Make a full raised cosine pulse of length 'len'. */ static float *mk_full_pulse(int len) { float *pulse; int i; pulse = g_new0(gfloat, len); for (i = 0; i < len; i++) pulse[i] = 0.5 * (1 - cos(2 * M_PI * i / len)); return pulse; } /* * Make a 32 times downsampled complex prototype tone for rx. */ static complex *mk_rxtone(double freq, float *pulse, int len) { complex *tone; double x; int i; tone = g_new0(complex, len / DownSample); for (i = 0; i < len; i += DownSample) { x = -2.0 * M_PI * freq * i / SampleRate; c_re(tone[i / DownSample]) = pulse[i] * cos(x); c_im(tone[i / DownSample]) = pulse[i] * sin(x); } return tone; } void throb_init(struct trx *trx) { struct throb *s; double bw; float *fp; int i; s = g_new0(struct throb, 1); switch (trx->mode) { case MODE_THROB1: s->symlen = SymbolLen1; s->txpulse = mk_semi_pulse(SymbolLen1); fp = mk_semi_pulse(SymbolLen1 / DownSample); for (i = 0; i < NumTones; i++) s->freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / SampleRate; break; case MODE_THROB2: s->symlen = SymbolLen2; s->txpulse = mk_semi_pulse(SymbolLen2); fp = mk_semi_pulse(SymbolLen2 / DownSample); for (i = 0; i < NumTones; i++) s->freqs[i] = ThrobToneFreqsNar[i]; bw = 36.0 / SampleRate; break; case MODE_THROB4: s->symlen = SymbolLen4; s->txpulse = mk_full_pulse(SymbolLen4); fp = mk_full_pulse(SymbolLen4 / DownSample); for (i = 0; i < NumTones; i++) s->freqs[i] = ThrobToneFreqsWid[i]; bw = 72.0 / SampleRate; break; default: throb_free(s); return; } s->rxsymlen = s->symlen / DownSample; if ((s->hilbert = filter_init_hilbert(37, 1)) == NULL) { throb_free(s); return; } if ((s->fftfilt = fftfilt_init(0, bw, FilterFFTLen)) == NULL) { throb_free(s); return; } if ((s->syncfilt = filter_init(s->symlen / DownSample, 1, fp, NULL)) == NULL) { throb_free(s); return; } for (i = 0; i < NumTones; i++) { s->rxtone[i] = mk_rxtone(s->freqs[i], s->txpulse, s->symlen); if (!s->rxtone[i]) { throb_free(s); return; } } trx->modem = s; trx->txinit = throb_txinit; trx->rxinit = throb_rxinit; trx->txprocess = throb_txprocess; trx->rxprocess = throb_rxprocess; trx->destructor = throb_destructor; trx->reverse = 0; trx->samplerate = SampleRate; trx->fragmentsize = s->symlen; trx->bandwidth = s->freqs[8] - s->freqs[0]; trx->syncpos = 0.5; } gmfsk-0.7pre1/src/throb/throb.h0000644000076400007640000000353510070331763012152 /* * throb.h -- THROB modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _THROB_H #define _THROB_H #include "cmplx.h" #include "trx.h" #define SampleRate 8000 #define DownSample 32 #define NumTones 9 #define NumChars 45 #define SymbolLen1 8192 #define SymbolLen2 4096 #define SymbolLen4 2048 #define MaxRxSymLen (SymbolLen1 / DownSample) #define FilterFFTLen 8192 struct throb { /* * Common stuff */ int symlen; double phaseacc; double freqs[NumTones]; /* * RX related stuff */ struct filter *hilbert; struct fftfilt *fftfilt; struct filter *syncfilt; complex *rxtone[NumTones]; complex symbol[MaxRxSymLen]; float syncbuf[MaxRxSymLen]; float dispbuf[MaxRxSymLen]; float rxcntr; int rxsymlen; int symptr; int deccntr; int shift; int waitsync; /* * TX related stuff */ int preamble; float *txpulse; }; /* in throb.c */ extern void throb_init(struct trx *trx); /* in throbrx.c */ extern int throb_rxprocess(struct trx *trx, float *buf, int len); /* in throbtx.c */ extern int throb_txprocess(struct trx *trx); #endif gmfsk-0.7pre1/src/throb/throbrx.c0000644000076400007640000001167610070334051012515 /* * throbrx.c -- THROB demodulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "trx.h" #include "throb.h" #include "tab.h" #include "filter.h" #include "misc.h" #include "fft.h" #include "fftfilt.h" static inline complex mixer(struct trx *trx, complex in) { struct throb *s = (struct throb *) trx->modem; complex z; float f; c_re(z) = cos(s->phaseacc); c_im(z) = sin(s->phaseacc); z = cmul(z, in); f = trx->frequency; s->phaseacc -= 2.0 * M_PI * f / SampleRate; if (s->phaseacc < -M_PI) s->phaseacc += 2.0 * M_PI; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; return z; } static int findtones(complex *word, int *tone1, int *tone2) { double max1, max2; int maxtone, i; max1 = 0; *tone1 = 0; for (i = 0; i < NumTones; i++) { if (cmod(word[i]) > max1) { max1 = cmod(word[i]); *tone1 = i; } } maxtone = *tone1; max2 = 0; *tone2 = 0; for (i = 0; i < NumTones; i++) { if (i == *tone1) continue; if (cmod(word[i]) > max2) { max2 = cmod(word[i]); *tone2 = i; } } if (max1 > max2 * 2) *tone2 = *tone1; if (*tone1 > *tone2) { i = *tone1; *tone1 = *tone2; *tone2 = i; } return maxtone; } static void decodechar(struct trx *trx, int tone1, int tone2) { struct throb *s = (struct throb *) trx->modem; int i; if (s->shift == TRUE) { if (tone1 == 0 && tone2 == 8) trx_put_rx_char('?'); if (tone1 == 1 && tone2 == 7) trx_put_rx_char('@'); if (tone1 == 2 && tone2 == 6) trx_put_rx_char('='); if (tone1 == 4 && tone2 == 4) trx_put_rx_char('\n'); s->shift = FALSE; return; } if (tone1 == 3 && tone2 == 5) { s->shift = TRUE; return; } for (i = 0; i < NumChars; i++) { if (ThrobTonePairs[i][0] == tone1 + 1 && ThrobTonePairs[i][1] == tone2 + 1) { trx_put_rx_char(ThrobCharSet[i]); break; } } return; } static void throb_rx(struct trx *trx, complex in) { struct throb *s = (struct throb *) trx->modem; complex rxword[NumTones]; int i, tone1, tone2, maxtone; /* store input */ s->symbol[s->symptr] = in; /* check counter */ if (s->rxcntr > 0.0) return; /* correlate against all tones */ for (i = 0; i < NumTones; i++) rxword[i] = cmac(s->rxtone[i], s->symbol, s->symptr + 1, s->rxsymlen); /* find the strongest tones */ maxtone = findtones(rxword, &tone1, &tone2); /* decode */ decodechar(trx, tone1, tone2); if (trx->afcon == TRUE) { complex z1, z2; double f; z1 = rxword[maxtone]; z2 = cmac(s->rxtone[maxtone], s->symbol, s->symptr + 2, s->rxsymlen); f = carg(ccor(z1, z2)) / (2 * DownSample * M_PI / SampleRate); f -= s->freqs[maxtone]; trx_set_freq(trx->frequency + f / 8.0); } /* done with this symbol, start over */ s->rxcntr = s->rxsymlen; s->waitsync = 1; } static void throb_sync(struct trx *trx, complex in) { struct throb *s = (struct throb *) trx->modem; float f, maxval = 0; int i, maxpos = 0; /* "rectify", filter and store input */ filter_I_run(s->syncfilt, cmod(in), &f); s->syncbuf[s->symptr] = f; /* check counter if we are waiting for sync */ if (s->waitsync == 0 || s->rxcntr > (s->rxsymlen / 2.0)) return; for (i = 0; i < s->rxsymlen; i++) { f = s->syncbuf[(i + s->symptr + 1) % s->rxsymlen]; s->dispbuf[i] = f; } for (i = 0; i < s->rxsymlen; i++) { if (s->dispbuf[i] > maxval) { maxpos = i; maxval = s->dispbuf[i]; } } /* correct sync */ s->rxcntr += (maxpos - s->rxsymlen / 2) / 8.0; s->waitsync = 0; trx_set_scope(s->dispbuf, s->rxsymlen, TRUE); } int throb_rxprocess(struct trx *trx, float *buf, int len) { struct throb *s = (struct throb *) trx->modem; complex z, *zp; int i, n; while (len-- > 0) { /* create analytic signal */ c_re(z) = c_im(z) = *buf++; filter_run(s->hilbert, z, &z); /* shift down to 0 +- 32 (64) Hz */ z = mixer(trx, z); /* low pass filter */ n = fftfilt_run(s->fftfilt, z, &zp); /* downsample by 32 and push to the receiver */ for (i = 0; i < n; i++) { if (++s->deccntr >= DownSample) { s->rxcntr -= 1.0; /* do symbol sync */ throb_sync(trx, zp[i]); /* decode */ throb_rx(trx, zp[i]); s->symptr = (s->symptr + 1) % s->rxsymlen; s->deccntr = 0; } } } return 0; } gmfsk-0.7pre1/src/throb/throbtx.c0000644000076400007640000000576710037766517012546 /* * throbtx.c -- THROB modulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "trx.h" #include "throb.h" #include "snd.h" #include "tab.h" static void send_throb(struct trx *trx, int symbol) { struct throb *s = (struct throb *) trx->modem; float f; int tone1, tone2; double w1, w2; int i; if (symbol < 0 || symbol >= NumChars) return; tone1 = ThrobTonePairs[symbol][0] - 1; tone2 = ThrobTonePairs[symbol][1] - 1; if (trx->reverse) { tone1 = (NumTones - 1) - tone1; tone2 = (NumTones - 1) - tone2; } f = trx->frequency + trx->txoffset; w1 = 2.0 * M_PI * (f + s->freqs[tone1]) / SampleRate; w2 = 2.0 * M_PI * (f + s->freqs[tone2]) / SampleRate; for (i = 0; i < s->symlen; i++) trx->outbuf[i] = s->txpulse[i] * (sin(w1 * i) + sin(w2 * i)) / 2.0; sound_write(trx->outbuf, s->symlen); } int throb_txprocess(struct trx *trx) { struct throb *s = (struct throb *) trx->modem; int i, c, sym; if (trx->tune) { trx->tune = 0; send_throb(trx, 0); /* send idle throbs */ return 0; } if (s->preamble > 0) { send_throb(trx, 0); /* send idle throbs */ s->preamble--; return 0; } c = trx_get_tx_char(); /* TX buffer empty */ if (c == -1) { /* stop if requested to... */ if (trx->stopflag) { send_throb(trx, 0); return -1; } send_throb(trx, 0); /* send idle throbs */ return 0; } /* handle the special cases first */ switch (c) { case '?': send_throb(trx, 5); /* shift */ send_throb(trx, 20); trx_put_echo_char(c); return 0; case '@': send_throb(trx, 5); /* shift */ send_throb(trx, 13); trx_put_echo_char(c); return 0; case '=': send_throb(trx, 5); /* shift */ send_throb(trx, 9); trx_put_echo_char(c); return 0; case '\r': case '\n': send_throb(trx, 5); /* shift */ send_throb(trx, 0); trx_put_echo_char(c); return 0; default: break; } /* map lower case character to upper case */ if (islower(c)) c = toupper(c); /* see if the character can be found in our character set */ for (sym = -1, i = 0; i < NumChars; i++) if (c == ThrobCharSet[i]) sym = i; /* send a space for unknown chars */ if (sym == -1) { c = ' '; sym = 44; } send_throb(trx, sym); trx_put_echo_char(c); return 0; } gmfsk-0.7pre1/src/psk31/0000777000076400007640000000000010206176677010600 5gmfsk-0.7pre1/src/psk31/Makefile.am0000644000076400007640000000052207606111514012534 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libpsk31.a libpsk31_a_SOURCES = \ coeff.c coeff.h \ psk31.c psk31.h \ psk31rx.c \ psk31tx.c \ varicode.c varicode.h gmfsk-0.7pre1/src/psk31/Makefile.in0000644000076400007640000003061010206155267012551 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libpsk31.a libpsk31_a_SOURCES = \ coeff.c coeff.h \ psk31.c psk31.h \ psk31rx.c \ psk31tx.c \ varicode.c varicode.h subdir = src/psk31 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libpsk31_a_AR = $(AR) cru libpsk31_a_LIBADD = am_libpsk31_a_OBJECTS = coeff.$(OBJEXT) psk31.$(OBJEXT) \ psk31rx.$(OBJEXT) psk31tx.$(OBJEXT) varicode.$(OBJEXT) libpsk31_a_OBJECTS = $(am_libpsk31_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/coeff.Po ./$(DEPDIR)/psk31.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/psk31rx.Po ./$(DEPDIR)/psk31tx.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/varicode.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libpsk31_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libpsk31_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/psk31/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libpsk31.a: $(libpsk31_a_OBJECTS) $(libpsk31_a_DEPENDENCIES) -rm -f libpsk31.a $(libpsk31_a_AR) libpsk31.a $(libpsk31_a_OBJECTS) $(libpsk31_a_LIBADD) $(RANLIB) libpsk31.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/coeff.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psk31.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psk31rx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/psk31tx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/varicode.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/psk31/coeff.c0000644000076400007640000000617107561012432011733 #include "coeff.h" /* Linux PSK31 modem driver for soundcard -- Filter coefficients * * these FIR coefs are those used by G0TJZ in his TMC320C50 code * * Hansi Reiser, DL9RDZ, 20 April 1998 */ #define USE_NEW_FILTER /* 64-tap raised-cosine FIR*/ float fir1c[64] = { 0.000000, 0.000038, 0.000150, 0.000336, 0.000595, 0.000922, 0.001317, 0.001773, 0.002288, 0.002856, 0.003472, 0.004130, 0.004823, 0.005545, 0.006288, 0.007047, 0.007812, 0.008578, 0.009337, 0.010080, 0.010802, 0.011495, 0.012153, 0.012769, 0.013337, 0.013852, 0.014308, 0.014703, 0.015030, 0.015289, 0.015475, 0.015587, 0.015625, 0.015587, 0.015475, 0.015289, 0.015030, 0.014703, 0.014308, 0.013852, 0.013337, 0.012769, 0.012153, 0.011495, 0.010802, 0.010080, 0.009337, 0.008578, 0.007813, 0.007047, 0.006288, 0.005545, 0.004823, 0.004130, 0.003472, 0.002856, 0.002288, 0.001773, 0.001317, 0.000922, 0.000595, 0.000336, 0.000150, 0.000038, }; /* 4-bit receive filter for 31.25 baud BPSK * Designed by G3PLX, version 2 */ #ifndef USE_NEW_FILTER float fir2c[64] = { -0.00044789, -0.00063167, -0.00100256, -0.00156531, -0.00232266, -0.00327063, -0.00439342, -0.00565850, -0.00701253, -0.00837907, -0.00965823, -0.01072878, -0.01145278, -0.01168246, -0.01126911, -0.01007335, -0.00797606, -0.00488924, -0.00076591, 0.00439171, 0.01052660, 0.01752432, 0.02521404, 0.03337329, 0.04173643, 0.05000649, 0.05786981, 0.06501264, 0.07113857, 0.07598566, 0.07934199, 0.08105860, 0.08105860, 0.07934199, 0.07598566, 0.07113857, 0.06501264, 0.05786981, 0.05000649, 0.04173643, 0.03337329, 0.02521404, 0.01752432, 0.01052660, 0.00439171, -0.00076591, -0.00488924, -0.00797606, -0.01007335, -0.01126911, -0.01168246, -0.01145278, -0.01072878, -0.00965823, -0.00837907, -0.00701253, -0.00565850, -0.00439342, -0.00327063, -0.00232266, -0.00156531, -0.00100256, -0.00063167, -0.00044789, }; #else float fir2c[64] = { 0.000625000, 0.000820912, 0.001374651, 0.002188141, 0.003110600, 0.003956273, 0.004526787, 0.004635947, 0.004134515, 0.002932456, 0.001016352, -0.001539947, -0.004572751, -0.007834665, -0.011009254, -0.013733305, -0.015625000, -0.016315775, -0.015483216, -0.012882186, -0.008371423, -0.001933193, 0.006315933, 0.016124399, 0.027115485, 0.038807198, 0.050640928, 0.062016866, 0.072333574, 0.081028710, 0.087617820, 0.091728168, 0.093125000, 0.091728168, 0.087617820, 0.081028710, 0.072333574, 0.062016866, 0.050640928, 0.038807198, 0.027115485, 0.016124399, 0.006315933, -0.001933193, -0.008371423, -0.012882186, -0.015483216, -0.016315775, -0.015625000, -0.013733305, -0.011009254, -0.007834665, -0.004572751, -0.001539947, 0.001016352, 0.002932456, 0.004134515, 0.004635947, 0.004526787, 0.003956273, 0.003110600, 0.002188141, 0.001374651, 0.000820912 }; #endif float syncfilt[16] = { -0.097545161, -0.093796555, -0.086443400, -0.075768274, -0.062181416, -0.046204960, -0.028452874, -0.009607360, 0.009607360, 0.028452874, 0.046204960, 0.062181416, 0.075768274, 0.086443400, 0.093796555, 0.097545161 }; gmfsk-0.7pre1/src/psk31/coeff.h0000644000076400007640000000022207561013305011727 #ifndef _COEFF_H #define _COEFF_H #define FIRLEN 64 extern float fir1c[FIRLEN]; extern float fir2c[FIRLEN]; extern float syncfilt[16]; #endif gmfsk-0.7pre1/src/psk31/psk31.c0000644000076400007640000000613710166565410011620 /* * psk31.c -- PSK31 modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "psk31.h" #include "filter.h" #include "coeff.h" #define K 5 #define POLY1 0x17 #define POLY2 0x19 static void psk31_txinit(struct trx *trx) { struct psk31 *s = (struct psk31 *) trx->modem; s->phaseacc = 0; c_re(s->prevsymbol) = 1.0; c_im(s->prevsymbol) = 0.0; s->preamble = 32; s->shreg = 0; } static void psk31_rxinit(struct trx *trx) { struct psk31 *s = (struct psk31 *) trx->modem; s->phaseacc = 0; c_re(s->prevsymbol) = 1.0; c_im(s->prevsymbol) = 0.0; c_re(s->quality) = 0.0; c_im(s->quality) = 0.0; s->shreg = 0; s->dcdshreg = 0; s->dcd = 0; s->bitclk = 0; } static void psk31_free(struct psk31 *s) { if (s) { filter_free(s->fir1); filter_free(s->fir2); encoder_free(s->enc); viterbi_free(s->dec); g_free(s->txshape); g_free(s); } } static void psk31_destructor(struct trx *trx) { struct psk31 *s = (struct psk31 *) trx->modem; psk31_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } void psk31_init(struct trx *trx) { struct psk31 *s; int i; s = g_new0(struct psk31, 1); switch (trx->mode) { case MODE_BPSK31: s->symbollen = 256; s->qpsk = 0; break; case MODE_QPSK31: s->symbollen = 256; s->qpsk = 1; break; case MODE_PSK63: s->symbollen = 128; s->qpsk = 0; break; default: psk31_free(s); return; } s->fir1 = filter_init(FIRLEN, s->symbollen / 16, fir1c, fir1c); s->fir2 = filter_init(FIRLEN, 1, fir2c, fir2c); if (!s->fir1 || !s->fir2) { psk31_free(s); return; } if (s->qpsk) { s->enc = encoder_init(K, POLY1, POLY2); s->dec = viterbi_init(K, POLY1, POLY2); if (!s->enc || !s->dec) { psk31_free(s); return; } } s->txshape = g_new(gdouble, s->symbollen); /* raised cosine shape for the transmitter */ for (i = 0; i < s->symbollen; i++) s->txshape[i] = 0.5 * cos(i * M_PI / s->symbollen) + 0.5; trx->modem = s; trx->txinit = psk31_txinit; trx->rxinit = psk31_rxinit; trx->txprocess = psk31_txprocess; trx->rxprocess = psk31_rxprocess; trx->destructor = psk31_destructor; trx->samplerate = SampleRate; trx->fragmentsize = s->symbollen; trx->bandwidth = (double) SampleRate / s->symbollen; } gmfsk-0.7pre1/src/psk31/psk31.h0000644000076400007640000000324010011504550011600 /* * psk31.h -- PSK31 modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _PSK31_H #define _PSK31_H #include "cmplx.h" #include "trx.h" #include "viterbi.h" #define SampleRate 8000 #define PipeLen 64 struct psk31 { /* * Common stuff */ int symbollen; int qpsk; double phaseacc; complex prevsymbol; unsigned int shreg; /* * RX related stuff */ struct filter *fir1; struct filter *fir2; struct encoder *enc; struct viterbi *dec; double bitclk; float syncbuf[16]; double pipe[PipeLen]; unsigned int pipeptr; unsigned int dcdshreg; int dcd; complex quality; /* * TX related stuff */ double *txshape; int preamble; }; /* in psk31.c */ extern void psk31_init(struct trx *trx); /* in psk31rx.c */ extern int psk31_rxprocess(struct trx *trx, float *buf, int len); /* in psk31tx.c */ extern int psk31_txprocess(struct trx *trx); #endif gmfsk-0.7pre1/src/psk31/psk31rx.c0000644000076400007640000001120510011504460012145 /* * psk31rx.c -- PSK31 demodulator * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "psk31.h" #include "filter.h" #include "varicode.h" #include "coeff.h" static void rx_bit(struct trx *trx, int bit) { struct psk31 *s = (struct psk31 *) trx->modem; int c; s->shreg = (s->shreg << 1) | !!bit; if ((s->shreg & 3) == 0) { c = psk_varicode_decode(s->shreg >> 2); if (c != -1) trx_put_rx_char(c); s->shreg = 0; } } static void rx_qpsk(struct trx *trx, int bits) { struct psk31 *s = (struct psk31 *) trx->modem; unsigned char sym[2]; int c; if (s->qpsk && trx->reverse) bits = (4 - bits) & 3; sym[0] = (bits & 1) ? 255 : 0; sym[1] = (bits & 2) ? 0 : 255; /* top bit is flipped */ c = viterbi_decode(s->dec, sym, NULL); if (c != -1) { rx_bit(trx, c & 0x80); rx_bit(trx, c & 0x40); rx_bit(trx, c & 0x20); rx_bit(trx, c & 0x10); rx_bit(trx, c & 0x08); rx_bit(trx, c & 0x04); rx_bit(trx, c & 0x02); rx_bit(trx, c & 0x01); } } static void rx_symbol(struct trx *trx, complex symbol) { struct psk31 *s = (struct psk31 *) trx->modem; double phase, error; int bits, n; if ((phase = carg(ccor(s->prevsymbol, symbol))) < 0) phase += 2 * M_PI; if (s->qpsk) { bits = ((int) (phase / M_PI_2 + 0.5)) & 3; n = 4; } else { bits = (((int) (phase / M_PI + 0.5)) & 1) << 1; n = 2; } c_re(s->quality) = 0.02 * cos(n * phase) + 0.98 * c_re(s->quality); c_im(s->quality) = 0.02 * sin(n * phase) + 0.98 * c_im(s->quality); trx->metric = 100.0 * cpwr(s->quality); s->dcdshreg = (s->dcdshreg << 2) | bits; switch (s->dcdshreg) { case 0xAAAAAAAA: /* DCD on by preamble */ s->dcd = TRUE; c_re(s->quality) = 1; c_im(s->quality) = 0; break; case 0: /* DCD off by postamble */ s->dcd = FALSE; c_re(s->quality) = 0; c_im(s->quality) = 0; break; default: if (100.0 * cpwr(s->quality) > trx->psk31_squelch) s->dcd = TRUE; else s->dcd = FALSE; break; } trx_set_phase(phase, s->dcd); if (s->dcd == TRUE || trx->squelchon == FALSE) { if (s->qpsk) rx_qpsk(trx, bits); else rx_bit(trx, !bits); if (trx->afcon == TRUE) { error = (phase - bits * M_PI / 2); if (error < M_PI / 2) error += 2 * M_PI; if (error > M_PI / 2) error -= 2 * M_PI; error *= (double) SampleRate / (s->symbollen * 2 * M_PI); //fprintf(stderr, "error: %f\n", error); trx_set_freq(trx->frequency - (error / 16.0)); } } s->prevsymbol = symbol; } static void update_syncscope(struct trx *trx) { struct psk31 *s = (struct psk31 *) trx->modem; float data[16]; unsigned int i, ptr; ptr = s->pipeptr - 24; for (i = 0; i < 16; i++) data[i] = s->pipe[ptr++ % PipeLen]; trx_set_scope(data, 16, TRUE); } int psk31_rxprocess(struct trx *trx, float *buf, int len) { struct psk31 *s = (struct psk31 *) trx->modem; double delta; complex z; int i; delta = 2.0 * M_PI * trx->frequency / SampleRate; while (len-- > 0) { /* Mix with the internal NCO */ c_re(z) = *buf * cos(s->phaseacc); c_im(z) = *buf * sin(s->phaseacc); buf++; s->phaseacc += delta; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; /* Filter and downsample by 16 or 8 */ if (filter_run(s->fir1, z, &z)) { double sum; int idx; /* Do the second filtering */ filter_run(s->fir2, z, &z); /* save amplitude value for the sync scope */ s->pipe[s->pipeptr] = cmod(z); /* Now the sync correction routine... */ idx = (int) s->bitclk; s->syncbuf[idx] = cmod(z); sum = 0.0; for (i = 0; i < 8; i++) sum += s->syncbuf[i]; for (i = 8; i < 16; i++) sum -= s->syncbuf[i]; s->bitclk -= sum / 5.0; //trx->metric = 50 + sum * 100; //fprintf(stderr, "sync: %f\n", sum); /* bit clock */ s->bitclk += 1; if (s->bitclk >= 16) { s->bitclk -= 16; rx_symbol(trx, z); update_syncscope(trx); } s->pipeptr = (s->pipeptr + 1) % PipeLen; } } return 0; } gmfsk-0.7pre1/src/psk31/psk31tx.c0000644000076400007640000000700310037765743012175 /* * psk31tx.c -- PSK31 modulator * * Copyright (C) 2001, 2002, 2003, 2004 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include "psk31.h" #include "varicode.h" #include "snd.h" static void send_symbol(struct trx *trx, int sym) { struct psk31 *s = (struct psk31 *) trx->modem; float delta; complex symbol; int i; if (s->qpsk && trx->reverse) sym = (4 - sym) & 3; /* differential QPSK modulation - top bit flipped */ switch (sym) { case 0: c_re(symbol) = -1.0; /* 180 degrees */ c_im(symbol) = 0.0; break; case 1: c_re(symbol) = 0.0; /* 270 degrees */ c_im(symbol) = -1.0; break; case 2: c_re(symbol) = 1.0; /* 0 degrees */ c_im(symbol) = 0.0; break; case 3: c_re(symbol) = 0.0; /* 90 degrees */ c_im(symbol) = 1.0; break; } symbol = cmul(s->prevsymbol, symbol); delta = 2.0 * M_PI * (trx->frequency + trx->txoffset) / SampleRate; for (i = 0; i < s->symbollen; i++) { float ival, qval; ival = s->txshape[i] * c_re(s->prevsymbol) + (1.0 - s->txshape[i]) * c_re(symbol); qval = s->txshape[i] * c_im(s->prevsymbol) + (1.0 - s->txshape[i]) * c_im(symbol); trx->outbuf[i] = ival * cos(s->phaseacc) + qval * sin(s->phaseacc); s->phaseacc += delta; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; } sound_write(trx->outbuf, s->symbollen); /* save the current symbol */ s->prevsymbol = symbol; } static void send_bit(struct trx *trx, int bit) { struct psk31 *s = (struct psk31 *) trx->modem; unsigned int sym; if (s->qpsk) sym = encoder_encode(s->enc, bit); else sym = bit << 1; send_symbol(trx, sym); } static void send_char(struct trx *trx, unsigned char c) { char *code; code = psk_varicode_encode(c); while (*code) { send_bit(trx, (*code - '0')); code++; } send_bit(trx, 0); send_bit(trx, 0); } static void flush_tx(struct trx *trx) { struct psk31 *s = (struct psk31 *) trx->modem; int i; /* flush the encoder (QPSK only) */ if (s->qpsk) { send_bit(trx, 0); send_bit(trx, 0); send_bit(trx, 0); send_bit(trx, 0); send_bit(trx, 0); } /* DCD off sequence (unmodulated carrier) */ for (i = 0; i < 32; i++) send_symbol(trx, 2); } int psk31_txprocess(struct trx *trx) { struct psk31 *s = (struct psk31 *) trx->modem; int c; if (trx->tune) { trx->tune = 0; send_symbol(trx, 0); /* send phase reversals */ return 0; } if (s->preamble > 0) { s->preamble--; send_symbol(trx, 0); /* send phase reversals */ return 0; } c = trx_get_tx_char(); /* TX buffer empty */ if (c == -1) { /* stop if requested to... */ if (trx->stopflag) { flush_tx(trx); return -1; /* we're done */ } send_symbol(trx, 0); /* send phase reversals */ send_symbol(trx, 0); return 0; } send_char(trx, c); trx_put_echo_char(c); return 0; } gmfsk-0.7pre1/src/psk31/varicode.c0000644000076400007640000002514407725503072012455 /* * varicode.c -- PSK31 Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "varicode.h" /* * The PSK31 Varicode. */ static char *varicodetab1[] = { "1010101011", /* 0 - */ "1011011011", /* 1 - */ "1011101101", /* 2 - */ "1101110111", /* 3 - */ "1011101011", /* 4 - */ "1101011111", /* 5 - */ "1011101111", /* 6 - */ "1011111101", /* 7 - */ "1011111111", /* 8 - */ "11101111", /* 9 - */ "11101", /* 10 - */ "1101101111", /* 11 - */ "1011011101", /* 12 - */ "11111", /* 13 - */ "1101110101", /* 14 - */ "1110101011", /* 15 - */ "1011110111", /* 16 - */ "1011110101", /* 17 - */ "1110101101", /* 18 - */ "1110101111", /* 19 - */ "1101011011", /* 20 - */ "1101101011", /* 21 - */ "1101101101", /* 22 - */ "1101010111", /* 23 - */ "1101111011", /* 24 - */ "1101111101", /* 25 - */ "1110110111", /* 26 - */ "1101010101", /* 27 - */ "1101011101", /* 28 - */ "1110111011", /* 29 - */ "1011111011", /* 30 - */ "1101111111", /* 31 - */ "1", /* 32 - */ "111111111", /* 33 - ! */ "101011111", /* 34 - '"' */ "111110101", /* 35 - # */ "111011011", /* 36 - $ */ "1011010101", /* 37 - % */ "1010111011", /* 38 - & */ "101111111", /* 39 - ' */ "11111011", /* 40 - ( */ "11110111", /* 41 - ) */ "101101111", /* 42 - * */ "111011111", /* 43 - + */ "1110101", /* 44 - , */ "110101", /* 45 - - */ "1010111", /* 46 - . */ "110101111", /* 47 - / */ "10110111", /* 48 - 0 */ "10111101", /* 49 - 1 */ "11101101", /* 50 - 2 */ "11111111", /* 51 - 3 */ "101110111", /* 52 - 4 */ "101011011", /* 53 - 5 */ "101101011", /* 54 - 6 */ "110101101", /* 55 - 7 */ "110101011", /* 56 - 8 */ "110110111", /* 57 - 9 */ "11110101", /* 58 - : */ "110111101", /* 59 - ; */ "111101101", /* 60 - < */ "1010101", /* 61 - = */ "111010111", /* 62 - > */ "1010101111", /* 63 - ? */ "1010111101", /* 64 - @ */ "1111101", /* 65 - A */ "11101011", /* 66 - B */ "10101101", /* 67 - C */ "10110101", /* 68 - D */ "1110111", /* 69 - E */ "11011011", /* 70 - F */ "11111101", /* 71 - G */ "101010101", /* 72 - H */ "1111111", /* 73 - I */ "111111101", /* 74 - J */ "101111101", /* 75 - K */ "11010111", /* 76 - L */ "10111011", /* 77 - M */ "11011101", /* 78 - N */ "10101011", /* 79 - O */ "11010101", /* 80 - P */ "111011101", /* 81 - Q */ "10101111", /* 82 - R */ "1101111", /* 83 - S */ "1101101", /* 84 - T */ "101010111", /* 85 - U */ "110110101", /* 86 - V */ "101011101", /* 87 - W */ "101110101", /* 88 - X */ "101111011", /* 89 - Y */ "1010101101", /* 90 - Z */ "111110111", /* 91 - [ */ "111101111", /* 92 - \ */ "111111011", /* 93 - ] */ "1010111111", /* 94 - ^ */ "101101101", /* 95 - _ */ "1011011111", /* 96 - ` */ "1011", /* 97 - a */ "1011111", /* 98 - b */ "101111", /* 99 - c */ "101101", /* 100 - d */ "11", /* 101 - e */ "111101", /* 102 - f */ "1011011", /* 103 - g */ "101011", /* 104 - h */ "1101", /* 105 - i */ "111101011", /* 106 - j */ "10111111", /* 107 - k */ "11011", /* 108 - l */ "111011", /* 109 - m */ "1111", /* 110 - n */ "111", /* 111 - o */ "111111", /* 112 - p */ "110111111", /* 113 - q */ "10101", /* 114 - r */ "10111", /* 115 - s */ "101", /* 116 - t */ "110111", /* 117 - u */ "1111011", /* 118 - v */ "1101011", /* 119 - w */ "11011111", /* 120 - x */ "1011101", /* 121 - y */ "111010101", /* 122 - z */ "1010110111", /* 123 - { */ "110111011", /* 124 - | */ "1010110101", /* 125 - } */ "1011010111", /* 126 - ~ */ "1110110101", /* 127 - */ "1110111101", /* 128 - */ "1110111111", /* 129 - */ "1111010101", /* 130 - */ "1111010111", /* 131 - */ "1111011011", /* 132 - */ "1111011101", /* 133 - */ "1111011111", /* 134 - */ "1111101011", /* 135 - */ "1111101101", /* 136 - */ "1111101111", /* 137 - */ "1111110101", /* 138 - */ "1111110111", /* 139 - */ "1111111011", /* 140 - */ "1111111101", /* 141 - */ "1111111111", /* 142 - */ "10101010101", /* 143 - */ "10101010111", /* 144 - */ "10101011011", /* 145 - */ "10101011101", /* 146 - */ "10101011111", /* 147 - */ "10101101011", /* 148 - */ "10101101101", /* 149 - */ "10101101111", /* 150 - */ "10101110101", /* 151 - */ "10101110111", /* 152 - */ "10101111011", /* 153 - */ "10101111101", /* 154 - */ "10101111111", /* 155 - */ "10110101011", /* 156 - */ "10110101101", /* 157 - */ "10110101111", /* 158 - */ "10110110101", /* 159 - */ "10110110111", /* 160 - */ "10110111011", /* 161 - */ "10110111101", /* 162 - */ "10110111111", /* 163 - */ "10111010101", /* 164 - */ "10111010111", /* 165 - */ "10111011011", /* 166 - */ "10111011101", /* 167 - */ "10111011111", /* 168 - */ "10111101011", /* 169 - */ "10111101101", /* 170 - */ "10111101111", /* 171 - */ "10111110101", /* 172 - */ "10111110111", /* 173 - */ "10111111011", /* 174 - */ "10111111101", /* 175 - */ "10111111111", /* 176 - */ "11010101011", /* 177 - */ "11010101101", /* 178 - */ "11010101111", /* 179 - */ "11010110101", /* 180 - */ "11010110111", /* 181 - */ "11010111011", /* 182 - */ "11010111101", /* 183 - */ "11010111111", /* 184 - */ "11011010101", /* 185 - */ "11011010111", /* 186 - */ "11011011011", /* 187 - */ "11011011101", /* 188 - */ "11011011111", /* 189 - */ "11011101011", /* 190 - */ "11011101101", /* 191 - */ "11011101111", /* 192 - */ "11011110101", /* 193 - */ "11011110111", /* 194 - */ "11011111011", /* 195 - */ "11011111101", /* 196 - */ "11011111111", /* 197 - */ "11101010101", /* 198 - */ "11101010111", /* 199 - */ "11101011011", /* 200 - */ "11101011101", /* 201 - */ "11101011111", /* 202 - */ "11101101011", /* 203 - */ "11101101101", /* 204 - */ "11101101111", /* 205 - */ "11101110101", /* 206 - */ "11101110111", /* 207 - */ "11101111011", /* 208 - */ "11101111101", /* 209 - */ "11101111111", /* 210 - */ "11110101011", /* 211 - */ "11110101101", /* 212 - */ "11110101111", /* 213 - */ "11110110101", /* 214 - */ "11110110111", /* 215 - */ "11110111011", /* 216 - */ "11110111101", /* 217 - */ "11110111111", /* 218 - */ "11111010101", /* 219 - */ "11111010111", /* 220 - */ "11111011011", /* 221 - */ "11111011101", /* 222 - */ "11111011111", /* 223 - */ "11111101011", /* 224 - */ "11111101101", /* 225 - */ "11111101111", /* 226 - */ "11111110101", /* 227 - */ "11111110111", /* 228 - */ "11111111011", /* 229 - */ "11111111101", /* 230 - */ "11111111111", /* 231 - */ "101010101011", /* 232 - */ "101010101101", /* 233 - */ "101010101111", /* 234 - */ "101010110101", /* 235 - */ "101010110111", /* 236 - */ "101010111011", /* 237 - */ "101010111101", /* 238 - */ "101010111111", /* 239 - */ "101011010101", /* 240 - */ "101011010111", /* 241 - */ "101011011011", /* 242 - */ "101011011101", /* 243 - */ "101011011111", /* 244 - */ "101011101011", /* 245 - */ "101011101101", /* 246 - */ "101011101111", /* 247 - */ "101011110101", /* 248 - */ "101011110111", /* 249 - */ "101011111011", /* 250 - */ "101011111101", /* 251 - */ "101011111111", /* 252 - */ "101101010101", /* 253 - */ "101101010111", /* 254 - */ "101101011011" /* 255 - */ }; /* * The same in a format more suitable for decoding. */ static unsigned int varicodetab2[] = { 0x2AB, 0x2DB, 0x2ED, 0x377, 0x2EB, 0x35F, 0x2EF, 0x2FD, 0x2FF, 0x0EF, 0x01D, 0x36F, 0x2DD, 0x01F, 0x375, 0x3AB, 0x2F7, 0x2F5, 0x3AD, 0x3AF, 0x35B, 0x36B, 0x36D, 0x357, 0x37B, 0x37D, 0x3B7, 0x355, 0x35D, 0x3BB, 0x2FB, 0x37F, 0x001, 0x1FF, 0x15F, 0x1F5, 0x1DB, 0x2D5, 0x2BB, 0x17F, 0x0FB, 0x0F7, 0x16F, 0x1DF, 0x075, 0x035, 0x057, 0x1AF, 0x0B7, 0x0BD, 0x0ED, 0x0FF, 0x177, 0x15B, 0x16B, 0x1AD, 0x1AB, 0x1B7, 0x0F5, 0x1BD, 0x1ED, 0x055, 0x1D7, 0x2AF, 0x2BD, 0x07D, 0x0EB, 0x0AD, 0x0B5, 0x077, 0x0DB, 0x0FD, 0x155, 0x07F, 0x1FD, 0x17D, 0x0D7, 0x0BB, 0x0DD, 0x0AB, 0x0D5, 0x1DD, 0x0AF, 0x06F, 0x06D, 0x157, 0x1B5, 0x15D, 0x175, 0x17B, 0x2AD, 0x1F7, 0x1EF, 0x1FB, 0x2BF, 0x16D, 0x2DF, 0x00B, 0x05F, 0x02F, 0x02D, 0x003, 0x03D, 0x05B, 0x02B, 0x00D, 0x1EB, 0x0BF, 0x01B, 0x03B, 0x00F, 0x007, 0x03F, 0x1BF, 0x015, 0x017, 0x005, 0x037, 0x07B, 0x06B, 0x0DF, 0x05D, 0x1D5, 0x2B7, 0x1BB, 0x2B5, 0x2D7, 0x3B5, 0x3BD, 0x3BF, 0x3D5, 0x3D7, 0x3DB, 0x3DD, 0x3DF, 0x3EB, 0x3ED, 0x3EF, 0x3F5, 0x3F7, 0x3FB, 0x3FD, 0x3FF, 0x555, 0x557, 0x55B, 0x55D, 0x55F, 0x56B, 0x56D, 0x56F, 0x575, 0x577, 0x57B, 0x57D, 0x57F, 0x5AB, 0x5AD, 0x5AF, 0x5B5, 0x5B7, 0x5BB, 0x5BD, 0x5BF, 0x5D5, 0x5D7, 0x5DB, 0x5DD, 0x5DF, 0x5EB, 0x5ED, 0x5EF, 0x5F5, 0x5F7, 0x5FB, 0x5FD, 0x5FF, 0x6AB, 0x6AD, 0x6AF, 0x6B5, 0x6B7, 0x6BB, 0x6BD, 0x6BF, 0x6D5, 0x6D7, 0x6DB, 0x6DD, 0x6DF, 0x6EB, 0x6ED, 0x6EF, 0x6F5, 0x6F7, 0x6FB, 0x6FD, 0x6FF, 0x755, 0x757, 0x75B, 0x75D, 0x75F, 0x76B, 0x76D, 0x76F, 0x775, 0x777, 0x77B, 0x77D, 0x77F, 0x7AB, 0x7AD, 0x7AF, 0x7B5, 0x7B7, 0x7BB, 0x7BD, 0x7BF, 0x7D5, 0x7D7, 0x7DB, 0x7DD, 0x7DF, 0x7EB, 0x7ED, 0x7EF, 0x7F5, 0x7F7, 0x7FB, 0x7FD, 0x7FF, 0xAAB, 0xAAD, 0xAAF, 0xAB5, 0xAB7, 0xABB, 0xABD, 0xABF, 0xAD5, 0xAD7, 0xADB, 0xADD, 0xADF, 0xAEB, 0xAED, 0xAEF, 0xAF5, 0xAF7, 0xAFB, 0xAFD, 0xAFF, 0xB55, 0xB57, 0xB5B }; char *psk_varicode_encode(unsigned char c) { return varicodetab1[c]; } int psk_varicode_decode(unsigned int symbol) { int i; for (i = 0; i < 256; i++) if (symbol == varicodetab2[i]) return i; return -1; } gmfsk-0.7pre1/src/psk31/varicode.h0000644000076400007640000000200707725503072012453 /* * varicode.h -- PSK31 Varicode * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _VARICODE_H #define _VARICODE_H char *psk_varicode_encode(unsigned char c); int psk_varicode_decode(unsigned int symbol); #endif gmfsk-0.7pre1/src/mt63/0000777000076400007640000000000010206176677010430 5gmfsk-0.7pre1/src/mt63/Makefile.am0000644000076400007640000000057707616101631012376 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libmt63.a libmt63_a_SOURCES = \ alias_1k.dat alias_2k.dat alias_k5.dat \ dsp.cc dsp.h \ morse.dat \ mt63.cc mt63.h \ mt63intl.dat \ mt63main.cc \ symbol.dat gmfsk-0.7pre1/src/mt63/Makefile.in0000644000076400007640000003065410206155266012410 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libmt63.a libmt63_a_SOURCES = \ alias_1k.dat alias_2k.dat alias_k5.dat \ dsp.cc dsp.h \ morse.dat \ mt63.cc mt63.h \ mt63intl.dat \ mt63main.cc \ symbol.dat subdir = src/mt63 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libmt63_a_AR = $(AR) cru libmt63_a_LIBADD = am_libmt63_a_OBJECTS = dsp.$(OBJEXT) mt63.$(OBJEXT) mt63main.$(OBJEXT) libmt63_a_OBJECTS = $(am_libmt63_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/dsp.Po ./$(DEPDIR)/mt63.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/mt63main.Po CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libmt63_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libmt63_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/mt63/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libmt63.a: $(libmt63_a_OBJECTS) $(libmt63_a_DEPENDENCIES) -rm -f libmt63.a $(libmt63_a_AR) libmt63.a $(libmt63_a_OBJECTS) $(libmt63_a_LIBADD) $(RANLIB) libmt63.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dsp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt63.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mt63main.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .cc.o: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCXX_TRUE@ fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< .cc.obj: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCXX_TRUE@ fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/mt63/alias_1k.dat0000644000076400007640000001052010072571046012506 /* * alias_1k.dat -- Anti-alias filter 1000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1500.0 // PassBandLow=375.0 PassBandUpp=1625.0 StopBandLow=0.0 StopBandUpp=2000.0 // => PeakInStopBand=-90.99 dB // Programmers's scale factor: 2.000000 // Programmers's comments: Anti-alias filter 1000 Hz bandwidth, decimation by 4 const int Alias_1k_Len=64; float Alias_1k_I[Alias_1k_Len] = { +0.00003605 , // 0 +0.00001835 , // 1 -0.00022227 , // 2 -0.00079785 , // 3 -0.00099442 , // 4 +0.00032296 , // 5 +0.00276603 , // 6 +0.00365685 , // 7 +0.00128973 , // 8 -0.00107943 , // 9 +0.00195568 , // 10 +0.00914871 , // 11 +0.01100689 , // 12 +0.00254789 , // 13 -0.00580382 , // 14 -0.00014844 , // 15 +0.01341757 , // 16 +0.01123057 , // 17 -0.01328109 , // 18 -0.03176715 , // 19 -0.01791993 , // 20 +0.00579429 , // 21 -0.00986091 , // 22 -0.06425601 , // 23 -0.08967807 , // 24 -0.04429128 , // 25 +0.00513920 , // 26 -0.04459511 , // 27 -0.16886923 , // 28 -0.19065374 , // 29 +0.01930718 , // 30 +0.34486939 , // 31 +0.50345887 , // 32 +0.34486939 , // 33 +0.01930718 , // 34 -0.19065374 , // 35 -0.16886923 , // 36 -0.04459511 , // 37 +0.00513920 , // 38 -0.04429128 , // 39 -0.08967807 , // 40 -0.06425601 , // 41 -0.00986091 , // 42 +0.00579429 , // 43 -0.01791993 , // 44 -0.03176715 , // 45 -0.01328109 , // 46 +0.01123057 , // 47 +0.01341757 , // 48 -0.00014844 , // 49 -0.00580382 , // 50 +0.00254789 , // 51 +0.01100689 , // 52 +0.00914871 , // 53 +0.00195568 , // 54 -0.00107943 , // 55 +0.00128973 , // 56 +0.00365685 , // 57 +0.00276603 , // 58 +0.00032296 , // 59 -0.00099442 , // 60 -0.00079785 , // 61 -0.00022227 , // 62 +0.00001835 // 63 } ; float Alias_1k_Q[Alias_1k_Len] = { -0.00000000 , // 0 -0.00009527 , // 1 -0.00023082 , // 2 +0.00005162 , // 3 +0.00123007 , // 4 +0.00255193 , // 5 +0.00207549 , // 6 -0.00064302 , // 7 -0.00244045 , // 8 +0.00005205 , // 9 +0.00410793 , // 10 +0.00211830 , // 11 -0.00729235 , // 12 -0.01359800 , // 13 -0.00757272 , // 14 +0.00172023 , // 15 -0.00460378 , // 16 -0.02559228 , // 17 -0.03408530 , // 18 -0.01416468 , // 19 +0.00731461 , // 20 -0.00712536 , // 21 -0.04328548 , // 22 -0.04099291 , // 23 +0.01821691 , // 24 +0.06428190 , // 25 +0.02790538 , // 26 -0.03602086 , // 27 +0.01583703 , // 28 +0.22015579 , // 29 +0.40003327 , // 30 +0.32856209 , // 31 -0.00000000 , // 32 -0.32856209 , // 33 -0.40003327 , // 34 -0.22015579 , // 35 -0.01583703 , // 36 +0.03602086 , // 37 -0.02790538 , // 38 -0.06428190 , // 39 -0.01821691 , // 40 +0.04099291 , // 41 +0.04328548 , // 42 +0.00712536 , // 43 -0.00731461 , // 44 +0.01416468 , // 45 +0.03408530 , // 46 +0.02559228 , // 47 +0.00460378 , // 48 -0.00172023 , // 49 +0.00757272 , // 50 +0.01359800 , // 51 +0.00729235 , // 52 -0.00211830 , // 53 -0.00410793 , // 54 -0.00005205 , // 55 +0.00244045 , // 56 +0.00064302 , // 57 -0.00207549 , // 58 -0.00255193 , // 59 -0.00123007 , // 60 -0.00005162 , // 61 +0.00023082 , // 62 +0.00009527 // 63 } ; gmfsk-0.7pre1/src/mt63/alias_2k.dat0000644000076400007640000001052010072571047012510 /* * alias_2k.dat -- Anti-alias filter 2000 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=64 SampleRate=8000.0 FreqLow=500.0 FreqUpp=2500.0 // PassBandLow=375.0 PassBandUpp=2625.0 StopBandLow=0.0 StopBandUpp=3000.0 // => PeakInStopBand=-89.35 dB // Programmers's scale factor: 1.000000 // Programmers's comments: Anti-alias filter 2000 Hz bandwidth, decimation by 2 const int Alias_2k_Len=64; float Alias_2k_I[Alias_2k_Len] = { +0.00007244 , // 0 +0.00002831 , // 1 -0.00031179 , // 2 -0.00027704 , // 3 +0.00026218 , // 4 -0.00057780 , // 5 -0.00083336 , // 6 +0.00119188 , // 7 +0.00014945 , // 8 -0.00077327 , // 9 +0.00360739 , // 10 +0.00224833 , // 11 -0.00032116 , // 12 +0.00696821 , // 13 +0.00439713 , // 14 -0.00157675 , // 15 +0.00906983 , // 16 +0.00372045 , // 17 -0.00786599 , // 18 +0.00735339 , // 19 -0.00253048 , // 20 -0.02189728 , // 21 +0.00134354 , // 22 -0.01477966 , // 23 -0.04434362 , // 24 -0.00479913 , // 25 -0.03000591 , // 26 -0.07609801 , // 27 +0.00258946 , // 28 -0.04271980 , // 29 -0.14710769 , // 30 +0.14198817 , // 31 +0.42372962 , // 32 +0.14198817 , // 33 -0.14710769 , // 34 -0.04271980 , // 35 +0.00258946 , // 36 -0.07609801 , // 37 -0.03000591 , // 38 -0.00479913 , // 39 -0.04434362 , // 40 -0.01477966 , // 41 +0.00134354 , // 42 -0.02189728 , // 43 -0.00253048 , // 44 +0.00735339 , // 45 -0.00786599 , // 46 +0.00372045 , // 47 +0.00906983 , // 48 -0.00157675 , // 49 +0.00439713 , // 50 +0.00696821 , // 51 -0.00032116 , // 52 +0.00224833 , // 53 +0.00360739 , // 54 -0.00077327 , // 55 +0.00014945 , // 56 +0.00119188 , // 57 -0.00083336 , // 58 -0.00057780 , // 59 +0.00026218 , // 60 -0.00027704 , // 61 -0.00031179 , // 62 +0.00002831 // 63 } ; float Alias_2k_Q[Alias_2k_Len] = { -0.00000000 , // 0 -0.00015159 , // 1 -0.00014608 , // 2 +0.00036770 , // 3 +0.00010339 , // 4 -0.00031581 , // 5 +0.00128580 , // 6 +0.00120582 , // 7 -0.00051862 , // 8 +0.00225671 , // 9 +0.00226918 , // 10 -0.00216340 , // 11 +0.00181728 , // 12 +0.00176390 , // 13 -0.00692361 , // 14 -0.00105199 , // 15 -0.00081355 , // 16 -0.01498960 , // 17 -0.00512332 , // 18 -0.00331671 , // 19 -0.02395357 , // 20 -0.00602102 , // 21 -0.00049919 , // 22 -0.02943663 , // 23 +0.00351421 , // 24 +0.01576926 , // 25 -0.02737092 , // 26 +0.03572558 , // 27 +0.06272088 , // 28 -0.01659059 , // 29 +0.15254255 , // 30 +0.33394426 , // 31 -0.00000000 , // 32 -0.33394426 , // 33 -0.15254255 , // 34 +0.01659059 , // 35 -0.06272088 , // 36 -0.03572558 , // 37 +0.02737092 , // 38 -0.01576926 , // 39 -0.00351421 , // 40 +0.02943663 , // 41 +0.00049919 , // 42 +0.00602102 , // 43 +0.02395357 , // 44 +0.00331671 , // 45 +0.00512332 , // 46 +0.01498960 , // 47 +0.00081355 , // 48 +0.00105199 , // 49 +0.00692361 , // 50 -0.00176390 , // 51 -0.00181728 , // 52 +0.00216340 , // 53 -0.00226918 , // 54 -0.00225671 , // 55 +0.00051862 , // 56 -0.00120582 , // 57 -0.00128580 , // 58 +0.00031581 , // 59 -0.00010339 , // 60 -0.00036770 , // 61 +0.00014608 , // 62 +0.00015159 // 63 } ; gmfsk-0.7pre1/src/mt63/alias_k5.dat0000644000076400007640000001652210072571047012523 /* * alias_k5.dat -- Anti-alias filter 500 Hz bandwidth * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // Filter coefficiants made by ALIAS.C for the following parameters: // FilterLen=128 SampleRate=8000.0 FreqLow=500.0 FreqUpp=1000.0 // PassBandLow=437.5 PassBandUpp=1062.5 StopBandLow=250.0 StopBandUpp=1250.0 // => PeakInStopBand=-86.20 dB // Programmers's scale factor: 4.000000 // Programmers's comments: Anti-alias filter 500 Hz bandwidth, decimation by 8 const int Alias_k5_Len=128; float Alias_k5_I[Alias_k5_Len] = { +0.00006549 , // 0 +0.00007616 , // 1 +0.00006321 , // 2 -0.00007051 , // 3 -0.00037947 , // 4 -0.00077842 , // 5 -0.00101934 , // 6 -0.00079747 , // 7 +0.00003634 , // 8 +0.00128166 , // 9 +0.00238256 , // 10 +0.00269672 , // 11 +0.00193090 , // 12 +0.00045168 , // 13 -0.00082397 , // 14 -0.00100872 , // 15 +0.00002675 , // 16 +0.00132515 , // 17 +0.00130571 , // 18 -0.00111559 , // 19 -0.00545495 , // 20 -0.00950601 , // 21 -0.01047729 , // 22 -0.00687776 , // 23 +0.00011406 , // 24 +0.00696202 , // 25 +0.00989474 , // 26 +0.00760013 , // 27 +0.00255231 , // 28 -0.00031461 , // 29 +0.00291281 , // 30 +0.01174794 , // 31 +0.02064676 , // 32 +0.02211535 , // 33 +0.01194783 , // 34 -0.00696440 , // 35 -0.02537662 , // 36 -0.03322892 , // 37 -0.02665276 , // 38 -0.01145836 , // 39 +0.00006418 , // 40 -0.00230763 , // 41 -0.01840573 , // 42 -0.03588720 , // 43 -0.03743444 , // 44 -0.01306806 , // 45 +0.03074821 , // 46 +0.07251687 , // 47 +0.08836159 , // 48 +0.06850261 , // 49 +0.02612053 , // 50 -0.00913110 , // 51 -0.01081820 , // 52 +0.02342696 , // 53 +0.06482083 , // 54 +0.06779523 , // 55 -0.00021458 , // 56 -0.13123843 , // 57 -0.27054300 , // 58 -0.33962227 , // 59 -0.27857291 , // 60 -0.08448838 , // 61 +0.17772565 , // 62 +0.40136534 , // 63 +0.48897105 , // 64 +0.40136534 , // 65 +0.17772565 , // 66 -0.08448838 , // 67 -0.27857291 , // 68 -0.33962227 , // 69 -0.27054300 , // 70 -0.13123843 , // 71 -0.00021458 , // 72 +0.06779523 , // 73 +0.06482083 , // 74 +0.02342696 , // 75 -0.01081820 , // 76 -0.00913110 , // 77 +0.02612053 , // 78 +0.06850261 , // 79 +0.08836159 , // 80 +0.07251687 , // 81 +0.03074821 , // 82 -0.01306806 , // 83 -0.03743444 , // 84 -0.03588720 , // 85 -0.01840573 , // 86 -0.00230763 , // 87 +0.00006418 , // 88 -0.01145836 , // 89 -0.02665276 , // 90 -0.03322892 , // 91 -0.02537662 , // 92 -0.00696440 , // 93 +0.01194783 , // 94 +0.02211535 , // 95 +0.02064676 , // 96 +0.01174794 , // 97 +0.00291281 , // 98 -0.00031461 , // 99 +0.00255231 , // 100 +0.00760013 , // 101 +0.00989474 , // 102 +0.00696202 , // 103 +0.00011406 , // 104 -0.00687776 , // 105 -0.01047729 , // 106 -0.00950601 , // 107 -0.00545495 , // 108 -0.00111559 , // 109 +0.00130571 , // 110 +0.00132515 , // 111 +0.00002675 , // 112 -0.00100872 , // 113 -0.00082397 , // 114 +0.00045168 , // 115 +0.00193090 , // 116 +0.00269672 , // 117 +0.00238256 , // 118 +0.00128166 , // 119 +0.00003634 , // 120 -0.00079747 , // 121 -0.00101934 , // 122 -0.00077842 , // 123 -0.00037947 , // 124 -0.00007051 , // 125 +0.00006321 , // 126 +0.00007616 // 127 } ; float Alias_k5_Q[Alias_k5_Len] = { -0.00000000 , // 0 -0.00005367 , // 1 -0.00016555 , // 2 -0.00031225 , // 3 -0.00036198 , // 4 -0.00013710 , // 5 +0.00044740 , // 6 +0.00124698 , // 7 +0.00186810 , // 8 +0.00184150 , // 9 +0.00093521 , // 10 -0.00058853 , // 11 -0.00200435 , // 12 -0.00252488 , // 13 -0.00187551 , // 14 -0.00063367 , // 15 +0.00001967 , // 16 -0.00088264 , // 17 -0.00319853 , // 18 -0.00540709 , // 19 -0.00536877 , // 20 -0.00180828 , // 21 +0.00444555 , // 22 +0.01048985 , // 23 +0.01293826 , // 24 +0.01021951 , // 25 +0.00399079 , // 26 -0.00159281 , // 27 -0.00262530 , // 28 +0.00149295 , // 29 +0.00697645 , // 30 +0.00777564 , // 31 -0.00010048 , // 32 -0.01493909 , // 33 -0.02926626 , // 34 -0.03410235 , // 35 -0.02512027 , // 36 -0.00643493 , // 37 +0.01119978 , // 38 +0.01734888 , // 39 +0.00962767 , // 40 -0.00347093 , // 41 -0.00757142 , // 42 +0.00724618 , // 43 +0.03765704 , // 44 +0.06671856 , // 45 +0.07363882 , // 46 +0.04816692 , // 47 -0.00023240 , // 48 -0.04602175 , // 49 -0.06349448 , // 50 -0.04533960 , // 51 -0.01075524 , // 52 +0.00463299 , // 53 -0.02695458 , // 54 -0.10175325 , // 55 -0.17821917 , // 56 -0.19595859 , // 57 -0.11176981 , // 58 +0.06782857 , // 59 +0.27891973 , // 60 +0.42579279 , // 61 +0.42868878 , // 62 +0.26809297 , // 63 -0.00000000 , // 64 -0.26809297 , // 65 -0.42868878 , // 66 -0.42579279 , // 67 -0.27891973 , // 68 -0.06782857 , // 69 +0.11176981 , // 70 +0.19595859 , // 71 +0.17821917 , // 72 +0.10175325 , // 73 +0.02695458 , // 74 -0.00463299 , // 75 +0.01075524 , // 76 +0.04533960 , // 77 +0.06349448 , // 78 +0.04602175 , // 79 +0.00023240 , // 80 -0.04816692 , // 81 -0.07363882 , // 82 -0.06671856 , // 83 -0.03765704 , // 84 -0.00724618 , // 85 +0.00757142 , // 86 +0.00347093 , // 87 -0.00962767 , // 88 -0.01734888 , // 89 -0.01119978 , // 90 +0.00643493 , // 91 +0.02512027 , // 92 +0.03410235 , // 93 +0.02926626 , // 94 +0.01493909 , // 95 +0.00010048 , // 96 -0.00777564 , // 97 -0.00697645 , // 98 -0.00149295 , // 99 +0.00262530 , // 100 +0.00159281 , // 101 -0.00399079 , // 102 -0.01021951 , // 103 -0.01293826 , // 104 -0.01048985 , // 105 -0.00444555 , // 106 +0.00180828 , // 107 +0.00536877 , // 108 +0.00540709 , // 109 +0.00319853 , // 110 +0.00088264 , // 111 -0.00001967 , // 112 +0.00063367 , // 113 +0.00187551 , // 114 +0.00252488 , // 115 +0.00200435 , // 116 +0.00058853 , // 117 -0.00093521 , // 118 -0.00184150 , // 119 -0.00186810 , // 120 -0.00124698 , // 121 -0.00044740 , // 122 +0.00013710 , // 123 +0.00036198 , // 124 +0.00031225 , // 125 +0.00016555 , // 126 +0.00005367 // 127 } ; gmfsk-0.7pre1/src/mt63/dsp.cc0000644000076400007640000020370510072571052011433 /* * dsp.cc -- various DSP algorithms * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // Please note, that you should not rely on the correctness // of these routines. They generally work well, but you may find // differences in respect to the mathematical formulas: signs flipped, // orders swapped, etc. #include // only when we do some control printf's #include #include #include "dsp.h" // ---------------------------------------------------------------------------- double Power(float *X, int Len) { double Sum; for(Sum=0.0; Len; Len--,X++) Sum+=(*X)*(*X); return Sum; } double Power(double *X, int Len) { double Sum; for(Sum=0.0; Len; Len--,X++) Sum+=(*X)*(*X); return Sum; } double Power(float *I, float *Q, int Len) { double Sum; for(Sum=0.0; Len; Len--,I++,Q++) Sum+=(*I)*(*I)+(*Q)*(*Q); return Sum; } double Power(double *I, double *Q, int Len) { double Sum; for(Sum=0.0; Len; Len--,I++,Q++) Sum+=(*I)*(*I)+(*Q)*(*Q); return Sum; } double Power(fcmpx *X, int Len) { double Sum; for(Sum=0.0; Len; Len--,X++) Sum+=(X->re)*(X->re)+(X->im)*(X->im); return Sum; } double Power(dcmpx *X, int Len) { double Sum; for(Sum=0.0; Len; Len--,X++) Sum+=(X->re)*(X->re)+(X->im)*(X->im); return Sum; } // ---------------------------------------------------------------------------- // average, extremes, fitting double Average(float *Data, int Len) { double Sum; int i; for(Sum=0.0,i=0; iMax) Max=Pwr; } return Max; } double FindMaxPower(fcmpx *Data, int Len, int &MaxPos) { double Max,Pwr; int i,pos; Max=Power(Data[0]); pos=0; for(i=1; iMax) { Max=Pwr; pos=i; } } MaxPos=pos; return Max; } double FitPoly1(float *Data, int Len, double &A, double &B) { double Sum; int i; A=(Data[Len-1]-Data[0])/(Len-1); for(Sum=0.0,i=0; iEnsureSpace(Len); if(err) return -1; ConvS16toFloat(S16,Float->Data,Len,Gain); Float->Len=Len; return 0; } void ConvFloatToS16(float *Float, s16 *S16, int Len, float Gain) { float out; for(; Len; Len--) { out=(*Float++)*Gain; if(out>32767.0) out=32767.0; else if(out<(-32767.0)) out=(-32767.0); (*S16++)=(short int)floor(out+0.5); } } // we could count the over/underflows ? /* transformed into "inline" - moved to dsp.h int ConvFloatToS16(float_buff *Float, s16_buff *S16, float Gain) { int err=S16->EnsureSpace(Float->Len); if(err) return -1; ConvFloatToS16(Float->Data,S16->Data,Float->Len,Gain); S16->Len=Float->Len; return 0; } */ void ConvU8toFloat(unsigned char *U8, float *Float, int Len, float Gain) { for(; Len; Len--) (*Float++)=((int)(*U8++)-128)*Gain; } int ConvU8toFloat(unsigned char *U8, float_buff *Float, int Len, float Gain) { int err=Float->EnsureSpace(Len); if(err) return -1; ConvU8toFloat(U8,Float->Data,Len,Gain); Float->Len=Len; return 0; } // ---------------------------------------------------------------------------- // other converts void ConvCmpxToPower(fcmpx *Inp, int Len, float *Out) { for(; Len; Len--) (*Out++)=Power(*Inp++); } int ConvCmpxToPower(fcmpx_buff *Input, float_buff *Output) { int err=Output->EnsureSpace(Input->Len); if(err) return err; ConvCmpxToPower(Input->Data,Input->Len,Output->Data); Output->Len=Input->Len; return 0; } void ConvCmpxToAmpl(fcmpx *Inp, int Len, float *Out) { for(; Len; Len--) (*Out++)=sqrt(Power(*Inp++)); } int ConvCmpxToAmpl(fcmpx_buff *Input, float_buff *Output) { int err=Output->EnsureSpace(Input->Len); if(err) return err; ConvCmpxToAmpl(Input->Data,Input->Len,Output->Data); Output->Len=Input->Len; return 0; } void ConvCmpxToPhase(fcmpx *Inp, int Len, float *Out) { for(; Len; Len--) (*Out++)=Phase(*Inp++); } int ConvCmpxToPhase(fcmpx_buff *Input, float_buff *Output) { int err=Output->EnsureSpace(Input->Len); if(err) return err; ConvCmpxToPhase(Input->Data,Input->Len,Output->Data); Output->Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // Pulse noise limiter PulseLimiter::PulseLimiter() { Tap=NULL; } PulseLimiter::~PulseLimiter() { free(Tap); } void PulseLimiter::Free(void) { free(Tap); Tap=NULL; } int PulseLimiter::Preset(int TapLen, float LimitThres) { Len=TapLen; Thres=LimitThres*LimitThres; if(ReallocArray(&Tap,Len)) return -1; ClearArray(Tap,Len); Ptr=0; PwrSum=0.0; return 0; } int PulseLimiter::Process(float *Inp, int InpLen, float *Out) { int i,o; double Lim; for(i=0; i=Len) Ptr-=Len; o=Ptr+(Len/2); if(o>=Len) o-=Len; Lim=Thres*PwrSum/Len; if(Tap[o]*Tap[o]<=Lim) Out[i]=Tap[o]; else { if(Tap[o]>0.0) Out[i]=sqrt(Lim); else Out[i]=(-sqrt(Lim)); } } for(PwrSum=0.0, i=0; iLen); if(err) return -1; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // Signal level monitor LevelMonitor::LevelMonitor() { } LevelMonitor::~LevelMonitor() { } int LevelMonitor::Preset(float Integ, float Range) { LowPass2Coeff(Integ,W1,W2,W5); MaxSqr=Range*Range; PwrMid=0.0; PwrOut=0.0; RMS=0.0; OutOfRangeMid=0.0; OutOfRange=0.0; return 0; } int LevelMonitor::Process(float *Inp, int Len) { int i,Out; double Sqr,Sum; if(Len<=0) return 0; for(Sum=0.0,Out=0,i=0; iMaxSqr); } LowPass2(Sum/Len,PwrMid,PwrOut,W1,W2,W5); LowPass2((float)Out/Len,OutOfRangeMid,OutOfRange,W1,W2,W5); if(OutOfRange<0.0) OutOfRange=0.0; if(PwrOut<=0.0) RMS=0.0; else RMS=sqrt(PwrOut); return 0; } int LevelMonitor::Process(float_buff *Input) { return Process(Input->Data,Input->Len); } // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer MixerAutoLevel::MixerAutoLevel() { MinMS=0.01; MaxMS=0.05; IntegLen=8000; PeakHold=4000; MinHold=800; MinLevel=0; MaxLevel=100; AdjStep=1; Level=75; Hold=(-IntegLen); AverMS=0.0; } int MixerAutoLevel::Process(float *Inp, int InpLen) { double MS=Power(Inp,InpLen)/IntegLen; double W=1.0-((double)InpLen)/IntegLen; AverMS = AverMS*W + MS; Hold+=InpLen; if(HoldMaxMS) { Level-=AdjStep; if(LevelMaxLevel) Level=MaxLevel; Hold=0; return 1; } return 0; } // ---------------------------------------------------------------------------- void LowPass2(fcmpx *Inp, dcmpx *Mid, dcmpx *Out, float W1, float W2, float W5) { double Sum, Diff; // printf("\n[LowPass2] %6.3f %6.3f %6.3f",Inp->re,Mid->re,Out->re); Sum=Mid->re+Out->re; Diff=Mid->re-Out->re; Mid->re+=W2*Inp->re-W1*Sum; Out->re+=W5*Diff; // printf(" => %6.3f %6.3f\n",Mid->re,Out->re); Sum=Mid->im+Out->im; Diff=Mid->im-Out->im; Mid->im+=W2*Inp->im-W1*Sum; Out->im+=W5*Diff; } void LowPass2(dcmpx *Inp, dcmpx *Mid, dcmpx *Out, float W1, float W2, float W5) { double Sum, Diff; // printf("[LowPass2] %6.3f %6.3f %6.3f",Inp->re,Mid->re,Out->re); Sum=Mid->re+Out->re; Diff=Mid->re-Out->re; Mid->re+=W2*Inp->re-W1*Sum; Out->re+=W5*Diff; // printf(" => %6.3f %6.3f\n",Mid->re,Out->re); Sum=Mid->im+Out->im; Diff=Mid->im-Out->im; Mid->im+=W2*Inp->im-W1*Sum; Out->im+=W5*Diff; } // ---------------------------------------------------------------------------- // periodic low pass PeriodLowPass2::PeriodLowPass2() { TapMid=NULL; TapOut=NULL; } PeriodLowPass2::~PeriodLowPass2() { free(TapMid); free(TapOut); Output.Free(); } void PeriodLowPass2::Free(void) { free(TapMid); TapMid=NULL; free(TapOut); TapOut=NULL; } int PeriodLowPass2::Preset(int Period, float IntegLen) { int i; Len=Period; if(ReallocArray(&TapMid,Len)) goto Error; if(ReallocArray(&TapOut,Len)) goto Error; for(i=0; i=Len) TapPtr=0; return 0; } int PeriodLowPass2::Process(float *Inp, int InpLen, float *Out) { int i,batch; for(i=0; i=Len) TapPtr=0; } return 0; } int PeriodLowPass2::Process(float_buff *Input) { int err=Output.EnsureSpace(Input->Len); if(err) return -1; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but complexity very low // and independent on the integration time BoxFilter::BoxFilter() { Tap=NULL; } BoxFilter::~BoxFilter() { free(Tap); } void BoxFilter::Free(void) { free(Tap); Tap=NULL; Output.Free(); } int BoxFilter::Preset(int BoxLen) { int i; if(ReallocArray(&Tap,BoxLen)) return -1; for(i=0; i=Len) TapPtr=0; } for(Sum=0, i=0; iLen); if(err) return err; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } CmpxBoxFilter::CmpxBoxFilter() { Tap=NULL; } CmpxBoxFilter::~CmpxBoxFilter() { free(Tap); } void CmpxBoxFilter::Free(void) { free(Tap); Tap=NULL; Output.Free(); } int CmpxBoxFilter::Preset(int BoxLen) { int i; if(ReallocArray(&Tap,BoxLen)) return -1; for(i=0; i=Len) TapPtr=0; } for(Sum.re=Sum.im=0.0, i=0; iLen); if(err) return err; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // FIR filter with a given shape FirFilter::FirFilter() { Tap=NULL; ExternShape=1; } FirFilter::~FirFilter() { free(Tap); if(!ExternShape) free(Shape); } void FirFilter::Free(void) { free(Tap); Tap=NULL; if(!ExternShape) free(Shape); Shape=NULL; Output.Free(); } int FirFilter::Preset(int FilterLen, float *FilterShape) { int i; if(ReallocArray(&Tap,FilterLen)) return -1; for(i=0; i=Len) TapPtr=0; for(Sum=0,s=0,t=TapPtr; tLen); if(err) return err; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // a pair of FIR filters. for quadrature split & decimate // the decimation rate must be an integer QuadrSplit::QuadrSplit() { ExternShape=1; } QuadrSplit::~QuadrSplit() { if(!ExternShape) { free(ShapeI); free(ShapeQ); } } void QuadrSplit::Free(void) { Tap.Free(); if(!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI=NULL; ShapeQ=NULL; Output.Free(); } int QuadrSplit::Preset(int FilterLen, float *FilterShape_I, float *FilterShape_Q, int DecimateRate) { Len=FilterLen; if(!ExternShape) { free(ShapeI); free(ShapeQ); } ShapeI=FilterShape_I; ShapeQ=FilterShape_Q; ExternShape=1; Tap.EnsureSpace(Len); Tap.Len=Len; ClearArray(Tap.Data,Tap.Len); Rate=DecimateRate; return 0; } int QuadrSplit::ComputeShape(float LowOmega,float UppOmega, double (*Window)(double)) { if(ExternShape) { ShapeI=NULL; ShapeQ=NULL; ExternShape=0; } if(ReallocArray(&ShapeI,Len)) return -1; if(ReallocArray(&ShapeQ,Len)) return -1; WinFirI(LowOmega,UppOmega,ShapeI,Len,Window); WinFirQ(LowOmega,UppOmega,ShapeQ,Len,Window); return 0; } int QuadrSplit::Process(float_buff *Input) { int err,i,s,t,o,l; double SumI,SumQ; float *Inp; fcmpx *Out; int InpLen; InpLen=Input->Len; err=Tap.EnsureSpace(Tap.Len+InpLen); if(err) return err; CopyArray(Tap.Data+Tap.Len,Input->Data,InpLen); // printf("QuadrSplit: InpLen=%d, Tap.Len=%d",InpLen,Tap.Len); Tap.Len+=InpLen; Inp=Tap.Data; // printf(" -> %d",Tap.Len); err=Output.EnsureSpace(InpLen/Rate+2); if(err) return err; Out=Output.Data; for(l=Tap.Len-Len,o=0,i=0; i Tap.Len=%d\n",Tap.Len); return 0; /* if(InpLenLen; err=Output.EnsureSpace(InpLen*Rate); if(err) return err; Inp=Input->Data; Out=Output.Data; Output.Len=InpLen*Rate; for(o=0,i=0; i=2*M_PI) Phase-=2*M_PI; } return InpLen; } int CmpxMixer::ProcessFast(float *InpI, float *InpQ, int InpLen, float *OutI, float *OutQ) { int i; double dI,dQ,I,Q,nI,nQ, N; dI=cos(Omega); dQ=sin(Omega); I=cos(Phase); Q=sin(Phase); for(i=0; i=2*M_PI) Phase-=2*M_PI; } return InpLen; } int CmpxMixer::ProcessFast(fcmpx *Inp, int InpLen, fcmpx *Out) { int i; double dI,dQ,I,Q,nI,nQ, N; dI=cos(Omega); dQ=sin(Omega); I=cos(Phase); Q=sin(Phase); for(i=0; iLen); if(err) return err; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } int CmpxMixer::ProcessFast(fcmpx_buff *Input) { int err=Output.EnsureSpace(Input->Len); if(err) return err; ProcessFast(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // FM demodulator (phase rotation speed meter) FMdemod::FMdemod() { PrevPhase=0.0; RefOmega=0.0; } int FMdemod::Preset(double CenterOmega) { RefOmega=CenterOmega; return 0; } int FMdemod::Process(float *InpI, float *InpQ, int InpLen, float *Out) { int i; float Phase,PhaseDiff; for(i=0; i=M_PI) PhaseDiff-=2*M_PI; else if(PhaseDiff<(-M_PI)) PhaseDiff+=2*M_PI; Out[i]=PhaseDiff; PrevPhase=Phase; } return InpLen; } int FMdemod::Process(fcmpx *Inp, int InpLen, float *Out) { int i; float Phase,PhaseDiff; for(i=0; i=M_PI) PhaseDiff-=2*M_PI; else if(PhaseDiff<(-M_PI)) PhaseDiff+=2*M_PI; Out[i]=PhaseDiff; PrevPhase=Phase; } return InpLen; } int FMdemod::Process(fcmpx_buff *Input) { int err=Output.EnsureSpace(Input->Len); if(err) return err; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. RateConvLin::RateConvLin() { PrevSample=0; OutPhase=0; OutStep=1.0; } void RateConvLin::SetOutVsInp(float OutVsInp) { OutStep=1.0/OutVsInp; } void RateConvLin::SetInpVsOut(float InpVsOut) { OutStep=InpVsOut; } int RateConvLin::Process(float_buff *Input) { int err,i,o; float *Inp,*Out; int InpLen; Inp=Input->Data; InpLen=Input->Len; err=Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if(err) return err; Out=Output.Data; for(o=0; OutPhase<0; ) { Out[o++]=Inp[0]*(1.0+OutPhase)-OutPhase*PrevSample; OutPhase+=OutStep; } for(i=0; i<(InpLen-1); ) { if(OutPhase>=1.0) { OutPhase-=1.0; i++; } else { Out[o++]=Inp[i]*(1.0-OutPhase)+Inp[i+1]*OutPhase; OutPhase+=OutStep; } } Output.Len=o; PrevSample=Inp[i]; OutPhase-=1.0; return 0; } // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 RateConvQuadr::RateConvQuadr() { int i; for(i=0; i<4; i++) Tap[i]=0; OutStep=1.0; OutPhase=0; TapPtr=0; } void RateConvQuadr::SetOutVsInp(float OutVsInp) { OutStep=1.0/OutVsInp; } void RateConvQuadr::SetInpVsOut(float InpVsOut) { OutStep=InpVsOut; } int RateConvQuadr::Process(float *Inp, int InpLen, float *Out, int MaxOutLen, int *OutLen) { int i,o,t; float Ref0,Ref1,Diff0,Diff1; for(o=i=0; (i=1.0) { Tap[TapPtr]=(*Inp++); i++; TapPtr=(TapPtr+1)&3; OutPhase-=1.0; } else { t=TapPtr; Diff0=(Tap[t^2]-Tap[t])/2; Ref1=Tap[t^2]; t=(t+1)&3; Diff1=(Tap[t^2]-Tap[t])/2; Ref0=Tap[t]; (*Out++)=Ref0*(1.0-OutPhase)+Ref1*OutPhase // linear piece -(Diff1-Diff0)*OutPhase*(1.0-OutPhase)/2; // quadr. piece o++; OutPhase+=OutStep; } } (*OutLen)=o; return i; } int RateConvQuadr::Process(float_buff *Input) { int err,i,o,t; float Ref0,Ref1,Diff0,Diff1; float *Inp,*Out; int InpLen; Inp=Input->Data; InpLen=Input->Len; err=Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if(err) return err; Out=Output.Data; for(o=i=0; i=1.0) { Tap[TapPtr]=(*Inp++); i++; TapPtr=(TapPtr+1)&3; OutPhase-=1.0; } else { t=TapPtr; Diff0=(Tap[t^2]-Tap[t])/2; Ref1=Tap[t^2]; t=(t+1)&3; Diff1=(Tap[t^2]-Tap[t])/2; Ref0=Tap[t]; (*Out++)=Ref0*(1.0-OutPhase)+Ref1*OutPhase // linear piece -(Diff1-Diff0)*OutPhase*(1.0-OutPhase)/2; // quadr. piece o++; OutPhase+=OutStep; } } Output.Len=o; return 0; } // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters RateConvBL::RateConvBL() { Tap=NULL; Shape=NULL; ExternShape=1; } RateConvBL::~RateConvBL() { Free(); } void RateConvBL::Free(void) { int s; free(Tap); Tap=NULL; if(ExternShape) return; if(Shape) { for(s=0; sData; InpLen=Input->Len; err=Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if(err) return err; Out=Output.Data; if((Len+InpLen)>TapSize) { Tap=(float*)realloc(Tap,(Len+InpLen)*sizeof(float)); if(Tap==NULL) return -1; TapSize=Len+InpLen; } memcpy(Tap+Len,Inp,InpLen*sizeof(float)); for(o=i=0; i=1.0) { OutPhase-=1.0; i++; } else { idx=(int)floor(OutPhase*ShapeNum); shape=Shape[idx]; for(Sum=0.0,t=0; tData; InpLen=Input->Len; err=Output.EnsureSpace((int)ceil(InpLen/OutStep)+2); if(err) return err; Out=Output.Data; if((Len+InpLen)>TapSize) { Tap=(float*)realloc(Tap,(Len+InpLen)*sizeof(float)); if(Tap==NULL) return -1; TapSize=Len+InpLen; } memcpy(Tap+Len,Inp,InpLen*sizeof(float)); for(o=i=0; i=1.0) { OutPhase-=1.0; i++; } else { idx=(int)floor(OutPhase*ShapeNum); d=OutPhase*ShapeNum-idx; shape=Shape[idx]; for(Sum0=0.0,t=0; t=ShapeNum) { idx=0; i++; } shape=Shape[idx]; for(Sum1=0.0,t=0; tWindowLen) return -1; Len=WindowLen; Dist=SlideDist; if(ReallocArray(&Buff,Len)) return -1; for(i=0; iData; int InpLen=Input->Len; int i,len,err; Output.Len=0; while(InpLen>0) { len=imin(Len-Ptr,InpLen); memcpy(Buff+Ptr,Inp,len*sizeof(fcmpx)); Ptr+=len; Inp+=len; InpLen-=len; if(Ptr>=Len) { len=Output.Len; err=Output.EnsureSpace(len+Len); if(err) return err; if(Window==NULL) memcpy(Output.Data,Buff,Len*sizeof(fcmpx)); else for(i=0; iWindowLen) return -1; Len=WindowLen; Dist=SlideDist; if(ReallocArray(&Buff,Len)) return -1; for(i=0; iLen; i+=Len) { err=Output.EnsureSpace(Output.Len+Dist); if(err) return err; Process(Input->Data+i,Output.Data+Output.Len); Output.Len+=Dist; } return 0; } int CmpxOverlapWindow::Process(fcmpx *Input) { int err; err=Output.EnsureSpace(Dist); if(err) return err; Process(Input,Output.Data); Output.Len=Dist; return 0; } void CmpxOverlapWindow::Process(fcmpx *Inp, fcmpx *Out) { int i; if(Window==NULL) { for(i=0; i=InpTapLen) InpTapPtr=0; diff+=(InpTap[InpTapPtr]=(*Inp++)); DiffTapPtr=(DiffTapPtr+1)&3; LowPass2(diff*diff,DiffInteg0[DiffTapPtr],DiffInteg[DiffTapPtr],W1,W2,W5); if(DiffTapPtr==BitPtr) { for(Sum=0,t=0; t<4; t++) Sum+=DiffInteg[t]; t=DiffTapPtr; SumI = DiffInteg[t]-DiffInteg[t^2]; t=(t+1)&3; SumQ = DiffInteg[t]-DiffInteg[t^2]; if((Sum==0.0)||((SyncConfid=(SumI*SumI+SumQ*SumQ)/(Sum*Sum))==0.0)) { (*BitOut++)=0; (*IbitOut++)=0; o++; continue; } phase=atan2(-SumQ,-SumI)*(4/(2*M_PI)); LowPass2(phase-SyncPhase,SyncDrift0,SyncDrift,W1,W2,W5); SyncPhase=phase; if(phase>0.52) { step=1; SyncPhase-=1.0; } else if(phase<(-0.52)) { step=(-1); SyncPhase+=1.0; } else step=0; float Samp[5],bit,ibit,dx; int p; p=InpTapPtr-4*IntegLen-2; if(p<0) p+=InpTapLen; for(t=0; t<5; t++) { Samp[t]=InpTap[p++]; if(p>=InpTapLen) p=0; } dx=phase-0.5; // bit=Samp[2]+dx*(Samp[2]-Samp[1]); // linear interpolation bit=Samp[2]*(1.0+dx)-Samp[1]*dx // or quadratic +((Samp[3]-Samp[1])-(Samp[2]-Samp[0]))/2*dx*(1.0+dx)/2; ibit=Samp[4]+dx*(Samp[4]-Samp[3]); //linear interpolation is enough (*BitOut++)=bit; (*IbitOut++)=ibit; o++; } else if(DiffTapPtr==(BitPtr^2)) { BitPtr=(BitPtr+step)&3; step=0; } } (*OutLen)=o; return i; } float DiffBitSync4::GetSyncConfid() { return 4*SyncConfid; } float DiffBitSync4::GetSyncDriftRate() { return SyncDrift/4; } // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter BitSlicer::BitSlicer(int IntegBits) { int i; TapLen=IntegLen=IntegBits; Tap=(float *)malloc(TapLen*sizeof(float)); for(i=0; i0; LowPass2(Bit,Sum0[l],Sum[l],W1,W2,W5); LowPass2(Bit*Bit,SumSq0[l],SumSq[l],W1,W2,W5); Noise[l]=sqrt(SumSq[l]-Sum[l]*Sum[l]); if(Noise[0]+Noise[1]<=0) OptimThres=0; else OptimThres=(Sum[0]*Noise[1]+Sum[1]*Noise[0])/(Noise[0]+Noise[1]); soft=Tap[TapPtr]-OptimThres; // we could do a better soft-decision if(Bit*PrevBit<0) { LowPass2(PrevIBit,AmplAsym0,AmplAsym,W1,W2,W5); if(Bit>0) PrevIBit=(-PrevIBit); LowPass2(PrevIBit,TimeAsym0,TimeAsym,W1,W2,W5); } (*OutBits++)=soft; PrevBit=Bit; PrevIBit=IBits[i]; Tap[TapPtr]=Bit; TapPtr++; if(TapPtr>=TapLen) TapPtr=0; } return InpLen; } float BitSlicer::GetSigToNoise() { return Noise[1]>0 ? (Sum[1]-OptimThres)/Noise[1] : 0.0; } float BitSlicer::GetAmplAsym() { float Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*AmplAsym/Sweep : 0.0; } float BitSlicer::GetTimeAsym() { float Sweep=Sum[1]-Sum[0]; return Sweep>0 ? 2*TimeAsym/Sweep : 0.0; } // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. HDLCdecoder::HDLCdecoder(int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)) { MinLen=minlen; MaxLen=maxlen; RxDiff=diff; RxInvert=invert; ChanId=chan; FrameHandler=handler; Buff=(char *)malloc(MaxLen); Len=(-1); PrevLev=0; ShiftReg=0; BitCount=0; Count1s=0; AllFrameCount=0; BadFrameCount=0; } HDLCdecoder::~HDLCdecoder() { free(Buff); } int HDLCdecoder::Process(float *Inp, int InpLen) { int i,lev,bit,Flag; for(i=0; i0; bit=(lev^(PrevLev&RxDiff))^RxInvert; PrevLev=lev; ShiftReg=(ShiftReg>>1)|(bit<<7); BitCount+=1; Flag=0; if(bit) Count1s+=1; else { if(Count1s>=7) Len=(-1); else if(Count1s==6) Flag=1; else if(Count1s==5) { ShiftReg<<=1; BitCount-=1; } Count1s=0; } if(Flag) { if((Len>=MinLen)&&(BitCount==8)) (*FrameHandler)(ChanId,Buff,Len); Len=0; BitCount=0; } else if(Len>=0) { if(BitCount==8) { if(Len>8)^AX25CRCtable[idx]; } CRC^=0xFFFF; return CRC; } // ---------------------------------------------------------------------------- // radix-2 FFT // constructor r2FFT::r2FFT() { BitRevIdx=NULL; Twiddle=NULL; /* Window=NULL; */ } // destructor: free twiddles, bit-reverse lookup and window tables r2FFT::~r2FFT() { free(BitRevIdx); free(Twiddle); /* free(Window); */ } void r2FFT::Free(void) { free(BitRevIdx); BitRevIdx=NULL; free(Twiddle); Twiddle=NULL; } // .......................................................................... // a radix-2 FFT bufferfly inline void r2FFT::FFTbf(fcmpx &x0, fcmpx &x1, dcmpx &W) { fcmpx x1W; x1W.re=x1.re*W.re+x1.im*W.im; // x1W.re=x1.re*W.re-x1.im*W.im; x1W.im=(-x1.re*W.im)+x1.im*W.re; // x1W.im=x1.re*W.im+x1.im*W.re; x1.re=x0.re-x1W.re; x1.im=x0.im-x1W.im; x0.re=x0.re+x1W.re; x0.im=x0.im+x1W.im; } inline void r2FFT::FFTbf(dcmpx &x0, dcmpx &x1, dcmpx &W) { dcmpx x1W; x1W.re=x1.re*W.re+x1.im*W.im; // x1W.re=x1.re*W.re-x1.im*W.im; x1W.im=(-x1.re*W.im)+x1.im*W.re; // x1W.im=x1.re*W.im+x1.im*W.re; x1.re=x0.re-x1W.re; x1.im=x0.im-x1W.im; x0.re=x0.re+x1W.re; x0.im=x0.im+x1W.im; } // 2-point FFT inline void r2FFT::FFT2(dcmpx &x0, dcmpx &x1) { dcmpx x1W; x1W.re=x1.re; x1W.im=x1.im; x1.re=x0.re-x1.re; x1.im=x0.im-x1.im; x0.re+=x1W.re; x0.im+=x1W.im; } inline void r2FFT::FFT2(fcmpx &x0, fcmpx &x1) { fcmpx x1W; x1W.re=x1.re; x1W.im=x1.im; x1.re=x0.re-x1.re; x1.im=x0.im-x1.im; x0.re+=x1W.re; x0.im+=x1W.im; } // 4-point FFT // beware: these depend on the convention for the twiddle factors ! inline void r2FFT::FFT4(fcmpx &x0, fcmpx &x1, fcmpx &x2, fcmpx &x3) { dcmpx x1W; x1W.re=x2.re; x1W.im=x2.im; x2.re=x0.re-x1W.re; x2.im=x0.im-x1W.im; x0.re=x0.re+x1W.re; x0.im=x0.im+x1W.im; x1W.re=x3.im; x1W.im=(-x3.re); x3.re=x1.re-x1W.re; x3.im=x1.im-x1W.im; x1.re=x1.re+x1W.re; x1.im=x1.im+x1W.im; } inline void r2FFT::FFT4(dcmpx &x0, dcmpx &x1, dcmpx &x2, dcmpx &x3) { dcmpx x1W; x1W.re=x2.re; x1W.im=x2.im; x2.re=x0.re-x1W.re; x2.im=x0.im-x1W.im; x0.re=x0.re+x1W.re; x0.im=x0.im+x1W.im; x1W.re=x3.im; x1W.im=(-x3.re); x3.re=x1.re-x1W.re; x3.im=x1.im-x1W.im; x1.re=x1.re+x1W.re; x1.im=x1.im+x1W.im; } // .......................................................................... // bit reverse (in place) the sequence (before the actuall FTT) void r2FFT::Scramble(fcmpx x[]) { int idx,ridx; fcmpx tmp; for(idx=0; idxidx) { tmp=x[idx]; x[idx]=x[ridx]; x[ridx]=tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } // bit reverse the sequence - double precision void r2FFT::Scramble(dcmpx x[]) { int idx,ridx; dcmpx tmp; for(idx=0; idxidx) { tmp=x[idx]; x[idx]=x[ridx]; x[ridx]=tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } // Preset for given processing size int r2FFT::Preset(int size) { int err,idx,ridx,mask,rmask; double phase; if(!PowerOf2(size)) goto Error; Size=size; err=ReallocArray(&BitRevIdx,Size); if(err) goto Error; err=ReallocArray(&Twiddle,Size); if(err) goto Error; for(idx=0; idx %6.4f => %6.4f %6.4f\n", idx,phase,Twiddle[idx].re,Twiddle[idx].im); */ } for(ridx=0,idx=0; idx>=1,rmask<<=1) { if(idx&mask) ridx|=rmask; } BitRevIdx[idx]=ridx; /* printf("%04x %04x\n",idx,ridx); */ } // free(Window); Window=NULL; WinInpScale=1.0/Size; WinOutScale=0.5; return 0; Error: Free(); return -1; } // compute the window, set input/output scaling /* int r2FFT::SetWindow(double (*NewWindow)(double phase), double InpScale, double OutScale) { int idx; if(NewWindow==NULL) { free(Window); Window=NULL; } else { Window=(double *)realloc(Window,Size*sizeof(double)); if(Window==NULL) return -1; for(idx=0; idx>=1, GroupHalfSize<<=1) for(Group=0,Bf=0; Group>=1, GroupHalfSize<<=1) for(Group=0,Bf=0; Groupoutput delay longer. SlideWinFFT::SlideWinFFT() { SlideBuff=NULL; FFTbuff=NULL; Window=NULL; ExternWindow=1; } SlideWinFFT::~SlideWinFFT() { free(SlideBuff); free(FFTbuff); if(!ExternWindow) free(Window); } void SlideWinFFT::Free(void) { free(SlideBuff); SlideBuff=NULL; free(FFTbuff); FFTbuff=NULL; if(!ExternWindow) free(Window); Window=NULL; ExternWindow=1; Output.Free(); } int SlideWinFFT::Preset(int size, int step, float *window) { int err,i; Size=size; SizeMask=Size-1; err=FFT.Preset(Size); if(err) goto Error; if(!ExternWindow) { free(Window); ExternWindow=1; } Window=window; err=ReallocArray(&FFTbuff,Size); if(err) goto Error; err=ReallocArray(&SlideBuff,Size); if(err) goto Error; for(i=0; iData; InpLen=Input->Len; Output.Len=0; while(InpLen) { for(i=len=imin(InpLen,Left); i; i--) { SlideBuff[SlidePtr++]=(*Inp++); SlidePtr&=SizeMask; } InpLen-=len; Left-=len; if(Left==0) { Slide^=1; Left=Dist; if(Slide) { for(t=0,i=SlidePtr; iData; InpLen=Input->Len; Output.Len=0; while(InpLen) { for(i=len=imin(InpLen,Left); i; i--) { SlideBuff[SlidePtr++]=(*Inp++); SlidePtr&=SizeMask; } InpLen-=len; Left-=len; if(Left==0) { Slide^=1; Left=Dist; if(Slide) { for(t=0,i=SlidePtr; i #include #include // ---------------------------------------------------------------------------- // float/double/other-complex type template struct Cmpx { type re,im; } ; typedef Cmpx fcmpx; typedef Cmpx dcmpx; // Some complex operators // at least with the BC++ they carry some overhead because // a function is always called instead of making the code inline. template inline void operator +=(Cmpx &Dst, Cmpx &Src) { Dst.re+=Src.re; Dst.im+=Src.im; } template inline void operator -=(Cmpx &Dst, Cmpx &Src) { Dst.re-=Src.re; Dst.im-=Src.im; } template inline void operator *=(Cmpx &Dst, num Src) { Dst.re*=Src; Dst.im*=Src; } template inline void operator /=(Cmpx &Dst, num Src) { Dst.re/=Src; Dst.im/=Src; } // scalar product of two vectors template inline double ScalProd(Cmpx &A, Cmpx &B) { return A.re*B.re+A.im*B.im; } template inline double ScalProd(typeA Ia, typeA Qa, Cmpx &B) { return Ia*B.re+Qa*B.im; } // complex multiply template inline void CmpxMultAxB(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.re=A.re*B.re-A.im*B.im; Dst.im=A.re*B.im+A.im*B.re; } template inline void CmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cmpx &A, Cmpx &B) { DstI=A.re*B.re-A.im*B.im; DstQ=A.re*B.im+A.im*B.re; } // complex multiply, second argument with a "star" (B.im is negated) template inline void CmpxMultAxBs(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.re=A.re*B.re+A.im*B.im; Dst.im=A.im*B.re-A.re*B.im; } // ---------------------------------------------------------------------------- // signed 16-bit format (standard 16-bit audio) typedef short s16; // ---------------------------------------------------------------------------- template inline int ReallocArray(type **Array, int Size) { (*Array)=(type *)realloc(*Array,Size*sizeof(type)); return (*Array)==NULL; } template inline int AllocArray(type **Array, int Size) { (*Array)=(type *)malloc(Size*sizeof(type)); return (*Array)==NULL; } template inline void ClearArray(type *Array, int Size) { memset(Array,0,Size*sizeof(type)); } template inline void CopyArray(type *Dst, type *Src, int Size) { memcpy(Dst,Src,Size*sizeof(type)); } template inline void MoveArray(type *Dst, type *Src, int Size) { memmove(Dst,Src,Size*sizeof(type)); } template int AllocArray2D(type ***Array, int Size1, int Size2) { int i; (*Array)=(type **)malloc(Size1*(sizeof(type *))); if((*Array)==NULL) return 1; for(i=0; i void FreeArray2D(type **Array, int Size1) { int i; for(i=0; i void ClearArray2D(type **Array, int Size1, int Size2) { int i; for(i=0; i class Seq { public: Seq(); ~Seq(); int EnsureSpace(int ReqSpace); // make sure that there is enough space void Free(void); // free space to save RAM when buffer is not in use int Space; // that much is allocated in *Data int Len; // that much is filled up type *Data; // contains Len elements } ; template Seq::Seq() { Data=NULL; Len=Space=0; } template Seq::~Seq() { free(Data); } template int Seq::EnsureSpace(int ReqSpace) { if(ReqSpace<=Space) return 0; Data=(type *)realloc(Data,ReqSpace*sizeof(type)); if(Data==NULL) { Space=Len=0; return -1; } Space=ReqSpace; return 0; } template void Seq::Free(void) { free(Data); Data=NULL; Space=Len=0; } typedef Seq float_buff; typedef Seq double_buff; typedef Seq fcmpx_buff; typedef Seq dcmpx_buff; // typedef Seq int16_buff; <- this doesn't work - why ?! typedef Seq s16_buff; typedef Seq char_buff; // ---------------------------------------------------------------------------- // First-In First-Out pipes template class FIFO { public: FIFO(); ~FIFO(); int Preset(int Max); void Free(void); void Clear(void); int Inp(type Elem); int Out(type &Elem); int InpReady(void); int OutReady(void); private: type *Buff; int Size; int Rd,Wr; } ; template FIFO::FIFO() { Buff=NULL; } template FIFO::~FIFO() { free(Buff); } template void FIFO::Free(void) { free(Buff); Buff=NULL; } template int FIFO::Preset(int Max) { Size=Max+1; if(ReallocArray(&Buff,Size)) return -1; Rd=0; Wr=0; return 0; } template void FIFO::Clear(void) { Rd=Wr; } template int FIFO::Inp(type Elem) { int w=Wr; Buff[w]=Elem; w+=1; if(w>=Size) w=0; if(w==Rd) return -1; Wr=w; return 0; } template int FIFO::Out(type &Elem) { if(Rd==Wr) return -1; Elem=Buff[Rd]; Rd+=1; if(Rd>=Size) Rd=0; return 0; } template int FIFO::OutReady(void) { return (Wr>=Rd) ? Wr-Rd : Wr-Rd+Size; } template int FIFO::InpReady(void) { return (Rd>Wr) ? Rd-Wr-1 : Rd-Wr+Size-1; } typedef FIFO char_fifo; // ---------------------------------------------------------------------------- // power of single and complex values and sequences of these inline double Power(float X) { return X*X; } inline double Power(double X) { return X*X; } inline double Power(float I, float Q) { return I*I + Q*Q; } inline double Power(double I, double Q) { return I*I + Q*Q; } inline double Power(fcmpx X) { return X.re*X.re+X.im*X.im; } inline double Power(dcmpx X) { return X.re*X.re+X.im*X.im; } /* template double Power(type *X, int Len) { double Sum; for(Sum=0.0; Len; Len--,X++) Sum+=(*X)*(*X); return Sum; } template double Power(type *I, type *Q, int Len) { double Sum; for(Sum=0.0; Len; Len--,I++,Q++) Sum+=(*I)*(*I)+(*Q)*(*Q); return Sum; } template double Power(Cmpx *X, int Len) { double Sum; for(Sum=0.0; Len; Len--,X++) Sum+=(X->re)*(X->re)+(X->im)*(X->im); return Sum; } */ double Power(float *X, int Len); double Power(double *X, int Len); double Power(float *I, double *Q, int Len); double Power(double *I, float *Q, int Len); double Power(fcmpx *X, int Len); double Power(dcmpx *X, int Len); inline double Power(float_buff *buff) { return Power(buff->Data,buff->Len); } inline double Power(fcmpx_buff *buff) { return Power(buff->Data,buff->Len); } inline double Power(dcmpx_buff *buff) { return Power(buff->Data,buff->Len); } // Amplitude calculations inline double Ampl(float I, float Q) { return sqrt(I*I+Q*Q); } inline double Ampl(double I, double Q) { return sqrt(I*I+Q*Q); } inline double Ampl(fcmpx X) { return sqrt(X.re*X.re+X.im*X.im); } inline double Ampl(dcmpx X) { return sqrt(X.re*X.re+X.im*X.im); } // Phase calculation (output = <-PI..PI) ) inline double Phase(float I, float Q) { return atan2(Q,I); } inline double Phase(double I, double Q) { return atan2(Q,I); } inline double Phase(fcmpx X) { return atan2(X.im,X.re); } inline double Phase(dcmpx X) { return atan2(X.im,X.re); } // Phase normalization inline double PhaseNorm(double Phase) { if(Phase>=M_PI) return Phase-2*M_PI; if(Phase<(-M_PI)) return Phase+2*M_PI; return Phase; } // ---------------------------------------------------------------------------- // min./max. of integers inline int imin(int i1, int i2) { return i1i2 ? i1 : i2; } inline int imin(int i1, int i2, int i3) { return i1i2 ? (i1>i3 ? i1 : i3) : (i2>i3 ? i2 : i3); } // ---------------------------------------------------------------------------- // Extreme search, average, fitting double Average(float *Data, int Len); double Average(double *Data, int Len); int CountInRange(float *Data, int Len, float Low, float Upp); int CountInRange(double *Data, int Len, double Low, double Upp); inline int CountInRange(float_buff *Input, float Low, float Upp) { return CountInRange(Input->Data,Input->Len,Low,Upp); } inline double RMS(float *Data, int Len) { return sqrt(Power(Data,Len)/Len); } inline double RMS(double *Data, int Len) { return sqrt(Power(Data,Len)/Len); } inline double RMS(fcmpx *Data, int Len) { return sqrt(Power(Data,Len)/Len); } inline double RMS(dcmpx *Data, int Len) { return sqrt(Power(Data,Len)/Len); } inline double RMS(float_buff *Input) { return RMS(Input->Data,Input->Len); } inline double RMS(fcmpx_buff *Input) { return RMS(Input->Data,Input->Len); } inline double RMS(dcmpx_buff *Input) { return RMS(Input->Data,Input->Len); } template type FindMin(type *Data, int Len) { type Min; int i; Min=Data[0]; for(i=1; i type FindMin(type *Data, int Len, int &MinPos) { type Min; int i,pos; Min=Data[0]; pos=0; for(i=1; i type FindMax(type *Data, int Len) { type Max; int i; Max=Data[0]; for(i=1; iMax) Max=Data[i]; return Max; } template type FindMax(type *Data, int Len, int &MaxPos) { type Max; int i,pos; Max=Data[0]; pos=0; for(i=1; iMax) { Max=Data[i]; pos=i; } MaxPos=pos; return Max; } double FindMaxPower(fcmpx *Data, int Len); double FindMaxPower(fcmpx *Data, int Len, int &MaxPos); double FitPoly1(float *Data, int Len, double &A, double &B); double FitPoly1(double *Data, int Len, double &A, double &B); double FitPoly2(float *Data, int Len, double &A, double &B, double &C); double FitPoly2(double *Data, int Len, double &A, double &B, double &C); void FitPoly2(float Data[3], double &A, double &B, double &C); void FitPoly2(double Data[3], double &A, double &B, double &C); // ---------------------------------------------------------------------------- // "selective" average fit template int SelFitAver(type *Data, int Len, float SelThres, int Loops, double &Aver, double &RMS, int &Sel) { int i,loop,Incl,prev; double Sum,ErrSum,Lev,dLev,Diff,Thres; for(ErrSum=Sum=0.0,i=0; i int SelFitAver(Cmpx *Data, int Len, float SelThres, int Loops, Cmpx &Aver, double &RMS, int &Sel) { int i,loop,Incl,prev; dcmpx Sum,Lev,dLev; double ErrSum,Diff,Thres; for(ErrSum=0.0,Sum.re=Sum.im=0.0,i=0; i void WhiteNoise(type &X) { double Rand,Power,Phase; Rand=((double)rand()+1.0)/((double)RAND_MAX+1.0); Power=sqrt(-2*log(Rand)); Rand=(double)rand()/(double)RAND_MAX; Phase=2*M_PI*Rand; X=Power*cos(Phase); } template void CmpxWhiteNoise(Cmpx &X) { double Rand,Power,Phase; Rand=((double)rand()+1.0)/((double)RAND_MAX+1.0); Power=sqrt(-log(Rand)); Rand=(double)rand()/(double)RAND_MAX; Phase=2*M_PI*Rand; X.re=Power*cos(Phase); X.im=Power*sin(Phase); } /* void WhiteNoise(float *Data, double Rms); void WhiteNoise(double *Data, double Rms); void WhiteNoise(Cmpx *Data, double Rms); void WhiteNoise(Cmpx *Data, double Rms); void WhiteNoise(float *Data, int Len, double Rms); void WhiteNoise(double *Data, int Len, double Rms); void WhiteNoise(Cmpx *Data, int Len, double Rms); void WhiteNoise(Cmpx *Data, int Len, double Rms); */ // ---------------------------------------------------------------------------- // various window shapes (for the FFT and FIR filters) // these functions are supposed to be called with the argument "phase" // between -PI and +PI. Most (or even all) will return zero for input // euqal -PI or +PI. double WindowHamming(double phase); double WindowHanning(double phase); double WindowBlackman2(double phase); double WindowBlackman3(double phase); // ---------------------------------------------------------------------------- // FIR shape calculation for a flat response from FreqLow to FreqUpp void WinFirI(float LowOmega, float UppOmega, float *Shape, int Len, double (*Window)(double), float shift=0.0); void WinFirQ(float LowOmega, float UppOmega, float *Shape, int Len, double (*Window)(double), float shift=0.0); // ---------------------------------------------------------------------------- // convert 16-bit signed or 8-bit unsigned into floats void ConvS16toFloat(s16 *S16, float *Float, int Len, float Gain=1.0/32768.0); int ConvS16toFloat(s16 *S16, float_buff *Float, int Len, float Gain=1.0/32768.0); void ConvFloatToS16(float *Float, s16 *S16, int Len, float Gain=32768.0); inline int ConvFloatToS16(float_buff *Float, s16_buff *S16, float Gain=32768.0) { int err=S16->EnsureSpace(Float->Len); if(err) return -1; ConvFloatToS16(Float->Data,S16->Data,Float->Len,Gain); S16->Len=Float->Len; return 0; } void ConvU8toFloat(unsigned char *U8, float *Float, int Len, float Gain=1.0/128.0); int ConvU8toFloat(unsigned char *U8, float_buff *Float, int Len, float Gain=1.0/128.0); // ---------------------------------------------------------------------------- // other converts void ConvCmpxToPower(fcmpx *Inp, int InpLen, float *Out); int ConvCmpxToPower(fcmpx_buff *Input, float_buff *Output); void ConvCmpxToAmpl(fcmpx *Inp, int InpLen, float *Out); int ConvCmpxToAmpl(fcmpx_buff *Input, float_buff *Output); void ConvCmpxToPhase(fcmpx *Inp, int InpLen, float *Out); int ConvCmpxToPhase(fcmpx_buff *Input, float_buff *Output); // ---------------------------------------------------------------------------- // Pulse noise limiter class PulseLimiter { public: PulseLimiter(); ~PulseLimiter(); void Free(void); int Preset(int TapLen, float Limit=4.0); int Process(float *Inp, int InpLen, float *Out); int Process(float_buff *Input); float_buff Output; float RMS; private: int Len; float Thres; float *Tap; int Ptr; double PwrSum; } ; // ---------------------------------------------------------------------------- // Signal level monitor class LevelMonitor { public: LevelMonitor(); ~LevelMonitor(); int Preset(float Integ, float Range=0.75); int Process(float *Inp, int Len); int Process(float_buff *Input); double RMS; double OutOfRange; private: double PwrMid,PwrOut; double OutOfRangeMid; float MaxSqr; float W1,W2,W5; } ; // ---------------------------------------------------------------------------- // Automatic Gain/Level Control for the Mixer class MixerAutoLevel { public: MixerAutoLevel(); // ~MixerAutoLevel(); int Process(float *Inp, int InpLen); int Process(float_buff *Inp) { return Process(Inp->Data, Inp->Len); } public: int IntegLen; // mean power integration time [samples] float MinMS; // minimum acceptable average power float MaxMS; // maximum acceptable average power int PeakHold; // level holding time after a peak [samples] int MinHold; // minimal time between changing the mixer level [samples] int AdjStep; // mixer level adjusting step int MinLevel; // mimimum allowed mixer level int MaxLevel; // maximum allowed mixer level double AverMS; // average power of the input signal int Hold; // time counter for holding levels int Level; // actual mixer level } ; // ---------------------------------------------------------------------------- // Two-element IIR low pass filter struct LowPass2elem { double Mid,Out; } ; struct LowPass2weight { double W1,W2,W5; } ; // first calculate the coefficiants W1,W2 and W5 for given integration time template inline void LowPass2Coeff(typeLen IntegLen, typeW &W1, typeW &W2, typeW &W5) { W1=1.0/IntegLen; W2=2.0/IntegLen; W5=5.0/IntegLen; } template inline void LowPass2Coeff(typeLen IntegLen, LowPass2weight &Weight) { Weight.W1=1.0/IntegLen; Weight.W2=2.0/IntegLen; Weight.W5=5.0/IntegLen; } // then you can process samples template inline void LowPass2(typeInp Inp, typeOut &Mid, typeOut &Out, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum=Mid+Out; Diff=Mid-Out; Mid+=W2*Inp-W1*Sum; Out+=W5*Diff; } template inline void LowPass2(typeInp Inp, LowPass2elem &Elem, typeW W1, typeW W2, typeW W5) { double Sum, Diff; Sum=Elem.Mid+Elem.Out; Diff=Elem.Mid-Elem.Out; Elem.Mid+=W2*Inp-W1*Sum; Elem.Out+=W5*Diff; } template inline void LowPass2(typeInp Inp, LowPass2elem &Elem, LowPass2weight &Weight) { double Sum, Diff; Sum=Elem.Mid+Elem.Out; Diff=Elem.Mid-Elem.Out; Elem.Mid+=Weight.W2*Inp-Weight.W1*Sum; Elem.Out+=Weight.W5*Diff; } /* inline void LowPass2(float Inp, double &Mid, double &Out, float W1, float W2, float W5) { double Sum, Diff; Sum=Mid+Out; Diff=Mid-Out; Mid+=W2*Inp-W1*Sum; Out+=W5*Diff; } */ /* inline void LowPass2(double Inp, double *Mid, double *Out, float W1, float W2, float W5) { double Sum, Diff; Sum=(*Mid)+(*Out); Diff=(*Mid)-(*Out); (*Mid)+=W2*Inp-W1*Sum; (*Out)+=W5*Diff; } inline void LowPass2(float Inp, double *Mid, double *Out, float W1, float W2, float W5) { double Sum, Diff; Sum=(*Mid)+(*Out); Diff=(*Mid)-(*Out); (*Mid)+=W2*Inp-W1*Sum; (*Out)+=W5*Diff; } */ void LowPass2(dcmpx *Inp, dcmpx *Mid, dcmpx *Out, float W1, float W2, float W5); void LowPass2(fcmpx *Inp, dcmpx *Mid, dcmpx *Out, float W1, float W2, float W5); // ---------------------------------------------------------------------------- // periodic low pass class PeriodLowPass2 { public: PeriodLowPass2(); ~PeriodLowPass2(); void Free(void); int Preset(int Period, float IntegLen); int Process(float Inp, float &Out); int Process(float *Inp, int InpLen, float *Out); int Process(float_buff *Input); float_buff Output; private: int Len; double *TapMid,*TapOut; int TapPtr; float W1,W2,W5; } ; // ---------------------------------------------------------------------------- // a simple delay template class Delay { public: Delay(); ~Delay(); void Free(void); int Preset(int len); void Process(type *Inp, int InpLen, type *Out); int Process(Seq *Input); Seq Output; private: int Len; type *Tap; int TapPtr; } ; template Delay::Delay() { Tap=NULL; } template Delay::~Delay() { free(Tap); } template void Delay::Free(void) { free(Tap); Tap=NULL; } template int Delay::Preset(int DelayLen) { Len=DelayLen; if(ReallocArray(&Tap,Len)) return -1; ClearArray(Tap,Len); TapPtr=0; return 0; } template void Delay::Process(type *Inp, int InpLen, type *Out) { int i,batch; for(i=0; i=Len) TapPtr=0; } } template int Delay::Process(Seq *Input) { int err=Output.EnsureSpace(Input->Len); if(err) return -1; Process(Input->Data,Input->Len,Output.Data); Output.Len=Input->Len; return 0; } // ---------------------------------------------------------------------------- // DelayLine, like delay but more flexible // The idea is that we hold addressable history of at least MaxDelay // samples. // After each input batch is processed, the InpPtr points to the first sample // of this batch and we can address samples backwards upto MaxDelay. // For more optimal performace we allocate more RAM than just for MaxDelay. // Infact the allocated size (MaxSize) should be at least // MaxDelay plus the largest expected input length. template class DelayLine { public: DelayLine(); ~DelayLine(); void Free(void); int Preset(int MaxDelay, int MaxSize=0); int Process(type *Inp, int Len); int Process(Seq *Input); type *Line; // line storage int Delay; // how many (at least) backward samples are stored int LineSize; // allocated size int DataLen; // length of the valid data type *InpPtr; // first sample for the most recent processed batch int InpLen; // number of samples for the most recent input } ; template DelayLine::DelayLine() { Line=NULL; } template DelayLine::~DelayLine() { free(Line); } template void DelayLine::Free(void) { free(Line); Line=NULL; } template int DelayLine::Preset(int MaxDelay, int MaxSize) { LineSize=MaxSize; if(LineSize<(2*MaxDelay)) LineSize=2*MaxDelay; DataLen=MaxDelay; Delay=MaxDelay; if(ReallocArray(&Line,LineSize)) return -1; ClearArray(Line,LineSize); InpPtr=Line+DataLen; InpLen=0; return 0; } template int DelayLine::Process(type *Inp, int Len) { if((DataLen+Len)>LineSize) { MoveArray(Line,Line+DataLen-Delay,Delay); DataLen=Delay; } if((DataLen+Len)>LineSize) return -1; CopyArray(Line+DataLen,Inp,Len); InpPtr=Line+DataLen; InpLen=Len; DataLen+=Len; return 0; } template int DelayLine::Process(Seq *Input) { return Process(Input->Data,Input->Len); } // ---------------------------------------------------------------------------- // Low pass "moving box" FIR filter // very unpure spectral response but CPU complexity very low // and independent on the integration time class BoxFilter { public: BoxFilter(); ~BoxFilter(); void Free(void); int Preset(int BoxLen); int Process(float Inp, float &Out); int Process(float *Inp, int InpLen, float *Out); int Process(float_buff *Input); void Recalibrate(); float_buff Output; private: int Len; float *Tap; int TapPtr; double Sum; } ; class CmpxBoxFilter { public: CmpxBoxFilter(); ~CmpxBoxFilter(); void Free(void); int Preset(int BoxLen); int Process(fcmpx *Inp, int InpLen, fcmpx *Out); void Recalibrate(); int Process(fcmpx_buff *Input); fcmpx_buff Output; private: int Len; fcmpx *Tap; int TapPtr; dcmpx Sum; } ; // ---------------------------------------------------------------------------- // FIR filter with a given shape class FirFilter { public: FirFilter(); ~FirFilter(); void Free(void); int Preset(int FilterLen, float *FilterShape=(float*)NULL); int Process(float *Inp, int InpLen, float *Out); int Process(float_buff *Input); // Response(float Freq, float *Resp); int ComputeShape(float LowOmega, float UppOmega, double (*Window)(double)); // UseExternShape(float *shape); float_buff Output; private: int Len; // Tap/Shape length float *Shape; // Response shape int ExternShape; // that we are using an externally provided shape float *Tap; int TapPtr; } ; // ---------------------------------------------------------------------------- // a pair of FIR filters. quadrature split, decimate // the decimation rate must be integer class QuadrSplit { public: QuadrSplit(); ~QuadrSplit(); void Free(void); int Preset(int FilterLen, float *FilterShape_I, float *FilterShape_Q, int DecimateRate); int ComputeShape(float LowOmega, float UppOmega, double (*Window)(double)); // int Process(float *Inp, int InpLen, // float *OutI, float *OutQ, int MaxOutLen, int *OutLen); // int Process(float *Inp, int InpLen, // fcmpx *Out, int MaxOutLen, int *OutLen); int Process(float_buff *Input); fcmpx_buff Output; private: int Len; float_buff Tap; float *ShapeI, *ShapeQ; int ExternShape; int Rate; } ; // ---------------------------------------------------------------------------- // reverse of QuadrSplit: interpolates and combines the I/Q // back into 'real' signal. class QuadrComb { public: QuadrComb(); ~QuadrComb(); void Free(void); int Preset(int FilterLen, float *FilterShape_I, float *FilterShape_Q, int DecimateRate); int ComputeShape(float LowOmega, float UppOmega, double (*Window)(double)); int Process(fcmpx_buff *Input); float_buff Output; private: int Len; double *Tap; int TapPtr; float *ShapeI, *ShapeQ; int ExternShape; int Rate; } ; // ---------------------------------------------------------------------------- // complex mix with an oscilator (carrier) // here we could avoid computing sine/cos at every sample class CmpxMixer { public: CmpxMixer(); // ~CmpxMixer(); void Free(void); int Preset(double CarrierOmega); // int Process(float *InpI, float *InpQ, int InpLen, // float *OutI, float *OutQ); int ProcessFast(float *InpI, float *InpQ, int InpLen, float *OutI, float *OutQ); int Process(fcmpx *Inp, int InpLen, fcmpx *Out); int ProcessFast(fcmpx *Inp, int InpLen, fcmpx *Out); int Process(fcmpx_buff *Input); int ProcessFast(fcmpx_buff *Input); fcmpx_buff Output; public: double Phase,Omega; } ; // ---------------------------------------------------------------------------- // FM demodulator (phase rotation speed-meter) class FMdemod { public: FMdemod(); // ~FMdemod(); int Preset(double CenterOmega); int Process(float *InpI, float *InpQ, int InpLen, float *Out); int Process(fcmpx *Inp, int InpLen, float *Out); int Process(fcmpx_buff *Input); float_buff Output; private: float PrevPhase; public: float RefOmega; } ; // ---------------------------------------------------------------------------- // Rate converter - real input/output, linear interpolation // expect large error when high frequency components are present // thus the best place to convert rates is after a low pass filter // of a demodulator. class RateConvLin { public: RateConvLin(); // ~RateConvLin(); void SetOutVsInp(float OutVsInp); void SetInpVsOut(float InpVsOut); int Process(float_buff *InpBuff); float_buff Output; private: float OutStep, OutPhase; float PrevSample; } ; // ---------------------------------------------------------------------------- // Rate converter - real input/output, quadratic interpolation // similar limits like for RateConv1 class RateConvQuadr { public: RateConvQuadr(); // ~RateConvQuadr(); void SetOutVsInp(float OutVsInp); void SetInpVsOut(float InpVsOut); int Process(float *Inp, int InpLen, float *Out, int MaxOutLen, int *OutLen); int Process(float_buff *InpBuff); float_buff Output; private: float OutStep, OutPhase; float Tap[4]; int TapPtr; } ; // ---------------------------------------------------------------------------- // Rate converter, real input/output, // bandwidth-limited interpolation, several shifted FIR filters class RateConvBL { public: RateConvBL(); ~RateConvBL(); void Free(void); int Preset(int FilterLen, float *FilterShape[], int FilterShapeNum); int ComputeShape(float LowOmega, float UppOmega, double (*Window)(double)); void SetOutVsInp(float OutVsInp); void SetInpVsOut(float InpVsOut); int Process(float_buff *Input); int ProcessLinI(float_buff *Input); float_buff Output; private: float OutStep, OutPhase; int Len; float *Tap; int TapSize; float **Shape; int ShapeNum; int ExternShape; } ; // ---------------------------------------------------------------------------- // Sliding window (for FFT input) class CmpxSlideWindow { public: CmpxSlideWindow(); ~CmpxSlideWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, float *WindowShape=(float*)NULL); int SetWindow(double (*NewWindow)(double phase), double Scale=1.0); int Process(fcmpx_buff *Input); fcmpx_buff Output; private: int Len; // Window length fcmpx *Buff; // storage int Dist; // distance between slides int Ptr; // data pointer in Buff float *Window; // window shape int ExternWindow; } ; // ---------------------------------------------------------------------------- // Overlapping window (for IFFT output) class CmpxOverlapWindow { public: CmpxOverlapWindow(); ~CmpxOverlapWindow(); void Free(void); int Preset(int WindowLen, int SlideDist, float *WindowShape=(float*)NULL); int SetWindow(double (*NewWindow)(double phase), double Scale=1.0); void Process(fcmpx *Inp, fcmpx *Out); int ProcessSilence(int Slides=1); int Process(fcmpx_buff *Input); int Process(fcmpx *Input); // int Process(fcmpx_buff *Input); fcmpx_buff Output; private: int Len; // Window length fcmpx *Buff; // storage int Dist; // distance between slides float *Window; // window shape int ExternWindow; } ; // ---------------------------------------------------------------------------- // FFT phase corrector class FFT_TimeShift { public: FFT_TimeShift(); ~FFT_TimeShift(); void Free(void); int Preset(int FFTlen, int Backwards=0); int Process(fcmpx *Data, int Time); private: int Len; // FFT length int LenMask; // length-1 for pointer wrapping fcmpx *FreqTable; // sin/cos table int Phase; } ; // ---------------------------------------------------------------------------- // bit synchronizer, the bit rate is the input rate divided by four class DiffBitSync4 { public: DiffBitSync4(int IntegBits); ~DiffBitSync4(); void Free(void); int Process(float *Inp, int InpLen, float *BitOut, float *IbitOut, int MaxOutLen, int *OutLen); float GetSyncDriftRate(); // get aver. sync. drift float GetSyncConfid(); private: // eg. 0.01 means 1 bit drift per 100 bits float *InpTap; int InpTapLen, InpTapPtr; // buffer tap, length and pointer int IntegLen; // integrate timing over that many bits float W1,W2,W5; // weights for the two-stage IIR lopass filter double DiffInteg0[4], DiffInteg[4]; // signal diff. integrators int DiffTapPtr; // integrator and bit-sampling pointer int BitPtr; float SyncPhase; // sync. pointer/phase double SyncDrift0,SyncDrift; // low pass filter for the sync. drift rate float SyncConfid; } ; // ---------------------------------------------------------------------------- // bit slicer, SNR/Tune meter class BitSlicer { public: BitSlicer(int IntegBits); ~BitSlicer(); int Process(float *Bits, float *IBits, int InpLen, float *OutBits); float GetSigToNoise(); float GetAmplAsym(); float GetTimeAsym(); private: int IntegLen,TapLen; float W1,W2,W5; double Sum0[2], Sum[2]; double SumSq0[2], SumSq[2]; double TimeAsym0, TimeAsym; double AmplAsym0, AmplAsym; double Noise[2]; float OptimThres; float *Tap; int TapPtr; float PrevBit, PrevIBit; } ; // ---------------------------------------------------------------------------- // The decoder for the HDLC frames, // makes no AX.25 CRC check, only the length in bytes against MinLen and MaxLen // however it does not pass frames with non-complete bytes. class HDLCdecoder { public: HDLCdecoder(int minlen, int maxlen, int diff, int invert, int chan, int (*handler)(int, char *, int)); ~HDLCdecoder(); int Process(float *Inp, int InpLen); public: int AllFrameCount; int BadFrameCount; private: int MinLen,MaxLen; int RxDiff,RxInvert; int ChanId; int (*FrameHandler)(int ChanId, char *Frame, int Len); char *Buff; int Len,PrevLev; unsigned int ShiftReg; int BitCount,Count1s; } ; // ---------------------------------------------------------------------------- // AX.25 CRC short unsigned int AX25CRC(char *Data, int Len); // ---------------------------------------------------------------------------- // check if the given number (an integer) is a power of 2 template int PowerOf2(type I) { int c; if(I<=0) return 0; for(c=0; I!=0; I>>=1) c+=I&1; return c==1; } // ---------------------------------------------------------------------------- class r2FFT // radix-2 FFT { public: // size must a power of 2: 2,4,8,16,32,64,128,256,... r2FFT(); ~r2FFT(); void Free(void); // preset tables for given processing size int Preset(int size); // scramble/unscramble input void Scramble(fcmpx x[]); void Scramble(dcmpx x[]); // apply input window // void InpWinAndScr(fcmpx Inp[], fcmpx Out[]); // void InpWinAndScr(dcmpx Inp[], dcmpx Out[]); // void InpWinAndScr(float Inp0[], float Inp1[], fcmpx Out[]); // void InpWinAndScr(double Inp0[], double Inp1[], dcmpx Out[]); // apply output window (with overlap ?) // void OutWin(fcmpx Buff[], float Out0[], float Out1[]); // void OutWin(dcmpx Buff[], double Out0[], double Out1[]); // void OutWin(fcmpx Buff[], fcmpx Out0[]); // void OutWin(dcmpx Buff[], dcmpx Out0[]); // separate the result of a two real channels FFT void SeparTwoReals(fcmpx Buff[], fcmpx Out0[], fcmpx Out1[]); void SeparTwoReals(dcmpx Buff[], dcmpx Out0[], dcmpx Out1[]); // join spectra of two real channels void JoinTwoReals(fcmpx Inp0[], fcmpx Inp1[], fcmpx Buff[]); void JoinTwoReals(dcmpx Inp0[], dcmpx Inp1[], dcmpx Buff[]); // core process: the classic tripple loop of butterflies void CoreProc(fcmpx x[]); void CoreProc(dcmpx x[]); // complex FFT process in place, includes unscrambling inline void ProcInPlace(fcmpx x[]) { Scramble(x); CoreProc(x); } inline void ProcInPlace(dcmpx x[]) { Scramble(x); CoreProc(x); } // define the FFT window and input/output scales (NULL => rectangular window) // int SetWindow(double (*NewWindow)(double phase), // double InpScale, double OutScale); // forward FFT with window // inline void WinForwProc(fcmpx Inp[], fcmpx Out[]) // { InpWinAndScr(Inp,Out); CoreProc(Out); } // inline void WinForwProc(dcmpx Inp[], dcmpx Out[]) // { InpWinAndScr(Inp,Out); CoreProc(Out); } // two real channels forward FFT with window // inline void RealWinForwProc(float Inp0[], float Inp1[], // fcmpx Buff[], fcmpx Out0[], fcmpx Out1[]) // { InpWinAndScr(Inp0,Inp1,Buff); CoreProc(Buff); // SeparTwoReals(Buff,Out0,Out1); } // inline void RealWinForwProc(double Inp0[], double Inp1[], // dcmpx Buff[], dcmpx Out0[], dcmpx Out1[]) // { InpWinAndScr(Inp0,Inp1,Buff); CoreProc(Buff); // SeparTwoReals(Buff,Out0,Out1); } // two real channels inverse FFT with window // inline void RealWinInvProc(fcmpx Inp0[], fcmpx Inp1[], // fcmpx Buff[], float Out0[], float Out1[]) // { JoinTwoReals(Inp0,Inp1,Buff); Scramble(Buff); CoreProc(Buff); // OutWin(Buff,Out0,Out1); } // inline void RealWinInvProc(dcmpx Inp0[], dcmpx Inp1[], // dcmpx Buff[], double Out0[], double Out1[]) // { JoinTwoReals(Inp0,Inp1,Buff); Scramble(Buff); CoreProc(Buff); // OutWin(Buff,Out0,Out1); } public: int Size; // FFT size int *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling dcmpx *Twiddle; // Twiddle factors (sine/cos values) private: // double *Window; // window shape (NULL => rectangular window // double WinInpScale, WinOutScale; // window scales on input/output private: // classic radix-2 butterflies inline void FFTbf(fcmpx &x0, fcmpx &x1, dcmpx &W); inline void FFTbf(dcmpx &x0, dcmpx &x1, dcmpx &W); // special 2-elem. FFT for the first pass inline void FFT2(fcmpx &x0, fcmpx &x1); inline void FFT2(dcmpx &x0, dcmpx &x1); // special 2-elem. FFT for the second pass inline void FFT4(fcmpx &x0, fcmpx &x1, fcmpx &x2, fcmpx &x3); inline void FFT4(dcmpx &x0, dcmpx &x1, dcmpx &x2, dcmpx &x3); } ; // --------------------------------------------------------------------------- // Sliding window FFT for spectral analysis (e.g. SETI) // input: real-valued time-domain signal, // output: complex-valued Fourier Transform // // We use a little trick here to process two real-valued FFT // in one go using the complex FFT engine. // This cuts the CPU but makes the input->output delay longer. class SlideWinFFT { public: SlideWinFFT(); ~SlideWinFFT(); void Free(); int Preset(int size, int step, float *window); int Preset(int size, int step, double (*NewWindow)(double phase), float Scale=1.0); int SetWindow(float *window); int SetWindow(double (*NewWindow)(double phase), float Scale=1.0); int Process(float_buff *Input); r2FFT FFT; // FFT engine fcmpx_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; int Left; // distance between slides, samples left before the next slide int Slide; // even/odd slide private: float *SlideBuff; int SlidePtr; // sliding window buffer, pointer float *Window; int ExternWindow; // window shape fcmpx *FFTbuff; // FFT buffer } ; // --------------------------------------------------------------------------- // Overlapping window Inverse FFT to convert spectra into time-domain signal class OvlapWinIFFT { public: OvlapWinIFFT(); ~OvlapWinIFFT(); void Free(void); int Preset(int size, int step, float *window); int Preset(int size, int step, double (*NewWindow)(double phase), float Scale=1.0); int SetWindow(float *window); int SetWindow(double (*NewWindow)(double phase), float Scale=1.0); int Process(fcmpx *Input); r2FFT FFT; // FFT engine float_buff Output; // output buffer int Size; int SizeMask; // FFT size, size mask for pointer wrapping int Dist; // distance between slides int Slide; private: fcmpx *Spectr[2]; fcmpx *FFTbuff; // FFT buffer float *Window; int ExternWindow; // window shape float *OvlapBuff; int OvlapPtr; } ; // --------------------------------------------------------------------------- // Sliding window FFT for spectral processing (e.g. de-noising) // input: real-valued signal // in the middle you are given a chance to process // the complex-valued Fourier Transform (SpectraProc() routine). // output: real-valued signal // If you don't touch the spectra in SpectralProc() // the output will be an exact copy (only delayed) of the input. class SlideWinFFTproc { public: SlideWinFFTproc(); ~SlideWinFFTproc(); void Free(void); int Preset(int size, int step, void (*proc)(fcmpx *Spectra, int Len), float *window); int Preset(int size, int step, void (*proc)(fcmpx *Spectra, int Len), double (*NewWindow)(double phase), float Scale=0.0); int SetWindow(float *window); int SetWindow(double (*NewWindow)(double phase), float Scale=0.0); int Process(float_buff *Input); r2FFT FFT; float_buff Output; int Size; int SizeMask; int Dist; int Left; int Slide; private: float *SlideBuff; int SlidePtr; float *Window; int ExternWindow; fcmpx *FFTbuff; fcmpx *Spectr[2]; void (*SpectraProc)(fcmpx *Spectra, int Len); float *OvlapBuff; int OvlapPtr; } ; // --------------------------------------------------------------------------- // Walsh (Hadamard ?) transform. void WalshTrans(double *Data, int Len); void WalshTrans(float *Data, int Len); void WalshInvTrans(double *Data, int Len); void WalshInvTrans(float *Data, int Len); // --------------------------------------------------------------------------- gmfsk-0.7pre1/src/mt63/morse.dat0000644000076400007640000000760510072571050012154 // computer readable Morse code table // // For a given character you should pick up a 31-bit code from the table. // Bits should be taken starting from the LSB. // Bit equal 1 means carrier ON, bit 0 means carrier off // Each code includes one quiet dot at the start and two at the end. // The code should be read until the last '1', // but this last '1' must not be transmitted // const int MorseTableSize=128; long MorseTable[MorseTableSize] = { 0x00000004L , // 0x00 0x00000004L , // 0x01 0x00000004L , // 0x02 0x00000004L , // 0x03 0x00000004L , // 0x04 0x00000004L , // 0x05 0x00000004L , // 0x06 0x00000004L , // 0x07 0x00000004L , // 0x08 0x00000004L , // 0x09 0x00000004L , // 0x0A 0x00000004L , // 0x0B 0x00000004L , // 0x0C 0x00000004L , // 0x0D 0x00000004L , // 0x0E 0x00000004L , // 0x0F 0x00000004L , // 0x10 0x00000004L , // 0x11 0x00000004L , // 0x12 0x00000004L , // 0x13 0x00000004L , // 0x14 0x00000004L , // 0x15 0x00000004L , // 0x16 0x00000004L , // 0x17 0x00000004L , // 0x18 0x00000004L , // 0x19 0x00000004L , // 0x1A 0x00000004L , // 0x1B 0x00000004L , // 0x1C 0x00000004L , // 0x1D 0x00000004L , // 0x1E 0x00000004L , // 0x1F 0x00000004L , // 0x20 = ' ' 0x00000004L , // 0x21 = '!' 0x00000004L , // 0x22 = '"' 0x00000004L , // 0x23 = '#' 0x0013ABAAL , // 0x24 = '$' 0x00000004L , // 0x25 = '%' 0x00000004L , // 0x26 = '&' 0x004BBBBAL , // 0x27 = ''' 0x0004BBAEL , // 0x28 = '(' 0x004EBBAEL , // 0x29 = ')' 0x0004BABAL , // 0x2A = '*' 0x00012EBAL , // 0x2B = '+' 0x004EEAEEL , // 0x2C = ',' 0x0004EAAEL , // 0x2D = '-' 0x0013AEBAL , // 0x2E = '.' 0x00012EAEL , // 0x2F = '/' 0x004EEEEEL , // 0x30 = '0' 0x0013BBBAL , // 0x31 = '1' 0x0004EEEAL , // 0x32 = '2' 0x00013BAAL , // 0x33 = '3' 0x00004EAAL , // 0x34 = '4' 0x000012AAL , // 0x35 = '5' 0x00004AAEL , // 0x36 = '6' 0x00012AEEL , // 0x37 = '7' 0x0004AEEEL , // 0x38 = '8' 0x0012EEEEL , // 0x39 = '9' 0x0012AEEEL , // 0x3A = ':' 0x0012EBAEL , // 0x3B = ';' 0x00000004L , // 0x3C = '<' 0x00013AAEL , // 0x3D = '=' 0x00000004L , // 0x3E = '>' 0x0004AEEAL , // 0x3F = '?' 0x00000004L , // 0x40 = '@' 0x0000013AL , // 0x41 = 'A' 0x000012AEL , // 0x42 = 'B' 0x00004BAEL , // 0x43 = 'C' 0x000004AEL , // 0x44 = 'D' 0x00000012L , // 0x45 = 'E' 0x000012EAL , // 0x46 = 'F' 0x000012EEL , // 0x47 = 'G' 0x000004AAL , // 0x48 = 'H' 0x0000004AL , // 0x49 = 'I' 0x00013BBAL , // 0x4A = 'J' 0x000013AEL , // 0x4B = 'K' 0x000012BAL , // 0x4C = 'L' 0x000004EEL , // 0x4D = 'M' 0x0000012EL , // 0x4E = 'N' 0x00004EEEL , // 0x4F = 'O' 0x00004BBAL , // 0x50 = 'P' 0x00013AEEL , // 0x51 = 'Q' 0x000004BAL , // 0x52 = 'R' 0x0000012AL , // 0x53 = 'S' 0x0000004EL , // 0x54 = 'T' 0x000004EAL , // 0x55 = 'U' 0x000013AAL , // 0x56 = 'V' 0x000013BAL , // 0x57 = 'W' 0x00004EAEL , // 0x58 = 'X' 0x00013BAEL , // 0x59 = 'Y' 0x00004AEEL , // 0x5A = 'Z' 0x00000004L , // 0x5B = '[' 0x00000004L , // 0x5C = '\' 0x00000004L , // 0x5D = ']' 0x00000004L , // 0x5E = '^' 0x0013AEEAL , // 0x5F = '_' 0x00000004L , // 0x60 = '`' 0x0000013AL , // 0x61 = 'a' 0x000012AEL , // 0x62 = 'b' 0x00004BAEL , // 0x63 = 'c' 0x000004AEL , // 0x64 = 'd' 0x00000012L , // 0x65 = 'e' 0x000012EAL , // 0x66 = 'f' 0x000012EEL , // 0x67 = 'g' 0x000004AAL , // 0x68 = 'h' 0x0000004AL , // 0x69 = 'i' 0x00013BBAL , // 0x6A = 'j' 0x000013AEL , // 0x6B = 'k' 0x000012BAL , // 0x6C = 'l' 0x000004EEL , // 0x6D = 'm' 0x0000012EL , // 0x6E = 'n' 0x00004EEEL , // 0x6F = 'o' 0x00004BBAL , // 0x70 = 'p' 0x00013AEEL , // 0x71 = 'q' 0x000004BAL , // 0x72 = 'r' 0x0000012AL , // 0x73 = 's' 0x0000004EL , // 0x74 = 't' 0x000004EAL , // 0x75 = 'u' 0x000013AAL , // 0x76 = 'v' 0x000013BAL , // 0x77 = 'w' 0x00004EAEL , // 0x78 = 'x' 0x00013BAEL , // 0x79 = 'y' 0x00004AEEL , // 0x7A = 'z' 0x00000004L , // 0x7B = '{' 0x00000004L , // 0x7C = '|' 0x00000004L , // 0x7D = '}' 0x00000004L , // 0x7E = '~' 0x00000004L // 0x7F = '' } ; gmfsk-0.7pre1/src/mt63/mt63.cc0000644000076400007640000011774310072571052011444 /* * mt63.cc -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include // only for control printf's // #include #include "dsp.h" #include "mt63.h" #include "morse.dat" // Morse Code table #include "symbol.dat" // symbol shape #include "mt63intl.dat" // interleave patterns #include "alias_k5.dat" // anti-alias filter shapes #include "alias_1k.dat" // for 500, 1000 and 2000 Hz modes #include "alias_2k.dat" // ========================================================================== // Morse Encoder MorseEncoder::MorseEncoder() { TxMsg=NULL; } MorseEncoder::~MorseEncoder() { free(TxMsg); } void MorseEncoder::Free(void) { free(TxMsg); TxMsg=NULL; } int MorseEncoder::SetTxMsg(char *Msg) { int len=strlen(Msg)+1; if(ReallocArray(&TxMsg,len)) return -1; CopyArray(TxMsg,Msg,len); TxPtr=0; Code=0L; return 0; } int MorseEncoder::NextKey(void) { int key,ch; if(TxMsg==NULL) return -1; if(Code<=1) { ch=TxMsg[TxPtr]; if(ch==0) return -1; TxPtr++; if(ch>=1; return key; } // ========================================================================== // MT63 transmitter code MT63tx::MT63tx() { TxVect=NULL; PhaseCorr=NULL; CW_ID=NULL; } MT63tx::~MT63tx() { free(TxVect); free(PhaseCorr); free(CW_ID); } void MT63tx::Free(void) { free(TxVect); TxVect=NULL; free(PhaseCorr); PhaseCorr=NULL; Encoder.Free(); FFT.Free(); Window.Free(); Comb.Free(); WindowBuff.Free(); free(CW_ID); CW_ID=NULL; CW_Coder.Free(); } int MT63tx::Preset(int BandWidth, int LongInterleave, char *ID) { int err,len; int i,p,step,incr,mask; // long MarkCode; switch(BandWidth) { case 500: FirstDataCarr=256; AliasShapeI=Alias_k5_I; AliasShapeQ=Alias_k5_Q; AliasFilterLen=Alias_k5_Len; DecimateRatio=8; break; case 1000: FirstDataCarr=128; AliasShapeI=Alias_1k_I; AliasShapeQ=Alias_1k_Q; AliasFilterLen=Alias_1k_Len; DecimateRatio=4; break; case 2000: FirstDataCarr=64; AliasShapeI=Alias_2k_I; AliasShapeQ=Alias_2k_Q; AliasFilterLen=Alias_2k_Len; DecimateRatio=2; break; default: return -1; } DataCarriers=64; // DataCarrSepar=4; // SymbolSepar=200; WindowLen=SymbolLen; TxWindow=SymbolShape; TxAmpl=4.0/DataCarriers; // for maximum output level we can set TxAmpl=4.0/DataCarriers CarrMarkCode=0x16918BBEL; CarrMarkAmpl=0; // WindowLen/32; if(LongInterleave) { DataInterleave=64; InterleavePattern=LongIntlvPatt; } else { DataInterleave=32; InterleavePattern=ShortIntlvPatt; } if(ReallocArray(&TxVect, DataCarriers)) goto Error; if(ReallocArray(&PhaseCorr, DataCarriers)) goto Error; err=WindowBuff.EnsureSpace(2*WindowLen); if(err) goto Error; WindowBuff.Len=2*WindowLen; err=Encoder.Preset(DataCarriers,DataInterleave,InterleavePattern,1); if(err) goto Error; err=FFT.Preset(WindowLen); if(err) goto Error; err=Window.Preset(WindowLen,SymbolSepar/2,TxWindow); if(err) goto Error; err=Comb.Preset(AliasFilterLen,AliasShapeI,AliasShapeQ,DecimateRatio); if(err) goto Error; mask=FFT.Size-1; // Preset the initial phase for each data carrier. // Here we only compute indexes to the FFT twiddle factors // so the actuall vector is FFT.Twiddle[TxVect[i]] for(step=0,incr=1,p=0,i=0; i>=1; PhaseCorr[i]&=mask; PhaseCorr[i+1]&=mask; } } */ if(ID!=NULL) { len=strlen(ID)+1; if(ReallocArray(&CW_ID,len)) goto Error; CopyArray(CW_ID,ID,len); } else { CW_Coder.Free(); free(CW_ID); CW_ID=NULL; } CW_Carr=(FirstDataCarr-2*DataCarrSepar)&mask; CW_Ampl=4*TxAmpl; CW_Phase=0; CW_PhaseCorr=((SymbolSepar/2)*CW_Carr)&mask; return 0; Error: Free(); return -1; } int MT63tx::SendTune(void) { int i,c,r,mask; float Ampl; mask=FFT.Size-1; Ampl=TxAmpl*sqrt(DataCarriers/2); for(i=0; i ", ch, ch>=' ' ? ch : '.'); for(i=0; i only phase correction { TxVect[i]=(TxVect[i]+PhaseCorr[i])&mask; } else // data bit = 0 => phase flip + phase correction { TxVect[i]=(TxVect[i]+PhaseCorr[i]+flip)&mask; } } ProcessTxVect(); return 0; } int MT63tx::SendJam(void) { int i,mask,left,right; mask=FFT.Size-1; left=FFT.Size/4; right=3*(FFT.Size/4); for(i=0; i=IntlvLen) p-=IntlvLen; } return 0; Error: Free(); return -1; } int MT63encoder::Process(char code) // encode an ASCII character "code" { int i,k; code&=CodeMask; for(i=0; i=IntlvSize) k-=IntlvSize; Output[i]=IntlvPipe[k+i]; } IntlvPtr+=DataCarriers; if(IntlvPtr>=IntlvSize) IntlvPtr-=IntlvSize; } else { for(i=0; i0.0) { Sum/=StepsPerSymb; Sum*=ScanLen; // printf("%3d: %8.5f\n",c,Sum); for(p=c,i=0; i=2*DataCarrSepar) n=0; } } IntegPtr+=ScanLen; if(IntegPtr>=ScanSize) IntegPtr=0; if(IntegPtr==0) { printf("NormPwr:\n"); for(i=0; i=IntlvLen) p-=IntlvLen; } // printf("\n"); IntlvSize=(IntlvLen+1)*ScanSize; if(ReallocArray(&IntlvPipe,IntlvSize)) goto Error; ClearArray(IntlvPipe,IntlvSize); IntlvPtr=0; if(ReallocArray(&WalshBuff,DataCarriers)) goto Error; if(ReallocArray(&DecodeSnrMid,ScanLen)) goto Error; if(ReallocArray(&DecodeSnrOut,ScanLen)) goto Error; ClearArray(DecodeSnrMid,ScanLen); ClearArray(DecodeSnrOut,ScanLen); SignalToNoise=0.0; CarrOfs=0; return 0; Error: Free(); return -1; } int MT63decoder::Process(float *data) { int s,i,k; float Min,Max,Sig,Noise,SNR; int MinPos,MaxPos,code; CopyArray(IntlvPipe+IntlvPtr,data,ScanSize); // printf("Decoder [%d/%d/%d]: \n",IntlvPtr,IntlvSize,ScanSize); for(s=0; s=IntlvSize) k-=IntlvSize; } WalshBuff[i]=IntlvPipe[k+s+i]; // printf(" %4d",k/ScanSize); } // printf("\n"); WalshTrans(WalshBuff,DataCarriers); Min=FindMin(WalshBuff,DataCarriers,MinPos); Max=FindMax(WalshBuff,DataCarriers,MaxPos); if(fabs(Max)>fabs(Min)) { code=MaxPos+DataCarriers; Sig=fabs(Max); WalshBuff[MaxPos]=0.0; } else { code=MinPos; Sig=fabs(Min); WalshBuff[MinPos]=0.0; } Noise=RMS(WalshBuff,DataCarriers); if(Noise>0.0) SNR=Sig/Noise; else SNR=0.0; LowPass2(SNR,DecodeSnrMid[s],DecodeSnrOut[s],W1,W2,W5); // printf("%2d: %02x => %c, %5.2f/%5.2f=>%5.2f <%5.2f>\n", // s,code,code<' ' ? '.' : (char)code, // Sig,Noise,SNR,DecodeSnrOut[s]); DecodePipe[DecodePtr+s]=code; } IntlvPtr+=ScanSize; if(IntlvPtr>=IntlvSize) IntlvPtr=0; DecodePtr+=ScanLen; if(DecodePtr>=DecodeSize) DecodePtr=0; Max=FindMax(DecodeSnrOut,ScanLen,MaxPos); Output=DecodePipe[DecodePtr+MaxPos]; SignalToNoise=Max; CarrOfs=MaxPos-(ScanLen-1)/2; /* code=Output; if((code>=' ')||(code=='\n')||(code=='\r')) printf("%c",code); else if(code!='\0') printf("<%02X>",code); */ return 0; } // ========================================================================== // MT63 receiver code MT63rx::MT63rx() { int s; FFTbuff=NULL; FFTbuff2=NULL; for(s=0; s<4; s++) SyncPipe[s]=NULL; SyncPhCorr=NULL; for(s=0; s<4; s++) { CorrelMid[s]=NULL; CorrelOut[s]=NULL; } PowerMid=NULL; PowerOut=NULL; for(s=0; s<4; s++) CorrelNorm[s]=NULL; for(s=0; s<4; s++) CorrelAver[s]=NULL; SymbFit=NULL; SymbPipe=NULL; FreqPipe=NULL; RefDataSlice=NULL; DataPipeLen=0; DataPipe=NULL; DataPwrMid=NULL; DataPwrOut=NULL; DataSqrMid=NULL; DataSqrOut=NULL; DataVect=NULL; DataPhase=NULL; DataPhase2=NULL; SpectraPower=NULL; } MT63rx::~MT63rx() { int s; free(FFTbuff); free(FFTbuff2); for(s=0; s<4; s++) free(SyncPipe[s]); free(SyncPhCorr); for(s=0; s<4; s++) { free(CorrelMid[s]); free(CorrelOut[s]); } free(PowerMid); free(PowerOut); for(s=0; s<4; s++) free(CorrelNorm[s]); for(s=0; s<4; s++) free(CorrelAver[s]); free(SymbFit); free(SymbPipe); free(FreqPipe); free(RefDataSlice); FreeArray2D(DataPipe,DataPipeLen); // for(s=0; sLen,ProcLine.InpLen); while((SyncProcPtr+WindowLen)", // SyncSymbConf,SyncLocked,SyncProcPtr,SyncPtr,SymbPtr,SyncSymbShift,SyncFreqOfs); if(SyncPtr==SymbPtr) { s1=SyncProcPtr-ProcDelay+((int)SyncSymbShift-SymbPtr*SyncStep); s2=s1+SymbolSepar/2; // printf(" Sample at %d,%d (SyncProcPtr-%d), time diff.=%d\n",s1,s2,SyncProcPtr-s1,s1-DataProcPtr); DataProcess(ProcLine.InpPtr+s1,ProcLine.InpPtr+s2,SyncFreqOfs,s1-DataProcPtr); DataProcPtr=s1; } // printf("\n"); SyncProcPtr+=SyncStep; } SyncProcPtr-=ProcLine.InpLen; DataProcPtr-=ProcLine.InpLen; return 0; } void MT63rx::DoCorrelSum(fcmpx *Correl1, fcmpx *Correl2, fcmpx *Aver) { dcmpx sx; int i,s,d; s=2*DataCarrSepar; d=DataCarriers*DataCarrSepar; sx.re=sx.im=0.0; for(i=0; i0.0) { dI=(I*I-Q*Q)/A; dQ=(2*I*Q)/A; } else { dI=dQ=0.0; } LowPass2(P,PowerMid[i],PowerOut[i],W1p,W2p,W5p); pI=PrevSlice[i].re*SyncPhCorr[i].re-PrevSlice[i].im*SyncPhCorr[i].im; pQ=PrevSlice[i].re*SyncPhCorr[i].im+PrevSlice[i].im*SyncPhCorr[i].re; Correl.re=dQ*pQ+dI*pI; Correl.im=dQ*pI-dI*pQ; LowPass2(&Correl,CorrelMid[SyncPtr]+i,CorrelOut[SyncPtr]+i,W1,W2,W5); PrevSlice[i].re=dI; PrevSlice[i].im=dQ; } if(SyncPtr==(SymbPtr^2)) { for(s=0; s0.0) { CorrelNorm[s][i].re=CorrelOut[s][i].re/PowerOut[i]; CorrelNorm[s][i].im=CorrelOut[s][i].im/PowerOut[i]; } else CorrelNorm[s][i].im=CorrelNorm[s][i].re=0.0; } } /* // another way to normalize - a better one ? for(i=0; i0.0) { for(s=0; s1) j-=(k-1)*DataCarrSepar; else if(k<(-1)) j-=(k+1)*DataCarrSepar; SymbFitPos=j; // printf(" => %2d",j); if(P>0.0) { SymbConf=Ampl(SymbFit[j]) + 0.5*(Ampl(SymbFit[j+1])+Ampl(SymbFit[j-1])); SymbConf*=0.5; I=SymbFit[j].re + 0.5*(SymbFit[j-1].re+SymbFit[j+1].re); Q=SymbFit[j].im + 0.5*(SymbFit[j-1].im+SymbFit[j+1].im); SymbTime.re=I; SymbTime.im=Q; SymbShift=(Phase(SymbTime)/(2*M_PI))*SymbolDiv; if(SymbShift<0) SymbShift+=SymbolDiv; // for(i=j-1; i<=j+1; i++) printf(" [%+5.2f,%+5.2f]",SymbFit[i].re,SymbFit[i].im); // make first estimation of FreqOfs // printf(" -> [%+5.2f,%+5.2f] =>",I,Q); // for(i=j-2; i<=j+2; i++) printf(" %+6.3f",I*SymbFit[i].re+Q*SymbFit[i].im); pI = ScalProd(I,Q,SymbFit[j]) + 0.7*ScalProd(I,Q,SymbFit[j-1]) + 0.7*ScalProd(I,Q,SymbFit[j+1]); pQ = 0.7*ScalProd(I,Q,SymbFit[j+1]) - 0.7*ScalProd(I,Q,SymbFit[j-1]) + 0.5*ScalProd(I,Q,SymbFit[j+2]) - 0.5*ScalProd(I,Q,SymbFit[j-2]); FreqOfs=j+Phase(pI,pQ)/(2.0*M_PI/8); /* SYNC TEST */ // refine the FreqOfs i=(int)floor(FreqOfs+0.5); s=(int)floor(SymbShift); s2=(s+1)&(SymbolDiv-1); // printf(" [%5.2f,%2d,%d,%d] ",FreqOfs,i,s,s2); w0=(s+1-SymbShift); w1=(SymbShift-s); // printf(" [%4.2f,%4.2f] ",w0,w1); A=(0.5*WindowLen)/SymbolSepar; I=w0*CorrelAver[s][i].re+w1*CorrelAver[s2][i].re; Q=w0*CorrelAver[s][i].im+w1*CorrelAver[s2][i].im; // printf(" [%5.2f,%2d] -> [%+5.2f,%+5.2f]",FreqOfs,i,I,Q); // FreqOfs=i+Phase(I,Q)/(2.0*M_PI)*0.5*A; // printf(" => %5.2f",FreqOfs); F0=i+Phase(I,Q)/(2.0*M_PI)*A-FreqOfs; Fl=F0-A; Fu=F0+A; if(fabs(Fl) (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else { SymbTime.re=SymbTime.im=0.0; SymbConf=0.0; SymbShift=0.0; FreqOfs=0.0; } // here we have FreqOfs and SymbTime.re/im // printf("FreqOfs=%5.2f",FreqOfs); if(SyncLocked) { // flip the SymbTime if it doesn't agree with the average if(ScalProd(SymbTime,AverSymb)<0.0) { SymbTime.re=(-SymbTime.re); SymbTime.im=(-SymbTime.im); FreqOfs-=DataCarrSepar; } // reduce the freq. offset towards the average offset A=2*DataCarrSepar; k=(int)floor((FreqOfs-AverFreq)/A+0.5); FreqOfs-=k*A; /* SYNC TEST */ A=(0.5*WindowLen)/SymbolSepar; F0=FreqOfs-AverFreq; // correct freq. auto-correlator wrap Fl=F0-A; Fu=F0+A; if(fabs(Fl) (%5.2f,%5.2f,%5.2f) => %5.2f",Fl,F0,Fu,FreqOfs); } else // of if(SyncLocked) { // flip SymbTime if it doesn't agree with the previous if(ScalProd(SymbTime,SymbPipe[TrackPipePtr])<0.0) { SymbTime.re=(-SymbTime.re); SymbTime.im=(-SymbTime.im); FreqOfs-=DataCarrSepar; } // reduce the FreqOfs towards zero A=2*DataCarrSepar; k=(int)floor(FreqOfs/A+0.5); FreqOfs-=k*A; /* SYNC TEST */ F0=FreqOfs-FreqPipe[TrackPipePtr]; Fl=F0-A; Fu=F0+A; if(fabs(Fl) [%+5.2f,%+5.2f], %5.2f",SymbTime.re,SymbTime.im,FreqOfs); TrackPipePtr+=1; if(TrackPipePtr>=TrackPipeLen) TrackPipePtr-=TrackPipeLen; SymbPipe[TrackPipePtr]=SymbTime; // put SymbTime and FreqOfs into pipes FreqPipe[TrackPipePtr]=FreqOfs; // for averaging // find average symbol time Loops=SelFitAver(SymbPipe,TrackPipeLen,(float)3.0,4,AverSymb,Rms,Incl); // printf(" AverSymb=[%+5.2f,%+5.2f], RMS=%5.3f/%2d", // AverSymb.re,AverSymb.im,Rms,Incl); // find average freq. offset Loops=SelFitAver(FreqPipe,TrackPipeLen,(float)2.5,4,AverFreq,Rms,Incl); SyncFreqDev=Rms; // printf(" AverFreq=%+5.2f, RMS=%5.3f/%2d",AverFreq,Rms,Incl); SymbConf=Ampl(AverSymb); SyncSymbConf=SymbConf; SyncFreqOfs=AverFreq; if(SymbConf>0.0) { SymbShift=Phase(AverSymb)/(2*M_PI)*SymbolSepar; if(SymbShift<0.0) SymbShift+=SymbolSepar; SymbPtr=(int)floor((Phase(AverSymb)/(2*M_PI))*SymbolDiv); if(SymbPtr<0) SymbPtr+=SymbolDiv; SyncSymbShift=SymbShift; } if(SyncLocked) { if((SyncSymbConf0.250)) SyncLocked=0; } else { if((SyncSymbConf>SyncLockThres)&&(SyncFreqDev<0.125)) SyncLocked=1; } SyncSymbConf*=0.5; // printf(" => SyncLocked=%d, SyncSymbShift=%5.1f, SymbPtr=%d", // SyncLocked,SyncSymbShift,SymbPtr); // printf("\n"); } // enf of if(SyncPtr==(SymbPtr^2)) } void MT63rx::DataProcess(fcmpx *EvenSlice, fcmpx *OddSlice, float FreqOfs, int TimeDist) { int i,c,r; dcmpx Freq,Phas; int incr,p; double I,Q,P; dcmpx Dtmp; fcmpx Ftmp; // double Aver,Rms; int Loops,Incl; // Here we pickup a symbol in the data history. The time/freq. synchronizer // told us where it is in time and at which frequency offset (FreqOfs) // TimeDist is the distance in samples from the symbol we analyzed // in the previous call to this routine // FreqOfs=0.0; // for DEBUG only ! // printf("DataProcess: FreqOfs=%5.3f, TimeDist=%d, Locked=%d\n", // FreqOfs,TimeDist,SyncLocked); P=(-2*M_PI*FreqOfs)/WindowLen; // make ready for frequency correction Freq.re=cos(P); Freq.im=sin(P); Phas.re=1.0; Phas.im=0.0; for(i=0; i=DataPipeLen) DataPipePtr=0; for(i=0; i0.0) { P=DataVect[i].re/DataPwrOut[i]; if(P>1.0) P=1.0; else if(P<(-1.0)) P=(-1.0); DataPhase[i]=P; } else DataPhase[i]=0.0; } Decoder.Process(DataPhase); Output.EnsureSpace(Output.Len+1); Output.Data[Output.Len]=Decoder.Output; Output.Len+=1; /* printf("Demodulator output vectors:\n"); for(i=0; i %8.5f\n", i,DataVect[i].re,DataVect[i].im,DataPwrOut[i], DataPhase[i]); } */ /* for(i=0; i0.0) P=Phase(DataVect[i]); else P=0.0; DataPhase[i]=P; P*=2; if(P>M_PI) P-=2*M_PI; else if(P<(-M_PI)) P+=2*M_PI; DataPhase2[i]=P; printf("%2d: %6.3f [%6.3f,%6.3f] [%8.5f,%8.5f], %5.2f, %5.2f", i, DataPwrOut[i], DataSqrOut[i].re,DataSqrOut[i].im, DataVect[i].re,DataVect[i].im, DataPhase[i],DataPhase2[i]); if(DataPwrOut[i]>0.0) printf(" %6.3f",Ampl(DataSqrOut[i])/DataPwrOut[i]); printf("\n"); } Loops=SelFitAver(DataPhase2,DataScanLen,(float)2.5,4,Aver,Rms,Incl); printf("Aver=%5.2f, Rms=%5.2f, Incl=%d\n",Aver,Rms,Incl); */ } int MT63rx::SYNC_LockStatus(void) { return SyncLocked; } float MT63rx::SYNC_Confidence(void) { return SyncSymbConf<=1.0 ? SyncSymbConf : 1.0; } float MT63rx::SYNC_FreqOffset(void) { return SyncFreqOfs/DataCarrSepar; } float MT63rx::SYNC_FreqDevRMS(void) { return SyncFreqDev/DataCarrSepar; } float MT63rx::SYNC_TimeOffset(void) { return SyncSymbShift/SymbolSepar; } float MT63rx::FEC_SNR(void) { return Decoder.SignalToNoise; } int MT63rx::FEC_CarrOffset(void) { return Decoder.CarrOfs; } float MT63rx::TotalFreqOffset(void) { return (SyncFreqOfs+DataCarrSepar*Decoder.CarrOfs)*(8000.0/DecimateRatio)/WindowLen; } gmfsk-0.7pre1/src/mt63/mt63.h0000644000076400007640000003454210072571054011303 /* * mt63.h -- MT63 transmitter and receiver in C++ for LINUX * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // ========================================================================== // Morse Encoder class MorseEncoder { public: MorseEncoder(); ~MorseEncoder(); void Free(void); int SetTxMsg(char *Msg); // set the message to be transmitted int NextKey(void); // get the next key state (ON of OFF) private: char *TxMsg; int TxPtr; long Code; } ; // ========================================================================== // Character encoder and block interleaver for the MT63 modem /* How to use this class: 1. Create or declare an object like: MT63encoder Encoder; 2. Preset the object for the given number of carriers and interleave: err=Encoder.Preset(,,); MT63 uses 64 carriers and interleave of 32 or 64 - the corresponding interleave patterns can be found in mt63.dat. If Encode.Preset() returns non-zero you are in big troubles ! 3. For each character to be encode you make the call: Encoder.Process(); and you should then take the bits from the Encode.Output - these are the bits to be sent out on the carriers. (for MT63 logical 0 means carrier flip, logical 1 is no flip). 4. At any time you can call Encoder.Preset() again to change the parameters (this will clean away the interleaver pipe). */ // MT63 modem specific routines, made to be compatible with the MT63ASC.ASM // (c) 1999 Pawel Jalocha, SP9VRC, jalocha@hpdel1.ifj.edu.pl // Date: 05-NOV-1999 class MT63encoder { public: MT63encoder(); ~MT63encoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int RandFill=0); int Process(char code); char *Output; private: int DataCarriers; char CodeMask; int IntlvLen; int IntlvSize; int *IntlvPatt; char *IntlvPipe; int IntlvPtr; float *WalshBuff; } ; // ========================================================================== // MT63 envelope (non-synchronous) time and frequency synchronizer // experimental status: looks like it's not good enough. /* class MT63sync { public: MT63sync(); ~MT63sync(); void Free(void); int Preset(int FFTlen, int FirstCarr, int CarrSepar, int Carriers, int Steps, int Margin, int Integ); int Process(fcmpx *SpectraSlice); int SampleNow; int Locked; float FreqOfs; float TimeOfs; private: int FFTmask; int FirstDataCarr; int DataCarrSepar; int DataCarriers; int ScanMargin; int ScanFirst; int ScanLen; int StepsPerSymb; int ScanSize; double *PwrIntegMid,*PwrIntegOut; int IntegPtr; int NormSize; double *NormPwr; // int SymbPtr; float W1,W2,W5; } ; */ // ========================================================================== // MT63 deinterleaver and decoder /* How to use this class: 1. Create or declare an object: MT63decoder Decoder; 2. Preset given parameters with Decoder.Preset(); Decoder.Preset(); Number of carriers and interleave are same as for MT63encoder. "Margin" is the number of extra carriers demodulated on the side because with the MT63 you cannot say with full confidence which is really the first carrier: the FEC decoder have to tell you this. "Integ" is the integration period to find the best FEC match. "Integ" is measured in MT63 symbols (at 1000 kHz we do 10 symbols/s). 3. For each symbol period feed the demodulated data into the object: Decoder.Process(); and then get the demodulated character code from Decoder.Output You can get as well the measured signal-to-noise ratio from Decoder.SNR and the index of the first carrier (according to the FEC match) from Decoder.CarrOfs 4. You can change the parameters at any time with Decoder.Preset() (this will clean the data pipes). */ class MT63decoder { public: MT63decoder(); ~MT63decoder(); void Free(); int Preset(int Carriers, int Intlv, int *Pattern, int Margin, int Integ); int Process(float *Data); char Output; float SignalToNoise; int CarrOfs; private: int DataCarriers; float *IntlvPipe; int IntlvLen; int IntlvSize; int IntlvPtr; int *IntlvPatt; float *WalshBuff; int ScanLen; int ScanSize; double *DecodeSnrMid,*DecodeSnrOut; float W1,W2,W5; char *DecodePipe; int DecodeLen; int DecodeSize; int DecodePtr; } ; // ========================================================================== // MT63 transmitter /* How to use this class: 1. Create or declare an object: MT63tx Tx; 2. Preset parameters: Tx.Preset(,); Allowed values are: bandwidth=500,1000,2000; interleave=0,1; Non-zero value returned means there was a problem... 3. For each character to be sent: Tx.SendChar(); After each call to SendChar() you must read the samples from the Tx.Comb.Output.Data, the number of samples to read is in Tx.Comb.Output.Len. They are in floating point, so you should convert them to 16-bit integers and output them to your soundcard. 4. If you have nothing to transmit, you must not stop, because you have to keep the sound going. MT63 transmits NL characters (code=0) in this case. 5. When you are done with all the characters and you want to stop, you should still put some NL characters in to flush the interleave thus please call the Tx.SendChar() Tx.DataInterleave times (still add few more characters to flush the windowed IFFT buffers). After that the MT63 transmits a jamming sequence for some time to speed up carrier drop at the receiver: you do this by calling Tx.SendJam(); 6. You can transmit few symbols of silence by: Tx.SendSilence() to make a gracefull switch-off. Remember: each time you call SendChar(), SendJam() or SendSilence() you must send the contains of Tx.Comb.Output out to your soundcard. Each Tx.SendXxx() produces the amount of sound corresponding to one symbol time that is 0.1 second for the 1000 Hz mode. The soundcard output rate must be 8000 Hz, rather precisely, that is the error should be below 1 Hz. If it is not you should use the rate converter: look into mt63tx for an example. 7. Inbetween transmitions you may change the settings by calling the Tx.Preset() again. */ class MT63tx { public: MT63tx(); ~MT63tx(); void Free(void); int Preset(int BandWidth=1000, int LongInterleave=0, char *ID=NULL); int SendTune(void); int SendChar(char ch); int SendJam(void); int SendSilence(void); private: int DataCarriers; // the number of data carriers int FirstDataCarr; // the FFT index of the first data carrier // int DataCarrSepar; // separation [FFT bins] between data carriers int WindowLen; // FFT window and symbol shape length float *TxWindow; // The shape of the FFT window (=symbol shape) // int SymbolSepar; // separation between symbols on a carrier int AliasFilterLen; // anti-alias filter length float *AliasShapeI,*AliasShapeQ; // and shapes int DecimateRatio; // decimation/interpolation after/before filter int *InterleavePattern; // how the bits of one block are placed on data carriers float TxAmpl; // amplitude applied to generate a carrier (before IFFT) long CarrMarkCode; int CarrMarkAmpl; MorseEncoder CW_Coder; // CW encoder char *CW_ID; // Morse Code identifier to be transmitted along the MT63 signal int CW_Carr; // the carrier index to transmit the CW float CW_Ampl; // CW amplitude int CW_Phase; // CW phase int CW_PhaseCorr; // CW phase correction MT63encoder Encoder; // data encode and interleaver int *TxVect; // modulator vector (phases) int *PhaseCorr; // phase corrections for each carrier fcmpx_buff WindowBuff; // FFT/window buffer r2FFT FFT; // FFT engine CmpxOverlapWindow Window; // overlapping window int ProcessTxVect(); public: int DataInterleave; QuadrComb Comb; // the output of this module is in Comb.Output } ; // ========================================================================== // MT63 receiver /* How to use this class: 1. Declare the object: MT63rx Rx; 2. Preset paramateres Rx.Preset(,,); For weak signals I recommend integration of 32 or more, otherwise 16 is enough. By the way, 16 means 1.6 second for 1000 Hz mode because then we transmit 10 symbols per second. 3. Feed floating point samples into the Rx.Process, if you have signed 16-bit samples, you should convert them first to floating point - look at how I do it in mt63rx.cc 4. After EACH new batch of samples you should look into Rx.Output for the decoded characters. You can egzamin the receiver status at any time by calling: Rx.SYNC_LockStatus() => logical value 0 or 1 Rx.SYNC_Confidence() => lock confidence: a float between 0.0 and 1.0 Rx.FEC_SNR() => signal-to-noise seen by FEC Rx.TotalFreqOffset() => measured frequency offset in [Hz] assuming 8000 Hz sampling */ class MT63rx { public: MT63rx(); ~MT63rx(); void Free(void); int Preset(int BandWidth=1000, int LongInterleave=0, int Integ=16, void (*Display)(float *Spectra, int Len)=NULL); int Process(float_buff *Input); char_buff Output; // decoded characters int SYNC_LockStatus(void); // 1 => locked, 0 => not locked float SYNC_Confidence(void); // lock confidence <0..1> float SYNC_FreqOffset(void); float SYNC_FreqDevRMS(void); float SYNC_TimeOffset(void); float TotalFreqOffset(); // Total frequency offset in [Hz] float FEC_SNR(void); // signal-to-noise ratio at the FEC int FEC_CarrOffset(void); private: QuadrSplit InpSplit; // input filter, I/Q splitter, decimator CmpxMixer TestOfs; // frequency offset for tests DelayLine ProcLine; // processing pipe int ProcDelay; // processing delay for optimal symbol probing int SyncProcPtr; // sampling pointer for the synchronizer int DataProcPtr; // sampling pointer for the data demodulator r2FFT FFT; // FFT engine int WindowLen; // FFT window length = symbol shape length int WindowLenMask; // WindowLen-1 for pointer wrapping float *RxWindow; // FFT window shape = symbol shape void (*SpectraDisplay)(float *Spectra, int Len); float *SpectraPower; int AliasFilterLen; // anti-alias filter length float *AliasShapeI,*AliasShapeQ; // and shapes int DecimateRatio; // decimation/interpolation after/before filter int *InterleavePattern; // how the bits of one block are placed on data carriers int DataInterleave; // data interleave depth int DataCarriers; // number of carriers int FirstDataCarr; // the FFT index of the first data carrier // int DataCarrSepar; // freq. separation between carriers [FFT bins] long CarrMarkCode; // code to mark carriers (not in use here) // int SymbolSepar; // time separation between symbols [samples] int ScanMargin; // How many carriers up and down to search int IntegLen; // Over how many symbols we integrate to synchronize int SymbolDiv; // =4 we probe the input 4 times per symbol time int SyncStep; // SymbolSepar/SymbolDiv int ScanFirst; // first carrier to scan int ScanLen; // number of carriers to scan fcmpx *FFTbuff; fcmpx *FFTbuff2; // here starts the time/frequency synchronizer void SyncProcess(fcmpx *Slice); fcmpx *SyncPipe[4]; // FFT result buffer for sync. int SyncPtr; // wrapping pointer for SyncPipe and integrators int SymbPtr; // points about where the symbol is fcmpx *SyncPhCorr; // phase corrections for the sync. processor dcmpx *CorrelMid[4], *CorrelOut[4]; // correlation integrator double *PowerMid, *PowerOut; // carrier power integrator fcmpx *CorrelNorm[4]; // normalized correlation float W1,W2,W5; // correlation integrator weights float W1p,W2p,W5p; // power integrator weights fcmpx *CorrelAver[4]; // sliding sum to fit the carrier pattern int FitLen; void DoCorrelSum(fcmpx *Correl1, fcmpx *Correl2, fcmpx *Aver); fcmpx *SymbFit; // vectors to match symbol shift and confidence int SymbFitPos; // "smoothed" peak position float *FreqPipe; // smoothing pipe for frequency offset fcmpx *SymbPipe; // smoothing pipe for symbol shift int TrackPipeLen; // tracking pipe length int TrackPipePtr; // pipe pointer double AverFreq; // averaged frequency dcmpx AverSymb; // averaged symbol phase float SyncLockThres; // lock confidence threshold float SyncHoldThres; // minimal confidence to hold the lock int SyncLocked; // locked or not locked float SyncSymbConf; // current smoothed confidence float SyncFreqOfs; // current smoothed frequency offset float SyncFreqDev; // frequency deviation (RMS) float SyncSymbShift; // current smoothed symbol time shift // here starts the data decoder void DataProcess(fcmpx *EvenSlice, fcmpx *OddSlice, float FreqOfs, int TimeDist); int DataScanMargin; // +/- data carriers to scan for best FEC match int DataScanLen; // total number of data carriers being processed int DataScanFirst; fcmpx *RefDataSlice; // reference data slice for differential phase decode fcmpx *DataVect; // differentially decoded data vactor int DataPipeLen; // pipe length int DataPipePtr; // wrapping pointer fcmpx **DataPipe; // decoded vectors pipe double *DataPwrMid,*DataPwrOut; // carrier power integrator dcmpx *DataSqrMid,*DataSqrOut; // carrier complex square integrator float dW1,dW2,dW5; // integrator constants float *DataPhase; // differential decoded phases float *DataPhase2; // rather for debugging, not use otherwise MT63decoder Decoder; // MT63sync EnvSync; // envelope synchronizer (experimental) } ; gmfsk-0.7pre1/src/mt63/mt63intl.dat0000644000076400007640000000256210072571050012504 /* * mt63intl.dat -- interleave patterns * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ // interleave pattern for the original MT63ASC (short interleave) int ShortIntlvPatt[64] = { 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7, 4,5,6,7 } ; // interleave pattern for doubled interleave int LongIntlvPatt[64] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,0 } ; gmfsk-0.7pre1/src/mt63/mt63main.cc0000644000076400007640000001072310037470640012301 /* * mt63main.cc -- MT63 modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "stdio.h" #include "conf.h" #include "trx.h" #include "snd.h" #include "dsp.h" #include "mt63.h" extern "C" void mt63_init(struct trx *trx); static int IntegLen = 32; // integration period for sync./data tracking struct mt63 { int Bandwidth; int Interleave; char *CWID; MT63tx *Tx; MT63rx *Rx; LevelMonitor *InpLevel; float_buff *InpBuff; int flush; int escape; }; static void mt63_txinit(struct trx *trx) { struct mt63 *s = (struct mt63 *) trx->modem; int err; err = s->Tx->Preset(s->Bandwidth, s->Interleave, s->CWID); if (err) fprintf(stderr, "mt63_txinit: init failed\n"); s->flush = s->Tx->DataInterleave; } static void mt63_rxinit(struct trx *trx) { struct mt63 *s = (struct mt63 *) trx->modem; int err; err = s->Rx->Preset(s->Bandwidth, s->Interleave, IntegLen); if (err) fprintf(stderr, "mt63_rxinit: init failed\n"); s->InpLevel->Preset(64.0, 0.75); s->escape = 0; } static void mt63_free(struct mt63 *s) { if (s) { s->Tx->Free(); s->Rx->Free(); delete s->Tx; delete s->Rx; delete s->InpLevel; delete s->InpBuff; free(s->CWID); free(s); } } static void mt63_destructor(struct trx *trx) { struct mt63 *s = (struct mt63 *) trx->modem; mt63_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } static int mt63_txprocess(struct trx *trx) { struct mt63 *s = (struct mt63 *) trx->modem; int c; c = trx_get_tx_char(); if (c == -1) { if (trx->stopflag && s->flush-- == 0) return -1; c = 0; } else s->flush = s->Tx->DataInterleave; if ((trx->mt63_esc && c > 255) || (!trx->mt63_esc && c > 127)) c = '.'; trx_put_echo_char(c); if (c > 127) { c &= 127; s->Tx->SendChar(127); sound_write(s->Tx->Comb.Output.Data, s->Tx->Comb.Output.Len); } s->Tx->SendChar(c); sound_write(s->Tx->Comb.Output.Data, s->Tx->Comb.Output.Len); return 0; } static int mt63_rxprocess(struct trx *trx, float *buf, int len) { struct mt63 *s = (struct mt63 *) trx->modem; float snr; unsigned int c; int i; if (s->InpBuff->EnsureSpace(len) == -1) { fprintf(stderr, "mt63_rxprocess: buffer error\n"); return -1; } for (i = 0; i < len; i++) s->InpBuff->Data[i] = buf[i]; s->InpBuff->Len = len; s->InpLevel->Process(s->InpBuff); s->Rx->Process(s->InpBuff); snr = s->Rx->FEC_SNR(); if (snr > 99.9) snr = 99.9; trx_set_metric(snr); if (trx->squelchon && snr < trx->mt63_squelch) return 0; for (i = 0; i < s->Rx->Output.Len; i++) { c = s->Rx->Output.Data[i]; if (!trx->mt63_esc) { trx_put_rx_char(c); continue; } if ((c < 8) && (s->escape == 0)) continue; if (c == 127) { s->escape = 1; continue; } if (s->escape) { c += 128; s->escape = 0; } trx_put_rx_char(c); } return 0; } void mt63_init(struct trx *trx) { struct mt63 *s; if ((s = (mt63 *) calloc(1, sizeof(struct mt63))) == NULL) return; switch (trx->mt63_bandwidth) { case 0: s->Bandwidth = 500; break; case 1: s->Bandwidth = 1000; break; case 2: s->Bandwidth = 2000; break; } s->Interleave = trx->mt63_interleave; if (trx->mt63_cwid) s->CWID = g_strdup_printf("%s MT63", conf_get_mycall()); else s->CWID = NULL; s->Tx = new MT63tx; s->Rx = new MT63rx; s->InpLevel = new LevelMonitor; s->InpBuff = new float_buff; trx->modem = s; trx->txinit = mt63_txinit; trx->rxinit = mt63_rxinit; trx->txprocess = mt63_txprocess; trx->rxprocess = mt63_rxprocess; trx->destructor = mt63_destructor; trx->samplerate = 8000; trx->fragmentsize = 1024; trx->bandwidth = s->Bandwidth; trx->frequency = 500.0 + s->Bandwidth / 2.0; } gmfsk-0.7pre1/src/mt63/symbol.dat0000644000076400007640000003441010072571051012327 /* * symbol.dat -- Symbol shape for the MT63 modem, taken directly * from the MT63ASC code for the EVM56K. * * Copyright (C) 1999-2004 Pawel Jalocha, SP9VRC * * This file is part of MT63. * * MT63 is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MT63 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MT63; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ const int SymbolLen=512; // the shape's length const int SymbolSepar=200; // the distance in samples between symbols on a carrier const int DataCarrSepar=4; // carriers must be spaced by 4 FFT bins // (complex FFT length equals to SymbolLen) float SymbolShape[SymbolLen] = { -0.00000000 , // 0 +0.00000665 , // 1 +0.00002657 , // 2 +0.00005975 , // 3 +0.00010613 , // 4 +0.00016562 , // 5 +0.00023810 , // 6 +0.00032341 , // 7 +0.00042134 , // 8 +0.00053162 , // 9 +0.00065389 , // 10 +0.00078773 , // 11 +0.00093261 , // 12 +0.00108789 , // 13 +0.00125283 , // 14 +0.00142653 , // 15 +0.00160798 , // 16 +0.00179599 , // 17 +0.00198926 , // 18 +0.00218628 , // 19 +0.00238542 , // 20 +0.00258487 , // 21 +0.00278264 , // 22 +0.00297662 , // 23 +0.00316452 , // 24 +0.00334394 , // 25 +0.00351232 , // 26 +0.00366701 , // 27 +0.00380526 , // 28 +0.00392424 , // 29 +0.00402109 , // 30 +0.00409288 , // 31 +0.00413671 , // 32 +0.00414969 , // 33 +0.00412898 , // 34 +0.00407182 , // 35 +0.00397555 , // 36 +0.00383764 , // 37 +0.00365574 , // 38 +0.00342767 , // 39 +0.00315145 , // 40 +0.00282534 , // 41 +0.00244787 , // 42 +0.00201781 , // 43 +0.00153424 , // 44 +0.00099653 , // 45 +0.00040435 , // 46 -0.00024231 , // 47 -0.00094314 , // 48 -0.00169753 , // 49 -0.00250453 , // 50 -0.00336293 , // 51 -0.00427118 , // 52 -0.00522749 , // 53 -0.00622977 , // 54 -0.00727569 , // 55 -0.00836272 , // 56 -0.00948809 , // 57 -0.01064886 , // 58 -0.01184193 , // 59 -0.01306405 , // 60 -0.01431189 , // 61 -0.01558198 , // 62 -0.01687083 , // 63 -0.01817486 , // 64 -0.01949051 , // 65 -0.02081416 , // 66 -0.02214223 , // 67 -0.02347113 , // 68 -0.02479733 , // 69 -0.02611728 , // 70 -0.02742752 , // 71 -0.02872457 , // 72 -0.03000504 , // 73 -0.03126551 , // 74 -0.03250262 , // 75 -0.03371298 , // 76 -0.03489320 , // 77 -0.03603988 , // 78 -0.03714954 , // 79 -0.03821868 , // 80 -0.03924367 , // 81 -0.04022079 , // 82 -0.04114620 , // 83 -0.04201589 , // 84 -0.04282570 , // 85 -0.04357126 , // 86 -0.04424801 , // 87 -0.04485118 , // 88 -0.04537575 , // 89 -0.04581648 , // 90 -0.04616787 , // 91 -0.04642421 , // 92 -0.04657955 , // 93 -0.04662769 , // 94 -0.04656225 , // 95 -0.04637665 , // 96 -0.04606414 , // 97 -0.04561786 , // 98 -0.04503082 , // 99 -0.04429599 , // 100 -0.04340631 , // 101 -0.04235475 , // 102 -0.04113436 , // 103 -0.03973834 , // 104 -0.03816006 , // 105 -0.03639316 , // 106 -0.03443155 , // 107 -0.03226956 , // 108 -0.02990192 , // 109 -0.02732385 , // 110 -0.02453112 , // 111 -0.02152012 , // 112 -0.01828789 , // 113 -0.01483216 , // 114 -0.01115146 , // 115 -0.00724508 , // 116 -0.00311317 , // 117 +0.00124328 , // 118 +0.00582236 , // 119 +0.01062127 , // 120 +0.01563627 , // 121 +0.02086273 , // 122 +0.02629504 , // 123 +0.03192674 , // 124 +0.03775043 , // 125 +0.04375787 , // 126 +0.04993995 , // 127 +0.05628681 , // 128 +0.06278780 , // 129 +0.06943159 , // 130 +0.07620621 , // 131 +0.08309914 , // 132 +0.09009732 , // 133 +0.09718730 , // 134 +0.10435526 , // 135 +0.11158715 , // 136 +0.11886870 , // 137 +0.12618560 , // 138 +0.13352351 , // 139 +0.14086819 , // 140 +0.14820561 , // 141 +0.15552198 , // 142 +0.16280389 , // 143 +0.17003841 , // 144 +0.17721311 , // 145 +0.18431620 , // 146 +0.19133661 , // 147 +0.19826401 , // 148 +0.20508896 , // 149 +0.21180289 , // 150 +0.21839823 , // 151 +0.22486845 , // 152 +0.23120806 , // 153 +0.23741270 , // 154 +0.24347919 , // 155 +0.24940549 , // 156 +0.25519079 , // 157 +0.26083547 , // 158 +0.26634116 , // 159 +0.27171067 , // 160 +0.27694807 , // 161 +0.28205857 , // 162 +0.28704860 , // 163 +0.29192571 , // 164 +0.29669855 , // 165 +0.30137684 , // 166 +0.30597130 , // 167 +0.31049362 , // 168 +0.31495636 , // 169 +0.31937292 , // 170 +0.32375741 , // 171 +0.32812465 , // 172 +0.33249001 , // 173 +0.33686936 , // 174 +0.34127898 , // 175 +0.34573545 , // 176 +0.35025554 , // 177 +0.35485613 , // 178 +0.35955412 , // 179 +0.36436627 , // 180 +0.36930915 , // 181 +0.37439902 , // 182 +0.37965170 , // 183 +0.38508250 , // 184 +0.39070609 , // 185 +0.39653642 , // 186 +0.40258662 , // 187 +0.40886890 , // 188 +0.41539446 , // 189 +0.42217341 , // 190 +0.42921470 , // 191 +0.43652603 , // 192 +0.44411383 , // 193 +0.45198311 , // 194 +0.46013753 , // 195 +0.46857925 , // 196 +0.47730896 , // 197 +0.48632585 , // 198 +0.49562756 , // 199 +0.50521021 , // 200 +0.51506840 , // 201 +0.52519520 , // 202 +0.53558220 , // 203 +0.54621950 , // 204 +0.55709582 , // 205 +0.56819849 , // 206 +0.57951351 , // 207 +0.59102568 , // 208 +0.60271860 , // 209 +0.61457478 , // 210 +0.62657574 , // 211 +0.63870210 , // 212 +0.65093366 , // 213 +0.66324951 , // 214 +0.67562817 , // 215 +0.68804763 , // 216 +0.70048553 , // 217 +0.71291922 , // 218 +0.72532590 , // 219 +0.73768272 , // 220 +0.74996688 , // 221 +0.76215572 , // 222 +0.77422687 , // 223 +0.78615828 , // 224 +0.79792836 , // 225 +0.80951602 , // 226 +0.82090079 , // 227 +0.83206287 , // 228 +0.84298315 , // 229 +0.85364335 , // 230 +0.86402598 , // 231 +0.87411443 , // 232 +0.88389296 , // 233 +0.89334677 , // 234 +0.90246195 , // 235 +0.91122553 , // 236 +0.91962547 , // 237 +0.92765062 , // 238 +0.93529073 , // 239 +0.94253642 , // 240 +0.94937916 , // 241 +0.95581122 , // 242 +0.96182562 , // 243 +0.96741616 , // 244 +0.97257728 , // 245 +0.97730410 , // 246 +0.98159233 , // 247 +0.98543825 , // 248 +0.98883864 , // 249 +0.99179079 , // 250 +0.99429241 , // 251 +0.99634163 , // 252 +0.99793696 , // 253 +0.99907728 , // 254 +0.99976178 , // 255 +0.99999000 , // 256 +0.99976178 , // 257 +0.99907728 , // 258 +0.99793696 , // 259 +0.99634163 , // 260 +0.99429241 , // 261 +0.99179079 , // 262 +0.98883864 , // 263 +0.98543825 , // 264 +0.98159233 , // 265 +0.97730410 , // 266 +0.97257728 , // 267 +0.96741616 , // 268 +0.96182562 , // 269 +0.95581122 , // 270 +0.94937916 , // 271 +0.94253642 , // 272 +0.93529073 , // 273 +0.92765062 , // 274 +0.91962547 , // 275 +0.91122553 , // 276 +0.90246195 , // 277 +0.89334677 , // 278 +0.88389296 , // 279 +0.87411443 , // 280 +0.86402598 , // 281 +0.85364335 , // 282 +0.84298315 , // 283 +0.83206287 , // 284 +0.82090079 , // 285 +0.80951602 , // 286 +0.79792836 , // 287 +0.78615828 , // 288 +0.77422687 , // 289 +0.76215572 , // 290 +0.74996688 , // 291 +0.73768272 , // 292 +0.72532590 , // 293 +0.71291922 , // 294 +0.70048553 , // 295 +0.68804763 , // 296 +0.67562817 , // 297 +0.66324951 , // 298 +0.65093366 , // 299 +0.63870210 , // 300 +0.62657574 , // 301 +0.61457478 , // 302 +0.60271860 , // 303 +0.59102568 , // 304 +0.57951351 , // 305 +0.56819849 , // 306 +0.55709582 , // 307 +0.54621950 , // 308 +0.53558220 , // 309 +0.52519520 , // 310 +0.51506840 , // 311 +0.50521021 , // 312 +0.49562756 , // 313 +0.48632585 , // 314 +0.47730896 , // 315 +0.46857925 , // 316 +0.46013753 , // 317 +0.45198311 , // 318 +0.44411383 , // 319 +0.43652603 , // 320 +0.42921470 , // 321 +0.42217341 , // 322 +0.41539446 , // 323 +0.40886890 , // 324 +0.40258662 , // 325 +0.39653642 , // 326 +0.39070609 , // 327 +0.38508250 , // 328 +0.37965170 , // 329 +0.37439902 , // 330 +0.36930915 , // 331 +0.36436627 , // 332 +0.35955412 , // 333 +0.35485613 , // 334 +0.35025554 , // 335 +0.34573545 , // 336 +0.34127898 , // 337 +0.33686936 , // 338 +0.33249001 , // 339 +0.32812465 , // 340 +0.32375741 , // 341 +0.31937292 , // 342 +0.31495636 , // 343 +0.31049362 , // 344 +0.30597130 , // 345 +0.30137684 , // 346 +0.29669855 , // 347 +0.29192571 , // 348 +0.28704860 , // 349 +0.28205857 , // 350 +0.27694807 , // 351 +0.27171067 , // 352 +0.26634116 , // 353 +0.26083547 , // 354 +0.25519079 , // 355 +0.24940549 , // 356 +0.24347919 , // 357 +0.23741270 , // 358 +0.23120806 , // 359 +0.22486845 , // 360 +0.21839823 , // 361 +0.21180289 , // 362 +0.20508896 , // 363 +0.19826401 , // 364 +0.19133661 , // 365 +0.18431620 , // 366 +0.17721311 , // 367 +0.17003841 , // 368 +0.16280389 , // 369 +0.15552198 , // 370 +0.14820561 , // 371 +0.14086819 , // 372 +0.13352351 , // 373 +0.12618560 , // 374 +0.11886870 , // 375 +0.11158715 , // 376 +0.10435526 , // 377 +0.09718730 , // 378 +0.09009732 , // 379 +0.08309914 , // 380 +0.07620621 , // 381 +0.06943159 , // 382 +0.06278780 , // 383 +0.05628681 , // 384 +0.04993995 , // 385 +0.04375787 , // 386 +0.03775043 , // 387 +0.03192674 , // 388 +0.02629504 , // 389 +0.02086273 , // 390 +0.01563627 , // 391 +0.01062127 , // 392 +0.00582236 , // 393 +0.00124328 , // 394 -0.00311317 , // 395 -0.00724508 , // 396 -0.01115146 , // 397 -0.01483216 , // 398 -0.01828789 , // 399 -0.02152012 , // 400 -0.02453112 , // 401 -0.02732385 , // 402 -0.02990192 , // 403 -0.03226956 , // 404 -0.03443155 , // 405 -0.03639316 , // 406 -0.03816006 , // 407 -0.03973834 , // 408 -0.04113436 , // 409 -0.04235475 , // 410 -0.04340631 , // 411 -0.04429599 , // 412 -0.04503082 , // 413 -0.04561786 , // 414 -0.04606414 , // 415 -0.04637665 , // 416 -0.04656225 , // 417 -0.04662769 , // 418 -0.04657955 , // 419 -0.04642421 , // 420 -0.04616787 , // 421 -0.04581648 , // 422 -0.04537575 , // 423 -0.04485118 , // 424 -0.04424801 , // 425 -0.04357126 , // 426 -0.04282570 , // 427 -0.04201589 , // 428 -0.04114620 , // 429 -0.04022079 , // 430 -0.03924367 , // 431 -0.03821868 , // 432 -0.03714954 , // 433 -0.03603988 , // 434 -0.03489320 , // 435 -0.03371298 , // 436 -0.03250262 , // 437 -0.03126551 , // 438 -0.03000504 , // 439 -0.02872457 , // 440 -0.02742752 , // 441 -0.02611728 , // 442 -0.02479733 , // 443 -0.02347113 , // 444 -0.02214223 , // 445 -0.02081416 , // 446 -0.01949051 , // 447 -0.01817486 , // 448 -0.01687083 , // 449 -0.01558198 , // 450 -0.01431189 , // 451 -0.01306405 , // 452 -0.01184193 , // 453 -0.01064886 , // 454 -0.00948809 , // 455 -0.00836272 , // 456 -0.00727569 , // 457 -0.00622977 , // 458 -0.00522749 , // 459 -0.00427118 , // 460 -0.00336293 , // 461 -0.00250453 , // 462 -0.00169753 , // 463 -0.00094314 , // 464 -0.00024231 , // 465 +0.00040435 , // 466 +0.00099653 , // 467 +0.00153424 , // 468 +0.00201781 , // 469 +0.00244787 , // 470 +0.00282534 , // 471 +0.00315145 , // 472 +0.00342767 , // 473 +0.00365574 , // 474 +0.00383764 , // 475 +0.00397555 , // 476 +0.00407182 , // 477 +0.00412898 , // 478 +0.00414969 , // 479 +0.00413671 , // 480 +0.00409288 , // 481 +0.00402109 , // 482 +0.00392424 , // 483 +0.00380526 , // 484 +0.00366701 , // 485 +0.00351232 , // 486 +0.00334394 , // 487 +0.00316452 , // 488 +0.00297662 , // 489 +0.00278264 , // 490 +0.00258487 , // 491 +0.00238542 , // 492 +0.00218628 , // 493 +0.00198926 , // 494 +0.00179599 , // 495 +0.00160798 , // 496 +0.00142653 , // 497 +0.00125283 , // 498 +0.00108789 , // 499 +0.00093261 , // 500 +0.00078773 , // 501 +0.00065389 , // 502 +0.00053162 , // 503 +0.00042134 , // 504 +0.00032341 , // 505 +0.00023810 , // 506 +0.00016562 , // 507 +0.00010613 , // 508 +0.00005975 , // 509 +0.00002657 , // 510 +0.00000665 // 511 } ; gmfsk-0.7pre1/src/feld/0000777000076400007640000000000010206176677010551 5gmfsk-0.7pre1/src/feld/Makefile.am0000644000076400007640000000042007660541632012512 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libfeld.a libfeld_a_SOURCES = \ feld.c feld.h \ feldrx.c feldtx.c gmfsk-0.7pre1/src/feld/Makefile.in0000644000076400007640000003007510206155266012526 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libfeld.a libfeld_a_SOURCES = \ feld.c feld.h \ feldrx.c feldtx.c subdir = src/feld ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libfeld_a_AR = $(AR) cru libfeld_a_LIBADD = am_libfeld_a_OBJECTS = feld.$(OBJEXT) feldrx.$(OBJEXT) feldtx.$(OBJEXT) libfeld_a_OBJECTS = $(am_libfeld_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/feld.Po ./$(DEPDIR)/feldrx.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/feldtx.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libfeld_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libfeld_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/feld/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libfeld.a: $(libfeld_a_OBJECTS) $(libfeld_a_DEPENDENCIES) -rm -f libfeld.a $(libfeld_a_AR) libfeld.a $(libfeld_a_OBJECTS) $(libfeld_a_LIBADD) $(RANLIB) libfeld.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feld.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feldrx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/feldtx.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/feld/feld.c0000644000076400007640000000700710166566335011546 /* * feld.c -- FELDHELL modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "trx.h" #include "feld.h" #include "filter.h" #include "fftfilt.h" static void feld_txinit(struct trx *trx) { struct feld *s = (struct feld *) trx->modem; s->txcounter = 0.0; s->preamble = 3; s->postamble = 3; return; } static void feld_rxinit(struct trx *trx) { struct feld *s = (struct feld *) trx->modem; s->rxcounter = 0.0; s->agc = 0.0; return; } #define unref(obj) if (obj) g_object_unref(G_OBJECT(obj)) static void feld_free(struct feld *s) { if (s) { filter_free(s->hilbert); fftfilt_free(s->fftfilt); unref(s->pixmap); unref(s->gc_white); unref(s->gc_black); unref(s->context); unref(s->layout); g_free(s); } } static void feld_destructor(struct trx *trx) { struct feld *s = (struct feld *) trx->modem; feld_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } void feld_init(struct trx *trx) { GdkColor color; GdkColormap *cmap; GdkVisual *visual; struct feld *s; double lp; PangoFontDescription *fontdesc; s = g_new0(struct feld, 1); if ((s->hilbert = filter_init_hilbert(37, 1)) == NULL) { feld_free(s); return; } lp = BandWidth / 2.0 / SampleRate; if ((s->txfilt = filter_init_lowpass(65, 1, lp)) == NULL) { feld_free(s); return; } lp = trx->hell_bandwidth / 2.0 / SampleRate; if ((s->fftfilt = fftfilt_init(0, lp, 1024)) == NULL) { feld_free(s); return; } cmap = gdk_colormap_get_system(); visual = gdk_colormap_get_visual(cmap); s->depth = visual->depth; s->pixmap = gdk_pixmap_new(NULL, PIXMAP_W, PIXMAP_H, s->depth); gdk_drawable_set_colormap(s->pixmap, cmap); s->gc_black = gdk_gc_new(s->pixmap); gdk_color_black(cmap, &color); gdk_gc_set_foreground(s->gc_black, &color); s->gc_white = gdk_gc_new(s->pixmap); gdk_color_white(cmap, &color); gdk_gc_set_foreground(s->gc_white, &color); s->context = gdk_pango_context_get(); gdk_pango_context_set_colormap(s->context, cmap); pango_context_set_base_dir(s->context, PANGO_DIRECTION_LTR); pango_context_set_language(s->context, gtk_get_default_language()); fontdesc = pango_font_description_from_string(trx->hell_font); pango_context_set_font_description(s->context, fontdesc); pango_font_description_free(fontdesc); s->layout = pango_layout_new(s->context); trx->modem = s; trx->txinit = feld_txinit; trx->rxinit = feld_rxinit; trx->txprocess = feld_txprocess; trx->rxprocess = feld_rxprocess; trx->destructor = feld_destructor; trx->samplerate = SampleRate; trx->bandwidth = trx->hell_bandwidth; } gmfsk-0.7pre1/src/feld/feld.h0000644000076400007640000000373107725503072011547 /* * feld.h -- FELDHELL modem * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _FELD_H #define _FELD_H #include #include "cmplx.h" #include "trx.h" #define SampleRate 8000 #define ColumnRate 17.5 #define BandWidth 245.0 #define RxColumnLen 30 #define TxColumnLen 14 #define RxPixRate ((RxColumnLen)*(ColumnRate)) #define TxPixRate ((TxColumnLen)*(ColumnRate)) #define DownSampleInc ((double)(RxPixRate)/(SampleRate)) #define UpSampleInc ((double)(TxPixRate)/(SampleRate)) #define PIXMAP_W 14 #define PIXMAP_H (TxColumnLen) struct feld { /* * Common stuff */ /* * RX related stuff */ double rxphacc; double rxcounter; struct filter *hilbert; struct fftfilt *fftfilt; double agc; /* * TX related stuff */ double txphacc; double txcounter; struct filter *txfilt; GdkPixmap *pixmap; gint depth; GdkGC *gc_black; GdkGC *gc_white; PangoLayout *layout; PangoContext *context; int preamble; int postamble; }; /* in feld.c */ extern void feld_init(struct trx *trx); /* in feldrx.c */ extern int feld_rxprocess(struct trx *trx, float *buf, int len); /* in feldtx.c */ extern int feld_txprocess(struct trx *trx); #endif gmfsk-0.7pre1/src/feld/feldrx.c0000644000076400007640000000472007725503072012113 /* * feldrx.c -- FELDHELL receiver * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "trx.h" #include "feld.h" #include "filter.h" #include "fftfilt.h" #include "misc.h" #undef MAX #define MAX(a,b) (((a)>(b))?(a):(b)) #undef CLAMP #define CLAMP(x,low,high) (((x)>(high))?(high):(((x)<(low))?(low):(x))) static inline complex mixer(struct trx *trx, complex in) { struct feld *s = (struct feld *) trx->modem; complex z; c_re(z) = cos(s->rxphacc); c_im(z) = sin(s->rxphacc); z = cmul(z, in); s->rxphacc -= 2.0 * M_PI * trx->frequency / SampleRate; if (s->rxphacc > M_PI) s->rxphacc -= 2.0 * M_PI; else if (s->rxphacc < M_PI) s->rxphacc += 2.0 * M_PI; return z; } static void feld_rx(struct trx *trx, complex z) { struct feld *s = (struct feld *) trx->modem; double x; s->rxcounter += DownSampleInc; if (s->rxcounter < 1.0) return; s->rxcounter -= 1.0; x = cmod(z); if (x > s->agc) s->agc = x; else s->agc *= (1 - 0.02 / RxColumnLen); x = 255 * CLAMP(1.0 - x / s->agc, 0.0, 1.0); trx_put_rx_data((int) x); trx->metric = s->agc / 10.0; } int feld_rxprocess(struct trx *trx, float *buf, int len) { struct feld *s = (struct feld *) trx->modem; complex z, *zp; int i, n; if (trx->bandwidth != trx->hell_bandwidth) { float lp = trx->hell_bandwidth / 2.0 / SampleRate; fftfilt_set_freqs(s->fftfilt, 0, lp); trx->bandwidth = trx->hell_bandwidth; } while (len-- > 0) { /* create analytic signal... */ c_re(z) = c_im(z) = *buf++; filter_run(s->hilbert, z, &z); /* ...so it can be shifted in frequency */ z = mixer(trx, z); n = fftfilt_run(s->fftfilt, z, &zp); for (i = 0; i < n; i++) feld_rx(trx, zp[i]); } return 0; } gmfsk-0.7pre1/src/feld/feldtx.c0000644000076400007640000000771710100477004012110 /* * feldtx.c -- FELDHELL transmitter * * Copyright (C) 2001, 2002, 2003 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "trx.h" #include "feld.h" #include "misc.h" #include "snd.h" #include "filter.h" static gboolean dxmode = FALSE; static gint get_font_data(struct feld *s, gunichar c, gfloat *data, gint *len) { GdkImage *image; gint i, j, w, length; gfloat pixval; gchar chr[8]; gdk_threads_enter(); i = g_unichar_to_utf8(c, chr); pango_layout_set_text(s->layout, chr, i); pango_layout_get_pixel_size(s->layout, &w, NULL); // get_layout_position (entry, &x, &y); ????????? gdk_draw_rectangle(s->pixmap, s->gc_black, TRUE, 0, 0, PIXMAP_W, PIXMAP_H); gdk_draw_layout(s->pixmap, s->gc_white, 0, 0, s->layout); image = gdk_image_get(s->pixmap, 0, 0, PIXMAP_W, PIXMAP_H); pixval = (gfloat) (1 << s->depth); if (dxmode) length = *len / PIXMAP_H / 2; else length = *len / PIXMAP_H; w = MIN(w + 1, length); w = MIN(w, PIXMAP_W); for (i = 0; i < w; i++) { for (j = PIXMAP_H - 1; j >= 0; j--) *data++ = gdk_image_get_pixel(image, i, j) / pixval; if (dxmode == FALSE) continue; for (j = PIXMAP_H - 1; j >= 0; j--) *data++ = gdk_image_get_pixel(image, i, j) / pixval; } gdk_image_destroy(image); gdk_threads_leave(); if (dxmode) *len = 2 * w * PIXMAP_H; else *len = w * PIXMAP_H; return 0; } static inline double nco(struct feld *s, double freq) { double x = sin(s->txphacc); s->txphacc += 2.0 * M_PI * freq / SampleRate; if (s->txphacc > M_PI) s->txphacc -= 2.0 * M_PI; return x; } #define FNTBUFLEN (2*PIXMAP_W*PIXMAP_H) static void tx_char(struct trx *trx, gunichar c) { struct feld *s = (struct feld *) trx->modem; float fntbuf[FNTBUFLEN]; int fntlen = FNTBUFLEN; int outlen = 0; float pixel, *ptr; int i; /* handle tune signal */ if (c == -1) { for (i = 0; i < fntlen; i++) fntbuf[i] = nco(s, trx->frequency); sound_write(fntbuf, fntlen); return; } /* get font data */ if (get_font_data(s, c, fntbuf, &fntlen) < 0) return; ptr = fntbuf; pixel = *ptr++; fntlen--; /* upsample, filter and modulate */ for (;;) { float x; filter_I_run(s->txfilt, pixel, &x); trx->outbuf[outlen++] = x * nco(s, trx->frequency); if (outlen >= OUTBUFSIZE) { g_warning("feldtx: outbuf overflow\n"); break; } s->txcounter += UpSampleInc; if (s->txcounter < 1.0) continue; s->txcounter -= 1.0; if (fntlen == 0) break; pixel = *ptr++; fntlen--; } /* write to soundcard */ sound_write(trx->outbuf, outlen); /* rx echo */ feld_rxprocess(trx, trx->outbuf, outlen); } int feld_txprocess(struct trx *trx) { struct feld *s = (struct feld *) trx->modem; gunichar c; if (trx->tune) { trx->tune = 0; s->preamble = 0; s->postamble = 0; tx_char(trx, -1); return 0; } if (s->preamble-- > 0) { tx_char(trx, '.'); return 0; } c = trx_get_tx_char(); /* if TX buffer empty */ if (c == -1) { /* stop if requested to... */ if (trx->stopflag) { if (s->postamble-- > 0) { tx_char(trx, '.'); return 0; } tx_char(trx, ' '); return -1; } /* send idle character */ c = '.'; } if (c == '\r' || c == '\n') c = ' '; if (trx->hell_upper) c = g_unichar_toupper(c); tx_char(trx, c); return 0; } gmfsk-0.7pre1/src/cw/0000777000076400007640000000000010206176677010250 5gmfsk-0.7pre1/src/cw/Makefile.am0000644000076400007640000000044310114142762012203 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libcw.a libcw_a_SOURCES = \ cw.c cw.h \ cwrx.c \ cwtx.c \ morse.c morse.h gmfsk-0.7pre1/src/cw/Makefile.in0000644000076400007640000003020610206155265012220 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libcw.a libcw_a_SOURCES = \ cw.c cw.h \ cwrx.c \ cwtx.c \ morse.c morse.h subdir = src/cw ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libcw_a_AR = $(AR) cru libcw_a_LIBADD = am_libcw_a_OBJECTS = cw.$(OBJEXT) cwrx.$(OBJEXT) cwtx.$(OBJEXT) \ morse.$(OBJEXT) libcw_a_OBJECTS = $(am_libcw_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/cw.Po ./$(DEPDIR)/cwrx.Po \ @AMDEP_TRUE@ ./$(DEPDIR)/cwtx.Po ./$(DEPDIR)/morse.Po COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libcw_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libcw_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/cw/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libcw.a: $(libcw_a_OBJECTS) $(libcw_a_DEPENDENCIES) -rm -f libcw.a $(libcw_a_AR) libcw.a $(libcw_a_OBJECTS) $(libcw_a_LIBADD) $(RANLIB) libcw.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cw.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cwrx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cwtx.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/morse.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< .c.obj: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCC_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCC_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCC_TRUE@ fi @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/cw/cw.c0000644000076400007640000001346310166574626010751 /* * cw.c -- morse code modem * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include "trx.h" #include "cw.h" #include "morse.h" #include "fftfilt.h" static void cw_txinit(struct trx *trx) { struct cw *c = (struct cw *) trx->modem; c->phaseacc = 0; } static void cw_free(struct cw *s) { if (s) { fftfilt_free(s->fftfilt); g_free(s); } } static void cw_rxinit(struct trx *trx) { struct cw *c = (struct cw *) trx->modem; c->cw_receive_state = RS_IDLE; // set us waiting for a tone c->s_ctr = 0; // reset audio sample counter c->cw_rr_current = 0; // reset decoding pointer c->agc_peak = 0; // reset agc c->dec_ctr = 0; // reset decimation counter } static void cw_destructor(struct trx *trx) { struct cw *s = (struct cw *) trx->modem; cw_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } void cw_init(struct trx *trx) { struct cw *s; double lp; int i; s = g_new0(struct cw, 1); s->cw_send_speed = trx->cw_speed; s->cw_receive_speed = trx->cw_speed; s->cw_noise_spike_threshold = INITIAL_NOISE_THRESHOLD; s->cw_adaptive_receive_threshold = 2 * DOT_MAGIC / trx->cw_speed; // s->cw_gap = INITIAL_GAP; /* Initially no 'Farnsworth' gap */ memset(s->cw_receive_representation_buffer, 0, sizeof(s->cw_receive_representation_buffer)); // block of variables that get up dated each time speed changes s->cw_in_sync = FALSE; /* Synchronization flag */ cw_sync_parameters(s); // init the cw rx tracking arrays, sums and indexes to intial rx speed s->cw_dt_dot_tracking_sum = AVERAGE_ARRAY_LENGTH * s->cw_send_dot_length; s->cw_dt_dash_tracking_sum = AVERAGE_ARRAY_LENGTH * s->cw_send_dash_length; for (i = 0; i < AVERAGE_ARRAY_LENGTH; i++) { s->cw_dot_tracking_array[i] = s->cw_send_dot_length; s->cw_dash_tracking_array[i] = s->cw_send_dash_length; } s->cw_dt_dot_index = 0; s->cw_dt_dash_index = 0; lp = trx->cw_bandwidth / 2.0 / SampleRate; if ((s->fftfilt = fftfilt_init(0, lp, 1024)) == NULL) { cw_free(s); return; } if (cw_tables_init() == FALSE) { g_warning("cw_tables_init failed\n"); cw_free(s); return; } // setup function pointers for cw processes trx->modem = s; trx->txinit = cw_txinit; trx->rxinit = cw_rxinit; trx->txprocess = cw_txprocess; trx->rxprocess = cw_rxprocess; trx->destructor = cw_destructor; trx->samplerate = SampleRate; trx->fragmentsize = MaxSymLen; trx->bandwidth = trx->cw_bandwidth; } /** * cw_sync_parameters() * * Synchronize the dot, dash, end of element, end of character, and end * of word timings and ranges to new values of Morse speed, 'Farnsworth' * gap, or receive tolerance. */ void cw_sync_parameters(struct cw *c) { // Do nothing if we are already synchronized with speed/gap. if (c->cw_in_sync) return; // Send parameters: // Calculate the length of a Dot as 1200000 / speed in wpm, // and the length of a Dash as three Dot lengths. c->cw_send_dot_length = DOT_MAGIC / c->cw_send_speed; c->cw_send_dash_length = 3 * c->cw_send_dot_length; // calculate basic dot timing as number of samples of audio needed // this needs to fit in the trx outbuf[OUTBUFSIZE] so tx logic works c->symbollen = SampleRate * c->cw_send_dot_length / USECS_PER_SEC; if (c->symbollen > OUTBUFSIZE) { g_error("CW - fatal: dot length too long: %d\n", c->symbollen); /* abort() */ } // An end of element length is one Dot, end of character is // three Dots total, and end of word is seven Dots total. // c->cw_additional_delay = c->cw_gap * c->cw_send_dot_length; /* * For 'Farnsworth', there also needs to be an adjustment * delay added to the end of words, otherwise the rhythm * is lost on word end. I don't know if there is an * "official" value for this, but 2.33 or so times the * gap is the correctly scaled value, and seems to sound * okay. * * Thanks to Michael D. Ivey for * identifying this in earlier versions of cwlib. */ // c->cw_adjustment_delay = (7 * c->cw_additional_delay) / 3; // Receive parameters: c->cw_receive_speed = DOT_MAGIC / (c->cw_adaptive_receive_threshold / 2); // receive routines track speeds, but we put hard limits // on the speeds here if necessary. // (dot/dash threshold is 2 dots timing) if (c->cw_receive_speed < CW_MIN_SPEED) { c->cw_receive_speed = CW_MIN_SPEED; c->cw_adaptive_receive_threshold = 2 * DOT_MAGIC / CW_MIN_SPEED; } if (c->cw_receive_speed > CW_MAX_SPEED) { c->cw_receive_speed = CW_MAX_SPEED; c->cw_adaptive_receive_threshold = 2 * DOT_MAGIC / CW_MAX_SPEED; } // Calculate the basic receive dot and dash lengths. c->cw_receive_dot_length = DOT_MAGIC / c->cw_receive_speed; c->cw_receive_dash_length = 3 * c->cw_receive_dot_length; // Set the parameters in sync flag. c->cw_in_sync = TRUE; } gmfsk-0.7pre1/src/cw/cw.h0000644000076400007640000001426010114143212010722 /* * cw.h -- morse code modem * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _CW_H #define _CW_H #include "cmplx.h" #include "trx.h" #define SampleRate 8000 #define MaxSymLen 512 #define DEC_RATIO 8 /* decimation ratio for the receiver */ /* Limits on values of CW send and timing parameters */ #define CW_MIN_SPEED 5 /* Lowest WPM allowed */ #define CW_MAX_SPEED 60 /* Highest WPM allowed */ /* * Representation characters for Dot and Dash. Only the following * characters are permitted in Morse representation strings. */ #define CW_DOT_REPRESENTATION '.' #define CW_DASH_REPRESENTATION '-' /* CW function return status codes. */ #define CW_SUCCESS 0 #define CW_ERROR -1 #define ASC_NUL '\0' /* End of string */ #define ASC_SPACE ' ' /* ASCII space char */ /* Tone and timing magic numbers. */ #define TONE_MAGIC 1190000 /* Kernel tone delay magic number */ #define DOT_MAGIC 1200000 /* Dot length magic number. The Dot length is 1200000/WPM Usec */ #define TONE_SILENT 0 /* 0Hz = silent 'tone' */ #define USECS_PER_SEC 1000000 /* Microseconds in a second */ #define INITIAL_SEND_SPEED 18 /* Initial send speed in WPM */ #define INITIAL_RECEIVE_SPEED 18 /* Initial receive speed in WPM */ //#define INITIAL_GAP 0 /* Initial fransworth gap setting */ //#define INITIAL_TOLERANCE 60 /* Initial tolerance setting */ //#define INITIAL_ADAPTIVE TRUE /* Initial adaptive receive setting */ /* Initial adaptive speed threshold */ #define INITIAL_THRESHOLD ((DOT_MAGIC / INITIAL_RECEIVE_SPEED) * 2) /* Initial noise filter threshold */ #define INITIAL_NOISE_THRESHOLD ((DOT_MAGIC / CW_MAX_SPEED) / 2) struct cw { /* * Common stuff */ int symbollen; /* length of a dot in sound samples (tx) */ double phaseacc; /* used by NCO for rx/tx tones */ /* * RX related stuff */ unsigned int s_ctr; /* sample counter for timing cw rx */ unsigned int dec_ctr; /* decimation counter for rx */ double agc_peak; /* threshold for tone detection */ struct fftfilt *fftfilt; enum { RS_IDLE = 0, RS_IN_TONE, RS_AFTER_TONE } cw_receive_state; /* Indicates receive state */ enum { /* functions used by cw process routine */ CW_RESET_EVENT, CW_KEYDOWN_EVENT, CW_KEYUP_EVENT, CW_QUERY_EVENT } cw_event; /* storage for sync scope data */ double pipe[MaxSymLen]; unsigned int pipeptr; // int preamble; /* used for initial delay on tx, in dot times */ /* user configurable data - local copy passed in from gui */ int cw_send_speed; /* Initially 18 WPM */ int cw_receive_speed; /* Initially 18 WPM */ int cw_noise_spike_threshold; /* Initially ignore any tone < 10mS */ // int cw_gap; /* Initially no 'Farnsworth' gap */ /* * The following variables must be recalculated each time any of * the above Morse parameters associated with speeds, gap, * tolerance, or threshold change. Keeping these in step means * that we then don't have to spend time calculating them on the fly. * * Since they have to be kept in sync, the problem of how to * have them calculated on first call if none of the above * parameters has been changed is taken care of with a * synchronization flag. Doing this saves us from otherwise * having to have a 'library initialize' function. */ int cw_in_sync; /* Synchronization flag */ /* Sending parameters: */ int cw_send_dot_length; /* Length of a send Dot, in Usec */ int cw_send_dash_length; /* Length of a send Dash, in Usec */ // to be used for farnsworth timing // int cw_additional_delay; /* More delay at the end of a char */ // int cw_adjustment_delay; /* More delay at the end of a word */ /* Receiving parameters: */ int cw_receive_dot_length; /* Length of a receive Dot, in Usec */ int cw_receive_dash_length; /* Length of a receive Dash, in Usec */ /* * Receive buffering. This is a fixed-length representation, filled in * as tone on/off timings are taken. */ #define RECEIVE_CAPACITY 256 /* Way longer than any representation */ char cw_receive_representation_buffer[RECEIVE_CAPACITY]; int cw_rr_current; /* Receive buffer current location */ unsigned int cw_rr_start_timestamp; /* Tone start timestamp */ unsigned int cw_rr_end_timestamp; /* Tone end timestamp */ /* * variable which is automatically maintained from the Morse input * stream, rather than being settable by the user. */ int cw_adaptive_receive_threshold; /* 2-dot threshold for adaptive speed */ /* * Receive adaptive speed tracking. We keep a small array of dot * lengths, and a small array of dash lengths. We also keep a * running sum of the elements of each array, and an index to the * current array position. */ #define AVERAGE_ARRAY_LENGTH 10 /* Keep 10 dot/dash lengths */ int cw_dot_tracking_array[AVERAGE_ARRAY_LENGTH]; int cw_dash_tracking_array[AVERAGE_ARRAY_LENGTH]; /* Dot and dash length arrays */ int cw_dt_dot_index; int cw_dt_dash_index; /* Circular indexes into the arrays */ int cw_dt_dot_tracking_sum; int cw_dt_dash_tracking_sum; /* Running sum of array members */ }; /* in cw.c */ extern void cw_init(struct trx *trx); extern void cw_sync_parameters(struct cw *c); /* in cwrx.c */ extern int cw_rxprocess(struct trx *trx, float *buf, int len); /* in cwtx.c */ extern int cw_txprocess(struct trx *trx); #endif gmfsk-0.7pre1/src/cw/cwrx.c0000644000076400007640000003241510166574644011321 /* * cwrx.c -- morse code demodulator * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include #include #include "trx.h" #include "cw.h" #include "morse.h" #include "filter.h" #include "fftfilt.h" #include "misc.h" static int cw_process(struct trx *trx, int cw_event, unsigned char **c); /* ======================================================================= update_syncscope() Routine called to update the display on the sync scope display. For CW this is an o scope pattern that shows the cw data stream. ======================================================================= */ static void update_syncscope(struct cw *s) { float data[MaxSymLen]; int i, j; for (i = 0; i < MaxSymLen; i++) { j = (i + s->pipeptr) % MaxSymLen; data[i] = s->pipe[j] / s->agc_peak; } /* set o scope... data[], length, autoscale */ trx_set_scope(data, MaxSymLen, FALSE); /* show rx wpm on quality dial */ trx_set_metric(s->cw_receive_speed); } /* ===================================================================== cw_rxprocess() Called with a block (512 samples) of audio. ======================================================================= */ int cw_rxprocess(struct trx *trx, float *buf, int len) { struct cw *s = (struct cw *) trx->modem; complex z, *zp; int n, i; double delta; double value; unsigned char *c; /* check if user changed filter bandwidth */ if (trx->bandwidth != trx->cw_bandwidth) { fftfilt_set_freqs(s->fftfilt, 0, trx->cw_bandwidth / 2.0 / SampleRate); trx->bandwidth = trx->cw_bandwidth; } /* compute phase increment expected at our specific rx tone freq */ delta = 2.0 * M_PI * trx->frequency / SampleRate; while (len-- > 0) { /* Mix with the internal NCO */ c_re(z) = *buf * cos(s->phaseacc); c_im(z) = *buf * sin(s->phaseacc); buf++; s->phaseacc += delta; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; n = fftfilt_run(s->fftfilt, z, &zp); for (i = 0; i < n; i++) { /* * update the basic sample counter used for * morse timing */ s->s_ctr++; /* downsample by 8 */ if (++s->dec_ctr < DEC_RATIO) continue; else s->dec_ctr = 0; /* demodulate */ value = cmod(zp[i]); /* * Compute a variable threshold value for tone * detection. Fast attack and slow decay. */ if (value > s->agc_peak) s->agc_peak = value; else s->agc_peak = decayavg(s->agc_peak, value, SampleRate / 10); /* * save correlation amplitude value for the * sync scope */ s->pipe[s->pipeptr] = value; s->pipeptr = (s->pipeptr + 1) % MaxSymLen; if (s->pipeptr == MaxSymLen - 1) update_syncscope(s); if (!trx->squelchon || value > trx->cw_squelch / 5000) { /* upward trend means tone starting */ if ((value > 0.66 * s->agc_peak) && (s->cw_receive_state != RS_IN_TONE)) cw_process(trx, CW_KEYDOWN_EVENT, NULL); /* downward trend means tone stopping */ if ((value < 0.33 * s->agc_peak) && (s->cw_receive_state == RS_IN_TONE)) cw_process(trx, CW_KEYUP_EVENT, NULL); } /* * We could put a gear on this... we dont really * need to check for new characters being ready * 1000 times/sec. There does not appear to be * much overhead the way it is. */ if (cw_process(trx, CW_QUERY_EVENT, &c) == CW_SUCCESS) while (*c) trx_put_rx_char(*c++); } } return 0; } /* ---------------------------------------------------------------------- */ /* routines swiped from unix-cw project... adapted for gmfsk */ /** * cw_compare_timestamps() * * Compare two timestamps, and return the difference between them in usecs. */ int cw_compare_timestamps(unsigned int earlier, unsigned int later) { /* * Compare the timestamps. * * At 4 WPM, the dash length is 3*(1200000/4)=900,000 usecs, and * the word gap is 2,100,000 usecs. With the maximum Farnsworth * additional delay, the word gap extends to 8,100,000 usecs. * This fits into an int with a lot of room to spare, in fact, * an int can represent ~2000,000,000 usecs, or around 33 minutes. */ /* Convert sound samples to micro seconds */ if (earlier >= later) { return 0; } else return (int) (((double) (later - earlier) * USECS_PER_SEC) / SampleRate); } /* ======================================================================= cw_update_tracking() This gets called everytime we have a dot dash sequence or a dash dot sequence. Since we have semi validated tone durations, we can try and track the cw speed by adjusting the cw_adaptive_receive_threshold variable. This is done by running averages where the newest data replaces the oldest data. ======================================================================= */ void cw_update_tracking(struct trx *trx, int dot, int dash) { struct cw *s = (struct cw *) trx->modem; int average_dot; /* Averaged dot length */ int average_dash; /* Averaged dash length */ // Update the dot data held for averaging. s->cw_dt_dot_tracking_sum -= s->cw_dot_tracking_array[s->cw_dt_dot_index]; s->cw_dot_tracking_array[s->cw_dt_dot_index++] = dot; s->cw_dt_dot_index %= AVERAGE_ARRAY_LENGTH; s->cw_dt_dot_tracking_sum += dot; // Update the dash data held for averaging. s->cw_dt_dash_tracking_sum -= s->cw_dash_tracking_array[s->cw_dt_dash_index]; s->cw_dash_tracking_array[s->cw_dt_dash_index++] = dash; s->cw_dt_dash_index %= AVERAGE_ARRAY_LENGTH; s->cw_dt_dash_tracking_sum += dash; // update speed values based on new dot/dash avgs // Recalculate the adaptive threshold from the values currently // held in the averaging arrays. The threshold is calculated as // (avg dash length - avg dot length) / 2 + avg dot_length. average_dot = s->cw_dt_dot_tracking_sum / AVERAGE_ARRAY_LENGTH; average_dash = s->cw_dt_dash_tracking_sum / AVERAGE_ARRAY_LENGTH; s->cw_adaptive_receive_threshold = (average_dash - average_dot) / 2 + average_dot; // force a recalc and limits checks on all internal timing variables s->cw_in_sync = FALSE; cw_sync_parameters(s); } /* ======================================================================= cw_process() high level cw decoder... gets called with keyup, keydown, reset and query commands. Keyup/down influences decoding logic. Reset starts everything out fresh. The query command returns CW_SUCCESS and the character that has been decoded (may be '*',' ' or [a-z,0-9] or a few others) If there is no data ready, CW_ERROR is returned. ======================================================================= */ static int cw_process(struct trx *trx, int cw_event, unsigned char **c) { struct cw *s = (struct cw *) trx->modem; static int space_sent = TRUE; // for word space logic static int last_element = 0; // length of last dot/dash int element_usec; // Time difference in usecs switch (cw_event) { case CW_RESET_EVENT: cw_sync_parameters(s); s->cw_receive_state = RS_IDLE; s->cw_rr_current = 0; // reset decoding pointer s->s_ctr = 0; // reset audio sample counter memset(s->cw_receive_representation_buffer, 0, sizeof(s->cw_receive_representation_buffer)); break; case CW_KEYDOWN_EVENT: // A receive tone start can only happen while we // are idle, or in the middle of a character. if (s->cw_receive_state == RS_IN_TONE) return CW_ERROR; // first tone in idle state reset audio sample counter if (s->cw_receive_state == RS_IDLE) { s->s_ctr = 0; memset(s->cw_receive_representation_buffer, 0, sizeof(s->cw_receive_representation_buffer)); s->cw_rr_current = 0; } // save the timestamp s->cw_rr_start_timestamp = s->s_ctr; // Set state to indicate we are inside a tone. s->cw_receive_state = RS_IN_TONE; return CW_ERROR; break; case CW_KEYUP_EVENT: // The receive state is expected to be inside a tone. if (s->cw_receive_state != RS_IN_TONE) return CW_ERROR; // Save the current timestamp s->cw_rr_end_timestamp = s->s_ctr; element_usec = cw_compare_timestamps(s->cw_rr_start_timestamp, s->cw_rr_end_timestamp); // make sure our timing values are up to date cw_sync_parameters(s); // If the tone length is shorter than any noise cancelling // threshold that has been set, then ignore this tone. if (s->cw_noise_spike_threshold > 0 && element_usec <= s->cw_noise_spike_threshold) return CW_ERROR; // Set up to track speed on dot-dash or dash-dot pairs // for this test to work, we need a dot dash pair or a // dash dot pair to validate timing from and force the // speed tracking in the right direction. This method // is fundamentally different than the method in the // unix cw project. Great ideas come from staring at the // screen long enough!. Its kind of simple really... // when you have no idea how fast or slow the cw is... // the only way to get a threshold is by having both // code elements and setting the threshold between them // knowing that one is supposed to be 3 times longer // than the other. with straight key code... this gets // quite variable, but with most faster cw sent with // electronic keyers, this is one relationship that is // quite reliable. if (last_element > 0) { // check for dot dash sequence (current should be 3 x last) if ((element_usec > 2 * last_element) && (element_usec < 4 * last_element)) { cw_update_tracking(trx, last_element, element_usec); } // check for dash dot sequence (last should be 3 x current) if ((last_element > 2 * element_usec) && (last_element < 4 * element_usec)) { cw_update_tracking(trx, element_usec, last_element); } } last_element = element_usec; // ok... do we have a dit or a dah? // a dot is anything shorter than 2 dot times if (element_usec <= s->cw_adaptive_receive_threshold) { s->cw_receive_representation_buffer[s->cw_rr_current++] = CW_DOT_REPRESENTATION; } else { // a dash is anything longer than 2 dot times s->cw_receive_representation_buffer[s->cw_rr_current++] = CW_DASH_REPRESENTATION; } // We just added a representation to the receive buffer. // If it's full, then reset everything as it probably noise if (s->cw_rr_current == RECEIVE_CAPACITY - 1) { s->cw_receive_state = RS_IDLE; s->cw_rr_current = 0; // reset decoding pointer s->s_ctr = 0; // reset audio sample counter return CW_ERROR; } else // zero terminate representation s->cw_receive_representation_buffer[s->cw_rr_current] = 0; // All is well. Move to the more normal after-tone state. s->cw_receive_state = RS_AFTER_TONE; return CW_ERROR; break; case CW_QUERY_EVENT: // this should be called quite often // (faster than inter-character gap) It looks after timing // key up intervals and determining when a character, // a word space, or an error char '*' should be returned. // CW_SUCCESS is returned when there is a printable character. // nothing to do if we are in a tone if (s->cw_receive_state == RS_IN_TONE) return CW_ERROR; // in this call we expect a pointer to a char to be valid if (c == NULL) { // else we had no place to put character... g_warning("%s:%d cant return character\n", __FILE__, __LINE__); s->cw_receive_state = RS_IDLE; s->cw_rr_current = 0; // reset decoding pointer return CW_ERROR; } // compute length of silence so far cw_sync_parameters(s); element_usec = cw_compare_timestamps(s->cw_rr_end_timestamp, s->s_ctr); // SHORT time since keyup... nothing to do yet if (element_usec < (2 * s->cw_receive_dot_length)) return CW_ERROR; // MEDIUM time since keyup... check for character space // one shot through this code via receive state logic if (element_usec >= (2 * s->cw_receive_dot_length) && element_usec <= (4 * s->cw_receive_dot_length) && s->cw_receive_state == RS_AFTER_TONE) { /* Look up the representation */ *c = cw_rx_lookup(s->cw_receive_representation_buffer); if (*c == NULL) // invalid decode... let user see error *c = "*"; s->cw_receive_state = RS_IDLE; s->cw_rr_current = 0; // reset decoding pointer space_sent = FALSE; return CW_SUCCESS; } // LONG time since keyup... check for a word space if ((element_usec > (4 * s->cw_receive_dot_length)) && !space_sent) { *c = " "; space_sent = TRUE; return CW_SUCCESS; } // should never get here... catch all return CW_ERROR; break; } // should never get here... catch all return CW_ERROR; } gmfsk-0.7pre1/src/cw/cwtx.c0000644000076400007640000001472310114143275011306 /* * cwtx.c -- morse code modulator * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "trx.h" #include "cw.h" #include "morse.h" #include "snd.h" /* Define the amplitude envelop for key down events (32 samples long) */ /* this is 1/2 cycle of a raised cosine */ /* the tables with 32 entries give about 4ms rise and fall times */ /* when using 8000 samples/sec. This shaping of the cw pulses is */ /* very necssary to avoid having a very wide and clicky cw signal */ /* when using the sound card to gen cw. When using the rig key input */ /* the shaping is done in the rig hardware, but we want to be able to */ /* pick one cw signal out of a cluster and be able to respond on his freq. */ #define KNUM 32 double kdshape[KNUM] = { 0.00240750255310301, 0.00960708477768751, 0.02152941088003600, 0.03805966253618680, 0.05903864465505320, 0.08426431851158830, 0.11349374748686800, 0.14644543667658500, 0.18280204383628200, 0.22221343555548300, 0.26430005922814900, 0.30865659834558700, 0.35485587590940700, 0.40245296837259500, 0.45098949048925500, 0.49999800980765500, 0.54900654829266300, 0.59754312772456200, 0.64514031509964400, 0.69133972425796200, 0.73569643038517400, 0.77778325487450100, 0.81719487928327800, 0.85355174876454100, 0.88650372738152000, 0.91573347010241700, 0.94095947900139100, 0.96193881423287900, 0.97846943367117300, 0.99039213868324900, 0.99759210729604500, 0.99999999999295900 }; double kushape[KNUM] = { 0.99999999999295900, 0.99759210729604500, 0.99039213868324900, 0.97846943367117300, 0.96193881423287900, 0.94095947900139100, 0.91573347010241700, 0.88650372738152000, 0.85355174876454100, 0.81719487928327800, 0.77778325487450100, 0.73569643038517400, 0.69133972425796200, 0.64514031509964400, 0.59754312772456200, 0.54900654829266300, 0.49999800980765500, 0.45098949048925500, 0.40245296837259500, 0.35485587590940700, 0.30865659834558700, 0.26430005922814900, 0.22221343555548300, 0.18280204383628200, 0.14644543667658500, 0.11349374748686800, 0.08426431851158830, 0.05903864465505320, 0.03805966253618680, 0.02152941088003600, 0.00960708477768751, 0.00240750255310301 }; static inline double nco(struct cw *s, double freq) { s->phaseacc += 2.0 * M_PI * freq / SampleRate; if (s->phaseacc > M_PI) s->phaseacc -= 2.0 * M_PI; return cos(s->phaseacc); } /* ===================================================================== send_symbol() Sends a part of a morse character (one dot duration) of either sound at the correct freq or silence. Rise and fall time is controlled with a raised cosine shape. ======================================================================= */ static void send_symbol(struct trx *trx, int symbol) { struct cw *s = (struct cw *) trx->modem; double freq; int i; static int lastkey = 0; freq = trx->frequency; freq += trx->txoffset; if ((lastkey == 0) && (symbol == 1)) { /* key going down */ for (i = 0; i < KNUM; i++) trx->outbuf[i] = nco(s, freq) * kdshape[i]; for (; i < s->symbollen; i++) trx->outbuf[i] = nco(s, freq); } if ((lastkey == 1) && (symbol == 0)) { /* key going up */ for (i = 0; i < KNUM; i++) trx->outbuf[i] = nco(s, freq) * kushape[i]; for (; i < s->symbollen; i++) trx->outbuf[i] = 0.0; } if ((lastkey == 0) && (symbol == 0)) { /* key is up */ for (i = 0; i < s->symbollen; i++) trx->outbuf[i] = 0.0; } if ((lastkey == 1) && (symbol == 1)) { /* key is down */ for (i = 0; i < s->symbollen; i++) trx->outbuf[i] = nco(s, freq); } sound_write(trx->outbuf, s->symbollen); lastkey = symbol; } /* ===================================================================== send_ch() sends a morse character and the space afterwards ======================================================================= */ static void send_ch(struct trx *trx, int symbol) { struct cw *s = (struct cw *) trx->modem; int code; // fprintf(stderr,"sending %c\n",(char)symbol); // compute number of samples of audio in one dot at current wpm if (s->cw_send_speed != trx->cw_speed) { s->cw_send_speed = trx->cw_speed; s->cw_in_sync = FALSE; } cw_sync_parameters(s); /* handle word space separately (7 dots spacing) */ /* last char already had 2 dots of inter-character spacing sent with it */ if ((symbol == ' ') || (symbol == '\n')) { send_symbol(trx, 0); send_symbol(trx, 0); send_symbol(trx, 0); send_symbol(trx, 0); send_symbol(trx, 0); trx_put_echo_char(symbol); return; } /* convert character code to a morse representation */ if ((symbol < UCHAR_MAX + 1) && (symbol >= 0)) code = cw_tx_lookup(symbol); else code = 0x4L; // fprintf(stderr,"code 0x%08X\n", code); /* loop sending out binary bits of cw character */ while (code > 1) { send_symbol(trx, code & 1); code = code >> 1; } if (symbol != 0) trx_put_echo_char(symbol); } /* ===================================================================== cw_txprocess() Read charcters from screen and send them out the sound card. This is called repeatedly from a thread during tx. ======================================================================= */ int cw_txprocess(struct trx *trx) { // struct cw *s = (struct cw *) trx->modem; int c; if (trx->tune) { trx->tune = 0; send_symbol(trx, 1); return 0; } c = trx_get_tx_char(); /* TX buffer empty */ if (c == -1) { /* stop if requested to... */ if (trx->stopflag) return -1; send_symbol(trx, 0); return 0; } send_ch(trx, c); return 0; } gmfsk-0.7pre1/src/cw/morse.c0000644000076400007640000002202010115420753011433 /* * morse.c -- morse code tables * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include #include #include "morse.h" #include "cw.h" /* ---------------------------------------------------------------------- */ /* * Morse code characters table. This table allows lookup of the Morse * shape of a given alphanumeric character. Shapes are held as a string, * with '-' representing dash, and '.' representing dot. The table ends * with a NULL entry. * * This is the main table from which the other tables are computed. */ #define CW_ENTRY_NORMAL 0 #define CW_ENTRY_EXTENDED 1 typedef struct { const unsigned char *chr; /* The character(s) represented */ const unsigned char *rpr; /* Dot-dash shape of the character */ const int type; /* Type of the entry */ } cw_table_entry; static cw_table_entry cw_table[] = { /* ASCII 7bit letters */ {"Aa", ".-", CW_ENTRY_NORMAL}, {"Bb", "-...", CW_ENTRY_NORMAL}, {"Cc", "-.-.", CW_ENTRY_NORMAL}, {"Dd", "-..", CW_ENTRY_NORMAL}, {"Ee", ".", CW_ENTRY_NORMAL}, {"Ff", "..-.", CW_ENTRY_NORMAL}, {"Gg", "--.", CW_ENTRY_NORMAL}, {"Hh", "....", CW_ENTRY_NORMAL}, {"Ii", "..", CW_ENTRY_NORMAL}, {"Jj", ".---", CW_ENTRY_NORMAL}, {"Kk", "-.-", CW_ENTRY_NORMAL}, {"Ll", ".-..", CW_ENTRY_NORMAL}, {"Mm", "--", CW_ENTRY_NORMAL}, {"Nn", "-.", CW_ENTRY_NORMAL}, {"Oo", "---", CW_ENTRY_NORMAL}, {"Pp", ".--.", CW_ENTRY_NORMAL}, {"Qq", "--.-", CW_ENTRY_NORMAL}, {"Rr", ".-.", CW_ENTRY_NORMAL}, {"Ss", "...", CW_ENTRY_NORMAL}, {"Tt", "-", CW_ENTRY_NORMAL}, {"Uu", "..-", CW_ENTRY_NORMAL}, {"Vv", "...-", CW_ENTRY_NORMAL}, {"Ww", ".--", CW_ENTRY_NORMAL}, {"Xx", "-..-", CW_ENTRY_NORMAL}, {"Yy", "-.--", CW_ENTRY_NORMAL}, {"Zz", "--..", CW_ENTRY_NORMAL}, /* Numerals */ {"0", "-----", CW_ENTRY_NORMAL}, {"1", ".----", CW_ENTRY_NORMAL}, {"2", "..---", CW_ENTRY_NORMAL}, {"3", "...--", CW_ENTRY_NORMAL}, {"4", "....-", CW_ENTRY_NORMAL}, {"5", ".....", CW_ENTRY_NORMAL}, {"6", "-....", CW_ENTRY_NORMAL}, {"7", "--...", CW_ENTRY_NORMAL}, {"8", "---..", CW_ENTRY_NORMAL}, {"9", "----.", CW_ENTRY_NORMAL}, /* Punctuation */ {"\"", ".-..-.", CW_ENTRY_NORMAL}, {"'", ".----.", CW_ENTRY_NORMAL}, {"$", "...-..-", CW_ENTRY_NORMAL}, // {"(", "-.--.", CW_ENTRY_NORMAL}, {")", "-.--.-", CW_ENTRY_NORMAL}, // {"+", ".-.-.", CW_ENTRY_NORMAL}, {",", "--..--", CW_ENTRY_NORMAL}, {"-", "-....-", CW_ENTRY_NORMAL}, {".", ".-.-.-", CW_ENTRY_NORMAL}, {"/", "-..-.", CW_ENTRY_NORMAL}, {":", "---...", CW_ENTRY_NORMAL}, {";", "-.-.-.", CW_ENTRY_NORMAL}, {"=", "-...-", CW_ENTRY_NORMAL}, {"?", "..--..", CW_ENTRY_NORMAL}, {"_", "..--.-", CW_ENTRY_NORMAL}, {"@", ".--.-.", CW_ENTRY_NORMAL}, {"!", "-.-.--", CW_ENTRY_NORMAL}, /* ISO 8859-1 accented characters */ {"\334\374", "..--", CW_ENTRY_NORMAL}, /* U diaeresis */ {"\304\344", ".-.-", CW_ENTRY_NORMAL}, /* A diaeresis */ {"\307\347", "-.-..", CW_ENTRY_NORMAL}, /* C cedilla */ {"\326\366", "---.", CW_ENTRY_NORMAL}, /* O diaeresis */ {"\311\351", "..-..", CW_ENTRY_NORMAL}, /* E acute */ {"\310\350", ".-..-", CW_ENTRY_NORMAL}, /* E grave */ {"\305\345", ".--.-", CW_ENTRY_NORMAL}, /* A ring */ {"\321\361", "--.--", CW_ENTRY_NORMAL}, /* N tilde */ /* ISO 8859-2 accented characters */ {"\252", "----", CW_ENTRY_NORMAL}, /* S cedilla */ {"\256", "--..-", CW_ENTRY_NORMAL}, /* Z dot above */ /* special characters */ {"", "...-.-", CW_ENTRY_EXTENDED}, {"", "-.--.", CW_ENTRY_EXTENDED}, {"", ".-.-.", CW_ENTRY_EXTENDED}, {"", "...-.", CW_ENTRY_EXTENDED}, /* Sentinel end of table value */ {NULL, NULL, 0} }; /* ---------------------------------------------------------------------- */ #define MorseTableSize (UCHAR_MAX + 1) /* * computer readable Morse code table for RX * * You should tokenize the received code representation string with * cw_tokenize_representation() and then look up the character from * this table. */ static cw_table_entry *cw_rx_lookup_table[MorseTableSize]; /* * computer readable Morse code table for TX * * For a given character you should pick up a 31-bit code from the table. * Bits should be taken starting from the LSB. * Bit equal 1 means carrier ON, bit 0 means carrier off * Each code includes one quiet dot at the start and two at the end. * The code should be read until the last '1', * but this last '1' must not be transmitted */ static unsigned long cw_tx_lookup_table[MorseTableSize]; /* ---------------------------------------------------------------------- */ /** * cw_tokenize_representation() * * Return a token value, in the range 2-255, for a lookup table representation. * The routine returns 0 if no valid token could be made from the string. To * avoid casting the value a lot in the caller (we want to use it as an array * index), we actually return an unsigned int. * * This token algorithm is designed ONLY for valid CW representations; that is, * strings composed of only '.' and '-', and in this case, strings shorter than * eight characters. The algorithm simply turns the representation into a * 'bitmask', based on occurrences of '.' and '-'. The first bit set in the * mask indicates the start of data (hence the 7-character limit). This mask * is viewable as an integer in the range 2 (".") to 255 ("-------"), and can * be used as an index into a fast lookup array. */ static unsigned int cw_tokenize_representation(const char *representation) { unsigned int token; /* Return token value */ const char *sptr; /* Pointer through string */ /* * Our algorithm can handle only 7 characters of representation. * And we insist on there being at least one character, too. */ if (strlen(representation) > CHAR_BIT - 1 || strlen(representation) < 1) return 0; /* * Build up the token value based on the dots and dashes. Start the * token at 1 - the sentinel (start) bit. */ for (sptr = representation, token = 1; *sptr != ASC_NUL; sptr++) { /* * Left-shift the sentinel (start) bit. */ token <<= 1; /* * If the next element is a dash, OR in another bit. If it is * not a dash or a dot, then there is an error in the repres- * entation string. */ if (*sptr == CW_DASH_REPRESENTATION) token |= 1; else if (*sptr != CW_DOT_REPRESENTATION) return 0; } /* Return the value resulting from our tokenization of the string. */ return token; } /* ---------------------------------------------------------------------- */ int cw_tables_init(void) { cw_table_entry *cw; /* Pointer to table entry */ unsigned int i; const unsigned char *p; long code; int len; /* For each main table entry, create a token entry. */ for (cw = cw_table; cw->chr != NULL; cw++) { i = cw_tokenize_representation(cw->rpr); if (i != 0) cw_rx_lookup_table[i] = cw; else return FALSE; } /* Clear the TX table */ for (i = 0; i < MorseTableSize; i++) cw_tx_lookup_table[i] = 0x04; /* Build TX table */ for (cw = cw_table; cw->chr != NULL; cw++) { if (cw->type == CW_ENTRY_EXTENDED) continue; len = strlen(cw->rpr); code = 4; while (len-- > 0) { if (cw->rpr[len] == CW_DASH_REPRESENTATION) { code = (code << 1) | 1; code = (code << 1) | 1; code = (code << 1) | 1; } else code = (code << 1) | 1; code <<= 1; } for (p = cw->chr; *p != 0; p++) cw_tx_lookup_table[*p] = code; } #if 0 for (i = 0; i < MorseTableSize; i++) { printf("\t0x%08lXL,\t\t// 0x%02X", cw_tx_lookup_table[i], i); if (isgraph(i)) printf(" = '%c'\n", i); else printf("\n"); } #endif return TRUE; } const unsigned char *cw_rx_lookup(const char *r) { static unsigned char chr[2]; /* FIXME */ unsigned char token; cw_table_entry *cw; /* Pointer to table entry */ if ((token = cw_tokenize_representation(r)) == 0) return NULL; if ((cw = cw_rx_lookup_table[token]) == NULL) return NULL; if (cw->type == CW_ENTRY_EXTENDED) return cw->chr; chr[0] = cw->chr[0]; chr[1] = 0; return chr; } unsigned long cw_tx_lookup(unsigned char c) { return cw_tx_lookup_table[c]; } /* ---------------------------------------------------------------------- */ gmfsk-0.7pre1/src/cw/morse.h0000644000076400007640000000246710114146506011455 /* * morse.h -- morse code tables * * Copyright (C) 2004 * Lawrence Glaister (ve7it@shaw.ca) * Tomi Manninen (oh2bns@sral.fi) * * This modem borrowed heavily from other gmfsk modems and * also from the unix-cw project. I would like to thank those * authors for enriching my coding experience by providing * and supporting open source. * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #ifndef _MORSE_H #define _MORSE_H extern int cw_tables_init(void); extern const unsigned char *cw_rx_lookup(const char *r); extern unsigned long cw_tx_lookup(unsigned char c); #endif gmfsk-0.7pre1/src/olivia/0000777000076400007640000000000010206176677011122 5gmfsk-0.7pre1/src/olivia/Makefile.am0000644000076400007640000000052510167566527013077 INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libolivia.a libolivia_a_SOURCES = \ cmpx.h \ fft.h \ fht.h \ fifo.h \ gray.h \ lowpass3.h \ mfsk.h \ struc.h \ olivia.cc gmfsk-0.7pre1/src/olivia/Makefile.in0000644000076400007640000003030610206155267013075 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ INCLUDES = \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ @PACKAGE_CFLAGS@ \ -I$(top_srcdir)/src \ -I$(top_srcdir)/src/misc noinst_LIBRARIES = libolivia.a libolivia_a_SOURCES = \ cmpx.h \ fft.h \ fht.h \ fifo.h \ gray.h \ lowpass3.h \ mfsk.h \ struc.h \ olivia.cc subdir = src/olivia ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = LIBRARIES = $(noinst_LIBRARIES) libolivia_a_AR = $(AR) cru libolivia_a_LIBADD = am_libolivia_a_OBJECTS = olivia.$(OBJEXT) libolivia_a_OBJECTS = $(am_libolivia_a_OBJECTS) DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles @AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/olivia.Po CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) CXXLD = $(CXX) CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ -o $@ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ DIST_SOURCES = $(libolivia_a_SOURCES) DIST_COMMON = Makefile.am Makefile.in SOURCES = $(libolivia_a_SOURCES) all: all-am .SUFFIXES: .SUFFIXES: .cc .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/olivia/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) AR = ar clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libolivia.a: $(libolivia_a_OBJECTS) $(libolivia_a_DEPENDENCIES) -rm -f libolivia.a $(libolivia_a_AR) libolivia.a $(libolivia_a_OBJECTS) $(libolivia_a_LIBADD) $(RANLIB) libolivia.a mostlyclean-compile: -rm -f *.$(OBJEXT) core *.core distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/olivia.Po@am__quote@ distclean-depend: -rm -rf ./$(DEPDIR) .cc.o: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCXX_TRUE@ -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCXX_TRUE@ fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< .cc.obj: @am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" \ @am__fastdepCXX_TRUE@ -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi`; \ @am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; \ @am__fastdepCXX_TRUE@ else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; \ @am__fastdepCXX_TRUE@ fi @AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `if test -f '$<'; then $(CYGPATH_W) '$<'; else $(CYGPATH_W) '$(srcdir)/$<'; fi` uninstall-info-am: ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(LIBRARIES) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-compile distclean-depend \ distclean-generic distclean-tags dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ clean-noinstLIBRARIES ctags distclean distclean-compile \ distclean-depend distclean-generic distclean-tags distdir dvi \ dvi-am info info-am install install-am install-data \ install-data-am install-exec install-exec-am install-info \ install-info-am install-man install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-info-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/src/olivia/cmpx.h0000644000076400007640000001234710172016646012154 // Complex numbers // (c) 1999-2003, Pawel Jalocha #ifndef __CMPX_H__ #define __CMPX_H__ #include #include // ---------------------------------------------------------------------------- // float/double/other-complex type template class Cmpx { public: Type Re,Im; public: template Cmpx const &operator=(const Cmpx &New) { Re=New.Re; Im=New.Im; return (*this); } template Cmpx const &operator=(const Type2 &New) { Re=New; Im=0; return (*this); } template void Set(Type2 NewRe, Type2 NewIm=0) { Re=NewRe; Im=NewIm; } template void Set(Cmpx New) { Re=New.Re; Im=New.Im; } void SetPhase(double Phase, double Mag=1.0) { Re=Mag*cos(Phase); Im=Mag*sin(Phase); } void Conugate(void) { Im=(-Im); } void Negate(void) { Re=(-Re); Im=(-Im); } void QuarterTurnLeft(void) { Type OldIm=Im; Im=Re; Re=(-OldIm); } void QuarterTurnRight(void) { Type OldIm=Im; Im=(-Re); Re=OldIm; } double Energy(void) { return Re*Re+Im*Im; } double Mag2(void) { return Re*Re+Im*Im; } double Mag(void) { return sqrt(Re*Re+Im*Im); } double Phase(void) { return atan2(Im,Re); } int Zero(void) { return (Re==0)&&(Im==0); } int NotZero(void) { return (Re!=0)||(Im!=0); } // template // void operator *= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } // template // void operator /= (const Type2 Mult) // { Re*=Mult; Im*=Mult; } template double VectDotProd(Cmpx X) { return Re*X.Re+Im*X.Im; } void Print(char *Form="%+6.3f") { printf("["); printf(Form,Re); printf(","); printf(Form,Im); printf("]"); } } ; typedef Cmpx fcmpx; typedef Cmpx dcmpx; // Some complex operators: // at least with the BC++ they carry some overhead because // a function is always called instead of making the code inline. template // equal (both Re and Im) ? inline int operator ==(Cmpx &Left, Cmpx &Right) { return (Left.Re==Right.Re)&&(Left.Im==Right.Im); } template // equal (both Re and Im) ? inline int operator !=(Cmpx &Left, Cmpx &Right) { return (Left.Re!=Right.Re)||(Left.Im!=Right.Im); } template // equal ? inline int operator ==(Cmpx &Left, type &Right) { return (Left.Re==Right)&&(Left.Im==0); } template // not equal ? inline int operator !=(Cmpx &Left, RightType &Right) { return (Left.Re!=Right)||(Left.Im!=0); } template // bigger (magnitude) ? inline int operator >(Cmpx &Left, Cmpx &Right) { return Left.Mag2() > Right.Mag2(); } template // smaller (magnitude) ? inline int operator <(Cmpx &Left, Cmpx &Right) { return Left.Mag2() < Right.Mag2(); } template // addition to the argument on the left inline void operator +=(Cmpx &Dst, Cmpx &Src) { Dst.Re+=Src.Re; Dst.Im+=Src.Im; } template // subtraction from the argument on the left inline void operator -=(Cmpx &Dst, Cmpx &Src) { Dst.Re-=Src.Re; Dst.Im-=Src.Im; } template // multiplication by a scalar inline void operator *=(Cmpx &Dst, num Src) { Dst.Re*=Src; Dst.Im*=Src; } template // multiplication by another complex number inline void operator *=(Cmpx &Dst, Cmpx Src) { type Re=Dst.Re*Src.Re-Dst.Im*Src.Im; type Im=Dst.Re*Src.Im+Dst.Im*Src.Re; Dst.Re=Re; Dst.Im=Im; } template // division by a scalar inline void operator /=(Cmpx &Dst, num Src) { Dst.Re/=Src; Dst.Im/=Src; } template // scalar multiplication inline double operator *(Cmpx &Left, Cmpx &Right) { return Left.Re*Right.Re+Left.Im*Right.Im; } // some arithmetic functions: // scalar product of two vectors template inline double ScalProd(Cmpx &A, Cmpx &B) { return A.Re*B.Re+A.Im*B.Im; } template inline double ScalProd(typeA Ia, typeA Qa, Cmpx &B) { return Ia*B.Re+Qa*B.Im; } // complex multiply template inline void CmpxMultAxB(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re=A.Re*B.Re-A.Im*B.Im; Dst.Im=A.Re*B.Im+A.Im*B.Re; } template inline void CmpxMultAxB(typeDst &DstI, typeDst &DstQ, Cmpx &A, Cmpx &B) { DstI=A.Re*B.Re-A.Im*B.Im; DstQ=A.Re*B.Im+A.Im*B.Re; } // complex multiply, second argument with a "star" (B.im is negated) // (effectively subtracts the phase of the second argument) template inline void CmpxMultAxBs(Cmpx &Dst, Cmpx &A, Cmpx &B) { Dst.Re=A.Re*B.Re+A.Im*B.Im; Dst.Im=A.Im*B.Re-A.Re*B.Im; } template void CmpxSqrt(Cmpx &X) { Type Mag=X.Mag(); int NegIm=(X.Im<0); X.Im=sqrt((Mag-X.Re)/2); X.Re=sqrt((Mag+X.Re)/2); if(NegIm) X.Re=(-X.Re); } template void CmpxSquare(Cmpx &X) { Type Re=X.Re*X.Re-X.Im*X.Im; X.Im=2*X.Re*X.Im; X.Re=Re; } // ---------------------------------------------------------------------------- #endif /* __CMPX_H__ */ gmfsk-0.7pre1/src/olivia/fft.h0000644000076400007640000004040710172016646011762 // Fast Fourier Transform // (c) 1999-2004, Pawel Jalocha #ifndef __FFT_H__ #define __FFT_H__ #include #include "cmpx.h" #include "struc.h" // ---------------------------------------------------------------------------- /* How to use the r2FFT class: 1. define the object: r2FFT FFT; 2. preset it for given FFT length: ret=FFT.Preset(1024); if return code is negative => your RAM is out, you can't use the FFT object. - after FFT.Preset() you have the unscrambling table in FFT.BitRevIdx[] and the full (co)sine table in FFT.Twiddle[] 3. for forward complex FFT of "Data": FFT.Process(Data); (this includes unscrambling) 4. for inverse complex FFT of "Data": - first: negate the imaginary part of "Data" - second: execute FFT.Process(Data); - third: negate (again) the imaginary part of "Data" New feature: you can call FFT.Process(Data,Len); 5. You may call FFT.Free() to free allocated RAM, but you will need to call FFT.Preset() before using the FFT object again. 6. Scaling: each pass of the FFT.Process(Data) multiplies the energy of the sequence contained in "Data" by the length of the FFT. To get the same scale (amplitude) after executing one forward and another inverse FFT you need to multiply the sequence by 1/length. 7. To make an FFT of two _real_ time sequences in one go: - place the first time sequence in the real part of complex "Data" - place the second time sequence in the imaginary part of "Data" - execute: FFT.Process(Data); - execute: FFT.SeparTwoReals(Data,Spectr1,Spectr2); where Spectr1/2 are complex arrays half the size of the FFT length. Spectr1/2 contains now the complex FFT result for the first and second real input sequence - Scaling: the sequence energy is multiplied by FFT length 8. To execute an Inverse FFT as to get two real sequences out of two spectral data: - have the two freq. sequeces in Spectr1/2 - execute: FFT.JoinTwoReals(Spectr1,Spect2,Data); - execute: FFT.Process(Data); - Data[].Re contains the first time sequence - Data[].Im contains the second time sequence - Spectr1/2 and Data arrays are like for SeparTwoReals() - Scaling: the sequence energy is multiplied by _twice_ the FFT length */ template class r2FFT // radix-2 FFT { public: // size must a power of 2: 2,4,8,16,32,64,128,256,... r2FFT(int MaxSize) { BitRevIdx=0; Twiddle=0; Preset(MaxSize); } r2FFT() { BitRevIdx=0; Twiddle=0; } ~r2FFT() { free(BitRevIdx); free(Twiddle); } void Free(void) { free(BitRevIdx); BitRevIdx=0; free(Twiddle); Twiddle=0; } // preset tables for given (maximum) processing size int Preset(int MaxSize) { size_t idx,ridx,mask,rmask; double phase; size_t Size4; if(MaxSize<4) goto Error; Size=MaxSize; while((MaxSize&1)==0) MaxSize>>=1; if(MaxSize!=1) goto Error; if(ReallocArray(&BitRevIdx,Size)<0) goto Error; if(ReallocArray(&Twiddle,Size)<0) goto Error; // for(idx=0; idx>=1,rmask<<=1) { if(idx&mask) ridx|=rmask; } BitRevIdx[idx]=ridx; /* printf("%04x %04x\n",idx,ridx); */ } return 0; Error: Free(); return -1; } // scramble/unscramble (I)FFT input template void Scramble(DataType x[]) { size_t idx,ridx; DataType tmp; for(idx=0; idxidx) { tmp=x[idx]; x[idx]=x[ridx]; x[ridx]=tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } template void Scramble(DataType x[], size_t ShrinkShift) { size_t idx,ridx; DataType tmp; size_t Len=Size>>ShrinkShift; for(idx=0; idx>=ShrinkShift; if(ridx>idx) { tmp=x[idx]; x[idx]=x[ridx]; x[ridx]=tmp; /* printf("%d <=> %d\n",idx,ridx); */ } } } // separate the result of a two real channels FFT template void SeparTwoReals(BuffType Buff[], DataType Out0[], DataType Out1[]) { int idx,HalfSize=Size/2; // for(idx=0; idx void JoinTwoReals(DataType Inp0[], DataType Inp1[], BuffType Buff[]) { int idx,HalfSize=Size/2; // for(idx=0; idx void CoreProc(BuffType x[]) { size_t Groups,GroupSize2,Group,Bf,TwidIdx; size_t Size2=Size/2; for(Bf=0; Bf>=1, GroupSize2<<=1) for(Groups=Size2/2,GroupSize2=2; Groups; Groups>>=1, GroupSize2<<=1) for(Group=0,Bf=0; Group void CoreProc(BuffType x[], size_t ShrinkShift) { size_t Groups,GroupSize2,Group,Bf,TwidIdx,TwidIncr; size_t Len=Size>>ShrinkShift; size_t Size2=Size/2; size_t Len2=Len/2; for(Bf=0; Bf>=1, TwidIncr>>=1, GroupSize2<<=1) for(Group=0,Bf=0; Group int Process(BuffType x[]) { Scramble(x); CoreProc(x); return 0; } // find the "shrink" factor for processing batches smaller than declared by Preset() int FindShrinkShift(size_t Len) { size_t Shift; for(Shift=0; Len int Process(BuffType x[], size_t Len) { if(Len<4) return -1; if(Len==Size) { Scramble(x); CoreProc(x); return 0; } int ShrinkShift=FindShrinkShift(Len); if(ShrinkShift<0) return -1; Scramble(x,ShrinkShift); CoreProc(x,ShrinkShift); return 0; } public: size_t Size; // FFT size (needs to be power of 2) size_t *BitRevIdx; // Bit-reverse indexing table for data (un)scrambling Type *Twiddle; // Twiddle factors (sine/cos values) private: // classic radix-2 butterflies template inline void FFTbf(BuffType &x0, BuffType &x1, Type &W) { Type x1W; x1W.Re=x1.Re*W.Re+x1.Im*W.Im; // x1W.Re=x1.Re*W.Re-x1.Im*W.Im; x1W.Im=(-x1.Re*W.Im)+x1.Im*W.Re; // x1W.Im=x1.Re*W.Im+x1.Im*W.Re; x1.Re=x0.Re-x1W.Re; x1.Im=x0.Im-x1W.Im; x0.Re=x0.Re+x1W.Re; x0.Im=x0.Im+x1W.Im; } // special 2-point FFT for the first pass template inline void FFT2(BuffType &x0, BuffType &x1) { Type x1W; x1W.Re=x1.Re; x1W.Im=x1.Im; x1.Re=x0.Re-x1.Re; x1.Im=x0.Im-x1.Im; x0.Re+=x1W.Re; x0.Im+=x1W.Im; } // special 4-point FFT for the second pass template inline void FFT4(BuffType &x0, BuffType &x1, BuffType &x2, BuffType &x3) { Type x1W; x1W.Re=x2.Re; x1W.Im=x2.Im; x2.Re=x0.Re-x1W.Re; x2.Im=x0.Im-x1W.Im; x0.Re=x0.Re+x1W.Re; x0.Im=x0.Im+x1W.Im; x1W.Re=x3.Im; x1W.Im=(-x3.Re); x3.Re=x1.Re-x1W.Re; x3.Im=x1.Im-x1W.Im; x1.Re=x1.Re+x1W.Re; x1.Im=x1.Im+x1W.Im; } } ; // --------------------------------------------------------------------------- #if 0 // unused code, under developement // sliding window for FFT spectral analysis template class AnalysisWindow { public: AnalysisWindow() { Shape=0; Output=0; Len=0; Step=0; } ~AnalysisWindow() { free(Shape); free(Output); } void Free(void) { free(Shape); Shape=0; free(Output); Output=0; Tap.Free(); Len=0; Step=0; } int Preset(size_t WindowLen, size_t WindowStep=0, int WindowShape=2, double WindowScale=1.0) { size_t Idx; Len=WindowLen; if(WindowStep==0) // find default "Step" { if(WindowShape==1) WindowStep=WindowLen/2; else if(WindowShape==2) WindowStep=WindowLen/4; else WindowStep=WindowLen; } Step=WindowStep; if(WindowShape) // set the window shape { if(ReallocArray(&Shape,Len)<0) goto Error; if(WindowShape==1) // like Hamming but zero at the edges { for(Idx=0; Idx=Tap.Len) Tap.RemovePastData(); if(Tap.EnsureWriteLen(InpLen)<0) return -1; Tap.Size+=InpLen; memcpy(Tap.WritePtr(),Input,InpLen); Tap.Write+=InpLen; } int Process(Seq &Input) { return Process(Input.Elem,Input.Len); } // int Flush(size_t ZeroInpLen) // { return Process((Type *)0,ZeroInpLen); } size_t GetOutput(fcmpx *&Data) { if(OutputValid==0) { if(Tap.ReadLen() Tap; size_t Len; size_t Step; double *Shape; Type *Output; int OutputValid; } ; // --------------------------------------------------------------------------- // sliding window for FFT spectral synthesis template class SynthesisWindow { public: SynthesisWindow() { Shape=0; Len=0; Step=0; } ~SynthesisWindow() { free(Shape); } void Free(void) { free(Shape); Shape=0; Len=0; Step=0; Output.Free(); } int Preset(size_t WindowLen, size_t WindowStep=0, int WindowShape=2, double WindowScale=1.0) { size_t Idx; Len=WindowLen; if(WindowStep==0) // find default "Step" { if(WindowShape==1) WindowStep=WindowLen/2; else if(WindowShape==2) WindowStep=WindowLen/4; else WindowStep=WindowLen; } Step=WindowStep; if(WindowShape) // set the window shape { if(ReallocArray(&Shape,Len)<0) goto Error; if(WindowShape==1) // like Hamming but zero at the edges { for(Idx=0; Idx=Len) Output.RemovePastData(); if(Output.EnsureWriteLen(Len+Step)<0) { Free(); return -1; } Write=Output.WritePtr(); if(Shape) { for(Idx=0; Idx=Len) Output.RemovePastData(); if(Output.EnsureWriteLen(Len+Step)<0) { Free(); return -1; } Write=Output.WritePtr(); if(Shape) { for(Idx=0; Idx=Len) Output.RemovePastData(); if(Output.EnsureWriteLen(Len+Step)<0) { Free(); return -1; } Write=Output.WritePtr(); Write+=Len; for(Idx=0; Idx Output; } ; #endif // of unused code // --------------------------------------------------------------------------- #endif // __FFT_H__ gmfsk-0.7pre1/src/olivia/fht.h0000644000076400007640000000210610172016646011756 // Fast Hadamard Transform, Pawel Jalocha, December 2004 #ifndef __FHT_H__ #define __FHT_H__ // Forward Fast Hadamard Transform template // Type can be float, Cmpx<>, int8_t, etc. void FHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for(Step=1; Step void IFHT(Type *Data, size_t Len) { size_t Step, Ptr, Ptr2; Type Bit1, Bit2, NewBit1, NewBit2; for(Step=Len/2; Step; Step/=2) { for(Ptr=0; Ptr class FIFO { public: size_t Len; private: size_t ReadPtr; size_t WritePtr; Type *Data; public: FIFO() { Init(); } ~FIFO() { free(Data); } void Init(void) { Data=0; Len=0; } void Free(void) { free(Data); Data=0; Len=0; } void Reset(void) { ReadPtr=WritePtr=0; } void Clear(void) { ReadPtr=WritePtr; } int Preset(void) { if(ReallocArray(&Data,Len)<0) return -1; Reset(); return 0; } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr+=Step; if(Ptr>=Len) Ptr-=Len; } // FIFO is full ? int Full(void) { size_t Ptr=WritePtr; IncrPtr(Ptr); return (Ptr==ReadPtr); } // FIFO is empty ? int Empty(void) { return (ReadPtr==WritePtr); } // how many elements we can write = space left in the FIFO size_t WriteReady(void) { int Ready=ReadPtr-WritePtr; if(Ready<=0) Ready+=Len; return Ready-1; } // how many elements we can read = space taken in the FIFO size_t ReadReady(void) { int Ready=WritePtr-ReadPtr; if(Ready<0) Ready+=Len; return Ready; } // write a new element int Write(Type &NewData) { size_t Ptr=WritePtr; IncrPtr(Ptr); if(Ptr==ReadPtr) return 0; Data[WritePtr]=NewData; WritePtr=Ptr; return 1; } // read the oldest element int Read(Type &OldData) { if(ReadPtr==WritePtr) return 0; OldData=Data[ReadPtr]; IncrPtr(ReadPtr); return 1; } // lookup data in the FIFO but without taking them out int Lookup(Type &OldData, size_t Offset=0) { size_t Ready=ReadReady(); if(Offset>=Ready) return 0; size_t Ptr=ReadPtr; IncrPtr(Ptr,Offset); OldData=Data[Ptr]; return 1; } } ; /* // FIFO buffer for batches of data (incomplete) template class WideFIFO { public: size_t Width; size_t Len; size_t ReadPtr; size_t WritePtr; size_t Size; Type *Data; public: WideFIFO() { Init(); } ~WideFIFO() { free(Data); } void Init(void) { Data=0; Size=0; } void Free(void) { free(Data); Data=0; Size=0; } // reset: set pointers to the beginning of the buffer void Reset(void) { ReadPtr=WritePtr=0; } // preset for given length and width int Preset(size_t NewLen, size_t NewWidth) { Width=NewWidth; Len=NewLen; Size=Width*Len; if(ReallocArray(&Data,Size)<0) return -1; Reset(); return 0; } // increment the pointer (with wrapping around) void IncrPtr(size_t &Ptr, size_t Step=1) { Ptr+=Step; if(Ptr>=Len) Ptr-=Len; } int Full(void) { Ptr=WritePtr; Incr(Ptr); return (Ptr==ReadPtr); } int Empty(void) { return (ReadPtr==WritePtr); } int Write(Type *DataBatch) { } int Read(Type *DataBatch) { } } ; */ #endif // of __FIFO_H__ gmfsk-0.7pre1/src/olivia/gray.h0000644000076400007640000000117210172016646012141 // Gray code convertion // (c) 2004, Pawel Jalocha #ifndef __GRAY_H__ #define __GRAY_H__ #include template Type GrayCode(Type Binary) { return Binary ^ (Binary>>1); } inline uint8_t BinaryCode(uint8_t Gray) { Gray ^= (Gray>>4); Gray ^= (Gray>>2); Gray ^= (Gray>>1); return Gray; } inline uint16_t BinaryCode(uint16_t Gray) { Gray ^= (Gray>>8); Gray ^= (Gray>>4); Gray ^= (Gray>>2); Gray ^= (Gray>>1); return Gray; } inline uint32_t BinaryCode(uint32_t Gray) { Gray ^= (Gray>>16); Gray ^= (Gray>>8); Gray ^= (Gray>>4); Gray ^= (Gray>>2); Gray ^= (Gray>>1); return Gray; } #endif gmfsk-0.7pre1/src/olivia/lowpass3.h0000644000076400007640000000220710172016646012752 #ifndef __LOWPASS3_H__ #define __LOWPASS3_H__ // ========================================================================== // IIR low pass filter for integration (averaging) purposes // Overshoot is about 1% for Feedback=0.5, and about 1e-6 for Feedback=0.1 // Weight is 1 / PeakingTime template class LowPass3_Filter { public: Type Out1, Out2, Output; template void Process(InpType Inp, WeightType Weight, WeightType Feedback=0.1) { Weight *= 2.0; Type DiffI1 = Inp; DiffI1 -= Out1; Type Diff12 = Out1; Diff12 -= Out2; Type Diff23 = Out2; Diff23 -= Output; DiffI1 *= Weight; Out1 += DiffI1; Diff12 *= Weight; Out2 += Diff12; Diff23 *= Weight; Output += Diff23; Diff23 *= Feedback; Out2 += Diff23; } template void operator = (LevelType Level) { Out1=Level; Out2=Level; Output=Level; } template void Set(LevelType Level=0) { Out1=Level; Out2=Level; Output=Level; } } ; // ========================================================================== #endif // of __LOWPASS3_H__ gmfsk-0.7pre1/src/olivia/mfsk.h0000644000076400007640000021515010174013256012136 // MFSK trasnmitter and receiver code, Pawel Jalocha, December 2004 #ifndef __MFSK_H__ #define __MFSK_H__ // ===================================================================== #include #include #include #include "struc.h" #include "fht.h" #include "cmpx.h" #include "fft.h" #include "gray.h" #include "lowpass3.h" #include "fifo.h" // ===================================================================== static inline size_t Exp2(uint32_t X) { return (uint32_t)1<1; X>>=1) Y+=1; return Y; } // ===================================================================== template void ConvertToS16(Type *Input, int16_t *Output, size_t Len, Type Scale=32768.0) { size_t Idx; const int Limit=32767; for(Idx=0; IdxLimit) Out=Limit; else if(Out<(-Limit)) Out=(-Limit); Output[Idx]=Out; } } // ===================================================================== template class Delay { public: size_t Len; Type *Tap; size_t TapPtr; public: Delay() { Tap=0; Len=0; } ~Delay() { free(Tap); } int Preset(size_t NewLen) { Len=NewLen; if(ReallocArray(&Tap,Len)<0) { Len=0; return -1; } size_t Idx; for(Idx=0; Idx=Len) TapPtr-=Len; } void Process(Type Input, Type &Output) { if(Len==0) { Output=Input; return; } Output=Tap[TapPtr]; Tap[TapPtr]=Input; TapPtr+=1; if(TapPtr>=Len) TapPtr-=Len; } void Process(Type *Buffer, size_t BufferLen) { size_t Idx; Type Output; for(Idx=0; Idx class MFSK_Symbol { public: size_t BitsPerSymbol; public: size_t Carriers; Type *Energy; Type *Correction; Type *Corrected; size_t Code; Type PeakEnergy; Type Background; Type ScanThreshold; size_t ScanIndex; public: MFSK_Symbol() { Init(); Default(); } ~MFSK_Symbol() { Free(); } void Init(void) { Energy=0; Correction=0; Corrected=0; } void Free(void) { free(Energy); Energy=0; free(Correction); Correction=0; free(Corrected); Corrected=0; } void Default(void) { BitsPerSymbol=5; } int Preset(void) { Carriers=Exp2(BitsPerSymbol); if(ReallocArray(&Energy,Carriers)<0) goto Error; if(ReallocArray(&Correction,Carriers)<0) goto Error; if(ReallocArray(&Corrected,Carriers)<0) goto Error; return 0; Error: Free(); return -1; } void ClearCorrection(void) { size_t Idx; for(Idx=0; IdxPeakEnergy) { PeakEnergy=Energy; Code=Idx; } } Background-=PeakEnergy; Background/=(Carriers-1); } void Scan_Init(Type Threshold=4.0) { ScanThreshold=Threshold*Background; } int Scan_First(void) { for(ScanIndex=0; ScanIndexScanThreshold) return 0; } return -1; } // 0 => OK, -1 => no data above threshold int Scan_Next(void) { for( ScanIndex++; ScanIndexScanThreshold) return 0; } if(Scan_First()<0) return -1; return 1; } // 0 => OK, 1 => wrapped around, -1 => no data above threshold void Print(void) { size_t Idx; printf("MFSK_Symbol: %d bits/%d carriers, Peak = %3.1f/%3.1f @ 0x%02X\n", BitsPerSymbol,Carriers, PeakEnergy,Background, Code); printf("Energy:"); for(Idx=0; Idx class MFSK_LineCorrector { public: size_t BitsPerSymbol; size_t SymbolsPerLine; public: size_t CodeMask; MFSK_Symbol **Symbol; public: MFSK_LineCorrector() { Init(); Default(); } ~MFSK_LineCorrector() { Free(); } void Init(void) { Symbol=0; } void Free(void) { free(Symbol); Symbol=0; } void Default(void) { BitsPerSymbol=5; SymbolsPerLine=4; } int Preset(void) { CodeMask=Exp2(BitsPerSymbol)-1; if(ReallocArray(&Symbol,SymbolsPerLine)<0) goto Error; return 0; Error: Free(); return -1; } void CorrectSymbol(size_t SymbolIdx) { size_t Idx; size_t Check=0; Type Corr=0; for(Idx=0; Idx *SymbolPtr = Symbol[Idx]; Check-=SymbolPtr->Code; Corr+=SymbolPtr->PeakEnergy; // -SymbolPtr->Background; } Check&=CodeMask; Symbol[SymbolIdx]->Correction[Check]+=Corr; } void CorrectSymbol_Slow(size_t SymbolIdx) { size_t Idx; for(Idx=0; IdxScan_First()<0) break; } if(Idx *SymbolPtr = Symbol[Idx]; size_t Code=SymbolPtr->ScanIndex; Check-=Code; Corr+=SymbolPtr->Corrected[Code]-SymbolPtr->ScanThreshold; } Check&=CodeMask; Symbol[SymbolIdx]->Correction[Check]+=Corr; for(Idx=0; IdxScan_Next()==0) break; } if(Idx>=SymbolsPerLine) break; } } void Correct(size_t Iter=8, Type Weight=1.0) { Weight/=(2*SymbolsPerLine); for( ; Iter; Iter--) { size_t Idx; for(Idx=0; IdxClearCorrection(); Symbol[Idx]->Scan_Init(); } for(Idx=0; IdxAddCorrection(Weight); Symbol[Idx]->Decode(); } } } } ; template class MFSK_FEC { public: size_t BitsPerSymbol; size_t SymbolsPerLine; size_t Dimensions; public: size_t SymbolsPerBlock; size_t CodeMask; MFSK_Symbol *Symbol; public: MFSK_FEC() { Init(); Default(); } ~MFSK_FEC() { Free(); } void Init(void) { Symbol=0; } void Free(void) { delete [] Symbol; Symbol=0; } void Default(void) { BitsPerSymbol=5; SymbolsPerLine=4; Dimensions=3; } int Preset(void) { Free(); SymbolsPerBlock=1; size_t Dim; for(Dim=0; Dim[SymbolsPerBlock]; if(Symbol==0) return -1; size_t Idx; for(Idx=0; Idx class MFSK_Modulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; static const size_t CarrierSepar=2; public: // parameters that are calculated by Preset() size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols private: Type *CosineTable; // Cosine table for fast cos/sin calculation Type *SymbolShape; // the shape of the symbol int SymbolPhase; // the phase of the tone being transmitted Type *OutTap; // output tap (buffer) size_t TapPtr; size_t WrapMask; public: MFSK_Modulator() { Init(); Default(); } ~MFSK_Modulator() { Free(); } void Init(void) { CosineTable=0; SymbolShape=0; OutTap=0; } void Free(void) { free(CosineTable); CosineTable=0; free(SymbolShape); SymbolShape=0; free(OutTap); OutTap=0; } void Default(void) { SymbolLen=512; FirstCarrier=32; BitsPerSymbol=5; UseGrayCode=1; } int Preset(void) { size_t Idx; Carriers=Exp2(BitsPerSymbol); SymbolSepar=SymbolLen/2; if(ReallocArray(&CosineTable,SymbolLen)<0) goto Error; for(Idx=0; Idx=SymbolLen) Phase-=SymbolLen; } } { size_t Time; double Scale=1.0/4; for(Time=0; TimeLimit) Out=Limit; else if(Out<(-Limit)) Out=(-Limit); Buffer[Idx]=(int16_t)Out; OutTap[TapPtr]=0; TapPtr+=1; TapPtr&=WrapMask; } return SymbolSepar; } template int Output(OutType *Buffer) { size_t Idx; for(Idx=0; Idx class BoxFilter { public: size_t Len; TapType *Tap; size_t Ptr; OutType Output; BoxFilter() { Tap=0; } ~BoxFilter() { free(Tap); } void Free(void) { free(Tap); Tap=0; } int Preset(void) { if(ReallocArray(&Tap,Len)<0) return -1; Clear(); return 0; } void Clear(void) { size_t Idx; for(Idx=0; Idx void Process(InpType Input) { Output-=Tap[Ptr]; Output+=Input; Tap[Ptr]=Input; Ptr+=1; if(Ptr>=Len) Ptr-=Len; } } ; // ===================================================================== template class MFSK_InputProcessor { public: size_t WindowLen; public: size_t WrapMask; Type *InpTap; size_t InpTapPtr; Type *OutTap; size_t OutTapPtr; Type *WindowShape; size_t SliceSepar; r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; Cmpx *Spectra[2]; Type *Output; Type *Energy; BoxFilter Filter; public: MFSK_InputProcessor() { Init(); Default(); } ~MFSK_InputProcessor() { Free(); } void Init(void) { InpTap=0; OutTap=0; WindowShape=0; FFT_Buff=0; Spectra[0]=0; Spectra[1]=0; Output=0; Energy=0; } void Free(void) { free(InpTap); InpTap=0; free(OutTap); OutTap=0; free(WindowShape); WindowShape=0; free(FFT_Buff); FFT_Buff=0; free(Spectra[0]); Spectra[0]=0; free(Spectra[1]); Spectra[1]=0; free(Output); Output=0; free(Energy); Energy=0; FFT.Free(); Filter.Free(); } void Default(void) { WindowLen=8192; } int Preset(void) { size_t Idx; WrapMask=WindowLen-1; Type ShapeScale=2.0/WindowLen; if(ReallocArray(&InpTap,WindowLen)<0) goto Error; ClearArray(InpTap,WindowLen); InpTapPtr=0; if(ReallocArray(&OutTap,WindowLen)<0) goto Error; ClearArray(OutTap,WindowLen); OutTapPtr=0; if(FFT.Preset(WindowLen)<0) goto Error; if(ReallocArray(&FFT_Buff,WindowLen)<0) goto Error; SliceSepar=WindowLen/2; if(ReallocArray(&WindowShape,WindowLen)<0) goto Error; for(Idx=0; Idx *Spectra, size_t Len=64, Type Threshold=4.0) { Filter.Len=Len; Filter.Preset(); size_t MaxFreq = 3*(SpectraLen/4); size_t Freq,Idx; for(Freq=0; FreqLimit) { Spectra[Idx]*=sqrt(Limit/Signal); Energy[Idx]=Limit; } } } void LimitOutputPeaks(Type Threshold=2.5) { size_t Idx; Type RMS=0; for(Idx=0; IdxLimit) Output[Idx]=Limit; else if(Signal<(-Limit)) Output[Idx]=(-Limit); } } void AverageEnergy(size_t Len=32) { Filter.Len=Len; Filter.Preset(); size_t MaxFreq = 3*(SpectraLen/4); Type Scale=1.0/Len; size_t Len2=Len/2; size_t Idx,Freq; for(Freq=0; Freq *Spectra) { size_t Freq; for(Freq=0; Freq void ProcessInpTap(InpType *Input) { size_t InpIdx; for(InpIdx=0; InpIdx int Process(InpType *Input) { if(Input) ProcessInpTap(Input); else ProcessInpTap(); ProcessInpWindow_Re(); if(Input) ProcessInpTap(Input+SliceSepar); else ProcessInpTap(); ProcessInpWindow_Im(); FFT.Process(FFT_Buff); FFT.SeparTwoReals(FFT_Buff, Spectra[0], Spectra[1]); ProcessSpectra(Spectra[0]); ProcessSpectra(Spectra[1]); FFT.JoinTwoReals(Spectra[0], Spectra[1], FFT_Buff); FFT.Process(FFT_Buff); ProcessOutWindow_Re(); ProcessOutTap(Output); ProcessOutWindow_Im(); ProcessOutTap(Output+SliceSepar); LimitOutputPeaks(2.5); LimitOutputPeaks(2.5); return WindowLen; } // get output as 16-bit signed data int GetOutput(int16_t *Buffer) { const Type Scale=32768.0; const int32_t Limit=0x7FFF; size_t Idx; for(Idx=0; IdxLimit) Out=Limit; else if(Out<(-Limit)) Out=(-Limit); Buffer[Idx]=(int16_t)Out; } return WindowLen; } } ; // ===================================================================== // A circular buffer to store history of data. // Data may come as single numbers or in batches // of fixed size (-> Width) template class CircularBuffer { public: size_t Width; // input/output data width (row width) size_t Len; // buffer length (column height) public: size_t Size; // total size of the storage in the buffer size_t Ptr; // current pointer (counts rows) Type *Data; // allocated storage public: CircularBuffer() { Init(); } ~CircularBuffer() { free(Data); } void Init(void) { Data=0; Size=0; Width=1; } void Free(void) { free(Data); Data=0; Size=0; } // reset: set pointer to the beginning of the buffer void Reset(void) { Ptr=0; } // preset for given length and width int Preset(void) { Size=Width*Len; if(ReallocArray(&Data,Size)<0) return -1; Reset(); return 0; } // set all elements to given value void Set(Type &Value) { size_t Idx; for(Idx=0; Idx=Len) Ptr-=Len; } // decrement the pointer (with wrapping around) void DecrPtr(size_t &Ptr, size_t Step=1) { if(Ptr>=Step) Ptr-=Step; else Ptr+=(Len-Step); } // synchronize current pointer with another circular buffer template void operator |= (CircularBuffer Buffer) { Ptr=Buffer.Ptr; } // advance (increment) current pointer void operator += (size_t Step) { IncrPtr(Ptr,Step); } // decrement current pointer void operator -= (size_t Step) { DecrPtr(Ptr,Step); } // index operator to get the absolute data pointer Type *operator [] (size_t Idx) { return Data+(Idx*Width); } // get storage pointer corresponding to an absolute pipe pointer Type *AbsPtr(size_t Ptr) { return Data+(Ptr*Width); } // get storage pointer corresponding to current pipe pointer Type *CurrPtr(void) { return Data+(Ptr*Width); } // get storage pointer corresponding to current pointer +/- offset Type *OffsetPtr(int Offset) { Offset+=Ptr; Offset*=Width; if(Offset<0) Offset+=Size; else if(Offset>=(int)Size) Offset-=Size; return Data+Offset; } } ; // ===================================================================== template class MFSK_Demodulator { public: // parameters to be set before calling Preset() size_t SymbolLen; // length of the symbol, must be a power of 2 size_t FirstCarrier; // first carrier in terms of FFT freq. bins size_t BitsPerSymbol; // bits per symbol => number of carriers/tones int UseGrayCode; size_t DecodeMargin; int EqualizerDepth; // leave this at 0 (disable the equalizer) static const size_t CarrierSepar=2; static const size_t SpectraPerSymbol = 2; // FFT slices per symbol public: size_t Carriers; // number of tones/carriers size_t SymbolSepar; // time distance between symbols private: size_t DecodeWidth; size_t SymbolSepar2; size_t WrapMask; Type *InpTap; // input buffer size_t InpTapPtr; Type *SymbolShape; // the shape of the symbol and the FFT window r2FFT< Cmpx > FFT; // FFT engine Cmpx *FFT_Buff; // FFT buffer size_t SpectraLen; // number of spectra points per FFT Cmpx *Spectra[SpectraPerSymbol]; // two buffers for FFT spectra Type *Energy[SpectraPerSymbol]; CircularBuffer EnergyBuffer; LowPass3_Filter *AverageEnergy; Type FilterWeight; public: MFSK_Demodulator() { Init(); Default(); } ~MFSK_Demodulator() { Free(); } void Init(void) { InpTap=0; SymbolShape=0; FFT_Buff=0; Spectra[0]=0; Spectra[1]=0; Energy[0]=0; Energy[1]=0; AverageEnergy=0; } void Free(void) { free(InpTap); InpTap=0; free(SymbolShape); SymbolShape=0; free(FFT_Buff); FFT_Buff=0; free(Spectra[0]); Spectra[0]=0; free(Spectra[1]); Spectra[1]=0; free(Energy[0]); Energy[0]=0; free(Energy[1]); Energy[1]=0; free(AverageEnergy); AverageEnergy=0; FFT.Free(); EnergyBuffer.Free(); } void Default(void) { SymbolLen=512; FirstCarrier=32; BitsPerSymbol=5; UseGrayCode=1; DecodeMargin=32; EqualizerDepth=0; } int Preset(void) { Carriers=Exp2(BitsPerSymbol); WrapMask=SymbolLen-1; Type ShapeScale=1.0/SymbolLen; if(ReallocArray(&InpTap,SymbolLen)<0) goto Error; ClearArray(InpTap,SymbolLen); InpTapPtr=0; if(FFT.Preset(SymbolLen)<0) goto Error; if(ReallocArray(&FFT_Buff,SymbolLen)<0) goto Error; SymbolSepar=SymbolLen/2; SymbolSepar2=SymbolSepar/2; if(ReallocArray(&SymbolShape,SymbolLen)<0) goto Error; { size_t Time; double Ampl=MFSK_SymbolFreqShape[0]; for(Time=0; Time=SymbolLen) Phase-=SymbolLen; } } { size_t Time; for(Time=0; TimeFirstCarrier) DecodeMargin=FirstCarrier; DecodeWidth=(Carriers*CarrierSepar-1)+2*DecodeMargin; if(ReallocArray(&Energy[0],DecodeWidth)<0) goto Error; if(ReallocArray(&Energy[1],DecodeWidth)<0) goto Error; if(EqualizerDepth) { EnergyBuffer.Len=EqualizerDepth; EnergyBuffer.Width=DecodeWidth; if(EnergyBuffer.Preset()<0) goto Error; EnergyBuffer.Clear(); if(ReallocArray(&AverageEnergy,DecodeWidth)<0) goto Error; size_t Idx; for(Idx=0; Idx void Process(InpType *Input) { size_t InpIdx,Time; for(InpIdx=0; InpIdx0) { Energy[0][Idx]/=RefEnergy; Energy[1][Idx]/=RefEnergy; } else { Energy[0][Idx]=0; Energy[1][Idx]=0; } } */ EnergyBuffer+=2; } else { size_t Idx; size_t Freq=FirstCarrier-DecodeMargin; for(Idx=0; IdxPeak) { Peak=Energy; PeakIdx=Idx; } Freq+=CarrierSepar; } if(UseGrayCode) PeakIdx=BinaryCode(PeakIdx); return PeakIdx; } template void SoftDecode(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx; for(Bit=0; Bit0) { for(Bit=0; Bit void SoftDecode_Test(SymbType *Symbol, size_t Slice=0, int FreqOffset=0) { size_t Bit,Idx,Freq; Type *EnergyPtr=Energy[Slice]+(DecodeMargin+FreqOffset); // printf("SoftDecode:"); Type TotalEnergy=0; Type PeakEnergy=0; for(Freq=0,Idx=0; IdxPeakEnergy) PeakEnergy=Energy; } Type AverageNoise=(TotalEnergy-PeakEnergy)/(Carriers-1)/2; /* printf(" PeakEnergy/TotalEnergy=%4.3f",PeakEnergy/TotalEnergy); printf(" AverageNoise/TotalEnergy=%4.3f\n",AverageNoise/TotalEnergy); printf("Energy[%d]/Tot =",Carriers); for(Freq=0,Idx=0; Idx void PrintBinary(Type Number, size_t Bits) { Type Mask=1; Mask<<=(Bits-1); for( ; Bits; Bits--) { printf("%c",Number&Mask ? '1':'0'); Mask>>=1; } } // ===================================================================== class MFSK_Encoder { public: size_t BitsPerSymbol; size_t BitsPerCharacter; public: size_t Symbols; size_t SymbolsPerBlock; private: static const uint64_t ScramblingCode = 0xE257E6D0291574ECLL; int8_t *FHT_Buffer; public: uint8_t *OutputBlock; public: MFSK_Encoder() { Init(); Default(); } ~MFSK_Encoder() { Free(); } void Default(void) { BitsPerSymbol=5; BitsPerCharacter=7; } void Init(void) { FHT_Buffer=0; OutputBlock=0; } void Free(void) { free(FHT_Buffer); FHT_Buffer=0; free(OutputBlock); OutputBlock=0; } int Preset(void) { Symbols = 1<=BitsPerSymbol) Bit-=BitsPerSymbol; uint8_t Mask=1; Mask<<=Bit; OutputBlock[TimeBit]|=Mask; } Rotate+=1; if(Rotate>=BitsPerSymbol) Rotate-=BitsPerSymbol; } } } void PrintOutputBlock(void) { size_t TimeBit; for(TimeBit=0; TimeBit>=Rotate; Bit&=1; uint64_t CodeMask=1; CodeMask<<=CodeBit; if(ScramblingCode&CodeMask) Bit^=1; FHT_Buffer[TimeBit]= Bit ? -1:1; CodeBit+=1; CodeBit&=CodeWrap; Rotate+=1; if(Rotate>=BitsPerSymbol) Rotate-=BitsPerSymbol; Ptr+=1; Ptr&=InputWrap; } FHT(FHT_Buffer,SymbolsPerBlock); int32_t Peak=0; size_t PeakPos=0; int32_t SqrSum=0; for(TimeBit=0; TimeBitabs(Peak)) { Peak=Signal; PeakPos=TimeBit; } } uint8_t Char=PeakPos; if(Peak<0) Char+=SymbolsPerBlock; SqrSum-=Peak*Peak; OutputBlock[FreqBit]=Char; NoiseEnergy+=(float)SqrSum/(SymbolsPerBlock-1); Signal+=abs(Peak); } void Process(void) { size_t FreqBit; Signal=0; NoiseEnergy=0; for(FreqBit=0; FreqBit0; ) { PackedBuffer<<=8; FreqBit--; PackedBuffer|=OutputBlock[FreqBit]; } return BitsPerSymbol; } size_t Output(uint64_t *PackedBuffer) { return Output(*PackedBuffer); } void PrintOutputBlock(FILE *File=stdout) { size_t FreqBit; fprintf(File,"'"); for(FreqBit=0; FreqBit=' ')&&(Char<127) ? Char:' '); } fprintf(File,"', S/N = %5.1f/%4.1f",Signal,sqrt(NoiseEnergy)); if(NoiseEnergy>0) fprintf(File," = %5.1f",Signal/sqrt(NoiseEnergy)); fprintf(File,"\n"); } void PrintInputBuffer(void) { size_t TimeBit; size_t Ptr=InputPtr; for(TimeBit=0; TimeBit class MFSK_SoftDecoder { public: size_t BitsPerSymbol; // number of bits per symbol size_t BitsPerCharacter; // number of bits per character public: size_t Symbols; // number of symbols size_t SymbolsPerBlock; // number of symbols per FEC block private: static const uint64_t ScramblingCode = 0xE257E6D0291574ECLL; size_t InputBufferLen; InpType *InputBuffer; size_t InputPtr; CalcType *FHT_Buffer; public: float Signal,NoiseEnergy; uint8_t *OutputBlock; public: MFSK_SoftDecoder() { Init(); Default(); } ~MFSK_SoftDecoder() { Free(); } void Default(void) { BitsPerSymbol=5; BitsPerCharacter=7; } void Init(void) { InputBuffer=0; FHT_Buffer=0; OutputBlock=0; } void Free(void) { free(InputBuffer); InputBuffer=0; free(FHT_Buffer); FHT_Buffer=0; free(OutputBlock); OutputBlock=0; } void Reset(void) { size_t Idx; for(Idx=0; Idx &RefDecoder) { BitsPerSymbol=RefDecoder.BitsPerSymbol; BitsPerCharacter=RefDecoder.BitsPerCharacter; return Preset(); } void Input(InpType *Symbol) { size_t FreqBit; for(FreqBit=0; FreqBit=InputBufferLen) InputPtr-=InputBufferLen; } void DecodeCharacter(size_t FreqBit) { size_t TimeBit; size_t Ptr=InputPtr; size_t Rotate=FreqBit; size_t CodeWrap=(SymbolsPerBlock-1); size_t CodeBit=FreqBit*13; CodeBit&=CodeWrap; for(TimeBit=0; TimeBit=BitsPerSymbol) Rotate-=BitsPerSymbol; Ptr+=BitsPerSymbol; if(Ptr>=InputBufferLen) Ptr-=InputBufferLen; } FHT(FHT_Buffer,SymbolsPerBlock); CalcType Peak=0; size_t PeakPos=0; CalcType SqrSum=0; for(TimeBit=0; TimeBitfabs(Peak)) { Peak=Signal; PeakPos=TimeBit; } } uint8_t Char=PeakPos; if(Peak<0) Char+=SymbolsPerBlock; SqrSum-=Peak*Peak; OutputBlock[FreqBit]=Char; NoiseEnergy+=(float)SqrSum/(SymbolsPerBlock-1); Signal+=fabs(Peak); } void Process(void) { size_t FreqBit; Signal=0; NoiseEnergy=0; for(FreqBit=0; FreqBit0; ) { PackedBuffer<<=8; FreqBit--; PackedBuffer|=OutputBlock[FreqBit]; } return BitsPerSymbol; } void PrintOutputBlock(FILE *File=stdout) { size_t FreqBit; fprintf(File,"'"); for(FreqBit=0; FreqBit=' ')&&(Char<127) ? Char:' '); } fprintf(File,"', S/N = %5.1f/%4.1f",Signal,sqrt(NoiseEnergy)); if(NoiseEnergy>0) fprintf(File," = %5.1f",Signal/sqrt(NoiseEnergy)); fprintf(File,"\n"); } size_t Output(uint64_t *PackedBuffer) { return Output(*PackedBuffer); } } ; // ===================================================================== // rate converter template class RateConverter { public: // parameters to be set by the user size_t TapLen; // filter tap length (in term of input samples) size_t OverSampling; // internal oversampling factor Type UpperFreq; // upper frequency of the (lowpass) filter (in terms of input sampling rate) Type OutputRate; // the output rate (in terms of the input rate) private: size_t FilterLen; // the total length of the filter (in term of oversampled rate) Type *FilterShape; // the shape of the filter Type *InputTap; // filter tap size_t InputTapPtr; size_t InputWrap; Type OutputTime; Type OutputPeriod; Type OutputBefore; Type OutputAfter; size_t OutputPtr; public: RateConverter() { Init(); Default(); } ~RateConverter() { Free(); } void Init(void) { FilterShape=0; InputTap=0; } void Free(void) { free(FilterShape); FilterShape=0; free(InputTap); InputTap=0; } void Default(void) { TapLen=16; OverSampling=16; UpperFreq=3.0/8; OutputRate=1.0; } int Preset(void) { size_t Idx; TapLen=Exp2(Log2(TapLen)); FilterLen=TapLen*OverSampling; if((ReallocArray(&FilterShape,FilterLen))<0) goto Error; if((ReallocArray(&InputTap,TapLen))<0) goto Error; for(Idx=0; Idx int Process(InpType *Input, size_t InputLen, OutType *Output) { size_t OutputLen=0; // printf("E: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); for( ; ; ) { // printf("L: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); if(OutputPtr) { size_t Idx=(size_t)floor(OutputTime)+1; if(Idx>=OverSampling) { if(InputLen==0) break; NewInput(*Input); Input++; InputLen-=1; Idx-=OverSampling; OutputTime-=(Type)OverSampling; } OutputAfter=Convolute(Idx); Type Weight=Idx-OutputTime; (*Output)=Weight*OutputBefore+(1.0-Weight)*OutputAfter; Output++; OutputLen+=1; // printf("O: %d %3.1f %d %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen, Idx); OutputPtr=0; } else { size_t Idx=(size_t)floor(OutputTime+OutputPeriod); if(Idx>=OverSampling) { if(InputLen==0) break; NewInput(*Input); Input++; InputLen-=1; Idx-=OverSampling; OutputTime-=(Type)OverSampling; } OutputBefore=Convolute(Idx); OutputTime+=OutputPeriod; OutputPtr=1; } } // printf("R: %d %3.1f %d %d\n",OutputPtr, OutputTime, InputLen, OutputLen); return OutputLen; } template int Process(InpType Input, size_t InputLen, Seq &Output) { size_t OutPtr=Output.Len; size_t MaxOutLen=(size_t)ceil(InputLen*OutputRate+2); if(Output.EnsureSpace(OutPtr+MaxOutLen)<0) return -1; int OutLen=Process(Input, InputLen, Output.Elem+OutPtr); Output.Len+=OutLen; return OutLen; } template int Process(InpType Input, OutType *Output) { return Process(&Input,1,Output); } } ; // ===================================================================== template class MFSK_Transmitter { public: // primary parameters: set by the user size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 Type SampleRate; // audio sampling rate (internal processing) Type OutputSampleRate; // true sampling rate of the soundcard public: // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block size_t MaxOutputLen; // maximum length of the audio batch returned by Output() private: static const int State_Running = 0x0001; static const int State_StopReq = 0x0010; int State; FIFO Input; // buffer(queue) for the characters to be encoded uint8_t InputBlock[8]; // FEC code block buffer FIFO Monitor; // buffer for monitoring the characters being sent MFSK_Encoder Encoder; // FEC encoder size_t SymbolPtr; MFSK_Modulator Modulator; // MFSK modulator Type *ModulatorOutput; RateConverter RateConverter; // output rate converter Type *ConverterOutput; public: MFSK_Transmitter() { Init(); } ~MFSK_Transmitter() { Free(); } void Init(void) { ModulatorOutput=0; ConverterOutput=0; } void Free(void) { Input.Free(); Monitor.Free(); Encoder.Free(); Modulator.Free(); free(ModulatorOutput); ModulatorOutput=0; RateConverter.Free(); free(ConverterOutput); ConverterOutput=0; } // set default primary parameters void Default(void) { Tones=32; Bandwidth=1000; SampleRate=8000; OutputSampleRate=8000; } // preset internal arrays according to primary paramaters int Preset(void) { // impose limits on the primary parameters if(Tones<2) Tones=2; else if(Tones>256) Tones=256; if(Bandwidth<125) Bandwidth=125; else if(Bandwidth>2000) Bandwidth=2000; // calculate the secondary parameters BitsPerSymbol=Log2(Tones); Tones=Exp2(BitsPerSymbol); // preset the input character buffer Input.Len=1024; if(Input.Preset()<0) goto Error; Monitor.Len=256; if(Monitor.Preset()<0) goto Error; // preset the encoder Encoder.BitsPerSymbol=BitsPerSymbol; if(Encoder.Preset()<0) goto Error; SymbolsPerBlock=Encoder.SymbolsPerBlock; // preset the modulator Modulator.Default(); Modulator.BitsPerSymbol=BitsPerSymbol; Modulator.SymbolLen=(size_t)1<<(BitsPerSymbol+7-Log2(Bandwidth/125)); Bandwidth=Exp2(Log2(Bandwidth/125))*125; Modulator.FirstCarrier=(Modulator.SymbolLen/16)+1; if(Modulator.Preset()<0) goto Error; if(ReallocArray(&ModulatorOutput,Modulator.SymbolSepar)<0) goto Error; // preset the rate converter RateConverter.OutputRate=OutputSampleRate/SampleRate; if(RateConverter.Preset()<0) goto Error; MaxOutputLen=(size_t)ceil(Modulator.SymbolSepar*OutputSampleRate/SampleRate+2); if(ReallocArray(&ConverterOutput,MaxOutputLen)<0) goto Error; // reset the state logic SymbolPtr=0; State=0; return 0; Error: Free(); return -1; } void Reset(void) { Input.Reset(); Monitor.Reset(); SymbolPtr=0; State=0; RateConverter.Reset(); } Type BaudRate(void) { return SampleRate/Modulator.SymbolSepar; } Type BlockPeriod(void) { return (SymbolsPerBlock*Modulator.SymbolSepar)/SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol*SampleRate/(SymbolsPerBlock*Modulator.SymbolSepar); } // start the transmission void Start(void) { State|=State_Running; } // request to stop (and complete) the transmission // but the transmitter will only stop after transmitting all the data void Stop(void) { State|=State_StopReq; } // check if the transmission is still running (not complete) int Running(void) { return State&State_Running; } // put the character into the transmitter input queue int PutChar(uint8_t Char) { return Input.Write(Char); } // get one character from the monitor buffer int GetChar(uint8_t &Char) { return Monitor.Read(Char); } size_t GetReadReady(void) { return Input.ReadReady(); } // get out the transmitter output (audio) int Output(int16_t *Buffer) { if(SymbolPtr==0) { if((State&State_StopReq)&&Input.Empty()) { State=0; } else if(State&State_Running) { size_t Idx; for(Idx=0; Idx=SymbolsPerBlock) SymbolPtr=0; } int ModLen=Modulator.Output(ModulatorOutput); int ConvLen=RateConverter.Process(ModulatorOutput,ModLen,ConverterOutput); if(ConvLen<0) return ConvLen; ConvertToS16(ConverterOutput,Buffer,ConvLen); return ConvLen; } } ; // ===================================================================== /* How to use the MFSK_Receiver class: 1. create an object like: #include "mfsk.h" MFSK_Receiver Receiver; 2. Set the parameters, for example: Receiver.Tones = 32; // number of tones (symbols) Receiver.Bandwidth = 1000; // bandwidth [Hz] Receiver.SyncMargin = 8; // synchronizer tune margin [tone freq. spacing] Receiver.SyncIntegLen = 4; // synchronizer integration period [FEC blocks] Receiver.SyncThreshold = 3.2; // S/N threshold for printing Receiver.SampleRate = 8000.0; // internal processor sampling rate [Hz] Receiver.InputSampleRate = 8000.0; // soundcard sampling rate [Hz] You don't need to set all the parameters, as upon creation of the Receiver object they are already given certain default values. If you changed parameters at one time and want later to go back to the default values you can call: Receiver.Default(); 3. Preset the Receiver internal arrays for the parameters you just set: if(Receiver.Preset()<0) printf("Not enough RAM or another problem\n"); Each time you change the parameters you need to call Preset() in order to resize the internal arrays. Preset() will as well destroy all data being in the process of decoding, if you need this data then call first Receiver.Flush() 4. Read back the parameters you set in point 1., they could have been adjusted by Preset() to their closest allowed values. 5. Feed the audio into the Receiver: Receiver.Process(AudioBuffer, BufferLength); AudioBuffer can be an array of int16_t (16-bit signed integers) that you fill with the data from the soundcard. I suggest you feed the receiver with batches of 512 or 1024 samples, but in can be any number of samples at a time. 6. Call GetChar(Char) to get decoded characters. Note, that characters come in batches, and so, you need to call GetChar() possibly several times. GetChar() returns 0 when the decoder FIFO is empty or 1 when not empty. In the latter case the argument contains the character read form the FIFO. The loop could be like: for( ; ; ) { uint8_t Char; if(Receiver.GetChar(Char)==0) break; printf("%c",Char); } Keep in mind that you may see (random) control code characters here, and thus you must be able to deal with them. I suggest to process only carriage return (code=13) and Backspace (code=8). NUL (code=0) is the idle character: it is being sent when there is no text to be sent. 7. At any time you can read the signal-to-noise ratio of the incoming signal by calling Receiver.SignalToNoiseRatio() or frequency offset by calling Receiver.FrequencyOffset() 8. When the user decides to turn off the receiver and switch over to transmitt you may still call Receiver.Flush()in order to flush the data still being buffered in the decoder pipeplines. */ template class MFSK_Receiver { public: // primary parameters: set by the user size_t Tones; // number of tones: 4, 8, 16, 32, 64, 128, 256 size_t Bandwidth; // bandwidth: 125, 250, 500, 1000, 2000 size_t SyncMargin; // synchronizer search margin, frequency-wide size_t SyncIntegLen; // synchronizer integration period Type SyncThreshold; // synchronizer S/N threshold (if below, output is suppressed) Type SampleRate; // audio sampling rate (internal processing) Type InputSampleRate; // true sampling rate of the soundcard public: // secondary parameters: calculated by Preset() size_t BitsPerSymbol; // number of bits per symbol size_t SymbolsPerBlock; // number of symbols per one FEC code block private: RateConverter RateConverter; Seq InputBuffer; MFSK_InputProcessor InputProcessor; // equalizes the input spectrum // and removes coherent interferences MFSK_Demodulator Demodulator; // FFT demodulator const static size_t SlicesPerSymbol = MFSK_Demodulator::SpectraPerSymbol; size_t FreqOffsets; // number of possible frequency offsets size_t BlockPhases; // number of possible time-phases within the FEC block MFSK_SoftDecoder RefDecoder; // reference decoder MFSK_SoftDecoder *Decoder; // array of decoders size_t BlockPhase; // current running time-phase CircularBuffer< LowPass3_Filter > SyncNoiseEnergy; // FEC noise integrators CircularBuffer< LowPass3_Filter > SyncSignal; // FEC signal integrators Type SyncFilterWeight; // weight for the integrators Type SyncBestSignal; // best signal size_t SyncBestBlockPhase; // time-phase of the best signal size_t SyncBestFreqOffset; // frequency offset of the best signal Type SyncSNR; // S/N corresponding to the SyncBestSignal CircularBuffer *DecodePipe; // pipeline for decoded FEC blocks FIFO Output; // buffer for decoded characters public: MFSK_Receiver() { Init(); Default(); } ~MFSK_Receiver() { Free(); } void Init(void) { Decoder=0; DecodePipe=0; } void Free(void) { if(Decoder) { size_t Idx; for(Idx=0; Idx<(SlicesPerSymbol*FreqOffsets); Idx++) Decoder[Idx].Free(); free(Decoder); Decoder=0; } if(DecodePipe) { size_t Idx; for(Idx=0; Idx256) Tones=256; if(Bandwidth<125) Bandwidth=125; else if(Bandwidth>2000) Bandwidth=2000; if(SyncMargin<2) SyncMargin=2; if(SyncIntegLen<2) SyncIntegLen=2; if(SyncThreshold<3.0) SyncThreshold=3.0; BitsPerSymbol=Log2(Tones); Tones=Exp2(BitsPerSymbol); RateConverter.OutputRate=SampleRate/InputSampleRate; if(RateConverter.Preset()<0) goto Error; Demodulator.BitsPerSymbol=BitsPerSymbol; Demodulator.SymbolLen=Exp2(BitsPerSymbol+7-Log2(Bandwidth/125)); Bandwidth=Exp2(Log2(Bandwidth/125))*125; Demodulator.FirstCarrier=(Demodulator.SymbolLen/16)+1; Demodulator.DecodeMargin=SyncMargin; if(Demodulator.Preset()<0) goto Error; SyncMargin=Demodulator.DecodeMargin; InputProcessor.WindowLen=16*Demodulator.SymbolLen; if(InputProcessor.Preset()<0) goto Error; RefDecoder.Default(); RefDecoder.BitsPerSymbol=BitsPerSymbol; if(RefDecoder.Preset()<0) goto Error; SymbolsPerBlock=RefDecoder.SymbolsPerBlock; if(Decoder) { for(Idx=0; Idx<(SlicesPerSymbol*FreqOffsets); Idx++) Decoder[Idx].Free(); } if(DecodePipe) { for(Idx=0; Idx %dx%d bits, %3.1f sec\n", SampleRate/Demodulator.SymbolSepar, RefDecoder.BitsPerSymbol, RefDecoder.BitsPerSymbol, RefDecoder.SymbolsPerBlock, (SymbolsPerBlock*Demodulator.SymbolSepar)/SampleRate); printf("Audio band: %3.1f - %3.1f Hz, %3.1f Hz total\n", FreqBin*Demodulator.FirstCarrier, FreqBin*(Demodulator.FirstCarrier+Demodulator.CarrierSepar*Demodulator.Carriers), FreqBin*Demodulator.CarrierSepar*Demodulator.Carriers ); printf("Tuning tolerance = +/- %3.1f Hz, Sync. S/N threshold = %3.1f\n", FreqBin*SyncMargin, SyncThreshold); } Type BaudRate(void) { return SampleRate/Demodulator.SymbolSepar; } Type TuneMargin(void) { return SyncMargin*(SampleRate/Demodulator.SymbolLen); } Type BlockPeriod(void) { return (SymbolsPerBlock*Demodulator.SymbolSepar)/SampleRate; } Type CharactersPerSecond(void) { return BitsPerSymbol*SampleRate/(SymbolsPerBlock*Demodulator.SymbolSepar); } Type SignalToNoiseRatio(void) { return SyncSNR; } Type FrequencyOffset(void) { return ((int)SyncBestFreqOffset-(int)FreqOffsets/2)*(SampleRate/Demodulator.SymbolLen); } Type TimeOffset(void) { return ((Type)SyncBestBlockPhase/SlicesPerSymbol)*(Demodulator.SymbolSepar/SampleRate); } // process an audio batch: first the input processor, then the demodulator template int Process(InpType *Input, size_t InputLen) { if(RateConverter.Process(Input, InputLen, InputBuffer)<0) return -1; ProcessInputBuffer(); return 0; } void Flush(void) { ProcessInputBuffer(); size_t Idx; for(Idx=InputBuffer.Len; Idx=InputProcessor.WindowLen) { InputProcessor.Process(InputBuffer.Elem); InputBuffer.Delete(0,InputProcessor.WindowLen); size_t Idx; for(Idx=0; Idx void ProcessSymbol(InpType *Input) { Demodulator.Process(Input); MFSK_SoftDecoder *DecoderPtr = Decoder; size_t Offset,Slice; for(Slice=0; Slice *NoiseEnergyPtr = SyncNoiseEnergy.AbsPtr(BlockPhase); LowPass3_Filter *SignalPtr = SyncSignal.AbsPtr(BlockPhase); uint64_t *DecodeBlockPtr = DecodePipe[BlockPhase].CurrPtr(); Type BestSliceSignal=0; size_t BestSliceOffset=0; Type Symbol[8]; for(Offset=0; OffsetInput(Symbol); DecoderPtr->Process(); DecoderPtr->Output(DecodeBlockPtr); Type NoiseEnergy = DecoderPtr->NoiseEnergy; Type Signal = DecoderPtr->Signal; NoiseEnergyPtr->Process(NoiseEnergy, SyncFilterWeight); SignalPtr->Process(Signal, SyncFilterWeight); Signal=SignalPtr->Output; if(Signal>BestSliceSignal) { BestSliceSignal=Signal; BestSliceOffset=Offset; } DecoderPtr++; DecodeBlockPtr++; NoiseEnergyPtr++; SignalPtr++; } DecodePipe[BlockPhase]+=1; if(BlockPhase==SyncBestBlockPhase) { SyncBestSignal=BestSliceSignal; SyncBestFreqOffset=BestSliceOffset; } else { if(BestSliceSignal>SyncBestSignal) { SyncBestSignal=BestSliceSignal; SyncBestBlockPhase=BlockPhase; SyncBestFreqOffset=BestSliceOffset; } } int Dist=(int)BlockPhase-(int)SyncBestBlockPhase; if(Dist<0) Dist+=BlockPhases; if(Dist==(int)(BlockPhases/2)) { Type AverageSignal=0; size_t Idx; size_t Size=SyncSignal.Size; LowPass3_Filter *FilterPtr = SyncSignal.AbsPtr(0); for(Idx=0; IdxOutput; AverageSignal-=SyncBestSignal; AverageSignal/=(Size-1); Type BestNoise=SyncNoiseEnergy.AbsPtr(SyncBestBlockPhase) [SyncBestFreqOffset].Output; if(BestNoise>0) BestNoise=sqrt(BestNoise); else BestNoise=0; const Type MinNoise=0.001; if(BestNoise=SyncThreshold) { /* printf("%4.1f/%+2d => %4.1f/%3.1f = %4.1f ", (float)SyncBestBlockPhase/2, (int)SyncBestFreqOffset-(FreqOffsets/2), SyncBestSignal, BestNoise, SyncSNR); */ uint64_t *BestBlockPtr = DecodePipe[SyncBestBlockPhase].CurrPtr(); uint64_t Block = BestBlockPtr[SyncBestFreqOffset]; size_t Byte; for(Byte=0; Byte' ' ? Char:' ' ); Output.Write(Char); Block>>=8; } // printf("\n"); } } BlockPhase++; } if(BlockPhase>=BlockPhases) BlockPhase-=BlockPhases; } } ; // ===================================================================== #endif // of __MFSK_H__ gmfsk-0.7pre1/src/olivia/struc.h0000644000076400007640000003515510172016646012347 // data structures, includes dynamically allocated vectors and arrays // (c) 1999-2003, Pawel Jalocha #ifndef __STRUC_H__ #define __STRUC_H__ #include #include #include // ======================================================================== // array re(sizing), copy, move, preset, etc. template inline int ReallocArray(type **Array, size_t Size) { // CINT doesn't accept NULL pointers to realloc #ifdef __CINT__ // if(*Array) free(*Array); // (*Array)=(type *)malloc(Size*sizeof(type)); if(*Array) (*Array)=(type *)realloc(*Array,Size*sizeof(type)); else (*Array)=(type *)malloc(Size*sizeof(type)); #else (*Array)=(type *)realloc(*Array,Size*sizeof(type)); #endif return (*Array)==0 ? -1:0; } template int ReallocArraySafe(type **Array, size_t OldSize, size_t NewSize) { type *New; size_t Size; New=(type *)malloc(NewSize*sizeof(type)); if(New==0) return -1; Size=OldSize; if(NewSize inline int AllocArray(type **Array, size_t Size) { (*Array)=(type *)malloc(Size*sizeof(type)); return (*Array)==0; } template inline void ClearArray(type *Array, size_t Size) { memset(Array,0,Size*sizeof(type)); } template void PresetArray(type *Array, size_t Size, const type &Val) { size_t i; for(i=0; i inline void CopyArray(type *Dst, type *Src, size_t Size) { memcpy(Dst,Src,Size*sizeof(type)); } template inline void MoveArray(type *Dst, type *Src, size_t Size) { memmove(Dst,Src,Size*sizeof(type)); } template void PrintArray(type *Array, size_t Size, char *ValueFormat, char *IndexFormat="%3d", size_t Columns=10) { size_t Idx,Col; for(Col=0,Idx=0; Idx=Columns) { printf("\n"); Col=0; } } if(Col>0) printf("\n"); } // ----------------------------------------------------------------------- // 2-dimensional array (re)sizing template int AllocArray2D(type ***Array, size_t Rows, size_t Cols) { size_t i; (*Array)=(type **)malloc(Rows*(sizeof(type *))); if((*Array)==0) return -1; for(i=0; i int AddRowsToArray2D(type ***Array, size_t Rows, size_t Cols, size_t NewRows=1) { size_t i; type **NewArray; NewArray=(type **)malloc((Rows+NewRows)*(sizeof(type *))); if(NewArray==0) return -1; memcpy(NewArray,*Array,Rows*sizeof(type *)); return 0; } */ template void FreeArray2D(type **Array, size_t Rows) { size_t i; for(i=0; i void ClearArray2D(type **Array, size_t Rows, size_t Cols) { size_t i; for(i=0; i void PresetArray2D(type **Array, size_t Rows, size_t Cols, type &Val) { size_t i; for(i=0; i class Seq { public: Seq(); ~Seq(); // default constructor/destructor Seq(Seq &SrcSeq); // copy constructor void Init(); // user callable "constructor" int EnsureSpace(size_t ReqSpace); // make sure that there is enough space int EnsureSpace(void) { return EnsureSpace(Len); } int SetLen(size_t NewLen) { Len=NewLen; return EnsureSpace(Len); } int ReallocLen(size_t NewLen); int EnsureSpaceSafe(size_t ReqSpace); void Free(void); // free all allocated space, remove all data void Clear(void) { Len=0; } // clear the sequence (set length to zero) size_t Index(type *Item) { return (size_t)(Item-Elem); } type &operator[] (int idx) { return (Elem[idx]); } // [index] operator Seq const &operator=(Seq const &SrcSeq); // assignment operator type *First(void) { return Elem; } type *Last(void) { return Elem+(Len-1); } type *Append(size_t Num=1); // add one or more elements at the seq. end, returns the pointer to the new element(s) type *Insert(size_t Pos=0, size_t Num=1); // insert Num elements at Pos void Delete(size_t Pos=0, size_t Num=1); // delete Num elements at Pos void Shift(int Pos, const type &Fill); // shift left or right with filling int Truncate(size_t Margin=0); // remove unused but allocated space int Copy(type *Data, size_t DataLen); int Copy(Seq &Src, size_t StartPos=0) // copy the contains of another sequence { return Copy(Src.Elem+StartPos,Src.Len-StartPos); } int Copy(Seq &Seq, size_t StartPos, size_t MaxLen); void Move(Seq &Seq); // move the contains of another sequence, clear the other sequence int Join(const type &Data); int Join(type *Data, size_t DataLen); // join (append) given data int Join(Seq &Seq) { return Join(Seq.Elem,Seq.Len); } // join a copy of the other sequence int NullTerm(void); // null-terminate (for character strings) void Reverse(void); // reverse the sequence order void FillWith(const type &Data, size_t StartPos=0); // fill with given value void Print(char *Format, size_t Columns=10); int SaveToFile(FILE *File); int LoadFromFile(FILE *File); public: size_t Space; // that many elements are allocated in *Elem size_t Len; // that many elements are used up type *Elem; // the storage space, contains Len elements } ; template Seq::Seq() { Elem=0; Len=Space=0; } template void Seq::Init() { Elem=0; Len=Space=0; } template Seq::~Seq() { free(Elem); } template Seq::Seq(Seq &SrcSeq) { if(EnsureSpace(SrcSeq.Len)==0) { Len=SrcSeq.Len; memcpy(Elem,SrcSeq.Elem,Len*sizeof(type)); } } template void Seq::Free(void) { free(Elem); Elem=0; Space=Len=0; } template int Seq::EnsureSpace(size_t ReqSpace) { if(ReqSpace<=Space) return 0; // CINT doesn't accept NULL pointers to realloc() #ifdef __CINT__ if(Elem) Elem=(type *)realloc(Elem,ReqSpace*sizeof(type)); else Elem=(type *)malloc(ReqSpace*sizeof(type)); #else Elem=(type *)realloc(Elem,ReqSpace*sizeof(type)); #endif if(Elem==0) { Space=Len=0; return -1; } Space=ReqSpace; return 0; } template Seq const &Seq::operator=(Seq const &SrcSeq) { if((this!=&SrcSeq)&&(EnsureSpace(SrcSeq.Len)==0)) { Len=SrcSeq.Len; memcpy(Elem,SrcSeq.Elem,Len*sizeof(type)); } return (*this); } template int Seq::ReallocLen(size_t NewLen) { Elem=(type *)realloc(Elem,NewLen*sizeof(type)); if(Elem==0) { Space=Len=0; return -1; } Space=Len=NewLen; return 0; } template int Seq::Truncate(size_t Margin) { if(Space==(Len+Margin)) return 0; Elem=(type *)realloc(Elem,(Len+Margin)*sizeof(type)); if(Elem==0) { Space=Len=0; return -1; } Space=Len+Margin; return 0; } template void Seq::Move(Seq &Seq) { free(Elem); Len=Seq.Len; Space=Seq.Space; Elem=Seq.Elem; Seq.Elem=0; Seq.Len=Seq.Space=0; } template int Seq::Copy(type *Data, size_t DataLen) { if(EnsureSpace(DataLen)) return -1; memcpy(Elem,Data,DataLen*sizeof(type)); Len=DataLen; return 0; } template int Seq::Copy(Seq &Src, size_t StartPos, size_t MaxLen) { int DataLen; DataLen=Src.Len-StartPos; if(DataLen>MaxLen) DataLen=MaxLen; if(EnsureSpace(DataLen)) return -1; memcpy(Elem,Src.Elem+StartPos,DataLen*sizeof(type)); Len=DataLen; return 0; } template int Seq::Join(const type &Data) { if(EnsureSpace(Len+1)) return -1; Elem[Len++]=Data; return 0; } template int Seq::Join(type *Data, size_t DataLen) { if(EnsureSpace(Len+DataLen)) return -1; memcpy(Elem+Len,Data,DataLen*sizeof(type)); Len+=DataLen; return 0; } template type *Seq::Insert(size_t Pos, size_t Num) { if(EnsureSpace(Len+Num)) return 0; // int p; for(p=Len-1; p>=Pos; p--) Elem[p+Num]=Elem[p]; if((Len-Pos)>0) memmove(Elem+Pos+Num,Elem+Pos,(Len-Pos)*sizeof(type)); Len+=Num; return Elem+Pos; } template void Seq::Delete(size_t Pos, size_t Num) { if((Len-Pos-Num)>0) memmove(Elem+Pos,Elem+Pos+Num,(Len-Pos-Num)*sizeof(type)); Len-=Num; } template type *Seq::Append(size_t Num) { if(EnsureSpace(Len+Num)) return 0; Len+=Num; return Elem+(Len-Num); } /* template int Seq::NullTerm(void) { if(EnsureSpace(Len+1)) return -1; Elem[Len]=0; return 0; } int Seq::NullTerm(void) { if(EnsureSpace(Len+1)) return -1; Elem[Len]=0; return 0; } */ template void Seq::Reverse(void) { size_t i,j; type T; for(i=0,j=Len-1; i void Seq::FillWith(const type &Data, size_t StartPos) { size_t i; for(i=StartPos; i void Seq::Shift(int Pos, const type &Fill) { size_t i; if(Pos>0) // shift toward higher positions - data inserted at the start of the sequence { if(Pos void Seq::Print(char *Format, size_t Columns) { size_t i,Col; for(Col=0, i=0; i=Columns) { printf("\n"); Col=0; } } if(Col>0) printf("\n"); } // ======================================================================== // A 2-dimensional sequence template class Seq2d { public: Seq2d(); ~Seq2d(); int EnsureSpace(size_t rows, size_t cols); // make sure that there is enough space void Free(void); // free all space void Clear(void) { Rows=0; Cols=0; } // clear the sequence (set length to zero) // type &operator[] (int idx) { return (Elem[idx]); } // [idx] operator // type *Add(int Num=1); // add one or more elements, returns the index to the new element(s) size_t Rows,Cols; // that much is filled up size_t AllocRows,AllocCols; // that much is allocated type **Elem; // contains Len elements } ; template Seq2d::Seq2d() { Elem=0; AllocRows=Rows=AllocCols=Cols=0; } template Seq2d::~Seq2d() { size_t r; for(r=0; r void Seq2d::Free(void) { size_t r; for(r=0; r int Seq2d::EnsureSpace(size_t rows, size_t cols) { size_t r; type **New; if(rows>AllocRows) { New=(type**)malloc(rows*sizeof(type*)); if(New==0) { Free(); return -1; } // printf("[Seq2d::EnsureSpace] AllocRows %d->%d\n",AllocRows,rows); if(Elem) { memcpy(New,Elem,AllocRows*sizeof(type**)); free(Elem); } Elem=New; for(r=AllocRows; rAllocCols) { for(r=0; r%d\n",AllocCols,cols); AllocCols=cols; } return 0; } // ======================================================================== // A buffer structure for processing a continues series of samples. // It is a linear array: // - data between "Read" and "Write" is ready to be readout // - data between "Write" and "Size" is still beeing written or processed // - data before "Read" has been read-out and is thus obsolete // As more data comes the samples must be shifted and the obsolete data removed: // this is done by: RemovePastData() template class SampleBuffer { public: SampleBuffer() { Sample=0; AllocSize=Size=Read=Write=0; } ~SampleBuffer() { free(Sample); } void Free(void) { free(Sample); Sample=0; AllocSize=Size=Read=Write=0; } int EnsureSize(size_t MaxSize) { // printf(" SampleBuffer::EnsureSize(%d)\n",MaxSize); if(MaxSize<=AllocSize) return 0; #ifdef __CINT__ // CINT doesn't accept NULL pointers to realloc() if(Sample) Sample=(Type *)realloc(Sample,MaxSize*sizeof(Type)); else Sample=(Type *)malloc(MaxSize*sizeof(Type)); #else Sample=(Type *)realloc(Sample,MaxSize*sizeof(Type)); #endif if(Sample==0) { AllocSize=Size=0; return -1; } AllocSize=MaxSize; return 0; } int EnsureWriteLen(size_t MaxWriteLen) // ensure enough space for writing new data { return EnsureSize(Write+MaxWriteLen); } void SetEmpty(void) // remove all data, make buffer empty { Read=Write=Size=0; } void RemovePastData(void) // remove data before the read pointer { memcpy(Sample,Sample+Read,(Size-Read)*sizeof(Type)); Write-=Read; Size-=Read; Read=0; } Type &operator[] (size_t Idx) // access data given by index { return Sample[Idx]; } size_t ReadLen(void) // length of data to be read { return Write-Read; } Type *ReadPtr(void) // get pointer to read data { return Sample+Read; } size_t WriteLen(void) // length of data that can be written { return Size-Write; } Type *WritePtr(void) // get pointer to write data { return Sample+Write; } void Print(char *Title=0) { printf("%s Sample=%08X, Read=%d, Write=%d, Size=%d, AllocSize=%d\n", Title ? Title:"SampleBuffer:", (int)Sample, Read, Write, Size, AllocSize); } public: Type *Sample; // allocated storage pointer size_t Read; // index to data that is ready to be read size_t Write; // index to data that is still to be written size_t Size; // current size of data (includes data before the read pointer) size_t AllocSize; // allocated size for data } ; // ======================================================================== #endif // __STRUC_H__ gmfsk-0.7pre1/src/olivia/olivia.cc0000644000076400007640000001440310174014756012623 /* * olivia.cc -- OLIVIA modem * * Copyright (C) 2005 * Tomi Manninen (oh2bns@sral.fi) * * This file is part of gMFSK. * * gMFSK is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * gMFSK is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with gMFSK; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include "main.h" #include "trx.h" #include "mfsk.h" #include "snd.h" extern "C" void olivia_init(struct trx *trx); struct olivia { MFSK_Transmitter < float >*Tx; MFSK_Receiver < float >*Rx; gint16 *txbuffer; gfloat *txfbuffer; gint txbufferlen; gint16 *rxbuffer; gint rxbufferlen; gint escape; }; static void olivia_txinit(struct trx *trx) { struct olivia *s = (struct olivia *) trx->modem; guint8 c; // fprintf(stderr, "olivia_txinit()\n"); s->Rx->Flush(); while (s->Rx->GetChar(c) > 0) trx_put_rx_char(c); s->Tx->Start(); s->escape = 0; } static void olivia_rxinit(struct trx *trx) { struct olivia *s = (struct olivia *) trx->modem; // fprintf(stderr, "olivia_rxinit()\n"); s->Rx->Reset(); s->escape = 0; } static void olivia_free(struct olivia *s) { // fprintf(stderr, "olivia_free(%p)\n", s); if (s) { delete s->Tx; delete s->Rx; g_free(s->txbuffer); g_free(s->txfbuffer); g_free(s->rxbuffer); g_free(s); } } static void olivia_destructor(struct trx *trx) { struct olivia *s = (struct olivia *) trx->modem; // fprintf(stderr, "olivia_destructor()\n"); statusbar_set_main(""); olivia_free(s); trx->modem = NULL; trx->txinit = NULL; trx->rxinit = NULL; trx->txprocess = NULL; trx->rxprocess = NULL; trx->destructor = NULL; } static gint olivia_unescape(struct trx *trx, gint c) { struct olivia *s = (struct olivia *) trx->modem; if (trx->olivia_esc == 0) return c; if (s->escape) { s->escape = 0; return c + 128; } if (c == 127) { s->escape = 1; return -1; } return c; } static int olivia_txprocess(struct trx *trx) { struct olivia *s = (struct olivia *) trx->modem; gint c, i, len; guint8 ch; /* * The encoder works with BitsPerSymbol length blocks. If the * modem already has that many characters buffered, don't try * to read any more. If stopflag is set, we will always read * whatever there is. */ if (trx->stopflag || (s->Tx->GetReadReady() < s->Tx->BitsPerSymbol)) { if ((c = trx_get_tx_char()) == -1) { if (trx->stopflag) s->Tx->Stop(); } else { /* Replace un-representable characters with a dot */ if (c > (trx->olivia_esc ? 255 : 127)) c = '.'; if (c > 127) { c &= 127; s->Tx->PutChar(127); } s->Tx->PutChar(c); } } if (s->Tx->GetChar(ch) > 0) if ((c = olivia_unescape(trx, ch)) != -1) trx_put_echo_char(c); if ((len = s->Tx->Output(s->txbuffer)) > 0) { for (i = 0; i < len; i++) s->txfbuffer[i] = (gfloat) (s->txbuffer[i] / 32767.0); sound_write(s->txfbuffer, len); } if (!s->Tx->Running()) return -1; return 0; } static int olivia_rxprocess(struct trx *trx, float *buf, int len) { struct olivia *s = (struct olivia *) trx->modem; gint i, c; guint8 ch = 0; gfloat snr; gchar *msg; // fprintf(stderr, "olivia_rxprocess(%d)\n", len); if (len > s->rxbufferlen) { s->rxbuffer = (gint16 *) g_realloc(s->rxbuffer, len * sizeof(gint16)); s->rxbufferlen = len; } for (i = 0; i < len; i++) s->rxbuffer[i] = (gint16) (buf[i] * 32767.0); s->Rx->SyncThreshold = trx->squelchon ? trx->olivia_squelch : 0.0; s->Rx->Process(s->rxbuffer, len); if ((snr = s->Rx->SignalToNoiseRatio()) > 99.9) snr = 99.9; trx_set_metric(snr); msg = g_strdup_printf("SNR: %4.1f | Freq: %+4.1f/%4.1f Hz | Time: %5.3f/%5.3f sec", s->Rx->SignalToNoiseRatio(), s->Rx->FrequencyOffset(), s->Rx->TuneMargin(), s->Rx->TimeOffset(), s->Rx->BlockPeriod()); statusbar_set_main(msg); g_free(msg); while (s->Rx->GetChar(ch) > 0) if ((c = olivia_unescape(trx, ch)) != -1 && c > 7) trx_put_rx_char(c); return 0; } void olivia_init(struct trx *trx) { struct olivia *s; // fprintf(stderr, "olivia_init()\n"); s = g_new0(struct olivia, 1); s->Tx = new MFSK_Transmitter < float >; s->Rx = new MFSK_Receiver < float >; switch (trx->olivia_tones) { case 0: s->Tx->Tones = 4; break; case 1: s->Tx->Tones = 8; break; case 2: s->Tx->Tones = 16; break; case 3: s->Tx->Tones = 32; break; case 4: s->Tx->Tones = 64; break; case 5: s->Tx->Tones = 128; break; case 6: s->Tx->Tones = 256; break; } switch (trx->olivia_bw) { case 0: s->Tx->Bandwidth = 125; break; case 1: s->Tx->Bandwidth = 250; break; case 2: s->Tx->Bandwidth = 500; break; case 3: s->Tx->Bandwidth = 1000; break; case 4: s->Tx->Bandwidth = 2000; break; } s->Tx->SampleRate = 8000; s->Tx->OutputSampleRate = 8000; if (s->Tx->Preset() < 0) { g_warning("olivia_init: transmitter preset failed!"); olivia_free(s); return; } s->txbufferlen = s->Tx->MaxOutputLen; s->txbuffer = g_new(gint16, s->txbufferlen); s->txfbuffer = g_new(gfloat, s->txbufferlen); s->Rx->Tones = s->Tx->Tones; s->Rx->Bandwidth = s->Tx->Bandwidth; s->Rx->SyncMargin = trx->olivia_smargin; s->Rx->SyncIntegLen = trx->olivia_sinteg; s->Rx->SyncThreshold = trx->squelchon ? trx->olivia_squelch : 0.0; s->Rx->SampleRate = 8000; s->Rx->InputSampleRate = 8000; if (s->Rx->Preset() < 0) { g_warning("olivia_init: receiver preset failed!"); olivia_free(s); return; } s->rxbufferlen = 0; s->rxbuffer = NULL; trx->modem = s; trx->txinit = olivia_txinit; trx->rxinit = olivia_rxinit; trx->txprocess = olivia_txprocess; trx->rxprocess = olivia_rxprocess; trx->destructor = olivia_destructor; trx->samplerate = 8000; trx->fragmentsize = 1024; trx->bandwidth = s->Tx->Bandwidth; trx->frequency = 500.0 + trx->bandwidth / 2.0; } gmfsk-0.7pre1/help/0000777000076400007640000000000010206176700007763 5gmfsk-0.7pre1/help/Makefile.am0000644000076400007640000000011307662027254011741 ## Process this file with automake to procude Makefile.in SUBDIRS = gmfsk gmfsk-0.7pre1/help/Makefile.in0000644000076400007640000003125610206155264011755 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = gmfsk subdir = help ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = DIST_SOURCES = RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ps-recursive install-info-recursive uninstall-info-recursive \ all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive \ check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu help/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = .. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ clean-generic clean-recursive ctags ctags-recursive distclean \ distclean-generic distclean-recursive distclean-tags distdir \ dvi dvi-am dvi-recursive info info-am info-recursive install \ install-am install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am pdf-recursive ps ps-am \ ps-recursive tags tags-recursive uninstall uninstall-am \ uninstall-info-am uninstall-info-recursive uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/help/gmfsk/0000777000076400007640000000000010206176700011072 5gmfsk-0.7pre1/help/gmfsk/Makefile.am0000644000076400007640000000001407662025077013051 SUBDIRS = C gmfsk-0.7pre1/help/gmfsk/Makefile.in0000644000076400007640000003127310206155265013064 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ SUBDIRS = C subdir = help/gmfsk ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = DIST_SOURCES = RECURSIVE_TARGETS = info-recursive dvi-recursive pdf-recursive \ ps-recursive install-info-recursive uninstall-info-recursive \ all-recursive install-data-recursive install-exec-recursive \ installdirs-recursive install-recursive uninstall-recursive \ check-recursive installcheck-recursive DIST_COMMON = Makefile.am Makefile.in DIST_SUBDIRS = $(SUBDIRS) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu help/gmfsk/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) uninstall-info-am: # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" mostlyclean-recursive clean-recursive distclean-recursive \ maintainer-clean-recursive: @set fnord $$MAKEFLAGS; amf=$$2; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ETAGS = etags ETAGSFLAGS = CTAGS = ctags CTAGSFLAGS = tags: TAGS ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ mkid -fID $$unique TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if (etags --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ else \ include_option=--include; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -f $$subdir/TAGS && \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(ETAGS_ARGS)$$tags$$unique" \ || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) ' { files[$$0] = 1; } \ END { for (i in files) print i; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d $(distdir)/$$subdir \ || mkdir $(distdir)/$$subdir \ || exit 1; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" \ distdir=../$(distdir)/$$subdir \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: info: info-recursive info-am: install-data-am: install-exec-am: install-info: install-info-recursive install-man: installcheck-am: maintainer-clean: maintainer-clean-recursive maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-info-am uninstall-info: uninstall-info-recursive .PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am clean \ clean-generic clean-recursive ctags ctags-recursive distclean \ distclean-generic distclean-recursive distclean-tags distdir \ dvi dvi-am dvi-recursive info info-am info-recursive install \ install-am install-data install-data-am install-data-recursive \ install-exec install-exec-am install-exec-recursive \ install-info install-info-am install-info-recursive install-man \ install-recursive install-strip installcheck installcheck-am \ installdirs installdirs-am installdirs-recursive \ maintainer-clean maintainer-clean-generic \ maintainer-clean-recursive mostlyclean mostlyclean-generic \ mostlyclean-recursive pdf pdf-am pdf-recursive ps ps-am \ ps-recursive tags tags-recursive uninstall uninstall-am \ uninstall-info-am uninstall-info-recursive uninstall-recursive # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/help/gmfsk/C/0000777000076400007640000000000010206176701011255 5gmfsk-0.7pre1/help/gmfsk/C/Makefile.am0000644000076400007640000000024207665504031013231 figdir = figures docname = gmfsk lang = C omffile = gmfsk-C.omf entities = fdl-appendix.xml legal.xml include $(top_srcdir)/xmldocs.make dist-hook: app-dist-hook gmfsk-0.7pre1/help/gmfsk/C/Makefile.in0000644000076400007640000003222610206155265013245 # Makefile.in generated by automake 1.7.6 from Makefile.am. # @configure_input@ # Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 # Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # # No modifications of this Makefile should be necessary. # # To use this template: # 1) Define: figdir, docname, lang, omffile, and entities in # your Makefile.am file for each document directory, # although figdir, omffile, and entities may be empty # 2) Make sure the Makefile in (1) also includes # "include $(top_srcdir)/xmldocs.make" and # "dist-hook: app-dist-hook". # 3) Optionally define 'entities' to hold xml entities which # you would also like installed # 4) Figures must go under $(figdir)/ and be in PNG format # 5) You should only have one document per directory # 6) Note that the figure directory, $(figdir)/, should not have its # own Makefile since this Makefile installs those figures. # # example Makefile.am: # figdir = figures # docname = scrollkeeper-manual # lang = C # omffile=scrollkeeper-manual-C.omf # entities = fdl.xml # include $(top_srcdir)/xmldocs.make # dist-hook: app-dist-hook # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # # No modifications of this Makefile should be necessary. # # This file contains the build instructions for installing OMF files. It is # generally called from the makefiles for particular formats of documentation. # # Note that you must configure your package with --localstatedir=/var/lib # so that the scrollkeeper-update command below will update the database # in the standard scrollkeeper directory. # # If it is impossible to configure with --localstatedir=/var/lib, then # modify the definition of scrollkeeper_localstate_dir so that # it points to the correct location. Note that you must still use # $(localstatedir) in this or when people build RPMs it will update # the real database on their system instead of the one under RPM_BUILD_ROOT. # # Note: This make file is not incorporated into xmldocs.make because, in # general, there will be other documents install besides XML documents # and the makefiles for these formats should also include this file. # # About this file: # This file was taken from scrollkeeper_example2, a package illustrating # how to install documentation and OMF files for use with ScrollKeeper # 0.3.x and 0.4.x. For more information, see: # http://scrollkeeper.sourceforge.net/ # Version: 0.1.2 (last updated: March 20, 2002) # # !!!!!! added /lib/ to scrollkeeper_localstate_dir - oh2bns !!!!!! srcdir = @srcdir@ top_srcdir = @top_srcdir@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = ../../.. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : ACLOCAL = @ACLOCAL@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GCONFTOOL = @GCONFTOOL@ GCONF_SCHEMAS_INSTALL_FALSE = @GCONF_SCHEMAS_INSTALL_FALSE@ GCONF_SCHEMAS_INSTALL_TRUE = @GCONF_SCHEMAS_INSTALL_TRUE@ GCONF_SCHEMA_CONFIG_SOURCE = @GCONF_SCHEMA_CONFIG_SOURCE@ GCONF_SCHEMA_FILE_DIR = @GCONF_SCHEMA_FILE_DIR@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ MKINSTALLDIRS = @MKINSTALLDIRS@ MSGFMT = @MSGFMT@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_CFLAGS = @PACKAGE_CFLAGS@ PACKAGE_LIBS = @PACKAGE_LIBS@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RANLIB = @RANLIB@ RPMBUILD = @RPMBUILD@ SCROLLKEEPER_BUILD_REQUIRED = @SCROLLKEEPER_BUILD_REQUIRED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SK_CONFIG = @SK_CONFIG@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_RANLIB = @ac_ct_RANLIB@ ac_ct_STRIP = @ac_ct_STRIP@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ bindir = @bindir@ build_alias = @build_alias@ datadir = @datadir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localstatedir = @localstatedir@ mandir = @mandir@ oldincludedir = @oldincludedir@ prefix = @prefix@ program_transform_name = @program_transform_name@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ figdir = figures docname = gmfsk lang = C omffile = gmfsk-C.omf entities = fdl-appendix.xml legal.xml # ************* Begin of section some packagers may need to modify ************** # This variable (docdir) specifies where the documents should be installed. # This default value should work for most packages. # docdir = $(datadir)/@PACKAGE@/doc/$(docname)/$(lang) docdir = $(datadir)/gnome/help/$(docname)/$(lang) # ************** You should not have to edit below this line ******************* xml_files = $(entities) $(docname).xml EXTRA_DIST = $(xml_files) $(omffile) CLEANFILES = omf_timestamp omf_dest_dir = $(datadir)/omf/@PACKAGE@ scrollkeeper_localstate_dir = $(localstatedir)/lib/scrollkeeper subdir = help/gmfsk/C ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = DIST_SOURCES = DIST_COMMON = $(top_srcdir)/omf.make $(top_srcdir)/xmldocs.make \ Makefile.am Makefile.in all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/xmldocs.make $(top_srcdir)/omf.make $(top_srcdir)/configure.in $(ACLOCAL_M4) cd $(top_srcdir) && \ $(AUTOMAKE) --gnu help/gmfsk/C/Makefile Makefile: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.in $(top_builddir)/config.status cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) uninstall-info-am: tags: TAGS TAGS: ctags: CTAGS CTAGS: DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) top_distdir = ../../.. distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) distdir: $(DISTFILES) $(mkinstalldirs) $(distdir)/../../.. @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ esac; \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ if test "$$dir" != "$$file" && test "$$dir" != "."; then \ dir="/$$dir"; \ $(mkinstalldirs) "$(distdir)$$dir"; \ else \ dir=''; \ fi; \ if test -d $$d/$$file; then \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-am all-am: Makefile installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -rm -f Makefile $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: info: info-am info-am: install-data-am: install-data-local @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) install-data-hook install-exec-am: install-info: install-info-am install-man: installcheck-am: maintainer-clean: maintainer-clean-am maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-info-am uninstall-local .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am info info-am install \ install-am install-data install-data-am install-data-local \ install-exec install-exec-am install-info install-info-am \ install-man install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-info-am uninstall-local omf: omf_timestamp omf_timestamp: $(omffile) -for file in $(omffile); do \ scrollkeeper-preinstall $(docdir)/$(docname).xml $(srcdir)/$$file $$file.out; \ done touch omf_timestamp install-data-hook-omf: $(mkinstalldirs) $(DESTDIR)$(omf_dest_dir) for file in $(omffile); do \ $(INSTALL_DATA) $$file.out $(DESTDIR)$(omf_dest_dir)/$$file; \ done -scrollkeeper-update -p $(scrollkeeper_localstate_dir) -o $(DESTDIR)$(omf_dest_dir) uninstall-local-omf: -for file in $(srcdir)/*.omf; do \ basefile=`basename $$file`; \ rm -f $(omf_dest_dir)/$$basefile; \ done -rmdir $(omf_dest_dir) -scrollkeeper-update -p $(scrollkeeper_localstate_dir) # If the following file is in a subdir (like help/) you need to add that to the path all: omf $(docname).xml: $(entities) -ourdir=`pwd`; \ cd $(srcdir); \ cp $(entities) $$ourdir app-dist-hook: if test "$(figdir)"; then \ $(mkinstalldirs) $(distdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(distdir)/$(figdir)/$$basefile; \ done \ fi install-data-local: omf $(mkinstalldirs) $(DESTDIR)$(docdir) for file in $(xml_files); do \ cp $(srcdir)/$$file $(DESTDIR)$(docdir); \ done if test "$(figdir)"; then \ $(mkinstalldirs) $(DESTDIR)$(docdir)/$(figdir); \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ $(INSTALL_DATA) $$file $(DESTDIR)$(docdir)/$(figdir)/$$basefile; \ done \ fi install-data-hook: install-data-hook-omf uninstall-local: uninstall-local-doc uninstall-local-omf uninstall-local-doc: -if test "$(figdir)"; then \ for file in $(srcdir)/$(figdir)/*.png; do \ basefile=`echo $$file | sed -e 's,^.*/,,'`; \ rm -f $(docdir)/$(figdir)/$$basefile; \ done; \ rmdir $(DESTDIR)$(docdir)/$(figdir); \ fi -for file in $(xml_files); do \ rm -f $(DESTDIR)$(docdir)/$$file; \ done -rmdir $(DESTDIR)$(docdir) dist-hook: app-dist-hook # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gmfsk-0.7pre1/help/gmfsk/C/fdl-appendix.xml0000644000076400007640000006525007665504153014311 Version 1.1, March 2000 2000Free Software Foundation, Inc.
Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
GNU Free Documentation License 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other written document free in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of copyleft, which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. The Document, below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as you. A Modified Version of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A Secondary Section is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (For example, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The Invariant Sections are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. The Cover Texts are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Transparent copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, whose contents can be viewed and edited directly and straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup has been designed to thwart or discourage subsequent modification by readers is not Transparent. A copy that is not Transparent is called Opaque. Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML designed for human modification. Opaque formats include PostScript, PDF, proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML produced by some word processors for output purposes only. The Title Page means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, Title Page means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies of the Document numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a publicly-accessible computer-network location containing a complete Transparent copy of the Document, free of added material, which the general network-using public has access to download anonymously at no charge using public-standard network protocols. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has less than five). C State on the Title Page the name of the publisher of the Modified Version, as the publisher. D Preserve all the copyright notices of the Document. E Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H Include an unaltered copy of this License. I Preserve the section entitled History, and its title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section entitled History in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the History section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K In any section entitled Acknowledgements or Dedications, preserve the section's title, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M Delete any section entitled Endorsements. Such a section may not be included in the Modified Version. N Do not retitle any existing section as Endorsements or to conflict in title with any Invariant Section. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section entitled Endorsements, provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version . 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections entitled History in the various original documents, forming one section entitled History; likewise combine any sections entitled Acknowledgements, and any sections entitled Dedications. You must delete all sections entitled Endorsements. 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and dispbibute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, does not as a whole count as a Modified Version of the Document, provided no compilation copyright is claimed for the compilation. Such a compilation is called an aggregate, and this License does not apply to the other self-contained works thus compiled with the Document , on account of their being thus compiled, if they are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one quarter of the entire aggregate, the Document's Cover Texts may be placed on covers that surround only the Document within the aggregate. Otherwise they must appear on covers around the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License provided that you also include the original English version of this License. In case of a disagreement between the translation and the original English version of this License, the original English version will prevail. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License or any later version applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. Addendum To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:
Copyright YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. A copy of the license is included in the section entitled GNU Free Documentation License.
If you have no Invariant Sections, write with no Invariant Sections instead of saying which ones are invariant. If you have no Front-Cover Texts, write no Front-Cover Texts instead of Front-Cover Texts being LIST; likewise for Back-Cover Texts. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.
gmfsk-0.7pre1/help/gmfsk/C/legal.xml0000644000076400007640000000713007665504146013015 Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this link or in the file COPYING-DOCS distributed with this manual. This manual is part of a collection of GNOME manuals distributed under the GFDL. If you want to distribute this manual separately from the collection, you can do so by adding a copy of the license to the manual, as described in section 6 of the license. Many of the names used by companies to distinguish their products and services are claimed as trademarks. Where those names appear in any GNOME documentation, and the members of the GNOME Documentation Project are made aware of those trademarks, then the names are in capital letters or initial capital letters. DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: DOCUMENT IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. gmfsk-0.7pre1/help/gmfsk/C/gmfsk.xml0000644000076400007640000013772510072576614013051 gMFSK"> ]>
&app; Manual V&manrevision; 2003 Tomi Manninen &legal; Tomi Manninen gMFSK Author
oh2bns@sral.fi
Carl Makin FreeBSD Port and Help Doc Contrib
carl@stagecraft.cx
This manual describes version &appversion; of &app;. Feedback To report a bug or make a suggestion regarding the &app; application or this manual, please email the author at oh2bns@sral.fi.
gmfsk Introduction &app; is a terminal program for digital conversation modes on HF amateur radio. &app; uses the soundcard to interface to the radio. No external modem or TNC is needed. &app; currently implements the following modes: MFSK (MFSK16 and MFSK8) RTTY THROB (1, 2 and 4 throbs/sec) PSK31 (BPSK and QPSK) PSK63 MT63 Hellschreiber (Feld Hell) Available Modes MFSK (MFSK16/MFSK8) M-ary Frequency Shift Keying is a way of transmitting digital data using multiple tones usually sending one tone at a time. It is designed for real-time keyboard to keyboard communications and could probably be regarded as a logical replacement for RTTY. MFSK16 uses 16 individual tones using around 300 Hz of bandwidth and sends data at around 40 wpm. MFSK8 uses 32 individual tones also using around 300 Hz of bandwidth but sends data at around half the speed. MFSK8 is better in low signal and very noisy conditions than MFSK16, but MFSK16 is usually the default as it still performs very will in most conditions and provides a faster data transfer. The original MFSK website by Murray Greenman ZL1BPU is at http://www.qsl.net/zl1bpu/MFSK/ Look for MFSK signals around 7037, 10147, 14080, 18105 and 21080 USB. RTTY RTTY is the granddaddy of Amateur HF digital communications. While there are several variations, you are most likely to find 170Hz Shift, 45.45 baud BAUDOT code radioteletype on the Amateur bands. Look for RTTY signals around 7080, 10140, 14070-14095, 18100, 21070-21100 USB. THROB (1/2/4 throbs/sec) Throb is an experimental mode written by Lionel Sear, G3PPT. It uses a possible 9 tones spaced 8 or 16 Hz apart, which gives a bandwidth of 72 or 144Hz respectively. It has three transmission speeds, 1,2 and 4 Throbs/sec which give data rates of 10, 20 and 40 wpm respectively. The 1 and 2 Throb/sec speed use a tone spacing of 8Hz, bandwidth 72 Hz and the 4 Throb/sec speed uses a spacing of 16 Hz, bandwidth 144 Hz. Lionel's web page is at http://www.lsear.freeserve.co.uk/page3.html Look for THROB signals near where you would also find MFSK signals. PSK31 (BPSK/QPSK) Phase Shift Keying 31.25 baud is one of the most popular HF Digital modes. It uses BPSK (Binary Phase Shift Keying) or QPSK (Quadrature Phase Shift Keying) and a varicode character set to achieve up to 50 WPM. It's a good performer most of the time although not quite as good as MFSK in noisy or high fading conditions. QPSK provides twice the raw data rate, which is then halved by adding redundancy to the data in the form of FEC. In therory this gives exactly the same data rate as BPSK but with slightly increased reliability. However in real world conditions there is little or no difference. The vast majority of contacts are done using BPSK. The "PSK31 Official Homepage" is at http://aintel.bi.ehu.es/psk31.html Look for PSK31 signals around 7070, 7035, 14070 and 21080 USB. PSK63 PSK63 is a faster variant of PSK31 designed especially for contest operation. It is otherwise identical to PSK31 but the symbol rate is 62.5 baud. PSK63 info can be found at http://www.qsl.net/kh6ty/psk63/ MT63 MT63 encodes the data into 64 different tones spread across either 500, 1000 (default) or 2000 Hz. The data is also encoded using Forward Error Correction (FEC) which spreads each character over 3.2 seconds in time as well. This makes it an extremely robust mode which is incredibly resistant to interference and exceptionally good at decoding weak signals. Due to the high number of tones and FEC encoding MT63 delivers approximately 100 wpm. The main MT63 website seems to be http://www.qsl.net/zl1bpu/MT63/MT63.html Look for MT63 signals around 14109.5 USB FELDHELL Feld-Hell or "Field Hellschreiber" is quite an old communications mode. It was first patented in 1929 and that patented form is still in use today. It was often used for field communications during WWII and so given the name of "Field" or "Feld" Hellschreiber to distinguish it from the land-line versions. Each character of a Feld-Hell transmission is portrayed as a series of dots, in a matrix, just like the printing of a dot-matrix printer. The dots are sent one at a time, rather like Morse code. Feld-Hell transmits in the following order - up each column from bottom to top, then up each successive column from left to right. An excellent website with Feld-Held info is at http://www.qsl.net/zl1bpu/FUZZY/Feld.html Look for Feld-Hell signals around 3575 (Region 1) 3559 (Region3), 7030-7040, 10135-10145, 14063-14070 (many operators monitor 14063), 18100-18105 and 21063-21070. Getting Started To Start &app; To start &app; type the following command, then press Return: gmfsk &app; accepts the following command line arguments: --cwirc Start &app; in a special CWIrc slave mode. See http://webperso.easyconnect.fr/om.the/web/helloip/ for details. --run-druid Start the configuration druid. The druid is normally started the first time you use the program. --testmode=MODE Start &app; in test mode. In test mode &app; reads the audio samples from standard input and writes them to standard output. MODE can be rx, tx or both. When You Start &app; When you start &app;, the following window is displayed.
&app; Start Up Window Shows &app; main window. Contains titlebar, menubar, toolbar, received text area, transmitted text area, macro buttons and the waterfall Menubar contains File, Mode, Settings, and Help menus.
The &app; window contains the following elements: Menubar. The menus on the menubar contain commands that let you log received text, select operating mode, modify parameters, and get help. Toolbar. The toolbar lets you switch between receiving, transmitting, generating a test tone or keeping the program idle. Loggingbar. The loggingbar provides an easy way to enter logging information into XLog. XLog is a seperate Unix Ham Logging program. It is not included with this program. Received Window. This is where all received text appears. Transmit Window. This is where the text you type appears as you type it when in transmit mode. Macro Buttons. There are 12 macros available to automate various tasks. These buttons will trigger the listed macro. Waterfall Display. Waterfall tuning display Function Box. The function box displays received signal and tuning information and allows you to manually set some operating parameters. Status Bar. The Status bar displays the operating status of the program including transmit state and mode. As with any Gnome application the Menubar and Toolbar areas are dockable, ie. you can drag them around the desktop or the application window.
Usage Let's take a look at &app;'s menubar: File Menu The File Menu allows you to some basic file management functions File Send File The Send File command loads a text file and sends enters it into the transmit window exactly as if you were typing it yourself, only much faster! When you invoke the Send File command a file selection box is displayed. Select the file that you want to transmit, then click OK. Click Cancel to abort. File Log to File Log to File saves everything both received and transmitted into a log file. This log file is specified in the Settings menu. The default filename is ~/gMFSK/log.txt. The state of Log to File is saved at program exit and restored next time the program is started. File Clear TX Window The Clear TX Window command clears the Transmit Text Window. File Clear RX Window The Clear RX Window command clears the Received Text Window. File Quit The Quit command does pretty much what you would expect... Mode Menu The Mode pulldown menu allows you to select which mode to use. Select one of the following modes; MFSK The MFSK modem supports two modes: MFSK16 - 16 tones, 15.625 symbols per second MFSK8 - 32 tones, 7.8125 symbols per second Both modes use convolutional FEC encoding (R=1/2, K=7, NASA standard polynomials) and viterbi decoding. MFSK16 also supports sending small pictures in analog FM mode. This is compatible with MixW (http://www.mixw.net/). Receiving pictures is automatic. Sending is triggered with the macros $pic and $picc (see ). RTTY RTTY support in &app; should be considered experimental. All the parameters (shift, baudrate, number of bits, parity, number of stopbits) are almost freely configurable. There is also a separate "reverse" setting for RTTY which you probably want to enable if you want to use USB to work RTTY. The "MSB first" option may be needed for the ASCII modes. Note that no sanity checking of the parameters is made by the program, it is quite possible to enter values that don't make sense. THROB Throb support is also to be considered experimental. For more information about THROB please check Lionel's web page (http://www.lsear.freeserve.co.uk/page3.html). PSK31 PSK31 support in &app; borrows heavily from the C++ modem classes written by Hansi Reiser DL9RDZ (which in turn is partly derived from the work of Andrew Senior G0TJZ and Peter Martinez G3PLX). While I have not used any code directly, much of the architecture and algorithms are almost directly copied from there. As a result I think the PSK31 support is pretty mature. PSK63 PSK63 is a faster variant of PSK31. MT63 The MT63 modem uses source code written by Pawel Jalocha SP9VRC. I have only written a few lines of glue code to integrate Pawel's code to my framework. The modem should be pretty mature. There is no support for the IZ8BLY style secondary channel. 8 bit characters are supported using escape 127 encoding. FELDHELL FeldHell has full international charater set support. However, FeldHell TX uses antialiased fonts which is probably not the optimal solution. The AGC parameter adjustments don't work yet. Settings The Settings pulldown menu allows you to modify program settings and FixText macros. Preferences Preferences are covered in the section. Configure Macros Configure Macros allows you to edit any one of the 12 fixtext macros. Selecting a fixtext macro to edit brings up a dialog box with two entry fields. The top one is for the name of the fixtext macro. Fixtext macro names are displayed on the fixtext buttons on the main screen. The larger text entry field is where you type the macro itself. Pretty much anything can be entered in here to be automatically sent when you either press the function key or the on screen button. FixTexts can contain macros. Macros start with the letter $. A standard macro is of the form $text. The available standard macros are; $$ The letter '$' $tx Push the TX button. $rx Switch to receive. $mycall Callsign as defined in preferences. $myname Name as defined in preferences. $myqth QTH as defined in preferences. $myloc Locator as defined in preferences. $myemail Email address as defined in preferences. $time Local time. $utctime Universal Coordinated Time. $date Local date. $utcdate UTC date. $call Other partys callsign taken from QSO data. $band Band taken from QSO data. $rxrst Received RST taken from QSO data. $txrst Transmitted RST taken from QSO data. $name Other partys name taken from QSO data. $qth Other partys QTH taken from QSO data. $notes Notes taken from QSO data. $soft Software version. $startqso Set QSO start time to current time. $logqso Send QSO data to Xlog $clearqso Clear loggingbar $mode Currently active mode name. $pic Send grayscale picture. $picc Send color picture The macro name can also be enclosed in curly braces. This can be useful if you need to avoid any spaces between the macro and some text. The macro can also have an optional argument separated by a colon. This only works in conjunction with curly braces. Currently this argument is only useful with the picture macro where you can supply a filename that way. A typical picture function might be: ${picc:/home/joe/joe.jpg} If the picture name is omitted or it is '?', the user is presented with a file selection dialog. In addition to standard macros you can use so called command substitution with a function of the form $(command). The command is executed using fork()/exec() and the standard output of the command is captured (standard error is discarded). If the last character of the captured output is a newline, it is removed. The fixtext macros are evaluated at the time the button is pressed (as opposed to being evaluated during the transmission) which is a significant fact especially with the "push ... button" and date/time macros. An unrecognized $-macro is ignored. Settings To configure &app;, choose Settings Preferences . The Preferences dialog contains the following sections: General General configuration options for &app;: Station info Specify your personal information. &app; will use these values in variables in macros. Callsign Station Callsign Name Your preferred name QTH Your location (eg Canberra, Australia) Locator Your Maidenhead locator square. The ARRL has a good page at http://www.arrl.org/locate/gridinfo.html E-mail Your email address (if you have one). Date & Time These are used in the $time and $date macros. Bands A comma separated list of bands that you want to appear in the Bands popdown list. Files & Dirs Configure the log file name and default directories for sent and received picture files. Appearance Lets you configure the colours and fonts used in &app;: Colors Click on the color button and then select your favourite colors from the Gnome color picker. Fonts Click on the font buttons and then select your favourite fonts from the Gnome font dialog. Modems Configure modem parameters. All modems preference panels have a Restart modem button at the bottom of the panel. If you make a change to a parameter you must press this button to restart the modem to make your changes take effect. All Settings that affect all modems. With TX frequency offset you can correct any systematic frequency error your transceiver might have between RX and TX modes. MFSK/THROB/PSK31 The only modem setting for these modes is an individual squelch setting. (THROB squelch has no effect.) RTTY This allows you to modify RTTY shift, baudrate, bits (5=BAUDOT, 7/8=ASCII) parity, stopbits, inverted or normal byte ordering. The defaults are: Shift 170, Baudrate 45.45, Bits 5 (BAUDOT), Parity none, Stopbits 1.5, Reverse Polarity yes and Send MSB First no. These are the Amateur default. You can change them if you want to work in ASCII rather then BAUDOT or decode non-Amateur signals. Not however that the software makes no sanity checking of the parameters. It's possible to enter values that make no sense. (RTTY squelch has no effect.) MT63 This allows you to change the bandwidth and interleave of the MT63 modem. The default parameters are: Bandwidth 1000 Hz, Interleave 64 (long), CW Identification no, Allow 8 Bit Characters yes. These are the recommended ones. It would be best to change them only when you fully understand the protocol. CW ID is sent alongside the transmission if selected. The callsign is taken from the station info preferences. HELL Here you can change the font and operating parameters of the Feld-Hell modem. (The AGC settings don't currently work.) Waterfall Configure the waterfall display. Settings This panel allows you to tweak the parameters of the waterfall display. Ref level Sets the reference level of the waterfall and spectrum displays. This sets the level in dB that corresponds to the brightest color in waterfall and to the top of the window in spectrum display. 0 dB corresponds (approximately) to the strongest signal that the sound card can handle. Amp span Sets the amplitude span of the waterfall and spectrum displays. This sets the difference in dB between black and white in waterfall and the top and bottom of the window in spectrum display. Mode Switches between Waterfall, Spectrum and Scope displays. Zoom Sets the zoom in Waterfall and Spectrum display modes. Speed Sets the display update speed. Window Sets the FFT windowing function used when calculating the Waterfall and Spectrum displays. Waterfall scrolls upwards Changes the direction of scrolling in the waterfall display (up or down). Devices Configure sound and PTT devices. Sound Please enter the full path to your OSS compatible sound device. This is probably something like /dev/dsp on Linux and /dev/dspW on FreeBSD. The Requested sample rate, TX rate offset and RX rate offset allow you to rectify any sample rate problems with your soundcard. Normally you don't need to touch these but in case your soundcard doesn't support the default rate of 8000 samples per second or if you know that it has some sample rate offset, you can correct it separately for transmit and receive. As an example of a bad case consider this: Your soundcard only supports 11025 sps, but you know that it actually samples at 11020 sps on transmit and 11035 on receive. In this case you should put 11025 to the Requested sample rate box, (11020 - 11025) / 11025 * 1000000 = -453.5 to the TX rate offset box and (11035 - 11025) / 11025 * 1000000 = 907 to the RX rate offset box. There are also options to enable 8 bit sound, stereo sound and full duplex. Try 8 bit or stereo audio if you get errors when &app; tries to open the sound device. Full duplex should not be used unless it's the only option that works; it is unsupported and generally a bad idea. PTT &app; has the ability to key your transmitter using either the serial or the parallel port. For serial port you can select DTR or RTS (or both), for parallel port DATA0 is used. Select one from the list or type whatever you want to the entry. Serial ports are of the form /dev/ttyS0 and parallel ports of the form /dev/parport0. On FreeBSD serial ports are something like /dev/cuaa0. There's a good page on interfacing your soundcard to your rig at; http://www.qsl.net/wm2u/interface.html Hamlib Configure Hamlib (http://hamlib.org) support. This may not be available if the support is not compiled in the binary. Settings Select the radio model and the port the radio is connected to. For the RPC rig, the port is the hostname where the rig daemon runs (typically localhost). For serial ports you need to then select the speed to be used. Config is a comma separated list of Hamlib config parameters: param1 = value1, param2 = value2, ... You can get a list of the parameters your rig support using the rigctl command: rigctl -m <model> -L Features Here you can select what &app; uses hamlib for. Operating &app; Operating &app; should be easy to learn even without much help if you have any experience in operating with other modern soundcard digital modes. The MFSK web site (http://www.qsl.net/zl1bpu/MFSK/) is suggested reading for background information. Also the help in IZ8BLY Stream program could prove useful. Note however that tuning in &app; works a little different to that in Stream. Setting audio levels is very important. The scope display should prove a nice tool for setting the incoming audio level. However be aware that the amplifier stages before the sound card mixer can also be overdriven without showing signs on the scope display. On transmit you should be just as careful. Overdriving MFSK or RTTY doesn't produce intermodulation products as there is only one tone transmitted at a time but harmonic products (of the audio) are always present when overdriving. THROB on the other hand does produce intermodulation products as most of the possible symbols use two tones. The received text and the QSO data area are of course subject to the normal X Window Selection system: dragging with the left button selects text and the middle button pastes the selected text. However the received text area also implements an additional trick with the right button. Clicking the right button over a word selects the word and opens a context menu where you can select where you want the selected data to be pasted. The waterfall can be paused from the popup menu that opens if you right click over it. The waterfall config dialog can also be activated from the popup menu. The status bar shows modem state, transmission mode and UTC time. Clicking the mode label is a shortcut to the mode config dialog. The Log entry button sends the QSO data to a logging program using interprocess communication (IPC). Currently only xlog (http://savannah.gnu.org/projects/Xlog) supports this feature. The New entry button clears all the QSO data fields and resets the QSO time (the first change after a reset on any of the QSO data fields sets the time). The most used functions now have keyboard accelerators. Fixtext buttons show the associated function keys in their labels and the other buttons tell you the accelerator in their tooltips ie. when you hover the mouse pointer above the button (be sure to enable tooltips in gnome config). About &app; &app; was written by Tomi Manninen. To find more information about &app;, please visit the gMFSK Web page. To report a bug or make a suggestion regarding this application or this manual, please email the author at oh2bns@sral.fi. This program is distributed under the terms of the GNU General Public license as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. A copy of this license can be found at this link, or in the file COPYING included with the source code of this program. Thanks Thanks to Murray ZL1BPU and Nino IZ8BLY for creating a very cool ham communication modes, MFSK16 and MFSK8. Special thanks to Murray for the technical documentation of MFSK16/8 and Hellschreiber. Thanks also to Jesús EB1DIX for his RTTY decoder program for Linux. I used that software as the base for my experiments and a lot of ideas was borrowed from it. Likewise thanks to Lionel G3PPT for making Throb source code publically available. Again lot was learned just by browsing through it. Thanks to Hansi DL9RDZ for his PSK31 C++ classes and the work of Andrew G0TJZ and Peter G3PLX on which the classes are based on. Special thanks to Pawel SP9VRC for his work on MT63 and the source code for it. Due to a stupid oversight from my part I released &app; v0.5 with Pawel's MT63 code under GPL even though Pawel's original license was not GPL-compatible. Fortunately Pawel has since agreed to release his code under the GPL. Thanks Pawel! Also many thanks to Phil KA9Q and Charles G4GUO for giving ideas and/or code for the project. Neither probably knew about this project but that's simply what free software is, everyone benefits from it! Last but not least many thanks to Joni OH2NJR/OH2MUI for providing me with feedback and equipment to be able to develop and test the stuff..... &GFDL;
gmfsk-0.7pre1/help/gmfsk/C/gmfsk-C.omf0000644000076400007640000000216310014267242013163 oh2bns@sral.fi (Tomi Manninen) oh2bns@sral.fi (Tomi Manninen) gMFSK Manual V0.2 2003-05-05 User manual for the gMFSK HF terminal program. User's guide gmfsk-0.7pre1/help/gmfsk/C/figures/0000777000076400007640000000000010206176701012721 5gmfsk-0.7pre1/help/gmfsk/C/figures/gmfsk_start_window.png0000644000076400007640000024570210206176701017270 PNG  IHDRbKGDIDATxg|Eg=BB P ұED)ґ ss{~8^:)9ggΜBȔ~8֍0 SIJ\uoյNkIR5& |x;I<8/ 9XgϊiqڌN$i@!G!#'*/|"I<7u-Av[KHVG&4<}Hij,b'xy瑈&Ib"I<P$x8)^[yR^!q~205 = VE=ꇩc-h4 *Du5M/8鷧.FDb5kb?g># P0\JL놺~K7]Xc1xN1_N-$,W= xXp qTLkO{#ؖBTrYLAdM qM8z&k8eD4:u9]N-(ZQKZ!nďH,V6 ܢQNeɺsn#xnw( <(zN.O۝XDb:~.kIQa՟y1oLΏ'vfIhq\ Dhr 8\ x8X8q,0˲n%Y֧Vm=׼a;A~04M*eҵ'BL]]P$r1jPQ:Rt9IQsY m#ycqt%ò~:ejf 28MDny~ :j/k:.׼MwN+Ab>摄G@=:J%V^("8(ay(#۽ú,q$AebM: BH"vDLhyl,d'yr(J{͆gG H!q<ޑ` Ų|nw4]ӭ`0L0\./tf^OQ8i3fXu94AMny(>g*Z5wbS@v AIR$W{8K833/J@ 'd0U?V 0 Y$IJJ4ܙAQSQFL&X,{ DŽL&IEQeee,"8ΆbY6;;>.$S |||d2.l6…S leifYV$iZPqq#9Nr8#Iv憆"/_: i0cƌwߝ2eիW׮]k4X, <+}mܸQR4^AXVZfff?~QF<_paΜ9fy޼yǏ?pJr:4M/\fu}$;_$ɒ{t:m6[VVW_}%z[ou…}]pA$I$'ON4iذa:ttR=NSNuԩW^˖- {D"ѽabD"t;vضmL&{Q*O?F1bɓf]%`0o q2}^|ŦMkFQ$Ο??))iYYYK,;vqFYYĉ'M$ n٦M3 6 r۶m_x?ʕ+`q:\h/b0pRʫ{lذٳ `(GD"f<8nܸP+$I2 3dȐի#FN^oԨB(.. b!tꫯ®\% >+..|~(XeYv׮]-[ѣn7B iԢETX2V^bYvs̑,ދ_*K;vd'N,..vG}WNRヂlf<`0U-A4lov{```fH|zD"G qdԩ?ҪU+P(7om۶͛۷oذa>x`IIInnnV4MLLL۶mtK_)ڵkj޼yhhL&Z]t9yd~x(!DDaaadd$Hrv;Bplr˖-{ݾ}{۶moܸѫW={><;;y6F,˂=' @P,R+b6= ?bZ?:gypn(J$9+ BV]ֶmۂ-Z?ӥK5kEKR޿: 2Ayyyڵڵ ֭[תUz+00p͚5>>> h޼?}vڲe Qbycǎ8qbcǎw}w!__߶m;v,<<<***11166tvիݻwg&??^2G TTs=rѣtxth4]tDyyy۷1bĮ]֭[wڵF >}^ѣ4M{eY1Lq\.߼y3ѯ_m۶z)e޼yn|%f~qy^T"xw,*E,+!K,L6 0>:w\D K5lO?4,, s:dZE"RbQV J$_}ݻO<2ܱ,{זfǎvH$o:_4hlF\.XLA>.]Bb' S0 ;|!]`l"H8Tv y~F#(&B̓~F/=Bp6 t:v],|wƌ#¯rl1(ar.(`0,_fknȑ{phC*ǻy. EGJ$a.R`?b H䝾 6uczO_/{ь.7@?<;Ί"TL0c>jD"A*,,,++++=췂r  `,rxJBF"\0 6`00T*͝rS򇙤}QQQgAO999O>d CM!I4ZN#[eeeÆ X,`7x<'N(++X,զ>yJ, Èba ZIW\Yz )x<&{<R <)QH@}s?eY,˲P7C7 T1m_uox-ֻ~HU [4;f P>rbq3 q*H"@Fj DpTR)qH `0tS;bqJJJBMAA rꆰO |Onжbk'ʝ\w!? Yw O;O;v,YlPF OјV-O`"??8nBo+c4NF"W/Xc0OdJJN e0AAf8B~6mFΞݽcG"> O>Y~ٳiӦeeebDaxB5{6׳΋kz0`07Z6""l6Wh 3;_rUhѢe˖6liӦuHps'srOG<ڴjvŦu21ztٳy;!uzV2pؾ,' `ƍPdNԄOxDž J~:={8b31aa )瓎kDz-<b lԨԩiZ:fLɓHdF)Byǎ>!MFq݃K$z\Qvvoڴ]h4bG)c0IBoلU}a)*+BO":o߆<5nK3x' gmv#p$sruh{)!Ie>#I%֥<_~š5^}!tltR#T|rNAY9[T*3224i2l0\H{ d C^ԳgLS*ssr`0k~: x^'?!}eVv:8NR?y5$a^BI. ҡ];1 z<&ӕiT?:wysu#`>p РiQR‹Db8??!vڂL`0w>#""t:݃id0 }nh{~Ih3Ol)KD1IfCFCvKԲeq4-x57!USRBL9'GDGdDϞ9m>͉Pv">x~l6ǃT*Mҥ[o|Æ<)W^we`0Joիg6P%J!lޕ[  y姏Y$yE=5)t/M'}DQO.Z cԨ5 }Jcǃ'-= ǥ\[FY"!2Rki'o(Ѵj:3f\z}ÕmۊwΝ^gwVJOOoذazzzbbi 1L5@#,zj3р:( ꥀIe!jA!$Ng|||vFs7UJHp?^3{ &W8;ia0M*ݿo{ލ)6fw8~&8׉v'M;ww??j3ާ*/,r:蜜DOdI /#Dܹswy{Fob0jFQp85j$HniG4-#b {{W}k}F#,e NZ,Bλ\R^I!!34wy b"W`0?3MabF[:8x. tU]_Er9eY؃΁*\a4-$~ *v>V ڠB,˪jN0\/CJef~aoVx9&79IRWZ։`yz#;MB8\~ԩ=zydv|}}%ɿbvWTP!jyU9!BTGPpf %G Nq^+sp\QQQQQQۗ$$Ijjj^^P111ssj… gjP>~~~yyy.\1bzURr4nܸU?EQE&irլ%Ip\|| `c=FA~~~l%^xyyy111#BxxxDD$^$##h4FEE=d|5%#1ϝ;gZ8 oѢE FEɑ,'wc ͺ\ٽ ?.&BVlOe  yt*nƖ&pKޟOy~ %dC7Gc%:φ]rW8N&rUl6㼵wʒVxc䕡APqnXc[G?* |cȠP(R)Bt\.NqX,W"JfyRk_RB|*SS$IjZHp8VT*U,B"al6X,zFR9a#/HyajI8L=TއUίJ2==,4mT&bٳgWX1cƌS_ UllCYVBѸq㠠 e0Mڔ(jٲehh(gϞqMwx<>>>fv2 S=2Rt:/^جY3$nwJJJ ʥE.Z;@bݻ,&&uiiiBP(z^ӵh"77766V$1 s阘T-*RRRRiXX7V4$)l 8h{X w?o={ŋknn.[dHKK۷oo}ʕ܂{h4QF%%%Eَ\rej5Ⱦ~#G8iӦiکS0={s~ޮ]W^yrGf{^ER\`bٲeJ:w3<ӹs篾ㅅ_5IOJFTJ$)HqBHLL\rԩof͚SNGGGg.K*|z>22rΜ9SLxlÆ nj1pɓ'".;;;77tޯ#IbtqӧO63 ӯ_kرCR]x_ŧN?]\\_6n?^nݥKRcwɓC(͚5k޼޽{)**r8999EEE4Mgdd;&M //ji[n#,,l~~~ Ixo޼5Mf͖/_o'Nm^iDտMQh|7Dze`gϞsfeeI$٨Q-[]FDD5kִo&rD"Xq鄄,D"qj:!!W^=z);LEegg{<;T ofDVk~~~YY5jV 4hPdd$M8Gƍ[hѷok׮mݺQFNmG;m4駟n^ߎ5M6 pe(ݾo>Rώ;AAA>>>͛7/g̘t:N'0`/!-ZoYdɉ'._ֽ{)S4&56bY9sY8##cÆ ovzv;nt8jկ_?3gNdddFl="hWt钟֭[  %@DZ۷SO=5`! ^RI$( Ν;t:]ֳgόfFREFF~'_|E˖-ASG7)x<;v,--ݰaC`g~ۼK,Y`qh~={zwҤI"bp6C 1~!I/_~wZD:4Mk4LljxS=,vڋ/7n޼y ,}]K/EDD-\{w͛7l0T:}t___Lj]vk׮5jh:_[6L m6^OQX,daX`7a!yKEIff`x'h?]v߂T*U(C*n*~!ewBH,;NXmA F#+f%tǛ5kUѼyyyIIImڴQŸb`Zjs4MòtcYV",k6i/rSš6m(Dfff޸qe˖*TjXn_sƍWxU sرN:=vNyO>Mdll7N.bbw`"vEŲl^^ҥK!&tԩ !UMI9E7nܸW^?zK.Dn)M*~Y.S;CST Cy%$0fwk+U"//u oAAABLw_˝QR. |sK˲lgΜv}}}E"GnrWFpBzW0༐a a0fr帳{ 8Ne[:yF޲=`9t:! RDx`e2k%Z#wpay̝~ߐ$)JiZDk{ yh`^PTYYY{eQq钒+s`^z,233 k GEEN; ph4ϟrJyyӦM!I2//o߾}5F,O}xonph C8ܝ`.ȦPufK$$1 L%_J/TZaHc01DT^d05oҤIddJ1bDejw]~~~J,z]8.(((44ƽuSV "L&(Ny+I fQQQW<֐$ m6۵kjP j¨L/ +˜]}޳gOn@H(vzjl>%%%gPSӵj 6NX|9n/xiiiPPPf*Wp._ Y1H$k޼yDDbj/xNH{…#GʴftXXXBBBU7wFFƁ,JD"Qvv6,AY*d{= CEhCc2˽c#n_t2iѣ)_yX@-({-7x*zn?0.iw];>?T>(utSɯyV+L!M xHdF&>}ptܹr[ (|.w$FH^wc@_y fs׮]! \.Np}HT /!%BaYQ^x*j # Btš!$H O7C? !]ނkZ  TꠂWP>^PS` yjn'!f0M&X #U @~T?<|I KԩS'ORH,++5 vRiZAK$Vv D"D4MCSzz:EQQQQe2l&*0Lvvܹs۷o/㏟ٳg9" jݫP(Ν;ׯ_K.ܹqqq //r…͛7OJJz7'O=цOt믿Κ5'Pɯs*riӦѣ=zHMMjT"v}ƌiii#G޽Cnڵk233U*լY1běoٮ];.*˗/Ü^x/^}H!NE fff] \)S 3fN``ƍϙ3'==O>)((LU+ˮ]|* l-3g4 Vu_KJJƏ/nٲEP駟7n,**3fLvvʕ+8jE"W_}r/Bܹs߾}?do q\͚5qFddco,Z_~3fLQQ׫?b&͛7߸q/|򘘘7FGGAb<,VuVJMMݷo_aa?nh4lիW?ԩS/"2|V+pγ}v^{aÆaaa~~~ۊ+4i;ja 3%Tguh믿mvAAA-R*&Lx iҤIjjjttѴiӈzjÆ ~~~SL9v'|ңGzjر o=~FL81,,L&&& 9s<-Zhݺu֭?㠠 Db0.]qڵVZ5iҤC0=o޼g}vǏ?~xѣϝ;w޽{_|YP>|8;;w={ϯYf3f3͚5W^XXBW^ӧϠAΞ={ɓ'2} snٲe&Lx<}QVV/D BRL&DbۥR)BrSt/$$d:uZlYdd$(SaV_߿Yf֭.h ǣT*۶mxbP-JKKy~ׯ_[t>[nF`X,+,,t\tٳ999!ݎ7"'_z[B<3vi\n CXXɓ㓒:wܤIR٬YKҀnݺ><...((8+=$a{!ko?{ƍ6mڀ t͚5(* aÆn{رA!//UVbbbxoٲeFbcc{QZZP(6lѮ]XݻqڷoʕzEEEb ˲ᱱZ4##W_|7oN-[S,˚L&-jbPjdRE&UiFX߸qcѢE3g΄`H &v $VՐ cm6l( &`WT IVR, nI 8TAܐp9p+)d[:wv+_*CVxP\ZZ xRa}d6gvXL$ ?c\.z8p*sj$8@8i 5, tvXB{tO%S~GV . dx<0z=eXRrـ/3A@l/"ᩁq0bKJJjnjtsxil6ÞVQQ`Z{V"O")&`{AH? ePFHS}* 9+Jw3Z%(Dsd;7P];Zʚ#pr[\t a$x7[ ;rN5.&N o"|Yqz{e!L[L 9{l!G޼yfs[V(Mk3 sb@\<''' -!ryUq\ϟts)8+++::Z0?@ͨjw%jJOʪVaZu `t'8__hZ]%nG tgrKf[_`+f?jP )QF#GW(p:@GFFDc̲Rh4Uqr j1YdTP78ba0@x`0 疦*޲e?oΙ3( TE:uUV/n֬٩S*-`xwӦMQQQڵlwc0 T*-**cF$AJZU?2HOOw:2:4]RROVn$`* Ƞ|)__r 0|ƪ`j$I3[C4ozzO?`0ڄPZ#//ϻ6 8ΆbՏ`0 aWfP`a~ !5V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V Sy7Xc0Lmy }U?Ny$I˲kU?N`ODJJw@t0 S'I2))~ ag S;u:]Y?V S+RRRTT_jjf( 1 6q\XX_JJ ˲|0 CiҤ qۼ Sy ӬYbX, x\.WӦMKKKoܸQ.1 BdlllYYYjjjf`Y1 .}Ӊ;1 6s&Mr(>~ <K.V S+!IR$1 C$Nڌ`0u 'm`0EE`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9`0:V S`Xc0L~ s`Տ`0u1 ΁U?9n`*obՏ`0 Y(Ǫ`j-"H.3 X,V(~ =-[88O$IZV V Sy>>>>00񀢇/E"QqqV S I2..NRy<$nX,fYV"v0cN = Sk!v|d2]~;!] S+!IaÆV5%%ARal`0Z gx< 4PT.;V S XV{5͆;1 q\DDVMJJ(JbrIII(Ay`0E$g2>ª`jAx<cccF#EQ`j!EEFFB꞊Ū`j'"x`j' u `Տ`0u`j!B}.޵`0ZADrH$lbՏ`0 $Vkiii4Mfx`Տ`0ߴiR8O$IvU?*(0a톰^((JoܸzjU?&r)(bjᓓ& ܉`0 T*Uaa+W/]T\\P(h>c0Ldϟԩ۶mtR`j3 L>=$$d˖-ӦMs݂翳~on3`J|BBB,Y2{O?;e?]L`0G}8NCyXۥrWQ~ 9r@"l6 Ä 6vA2'**jȐ![pK$rQpn/,,8n^6v )(8YX,@7WNlvyz>,,LF~ō2,00PpXδU^AY/!:}ftǰaPށ+cp+<;ݞntpKz^.}qX,7.F-p1{9E *zPX ja"HBn뭏RDœ^IhTʲ6>p#ˊA:Sxf`06%ýsd'^ 0 #JBN$IX,8)ݻ{A]v4 -qb MgA){<r`9!ڜa),8D,+m8Uz aR$\.BaZ:5F4 c@۝["L;/@r+<"0gD8~+VG^3{<䀘(!%X'ܲѭAAd2x n=|p+_ P&9TeU*Vd,˦qW^=T ȸwbv)!!!$Il6TP(׸q L*4Z&I?@t0Dl6b [+1PY.>} "8U5h ###--W^WBc2j&ڵkD.L&Drr9dR(Pe׵k|ZZZj2|}}VZT}w9 $EZ޼yልMLL>}` x<>>>_|E&McXV -8f,RDˑ$ /NS*G9O>~s[M&֭[nn.DLQR{kZa{Fq4Ml`Nt:m6[ii)搐LVRRRZZ :JP(@Y,^ϲN >11Q&EEE#8GP<0#i___YZZV-7''G$z<80ϟ?wԨQE1˜ٽ{wVX5p@V[RRR\\y̙8rT^.\Xh ko駟v~\\Yd+Vߓ'Oׯft|ӧWX1bĈI&)n̙l h\~С~A&3f^|gl(&H~޽{ ]vM2rT*fWKfxaDkΚ5멧RT&iѾk֬1 4>}UbqBBn`& `ܸq7NOOע-Zdۯ\ҶmۘAM:u~~~FW^YjRdYVP,^Yf{J3((_jy|||.]:sLtF"H!NnWTbeYPvN'-- &wRR5D"vᾀ*h44L&cnjx48NՒ$rV\.H$ⴴ4Œ$!={nذaѢEz2LoFdd_~zǏ#VX1}ۅ5#,g޼y)))Jb=z̘1cƌILLl߾}aa\._t+W/_^^SN4C9r?}ɓ'wnKׯoٲ?۷oHHh|^lٲxe/^f\޶m[Q &۶m۵kW``ӧ_{5CY,7b T*gey睶m [avp8D"Q~~>A Ju,K``#z iӦeee}r'lԨŋgΜ)J8NaN:':u*q999Z7T*H$={iӶmۆH$NZzu O?KGzaN:m߾ "[liݺ̙3YMOODK.ݵkRZlYii>駟=ztȑ,ˊ{͚5ǽkZ?9wܴibbbVς 7o,J/_޴iSVknn~p8z1a„!C 5Lg֬YC Yp֭[7o޼cǎǏO6mb… f.X3%%ʕ+ӧO_`s=7}/))2eJhh|/_|͚5ǏٳdSe˖ 2dȑ?Ñ#Gt:e2І+W;vXϞ=KJJ4tBy򜜜g}vqqq#G/ǎ_oYYY &Lزe˞={h2e $ނ{Q*gϞ߿Ç_y> =mܸ1%%`0gΝgϞmݺuŰe5W_}uɟ9$$d֭}Q^x_uо}ӧO2dȐ!v}ذaÇh4<#GTգF:zhn,BX~}|||j?k~!L{qƎ;V,ĝN'MdZ޽{ļ[+W_^{5qF9sLBBBjjjVVV޽F,^:--y1󾾾KNN7nil޽_~˗vuVp6bĈQF :"~~~KJJl` p8qhz>997ހ҄ L&ŋR)Mׯ_G<of޼y;v@EFF*J\|9;X>|c^{˗âUV۷޽;MرcϟݤI#Fq>fnz…Fq֭b8NV]ԩS|IÆ Y?$Ldɒ+W I6m};vX,ׯ9sرc}:wl4h_Z ʫ¥IHӗ/_VT-oΝxܹs͟?_Vd2___Juҥw݁^~e??!CDEE8p@./K.5kVΝ6mZRRbZǏ8vX!bbYdI``ql6,7n .]W_-^~2eʹsXmԨQzzzYYY%`dɒ%ڵkӦ`3g/2m40Ik׮q7S.oݺڵk_}հa` nݺ&Mެ,qիW.\oݺƍ.]4h? Ν`=P%fS0\V\VN`"h4 S9al6j} v9cL&353/ֿŋ7j^2 l˗d2 TT*xL&{ꩧv*\ҹsQF5jH0큝A&A9jaIx-[|'J6j<(}7l… 1wS* :0gsfl%I4X,6 Uj큭`pLzlٳGy5jT>YMJJڵ`8_} .x;](L %%k׮**..nɰky $IvlӧSSSNP(d2م 6mZXX'lذh4Z,%+FY^0O<tfafZ/]O@F- WBBڵkwȑ#Æ {wׯ?cƌnݺ]~4LK-Z8`Gh4RoFÆ ].h8q$I~03=Ϸ~;bFSZZƎ[\\ ]0Lrr'L0t}}`s\߸qӧ_xΝ;4O?ɓqqq0TBBB8s8qӧOb-` 6jWP|g_|ř3gr9EQ&MOg̘1zh}Ed27lPV'''T*ɤ}M./X`׮]?pH :4}СÇT*ݥKlr}y~Æ Zx  Ǐyo߾7W^'O8p 0EEEŰ?:uj֬YFqժU'NhժFO~׌nݺ,nw@@s=7cƌ輼cJRDYYYJh4 4MeeeӧO5͝:uN 3f̴i{ѳgOٳe2پ}Zj{kBpϜ9SחJ7|s޼yYYYdԨQ111>v/""""##FcV88qŋwѼy^xA}g{ pif׮]%%%rh4L&CCC###NZnܸqff}ч Z%l~ǍjO:5q;N0{޽SNtK,aRݶm[M$ݻ'&&vvt:o߾m۶Lgy&<<|ɒ%;vj駟bぅɓ'aS$??fH:n̘1B5jBիO=l=@o۶m%%%Z̙3z~Сl;r`qJR͖[TT4jԨ}ZVV{_|jEQԵkܹsolu0-\jO?]^Ç,۷o_iMAAXxr__+W_NN @%''<ߤIUVV V,N/͛7rHuFcqqn!!!}݋/N{1v>((h޽ "!!6`[TTTXX+Xpu?BKJJ@Gm۶=j n7n0\.~;,m6ۺu^~e+_~0a8kzꅆ MO@bfyyyYYY,,¦,ZmQQZtZݟyP( """JKK333cbbJ+@j4u9aÆvo/%%%駟d2٘1c +77w޽&L(,,G^ضђbX:ԣGA!j5y`4!o\.+l{d@@m/b̘1jZP!i^ VۤIofҤI=y x_A;w믿^}{u0H, WWNNNQQQpppDD7%233BCC;((Y%33e h4HƀX 3'O矯:ׯ_x<[޻w3gL"88!yLzVZ5od2>Jf“P(ڶm k%t:bq֭IݻJ%m,K޽h&, g6}Pƍäp@ׯ+m۶w>A5jv!ԢE n jQ~7Fchhqy|饗FVr8$K$Px29s\7x<32&''q\Fhd-zL|N3&&QF"88:966Vp7=vGEEFYրp0 >>>!ay/((tzGxxxLL Lh-}:D;ÑS ?eWBh. 1AƇD1 I`WG- 1ppPPBއ]Ǔ{BoS9Woeo82 bۣ!棜П nA.}4K,C{ hpc; G0q-oV|-0QApؗY!<}&"wBJ&U,ƅ>ГD X Ps y@HHkXY^=өP(vW)!!!CVk4}Ԗa5 ja'_KxzM󲱖a#%ugC- ѷdN'dT-<|PۚngSκZw/GBlyoIxQNp!GUykD;wrEM :tR޳gBhCdZ/8p6[X!M׶JsE8Գlzv8֭uAp޷opպi&Љ^p0`%~X\XXC`KM K.Z#G#hOvvvLL!VM7jGX{m/^8q$@,9۶miڴ^X,&MzxG!qP~~~\\\AA4iwZ O?իWQ9N t:mo49tG,C-}\VCž@m^oWWR)JȷS0qŠXMOh4rl6z yτoQ]ȑY?[m^9~*(R1zK>"'w A- {:2@73=U{䣛\U);~ DL/Bkrt 9zr%[ T2"yBVS"@ΦetXC|4񾕐Ale!PQ,WH>qF7 CP^!y ^nW]ޣB^ApHV wU'n7 R4<<\ 4>MP RTTz ^VVW533v/Ǖ<FcIIŨ7z<C~v - &___DxcjE"鄬fht8(Ŝ].%xp!"R1GEE h4z<V yj{U H$k a@׏7ȑ#P]&|xLL̶mT*UϞ=E"э7?իW#GKqiպjժZqIDAT|eeeJg ݼy_BBM;v8qDpp𫯾z94fxTvfeΚ5k<Ν;;wܭ[Ν;k4 l޼9..'O5XR&WnѢ`طo_BBB׮];t?k,gy槟~2LΝ/]pxW^ݱcܣGѣk׮oO> v_|1p}AwWf;wlf͚111 QQQEEEW^]jQ۵kfdd9rDP(22r߾}SL폻0ߵkkIG W Iƍ;s7n\ii)D"kz|}asnwddy`O,ahѢ>uPz!0LxxL&,˪jV+r#GN>=rH(ԐݰaC(W\`REtII c 8~H$UaNNԨzL]; gt^u(+ լY_~%&&uX,>}믿{C پ}D"ҥ x]t:ݲeˊcccoܸ>|8777##cРAԀ_|gnݪV͛BRjРA"`0TG>~`|}yv3f՛9s`rǯX6o ``xwջw:F.kԨQ/tMJJzkp8:w\PPpڵ%KAioڥK}4<k׮zQF#u8={,--YdIqq1xr[,'xb dz^ux~߿l.++[xqqq1ıB1꧟~VG76mzٿ꯺LvySRR]b cǎ2 -jNUEC Z=zhazYHHHQ[Np Op-j6A=,;rv p81)m6H7ڴi~~9r,((0B$IV<:BovPb IݻwGZ@&,˦7ށ]]IU\TBθr^EUd,w\ww*.w? TQWRhSB8تHg$<_U-8Lx_Qpa$ Grg{G~ V͊{K x'U{qo1˫~jHwU#<`.P[(N P"H$-8L{=#JkM -P ^\,nJ3N ~mv̙]6W!p=0#Q="l6>$)X!-҃ 2y@F$GD"!I( # 5|F7NP%;/82AY`@Nൻ3%nCom[U'(0{;Pw)>)`ÐZd&fAy[`R6rl6A|p}ϡn~l!DӴN8j nwYYUjYv6 ,!q^Z!r RT*KEJ4@-zTj= 1-U]!O?=eʔRLVPPlXXwŷY(Pϙ3g ܽ J! EQǏ/++kٲe- BݺuSՇZI ._ E_"r:taxEPLLLÆ !GbbBѣb9rB(00sǏezInZ޽^?~8B(44Cׯ_OLLD5nܸe˖Oήe?.H:w ~Ǐ-ZhٲebbbAABk׮ZСCt ` QPBӅoj10`; ʵh 9|![m&Mzꩌ nw6m:wl4njCA ٸq圏 ~PPмyfΜ ֱc[/"ƍ'}Y{܁֭[X2B_d! / """LQرcFcN:u$5|܁~9r$^Ꮏn;..o߾2lzW^ 6۷^9rdpp06c n$ɨQG z<|LpkѢE׮]ƌ# Ͳ /k;yxгdM{Wԧz>77Bj1ੜ Ȁf`,$%%j6j(??}H$vJIIY`1njii}]$B/(((… B 4XbEHHȄ i9*Ν;pž={ _Bs[.]7h XwAZX?0CEFF~׭[СӧjÇÃ].j=|pΝ}}} #{knF# _n66lX\\|С޽{KҘC]tiͪ1Z l׮CB?$t:h[^徿06*))5_Pm@A1a1r<ķl0-5JRa7o͚5Zkܸի`3s:5*iӦC| dd Bɢ^Ƒ#G,{aD{nPEEEہDU/<, df|C*LNpEaA`p:"f A"8}mۜNga4 "IRpfa}a) r,ؽh4nݺn֬ya"ԙ3jp7ntR5᎓7:l<<߿xBgϞݶmj-@\*nT* b5ҽ#_rʽ_vr MZv̙ X_B$IMQ==$IįR> P_xBUBX\+{$I<;DGGâݼB)a&PLB+0LnzXt+Fӷo]vqƓ&M.Z3Jə!d{0 3~PG 1y 9YpK/IpB06d/2W )Šg >۷;wTTo/qԩӧO/]ի񇏏֭[wp8~̟?Pײ!.KY.YdΝn{ǎ}/V\>1c,YծΆϟȑ#gΜ*ʵkΛ7oРAVr8vZdϦMjM?:mڴy;]v]v]z5A7|qѣGO3O?={,F$I"H?3p[VJ~@@~s+.</S \nV}g0Tυ@UѣּPXX̙3у*QƍsݙONLLR999eeet|+W?<11qʕ+ .]K/~͛[~ד-Zlٲ'?h4nڴ饗^1cƩS/^j4-[v̙3g߿yH6~>ܶmٳ駟޷o_y3gWX1zhnjxbx<]t9uԵk׺tR\\ v^o b1%%%9996l0ō׋ m{κߑ? a͈ܵ72WŅnNS]$ߟTʉ_g?=[v3 𡊊(jΜ9%&&Bѫ7&&&n޼y׮]=ܡCۗmrss?mۊ9s,G朜_~sIHHh޼JڴiSJJJYY͛s_{wxU#pɰVZ7S\^Ο?#z $I^|m*dtF rss/_|ԩ .>}ٳW^MKKXkT_u.Wߠ\Q1Ap U*U'Vm׮~- pCoM6 1oذK5o<88{~s@7 0`ny-iW]t*Oڷohn~( ŝ;wF9»vz9L֩SAwPLq˿ޒo-r۽>{>=e HBz 1/z#pE" #`*y 1T "SϜ{}|f/vf&aR{Gr]~]YzV<g<0 L,;SL&_G?ѝwyÑ?EqP] 0"bZͧ$jfi`gFP8*.KJq[' /z{v8v˓"yBR/,jЌ^vonc^n{DwQTN?g<ǷoaHx_Wnzի>l^=jzt_f;|ɗ^zӟߩj]v{>Cl;;~?Û晙7M/zыַ .`׮]OR~СC;sfH}Ƒ2xħBYTkKnFn=_n޶mK_һG!Nc N^/a"r`:D hIɸi}}Ry}>_s:FfyL&Nu.bB {^:vu8 gy&g\pXտ15'pҍF'm4UcW<I}Ya<|cY.[֖-[h%D1&O7(Pje9d2:t(zh4g?+Phcccǎ,+F㬉`@/K\.7MjjN穧JCA(Jz}vv6 :~8NZDG$!Q`cmq( dn>xjL^_[[ BDL"IJL&cǒ%Vd3;)R^2j4?)7 )#N <N&G0bKLN5 7e\f XvbZT*`Z- eY)kRv)TLE|>_2t:fsvvRgw:C(t:rVptH$BP@@V$x*+h `k6B=S X?sb  C8gXh6t:`P(h@ ݬT*>Va9% \rTt\lvy=+28o!wQ`aY'MD"tm63Rz` [`/--r9)ÑdC\,SVV+|# ! w>*xN,Jrh4z˛Ngzz˨`}*rݠ^/9w\&ɦl6ݻL*L&].6OSNg!v:JA4r AI&4ق\.jT*hg`p<ONXj=rdQG)cZ766oj+9Fld2;Ƹ=X"XLuOM6Ċd 0DnU*ߏq=00&(X"z\.{^ۍPݶlXRc1Y>c|hX 6?kDh Ú 6;"t:χ{& BB#kXjr٨@לN'z^h4'K%zx<| vzp8C "ylXr$RR`G 8|>_.cnr`jjijf& nPd28zS]TZj*ll[FjPFz A t06AŢ 䯑HrQ\YY BVnbl6K|C> N#v8Rp8r^J%d0~^cqxNcm68bq~)nFDP(X,h4Ţa$ @gZV'dM 7R؏D"wAVJB3|;Ζ-[t]j *+l<0"Z6??O8xD!%$TN A\^\\S}>_ѠVAg`=_& I I) bzH$J=w`&@%cUjlbףD*^t*h jiԖ B.D"U*L&40ʖo^ .;7~=( |~~~Ejz<vtbt ' ;8X SK&1jݮV?V+(Vօֹ?>6K^Nm63ȝ`BiKݎC",g䇫DFH npKxуqzzHIɪ̑gY2`0877p8&zN NtB=@)I`B 8X( ܄ABŀl6&*y"ZD% CuiQ;_Ύ3j~hL?~39Dx vIiAh1 /:wfYjJ T_)DQPYX( 2 bZ9 bf+@St:͙ᥥ%pJ.<Ŋt *%”c8&iv x9 _bŜN3)KT2cx2c8< | Vl8Feӹh4!{^3% TDP(TV v;Cbl =0~V4YAJ 鄮؈d29==M p.Z333&0.(+[ l2J%0e"_&6w}}‰|)GXb@6R׈*H0@0: "m&|C^*l7L97˜iB[84Di_ ԖebdҪ* .DI&{8bS .$E: jd)kZ-^wss|.8O޾?F!I~Y&{ߢo< s RU ̷lz=7_;j x(tBAEnaa!JBׅ@ѕt$T*[bv qXx<& .,bƚhd˥fSr p؁LB>zaA@z4ۘnZa9M&fbs6 > NX,$؀$ZB5LT*H8\.G`KM`N%;Hlll(τ_جlD"zbz;Pc$S`B g.)% M q]lT*D| UJH$v3*(q|XzQ~ǐ r0mnnFQr#l6 Q߉j2J333|d gcS6 #4MpMD\E\& , 5σa26nl$IbYJf2_ pΝT~'[ZD-0t:NZ%$jۜRV͎6dFFF L6M^_/dSS<[ Қ(>}#k&Ʊ$9hjl! {-ꮮbPٱ\N7U$޾^Ӯlj#h 4[ZZk)26JH"K:;&ANOxU,(LXnw^oNMJD.JpLðn40;QD0n$t7E`08gf#Eӆ1 Ňj5d2 ¾jdDqP.\5\. up8$𣕺L&#&^ܔIl6[:@Ռ5^#- *Db0M&S"vIFYX=$w"bO BfGxhcc0-[P$>~?UO`p8L" MbhwH.L&҈pH;7mSHJ%B ~:| Rf7+ QiV X)q 9*  Ɣ~պ}v%T >SA/R9|lL~6zN?f ϣ TJ]']̉1끹ذTYun5 E:VYy^Q?ie6}Jv|Odt>16 cmmh4b,NOOSI.;y3a6G#1  .p~ٽ{¼?0qC,#vw`0X^^ rzip| o}޻w{\.iy! ιR!+ [nT*jv6n4 K,FZh@:=vRinn)SA(R|V1 y kt\ό(Nh4 B絥XJ%j6sպ 76v' ݻ6M.JL$u%JKRܹ&%<@ 0E 阸Z`$۴L$rb.o26770!?h B\r `$b2-.χ|I\y^{>|s=E/z; .@!)c[w#S*Kh~ݻwo<W ]q:Ŀv}fff8>noa;NJbQ9OFшhd~3q:x&X,rD4xDv 2?XI"h"6Vb6ٰ\xq 8vm|>n+`@0.%ӫE '=ollHlK4JD\Vժ݊,`-w`Ȍ)8㘧bYzj+R* ӤYlo'ɠÖ/*"apWxe!sFbhv!ȃiJsd35HQfc]- ,D* l.X :fg8.c#@vRl6ہhb뮻R?S}1o}[O} $e*n?Z-=?gnyɐpC׿oOjPo[nbٟ;|+,r*387ͯ{jgwht_%ƐnJRXvM h3G777+ʎ;,VE=hPbx1XЃ@sy@R P}@mF*cM1[dv< 0ñtͦz^Q, v8<2&{<\.GOTө`3p+q'gAgV7 1MnӑX,#V=wZlT'܃'A̚ӋD"Xh45d~Ά?" vW*^B\.)(cj8d@SH2\\\ԠrQꃐ(HFl6UL LG"""tFi>].i(JP(x^ H1j%x(|677:aJ A2<(?+l:UBO /A܉U:<(k9t֭[NCS޿mϐeI=iB򄼊G@hE 8H^Dn"cPc)F4nv\Ƹ#_1daF#p84זJĪN%`l;vPKCF3 oT*".ֵnVh}}΃7S*CTZDXO"߿k׮ZF$O-rξ»Tfgg1LGr$4 PK*XIv[~HN;I ^GgҘ`T6^wvvVRRǃZ.'tLNO9r88p`˖-|phZ...Q(2r70x|zzZ׾6߰ys^җ䍻 loogS>ɟY[ádj6zkT"h{_oXk;o??\\\,˿i|ˤ袋ꪷgqN#gV뮸 }';9X046w01`2PJU|& >B!pRc04|b1O $gtWGqD" X,F‹#ƪ2r- X~4Z%LUZp8CN<&0 Ibt+Ԍ4B*XR}OWARέJȋb*J&)2xREd5cCxR9x`"tvvvccN3tԝ0+ `w"p ]if:͕mmX|Len=q7/Å8 #&(H*`F C1@fٱ`@;])m۶td (鬯a`\i<aRMEr:Qۉf't'd2l+%q0 Q&<jqOX k'2 'Œ^){U :x`0 䜩Cb!$x O%Jñ\pN@ȣѨX,8&"ׂؒ FDw78SvJ~%vext:=77N2, 1HY4J4vDɞY$[? OfǛz˕Jg'A(CIOR-O=Çt:_BpiL*\`z&Fcg>QHh<|Qc&h4ڱcȇ1!tN9唳:Y1?Bjzs4i8ZȢfX8-5_X H )p8U44Pf)TXD^\\Sb)\AnȢ !a! zQT|m#z@IE`prg*B4211@gAg4}y)R#r4;ЛMh(|" T0 .rOЍ+3^P(55M&ղSG>B7P1E8rqqVMOOE Z@qȦuDjR-KZ <2~ϙTh4J|8gՊ<ۄ?u[MaccK D!¹ J恆9wvonnl6\ nBg,E}es!Z%gŏ=GGâ<9~VC]6W[pE "D=4$(;5gZO @Rԍh C3J!*8lp?a\Q'ۨVP(bBA ޱh>m׀]j? D`Fh4!B_(@xl|0Sjt<== IHGDEzO/ǝvmDG/+%eTpz01n;&]p!.0IsEDfp6b25ܟ O/w84iShdH@vBX,t:MRDejWű1GR\28bX!~/:l'ceo#ZDY+Mԝ2"r6ݲe 6uy4tQEf٩)F%l gvvZ* OVE8L VWW5UbHNbb0fKe)RX8ITt4& }; zq4kj5-^o4n6`˸{BSt  DG >O ~pCЉ!'K't" }y) `psscpWVVT ضm׹dQ7I*A4-WCԈ])$\> *e8"FGah8@9via'd˘yB$P0d3Tl "H'h)xBx~~'Od,LюB@G'|>Z("~6>k?kmZxHS䝤 eHCX!2YyȟXEE'qWE|B "ѽI'2#{"·o3Qѕyy<6=#~gLFX,58 ߏbQ݆cQҏNAt :D]zS8p5h# Ec;Ё(C^`n^Onv,x`􋠙CRz4:R*'E6cM}aL%DW@$rȋDSE"?h;#Hޣ/~Qo!"?@$L_-IOY,f}so>cHBM

8sbqx^*"Nw_)3a\p*@-@lTf0eʌL]SD!Vu}\SN9>6<lXUpUD(r9SN9DV6 * npzNc[ǣAA,f쬬pHǠ&"Q )X茽^onn `zA|<,4P $/v=;;K؎}G~jDD"?Da|0`%{KA <29&"T+&]_L'u]!t:l'x#ј$ri1H0mSAS>жd'4Ĕd!a4gFQoZwyy\X^Lxf[\\p90R?0x H$mA4~;rSSS|^}X`z愱x_ZZhQFi2-RJ\* 4 xa)\h4 <+uy:H)R)\2s p)_FewqǶm}v58Ҍsd]wv+++'yߪ42w"sewޝJȡc&hP(^7 Ap.'k3וJI"HDafU*U*6u˖-l-iF!Tw ۀP#iFR$<Z&^IDx~?H`ztX+ h\5bj dA@{^Gh؍--ЉU77Lv>$En2x 4'F99W29x,'Pb@ !"nթfY|80V/`0w c%a:)otKc+ tJe-2Et+a'ɤ)'8x<`|Hq~ccCd0 wQP>mFO 0+" 8p&jPJJf9Ͳy@aBFLWഘG^EiM b̖! KQ,; f?\,K"2HWU"0. ENyPbK??! P?13r0BTzu[wX 5:6p8|衇fҒVFcvvvvvhQ}xTvPhjj*L"9sj$dBKS>#IE̚(8uKd/+6a CH 1Ii4`Չn;˴U+Ӊ?rFSmݺ$دd2׭Vs6]œb fs~~>5Ǝ\.+KOY6&d!x<iHx,,rnh45"@@&z,l;R tL`[l @ |>OD uLRIӤS{ 83rh4: jS&@h&M1V>7&do~F1$c>,Q! rzzNHX P`4ZC!SS%>T*+++AwI4(zx+VA9h4*HLMM{JHTB &?yxn>TzUH5tXBd18xwx'"^dWJP"* k>'wDݱOH[<D- \.ɚ~XW^yeG?4(=_uۘ@ }j]uUpՇ\ڤvtМR Hj0d2!1Z-lY8&O&~?HK?i3E "z<\"PDl\XX6|qh$OÎrVWW8OE].z/|t f^4qm۶ CZ|0t:]#$K߿ uY8?D\pl0dFxT,c,r| /.Pm%{'#(c ֩0Ҙn _ Y:-.Mf(- NvGUhlB Q3d2SSSL&=R9*Q/A:z[n5UU8|TPǘk%!1fۿBm:X,.,,p[1g2&gv3Gsx<,@?ZLJ[D"uҌD,YFI$36"S_D>9v O{_}k_e]9z׿^,7X [ zxt1ew2k /*Hۿ@*3 yv3 m5)p)0_TT$M ɩWkEr\.o;L&!QE2$:$۶mQPIdBp8`.OFC: J| v 15FVl6En8u]x5L7P-q [S1`paqK nE"altF2$[ :]]]I2&P)6ӶTH h ꀁƃ$X,x\xFXs`4dXpZ*UBh hWu8Oaa q,?6hK4r:B'~2!"j#<dhr9cg1ŏיb/&gff!GmHz_ rH/XGGñi7ȕ",R94'i0Fioos9Tاßy7p!cy30=0NdRȠW(7BZ@W@=,7H&:5T*5==N-tztWCJT&A""4E=vp8j1x/9;5<)d:AXRBuydU:`00mQ㩪DRd2[K1d4I0 u UKFj&X +CD:777΁@)gH~r`Bh¦7=24'MAfR,,,ȸʚL&y #rDW>%ZJ 1+ߏїOfwKAaLJ0!ab^o* JU‚BDZ*#lZ+++Hdjj1R".Qxq:x)B[%Uepְ#xOwmm!DR(?OIADzAMs0〭jCAWц%$M#3bA(IK̮&FQB,V 霚򯯻ƒgjV&T(x| Vr[ &l6٪۽bz1 `к$Ʉi2JOLQ{Tq,?~/&>HR~˖-lpúQ6L&fKRyetL&XJ $na 0멧hxY:`8-HE$+2Ysyp"-H ?zzz /[L*(ΐZR^w\kkk4 X,F;(HR B##1Ț. @ȣ0"6+ɠfgg)EU! vdJrHl=nMp *577u<3Pp _2-~g`xK3RZc/1$쨽!3XL Nvs'18 <4I`p Ff0!B=A:d2vC tX=eHLp0@D3K|0`eQ19΢j3~VƤ5_&0G355p8L&`pzzh "TA%ĥ-TU$زe{LtV(ȳyXD$#B$jZ#<' Y^d2' f4Pp8`˦f7Z>Oe1͗R"\&rMdX}e *)\)$RizzzvvaJ_Z,uN@X':cQL`j5bJ,x<:b!3x۹s' ۉD4.#&RjP"$e0Ër_ `."<Ffi4u:]iEt.P $pZT#0D.ollX,h CzڷZ o:pJ˦p`0 aj2Fb,4-{5iG.*>h"P7I)1/B%Sghv֭[)ƂO* ǣ0amWIp6LbTdΝ8!~Yp.Md2i6<0vG!D8TbyuV&9[l6g2O>YGHl6j(o?Yt:}UWqW]u@_pX> mYR,H$ FD yeVj4U@@EɡaYRQ$c`C2$QM R"$TZfggbR |;ml;T i:Dj&Z-haokOt:@a;fK0l&pΝR1! 3!"&Ѵ  W` !FA(B@\Kx! RϗZ"pDЂ41^sVx<ZPFPu(h)34I!PfYR qrz L&vQDE R@0ef2tn .v9ІPI93qbiBL66,2r~:. qYX`K5e xd27j·ĒpQ`WN&2Lq8tСȅT*vcR#R txa):Ͷ NL|(ٳr{Ax4FϪ6(&ImP':l6Kiف0D#Pi"cw62OMMzfY6777q&qKy ƃYY9fA!8;)a{pCaqJ?ŀ60 SڡoGD,TZ]]]]^^憣@ N>'ŎKA `оG]Nx0Nz!1v74~2ll6Kl~I-|\(2 лDy<%_D(~n766i履?ǰl.20kl7=h鳳4QTGyWCۈ*d̯c*lfJu2F۷ojj hZ>SE}aRѱJ`He U f*&"t3!3 `ȕhB!V#aK0"?j9GG"iʾxG*| H=r(Hx&{1y%oaV3 n!XU=B-4"@U==33FD7Uj`0lٲAhUo߾};\i“3$(ƩJ?*~mm}nnT9#P ? ^:)> 5m0d) Ø"S>`&@ vŖmOhJll,\89B3wD.r4% T*t\C@$`{< tڸlBƔN GxaanZu`A0 RCۅą>식` x&bcjK lJk$eΝ$ e3r8bvo߾a*""??}vءPS @c`|+NAO 6;;Kh [D@J\#ϗJ8P&*ap(l3PaP(D ]Y6?[#iDU~mGӶZm"d}GѱE'Rfv ?~E@Ga>qG\R-k>X;x~;1==|ss0QOs4_C[[[8+ aOC,"B#ŦPFDRr.Q !'^9ݔ"HHY*@ )>@經c#ϯ2m2F0'c ^}x8VMQof0B DᑖW[6t %X,߷o_(o;THwW67lx WG"0 K tN㊈ R6{]qށ@bUkkk"ed1#=}L~ #,pt:)*0U=f ϤVirG @^TM@%=dSSS{!XYY8$f$1(r#ǃ(Jq<nb#[DPV@} q8+++P6sAQ|ǢTPnXOЍz"Cۂ &pħ >v.Ȧ Dꑆ>%vcLTENi"r[oww}b9BZR"?H9/~衇vڥek+__:u]xæCN `;ɈMq*эLߟUTeX>[nf~R9dPW] dPwKDrK̽^occR|ɰyIQxo|(Kbljy.J8"vQXq'hG DUa6fsaa!nB!X #"B+Z v8:x pB|I'PEmff8=C%*iٗ2Pr4@)D f2a0[,Iwplp*P!ݿUTΩcLc&bzT R9(֍!OGzOo'O_<HE$>,޽{a0O_ۧX5^WPÛ;3vq<oh׮]WMF\[VR͒CTYiDc, TΫI ^ LTDʝʊ\y7jFOuF">8DYdHG"=@uVa?ooz00ߔyGci~cHrʄze]Qæ!a#1"B kNn;h{aF1%e> Y'-T8 4` ޽{CMOO\:HLc!BX](HW\.g1r:R!W;J|>O]QDhć&X,=#1~VV ;xv0B=| lqqӆ2={0y8>m|y\,W%)x>$4 ~<8% ]__d Ddc*MOO{!f1;Cn p8FDPxh WU)" &e2Ț,ZJ<&xåH 5oX]* E6E A0h:,J>x0:,M 3t.,,PTk4sssH.G"5E9}4b1< nR0l%m4L&<hpT > 呾d2 Q~C>j_yE"g[Eu,a>"9~FoȄ?D~>RxMeL˂$@@p8LLJMȏxN.o  LGbx<>;;;A\KC>pEdccJ/xa ٥qPh4JLAK'q tZ f,V hxAw)/ó|``Hb^)`r di|4i[Dњ04:\2iN#<NüQq}>P/E\"eH_%9 e;Dy,_ ux0}<?He1[(N$^x~vH-9Ad%fyzzZ 0,#<]wѶetbAJ1+XL BJ==Il6c"(:fYGк̌*ܟ̀0ZEmll%>)rۭnU*h!e#c8h*+e\;R撖d"5Q=Ԉnb녹D⥣QWsx K&4 H$`۱HX#666N*FjmmsΡ?Zʰ3iP%MReia1p"iJo<O╬^tid4Gخ¯1c)ՠ*"?gwKӑHN3'PHq w*f9L>!PZ01* pPR< Heu U16G"aSD6D.)WDUo<1& rqRF?6_D(h#u"hϔjH|-|p%n(m˃`HAIhxfff(@3-*HX?| ~l=;'t4 3`0==mZnX dBajjv0 (:t9 28b͆0 t|f$2L@l66fXT贼ɘZO~x|y"sss@d-pZt8Fa~-[N!L.J*JNIeJ zE2HDYfkvlڏ;СC*1ԥ97 ЖSJJD*IYTp&bV+ CYGJ7e3 yd$I$",톡. YAى a5;DqDK$Eԃ/#`1@@@M4qr?DėE"&f@>+I$=Ч?髯{tз袋N>dGጃ*B Q }Y79o<Ë0 I8;B @ߊCW0  ~?Zg?ټsNAI*hDq]hy( Ø jGU~f{\,R)/:=}zCRԞ-J$:@0DdyyCIfBjii U34jڐIiEU ֭[Q@ Lc6 @S"N&5A)e:80 \Q 1Y+RuyZI#~$DXvI5(9erq<1ci!ԲTYD\Fl6٬.6ɤ*-ۦƋ(22&"R,DUTڳg‚DNH [><սZ먊t D_l.A)@t;;f% t:l6Sf;th?T^Z[Ig@$ kC eEBh5Đ(.ypz DH'F91/Y^0tQ+`>N= 5V AZ( |r9 DIIa>acdj<8u*VN@*x~ S_Gr wlCd@-ہGG HZI D`7ѬK'IPqah1{ !j6|9Xm۶tIk8&Gu'D"Id$ 㻎׽ufpa-EJ-|3K/1 K.9??D|3~,L+i4hk#Q ߿fPk!U'\bAU> :(z`(d^ qy-6!SA7[B`V2gL7jU3 811+tI۹-`4m3wy1iFQFѨ-[u->CX1hT'hXcT=fv@3/8;nKg/|ټ814rT*WmcE)^4y۠2%489& )4,)A{a-po0qLA{ >v;D~FpX"=,D@+ ʘ8OVAi "L2Gl4#F83$(Z֍ ZC:R:!XEQQ(J,6Reh˺[]]egEk7 |F#"?զ?$3{DD# ^AE|"#Pc7J[sFfj?`v( M}ssr]ve]v>c(w⟵FQ,w(\=J/PhZB 3 vzu#ev0`+pHd}} / a I+iٶmۆ"|俨|IdM,d?c֜1ĝ*G?޳ZX MogǓQ&{8>MKA骪̷n  9??OCDhmt`,A+ h2i F0zoP!I퉘CCFd2YVVV]>u]z!`Y|wl PL&C~z[lQd-tFcst.'\D"h41X`ǽ^/hX"PVPl \D|HK+QfJo"ވ B;ͪҖN?lV@Ϸ`D '2LF[ՎK߂c7CCggg0ßc T= bTD15z卍 JV\ W"!n/..N#.()GqE`3x 2EL0 Xg(I#&%t f"% òA;n|@K&u*LX$¿ut4'-X@'`*jGn'J C*>oyyЉB7"2h P9m$(0@؄v4 1 )&z,Q!"Y| M^S*NVb쨲ɸy L9 Xv%R)sLl y>t:Lpp$ d2IeZ3SMEKF{^>*=ġv=55 +"KF\LwRD$*FNV+x<̵&t@tƝN35g 7; H2gR.QB.1|0U-'haŘvx<~^Ql42zΡG?m۴^/a6B+Ϛz,1vx\8'ؔgYdil`uVD]G"OnGuqccV6&b1pq{žʸI [X 5HAmx ϺW T s% %(PQ02"3g, =}{ި,MRNg" T"9H>j \0NxR:_nTky h'*5dhLpÙIXF:C*@.~:AS}3>.I?\uUW\qE6e&w]K^ *ty*.뤓Nb*^*B(1"B&"d) | L'FޝkB9vX\.$ ʌ݌ɂIxD2xhJ:g~-Fʭ6bȋ??N;4TI 5^0$'L^b@&*<@RD$`5fsyy-*Яt)&0u,T呌ԂMKSh]C[;2jz<B{t di " F0;h<d Tg+1Qݎ&mDE<))GC!䌲 e,-<7 gRe]`dk;u'1~MMcPwT*t:HPo aОbI7he^.T -2v$Œ>ސW굯}-y[[?a͊8?<_ÓaxPIr߾}nWJ B! ~}"ڣDBg6ߏaM"0`Z-H@?!lDCb\Bj2n;2 ~HjP#"+Z-%jN?tT*vVlJQnP&D h >xPE(hOCb<oZ%^+2tAn߶m&NR)xDvF eC5puu8FjOz puv޽wWo뮻qGɝ#h *"< ¢FYi󧍑 tC0d|n䊈x2 ۶mt:D~=f U%X+vp8>_fkv:H6rY!aE2TmT0u:9t˲$n[t:v iཀྵ<&;1) a '8@4"i6W KI[$\.G1T]:w8mCeBd/M^$^`Y(e2Y,HZ@(_@ab:( 70Fkj q s1T;XTvLd2۷onnτ'.ƝIx3ώAz,ce2 `*79% Fn2Ċx=q*'"DTv; nnn4Hz`\.*<5zu,]1L=ח%򓟼/Fzx>|F2BL&.H$81-鐱{8A0<^1xCX"$CD2A:+*c`d6W;OT^ zp 5M`"h!EMm9IKgFg4ZH$\*hzL8^RƽR~V'|> 3ܡWCv" ߂5??]9L@[2S)p8FkÔ%0(fzff:>M L-N'Qa4.}X؇݋H.C @@"HӰK7C 2Cb%sm6?6U,40vJ?u=8cB+駟NE)-6HF)Q q^zDӭjTApCijo~~ѡDcOFbjEܜ| ЉrKPPXXXzxÿjs[njmok97r)/| i9Ώ=fe[ " #|dL1?AŁq⊊wHR">?#PnL 1EEO" 1/Zeaq O(Vp8nᰇaX,#((fLetRVAcIwO*"X1B .nw*LT(kC*Pt.!vЈ?55 0miѧG4=M^E0?5m$y9u‚1X)"@|N )}^ 7sRbP)* Őb VD`8/ʓ,8MKC"춹IC g?֭[- " :tJ`j\۷g2bu۷Y" gfV?. ;@YNTUi&$MNq-H@桴@(&VEuqN&^ozV,TxAa膊ښrҁ̠;m6=`ܜC+f9;;KDf#+v7eӀ]8P#U3TSHZPΥJ-(-LA( @{عiĀB! YJ&X2_̇ҩ9qb={p~$ʩ(P~smϞ=KKK.СCD9y+dx K1j ߿~^^YY 6El$P5@g J'5ʘFy%Xjuki{衇`БA&v⫩`ht:v3XmBtGڿ?Tp$UBb߿Yz>#֟}$'Lï">"re:@BGإ䭸eBD$S:t |@ ?#3Dċ jGD`>`BBI Iug9Z,n7gݶi["3F H4q+O) !|S]VpX}N9ib&)r-gϴMb<4_-2wOUj.518!|*sKGͨHvi44 GgrX5yR r4ef}sV,`\qPAyT>D*ɍw^G~1V{VI @+?g\FB?Y2&qԏDd=u: c8\6O&Op7Ña n0Do]&4: O&Ȝ'χ}T_Osv(p=R})/U{:K#ev%LޓɅMIT5y*e'oKFTPѫ87r]OӘeGG_cɭ_>j,?Ƙ@]G/i]WЄn%5">{\D CM/hE耸_>z]Jtr5cYFh$&Ssd25>GI㺫ß̵L^Q1ukf;r?ڊ=c|T j5s}G0!G|G7M]ƚpx?8OqAỦqO:t؂A;N=:?.pS&;LQh>4 $`Ck0afg("bOSCI7 1k ÈD"ny_ eTBw χHV7[,\l.CVp8hTD:N x׾/vݷ~{SO=?gϞ;5\vټ'lj s~M&|[:v7Zgyگ^W.z[~/~WWW )kyK_ $ Tw}_|wމRS޹s7Hf?p _|1<jzz?g}E2 _B<6ybU 0ykks8^x_W_g?bht0|[ junnOrݻs9{93Ь]__P4袋;?O?t-,,5A$A)^'F#;S=O>?{:^/ s=gnfh Qq0 /| ?/]`p4mپ/\{NqĆa<9\}OH$N9g]}՘<>%wL<MozӡC͎\saQϟy晫{9\|n//1;vla'Bx3!:mw}w:FYK.aGR7T*qzu]w>{jj{' ۿfooo￿X,uj~57MNgΝysfꫯ>So馭[/B@!'? Zj>O~}s'<DjeUlj9Fce4deDh hdвeREGVJ%pH$niqQ8 :RBs;Fn+S<g%,xT&Qf xuT`/g>3A6mΝt:0nonnp~ټuVFzeɴx**,b{"ʠ\ⰸK^q8qL=SO6 ]9h uV/t}0E2:։2 3#NjphPjՓ>r AɎ18tNP~FPa|LI;>.AS7D.D"5|s8q88FcC-NfDg䬕c6;B_O5\<}U_AZ_ɟ0Faw_Z~fRSO3Qw0s՚XlSrO'lj_`l oۏwq8q8w0*RXRmVN98N'xr-~gu8q8N'_ P(<϶t:X CdN'ljK:hj3L]ZZ:A9q8N'XώIENDB`gmfsk-0.7pre1/help/gmfsk/C/figures/note.png0000644000076400007640000000216410206176701014313 PNG  IHDRc;IDATxڍUAH#g~QKCJmmX36=^ E/7ň$Z=LփVX,[2,!uBU(kZacȩi6Csr giqE4]'F4 A<(alC-GIAwy}oo-V8<$HR˲("*ëABm|:+㣍9R2 %[&Kł(ppb: NM8ߘ-VTU}$I:X'Gzr|c٩k;l|jny'dJkݽMNgC\B KQ*Wǿ]_jZVB.KlɏѝD86ac!zt?Wt\.MӈfUxݦ_ދ.1CtTeYпgff#SDUA\."iUU 5os|ROڛ c,$If y*JB2#K_gR (gέO!u4Mt:i,a"ૅNIENDB`gmfsk-0.7pre1/help/gmfsk/C/figures/tip.png0000644000076400007640000000150310206176701014136 PNG  IHDR  4X IDATxڕk@ǟbt\h@i!.drKġK(w*NlPn"qƖpPUY!3y@2`)Xv%\..rlRt@X]]K1`Yu`RF>!Fu]V/9트}]5I9 ,]Ez|0f11F+Ku@:.) 8cREu9q32K`@Ӯ`c̲,Bd2B|;Q(RyC5MmˀErl@BτιN"?+,﫰XA@+G}Q5 ÛuU&wTW\PvoGD6mmm&hZp|||vvm1J#׮gOuCA!{ y'IENDB`gmfsk-0.7pre1/help/gmfsk/C/figures/warning.png0000644000076400007640000000131310206176701015006 PNG  IHDR䟨FIDATxڭV?hQRtCAC!hcR'189ں8X(Y- I:Nҩ9Q_i {B49sw w~{{z4dـԌ1BHV X^0TUU_V. ZJI)%&8焐Q](%_P(:ڲ,T&B,˺\.u0?u\*kOWqZ\mJ{phAW7 䜟r@H%{RD_j۶ !3cNM!Ķm?!,_7ayVADo+++JOѾ~q ;;;6c987c~Ag.}Pxu07DrЉaC B @tChR !*J%D<248>3=K祔݌_QrJ)srud--9N,!˲cD;rwlxl_CO)~YNEBKA^IENDB`gmfsk-0.7pre1/pixmaps/0000777000076400007640000000000010206176701010515 5gmfsk-0.7pre1/pixmaps/gnome-screenshot.png0000644000076400007640000000107507747325161014436 PNG  IHDRabKGDIDATx͒jݬkj( ً7oA<C"4oТe%m6-mLLM`;^l,Mp?70(UU@ Ph}9`xH<wl6r Wk6>̼|Hwc 1lNT5뺔cc+##ars g'y-nv!~'|X,u{Rު' 7nt0XYYaqqi6Z.. j^Px8aRi(AYAUhFX0 8R*mA| ՠVu]$H˲F4?i8G|`"E&ayyr$ 65+;x^ju+W199y*s(hv |).r:QIENDB`gmfsk-0.7pre1/pixmaps/mfsk.png0000644000076400007640000002424107266637722012123 PNG  IHDR]\BgAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).I IDATx/{\G[3@@@`@@A,`€ / 0!0`A@@\ߟj4zIӧOwu}׻'Iҟ$t~>FqO-(_* ~4z=[ ۘUl͘׃7o ;Z(P]ýyAk^0d wKxB88PغV(Ä)=>/]X]]8D x9a>:h.aО zߝ.=YNB'< BJdJSoI"*Ǹ}aܗ-}owݘp]o7x͘I9[D'YϋQJ,tUOv9m&U%I^.?ms׊o~:xʯKQُ4`S*R͑XRZhvN%"PID61hD]pݾߋ~!-~wN=-xA`=&GcE6B8u뺪\ tMfNtN[]}|Fwn"͘Bt2Z'nQ)m GEH: rA}vwyk&=LwvI{q{36>8h{ ]y:y 4nf˽o2f/`P/\p[Q^Y"F3Hfwp]_5\O@1\{pTPSK'ӗc_>$F &*/ ;`+Gz':Ep}"wŕ\SzkX+p$ |\f.+-s6(<馭ST"ؗOw̸O펭{WDQXcOk6\t'M1.҇QOK4]._y(({ Rn}/J*ǃ6p- 'hz-nӻpnl;bDv9[\TjH 7V/!\%# ]A hM,*Uj[2{!B)-`?;R*J/T㎟=N •~Re{IyVt?w? \9iO R7_ "­Aqz~8!*t4 LPŨ/tzek&ˏ q DYH"/]W7 \ ,A6X"fA8+@4qT;ӰoaVy=*.D %>^9#Tb@˕ BRwrAVtp.;miBE JE8l0ޥh3.XJD2bHpzeXF^ӭ{/ɔa!wvڅjAPJ-Fg6/5"{#\ Ԑ̋`55sF4G"?!A&J2[LxmdsVH`b* iNd^`G/ /ȿMTMG ; 0& Zq:>ak?W=i_޹ju!Trɀh}$0s'k 5bv υ=lG48PLG7pfFGJtMK{631Sfɶ $GĜ ,='_zX w(4!&`Ƞ iƑ);9sf)$1eQ*ڰDH!y!FT[9̡2)"|^/>ݘf|mH.U( sRJB 'tшo9_ظs)0jԉ48) s.8҃8onpXsgp}YZdӁ 0ӲhJ]npv1z/p_(!#xo/5-boJxJ`i3sddmjwwg҃Do\3>{Yyڐm3ܺPFݯY , [З#JHC5.FH<DSYK"bhm_?ANEѳ U6bflJץ,e8Rk q+-THj1u Y*BҎWBr|ʬ~_[.P2)TMx~p_L83 30~O'Fvi+TE0, J %d/W MǏjH꧔k֤鐠qJڣbun ~Uܝza8p3PNcnFELf49H}(a%mRu 3Txe0)4[ ZJ3*Su^n/E"Y0 3ՖZ}:pGBV2+S3ds.ƔDuRj]~+G;w(SM8. ՊK*̔)PSLqY$׷ 7f nP`vM$]¡$k @JHaSE/_!d^ ;}R+.K(h`eѸ(`GIu@V5H)-@z0" YPhk ju֤$ FϐI^OIд{n}&xw7-K\ÃJ{Tz|Vk jM8#4ʉF\AQ2}֫Oi.vIEYl(Jm -3 +-S1_èQӤEw@;9h^bMgVS^O0WI%M B#iLp\*t4PzbY. :rw082f#Fn2kLY)9;fO- S~T"_1(L#*O/*VS RW{;)JqD ꌍ R@~ dPlF3`%;էV6$;[HqJ8CACbY8>ܛM,6SQ ӍvK4R;U0 % H0F$8>{B)'rMyD0?,a5} ]#8JƦT;KõLs ,dN&}jݨu-hBpt1kAS KYٞar S'5N~ͤ8 }aqJ֟$M4JEԕK}֛` A!OJŶin#Mw/3}kKX{Tl+X?̦DP$2f4dZCf-LJ AF)6NYn0 ,Dz@$;LI9?*ă_*|ZҋA_(3$7oK?gS+Bs}cn|qdO//(stO6RNq6mvR5z7J zɃK3ԬYfҩ|(KML}E!A~մL@1FIn- K SM'QgԶ ~KX6 | \׍C 'eV>>dqvwGȚjKvbɥ*ln#ʀCl 0ibgpum6GD}=0\ ֧;,MR29><~p(R+ j2\ kS=Vӓmt" dMSC;økɪzb(TO}9yU:KTfLS}S|: U7a.Q=>%c YuSj,xYoFcm̍@EE7 EfIIwKT Yж@.}MOՎ ܣ6mZu*86RY H*]F̨9d>-##9ԗ%ӿ!-Mb@IUMP"0:V4=)YcYowČQ] &pFn;$kJiŔZJ Mtˑ Vlq<S[9j{thpn7&5g0~%C2Mn+muWxȠ/⩄S.cH٠ zQ =,J;W9z&hBշwf%#%Sg.YtTqI:3;p)UkX0eR%J; yИ׋DXMFIC^+"MU}LxǬfc v/iံx]ͯdQȃH=\u NQ[=˃`@:ݥ4sg*)KŵѾs)m}D)!g_SB0zt0B*N>5}:cfmO*(4~93j`#O.0t@=^c KeOubjP=e v!I] %Q)?(:hg7 f%y Om+M:-v 3~arov~S'3 ىw3m)tpdRFV'T . XR/6oܟJ^TwC,v*ooJnpߔ„'\'-fZp0H}G8<`Po1ɕ<|H 2x5fIP[?gUh4-C4]B*Ucz傄~+%b3W/_ ~Aq ԫ +C z} ]3xcOd,m#8JEClXi5H\h_(?Rg/^X2pN+;KۮNIPb@p"y༐{2$noC G ,{Kنz0 {SdK:<;BP"ttuџ.J*5rgNK#2&o NKczs+kgjrB >O.Ǿ!m8F&GJ)]"Dډj] oƧ }aygl?)/$K vLCJLM<Dc=#FRx9O4XLI2L1 tl$ PμďDzT^0%gn^PY/ .[WDRjIQ"߼,)VBܽ3XቮX#Oм3B,SR&wM0 V/arH(񓡇&xۛY=)6L传$?-mO*u21f C~SdEQY 2e8\Y#\  `:9pKZlRhߪt{&kHI#(pt@3nu,HqʈrFe)kQFL4q󠋕J}ͩ֞Qz\2E_nd80̿.O3A`̚o`YC~84Zĩ>6mpD*#|7i7٢} Bg&]utbon p3p1߇>6^ l!DuSn/ГP_.b׍jƼ3z/vE;X֨ -rmfKIe2GW W<?b yM9[ L/ v d\Pp9`=ZΩ=ZTTS qDaD?}ه.QDw#h_H|OPN|F+豉4:ӼuLj릠}~^| (={ՙqN; GτIɀ@S. X6vb$ PSݝx;`Y1/|?pQk~%S%T"[1| O}!\}`J0sҵи9)^JǕg&:G\z@N4xҦ#L㩉%4\} mzl(>䷡DWV$ޢwqP;۟* ]=FBZ޴= #S(5 hpYSQQYىaX-K)$fZйwL6ABvY56FTHq] eQp~+}G7IjHg.O xr5Oe3U6cY غ=(؟qFՐy[YL?yVb_ `'V,`OebEaS^E5Rȩc (|P(2(JqMȽ<0 W=JYk~7>;[9#&$'\ TꥸyHmV<>pvtwDxX L-eFev&r5QOJ8)PMuefp.(.SPsSTt2fZsQ#Efa.w>!M&7%墕Hy"xoQN=gǦԴ&/;5dN`y H\֝+1 MkEBX^ֿΰAd` uSt*aO@#-(c1δn*jZ#.kJu hhӷJZ򄽥N{u@pldȠ`]g^5utKsu4D']ˉvzDv"ҽuS;i0S7# aW_HaV>ơD ALqSJ߅x yqAݾ&b&H@HNJ"V}z_XCc"lW6H]w S] ֦p&).Bb@RBQDI?fH=2=0ϲj^䡊a] ``) Nm#v&2e☯g[E?ܿP0t0dC: D=;T+ %g#$3`H[~Z ĥsӄ4P¿Wa jg )kߏ>tW TsHw 6AvaZ4u4{!fGNE2IP6fxV3z3)HhpRf*,IT!D-|-z@6ż?A;)kM p,$܁@>܁~zx؎?|{5N`X 7~3إG3 )hVr0wPgC"4]ݗeG`Z~S.Xi?ZE Z6Q$OY](`MEeXY(pC(Ԩ*6$QQy".DEbV]QЀO[(*c^7Jq෩=VȓT/=QRKuS4ۯg0d>,d>*ؤoKC%\zۘ]e;hܩV^Lo^>ox} ' gqk-(Մm| pY?B*-N3-B $B `Ik13%+Q:Śt*JN=O>޿.2xb?Bo)~#|[=eU pj c{"hڋ/GT}FTp sƃ"GWkÌU}lZ*)B}yM) G \|r&wȄխ%!cj-vG8 JSC#օ]goӽ3O_>rs _,Dqv.tIME6 DIENDB`gmfsk-0.7pre1/pixmaps/pause.xpm0000644000076400007640000000143707264423221012303 /* XPM */ static char * pause_xpm[] = { "24 24 5 1", " c None", ". c #949594", "+ c #000000", "@ c #8E8E8E", "# c #FFFFFF", " ", " ", " ", " ", " ...... ...... ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+++@# .+++@# ", " .+@@@# .+@@@# ", " .##### .##### ", " ", " ", " ", " ", " " }; gmfsk-0.7pre1/pixmaps/rx.xpm0000644000076400007640000000141107264430177011617 /* XPM */ static char * rx_xpm[] = { "24 24 4 1", " c None", ". c black", "X c green", "o c gray50", " ", " ", " ", " ", " ", " ......... ", " .XXXXXX.o ", " .XXXXXX.o ", " .XXXXX.o ", " .XXXXX.o ", " .XXXX..... ", " .XXXXXXXX.o ", " .....XXX.o ", " oo.XXX.o ", " .XX.o ", " .XX.o ", " .X.o ", " .X.o ", " ..o ", " ", " ", " ", " ", " ", }; gmfsk-0.7pre1/pixmaps/tune.xpm0000644000076400007640000000151507276021440012136 /* XPM */ static char * tune_xpm[] = { "24 24 6 1", " c None", ". c #000000", "+ c #404040", "@ c #FF0000", "# c #606060", "$ c #303030", " ", " .. ", " . ++ @@@@@ ", " . . @@@@ ", " # + . @@@@ ", " . . @@@@@ ", " + +# @@@ @ ", " ++ #+ @@@ ", " . . @@@ ", " #+ +# @@@ ", " $ +@@@ ", " . @@@ .", "...........@@@..........", " @@@. #+", " @@@ + . ", " @@@ . + ", " @@@ #+ #+ ", " @@@ . . ", " @@@ + + ", " @@@ + ++ ", " @@@ . #. ", " @@@ .+.+ ", " @@ + ", " "}; gmfsk-0.7pre1/pixmaps/tx.xpm0000644000076400007640000000140707264430550011621 /* XPM */ static char * tx_xpm[] = { "24 24 4 1", " c None", ". c black", "X c red", "o c gray50", " ", " ", " ", " ", " ", " ......... ", " .XXXXXX.o ", " .XXXXXX.o ", " .XXXXX.o ", " .XXXXX.o ", " .XXXX..... ", " .XXXXXXXX.o ", " .....XXX.o ", " oo.XXX.o ", " .XX.o ", " .XX.o ", " .X.o ", " .X.o ", " ..o ", " ", " ", " ", " ", " ", }; gmfsk-0.7pre1/fonts/0000777000076400007640000000000010206176701010165 5gmfsk-0.7pre1/fonts/Feld7x7-14.pcf0000644000076400007640000001525410104452264012242 fcpd  @8Dd| %29DMXjkwdddd 7#4<MOcs} FONT_NAMEFeld7x7UNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeld7x7FOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeld7x7COPYRIGHTProportional FeldHell Narrow font by IZ8BLY (Based on G3PLFONT-FeldHell-Feld7x7-Normal-R-Normal--14-100-100-100-P-55-ISO8859-1WEIGHT  _}z~~~~~_,4\Dl(Px@h8`(Px@h8`(Px  ( H p ( P  ( H h @ `  8 ` ^x                                ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_eeeee_ !(0:FP[diov}  $.;GRXZ\^`bdfhjlnprtvxz|~spaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/Feld7x7n-14.pcf0000644000076400007640000001526010104452264012415 fcpd  @8Hd &2:ENYklxdddd 2%6>OQeu FONT_NAMEFeld7x7nUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeld7x7nFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeld7x7nCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY (Based on G3PLFONT-FeldHell-Feld7x7n-Normal-R-Normal--14-100-100-100-P-50-ISO8859-1WEIGHT  _}z~~~~~_,4\Dl(Px@h8`(Px@h8`(Px  ( H p ( P  ( H h @ `  8 ` ^x                                                          ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee_ !(0:FP[diov}  $.;GRXZ\^`bdfhjlnprtvxz|~spaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldDx-14.pcf0000644000076400007640000001571410104452264012171 fcpd  @DXd $28CLWijv}dddd U!2:KMaq{ FONT_NAMEFeldDxUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldDxFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldDxCOPYRIGHTProportional FeldHell font by G3PLX, doubled by IZ8BLYFONT-FeldHell-FeldDx-Normal-R-Normal--14-100-100-100-P-85-ISO8859-1WEIGHT  `}}{|~~~~{`8Dl 4\$Lt$P$<d8`(Px@p8` , T p x  0 X H p  D l 4 \ 8$H                    Acw]IAAAAA  IIIIIII]w"    0          ???? ????0<??30000000?3   ??33000000003?00000003?? 0000000<  ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`eeeeeeeeeeeeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldFat-14.pcf0000644000076400007640000001556010104452264012327 fcp,dh  h@tDd@ %29DMXjkwdddd H#4<MOcs}" )FONT_NAMEFeldFatUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldFatFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldFatCOPYRIGHTCreated by Tomi Manninen OH2BNS with FontForge 1.0 (http://fontforge.sf.net)FONT-FeldHell-FeldFat-Normal-R-Normal--14-100-100-100-P-72-ISO8859-1WEIGHT  `}}{|~~~~{`8Dl <l 4\$Lt,T$Lt<d,\$Lt @ \ d | , T |  , T t  $ D l  4 d t 666666~ ?~hh?ggg`p8sss|f sc>6cA008 >sskkgg>  ??>c`|>>c`88`c><>733000?``?>??cc>00 >cc>>cc>>cc~``~>088088?30>cc{{;><>wccccc?cc??cc?<~gg~<?sccccs?|~sscg~<ccccccccpp````cc>ccs;;scccwkccccccgo{scccc>wccccw>?cc?>cccc{{>00?cc?3scc~?~``??? cccccccc>cccc66cccckkk6ccw>>wcc333? p0  800 >~`~c~;gccc?>??>``nsccc~>c?><>~ccc~`~>;wccccc3;;337kkccc;wccccc>cccc>?ccg;~ccsn```;g~?~`?cccccsnccccw>cckkk6cw>>wccccw> 0    800~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;;;;;;;;;;;;;;;;;;;;;e;;;;;;;;;;;;;;ee;;;;;;ee;;;;;;;;;;;;ee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldHell-12.pcf0000644000076400007640000001567410104452264012505 fcpd  @DHd &2: ENYklx xKKK B%6>OQeu FONT_NAMEFeldHellUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldHellFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldHellCOPYRIGHTProportional FeldHell font by G3PLXFONT-FeldHell-FeldHell-Normal-R-Normal--12-120-75-75-P-66-ISO8859-1WEIGHT  `}}{|~~~~{`8Dl 4\$Lt$P$<d8`(Px@p8` , T p x  0 X H p  @ h  0 X 4"D                    Acw]IAAAAA  IIIIIII]w"      Acw]IAAAAA  IIIIIII]w"   ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`GGGGGMGGGMGGGGGGGGGGMGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldLittle-14.pcf0000644000076400007640000001557010104452264013053 fcp$dx  p@|DdH (2<GP[mnzdddd0):BSUiy #FONT_NAMEFeldLittleUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldLittleFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldLittleCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY (Based on G3PLFONT-FeldHell-FeldLittle-Normal-R-Normal--14-100-100-100-P-48-ISO8859-1WEIGHT  `}}{|~~~~{`8Dl 4\$Lt$T(@h<d,T|Dl 4\( P l t  < d  < d  4 T | $ D t x                                                                         ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldLo8-14.pcf0000644000076400007640000001661010104452264012254 fcp d  @DdX %29DMXjkwdddd ?#4<MOcs} FONT_NAMEFeldLo8UNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldLo8FOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldLo8COPYRIGHTProportional FeldHell Narrow font by IZ8BLY FONT-FeldHell-FeldLo8-Normal-R-Normal--14-100-100-100-P-63-ISO8859-1WEIGHT  `}}{|~~z`<L|(X,\L|4dL| <l,\L @ p 0 ` ( X  4 d ( P x HxDl      >6" ??11--##???? >????? << ????????? ??>???!!????? ??!!!!????!!?> >>??! 0 ??!!==?><??!!!???!!!??!!!!??>????>??1!!!!1???????????>??99!!??!!!!!???!!!! !!??!!1991!!???Acw]IAAAAAA!##'%-)911!!??!!!!!!????!!!????!!!!))?~`??!!!?111>??> ??!!!!!!!!!??!!1 AAAAAIIII6AAcw>>wcAAAAcw>???00???  >> >?!??>??!!!?? >??!!!??>??!????>>??!!?> ????!!!!!! 7IIIAAAA??#!!!!!!??!!!!????"">>>??;??>??> ??!!!!!!1??.AAAAAcw>AAAAIII6Acw>>wcA!!!#'>< ????? ??? 6~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;e;;;;;e;;;;`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldLow-14.pcf0000644000076400007640000001661010104452264012353 fcp d  @DdX %29DMXjkwdddd 7#4<MOcs} FONT_NAMEFeldLowUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldLowFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldLowCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY FONT-FeldHell-FeldLow-Normal-R-Normal--14-100-100-100-P-55-ISO8859-1WEIGHT  `}}{|~~z`<L|(X,\L| 8h L| <l,\L @ p 0 ` ( X  4 d ( P x HxDl      >6"     ?>0                  6~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;eeeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldModern-14.pcf0000644000076400007640000001545410104452264013043 fcp$d,  $@0Dd (2<GP[mnzdddd8):BSUiy #FONT_NAMEFeldModernUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldModernFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldModernCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY (Based on G3PLFONT-FeldHell-FeldModern-Normal-R-Normal--14-100-100-100-P-56-ISO8859-1WEIGHT  `}}{|~~~~z`0<d Hd,T|Dl$Lt<d,T|$Lt<d $ , D d  D l  < \ | 4 T t , X e (   ''2 99 /1?.>6"           ?!!-=                         ?&~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;eeeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldModern8-14.pcf0000644000076400007640000001546010104452264013130 fcp(d,  (@4Dd )2=HQ\no{dddd@+<DUWk{  'FONT_NAMEFeldModern8UNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldModern8FOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldModern8COPYRIGHTProportional FeldHell Narrow font by IZ8BLY (Based on G3PLFONT-FeldHell-FeldModern8-Normal-R-Normal--14-100-100-100-P-64-ISO8859-1WEIGHT  `}}{|~~~~z`0<d Hd,T|Dl$Lt<d,T|$Lt<d $ , D d  D l  < \ | 4 T t , X e (   ''2 99 /1?.>6" ?19-'#!??!0 ???? 08 !?????? ??!!??? 0 ?!!?!!??!!?> >     >AAM}=?> 3!!??!!!?!!!!?>##>1!!!!1??????<>11!#>!!!!??!!!! !!?!!11!!??Acw]IAAAAA!#'-91!!!! 3!!!!3 ?!!??!!!!))??!!?1!!?!> !?!!!!!!!!?AAAc"6AAAAAIII6AAc66cAAAAc6??0 ??  > >?!?>?#!!!? .?1!!!?>?!??<>>?!!1?. >?#!!!!!  7IIAAAA?#!!!!!?!!!!??!!#?>?!!1?. ?#>?> ?!!!!!1?.AAAAc6AAAIII6Ac66cA!!!!1?. >?? ?? ?&~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;e;;;;;;;;;;`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldNarr-14.pcf0000644000076400007640000002712410104452264012516 fcpd(H0 x#@H%T'd$. &2:ENYklxdddd 8%6>OQeu FONT_NAMEFeldNarrUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldNarrFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldNarrCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY (Based on G3PLFONT-FeldHell-FeldNarr-Normal-R-Normal--14-100-100-100-P-56-ISO8859-1WEIGHT  }{|~~~~z4@h0X Hp L| 8` 4\$Lt<l 4\( P l t  < d  < d  4 T | $ D t <l,TDt,\LdL|4d<l,\L| 4XPxl `3                                            >? ?? 99                    >~H~ >          >           !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~eeeee;e !(0:FP[diov}  $.;GRXZ\^`bdfhjlnprtvxz|~#*6@DKRYelv #*1=GKRY`ls}spaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitildeexclamdownAgraveAacuteAcircumflexAtildeAdieresisAringAECcedillaEgraveEacuteEcircumflexEdieresisIgraveIacuteIcircumflexIdieresisEthNtildeOgraveOacuteOcircumflexOtildeOdieresismultiplyOslashUgraveUacuteUcircumflexUdieresisYacuteThorngermandblsagraveaacuteacircumflexatildeadieresisaringaeccedillaegraveeacuteecircumflexedieresisigraveiacuteicircumflexidieresisethntildeograveoacuteocircumflexotildeodieresisdivideoslashugraveuacuteucircumflexudieresisyacutethornydieresis  gmfsk-0.7pre1/fonts/FeldReal-14.pcf0000644000076400007640000001573010104452264012477 fcpd  @Ddd &2:ENYklxdddd ?%6>OQeu FONT_NAMEFeldRealUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldRealFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldRealCOPYRIGHTTrue Hellschreiber Fontset by IZ8BLYFONT-FeldHell-FeldReal-Normal-R-Normal--14-100-100-100-P-63-ISO8859-1WEIGHT  `}}}|~~~|{`4HpDt8`@l@X,T|Dl 4\,T| H p H p  8 ` ( X H p L.\    ###0 111                                    ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`eeeeeeeeeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldStyl-14.pcf0000644000076400007640000001647410104452264012555 fcpdP  4@@Dd  &2:ENYklxdddd 8%6>OQeu FONT_NAMEFeldStylUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldStylFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldStylCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY FONT-FeldHell-FeldStyl-Normal-R-Normal--14-100-100-100-P-56-ISO8859-1WEIGHT  `}}z}~~~}z`8DlHx@p,\ 8`x0` P@p4d P  @ p ( X @ x ( P | (PxL|p     >6"                >0                      ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;eeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldVert-14.pcf0000644000076400007640000001650410104452264012534 fcpdX  <@HDd &2:ENYklxdddd 8%6>OQeu FONT_NAMEFeldVertUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldVertFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldVertCOPYRIGHTProportional FeldHell Narrow font by IZ8BLY FONT-FeldHell-FeldVert-Normal-R-Normal--14-100-100-100-P-56-ISO8859-1WEIGHT  `}}z}~~~}z`8DlHx@p0`<d|4d$TDt8h( X  H x  0 `  H  0 X 0X$T     >6"           >0                        ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;eeeee`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/FeldWide-14.pcf0000644000076400007640000001561010104452264012501 fcpd  @DdX &2:ENYklxdddd N%6>OQeu FONT_NAMEFeldWideUNDERLINE_POSITIONUNDERLINE_THICKNESSQUAD_WIDTHX_HEIGHTCAP_HEIGHTFONTNAME_REGISTRYFAMILY_NAMEFeldWideFOUNDRYFeldHellWEIGHT_NAMENormalSETWIDTH_NAMENormalSLANTRADD_STYLE_NAMEPIXEL_SIZEPOINT_SIZERESOLUTION_XRESOLUTION_YRESOLUTIONSPACINGPAVERAGE_WIDTHCHARSET_REGISTRYISO8859CHARSET_ENCODING1CHARSET_COLLECTIONSASCII ISO8859-1FULL_NAMEFeldWideCOPYRIGHTProportional FeldHell Wide font by IZ8BLY (Based on G3PLX)FONT-FeldHell-FeldWide-Normal-R-Normal--14-100-100-100-P-78-ISO8859-1WEIGHT  `}}{}~~~~{`8Dl@p8`8d8Px$Lt<d,T$Lt @ h 4 T | , T |  , L l  < \ ~  >I ?~HI>CCC`0 aaa<& ^z3!a>  6cA ~~  >>>A@|>>a`88`a>~~>~@@`?<>=CAA>00 >AAc>>cAA>>AA~@@`>    >A@p8 >AA]}=><>cAAAAA?BB>>BB?>AA>?bBBBBb?~qqAA>AAAAAAAApp@@@@AA>aa11aaAcw]IAAAAAACGMYqaAAA>AAAAAA>?BB~>>AAAAQQ> ?AA?!aAA~?~@@?AAAAAAAA>AAAa1 AAAAIIII6AAc66cAAAAc600   >~@~A~:~FBBB?>??>``.?1!!!~>A?><>~AAa^@~>:~FBBBCC  117IIIAAA=CAAAAA>AAAA>?BBF~:~xx;F~?~@?AAAAAa^AAAAc6AAIIII6Ac66cAAAAc6 0  ~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`e;;;;`)08BNXclqw~   ,6COZ`bdfhjlnprtvxz|~.notdefspaceexclamquotedblnumbersigndollarpercentampersandquotesingleparenleftparenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolonsemicolonlessequalgreaterquestionatABCDEFGHIJKLMNOPQRSTUVWXYZbracketleftbackslashbracketrightasciicircumunderscoregraveabcdefghijklmnopqrstuvwxyzbraceleftbarbracerightasciitilde  gmfsk-0.7pre1/fonts/fonts.dir0000644000076400007640000000232110104452264011726 15 FeldLo8-14.pcf -feldhell-feldlo8-normal-r-normal--14-100-100-100-p-63-iso8859-1 FeldDx-14.pcf -feldhell-felddx-normal-r-normal--14-100-100-100-p-85-iso8859-1 FeldVert-14.pcf -feldhell-feldvert-normal-r-normal--14-100-100-100-p-56-iso8859-1 FeldWide-14.pcf -feldhell-feldwide-normal-r-normal--14-100-100-100-p-78-iso8859-1 FeldReal-14.pcf -feldhell-feldreal-normal-r-normal--14-100-100-100-p-63-iso8859-1 FeldLittle-14.pcf -feldhell-feldlittle-normal-r-normal--14-100-100-100-p-48-iso8859-1 Feld7x7n-14.pcf -feldhell-feld7x7n-normal-r-normal--14-100-100-100-p-50-iso8859-1 FeldLow-14.pcf -feldhell-feldlow-normal-r-normal--14-100-100-100-p-55-iso8859-1 Feld7x7-14.pcf -feldhell-feld7x7-normal-r-normal--14-100-100-100-p-55-iso8859-1 FeldStyl-14.pcf -feldhell-feldstyl-normal-r-normal--14-100-100-100-p-56-iso8859-1 FeldFat-14.pcf -feldhell-feldfat-normal-r-normal--14-100-100-100-p-72-iso8859-1 FeldModern-14.pcf -feldhell-feldmodern-normal-r-normal--14-100-100-100-p-56-iso8859-1 FeldModern8-14.pcf -feldhell-feldmodern8-normal-r-normal--14-100-100-100-p-64-iso8859-1 FeldHell-12.pcf -feldhell-feldhell-normal-r-normal--12-120-75-75-p-66-iso8859-1 FeldNarr-14.pcf -feldhell-feldnarr-normal-r-normal--14-100-100-100-p-56-iso8859-1