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>