ports/190366: New port: comms/quisk A Software Defined Radio
Stephen Hurd
shurd at sasktel.net
Thu May 29 09:00:00 UTC 2014
>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 at 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 at sasktel.net>
X# $FreeBSD: $
X
XPORTNAME= quisk
XPORTVERSION= 3.6.16
XCATEGORIES= comms hamradio
XMASTER_SITES= http://james.ahlstrom.name/quisk/
X
XMAINTAINER= shurd at 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 at dirrmtry %%PYTHON_SITELIBDIR%%/quisk/n2adr
X at dirrmtry %%PYTHON_SITELIBDIR%%/quisk/sdriqpkg
X at dirrmtry %%PYTHON_SITELIBDIR%%/quisk/softrock
X at dirrmtry %%PYTHON_SITELIBDIR%%/quisk/usb
X at dirrmtry %%PYTHON_SITELIBDIR%%/quisk
3cb515e70a6086bdafef5ed6dd6c69b3
exit
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-ports-bugs
mailing list