Qt based FM / Dab tuner

Overview

guglielmo

Guglielmo

Guglielmo implements a simple FM and DAB receiver based on Qt and the Qt-dab and sdr-j-fm packages.

The primary reason it is being developed is there is a lack of media centre quality Open Source Software Defined Radios: most of the packages out there focus more on hobbyist features, such as signal and content monitoring, leaving out media features like a volume slider or MPRIS control.

Yes, I have blown the ribbon tweeter fuses on my maggies because my previous go to SDR DAB receiver started at full blast, and I run my media centre headless: I don't really want to scramble for a VNC session when I want to stop the music, when I could simply use KDE connect on my phone.

There is also a distinct lack of FM SDR receivers, which is disappointing, since, at least in the UK, for reasons of cost, most stations transmit at a fairly poor bitRate, if not downright in mono, and FM stations seem to still be a better proposition in terms of sound quality.

Usage

The main window is divided in two: the right side changes depending on the mode, DAB or FM, the left side being common to both.

DAB

DAB screen

In DAB mode, top to bottom, there's the channel name, a list of all the services (AKA stations) in the current channel, a channel selector, and the previous and next buttons.

Previous and next switch to the previous or next service, if there's a previous or next service to select, or the previous or next channel if already at either end of the service list.

Or you can switch service or channel using the appropriate selectors.

FM

FM screen

FM mode sports a frequency display, and a large, old style, frequency knob.

Turn it either way to select the frequency.

The knob turns several times, much like in the analog days of old.

Below there's a scan down, scan up and stop scan buttons, which can be used to find the previous or next FM station.

Presets

presets

The preset controls are at the bottom of the right widget.

The central selector is used to choose the next preset.

Provided that there's a DAB service selected, or in FM mode, M+ adds the current service or frequency to the presets, whileM- removes the current station from the presets, if it had been previously added.

Left widget

On the top left, find the stereo, signal strength and signal quality indicators.

Green is good, red is bad, and blank, no station is playing.

Below, find the DAB or FM station name, and whatever text the station is currently choosing to display.

On the bottom you have the volume and squelch knobs, the DAB and FM buttons, and the play/stop and record/stop recording buttons.

The squelch is a control that silences the sound when the signal is poor.

The higher the value, the better the signal quality has to be for any sound to be played. It's only active in FM mode.

Settings

The burger menu button at the top right activates the about and settings windows.

settings screen

Currently there are 4 tabs, controlling

  • the UI interface
  • the sound output
  • FM settings
  • device settings

There's no tweakable DAB settings on offer.

UI

The actual themes depend on the platform and the build.

Sound

Choose the sound plugin (Qt or Portaudio), and in case of PortAudio, the output port.

FM

This controls some of the FM settings, most notably

  • the FM decoder
  • the de-emphasis filter (use 50µs unless you are in the US)
  • the parameters for the low pass filter

Device

This tab offers a combo box selecting any of the available devices, and for each of the devices

  • Automatic Gain Control
  • Device gain
  • LNA gain (if the device is equipped with a low noise amplifier)

The gains range from 0 to 100 and are remapped internally to suit each device. The defaults are mid range.

Note that when AGC is selected, any change to the IF gain will only take place after AGC is turned off.

Building

The executable is created either with qmake or cmake.

Using qmake, modify guglielmo.pro and comment out the devices you don't wish to include in the build.

Run qmake (or qmake-qt5, depending on the qt5 installation), then make, and you'll find the executable in the bin directory appropriate for your port (eg linux-bin).

For cmake:

mkdir build
cd build
cmake ..
make

If you want to build supporting only specific devices, use

cmake .. -DXXX=ON [-DYYY=ON ...]

where XXX, YYY, etc are the mnemonics for the devices to include.

Currently supported devices are

  • AIRSPY
  • SDRPLAY
  • RTLSDR
  • HACKRF
  • LIMESDR

The binary supplied with each version supports all available devices.

At this moment in time, the only device tested is the SDR RTL stick, and the only build linux.

TODO

  • integrate Qt audio with pulseaudio
  • debug support
  • MPRIS support
  • cleanup the source, remove objects that are not needed, consolidate buffer usage
  • make loading settings more resilient to duff values

Acknowledgements, copyright, etc...

The backends have wholesale lifted from Qt-dab and Sdr-j-fm by Jan van Katwijk and various other contributors.

I have merely integrated the two processors, adapted the devices to work against the guglielmo interface, fixed several bugs and improved several things.

The few icons not included in the Qt default style have been taken from freesvg.org.

