summaryrefslogtreecommitdiff
path: root/comms
diff options
context:
space:
mode:
authorMartin Wilke <miwi@FreeBSD.org>2014-06-03 08:21:05 +0000
committerMartin Wilke <miwi@FreeBSD.org>2014-06-03 08:21:05 +0000
commit173e37fe0d5b0b5cf499d01cc92130314fbe1c10 (patch)
treedcc71705fc78a662b00550a3e11cc1126beb1eb6 /comms
parentcongruity is a GUI application for programming Logitech(R) Harmony(TM) (diff)
lysdr, is a simple SDR program for amateur radio.
WWW: https://github.com/gordonjcp/lysdr PR: ports/190549 Submitted by: shurd@sasktel.net
Notes
Notes: svn path=/head/; revision=356307
Diffstat (limited to 'comms')
-rw-r--r--comms/Makefile1
-rw-r--r--comms/lysdr/Makefile33
-rw-r--r--comms/lysdr/distinfo2
-rw-r--r--comms/lysdr/files/Makefile15
-rw-r--r--comms/lysdr/files/cexp.c46
-rw-r--r--comms/lysdr/files/patch-audio_jack.c29
-rw-r--r--comms/lysdr/files/patch-filter.c47
-rw-r--r--comms/lysdr/files/patch-filter.h20
-rw-r--r--comms/lysdr/files/patch-gui.c31
-rw-r--r--comms/lysdr/files/patch-lysdr.c13
-rw-r--r--comms/lysdr/files/patch-sdr.c39
-rw-r--r--comms/lysdr/files/patch-sdr.h34
-rw-r--r--comms/lysdr/files/patch-smeter.c10
-rw-r--r--comms/lysdr/files/patch-smeter.h10
-rw-r--r--comms/lysdr/files/patch-waterfall.c109
-rw-r--r--comms/lysdr/files/patch-waterfall.h30
-rw-r--r--comms/lysdr/pkg-descr3
17 files changed, 472 insertions, 0 deletions
diff --git a/comms/Makefile b/comms/Makefile
index 666144028ae0..bb0913073df0 100644
--- a/comms/Makefile
+++ b/comms/Makefile
@@ -87,6 +87,7 @@
SUBDIR += lirc
SUBDIR += locator
SUBDIR += lrzsz
+ SUBDIR += lysdr
SUBDIR += mgetty+sendfax
SUBDIR += minicom
SUBDIR += mlan3
diff --git a/comms/lysdr/Makefile b/comms/lysdr/Makefile
new file mode 100644
index 000000000000..c6188ccac0b3
--- /dev/null
+++ b/comms/lysdr/Makefile
@@ -0,0 +1,33 @@
+# $FreeBSD$
+
+PORTNAME= lysdr
+PORTVERSION= 0.0.6
+CATEGORIES= comms hamradio
+MASTER_SITES= GH
+
+MAINTAINER= shurd@sasktel.net
+COMMENT= Lysdr SDR program for Unix
+
+LICENSE= GPLv2
+
+LIB_DEPENDS= libfftw3.so:${PORTSDIR}/math/fftw3 \
+ libjack.so:${PORTSDIR}/audio/jack
+
+WRKSRC= ${WRKDIR}/gordonjcp-lysdr-46d31fe
+USE_GITHUB= yes
+GH_ACCOUNT= gordonjcp
+GH_COMMIT= 46d31fe
+GH_TAGNAME= stable-0
+
+USES= pkgconfig
+USE_GNOME= gtk20
+PLIST_FILES= bin/lysdr
+
+post-patch:
+ ${CP} ${FILESDIR}/Makefile ${WRKSRC}
+ ${CP} ${FILESDIR}/cexp.c ${WRKSRC}
+
+do-install:
+ @${INSTALL_PROGRAM} ${WRKSRC}/lysdr ${STAGEDIR}${PREFIX}/bin/lysdr
+
+.include <bsd.port.mk>
diff --git a/comms/lysdr/distinfo b/comms/lysdr/distinfo
new file mode 100644
index 000000000000..39f2ec0130d2
--- /dev/null
+++ b/comms/lysdr/distinfo
@@ -0,0 +1,2 @@
+SHA256 (lysdr-0.0.6.tar.gz) = 747b04f0306a3258a02a41a208373a9f0e4c7a59c0c6215ac037c3b76d4e5969
+SIZE (lysdr-0.0.6.tar.gz) = 109559
diff --git a/comms/lysdr/files/Makefile b/comms/lysdr/files/Makefile
new file mode 100644
index 000000000000..6903040952f2
--- /dev/null
+++ b/comms/lysdr/files/Makefile
@@ -0,0 +1,15 @@
+# Makefile based on wscript
+# waf does deep magic ignoring our environment.
+
+PACKAGES= gtk+-2.0 jack fftw3
+CFLAGS+= `pkg-config -cflags ${PACKAGES}`
+LDFLAGS+= `pkg-config -libs ${PACKAGES}` -lm
+
+SRCS= gui.c sdr.c filter.c audio_jack.c smeter.c waterfall.c lysdr.c
+.if ${OSVERSION} < 900000
+SRCS+= cexp.c
+.endif
+PROG= lysdr
+WITHOUT_MAN= yes
+
+.include <bsd.prog.mk>
diff --git a/comms/lysdr/files/cexp.c b/comms/lysdr/files/cexp.c
new file mode 100644
index 000000000000..595e913be5d8
--- /dev/null
+++ b/comms/lysdr/files/cexp.c
@@ -0,0 +1,46 @@
+/* $NetBSD: cexp.c,v 1.1 2007/08/20 16:01:34 drochner Exp $ */
+
+/*-
+ * Copyright (c) 2007 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software written by Stephen L. Moshier.
+ * It is redistributed by the NetBSD Foundation by permission of the author.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <complex.h>
+#include <math.h>
+
+double complex
+cexp(double complex z)
+{
+ double complex w;
+ double r, x, y;
+
+ x = creal(z);
+ y = cimag(z);
+ r = exp(x);
+ w = r * cos(y) + r * sin(y) * I;
+ return w;
+}
diff --git a/comms/lysdr/files/patch-audio_jack.c b/comms/lysdr/files/patch-audio_jack.c
new file mode 100644
index 000000000000..4f5a20ad2f32
--- /dev/null
+++ b/comms/lysdr/files/patch-audio_jack.c
@@ -0,0 +1,29 @@
+--- audio_jack.c.orig 2011-11-26 16:01:22.000000000 -0800
++++ audio_jack.c 2014-06-02 02:37:35.000000000 -0700
+@@ -93,8 +93,9 @@
+ // save some info in the SDR
+ sdr->size = jack_get_buffer_size(client);
+ sdr->sample_rate = jack_get_sample_rate(client);
+- sdr->iqSample = g_new0(complex, sdr->size);
++ sdr->iqSample = g_new0(complex double, sdr->size);
+ sdr->output = g_new0(double, sdr->size);
++ return 0;
+ }
+
+ int audio_stop(sdr_data_t *sdr) {
+@@ -104,6 +105,7 @@
+ if (sdr->iqSample) g_free(sdr->iqSample);
+ if (sdr->output) g_free(sdr->output);
+
++ return 0;
+ }
+
+ int audio_connect(sdr_data_t *sdr, gboolean ci, gboolean co) {
+@@ -163,6 +165,7 @@
+ }
+ free(ports);
+ }
++ return 0;
+ }
+
+ /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */
diff --git a/comms/lysdr/files/patch-filter.c b/comms/lysdr/files/patch-filter.c
new file mode 100644
index 000000000000..a3436ef2c1cd
--- /dev/null
+++ b/comms/lysdr/files/patch-filter.c
@@ -0,0 +1,47 @@
+--- filter.c.orig 2011-11-26 16:01:22.000000000 -0800
++++ filter.c 2014-06-02 03:50:20.000000000 -0700
+@@ -22,16 +22,19 @@
+ #include <stdlib.h>
+ #include <complex.h>
+ #include <math.h>
++
++double complex cexp(double complex z);
++
+ #include "filter.h"
+ #include "sdr.h"
+
+ #define IS_ALMOST_DENORMAL(f) (fabs(f) < 3.e-34)
+
+-static void make_impulse(complex fir_imp[], float sample_rate, int taps, float bw, float centre) {
++static void make_impulse(complex double fir_imp[], float sample_rate, int taps, float bw, float centre) {
+
+ float K = bw * taps / sample_rate;
+ float w;
+- complex z;
++ complex double z;
+ int k, i=0;
+
+ float tune = 2.0 * M_PI * centre / sample_rate;
+@@ -57,7 +60,7 @@
+ filter_fir_t *filter = malloc(sizeof(filter_fir_t));
+ filter->taps = taps;
+ filter->size = size;
+- filter->impulse = malloc(sizeof(complex)*taps);
++ filter->impulse = malloc(sizeof(complex double)*taps);
+ filter->imp_I = malloc(sizeof(double)*taps);
+ filter->imp_Q = malloc(sizeof(double)*taps);
+ filter->buf_I = malloc(sizeof(double)*taps);
+@@ -89,11 +92,11 @@
+ }
+ }
+
+-void filter_fir_process(filter_fir_t *filter, complex *samples) {
++void filter_fir_process(filter_fir_t *filter, complex double *samples) {
+ // Perform an FIR filter on the data "in place"
+ // this routine is slow and has a horrible hack to avoid denormals
+ int i, j, k;
+- complex c;
++ complex double c;
+ double accI, accQ;
+ double *buf_I = filter->buf_I;
+ double *buf_Q = filter->buf_Q;
diff --git a/comms/lysdr/files/patch-filter.h b/comms/lysdr/files/patch-filter.h
new file mode 100644
index 000000000000..92614f03e520
--- /dev/null
+++ b/comms/lysdr/files/patch-filter.h
@@ -0,0 +1,20 @@
+--- filter.h.orig 2014-06-02 02:18:30.000000000 -0700
++++ filter.h 2014-06-02 02:18:39.000000000 -0700
+@@ -30,7 +30,7 @@
+
+ // FIR filter defs
+ typedef struct {
+- complex *impulse;
++ complex double *impulse;
+ double *buf_I;
+ double *buf_Q;
+ double *imp_I;
+@@ -43,7 +43,7 @@
+ filter_fir_t *filter_fir_new(int taps, int size);
+ void filter_fir_destroy(filter_fir_t *filter);
+ void filter_fir_set_response(filter_fir_t *filter, int sample_rate, float bw, float centre);
+-void filter_fir_process(filter_fir_t *filter, complex *samples);
++void filter_fir_process(filter_fir_t *filter, complex double *samples);
+ #endif
+
+ /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */
diff --git a/comms/lysdr/files/patch-gui.c b/comms/lysdr/files/patch-gui.c
new file mode 100644
index 000000000000..ec7e8c563602
--- /dev/null
+++ b/comms/lysdr/files/patch-gui.c
@@ -0,0 +1,31 @@
+--- gui.c.orig 2011-11-26 16:01:22.000000000 -0800
++++ gui.c 2014-06-02 03:45:03.000000000 -0700
+@@ -23,6 +23,8 @@
+ #include <complex.h>
+ #include <gtk/gtk.h>
+
++double complex cexp(double complex z);
++
+ #include "sdr.h"
+ #include "waterfall.h"
+ #include "smeter.h"
+@@ -31,7 +33,7 @@
+
+ // these are global so that the gui_update routine can fiddle with them
+ static GtkWidget *label;
+-static GtkWidget *wfdisplay;
++static SDRWaterfall *wfdisplay;
+ static GtkWidget *meter;
+
+ /*
+@@ -215,8 +217,8 @@
+ // 20m = 14075000
+ // 15m = 21045000
+ SDR_WATERFALL(wfdisplay)->centre_freq = sdr->centre_freq;
+- gtk_widget_set_size_request(wfdisplay, FFT_SIZE, 250);
+- gtk_box_pack_start(GTK_BOX(vbox), wfdisplay, TRUE, TRUE, 0);
++ gtk_widget_set_size_request(GTK_WIDGET(wfdisplay), FFT_SIZE, 250);
++ gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(wfdisplay), TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+ gtk_widget_show_all(mainWindow);
diff --git a/comms/lysdr/files/patch-lysdr.c b/comms/lysdr/files/patch-lysdr.c
new file mode 100644
index 000000000000..f307608ebbcb
--- /dev/null
+++ b/comms/lysdr/files/patch-lysdr.c
@@ -0,0 +1,13 @@
+--- lysdr.c.orig 2014-06-02 01:02:06.000000000 -0700
++++ lysdr.c 2014-06-02 01:02:18.000000000 -0700
+@@ -103,10 +103,6 @@
+
+ printf("lysdr starting\n");
+
+- // get the Gtk threads support going
+- if(!g_thread_supported())
+- g_thread_init(NULL);
+-
+ gdk_threads_init();
+ gdk_threads_enter();
+
diff --git a/comms/lysdr/files/patch-sdr.c b/comms/lysdr/files/patch-sdr.c
new file mode 100644
index 000000000000..2d132ca05de9
--- /dev/null
+++ b/comms/lysdr/files/patch-sdr.c
@@ -0,0 +1,39 @@
+--- sdr.c.orig 2011-11-26 16:01:22.000000000 -0800
++++ sdr.c 2014-06-02 03:45:08.000000000 -0700
+@@ -26,6 +26,8 @@
+ #include <fftw3.h>
+ #include <string.h>
+
++double complex cexp(double complex z);
++
+ #include "filter.h"
+ #include "sdr.h"
+
+@@ -56,7 +58,7 @@
+ // actually do the SDR bit
+ int i, j, k;
+ double y, accI, accQ;
+- complex c;
++ complex double c;
+ fft_data_t *fft = sdr->fft;
+ int size = sdr->size;
+ int block_size = MIN(size, FFT_SIZE); // ensure we don't try to copy a block larger than FFT_SIZE
+@@ -73,8 +75,8 @@
+
+ // copy this period to FFT buffer, or as much as will fit
+ // note that if the jack periodsize is greater than FFT_LEN, it will only copy FFT_LEN samples
+- memmove(fft->samples, fft->samples+block_size, sizeof(complex)*(FFT_SIZE-block_size)); // move the last lot up
+- memmove(fft->samples+FFT_SIZE-block_size, sdr->iqSample, sizeof(complex)*block_size); // copy the current block
++ memmove(fft->samples, fft->samples+block_size, sizeof(complex double)*(FFT_SIZE-block_size)); // move the last lot up
++ memmove(fft->samples+FFT_SIZE-block_size, sdr->iqSample, sizeof(complex double)*block_size); // copy the current block
+
+
+ // shift frequency
+@@ -123,6 +125,7 @@
+ }
+ break;
+ }
++ return 0;
+ }
+
+ void fft_setup(sdr_data_t *sdr) {
diff --git a/comms/lysdr/files/patch-sdr.h b/comms/lysdr/files/patch-sdr.h
new file mode 100644
index 000000000000..b44725869ab7
--- /dev/null
+++ b/comms/lysdr/files/patch-sdr.h
@@ -0,0 +1,34 @@
+--- sdr.h.orig 2011-11-26 16:01:22.000000000 -0800
++++ sdr.h 2014-06-02 02:33:44.000000000 -0700
+@@ -46,9 +46,9 @@
+ } fft_data_t;
+
+ typedef struct {
+- complex *iqSample; // the array of incoming samples
+- complex loVector; // local oscillator vector
+- complex loPhase; // local oscillator phase angle (sets tuning)
++ complex double *iqSample; // the array of incoming samples
++ complex double loVector; // local oscillator vector
++ complex double loPhase; // local oscillator phase angle (sets tuning)
+ gdouble *output; // pointer to output samples
+
+ GtkObject *tuning; // adjustment for tuning
+@@ -63,7 +63,7 @@
+ filter_fir_t *filter;
+
+ // things to keep track of between callbacks
+- complex dc_remove;
++ complex double dc_remove;
+ gfloat agc_gain;
+ gfloat agc_speed;
+ // jack parameters
+@@ -74,6 +74,9 @@
+
+ sdr_data_t *sdr_new();
+ int sdr_process(sdr_data_t *sdr);
++void sdr_destroy(sdr_data_t *sdr);
++void fft_setup(sdr_data_t *sdr);
++void fft_teardown(sdr_data_t *sdr);
+ #endif
+
+ /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */
diff --git a/comms/lysdr/files/patch-smeter.c b/comms/lysdr/files/patch-smeter.c
new file mode 100644
index 000000000000..dc6730aa35d9
--- /dev/null
+++ b/comms/lysdr/files/patch-smeter.c
@@ -0,0 +1,10 @@
+--- smeter.c.orig 2014-06-02 02:39:40.000000000 -0700
++++ smeter.c 2014-06-02 02:40:19.000000000 -0700
+@@ -85,6 +85,7 @@
+ cairo_fill(cr);
+
+ cairo_destroy(cr);
++ return TRUE;
+ }
+
+ void sdr_smeter_set_level(SDRSMeter *sm, gdouble level) {
diff --git a/comms/lysdr/files/patch-smeter.h b/comms/lysdr/files/patch-smeter.h
new file mode 100644
index 000000000000..196fc064613b
--- /dev/null
+++ b/comms/lysdr/files/patch-smeter.h
@@ -0,0 +1,10 @@
+--- smeter.h.orig 2014-06-02 02:51:37.000000000 -0700
++++ smeter.h 2014-06-02 02:51:54.000000000 -0700
+@@ -55,6 +55,7 @@
+
+ GtkWidget *sdr_smeter_new();
+ void sdr_smeter_set_level(SDRSMeter *sm, gdouble value);
++GType sdr_smeter_get_type(void);
+
+ #endif /* __SMETER_H */
+
diff --git a/comms/lysdr/files/patch-waterfall.c b/comms/lysdr/files/patch-waterfall.c
new file mode 100644
index 000000000000..287d39953742
--- /dev/null
+++ b/comms/lysdr/files/patch-waterfall.c
@@ -0,0 +1,109 @@
+--- waterfall.c.orig 2011-11-26 16:01:22.000000000 -0800
++++ waterfall.c 2014-06-02 03:12:20.000000000 -0700
+@@ -21,6 +21,7 @@
+ */
+
+ #include <math.h>
++#include <stdlib.h>
+ #include <string.h>
+
+ #include <gtk/gtk.h>
+@@ -38,8 +39,6 @@
+ static void sdr_waterfall_realize(GtkWidget *widget);
+ static void sdr_waterfall_unrealize(GtkWidget *widget);
+ static void sdr_waterfall_draw_scale(GtkWidget *widget);
+-void sdr_waterfall_set_lowpass(SDRWaterfall *wf, gdouble value);
+-void sdr_waterfall_set_highpass(SDRWaterfall *wf, gdouble value);
+
+ static void sdr_waterfall_class_init (SDRWaterfallClass *class) {
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(class);
+@@ -132,8 +131,7 @@
+
+ sdr_waterfall_set_scale(widget, wf->centre_freq);
+
+- g_assert(priv->mutex == NULL);
+- priv->mutex = g_mutex_new();
++ g_mutex_init(&priv->mutex);
+ gtk_adjustment_value_changed(wf->tuning);
+ }
+
+@@ -146,7 +144,7 @@
+ if (wf->scale) // we might not have a scale
+ g_object_unref(wf->scale);
+
+- g_mutex_free(priv->mutex);
++ g_mutex_clear(&priv->mutex);
+ GTK_WIDGET_CLASS(parent_class)->unrealize(widget);
+ }
+
+@@ -184,7 +182,7 @@
+ gtk_widget_queue_draw(GTK_WIDGET(wf));
+ }
+
+-GtkWidget *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size) {
++SDRWaterfall *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size) {
+ // call this with three Adjustments, for tuning, lowpass filter and highpass filter
+ // the tuning Adjustment should have its upper and lower bounds set to half the sample rate
+ SDRWaterfall *wf;
+@@ -209,7 +207,7 @@
+ G_CALLBACK (sdr_waterfall_lowpass_changed), wf);
+ g_signal_connect (hp_tune, "value-changed",
+ G_CALLBACK (sdr_waterfall_highpass_changed), wf);
+- return GTK_WIDGET(wf);
++ return wf;
+
+ }
+
+@@ -328,6 +326,7 @@
+ gtk_widget_queue_draw(widget);
+ priv->prelight = prelight;
+ }
++ return TRUE;
+ }
+
+ static gboolean sdr_waterfall_button_press(GtkWidget *widget, GdkEventButton *event) {
+@@ -358,6 +357,7 @@
+ gtk_widget_queue_draw(widget);
+ break;
+ }
++ return TRUE;
+ }
+
+ static gboolean sdr_waterfall_button_release(GtkWidget *widget, GdkEventButton *event) {
+@@ -392,6 +392,8 @@
+ case GDK_SCROLL_DOWN:
+ tuning += step;
+ break;
++ default:
++ break;
+ }
+
+ sdr_waterfall_set_tuning(wf, tuning);
+@@ -418,12 +420,12 @@
+ cairo_rectangle(cr, 0, 0, width, height);
+ cairo_clip(cr);
+
+- g_mutex_lock(priv->mutex);
++ g_mutex_lock(&priv->mutex);
+ gdk_cairo_set_source_pixmap(cr, wf->pixmap, 0, -priv->scroll_pos);
+ cairo_paint(cr);
+ gdk_cairo_set_source_pixmap(cr, wf->pixmap, 0, height-priv->scroll_pos);
+ cairo_paint(cr);
+- g_mutex_unlock(priv->mutex);
++ g_mutex_unlock(&priv->mutex);
+
+ // cursor is translucent when "off", opaque when prelit
+ cursor = priv->cursor_pos;
+@@ -486,10 +488,10 @@
+ (4*wf->fft_size)
+ );
+
+- g_mutex_lock(priv->mutex);
++ g_mutex_lock(&priv->mutex);
+ cairo_set_source_surface (cr, s_row, 0, priv->scroll_pos);
+ cairo_paint(cr);
+- g_mutex_unlock(priv->mutex);
++ g_mutex_unlock(&priv->mutex);
+
+ priv->scroll_pos++;
+ if (priv->scroll_pos >= wf->wf_height) priv->scroll_pos = 0;
diff --git a/comms/lysdr/files/patch-waterfall.h b/comms/lysdr/files/patch-waterfall.h
new file mode 100644
index 000000000000..5d338b3944fe
--- /dev/null
+++ b/comms/lysdr/files/patch-waterfall.h
@@ -0,0 +1,30 @@
+--- waterfall.h.orig 2011-11-26 16:01:22.000000000 -0800
++++ waterfall.h 2014-06-02 03:08:41.000000000 -0700
+@@ -74,7 +74,7 @@
+ gint drag;
+ gint click_pos;
+ gdouble bandspread;
+- GMutex *mutex;
++ GMutex mutex;
+ };
+
+ #define SDR_TYPE_WATERFALL (sdr_waterfall_get_type ())
+@@ -93,7 +93,7 @@
+ #define SCALE_HEIGHT 24
+ #define SCALE_TICK 5000
+
+-GtkWidget *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size);
++SDRWaterfall *sdr_waterfall_new(GtkAdjustment *tuning, GtkAdjustment *lp_tune, GtkAdjustment *hp_tune, gint sample_rate, gint fft_size);
+ float sdr_waterfall_get_tuning(SDRWaterfall *wf);
+ float sdr_waterfall_get_lowpass(SDRWaterfall *wf);
+ float sdr_waterfall_get_highpass(SDRWaterfall *wf);
+@@ -102,6 +102,9 @@
+ void sdr_waterfall_update(GtkWidget *widget, guchar *row);
+ void sdr_waterfall_set_scale(GtkWidget *widget, gint centre_freq);
+ void sdr_waterfall_filter_cursors(SDRWaterfall *wf);
++void sdr_waterfall_set_lowpass(SDRWaterfall *wf, gdouble value);
++void sdr_waterfall_set_highpass(SDRWaterfall *wf, gdouble value);
++GType sdr_waterfall_get_type(void);
+ #endif /* __WATERFALL_H */
+
+ /* vim: set noexpandtab ai ts=4 sw=4 tw=4: */
diff --git a/comms/lysdr/pkg-descr b/comms/lysdr/pkg-descr
new file mode 100644
index 000000000000..c4c0cc98c21e
--- /dev/null
+++ b/comms/lysdr/pkg-descr
@@ -0,0 +1,3 @@
+lysdr, is a simple SDR program for amateur radio.
+
+WWW: https://github.com/gordonjcp/lysdr