Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 29 May 2014 08:58:22 GMT
From:      Stephen Hurd <shurd@sasktel.net>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   ports/190366: New port: comms/quisk A Software Defined Radio
Message-ID:  <201405290858.s4T8wMqG077243@cgiserv.freebsd.org>
Resent-Message-ID: <201405290900.s4T900nQ099456@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         190366
>Category:       ports
>Synopsis:       New port: comms/quisk A Software Defined Radio
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Thu May 29 09:00:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Stephen Hurd
>Release:        10.0-RELEASE-p2
>Organization:
>Environment:
FreeBSD portable 10.0-RELEASE-p2 FreeBSD 10.0-RELEASE-p2 #0: Tue Apr 29 17:06:01 UTC 2014     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64

>Description:
This is QUISK, a Software Defined Radio (SDR).
- Quisk can control the HiQSDR. 
- As a receiver it can use the SDR-IQ by RfSpace as a sample source.
- As a receiver it can use your soundcard as a sample source.
- Quisk can control SoftRock hardware for both receive and transmit.
- As a transmitter it can accept microphone input and send that to your
  transmitter for SSB operation.  For CW, QUISK can mute the audio and
  substitute a side tone.

WWW: http://james.ahlstrom.name/quisk/

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	quisk
#	quisk/Makefile
#	quisk/distinfo
#	quisk/files
#	quisk/files/patch-setup.py
#	quisk/files/patch-quisk.c
#	quisk/files/patch-is_key_down.c
#	quisk/files/patch-microphone.c
#	quisk/files/patch-filter.h
#	quisk/files/patch-filter.c
#	quisk/files/patch-quisk.h
#	quisk/files/patch-extdemod.c
#	quisk/files/patch-sound.c
#	quisk/files/patch-sound_alsa.c
#	quisk/files/patch-sound_directx.c
#	quisk/files/patch-sound_portaudio.c
#	quisk/files/patch-sdriqpkg_sdriq.c
#	quisk/pkg-descr
#	quisk/pkg-plist
#
echo c - quisk
mkdir -p quisk > /dev/null 2>&1
echo x - quisk/Makefile
sed 's/^X//' >quisk/Makefile << 'c82d53f437240c6cf0c6a8403d2c891a'
X# Created by: Stephen Hurd <shurd@sasktel.net>
X# $FreeBSD: $
X
XPORTNAME=	quisk
XPORTVERSION=	3.6.16
XCATEGORIES=	comms hamradio
XMASTER_SITES=	http://james.ahlstrom.name/quisk/
X
XMAINTAINER=	shurd@sasktel.net
XCOMMENT=	A Software Defined Radio (SDR)
X
XLICENSE=	GPLv2
X
XLIB_DEPENDS=	libfftw3.so:${PORTSDIR}/math/fftw3 \
X		portaudio2/libportaudio.so:${PORTSDIR}/audio/portaudio2 \
X		libasound.so:${PORTSDIR}/audio/alsa-lib
X
XUSE_PYTHON=	2.7+
XUSE_WX=		2.8+
XWANT_UNICODE=	yes
XWX_COMPS=	python
XUSE_PYDISTUTILS=yes
X
Xpost-extract:
X	${RM} ${WRKSRC}/_quisk.so ${WRKSRC}/sdriqpkg/sdriq.so
X
Xpost-patch:
X	${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' ${WRKSRC}/setup.py
X
X.include <bsd.port.mk>
c82d53f437240c6cf0c6a8403d2c891a
echo x - quisk/distinfo
sed 's/^X//' >quisk/distinfo << '32d3289d180f56043e582b4872b38a74'
XSHA256 (quisk-3.6.16.tar.gz) = 493a88d6d7f87c885ee8b33baf88f6313afe1dc37ea32ac26da0b7c595b17065
XSIZE (quisk-3.6.16.tar.gz) = 1079067
32d3289d180f56043e582b4872b38a74
echo c - quisk/files
mkdir -p quisk/files > /dev/null 2>&1
echo x - quisk/files/patch-setup.py
sed 's/^X//' >quisk/files/patch-setup.py << 'aa3e0818065e72f92c7fb8aeb4d5b4f7'
X--- setup.py.orig	2014-02-16 05:06:43.000000000 -0800
X+++ setup.py	2014-05-28 22:45:57.000000000 -0700
X@@ -11,8 +11,8 @@
X fp.close()
X 
X module1 = Extension ('quisk._quisk',
X-	#include_dirs = ['.'],
X-	#library_dirs = ['.'],
X+	include_dirs = ['%%LOCALBASE%%/include/portaudio2', '%%LOCALBASE%%/include'],
X+	library_dirs = ['%%LOCALBASE%%/lib/portaudio2', '%%LOCALBASE%%/lib'],
X 	libraries = ['asound', 'portaudio', 'fftw3', 'm'],
X 	sources = ['quisk.c', 'sound.c', 'sound_alsa.c', 'sound_portaudio.c',
X 		'is_key_down.c', 'microphone.c', 'utility.c',
aa3e0818065e72f92c7fb8aeb4d5b4f7
echo x - quisk/files/patch-quisk.c
sed 's/^X//' >quisk/files/patch-quisk.c << '3a03299db541f449c7ab0ac080362636'
X--- quisk.c.orig	2014-02-16 09:40:27.000000000 -0800
X+++ quisk.c	2014-05-29 01:23:14.000000000 -0700
X@@ -4,6 +4,7 @@
X #include <complex.h>	// Use native C99 complex type for fftw3
X #include <fftw3.h>
X #include <sys/types.h>
X+#include <netinet/in.h>
X 
X #ifdef MS_WINDOWS
X #include <Winsock2.h>
X@@ -48,7 +49,7 @@
X 	double gain;
X 	double delta;
X 	double target_gain;
X-	complex * c_samp;
X+	complex double * c_samp;
X };
X 
X static fft_data * FFT1, * FFT2, * FFT3;	// data for three fft's		WB4JFI ADD third FFT
X@@ -72,7 +73,7 @@
X static int graphY;			// Origin of 0 dB for graph data
X static int average_count;		// Number of FFT's to average for graph
X static double graphScale;		// Scale factor for graph
X-static complex testtonePhase;		// Phase increment for test tone
X+static complex double testtonePhase;	// Phase increment for test tone
X double quisk_audioVolume;		// Audio output level, 0.0 to 1.0
X static double cFilterI[MAX_FILTER_SIZE];	// Digital filter coefficients for receive
X static double cFilterQ[MAX_FILTER_SIZE];	// Digital filter coefficients
X@@ -88,7 +89,7 @@
X 
X static double sidetoneVolume;		// Audio output level of the CW sidetone, 0.0 to 1.0
X static int keyupDelay;			// Play silence after sidetone ends
X-static complex sidetonePhase;		// Phase increment for sidetone
X+static complex double sidetonePhase;	// Phase increment for sidetone
X int quisk_sidetoneCtrl;			// sidetone control value 0 to 1000
X 
X static double agcReleaseGain=80;		// AGC maximum gain
X@@ -120,7 +121,7 @@
X static int quisk_record_full;
X 
X // These are used to measure the frequency of a continuous RF signal.
X-static void measure_freq(complex *, int, int);
X+static void measure_freq(complex double *, int, int);
X static double measured_frequency;
X static int measure_freq_mode=0;
X 
X@@ -169,13 +170,13 @@
X }
X #endif
X 
X-static int cFracDecim(complex * cSamples, int nSamples, double fdecim)
X+static int cFracDecim(complex double * cSamples, int nSamples, double fdecim)
X {
X // Fractional decimation of I/Q signals works poorly because it introduces aliases and birdies.
X 	int i, nout;
X 	double xm0, xm1, xm2, xm3;
X 	static double dindex = 1;
X-	static complex c0=0, c1=0, c2=0, c3=0;
X+	static complex double c0=0, c1=0, c2=0, c3=0;
X 	static int in=0, out=0;
X 
X 	in += nSamples;
X@@ -215,16 +216,16 @@
X }
X 			
X #define QUISK_NB_HWINDOW_SECS	500.E-6	// half-size of blanking window in seconds
X-static void NoiseBlanker(complex * cSamples, int nSamples)
X+static void NoiseBlanker(complex double * cSamples, int nSamples)
X {
X-	static complex * cSaved = NULL;
X+	static complex double * cSaved = NULL;
X 	static double  * dSaved = NULL;
X 	static double save_sum;
X 	static int save_size, hwindow_size, state, index, win_index;
X 	static int sample_rate = -1;
X 	int i, j, k, is_pulse;
X 	double mag, limit;
X-	complex samp;
X+	complex double samp;
X #if DEBUG
X 	static time_t time0 = 0;
X 	static int debug_count = 0;
X@@ -243,8 +244,8 @@
X 		i = save_size * sizeof(double);
X 		dSaved = (double *) realloc(dSaved, i);
X 		memset (dSaved, 0, i);
X-		i = save_size * sizeof(complex);
X-		cSaved = (complex *)realloc(cSaved, i);
X+		i = save_size * sizeof(complex double);
X+		cSaved = (complex double *)realloc(cSaved, i);
X 		memset (cSaved, 0, i);
X #if DEBUG
X 		printf ("Noise blanker: save_size %d  hwindow_size %d\n",
X@@ -339,11 +340,11 @@
X 	static fftw_plan planRev,fltrFwd, fltrRev;
X 	static double data_in[NOTCH_DATA_SIZE];
X 	static double data_out[NOTCH_DATA_SIZE];
X-	static complex notch_fft[NOTCH_FFT_SIZE];
X+	static complex double notch_fft[NOTCH_FFT_SIZE];
X 	static double fft_window[NOTCH_DATA_SIZE];
X 	static double fltr_in[NOTCH_DATA_SIZE];
X 	static double fltr_out[NOTCH_FILTER_DESIGN_SIZE];
X-	static complex fltr_fft[NOTCH_FFT_SIZE];
X+	static complex double fltr_fft[NOTCH_FFT_SIZE];
X 	static double average_fft[NOTCH_FFT_SIZE];
X 	static int fltrSig;
X #if NOTCH_DEBUG
X@@ -501,7 +502,7 @@
X }
X 
X #if 0
X-static complex * audio_fft;
X+static complex double * audio_fft;
X static int audio_fft_ready=0;
X static void calc_audio_graph(double * dsamples, int nSamples)
X { // Calculate an FFT for the audio data
X@@ -517,7 +518,7 @@
X 		audio_fft_size = data_width;
X 		data_in = (double *)malloc(audio_fft_size * sizeof(double));
X 		fft_window = (double *)malloc(audio_fft_size * sizeof(double));
X-		audio_fft = (complex *)malloc((audio_fft_size / 2 + 1) * sizeof(complex));
X+		audio_fft = (complex double *)malloc((audio_fft_size / 2 + 1) * sizeof(complex double));
X 		plan = fftw_plan_dft_r2c_1d(audio_fft_size, data_in, audio_fft, FFTW_MEASURE);
X 		for (i = 0; i < audio_fft_size; i++)
X 			fft_window[i] = 0.50 - 0.50 * cos(2. * M_PI * i / audio_fft_size);	// Hanning
X@@ -583,14 +584,14 @@
X }
X #endif
X 
X-static complex dRxFilterOut(complex sample, int bank)
X+static complex double dRxFilterOut(complex double sample, int bank)
X {  // Rx FIR filter; bank is the static storage index, and must be different for different data streams
X-	complex cx;
X+	complex double cx;
X 	int j, k;
X 	static int init = 0;
X 	static struct stStorage {
X 		int indexFilter;						// current index into sample buffer
X-		complex bufFilterC[MAX_FILTER_SIZE];	// Digital filter sample buffer
X+		complex double bufFilterC[MAX_FILTER_SIZE];	// Digital filter sample buffer
X 	} Storage[2];
X 	struct stStorage * ptBuf = Storage + bank;
X 
X@@ -616,7 +617,7 @@
X 	return cx;
X }
X 
X-static complex cRxFilterOut(complex sample, int bank)
X+static complex double cRxFilterOut(complex double sample, int bank)
X {  // Rx FIR filter; bank is the static storage index, and must be different for different data streams
X 	double accI, accQ;
X 	int j, k;
X@@ -652,12 +653,12 @@
X 	return accI + I * accQ;
X }
X 
X-static void AddTestTone(complex * cSamples, int nSamples)
X+static void AddTestTone(complex double * cSamples, int nSamples)
X {
X 	int i;
X-	static complex testtoneVector = 21474836.47;	// -40 dB
X-	static complex audioVector = 1.0;
X-	complex audioPhase;
X+	static complex double testtoneVector = 21474836.47;	// -40 dB
X+	static complex double audioVector = 1.0;
X+	complex double audioPhase;
X 
X 	switch (rxMode) {
X 	default:
X@@ -753,7 +754,7 @@
X 	return PyInt_FromLong(quisk_record_state != PLAYBACK);
X }
X 
X-void quisk_tmp_record(complex * cSamples, int nSamples, double scale)		// save sound
X+void quisk_tmp_record(complex double * cSamples, int nSamples, double scale)		// save sound
X {
X 	int i;
X 
X@@ -766,7 +767,7 @@
X 	}
X }
X 
X-static void tmp_playback(complex * cSamples, int nSamples, double volume)
X+static void tmp_playback(complex double * cSamples, int nSamples, double volume)
X {  // replace radio sound with saved sound
X 	int i;
X 	double d;
X@@ -783,7 +784,7 @@
X 	}
X }
X 
X-void quisk_tmp_microphone(complex * cSamples, int nSamples)
X+void quisk_tmp_microphone(complex double * cSamples, int nSamples)
X {  // replace microphone samples with saved sound
X 	int i;
X 	double d;
X@@ -800,7 +801,7 @@
X 	}
X }
X 
X-static int quisk_process_decimate(complex * cSamples, int nSamples, int bank)
X+static int quisk_process_decimate(complex double * cSamples, int nSamples, int bank)
X {
X 	int i, final_filter;
X 	static struct stStorage {
X@@ -925,13 +926,13 @@
X 	return nSamples;
X }
X 
X-static int quisk_process_demodulate(complex * cSamples, double * dsamples, int nSamples, int bank)
X+static int quisk_process_demodulate(complex double * cSamples, double * dsamples, int nSamples, int bank)
X {
X 	int i;
X-	complex cx, cpx;
X+	complex double cx, cpx;
X 	double d, di;
X 	static struct stStorage {
X-		complex fm_1;			// Sample delayed by one
X+		complex double fm_1;			// Sample delayed by one
X 		double dc_remove;		// DC removal for AM
X 		double FM_www;
X 		double FM_nnn, FM_a_0, FM_a_1, FM_b_1, FM_x_1, FM_y_1;   // filter for FM
X@@ -1100,11 +1101,11 @@
X 	return nSamples;
X }
X 
X-static void process_agc(struct AgcState * dat, complex * csamples, int count, int is_cpx)
X+static void process_agc(struct AgcState * dat, complex double * csamples, int count, int is_cpx)
X {
X 	int i;
X 	double out_magn, buf_magn, dtmp, clip_gain;
X-	complex csample;
X+	complex double csample;
X #if DEBUG
X 	static int printit=0;
X 	static double maxout=1;
X@@ -1121,7 +1122,7 @@
X 		dat->gain = 100;					// Current output gain
X 		dat->delta = 0;						// Amount to change dat->gain at each sample
X 		dat->target_gain = 100;				// Move to this gain unless we clip
X-		dat->c_samp = (complex *) malloc(dat->buf_size * sizeof(complex));		// buffer for complex samples
X+		dat->c_samp = (complex double *) malloc(dat->buf_size * sizeof(complex double));		// buffer for complex samples
X 		for (i = 0; i < dat->buf_size; i++)
X 			dat->c_samp[i] = 0;
X 		return;
X@@ -1224,23 +1225,23 @@
X 	return;
X }
X 
X-int quisk_process_samples(complex * cSamples, int nSamples)
X+int quisk_process_samples(complex double * cSamples, int nSamples)
X {
X // Called when samples are available.
X // Samples range from about 2^16 to a max of 2^31.
X 	int i, n, nout, is_key_down, interp;
X 	double d, di;
X 	double double_filter_decim;
X-	complex phase;
X+	complex double phase;
X 	int orig_nSamples;
X 
X 	static int size_dsamples = 0;		// Current dimension of dsamples, dsamples2, orig_cSamples
X 	static double * dsamples = NULL;
X 	static double * dsamples2 = NULL;
X-	static complex * orig_cSamples = NULL;
X-	static complex rxTuneVector = 1;
X-	static complex txTuneVector = 1;
X-	static complex sidetoneVector = BIG_VOLUME;
X+	static complex double * orig_cSamples = NULL;
X+	static complex double rxTuneVector = 1;
X+	static complex double txTuneVector = 1;
X+	static complex double sidetoneVector = BIG_VOLUME;
X 	static double dOutCounter = 0;		// Cumulative net output samples for sidetone etc.
X 	static int sidetoneIsOn = 0;		// The status of the sidetone
X 	static double sidetoneEnvelope;		// Shape the rise and fall times of the sidetone
X@@ -1277,12 +1278,12 @@
X 		size_dsamples = nSamples * 2;
X 		dsamples = (double *)malloc(size_dsamples * sizeof(double));
X 		dsamples2 = (double *)malloc(size_dsamples * sizeof(double));
X-		orig_cSamples = (complex *)malloc(size_dsamples * sizeof(complex));
X+		orig_cSamples = (complex double *)malloc(size_dsamples * sizeof(complex double));
X 	}
X 	is_key_down = quisk_transmit_mode || quisk_is_key_down();
X 	orig_nSamples = nSamples;
X 	if (split_rxtx)
X-		memcpy(orig_cSamples, cSamples, nSamples * sizeof(complex));
X+		memcpy(orig_cSamples, cSamples, nSamples * sizeof(complex double));
X 
X 	if (is_key_down && !isFDX) {	// The key is down; replace this data block
X 		dOutCounter += (double)nSamples * quisk_sound_state.playback_rate /
X@@ -1625,7 +1626,7 @@
X 
X static PyObject * get_filter_rate(PyObject * self, PyObject * args)
X {  // return the filter sample rate as used by quisk_process_samples
X-	complex cSamples[2];
X+	complex double cSamples[2];
X 	double dsamples[2];
X 	if (!PyArg_ParseTuple (args, ""))
X 		return NULL;
X@@ -1769,7 +1770,7 @@
X 	return Py_None;
X }
X 
X-int quisk_read_rx_udp(complex * samp)	// Read samples from UDP
X+int quisk_read_rx_udp(complex double * samp)	// Read samples from UDP
X {		// Size of complex sample array is SAMP_BUFFER_SIZE
X 	ssize_t bytes;
X 	unsigned char buf[1500];	// Maximum Ethernet is 1500 bytes.
X@@ -1778,8 +1779,8 @@
X 	unsigned char * ptxr, * ptxi;
X 	struct timeval tm_wait;
X 	fd_set fds;
X-	static complex dc_average = 0;		// Average DC component in samples
X-	static complex dc_sum = 0;
X+	static complex double dc_average = 0;		// Average DC component in samples
X+	static complex double dc_sum = 0;
X 	static int dc_count = 0;
X 	static int dc_key_delay = 0;
X 
X@@ -2204,7 +2205,7 @@
X 	fft_data * ptFft;
X 	PyObject * tuple2;
X 	double d2, scale, zoom, deltaf;
X-	complex c;
X+	complex double c;
X 	static double meter = 0;	// RMS s-meter
X 	static int use_fft = 1;		// Use the FFT, or return raw data
X 
X@@ -2266,13 +2267,13 @@
X 				c = ptFft->samples[fft_size + i];	// negative frequencies
X 			else
X 				c = ptFft->samples[i];				// positive frequencies
X-			meter += c * conj(c);		// add square of amplitude
X+			meter = meter + (c * conj(c));		// add square of amplitude
X 		}
X 		if (i < 0)			// add fractional next bin
X 			c = ptFft->samples[fft_size + i];
X 		else
X 			c = ptFft->samples[i];
X-		meter += c * conj(c) * (d2 - n);	// fractional part of next bin
X+		meter = meter + (c * conj(c) * (d2 - n));	// fractional part of next bin
X 	}
X 	// Average the fft data into the graph in order of frequency
X 	k = 0;
X@@ -2333,7 +2334,7 @@
X 	int i, j, k, n;
X 	int freq, time;
X 	PyObject * tuple2;
X-	complex cx;
X+	complex double cx;
X 	double d2, scale, accI, accQ;
X 	double * average, * bufI, * bufQ;
X 	fft_data * FFT;
X@@ -2421,11 +2422,11 @@
X 	return tuple2;
X }
X 
X-static void measure_freq(complex * cSamples, int nSamples, int srate)
X+static void measure_freq(complex double * cSamples, int nSamples, int srate)
X {
X 	int i, k, center, ipeak;
X 	double dmax, c3, freq;
X-	complex cBuffer[SAMP_BUFFER_SIZE];
X+	complex double cBuffer[SAMP_BUFFER_SIZE];
X 	static int index = 0;				// current index of samples
X 	static int fft_size=12000;			// size of fft data
X 	static int fft_count=0;				// number of ffts for the average
X@@ -2447,7 +2448,7 @@
X 			fft_window[i] = 0.50 - 0.50 * cos(2. * M_PI * i / (fft_size - 1));
X 		return;
X 	}
X-	memcpy(cBuffer, cSamples, nSamples * sizeof(complex));	// do not destroy cSamples
X+	memcpy(cBuffer, cSamples, nSamples * sizeof(complex double));	// do not destroy cSamples
X 	nSamples = quisk_cDecim2HB45(cBuffer, nSamples, &HalfBand1);
X 	nSamples = quisk_cDecim2HB45(cBuffer, nSamples, &HalfBand2);
X 	nSamples = quisk_cDecim2HB45(cBuffer, nSamples, &HalfBand3);
3a03299db541f449c7ab0ac080362636
echo x - quisk/files/patch-is_key_down.c
sed 's/^X//' >quisk/files/patch-is_key_down.c << 'd88a0128e630c9dc64f9fedec14da0f6'
X--- is_key_down.c.orig	2011-09-09 04:12:18.000000000 -0700
X+++ is_key_down.c	2014-05-29 01:47:21.000000000 -0700
X@@ -35,7 +35,14 @@
X // Not MS Windows:
X #include <stdio.h>
X #include <fcntl.h>
X+#include <netinet/in.h>
X+#ifdef __linux__
X #include <linux/ppdev.h>
X+#endif
X+#ifdef __FreeBSD__
X+#include <dev/ppbus/ppi.h>
X+#include <dev/ppbus/ppbconf.h>
X+#endif
X #include <sys/ioctl.h>
X #include <unistd.h>
X #include <sys/types.h>
X@@ -142,14 +149,18 @@
X 	if (fd == -1) {
X 			printf("Open %s failed, try modprobe ppdev.\n", name);
X 	}
X+#ifdef __linux__
X 	else if (ioctl (fd, PPCLAIM)) {
X 		perror ("PPCLAIM");
X 		close (fd);
X 		fd = -1;
X 	}
X+#endif
X 	else {
X 		byte = 0x0;
X+#if defined(__linux__)
X 		ioctl(fd, PPWCONTROL, &byte);		
X+#endif
X 		return 0;	// Success
X 	}
X 	return -1;
X@@ -160,8 +171,10 @@
X 	int byte;
X 
X 	if (fd >= 0) {
X+#ifdef __linux__
X 		byte = 0x0;
X 		ioctl(fd, PPWCONTROL, &byte);
X+#endif
X 		close(fd);
X 	}
X 	fd = -1;
X@@ -175,12 +188,16 @@
X 
X static int is_key_down_pport(void)
X {
X-	int byte;
X+	uint8_t byte;
X 
X 	if (fd < 0)		// port not open
X 		return 0;	// Key is up
X 	byte = 0;
X+#if defined(__linux__)
X 	ioctl(fd, PPRSTATUS, &byte);
X+#elif defined(__FreeBSD__)
X+	ioctl(fd, PPIGSTATUS, &byte);
X+#endif
X 	if (byte & 0x10)
X 		return 1;	// Key is down
X 	return 0;		// Key is up
d88a0128e630c9dc64f9fedec14da0f6
echo x - quisk/files/patch-microphone.c
sed 's/^X//' >quisk/files/patch-microphone.c << '731fee37fbd81b951d2dad7cf7e405e7'
X--- microphone.c.orig	2013-10-17 14:13:14.000000000 -0700
X+++ microphone.c	2014-05-29 01:48:02.000000000 -0700
X@@ -1,7 +1,7 @@
X #include <Python.h>
X #include <stdlib.h>
X #include <math.h>
X-#include <sys/timeb.h>
X+#include <sys/time.h>
X #include <complex.h>
X #include <fftw3.h>
X #include "quisk.h"
X@@ -15,6 +15,7 @@
X #else
X #include <sys/socket.h>
X #include <arpa/inet.h>
X+#include <netinet/in.h>
X #define		INVALID_SOCKET	-1
X #endif
X 
X@@ -112,7 +113,7 @@
X 	}
X }
X 
X-static void get_wav(complex * buffer, int count)
X+static void get_wav(complex double * buffer, int count)
X {
X 	// Put transmit audio samples from a file into buffer.
X 	// The sample rate must equal quisk_sound_state.mic_sample_rate.
X@@ -134,12 +135,12 @@
X #endif
X 
X #if USE_GET_SIN
X-static void get_sin(complex * cSamples, int count)
X+static void get_sin(complex double * cSamples, int count)
X {	// replace mic samples with a sin wave
X 	int i;
X 	double freq;
X-	complex phase1;		// Phase increment
X-	static complex vector1 = CLIP32 / 2;
X+	complex double phase1;		// Phase increment
X+	static complex double vector1 = CLIP32 / 2;
X 
X 	// Use the sidetone slider 0 to 1000 to set frequency
X 	//freq = (quisk_sidetoneCtrl - 500) / 1000.0 * MIC_OUT_RATE;
X@@ -163,12 +164,12 @@
X #endif
X 
X #if USE_2TONE
X-static void get_2tone(complex * cSamples, int count)
X+static void get_2tone(complex double * cSamples, int count)
X {	// replace mic samples
X 	int i;
X-	static complex phase1=0, phase2;		// Phase increment
X-	static complex vector1;
X-	static complex vector2;
X+	static complex double phase1=0, phase2;		// Phase increment
X+	static complex double vector1;
X+	static complex double vector2;
X 
X 	if (phase1 == 0) {		// initialize
X 		phase1 = cexp((I * 2.0 * M_PI * IMD_TONE_1) / quisk_sound_state.mic_sample_rate);
X@@ -184,10 +185,10 @@
X }
X #endif
X 
X-static double CcmPeak(double * dsamples, complex * csamples, int count)
X+static double CcmPeak(double * dsamples, complex double * csamples, int count)
X {
X 	int i, j;
X-	complex csample;
X+	complex double csample;
X 	double dtmp, dsample, newlevel, oldlevel;
X 	static double out_short, out_long;
X 	static struct Ccmpr {
X@@ -196,7 +197,7 @@
X 		double themax;
X 		double level;
X 		double * d_samp;
X-		complex * c_samp;
X+		complex double * c_samp;
X 		double * levl;
X 	} dat = {0};
X 
X@@ -206,7 +207,7 @@
X 		dat.themax = 1.0;					// maximum level in the buffer
X 		dat.level = 1.0;					// current output level
X 		dat.d_samp = (double *) malloc(dat.buf_size * sizeof(double));		// buffer for double samples
X-		dat.c_samp = (complex *) malloc(dat.buf_size * sizeof(complex));	// buffer for complex samples
X+		dat.c_samp = (complex double *) malloc(dat.buf_size * sizeof(complex double));	// buffer for complex samples
X 		dat.levl = (double *) malloc(dat.buf_size * sizeof(double));		// magnitude of the samples
X 		for (i = 0; i < dat.buf_size; i++) {
X 			dat.d_samp[i] = 0;
X@@ -258,18 +259,18 @@
X 	return dat.level;
X }
X 
X-static int tx_filter(complex * filtered, int count)
X+static int tx_filter(complex double * filtered, int count)
X {	// Input samples are creal(filtered), output is filtered.  The input rate must be 8000 or 48000 sps.
X 	int i, is_ssb;
X 	int sample_rate = 8000;
X 	double dsample, dtmp, magn;
X-	complex csample;
X+	complex double csample;
X 	static double inMax=0.3;
X 	static double x_1=0;
X 	static double aaa, bbb, ccc, Xmin, Xmax, Ymax;
X     static int samples_size = 0;
X     static double * dsamples = NULL;
X-	static complex * csamples = NULL;
X+	static complex double * csamples = NULL;
X 	static double time_long, time_short;
X 	static struct quisk_dFilter filtDecim, dfiltInterp;
X 	static struct quisk_dFilter filtAudio1, filtAudio2, dfiltAudio3;
X@@ -319,7 +320,7 @@
X         if (csamples)
X             free(csamples);
X         dsamples = (double *)malloc(samples_size * sizeof(double));
X-        csamples = (complex *)malloc(samples_size * sizeof(complex));
X+        csamples = (complex double *)malloc(samples_size * sizeof(complex double));
X     }
X 	// copy to dsamples[], normalize to +/- 1.0
X 	for (i = 0; i < count; i++)
X@@ -498,12 +499,12 @@
X 	return count;
X }
X 
X-static int tx_filter_digital(complex * filtered, int count, double volume)
X+static int tx_filter_digital(complex double * filtered, int count, double volume)
X {	// Input samples are creal(filtered), output is filtered.
X 	// This filter has minimal processing and is used for digital modes.
X 	int i;
X 	double dsample, amplitude;
X-	complex csample;
X+	complex double csample;
X 
X 	static struct quisk_dFilter filter1;
X #if DEBUG_IO
X@@ -559,7 +560,7 @@
X 	int i, j, k;
X 	int freq, time;
X 	PyObject * tuple2;
X-	complex cx;
X+	complex double cx;
X 	double scale;
X 	double * average, * fft_window, * bufI, * bufQ;
X 	fftw_complex * samples, * pt;		// complex data for fft
X@@ -646,7 +647,7 @@
X // udp_iq has an initial zero followed by the I/Q samples.
X // The initial zero is sent iff align4 == 1.
X 
X-static void transmit_udp(complex * cSamples, int count)
X+static void transmit_udp(complex double * cSamples, int count)
X {	// Send count samples.  Each sample is sent as two shorts (4 bytes) of I/Q data.
X 	// Transmission is delayed until a whole block of data is available.
X 	int i, sent;
X@@ -675,7 +676,7 @@
X 	}
X }
X 
X-static void transmit_mic_carrier(complex * cSamples, int count, double level)
X+static void transmit_mic_carrier(complex double * cSamples, int count, double level)
X {	// send a CW carrier instead of mic samples
X 	int i;
X 
X@@ -684,13 +685,13 @@
X 	transmit_udp(cSamples, count);
X }
X 
X-static void transmit_mic_imd(complex * cSamples, int count, double level)
X+static void transmit_mic_imd(complex double * cSamples, int count, double level)
X {	// send a 2-tone test signal instead of mic samples
X 	int i;
X-	complex v;
X-	static complex phase1=0, phase2;		// Phase increment
X-	static complex vector1;
X-	static complex vector2;
X+	complex double v;
X+	static complex double phase1=0, phase2;		// Phase increment
X+	static complex double vector1;
X+	static complex double vector2;
X 
X 	if (phase1 == 0) {		// initialize
X 		phase1 = cexp((I * 2.0 * M_PI * IMD_TONE_1) / MIC_OUT_RATE);
X@@ -707,7 +708,7 @@
X 	transmit_udp(cSamples, count);
X }
X 
X-int quisk_process_microphone(int mic_sample_rate, complex * cSamples, int count)
X+int quisk_process_microphone(int mic_sample_rate, complex double * cSamples, int count)
X {
X 	int i, sample, maximum, interp, mic_interp;
X 	double d;
X@@ -721,18 +722,18 @@
X 	// Measure soundcard actual sample rate
X 	static time_t seconds = 0;
X 	static int total = 0;
X-	struct timeb tb;
X+	struct timeval tb;
X 	static double dtime;
X 
X-	ftime(&tb);
X+	gettimeofday(&tb);
X 	total += count;
X 	if (seconds == 0) {
X-		seconds = tb.time;
X-		dtime = tb.time + .001 * tb.millitm;
X+		seconds = tb.tv_sec;
X+		dtime = tb.tv_sec + .000001 * tb.tv_usec;
X 	}		
X-	else if (tb.time - seconds > 4) {
X-		printf("Mic soundcard rate %.3f\n", total / (tb.time + .001 * tb.millitm - dtime));
X-		seconds = tb.time;
X+	else if (tb.tv_sec - seconds > 4) {
X+		printf("Mic soundcard rate %.3f\n", total / (tb.tv_sec + .000001 * tb.tv_usec - dtime));
X+		seconds = tb.tv_sec;
X 		printf("backlog %d, count %d\n", backlog, count);
X 	}
X #endif
731fee37fbd81b951d2dad7cf7e405e7
echo x - quisk/files/patch-filter.h
sed 's/^X//' >quisk/files/patch-filter.h << '36624e2eb643b95c4471905fbafc99b1'
X--- filter.h.orig	2014-05-29 01:14:15.000000000 -0700
X+++ filter.h	2014-05-29 01:15:00.000000000 -0700
X@@ -1,17 +1,17 @@
X struct quisk_cFilter {
X 	double  * dCoefs;	// filter coefficients
X-	complex * cpxCoefs;	// make the complex coefficients from dCoefs
X+	complex double * cpxCoefs;	// make the complex coefficients from dCoefs
X 	int nBuf;		// dimension of cBuf
X 	int nTaps;		// dimension of dSamples, cSamples, dCoefs and cpxCoefs
X 	int counter;		// used to count samples for decimation
X-	complex * cSamples;	// storage for old samples
X-	complex * ptcSamp;	// next available position in cSamples
X-	complex * cBuf;		// auxillary buffer for interpolation
X+	complex double * cSamples;	// storage for old samples
X+	complex double * ptcSamp;	// next available position in cSamples
X+	complex double * cBuf;		// auxillary buffer for interpolation
X } ;
X 
X struct quisk_dFilter {
X 	double  * dCoefs;	// filter coefficients
X-	complex * cpxCoefs;	// make the complex coefficients from dCoefs
X+	complex double * cpxCoefs;	// make the complex coefficients from dCoefs
X 	int nBuf;		// dimension of dBuf
X 	int nTaps;		// dimension of dSamples, cSamples, dCoefs and cpxCoefs
X 	int counter;		// used to count samples for decimation
X@@ -21,11 +21,11 @@
X } ;
X 
X struct quisk_cHB45Filter {   // Complex half band decimate by 2 filter with 45 coefficients
X-	complex * cBuf;		// auxillary buffer for interpolation
X+	complex double * cBuf;		// auxillary buffer for interpolation
X 	int nBuf;		// dimension of cBuf
X 	int toggle;
X-	complex samples[22];
X-	complex center[11];
X+	complex double samples[22];
X+	complex double center[11];
X } ;
X 
X struct quisk_dHB45Filter {   // Real half band decimate by 2 filter with 45 coefficients
X@@ -39,17 +39,17 @@
X void quisk_filt_cInit(struct quisk_cFilter *, double *, int);
X void quisk_filt_dInit(struct quisk_dFilter *, double *, int);
X void quisk_filt_tune(struct quisk_dFilter *, double, int);
X-complex quisk_dC_out(double, struct quisk_dFilter *);
X+complex double quisk_dC_out(double, struct quisk_dFilter *);
X double quisk_dD_out(double, struct quisk_dFilter *);
X-int quisk_cInterpolate(complex *, int, struct quisk_cFilter *, int);
X+int quisk_cInterpolate(complex double *, int, struct quisk_cFilter *, int);
X int quisk_dInterpolate(double *, int, struct quisk_dFilter *, int);
X-int quisk_cDecimate(complex *, int, struct quisk_cFilter *, int);
X+int quisk_cDecimate(complex double *, int, struct quisk_cFilter *, int);
X int quisk_dDecimate(double *, int, struct quisk_dFilter *, int);
X-int quisk_cDecim2HB45(complex *, int, struct quisk_cHB45Filter *);
X+int quisk_cDecim2HB45(complex double *, int, struct quisk_cHB45Filter *);
X int quisk_dInterp2HB45(double *, int, struct quisk_dHB45Filter *);
X-int quisk_cInterp2HB45(complex *, int, struct quisk_cHB45Filter *);
X+int quisk_cInterp2HB45(complex double *, int, struct quisk_cHB45Filter *);
X int quisk_dFilter(double *, int, struct quisk_dFilter *);
X-int quisk_cFilter(complex *, int, struct quisk_cFilter *);
X+int quisk_cFilter(complex double *, int, struct quisk_cFilter *);
X 
X extern double quiskMicFilt48Coefs[325];
X extern double quiskMic5Filt48Coefs[424];
36624e2eb643b95c4471905fbafc99b1
echo x - quisk/files/patch-filter.c
sed 's/^X//' >quisk/files/patch-filter.c << 'f04ebc89159cbcec2839eee7ea638566'
X--- filter.c.orig	2014-05-29 01:15:26.000000000 -0700
X+++ filter.c	2014-05-29 01:17:13.000000000 -0700
X@@ -10,8 +10,8 @@
X {	// Prepare a new filter using coefs and taps.  Samples are complex.
X 	filter->dCoefs = coefs;
X 	filter->cpxCoefs = NULL;
X-	filter->cSamples = (complex *)malloc(taps * sizeof(complex));
X-	memset(filter->cSamples, 0, taps * sizeof(complex));
X+	filter->cSamples = (complex double *)malloc(taps * sizeof(complex double));
X+	memset(filter->cSamples, 0, taps * sizeof(complex double));
X 	filter->ptcSamp = filter->cSamples;
X 	filter->nTaps = taps;
X 	filter->counter = 0;
X@@ -37,11 +37,11 @@
X 	// freq is the center frequency / sample rate.  Reverse coef if ssb_upper == 0.
X 	// This is used for both quisk_dFilter and quisk_cFilter with a cast.
X 	int i;
X-	complex coef, tune;
X+	complex double coef, tune;
X 	double D;
X 
X 	if ( ! filter->cpxCoefs)
X-		filter->cpxCoefs = (complex *)malloc(filter->nTaps * sizeof(complex));
X+		filter->cpxCoefs = (complex double *)malloc(filter->nTaps * sizeof(complex double));
X 	tune = I * 2.0 * M_PI * freq;
X 	D = (filter->nTaps - 1.0) / 2.0;
X 	for (i = 0; i < filter->nTaps; i++) {
X@@ -53,10 +53,10 @@
X 	}
X }
X 
X-complex quisk_dC_out(double sample, struct quisk_dFilter * filter)
X+complex double quisk_dC_out(double sample, struct quisk_dFilter * filter)
X {
X-	complex csample;
X-	complex * ptCoef;
X+	complex double csample;
X+	complex double * ptCoef;
X 	double  * ptSample;
X 	int k;
X 
X@@ -77,11 +77,11 @@
X }
X 
X #if 0
X-complex quisk_cC_out(complex sample, struct quisk_cFilter * filter)
X+complex double quisk_cC_out(complex double sample, struct quisk_cFilter * filter)
X {
X-	complex csample;
X-	complex * ptCoef;
X-	complex  * ptSample;
X+	complex double csample;
X+	complex double * ptCoef;
X+	complex double * ptSample;
X 	int k;
X 
X 	// FIR bandpass filter; filter complex samples by complex coeffs.
X@@ -101,20 +101,20 @@
X }
X #endif
X 
X-int quisk_cInterpolate(complex * cSamples, int count, struct quisk_cFilter * filter, int interp)
X+int quisk_cInterpolate(complex double * cSamples, int count, struct quisk_cFilter * filter, int interp)
X {	// This uses the double coefficients of filter (not the complex).  Samples are complex.
X 	int i, j, k, nOut;
X 	double * ptCoef;
X-	complex * ptSample;
X-	complex csample;
X+	complex double * ptSample;
X+	complex double csample;
X 
X 	if (count > filter->nBuf) {	// increase size of sample buffer
X 		filter->nBuf = count * 2;
X 		if (filter->cBuf)
X 			free(filter->cBuf);
X-		filter->cBuf = (complex *)malloc(filter->nBuf * sizeof(complex));
X+		filter->cBuf = (complex double *)malloc(filter->nBuf * sizeof(complex double));
X 	}
X-	memcpy(filter->cBuf, cSamples, count * sizeof(complex));
X+	memcpy(filter->cBuf, cSamples, count * sizeof(complex double));
X 	nOut = 0;
X 	for (i = 0; i < count; i++) {
X 		// Put samples into buffer left to right.  Use samples right to left.
X@@ -171,12 +171,12 @@
X 	return nOut;
X }
X 
X-int quisk_cDecimate(complex * cSamples, int count, struct quisk_cFilter * filter, int decim)
X+int quisk_cDecimate(complex double * cSamples, int count, struct quisk_cFilter * filter, int decim)
X {	// This uses the double coefficients of filter (not the complex).
X 	int i, k, nOut;
X-	complex * ptSample;
X+	complex double * ptSample;
X 	double * ptCoef;
X-	complex csample;
X+	complex double csample;
X 
X 	nOut = 0;
X 	for (i = 0; i < count; i++) {
X@@ -273,16 +273,16 @@
X 	return nOut;
X }
X 
X-int quisk_cFilter(complex * cSamples, int count, struct quisk_cFilter * filter)
X+int quisk_cFilter(complex double * cSamples, int count, struct quisk_cFilter * filter)
X {	// Filter complex samples using the double coefficients of filter (not the complex).
X 	return quisk_cDecimate(cSamples, count, filter, 1);
X }
X 
X-int quisk_cDecim2HB45(complex * cSamples, int count, struct quisk_cHB45Filter * filter)
X+int quisk_cDecim2HB45(complex double * cSamples, int count, struct quisk_cHB45Filter * filter)
X {	// This uses the double coefficients of filter (not the complex).
X // Half band filter, sample rate 96 Hz, pass 16, center 24, stop 32, good BW 2/3, 45 taps.
X 	int i, nOut;
X-	complex * samples, * center;
X+	complex double * samples, * center;
X 	static double coef[12] = { 0.000018566625444266, -0.000118469698701817, 0.000457318798253456,
X 	-0.001347840471412094, 0.003321838571445455, -0.007198422696929033, 0.014211106939802483,
X 	-0.026424776824073383, 0.048414810444971007, -0.096214669073304823, 0.314881034738348550,
X@@ -294,12 +294,12 @@
X 	for (i = 0; i < count; i++) {
X 		if (filter->toggle == 0){
X 			filter->toggle = 1;
X-			memmove(center + 1, center, sizeof(complex) * 10);
X+			memmove(center + 1, center, sizeof(complex double) * 10);
X 			center[0] = cSamples[i];
X 		}
X 		else {
X 			filter->toggle = 0;
X-			memmove(samples + 1, samples, sizeof(complex) * 21);
X+			memmove(samples + 1, samples, sizeof(complex double) * 21);
X 			samples[0] = cSamples[i];
X 			// output a sample
X 			cSamples[nOut++] =
X@@ -354,11 +354,11 @@
X 	return nOut;
X }
X 
X-int quisk_cInterp2HB45(complex * cSamples, int count, struct quisk_cHB45Filter * filter)
X+int quisk_cInterp2HB45(complex double * cSamples, int count, struct quisk_cHB45Filter * filter)
X {  // Half-Band interpolation by 2
X 	int i, k, nOut, nCoef, nSamp;
X-	complex out;
X-	complex * samples;
X+	complex double out;
X+	complex double * samples;
X 	static double coef[12] = { 0.000018566625444266, -0.000118469698701817, 0.000457318798253456,
X 	-0.001347840471412094, 0.003321838571445455, -0.007198422696929033, 0.014211106939802483,
X 	-0.026424776824073383, 0.048414810444971007, -0.096214669073304823, 0.314881034738348550,
X@@ -368,15 +368,15 @@
X 		filter->nBuf = count * 2;
X 		if (filter->cBuf)
X 			free(filter->cBuf);
X-		filter->cBuf = (complex *)malloc(filter->nBuf * sizeof(complex));
X+		filter->cBuf = (complex double *)malloc(filter->nBuf * sizeof(complex double));
X 	}
X 	nCoef = 12;
X 	nSamp = (nCoef - 1) * 2;
X-	memcpy(filter->cBuf, cSamples, count * sizeof(complex));
X+	memcpy(filter->cBuf, cSamples, count * sizeof(complex double));
X 	samples = filter->samples;
X 	nOut = 0;
X 	for (i = 0; i < count; i++) {
X-		memmove(samples + 1, samples, (nSamp - 1) * sizeof(complex));
X+		memmove(samples + 1, samples, (nSamp - 1) * sizeof(complex double));
X 		samples[0] = filter->cBuf[i];
X 		cSamples[nOut++] = samples[nCoef - 1] * coef[nCoef - 1] * 2;
X 		out = 0;
f04ebc89159cbcec2839eee7ea638566
echo x - quisk/files/patch-quisk.h
sed 's/^X//' >quisk/files/patch-quisk.h << '42642fd01eb3ff5f9f3be7f6ae9e60c7'
X--- quisk.h.orig	2014-05-29 01:18:06.000000000 -0700
X+++ quisk.h	2014-05-29 01:18:41.000000000 -0700
X@@ -55,7 +55,7 @@
X 	unsigned int rate_max;
X 	unsigned int chan_min;		// min and max available number of channels
X 	unsigned int chan_max;
X-	complex dc_remove;			// filter to remove DC from samples
X+	complex double dc_remove;		// filter to remove DC from samples
X 	double save_sample;			// Used to delay the I or Q sample
X 	char msg1[QUISK_SC_SIZE];	// string for information message
X } ;
X@@ -132,38 +132,38 @@
X // radio data samples.
X typedef void (* ty_sample_start)(void);
X typedef void (* ty_sample_stop)(void);
X-typedef int  (* ty_sample_read)(complex *);
X+typedef int  (* ty_sample_read)(complex double *);
X 
X void quisk_open_sound(void);
X void quisk_close_sound(void);
X-int quisk_process_samples(complex *, int);
X+int quisk_process_samples(complex double *, int);
X void quisk_play_samples(double *, int);
X void quisk_play_zeros(int);
X void quisk_start_sound(void);
X int quisk_get_overrange(void);
X void quisk_mixer_set(char *, int, PyObject *, char *, int);
X int quisk_read_sound(void);
X-int quisk_process_microphone(int, complex *, int);
X+int quisk_process_microphone(int, complex double *, int);
X void quisk_open_mic(void);
X void quisk_close_mic(void);
X int quisk_open_key(const char *);
X void quisk_close_key(void);
X int quisk_is_key_down(void);
X void quisk_set_key_down(int);
X-int quisk_read_rx_udp(complex *);
X+int quisk_read_rx_udp(complex double *);
X void quisk_set_tx_mode(void);
X void ptimer(int);
X-int quisk_extern_demod(complex *, int, double);
X-void quisk_tmp_microphone(complex *, int);
X-void quisk_tmp_record(complex * , int, double);
X+int quisk_extern_demod(complex double *, int, double);
X+void quisk_tmp_microphone(complex double *, int);
X+void quisk_tmp_record(complex double * , int, double);
X 
X-int  quisk_read_alsa(struct sound_dev *, complex *);
X-void quisk_play_alsa(struct sound_dev *, int, complex *, int, double);
X+int  quisk_read_alsa(struct sound_dev *, complex double *);
X+void quisk_play_alsa(struct sound_dev *, int, complex double *, int, double);
X void quisk_start_sound_alsa(struct sound_dev **, struct sound_dev **);
X void quisk_close_sound_alsa(struct sound_dev **, struct sound_dev **);
X 
X-int  quisk_read_portaudio(struct sound_dev *, complex *);
X-void quisk_play_portaudio(struct sound_dev *, int, complex *, int, double);
X+int  quisk_read_portaudio(struct sound_dev *, complex double *);
X+void quisk_play_portaudio(struct sound_dev *, int, complex double *, int, double);
X void quisk_start_sound_portaudio(struct sound_dev **, struct sound_dev **);
X void quisk_close_sound_portaudio(void);
X 
42642fd01eb3ff5f9f3be7f6ae9e60c7
echo x - quisk/files/patch-extdemod.c
sed 's/^X//' >quisk/files/patch-extdemod.c << '802eaad2506ee2a1019069c424a08c4e'
X--- extdemod.c.orig	2014-05-29 01:24:20.000000000 -0700
X+++ extdemod.c	2014-05-29 01:24:38.000000000 -0700
X@@ -10,7 +10,7 @@
X //
X // NOTE:  NEW RELEASES OF QUISK WILL OVERWRITE THIS FILE!
X 
X-int quisk_extern_demod(complex * cSamples, int nSamples, double decim)
X+int quisk_extern_demod(complex double * cSamples, int nSamples, double decim)
X {	// Filter and demodulate the I/Q samples into audio play samples.
X // cSamples:	The input I/Q samples, and the output stereo play samples.
X // nSamples:	The number of input samples; maximum is SAMP_BUFFER_SIZE.
X@@ -23,9 +23,9 @@
X 
X 	int i;
X 	double d, di;
X-	complex cx;
X-	static complex fm_1 = 10;		// Sample delayed by one
X-	static complex fm_2 = 10;		// Sample delayed by two
X+	complex double cx;
X+	static complex double fm_1 = 10;	// Sample delayed by one
X+	static complex double fm_2 = 10;	// Sample delayed by two
X 
X 	if (fabs (decim - 1.0) > 0.001)		// no provision for decimation
X 		return 0;
802eaad2506ee2a1019069c424a08c4e
echo x - quisk/files/patch-sound.c
sed 's/^X//' >quisk/files/patch-sound.c << '9a65d966971c1e8aee7bd4352ac416c0'
X--- sound.c.orig	2014-05-29 01:26:55.000000000 -0700
X+++ sound.c	2014-05-29 01:27:27.000000000 -0700
X@@ -51,7 +51,7 @@
X static ty_sample_stop  pt_sample_stop;
X static ty_sample_read  pt_sample_read;
X 
X-static complex cSamples[SAMP_BUFFER_SIZE];			// Complex buffer for samples
X+static complex double cSamples[SAMP_BUFFER_SIZE];			// Complex buffer for samples
X 
X void ptimer(int counts)	// used for debugging
X {	// print the number of counts per second
X@@ -100,7 +100,7 @@
X 	*first = d;
X }
X 
X-static void correct_sample (struct sound_dev * dev, complex * cSamples, int nSamples)
X+static void correct_sample (struct sound_dev * dev, complex double * cSamples, int nSamples)
X {	// Correct the amplitude and phase
X 	int i;
X 	double re, im;
X@@ -116,7 +116,7 @@
X 	}
X }
X 
X-static int record_audio(complex * cSamples, int nSamples)
X+static int record_audio(complex double * cSamples, int nSamples)
X {  // Record the speaker audio to a WAV file, PCM, 16 bits, one channel
X 	static FILE * fp = NULL;	// TODO: correct for big-endian byte order
X 	static unsigned int samples=0, remain=0;
X@@ -188,7 +188,7 @@
X 	return 1;
X }
X 
X-static int record_samples(complex * cSamples, int nSamples)
X+static int record_samples(complex double * cSamples, int nSamples)
X {  // Record the samples to a WAV file, two float samples I/Q
X 	static FILE * fp = NULL;	// TODO: correct for big-endian byte order
X 	static unsigned int samples=0, remain=0;
X@@ -282,13 +282,13 @@
X int quisk_read_sound(void)	// Called from sound thread
X {  // called in an infinite loop by the main program
X 	int i, nSamples, mic_count, mic_interp, retval, is_cw, mic_sample_rate;
X-	complex tx_mic_phase;
X+	complex double tx_mic_phase;
X 	static double cwEnvelope=0;
X 	static double cwCount=0;
X-	static complex tuneVector = (double)CLIP32 / CLIP16;	// Convert 16-bit to 32-bit samples
X+	static complex double tuneVector = (double)CLIP32 / CLIP16;	// Convert 16-bit to 32-bit samples
X 	static struct quisk_cFilter filtInterp={NULL};
X #if DEBUG_MIC == 1
X-	complex tmpSamples[SAMP_BUFFER_SIZE];
X+	complex double tmpSamples[SAMP_BUFFER_SIZE];
X #endif
X 
X 	quisk_sound_state.interupts++;
9a65d966971c1e8aee7bd4352ac416c0
echo x - quisk/files/patch-sound_alsa.c
sed 's/^X//' >quisk/files/patch-sound_alsa.c << '7d10c8f822c176f4b411832730b77c96'
X--- sound_alsa.c.orig	2014-05-29 01:27:52.000000000 -0700
X+++ sound_alsa.c	2014-05-29 01:28:07.000000000 -0700
X@@ -24,7 +24,7 @@
X static int buffer4[SAMP_BUFFER_SIZE];				// Buffer for 4-byte samples from sound
X static int bufferz[SAMP_BUFFER_SIZE];				// Buffer for zero samples
X 
X-int quisk_read_alsa(struct sound_dev * dev, complex * cSamples)
X+int quisk_read_alsa(struct sound_dev * dev, complex double * cSamples)
X {	// Read sound samples from the ALSA soundcard.
X 	// Samples are converted to 32 bits with a range of +/- CLIP32 and placed into cSamples.
X 	int i;
X@@ -32,7 +32,7 @@
X 	short si, sq;
X 	int ii, qq;
X 	int nSamples;
X-	complex c;
X+	complex double c;
X 
X 	if (!dev->handle)
X 		return -1;
X@@ -163,7 +163,7 @@
X }
X 
X void quisk_play_alsa(struct sound_dev * playdev, int nSamples,
X-		complex * cSamples, int report_latency, double volume)
X+		complex double * cSamples, int report_latency, double volume)
X {	// Play the samples; write them to the ALSA soundcard.
X 	int i, n, index;
X 	snd_pcm_sframes_t frames, delay;
7d10c8f822c176f4b411832730b77c96
echo x - quisk/files/patch-sound_directx.c
sed 's/^X//' >quisk/files/patch-sound_directx.c << '1d411590ac61740523a59d86b3c21999'
X--- sound_directx.c.orig	2014-05-29 01:28:32.000000000 -0700
X+++ sound_directx.c	2014-05-29 01:28:53.000000000 -0700
X@@ -272,7 +272,7 @@
X }
X 
X 
X-int  quisk_read_alsa(struct sound_dev * dev, complex * cSamples)
X+int  quisk_read_alsa(struct sound_dev * dev, complex double * cSamples)
X {
X 	LPDIRECTSOUNDCAPTUREBUFFER ptBuf = (LPDIRECTSOUNDCAPTUREBUFFER)dev->buffer;
X 	HRESULT hr;
X@@ -282,7 +282,7 @@
X 	short si, sq, * pts;
X 	float fi, fq, * ptf;
X 	int   li, lq, * ptl;	// int must be 32 bits
X-	complex c;
X+	complex double c;
X 	int ii, qq, nSamples;
X 	int bytes, frames, poll_size, millisecs, bytes_per_frame, pass;
X 	
X@@ -429,7 +429,7 @@
X }
X 
X void quisk_play_alsa(struct sound_dev * dev, int nSamples,
X-		complex * cSamples, int report_latency, double volume)
X+		complex double * cSamples, int report_latency, double volume)
X {
X 	LPDIRECTSOUNDBUFFER ptBuf = (LPDIRECTSOUNDBUFFER)dev->buffer;
X 	DWORD playPos, writePos;	// hardware index into buffer
X@@ -585,7 +585,7 @@
X 
X 
X 
X-void quisk_play_portaudio(struct sound_dev * dev, int j, complex * samp, int i, double volume)
X+void quisk_play_portaudio(struct sound_dev * dev, int j, complex double * samp, int i, double volume)
X {
X }
X 
X@@ -597,7 +597,7 @@
X {
X }
X 
X-int  quisk_read_portaudio(struct sound_dev * dev, complex * samp)
X+int  quisk_read_portaudio(struct sound_dev * dev, complex double * samp)
X {
X 	return 0;
X }
1d411590ac61740523a59d86b3c21999
echo x - quisk/files/patch-sound_portaudio.c
sed 's/^X//' >quisk/files/patch-sound_portaudio.c << 'c86687029234560351738de1091895a9'
X--- sound_portaudio.c.orig	2014-05-29 01:29:14.000000000 -0700
X+++ sound_portaudio.c	2014-05-29 01:29:26.000000000 -0700
X@@ -19,13 +19,13 @@
X 
X static float fbuffer[SAMP_BUFFER_SIZE];		// Buffer for float32 samples from sound
X 
X-int quisk_read_portaudio(struct sound_dev * dev, complex * cSamples)
X+int quisk_read_portaudio(struct sound_dev * dev, complex double * cSamples)
X {	// Read sound samples from the soundcard.
X 	// Samples are converted to 32 bits with a range of +/- CLIP32 and placed into cSamples.
X 	int i;
X 	long avail;
X 	int nSamples;
X-	complex c;
X+	complex double c;
X 	PaError error;
X 	float fi, fq;
X 
X@@ -63,7 +63,7 @@
X 	return nSamples;
X }
X 
X-void quisk_play_portaudio(struct sound_dev * playdev, int nSamples, complex * cSamples,
X+void quisk_play_portaudio(struct sound_dev * playdev, int nSamples, complex double * cSamples,
X 		int report_latency, double volume)
X {	// play the samples; write them to the portaudio soundcard
X 	int i, n, index;
c86687029234560351738de1091895a9
echo x - quisk/files/patch-sdriqpkg_sdriq.c
sed 's/^X//' >quisk/files/patch-sdriqpkg_sdriq.c << '8c5c1f926b04100407bd670ef46f42f5'
X--- sdriqpkg/sdriq.c.orig	2014-05-29 01:31:05.000000000 -0700
X+++ sdriqpkg/sdriq.c	2014-05-29 01:31:20.000000000 -0700
X@@ -246,7 +246,7 @@
X // The ft245 driver does not have a circular buffer for input; bytes are just appended
X // to the buffer.  When all bytes are read and the buffer goes empty, the pointers are reset to zero.
X // Be sure to empty out the ft245 frequently so its buffer does not overflow.
X-static int sdr_recv(complex * samp, int sampsize)
X+static int sdr_recv(complex double * samp, int sampsize)
X {		// Read all data from the SDR-IQ and process it.
X 		// Return the number >= 0 of I/Q data samples that are available in samp.
X 	int k, res, item, navail, nSamples;
X@@ -748,7 +748,7 @@
X static void quisk_stop_sdriq(void)
X {
X 	int msec;
X-	complex samples[2048];
X+	complex double samples[2048];
X 
X 	for (msec = 0; msec < 1001; msec++) {
X 		if (msec % 100 == 0)
X@@ -767,7 +767,7 @@
X }
X 
X // Called in a loop to read samples; called from the sound thread.
X-static int quisk_read_sdriq(complex * cSamples)
X+static int quisk_read_sdriq(complex double * cSamples)
X {
X 	int length;
X 
8c5c1f926b04100407bd670ef46f42f5
echo x - quisk/pkg-descr
sed 's/^X//' >quisk/pkg-descr << '5ed9fbd9bef3977f32eff7465d31d586'
XThis is QUISK, a Software Defined Radio (SDR).
X- Quisk can control the HiQSDR. 
X- As a receiver it can use the SDR-IQ by RfSpace as a sample source.
X- As a receiver it can use your soundcard as a sample source.
X- Quisk can control SoftRock hardware for both receive and transmit.
X- As a transmitter it can accept microphone input and send that to your
X  transmitter for SSB operation.  For CW, QUISK can mute the audio and
X  substitute a side tone.
X
XWWW: http://james.ahlstrom.name/quisk/
5ed9fbd9bef3977f32eff7465d31d586
echo x - quisk/pkg-plist
sed 's/^X//' >quisk/pkg-plist << '3cb515e70a6086bdafef5ed6dd6c69b3'
Xbin/quisk
X%%PYTHON_SITELIBDIR%%/quisk/CHANGELOG.txt
X%%PYTHON_SITELIBDIR%%/quisk/Extensions.txt
X%%PYTHON_SITELIBDIR%%/quisk/README.txt
X%%PYTHON_SITELIBDIR%%/quisk/__init__.py
X%%PYTHON_SITELIBDIR%%/quisk/__init__.pyc
X%%PYTHON_SITELIBDIR%%/quisk/__init__.pyo
X%%PYTHON_SITELIBDIR%%/quisk/_quisk.so
X%%PYTHON_SITELIBDIR%%/quisk/docs.html
X%%PYTHON_SITELIBDIR%%/quisk/docs1.html
X%%PYTHON_SITELIBDIR%%/quisk/docs2.html
X%%PYTHON_SITELIBDIR%%/quisk/dxcluster.py
X%%PYTHON_SITELIBDIR%%/quisk/dxcluster.pyc
X%%PYTHON_SITELIBDIR%%/quisk/dxcluster.pyo
X%%PYTHON_SITELIBDIR%%/quisk/filters.py
X%%PYTHON_SITELIBDIR%%/quisk/filters.pyc
X%%PYTHON_SITELIBDIR%%/quisk/filters.pyo
X%%PYTHON_SITELIBDIR%%/quisk/help.html
X%%PYTHON_SITELIBDIR%%/quisk/help_vna.html
X%%PYTHON_SITELIBDIR%%/quisk/libusb.txt
X%%PYTHON_SITELIBDIR%%/quisk/license.txt
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/__init__.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/__init__.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/__init__.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf2.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf2.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf2.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf3.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf3.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf3.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf4.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf4.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf4.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf5.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf5.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf5.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf6.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf6.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/conf6.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_conf.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_conf.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_conf.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_conf_8600.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_conf_8600.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_conf_8600.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_hardware.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_hardware.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_hardware.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_widgets.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_widgets.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/quisk_widgets.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/scanner_widgets.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/scanner_widgets.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/scanner_widgets.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/startup.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/startup.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/startup.pyo
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/station_hardware.py
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/station_hardware.pyc
X%%PYTHON_SITELIBDIR%%/quisk/n2adr/station_hardware.pyo
X%%PYTHON_SITELIBDIR%%/quisk/portaudio.py
X%%PYTHON_SITELIBDIR%%/quisk/portaudio.pyc
X%%PYTHON_SITELIBDIR%%/quisk/portaudio.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_defaults.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_defaults.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_defaults.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_kx3.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_kx3.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_kx3.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_model.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_model.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_model.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_peaberry.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_peaberry.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_peaberry.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_sdr8600.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_sdr8600.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_sdr8600.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_sdriq.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_sdriq.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_sdriq.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_win.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_win.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_conf_win.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_fixed.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_fixed.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_fixed.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_hamlib.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_hamlib.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_hamlib.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_model.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_model.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_model.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_sdr8600.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_sdr8600.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_hardware_sdr8600.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_vna.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_vna.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_vna.pyo
X%%PYTHON_SITELIBDIR%%/quisk/quisk_widgets.py
X%%PYTHON_SITELIBDIR%%/quisk/quisk_widgets.pyc
X%%PYTHON_SITELIBDIR%%/quisk/quisk_widgets.pyo
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/__init__.py
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/__init__.pyc
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/__init__.pyo
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/quisk_hardware.py
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/quisk_hardware.pyc
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/quisk_hardware.pyo
X%%PYTHON_SITELIBDIR%%/quisk/sdriqpkg/sdriq.so
X%%PYTHON_SITELIBDIR%%/quisk/setup.py
X%%PYTHON_SITELIBDIR%%/quisk/setup.pyc
X%%PYTHON_SITELIBDIR%%/quisk/setup.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/__init__.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/__init__.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/__init__.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_fixed.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_fixed.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_fixed.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_rx_ensemble2.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_rx_ensemble2.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_rx_ensemble2.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_rx_tx_ensemble.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_rx_tx_ensemble.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/conf_rx_tx_ensemble.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/hardware_usb.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/hardware_usb.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/hardware_usb.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/hardware_usb_new.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/hardware_usb_new.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/hardware_usb_new.pyo
X%%PYTHON_SITELIBDIR%%/quisk/softrock/widgets_tx.py
X%%PYTHON_SITELIBDIR%%/quisk/softrock/widgets_tx.pyc
X%%PYTHON_SITELIBDIR%%/quisk/softrock/widgets_tx.pyo
X%%PYTHON_SITELIBDIR%%/quisk/usb/__init__.py
X%%PYTHON_SITELIBDIR%%/quisk/usb/__init__.pyc
X%%PYTHON_SITELIBDIR%%/quisk/usb/__init__.pyo
X%%PYTHON_SITELIBDIR%%/quisk/usb/_debug.py
X%%PYTHON_SITELIBDIR%%/quisk/usb/_debug.pyc
X%%PYTHON_SITELIBDIR%%/quisk/usb/_debug.pyo
X%%PYTHON_SITELIBDIR%%/quisk/usb/_interop.py
X%%PYTHON_SITELIBDIR%%/quisk/usb/_interop.pyc
X%%PYTHON_SITELIBDIR%%/quisk/usb/_interop.pyo
X%%PYTHON_SITELIBDIR%%/quisk/usb/core.py
X%%PYTHON_SITELIBDIR%%/quisk/usb/core.pyc
X%%PYTHON_SITELIBDIR%%/quisk/usb/core.pyo
X%%PYTHON_SITELIBDIR%%/quisk/usb/legacy.py
X%%PYTHON_SITELIBDIR%%/quisk/usb/legacy.pyc
X%%PYTHON_SITELIBDIR%%/quisk/usb/legacy.pyo
X%%PYTHON_SITELIBDIR%%/quisk/usb/util.py
X%%PYTHON_SITELIBDIR%%/quisk/usb/util.pyc
X%%PYTHON_SITELIBDIR%%/quisk/usb/util.pyo
X%%PYTHON_SITELIBDIR%%/quisk/windows.txt
X%%PYTHON_SITELIBDIR%%/quisk/winsound.txt
X@dirrmtry %%PYTHON_SITELIBDIR%%/quisk/n2adr
X@dirrmtry %%PYTHON_SITELIBDIR%%/quisk/sdriqpkg
X@dirrmtry %%PYTHON_SITELIBDIR%%/quisk/softrock
X@dirrmtry %%PYTHON_SITELIBDIR%%/quisk/usb
X@dirrmtry %%PYTHON_SITELIBDIR%%/quisk
3cb515e70a6086bdafef5ed6dd6c69b3
exit



>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405290858.s4T8wMqG077243>