My understanding is that they are in the public domain.

The guglielmo icon has been created by myself starting from public domain Guglielmo Marconi facing left portrait dated 1908.

As with the rest of this package, you are free to use it within the limits of the GPL v2 license - just make sure that you acknowledge my original work wherever you use it.

Comments
  • when i try cmake i got error

    when i try cmake i got error

    hi , please help , i try install it on my pi and when i try cmake .. -DXXX=ON -DYYY=ON ... -DZZZ=ON i got this error : CMake Error: The source directory "/home/pi/guglielmo/build/..." does not exist. Specify --help for usage, or press the help button on the CMake GUI. i follow this : mkdir build cd build after that i got error when i try cmake

    opened by khanfar 14
  • Hangs on 'a.exec()'

    Hangs on 'a.exec()'

    I've compiled Guglielmo using clang-cl on Windows (since MSVC is not able due to use of VLAs etc.). But running it, the whole program hangs inside the a.exec() inside main.cpp.

    For reference, I've only built with -DHAVE_RTLSDR to exclude any other issues. And replaced all __MINGW32__ with _WIN32. And the new rtlsdrHandler() seems to work fine:

    OK, functions seem to be loaded
    samplerate set to 2048000
    Supported gain values (16): 52.7 48.8 45.3 41.6 38.2 34.6 31.2 27.8 24.0 20.7 17.1 13.7 10.2 6.8 3.4 0.0
    gain will be set 50 to 278
    

    (although Jan's gain trace is way off).

    How can I figure out what the a.exec() blocking on?

    Another thing, what config-file does a -DCHOOSE_CONFIG expect? In my case I think it should become c:/Users/Gisle/.config/Guglielmo.conf. But no such file gets generated. Or do I have to create it myself? If so, how is supposed to look like?

    And BTW, the option -d N does nothing now.

    opened by gvanem 11
  • Compilation error on Ubuntu 22.04

    Compilation error on Ubuntu 22.04

    Compiling on Ubuntu 22.04 give an error: `[ 28%] Building CXX object CMakeFiles/guglielmo.dir/src/dialogs.cpp.o /mnt/Prog/ham/guglielmo/src/dialogs.cpp: In member function ‘void RadioInterface::handleSettingsAction()’: /mnt/Prog/ham/guglielmo/src/dialogs.cpp:120:44: error: ‘class Ui::settings’ has no member named ‘remoteComboBox’; did you mean ‘modeComboBox’? 120 | settingsDialog->connect(settingsUi.remoteComboBox, SIGNAL(activated(const QString &)), | ^~~~~~~~~~~~~~ | modeComboBox /mnt/Prog/ham/guglielmo/src/dialogs.cpp:123:24: error: ‘class Ui::settings’ has no member named ‘remoteComboBox’; did you mean ‘modeComboBox’? 123 | settingsUi.remoteComboBox->setCurrentIndex(0); | ^~~~~~~~~~~~~~ | modeComboBox /mnt/Prog/ham/guglielmo/src/dialogs.cpp:125:24: error: ‘class Ui::settings’ has no member named ‘remoteComboBox’; did you mean ‘modeComboBox’? 125 | settingsUi.remoteComboBox->setCurrentIndex(1); | ^~~~~~~~~~~~~~ | modeComboBox make[2]: *** [CMakeFiles/guglielmo.dir/build.make:1367: CMakeFiles/guglielmo.dir/src/dialogs.cpp.o] Errore 1 make[1]: *** [CMakeFiles/Makefile2:85: CMakeFiles/guglielmo.dir/all] Errore 2 make: *** [Makefile:136: all] Errore 2

    Regards

    Franco Spinelli`

    opened by frspin 2
  • build for specific devices

    build for specific devices

    Hello,

    for the ones that aren´t so fit with linux commans, can you please add how to complie for RTL-SDR, sdrplay, hackrf etc?

    I would like to use it with the rtl-sdr so these -DXXX=ON commands ... dunno with what I should replace that XXX, YYY, ZZZ letters.

    Thank you

    opened by catalinalb 2
  • build error: ‘nrBlock’ was not declared

    build error: ‘nrBlock’ was not declared

    /home/ondra/sdr/guglielmo/src/backend/msc-handler.cpp: In member function ‘void mscHandler::process_Msc(std::complex<float>*, int)’:
    /home/ondra/sdr/guglielmo/src/backend/msc-handler.cpp:108:35: error: ‘nrBlock’ was not declared in this scope; did you mean ‘nrBlocks’?
      108 |         if (blkno < 0 || blkno >= nrBlock)
          |                                   ^~~~~~~
          |                                   nrBlocks
    

    its just a typo, adding the "s" fixes the build

    opened by MightyPork 1
  • Shared Library target

    Shared Library target

    @marcogrecopriolo Hi there. Thanks for the cool project! I'm interested in adding a library target, factoring out the UI, and adding gRPC/Cap'nProto server (s). Decoupling the QT code from the backend. The goal is to use it in automotive grade Linux (AGL).

    opened by jwinarske 5
  • AppImage fail to start correctly

    AppImage fail to start correctly

    Missing libs for the HW. These libs should be inside of the AppImage but they aren't

    ./guglielmo-x86_64-v0.4.dab.receiver.AppImage 
    error report libsdrplay_api.so: cannot open shared object file: No such file or directory
    we could not load libmirsdrapi-rsp
    If that is not the device you were expecting, do not worry
    failed to open librtlsdr.so
    Error = librtlsdr.so: cannot open shared object file: No such file or directory
    failed to open libairspy.so
    Error = libairspy.so: cannot open shared object file: No such file or directory
    failed to open libLimeSuite.so
    failed to open libhackrf.so
    Segmentation fault
    
    opened by flux242 11
  • Packaging for Arch User Repository

    Packaging for Arch User Repository

    Hey, thank you for your great software. I've created an Archlinux Package Build and submitted it to Arch User Repository[0] so Arch Linux users can install your software with less hassle. I hope that is ok for you, ofc i link to your source repo have included the (hopefully) appropriate license info. If not please let me know. In regards to that i have a few questions:

    • As i only have an RTL-SDR to test i don't exactly know which libraries you require for other SDRs and what dependencies they have.
    • Do you have any preferences on the menu entry (.desktop file) that I'll create? Should i use the image in the README as the icon? Thanks in advance for your support

    [0] https://aur.archlinux.org/packages/guglielmo

    opened by Z3hka 1
  • rtl-sdr: reception works properly with gain to maximum

    rtl-sdr: reception works properly with gain to maximum

    Hi,

    I've just completed the build on ubuntu (21.04). The app starts without any problem, but it doesn't find stations with the default setup: I had to set the device gain to 99 (max), in order to find channels.

    Do you thin that this is normal? (device description here)

    It would be nice to have some kind of quick frequency navigation, to increase by 50 Mhz, or set the frequency tuning step value (it's a bit slow).

    DAB Reception works well, but with max gain, I see around 15 stations (welle.io finds around ~30).

    opened by funder7 3
  • segfault qhash.h: Directory not empty.

    segfault qhash.h: Directory not empty.

    Sometimes I get crashes when using the DAB multiplex dropdown.

    I caught it with gdb (release build), but it froze my desktop so I couldn't inspect it further (had to kill gdb from another TTY).

    IMG20220225161205

    This apparently does not happen in Debug build. Could be a race condition.

    opened by MightyPork 4
  • "Using QCharRef with an index pointing outside the valid range of a QString."

    I wanted to look at verbose logs, to investigate why playback sometimes abruptly stops with DAB.

    But with increased verbosity all I get is this warning from Qt many times per second.

    Screenshot_20220225_091525

    opened by MightyPork 2
Releases(v0.4)
Owner
Marco Greco
Used to run Italy's largest Radiation Therapy practice. ex Informix. Couchbase. Dives in warm waters. Takes pictures (badly) above and below the water line.
Marco Greco
A Linux Host-based Intrusion Detection System based on eBPF.

eHIDS 介绍 eBPF内核技术实现的HIDS demo. 功能实现: TCP网络数据捕获 UDP网络数据捕获 uprobe方式的DNS信息捕获 进程数据捕获 uprobe方式实现JAVA的RASP命令执行场景事件捕获 eBPF的go框架实现,针对kprobe\uprobe挂载方式,多类型even

CFC4N 291 Dec 30, 2022
The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design. This project aims to help C++ developers connect to and interact with services.

Welcome! The C++ REST SDK is a Microsoft project for cloud-based client-server communication in native code using a modern asynchronous C++ API design

Microsoft 7.2k Dec 30, 2022
WAFer is a C language-based software platform for scalable server-side and networking applications. Think node.js for C programmers.

WAFer WAFer is a C language-based ultra-light scalable server-side web applications framework. Think node.js for C programmers. Because it's written i

Riolet Corporation 693 Dec 6, 2022
Zyre - an open-source framework for proximity-based peer-to-peer applications

Zyre - Local Area Clustering for Peer-to-Peer Applications Linux & MacOSX Windows Contents Overview Scope and Goals Ownership and License Using Zyre B

The ZeroMQ project 813 Jan 3, 2023
an esp32 based minecraft server!

esp32-minecraft-server this is an open source implementation of the minecraft server to be run on a esp32. prerequisites esp32 pc with platformio inst

Nik 38 Dec 17, 2022
The purpose of this application is to allow a chronological shuffling of tv shows. The selected TV Shows maybe shuffled however the episodes will be selected based on next unwatched.

TvShuffleForPlex Description The purpose of this application is to allow a chronological shuffling of tv shows. The selected TV Shows maybe shuffled h

null 16 Apr 4, 2022
Drogon: A C++14/17 based HTTP web application framework running on Linux/macOS/Unix/Windows

English | 简体中文 | 繁體中文 Overview Drogon is a C++14/17-based HTTP application framework. Drogon can be used to easily build various types of web applicat

An Tao 8.5k Jan 5, 2023
Linux Application Level Firewall based on eBPF and NFQUEUE.

eBPFSnitch eBPFSnitch is a Linux Application Level Firewall based on eBPF and NFQUEUE. It is inspired by OpenSnitch, and Douane, but utilizing modern

Harpo Roeder 665 Dec 29, 2022
A lightweight Universal Windows proxy app based on https://github.com/eycorsican/leaf

Maple A lightweight Universal Windows proxy app based on https://github.com/eycorsican/leaf Features Configuration management Outbound network adapter

YtFlow 784 Jan 6, 2023
Jellyfin Desktop Client based on Plex Media Player

Jellyfin Media Player Based on (but not affiliated with) Plex Media Player. Please see: Corresponding web client: Repo Release API Docs in client-api.

Ian Walton 1.3k Dec 27, 2022
Ultra-lightweight web browser based on Qt Ultralight webview, powered by Ultralight HTML renderer

Qt Ultralight Browser This is an ultra-lightweight web browser powered by the Ultralight web engine embedded in Qt 5 app as a custom webview widget -

niu tech 43 Jan 7, 2023
Qt Based WhatsApp Client

WhatSie WhatSie is Light, feature rich WhatsApp web client written in Qt and not on Electron. A simple & beautiful desktop client for WhatsApp Web. Ch

Keshav Bhatt 691 Dec 27, 2022
Minecraft plugin framework based on stdout and rcon.

extmc Minecraft plugin framework based on stdout and rcon. Features Plugin system. Multithreaded. Almost all settings can be reloaded at runtime. Requ

YuutaW's Technical Minecraft Server 8 Mar 28, 2022
A linux based file-transfer system in terminal. Share Files Over A Network

Introduction A linux based file-transfer system in terminal. Share Files Over A Network Note This Project Is Not Fully Completed Yet But You Are Free

notaweeb 8 Sep 20, 2021
An MQTT-based Virtual Wall for ESP8266 Devices and Gerber files to make the IR hat; this code and board can easily be adapted to be ANY infrared controller/remote!

Roomba-Virtual-Wall-ESP8266-MQTT An MQTT-based Virtual Wall for ESP8266 Devices I made this based off of the IRSend, IRremoteESP8266, and EspMQTTClien

null 8 Sep 20, 2021
This repository to emulate the progression on World of Warcraft (AzerothCore) based servers, from the version 3.0 to 3.3.5a

WoltkProgression Author: Silker This repository contains all the files required to emulate the progression on World of Warcraft private servers runnin

Silker 14 Dec 14, 2022
Tuya MCU SDK Arduino Library is developed based on the Tuya Wi-Fi general integration solution

Tuya MCU SDK Arduino Library is developed based on the Tuya Wi-Fi general integration solution. The device's MCU is connected to a Wi-Fi module through a serial port to implement a network connection. The development is based on general firmware, which supports the adaptative 9600 and115200 baud rate

Tuya 85 Dec 28, 2022
A VPN client for Android based on OpenVPN made with Jetpack Compose.

Gear VPN - Free, Secure & Open sourced VPN Tech Stack Jetpack Compose - Google's new UI toolkit for developing native Android apps. Navigator-Compose

Kaustubh Patange 86 Dec 23, 2022
a lightweight and performant multicast DNS (mDNS) reflector with modern design, supports zone based reflection and IPv6

mDNS Reflector mDNS Reflector (mdns-reflector) is a lightweight and performant multicast DNS (mDNS) reflector with a modern design. It reflects mDNS q

Yuxiang Zhu 90 Dec 10, 2022