New Upstream Release - welle.io
Ready changes
Summary
Merged new upstream version: 2.4 (was: 2.2).
Resulting package
Built on 2022-03-14T18:25 (took 9m8s)
The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:
apt install -t fresh-releases welle.io-dbgsymapt install -t fresh-releases welle.io
Lintian Result
Diff
diff --git a/.appveyor.yml b/.appveyor.yml
index d3bd40f..870467b 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -32,10 +32,10 @@ build_script:
after_build:
# Prepare welle binary files
- md bin
- - copy src\welle-cli\release\welle-cli.exe bin
+ #- copy src\welle-cli\release\welle-cli.exe bin
- copy src\welle-gui\release\welle-io.exe bin
- - copy ..\welle-io\src\welle-cli\index.html bin
- - copy ..\welle-io\src\welle-cli\index.js bin
+ #- copy ..\welle-io\src\welle-cli\index.html bin
+ #- copy ..\welle-io\src\welle-cli\index.js bin
# Create installer
- cd ..\welle-io\windows\
@@ -52,17 +52,23 @@ after_build:
deploy:
# Upload it to BinTray
- - provider: BinTray
- username: albrechtl
- api_key:
- secure: i7ksq/PodhXDzjw7trN/y00EA6U4tZ9m4EGOFDv736Nrvb6lpvG8jtXwTV4cPOtV
- subject: albrechtl
- repo: welle.io
- package: welle.io_nightly
- version: '%file_version%'
- publish: true
- override: true
- explode: true
+ #- provider: BinTray
+ # username: albrechtl
+ # api_key:
+ # secure: i7ksq/PodhXDzjw7trN/y00EA6U4tZ9m4EGOFDv736Nrvb6lpvG8jtXwTV4cPOtV
+ # subject: albrechtl
+ # repo: welle.io
+ # package: welle.io_nightly
+ # version: '%file_version%'
+ # publish: true
+ # override: true
+ # explode: true
+ provider: FTP
+ protocol: ftps
+ host: welle-io-nightlies.albrechtloh.de
+ username: welle-ci
+ password:
+ secure: Hu/HfMhc0Uhq0WOFM49YTUqoBvbXx49fMg93bOPKVhI=
after_deploy:
# Backup: Upload it to transfer.sh
diff --git a/.bintray_delete_old_version.py b/.bintray_delete_old_version.py
deleted file mode 100644
index 9f8a380..0000000
--- a/.bintray_delete_old_version.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright (C) 2018
-# Albrecht Lohofener (albrechtloh@gmx.de)
-#
-# This file is part of the welle.io.
-# Many of the ideas as implemented in welle.io are derived from
-# other work, made available through the GNU general Public License.
-# All copyrights of the original authors are recognized.
-#
-# welle.io is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# welle.io is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with welle.io; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-import requests
-import json
-import sys
-
-bintray_api = 'https://api.bintray.com'
-#bintray_user = 'albrechtl'
-#bintray_pass = '<secret>'
-#bintray_package = '/packages/albrechtl/welle.io/welle.io_next_nightly'
-#keep_last_version = 20
-
-if len(sys.argv) != 4 + 1:
- print('Error: The number of parameters is != 4')
- exit(-1)
-
-bintray_user = sys.argv[1]
-bintray_pass = sys.argv[2]
-bintray_package = sys.argv[3]
-keep_last_version = int(sys.argv[4])
-
-# Get all versions
-r = requests.get(bintray_api + bintray_package, auth=(bintray_user, bintray_pass))
-
-# Decode data
-data = json.loads(r.text)
-
-# Extract versions
-versions = data['versions']
-
-# Extract versions to delete
-delete_versions = versions[keep_last_version:len(versions)]
-
-# Iterate over all versions to delete
-for version in delete_versions:
- print('Deleting version ' + version)
-
- # Delete version
- r = requests.delete(bintray_api + bintray_package + '/versions/' + version, auth=(bintray_user, bintray_pass))
-
- # Check status
- if r.status_code != 200:
- print('Error while deleting. Status {}'.format(r.status_code))
- else:
- delete_status = json.loads(r.text)
- print('Status: ' + delete_status['message'])
-
diff --git a/.travis-bintray-deploy.json.template b/.travis-bintray-deploy.json.template
deleted file mode 100644
index 0af824a..0000000
--- a/.travis-bintray-deploy.json.template
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "package": {
- "name": "welle.io_nightly", // Bintray package name
- "repo": "welle.io", // Bintray repository name
- "subject": "albrechtl" // Bintray subject (user or organization)
- },
- "version": {
- "name": "${VERSION}"
- },
- "files": [
- {"includePattern": ".(.*welle-io.*.(AppImage|dmg))", "uploadPattern": "$1"},
- {"includePattern": ".(.*welle-io-cli.*.AppImage)", "uploadPattern": "$1"}
- ],
- "publish": true
-}
-
diff --git a/.travis.yml b/.travis.yml
index b21edb9..9e99cc4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,20 @@ dist: bionic
language: cpp
compiler: gcc
+#env:
+# # "BINTRAY_KEY=<secure>"
+# - secure: "AjycfSfIztFeat6AO3SETSFW9Xd0AUt17hg87sEo8pSPO3SILq6bKS5Pfe4Bdo3Za32BvGzeJaOZ9EEVtzweuYJwsBejVfk2lxiBH5RKoBVrHpJLXDNj7MUt2ezb734bjFFt3+lMG84vSCqioNMcYwlHcqCChiTT529NZhaGMsDFzF5NimJZl0LGcEQlaTxTfeCKwSk+apHw5rQes2I2Jf9icweUGe/VOOVmYjDTiPWKcBEwBvfV5vabr5btCgUY8zK5451x/35API2Hbq7o0hNxqvwQUFI54jZwqfR4DOA1V/Nk7rdc34Fe+xgKSoBmHC0RgCIbXw1erEkn31Y0+tLBVxa971FB+y7L+5ZEaqw9UolT0PM5LHZmWUA60A5JlvsFOr0urid8lk0g5mdGF4aHEy2O5rDOMbwE11MpTEkDDbgE6uSD0/aubTJYPu24yMlBrP1lz10Sltg+YLi5hshhzRmd4iWTKuEy4jly1SdOKjjdbLCzlAnsF9Ta0a/lfumOd2lmELhYKhFLuVTCWZFvjpJyziCIFLVs4refDbDrsdfE+CaJedP/uBDGoBp4Hg6aug+66zKPybVzODqR2uIa3I7ACM3l/GdJcGg+1AH1T/ievq4rQ52T3MspevFxQmevuA9vvgOVko79PDrW1xbp+oQPTk0/pODNjVvrZFk="
+
env:
- # "BINTRAY_KEY=<secure>"
- - secure: "AjycfSfIztFeat6AO3SETSFW9Xd0AUt17hg87sEo8pSPO3SILq6bKS5Pfe4Bdo3Za32BvGzeJaOZ9EEVtzweuYJwsBejVfk2lxiBH5RKoBVrHpJLXDNj7MUt2ezb734bjFFt3+lMG84vSCqioNMcYwlHcqCChiTT529NZhaGMsDFzF5NimJZl0LGcEQlaTxTfeCKwSk+apHw5rQes2I2Jf9icweUGe/VOOVmYjDTiPWKcBEwBvfV5vabr5btCgUY8zK5451x/35API2Hbq7o0hNxqvwQUFI54jZwqfR4DOA1V/Nk7rdc34Fe+xgKSoBmHC0RgCIbXw1erEkn31Y0+tLBVxa971FB+y7L+5ZEaqw9UolT0PM5LHZmWUA60A5JlvsFOr0urid8lk0g5mdGF4aHEy2O5rDOMbwE11MpTEkDDbgE6uSD0/aubTJYPu24yMlBrP1lz10Sltg+YLi5hshhzRmd4iWTKuEy4jly1SdOKjjdbLCzlAnsF9Ta0a/lfumOd2lmELhYKhFLuVTCWZFvjpJyziCIFLVs4refDbDrsdfE+CaJedP/uBDGoBp4Hg6aug+66zKPybVzODqR2uIa3I7ACM3l/GdJcGg+1AH1T/ievq4rQ52T3MspevFxQmevuA9vvgOVko79PDrW1xbp+oQPTk0/pODNjVvrZFk="
+ global:
+ - ANDROID_SDK_CMDLINE_TOOLS_ZIP="commandlinetools-linux-7583922_latest.zip"
+ - ANDROID_SDK_CMDLINE_TOOLS_SHA256="124f2d5115eee365df6cf3228ffbca6fc3911d16f8025bebd5b1c6e2fcfa7faf"
+ - ANDROID_BUILD_TOOLS_VER="28.0.3" # Same as buildToolsVersion in src/welle-gui/android/build.gradle
+ - ANDROID_PLATFORM_VER="android-30"
+ - ANDROID_NDK_ZIP="android-ndk-r20b-linux-x86_64.zip"
+ - ANDROID_NDK_SHA1="d903fdf077039ad9331fb6c3bee78aa46d45527b"
+ - ANDROID_NDK_MOUNT_DIR="${HOME}/r20b"
+ - ANDROID_NDK_BASE_DIR="android-ndk-r20b"
script:
- DATE=`date +%Y%m%d`
@@ -51,23 +62,30 @@ jobs:
before_install:
# QT
- - sudo add-apt-repository ppa:beineri/opt-qt-5.14.2-bionic -y
+ - sudo add-apt-repository ppa:beineri/opt-qt-5.15.2-bionic -y
# SoapySDR
- sudo add-apt-repository ppa:myriadrf/drivers -y
- sudo apt-get update -qq
install:
- - sudo apt-get -y install gcc g++
- - sudo apt-get -y install libusb-1.0-0-dev pkg-config libmp3lame-dev libmpg123-dev qt514base qt514declarative qt514quickcontrols qt514quickcontrols2 qt514charts-no-lgpl qt514graphicaleffects qt514multimedia libpulse0 libfaad-dev libfftw3-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev
- - source /opt/qt514/bin/qt514-env.sh
+ - sudo apt-get -y install sshpass
+
+ # For AppImage
+ - sudo apt-get -y install libusb-1.0-0-dev pkg-config libmp3lame-dev libmpg123-dev qt515base qt515declarative qt515quickcontrols qt515quickcontrols2 qt515charts-no-lgpl qt515graphicaleffects qt515multimedia libpulse0 libfaad-dev libfftw3-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev
+ - source /opt/qt515/bin/qt515-env.sh
+
+ # For Flatpak
+ - sudo add-apt-repository ppa:alexlarsson/flatpak -y
+ - sudo apt-get update -qq
+ - sudo apt-get -y install flatpak-builder elfutils
+ - sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
+ - sudo flatpak install -y flathub org.kde.Sdk//5.15 org.kde.Platform//5.15
after_success:
- sudo ldconfig
# Get linuxdeploy
- # Seems to be that current 22. August 2020 linuxdeploy version is buggy
- #- sudo wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -P /usr/local/bin
- - sudo wget https://artifacts.assassinate-you.net/artifactory/list/linuxdeploy/travis-456/linuxdeploy-x86_64.AppImage -P /usr/local/bin
+ - sudo wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -P /usr/local/bin
- sudo chmod +x /usr/local/bin/linuxdeploy-x86_64.AppImage
- sudo wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage -P /usr/local/bin
- sudo chmod +x /usr/local/bin/linuxdeploy-plugin-qt-x86_64.AppImage
@@ -99,17 +117,103 @@ jobs:
# Create welle-cli AppImage
- linuxdeploy-x86_64.AppImage --appdir ./appdir-cli --output appimage
- mv welle.io-cli-"$GIT_HASH"-x86_64.AppImage "$DATE"_"$GIT_HASH"_Linux_welle-io-cli-x86_64.AppImage
+
+ # Create welle-gui Flatpak
+ - sudo flatpak-builder --repo=wellerepo --force-clean fp_build io.welle.welle-gui.json
+ - sudo flatpak --user remote-add --no-gpg-verify welle-repo wellerepo
+ - sudo flatpak --user install welle-repo io.welle.welle-gui --assumeyes
+ - flatpak build-bundle wellerepo welle-io.flatpak io.welle.welle-gui
+ - mv welle-io.flatpak "$DATE"_"$GIT_HASH"_Linux_welle-io-x86_64.flatpak
+
+ # Upload
+ - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Linux_welle-io-x86_64.AppImage ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+ - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Linux_welle-io-cli-x86_64.AppImage ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+ - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Linux_welle-io-x86_64.flatpak ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+
+ - os: linux
+
+ before_install:
+ - export JOB_ID=2020761
+ - sudo apt-get -y install wget
+ - wget https://salsa.debian.org/bastif/qt-android/-/jobs/$JOB_ID/artifacts/raw/aptly/public-key.asc
+ - sudo cp public-key.asc /etc/apt/trusted.gpg.d/
+ - sudo add-apt-repository "deb https://salsa.debian.org/bastif/qt-android/-/jobs/$JOB_ID/artifacts/raw/aptly stretch main" -y
+ - sudo apt-get update -qq
+
+ install:
+ - sudo apt-get -y install apt-transport-https ca-certificates default-jdk default-jre-headless eatmydata fuse-zip sshpass
+
+ # qt-android 5.15
+
+ - sudo apt-get -y -t stretch install qt-android-5.15
+
+ # Android SDK Command Line Tools
+ - wget https://dl.google.com/android/repository/$ANDROID_SDK_CMDLINE_TOOLS_ZIP
+ - echo "$ANDROID_SDK_CMDLINE_TOOLS_SHA256 $ANDROID_SDK_CMDLINE_TOOLS_ZIP" | sha256sum -c
+ # need to symlink /etc/mtab to work around a fusermount(1) deficiency (copied from /usr/lib/python3/dist-packages/reprotest/presets.py)
+ - test -c /dev/fuse || mknod -m 666 /dev/fuse c 10 229
+ - test -f /etc/mtab || ln -s ../proc/self/mounts /etc/mtab
+ - mkdir -p ${HOME}/cmdline-tools
+ - fuse-zip -r $ANDROID_SDK_CMDLINE_TOOLS_ZIP ${HOME}/cmdline-tools
+
+ # Android SDK Platform 30
+ - mkdir -p ${HOME}/android-sdk
+ - test -e ${HOME}/android-sdk/platforms/$ANDROID_PLATFORM_VER/source.properties || echo "y" | ${HOME}/cmdline-tools/cmdline-tools/bin/sdkmanager "platforms;$ANDROID_PLATFORM_VER" --channel=0 --sdk_root=${HOME}/android-sdk
+ - test -e ${HOME}/android-sdk/build-tools/$ANDROID_BUILD_TOOLS_VER/source.properties || echo "y" | ${HOME}/cmdline-tools/cmdline-tools/bin/sdkmanager "build-tools;$ANDROID_BUILD_TOOLS_VER" --channel=0 --sdk_root=${HOME}/android-sdk
+ - test -e ${HOME}/android-sdk/platform-tools/source.properties || echo "y" | ${HOME}/cmdline-tools/cmdline-tools/bin/sdkmanager "platform-tools" --channel=0 --sdk_root=${HOME}/android-sdk
+
+ # Unmound Command Line Tools
+ - fusermount -u ${HOME}/cmdline-tools
+
+ # Android NDK
+ - wget https://dl.google.com/android/repository/$ANDROID_NDK_ZIP
+ - echo "$ANDROID_NDK_SHA1 $ANDROID_NDK_ZIP" | sha1sum -c
+
+ # Android SDK & NDK
+ # need to symlink /etc/mtab to work around a fusermount(1) deficiency (copied from /usr/lib/python3/dist-packages/reprotest/presets.py)
+ - test -c /dev/fuse || mknod -m 666 /dev/fuse c 10 229
+ - test -f /etc/mtab || ln -s ../proc/self/mounts /etc/mtab
+ - mkdir -p $ANDROID_NDK_MOUNT_DIR
+ - fuse-zip -r $ANDROID_NDK_ZIP $ANDROID_NDK_MOUNT_DIR
+
+ script:
+ - DATE=`date +%Y%m%d`
+ - GIT_HASH=`git rev-parse --short HEAD`
+
+ # Create welle-io apk
+ - export ANDROID_SDK_ROOT=${HOME}/android-sdk
+ - export ANDROID_NDK_ROOT=$ANDROID_NDK_MOUNT_DIR/$ANDROID_NDK_BASE_DIR
+ - export QT_ROOT=/usr/lib/qt-android-5.15
+ - mkdir -p android-build
+ - cd android-build
+ - $QT_ROOT/bin/qmake ../welle.io.pro
+ - make -j$(nproc)
+ - make -j$(nproc) apk_install_target
+ - $QT_ROOT/bin/androiddeployqt --input src/welle-gui/android-welle-io-deployment-settings.json
+ --output src/welle-gui/android-build --android-platform android-30
+ --jdk /usr/lib/jvm/default-java --gradle
+ - cd ..
+
+ after_success:
+ # welle-io APK
+ - mv android-build/src/welle-gui/android-build/build/outputs/apk/debug/android-build-debug.apk "$DATE"_"$GIT_HASH"_Android_welle-io.apk
+
+ # Upload
+ - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Android_welle-io.apk ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
- os: osx
- osx_image: xcode11.3
+ osx_image: xcode13.2
before_install:
- brew tap pothosware/homebrew-pothos
- brew update
+ - brew pin ansible
install:
- - brew install fftw faad2 lame mpg123 soapysdr soapyuhd
- - ln -s /usr/local/opt/qt/bin/qmake /usr/local/bin/qmake
+ - brew install fftw faad2 lame mpg123 soapysdr esolitos/ipa/sshpass qt@5
+ - brew install --HEAD soapyuhd
+ - echo 'export PATH="/usr/local/opt/qt@5/bin:$PATH"' >> ~/.zshrc
+ - source ~/.zshrc
- export LIBRARY_PATH=/usr/local/lib
after_success:
@@ -120,7 +224,7 @@ jobs:
- find build
- mkdir appdir
- cp -R build/src/welle-gui/welle-io.app appdir/welle.io.app
- - /usr/local/opt/qt/bin/macdeployqt appdir/welle.io.app -qmldir=$TRAVIS_BUILD_DIR/src/welle-gui/QML
+ - macdeployqt appdir/welle.io.app -qmldir=$TRAVIS_BUILD_DIR/src/welle-gui/QML
- cp /usr/local/lib/librtlsdr.0.dylib appdir/welle.io.app/Contents/Frameworks/librtlsdr.0.dylib
- install_name_tool -change @rpath/librtlsdr.0.dylib @executable_path/../Frameworks/librtlsdr.0.dylib appdir/welle.io.app/Contents/MacOS/welle-io
- python macdeployqtfix.py appdir/welle.io.app/Contents/MacOS/welle.io /usr/local/opt/qt
@@ -133,19 +237,22 @@ jobs:
- hdiutil convert welle-io.dmg -format UDZO -o "$DATE"_"$GIT_HASH"_MacOS_welle-io.dmg
- rm welle-io.dmg
-before_deploy:
- # Prepare bintray deploy
- - sed -e "s/\${VERSION}/"$DATE"_"$GIT_HASH"/" .travis-bintray-deploy.json.template >travis-bintray-deploy.json
+ # Upload
+ - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_MacOS_welle-io.dmg ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+
+#before_deploy:
+# # Prepare bintray deploy
+# - sed -e "s/\${VERSION}/"$DATE"_"$GIT_HASH"/" .travis-bintray-deploy.json.template >travis-bintray-deploy.json
-deploy:
- on:
- branch: next
- provider: bintray
- file: "travis-bintray-deploy.json"
- user: "albrechtl"
- skip_cleanup: true
- key: $BINTRAY_KEY
+#deploy:
+# on:
+# branch: next
+# provider: bintray
+# file: "travis-bintray-deploy.json"
+# user: "albrechtl"
+# skip_cleanup: true
+# key: $BINTRAY_KEY
-after_deploy:
+#after_deploy:
# Delete old builds on bintray. Keep only the last 20 builds
- - python .bintray_delete_old_version.py albrechtl $BINTRAY_KEY /packages/albrechtl/welle.io/welle.io_nightly 20
+ #- python .bintray_delete_old_version.py albrechtl $BINTRAY_KEY /packages/albrechtl/welle.io/welle.io_nightly 20
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2800d22..d7679b9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,7 +52,7 @@ if(BUILD_WELLE_IO)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
- find_package(Qt5 COMPONENTS Widgets Quick QuickControls2 Multimedia Charts Qml REQUIRED)
+ find_package(Qt5 COMPONENTS Widgets Quick QuickControls2 Multimedia Charts Qml DBus REQUIRED)
endif()
if(PROFILING)
@@ -152,6 +152,9 @@ set(welle_io_sources
src/welle-gui/mot_image_provider.cpp
src/welle-gui/gui_helper.cpp
src/welle-gui/radio_controller.cpp
+ src/welle-gui/mpris/mpris.cpp
+ src/welle-gui/mpris/mpris_mp2.cpp
+ src/welle-gui/mpris/mpris_mp2_player.cpp
src/welle-gui/debug_output.cpp
src/welle-gui/waterfallitem.cpp
)
@@ -213,6 +216,9 @@ if(GIT_DESCRIBE)
add_definitions("-DGITDESCRIBE=\"${GIT_DESCRIBE}\"")
endif()
+STRING(TIMESTAMP BUILD_DATE "%s" UTC)
+add_definitions("-DBUILD_DATE=\"${BUILD_DATE}\"")
+
if(BUILD_WELLE_IO)
set(executableName welle-io)
add_executable (${executableName} ${welle_io_sources} ${backend_sources} ${input_sources} ${fft_sources} ${EXTRA_MOCS} src/welle-gui/resources.qrc)
@@ -225,7 +231,7 @@ if(BUILD_WELLE_IO)
${SoapySDR_LIBRARIES}
${MPG123_LIBRARIES}
Threads::Threads
- Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::Charts Qt5::Qml Qt5::Quick Qt5::QuickControls2
+ Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::Charts Qt5::Qml Qt5::Quick Qt5::QuickControls2 Qt5::DBus
)
if(APPLE AND WITH_APP_BUNDLE)
@@ -246,6 +252,7 @@ if(BUILD_WELLE_IO)
INSTALL (TARGETS ${executableName} BUNDLE DESTINATION ${GUI_INSTALL_DIR})
else()
INSTALL (TARGETS ${executableName} RUNTIME DESTINATION ${GUI_INSTALL_DIR})
+ INSTALL (FILES src/welle-gui/doc/man/welle-io.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
if(UNIX AND NOT APPLE)
INSTALL (FILES ${PROJECT_SOURCE_DIR}/welle-io.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
@@ -302,6 +309,7 @@ if(BUILD_WELLE_CLI)
)
elseif(UNIX)
INSTALL (TARGETS ${cliExecutableName} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+ INSTALL (FILES src/welle-cli/doc/man/welle-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
INSTALL (
FILES
${PROJECT_SOURCE_DIR}/src/welle-cli/index.html
diff --git a/HomebrewFormula/welle.io.rb b/HomebrewFormula/welle.io.rb
index 7444364..60f160e 100644
--- a/HomebrewFormula/welle.io.rb
+++ b/HomebrewFormula/welle.io.rb
@@ -1,22 +1,32 @@
class WelleIo < Formula
desc "DAB/DAB+ Software Radio"
homepage "https://www.welle.io"
- url "https://github.com/AlbrechtL/welle.io/archive/v2.0.tar.gz"
- sha256 "abfe999b6788ae57dfaaebea5e1db912565d60cc287c9eec4636b0e10eab4f9d"
+ url "https://github.com/AlbrechtL/welle.io/archive/v2.2.tar.gz"
+ sha256 "4b72c2984a884cc2f02d1e501ead2a8b0323900f37cebf4aed016e84474e0259"
+ license "GPL-2.0-or-later"
head "https://github.com/AlbrechtL/welle.io.git"
+ livecheck do
+ url :stable
+ strategy :github_latest
+ end
+
depends_on "cmake" => :build
- depends_on "qt"
- depends_on "fftw"
depends_on "faad2"
- depends_on "mpg123"
+ depends_on "fftw"
depends_on "librtlsdr"
+ depends_on "libusb"
+ depends_on "mpg123"
depends_on "pothosware/homebrew-pothos/soapysdr"
depends_on "pothosware/homebrew-pothos/soapyuhd"
- depends_on "libusb"
+ depends_on "qt@5"
def install
- system "cmake", ".", "-DRTLSDR=TRUE", "-DSOAPYSDR=TRUE", "-DBUILD_WELLE_CLI=OFF", *std_cmake_args
+ system "cmake", ".", *std_cmake_args,
+ "-DRTLSDR=1",
+ "-DSOAPYSDR=0",
+ "-DWITH_APP_BUNDLE=0", # Homebrew prefers a UNIX-like directory structure
+ "-DBUILD_WELLE_CLI=1"
system "make", "install"
end
diff --git a/RASPBERRY-PI.md b/RASPBERRY-PI.md
deleted file mode 100644
index 095358c..0000000
--- a/RASPBERRY-PI.md
+++ /dev/null
@@ -1,381 +0,0 @@
-welle.io on Raspberry Pi 2/3
-============================
-This guide borrows parts from [Qt wiki](https://wiki.qt.io/RaspberryPi2EGLFS).
-This guide is a work in progress.
-If you have issues or something is completely wrong, please let us know at the [forums.](https://forum.welle.io/)
----------------------------------------------------------------------------------
-Table of contents
-=================
-
- * [Description](#description)
- * [Hardware requirements](#hardware-requirements)
- * [Setup](#setup)
- * [Building](#building)
- * [Power supply](#power-supply)
- * [Troubleshooting](#troubleshooting)
- * [Known issues](#known-issues)
-
-Description
-===========
-This guide will help you compile and run welle.io on your Raspberry Pi 2/3 using the [Qt environment](https://www.qt.io) with Qt Creator.
-Qt will be set up for cross compiling from a desktop Linux computer since Qt most likely will not be able to be natively compiled on a Raspberry Pi due to memory constraints.
-
-Tested configurations are:
-* Raspberry Pi 3 Model B
-* Qt 5.9.3
-* Qt 5.10.0
-* Ubuntu 17.10 x64
-* Raspbian Stretch
-
-Hardware requirements
----------------------
-
-**Raspberry Pi:**
-* Raspberry Pi 2 or 3. The original Pi may, or may not work
-* [Adequate power supply](#power-supply)
-* 4GB or larger MicroSD card
-* A RTL2832U DVB-T stick to receive radio signals
-(If you are using an Airspy device, compile and install the airspy library.)
-(For details please see [here](https://github.com/airspy/host/#how-to-build-the-host-software-on-linux))
-
-**Host computer:**
-* Desktop/laptop computer running Ubuntu or an equivalent Debian Linux system
-(Other distributions will work, but is not tested)
-* A way to read/write MicroSD cards on a computer
-* Wireless or wired connection between desktop computer and Raspberry Pi
-
-
-Setup
------
-
-First we need to get Raspbian up and running on the Raspberry Pi.
-Only [Raspbian Stretch](https://www.raspberrypi.org/downloads/raspbian/) or newer will work, since Raspbian Jessie or older have a too old GCC/GLIBC version.
-The easiest way is to download [NOOBS.](https://www.raspberrypi.org/downloads/noobs/)
-
-1. Download [NOOBS.](https://downloads.raspberrypi.org/NOOBS_latest)
- Make sure it's version 2.4.5 or later.
-2. Follow the [official quick start guide](https://www.raspberrypi.org/learning/software-guide/quickstart/) for installing Raspian.
- ([Additional information](https://www.raspberrypi.org/documentation/installation/installing-images/README.md))
- ([Additional information](https://www.raspberrypi.org/documentation/installation/noobs.md))
-
-**ON RASPBERRY PI:**
-
-3. Update Raspbian and update to the latest packages.
- ```
- sudo rpi-update
- sudo apt update
- sudo apt dist-upgrade
- ```
- Reboot your Pi
- ```
- sudo reboot
- ```
- (Optional but highly recommended: Use raspi-config and set up SSH to your Pi so you can remote control it from another computer)
- (Optional: Use raspi-config and set GPU memory to 256)
- (More info about raspi-config [here](https://www.raspberrypi.org/documentation/configuration/raspi-config.md))
- ```
- sudo raspi-config
- ```
-4. Install the required packages for welle.io and RTL-SDR.
- ```
- sudo apt install libfaad-dev libfftw3-dev librtlsdr-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev rtl-sdr
- ```
-5. Install a bunch of development files.
- (For simplicity we use build-dep, not everything is really needed, but it is easier this way.)
- Edit sources list in /etc/apt/sources.list and uncomment (remove #) the **deb-src** line:
- ```
- sudo nano /etc/apt/sources.list
- ```
- Run update again to include deb-src in the repository list:
- ```
- sudo apt update
- ```
- Install required libraries:
- ```
- sudo apt-get build-dep qt4-x11
- sudo apt-get build-dep qtbase-opensource-src
- ```
- ```
- sudo apt install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
- ```
-6. Prepare our target directory
- ```
- sudo mkdir /usr/local/qt5pi
- sudo chown pi:pi /usr/local/qt5pi
- ```
-
-Now we need to set up the toolchain, environments and directories on our host computer.
-
-**ON HOST COMPUTER:**
-
-7. Make a raspi folder.
- ```
- mkdir ~/raspi
- cd ~/raspi
- ```
-8. Create a sysroot.
- Using rsync we can properly keep things synchronized in the future as well.
- Replace "raspberrypi.local" with the address of the Pi.
- Depending on your connection speed, this might take a while, since you are basically copying the entire contents of your Pi, to your host PC.
- It is important that you have already downloaded the required packages for welle.io on your Pi before you start rsync,
- because the cross compiling environment will use this sysroot folder as its source instead of the packages you might have installed on your host PC.
- ```
- mkdir sysroot sysroot/usr sysroot/opt
- rsync -avz pi@raspberrypi.local:/lib sysroot
- rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
- rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
- rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt
- ```
-9. Adjust symlinks to be relative. Use provided script.
- ```
- wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
- chmod +x sysroot-relativelinks.py
- ./sysroot-relativelinks.py sysroot
- ```
-10. Get a GCC toolchain for ARM systems.
- ```
- wget https://releases.linaro.org/components/toolchain/binaries/latest-5/arm-linux-gnueabihf/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz
- tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz
- ```
- Or check the [website](https://releases.linaro.org/components/toolchain/binaries/latest-5/arm-linux-gnueabihf/) for the latest toolchain.
- If you are using a 32-bit system, download the 32-bit version. (i686)
-
-Building
---------
-
-11. Get Qt source.
- We will use the entire Qt system instead of only qtbase, which is probably overkill, but makes it way easier to manage.
- (Additional information about building Qt from source [here.](https://wiki.qt.io/Building_Qt_5_from_Git))
- The target directory is /usr/local/qt5pi on the Pi, the host tools like qmake will go to ~/raspi/qt5, while make install will target ~/raspi/qt5pi (this is what we will sync to the device).
- Don't forget to adjust paths if you changed that. For some reason the ~/ in the paths may not work, if this the case just use full paths.
- ```
- git clone git://code.qt.io/qt/qt5.git
- cd qt5
- git checkout 5.10
- ```
- Currently, Qt version 5.10 is working.
- If the branch version does not exist, try another/newer branch number.
- Branch information for Qt is located [here.](http://code.qt.io/cgit/qt/qt5.git/)
- Now we need to initialize the repository, which will download all the submodules we need for Qt.
- We will not download qtwebkit or qtwebengine since these modules tend to create problems later, and are not needed for welle.io anyway.
- ```
- ./init-repository --module-subset=default,-qtwebkit,-qtwebkit-examples,-qtwebengine
- ```
- If the init failed due to network errors or similar, run the command again, but append **-f** at the end.
-12. Configure Qt.
- You need to change **rpi-version** with a proper Raspberry Pi version.
- Use: **linux-rasp-pi-g++** for RPi, **linux-rasp-pi2-g++** for RPi2 and **linux-rasp-pi3-g++** for RPi3.
- If your system is 32-bit you may also edit device option to:
- ```
- -device-option CROSS_COMPILE=~/raspi/gcc-linaro-5.5.0-2017.10-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
- ```
- Now it's time to set up and configure Qt for cross compiling to the ARM platform.
- Don't forget to change **rpi-version**.
- ```
- ./configure -release -opengl es2 -device <rpi-version> -device-option CROSS_COMPILE=~/raspi/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -no-use-gold-linker -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -v
- ```
-13. Compile Qt.
- (Optional: use switch **-j** to tell make how many cores your cpu has.)
- (Example, ***make -j4*** tells make to use four cpu cores, which greatly speeds up compile time.)
- ```
- make
- make install
- ```
- If anything failed, you can clean everything with:
- ```
- git clean -dfx
- ```
-14. Deploy Qt to the device.
- We simply rsync everything from ~/raspi/qt5pi to the prefix we configured above.
- ```
- cd ..
- rsync -avz qt5pi pi@raspberrypi.local:/usr/local
- ```
- Now we will build an example to test if everything went well.
- After the building is complete, we will copy the executable example to the device.
- ```
- cd qt5/qtbase/examples/opengl/qopenglwidget
- ~/raspi/qt5/bin/qmake
- make
- scp qopenglwidget pi@raspberrypi.local:/home/pi
- ```
-
-Now we need to fix various links and issues on the Raspberry Pi.
-
-**ON RASPBERRY PI:**
-
-15. Update the device to let the linker find the Qt libs:
- ```
- echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
- sudo ldconfig
- ```
- If you're facing issues with running the example, try to use 00-qt5pi.conf instead of qt5pi.conf, to introduce proper order.
-16. Fix the EGL/GLES libraries.
- The device may have the Mesa version of libEGL and libGLESv2 in /usr/lib/arm-linux-gnueabihf, resulting Qt apps picking these instead of the real thing from /opt/vc/lib.
- This may be fine for X11 desktop apps not caring about OpenGL performance but is totally useless for windowing system-less, fullscreen embedded apps.
- You may want to save the originals somewhere, just in case.
- ```
- sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
- sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
- sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
- sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
- ```
- Please make sure to also add missing symbolic links:
- ```
- sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
- sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2
- ```
-17. Run qopenglwidget example, that we've built before.
- At this point it should just work at fullscreen with 60 FPS and mouse, keyboard, and possibly touch support.
- ```
- sudo chmod +x /home/pi/qopenglwidget
- ./qopenglwidget
- ```
-
-If the example is running smoothly, (or rather, running at all), congratulations, you now have Qt 5 on your Raspberry Pi.
-This is only half the battle though. Now we continue on to set up our host computer for welle.io cross compiling.
-
-**ON HOST COMPUTER:**
-
-18. We now need the Qt environment for our host computer, including Qt Creator.
- The easiest way to obtain this, is to download a precompiled Qt binary for our operating system. In this case, Ubuntu.
- Go to [Qt website](https://www1.qt.io/download-open-source/#section-2) and download the appropriate package for your system.
- For Ubuntu, Use [Online Installer Linux 64-bit.](http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run)
- Or the [32bit version](http://download.qt.io/official_releases/online_installers/qt-unified-linux-x86-online.run) if you have such a system.
- Before we begin, start another instance of terminal for a fresh start, or **cd ..** your way back to your home folder.
- ```
- wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run
- sudo chmod +x qt-unified-linux-x64-online.run
- ./qt-unified-linux-x64-online.run
- ```
- Follow the instructions and install Qt, including submodules and Qt Creator.
- Select version 5.9.3 or higher, and a QT Creator version.
-19. Clone welle.io.
- ```
- git clone https://github.com/AlbrechtL/welle.io.git
- ```
-20. Start Qt Creator.
-21. Open project and select the welle.io folder that you just cloned and click on welle.io.pro.
-22. When the **configure project** screen comes up, click on **manage kits**
- Then go to the **Qt Versions** tab and click **Add...**
- Move to the **~/raspi/qt5/bin/qmake** folder and select the qmake there.
- **Details** on the bottom should say something along the lines of "Qt version 5.9.3 for Embedded linux"
-
- Now, go over to the **Compilers** tab and add **GCC C**
- Name it "GCC ARM" or similar so we can easily identify it later.
- In **Compiler path** browse to ~/raspi/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/bin and select **arm-linux-gnueabihf-gcc**
- ABI should read "arm-linux-generic-elf-32bit"
-
- Once again, click on **Add** and add a **GCC C++** compiler.
- Name it "G++ ARM" or similar.
- Compiler path should be the same as the previous one, but select **arm-linux-gnueabihf-g++** instead of "arm-linux-gnueabihf-gcc"
- ABI should read "arm-linux-generic-elf-32bit", same as the previous one.
-
- The last thing we could set up is in the **Debuggers** tab. This one isn't really needed, but lets do it anyway.
- Press **Add** and name it "ARM GDB" or similar and the path should be the same as previous, but select **arm-linux-gnueabihf-gdb**.
- With all this done, we can make a new kit.
-
- Click on the **Kits** tab and **add**.
- Name it "Raspberry Pi" or similar.
- Device type: **Generic Linux Device**
- Sysroot: **~/raspi/sysroot**
- Compiler: C: **GCC ARM** (Or what you named your GCC compiler.)
- Compiler: C++: **G++ ARM** (Or what you named your G++ compiler.)
- Debugger: **ARM GDB** (Or what you named your GDB debugger.)
- Qt version: **Qt 5.9.3 (qt5)** (The one you made, not the default one which most likely already was present in the "Qt Versions" tab.)
-
- With all this done, click apply and ok.
- Now your newly created "Raspberry Pi" kit should appear in the **Configure project** section. Select it and press **configure project.**
- Stuff should happen and you should be greeted with a projects tree view and some other stuff, probably a Project "MESSAGE" message of some sort too.
-23. In order to compile welle.io for Raspberry Pi successfully, we need to do one adjustment to the source code.
- Double click on **welle.io.pro** in the tree view,
- scroll down to where it says **unix:!macx:!android:** find the line which says **CONFIG += airspy**
- and comment it out by putting a **#** in front of it.
- (Unless you need Airspy support.)
- ```
- #CONFIG += airspy
- ```
- Save file (ctrl+s)
-24. Now click on the monitor icon at the left hand side, most likely saying "welle.io debug" or similar, change the build to **release**.
- Wait a couple of seconds until the green arrows lights up again.
-25. Click on the hammer icon, which means **build project**.
- Qt Creator will build welle.io and output the finished program into a "release" folder most likely named "build-welle-io-Raspberry_Pi-Release".
-26. Open a new terminal and navigate to the release folder.
- Transfer the program over to the Raspberry Pi.
- ```
- cd ~/build-welle-io-Raspberry_Pi-Release
- scp welle-io pi@raspberrypi.local:/home/pi
- ```
-
-**ON RASPBERRY PI:**
-
-27. Find the file **welle-io** and run it to enjoy welle.io on your Raspberry Pi.
- Open a new terminal and type:
- ```
- ./welle-io --disable-splash
- ```
- The **--disable-splash** argument is used because otherwise welle.io will crash on Raspberry Pi.
- See the troubleshooting section at the bottom for details.
-
-Power supply
-============
-
-Raspberry Pi 3 requires significantly more power than the original Pi, which could easily be run off a generic USB phone charger.
-The problem with such chargers is the fact that the USB cable is almost always too thin to reliably supply the required 5 volts the Pi 3 needs to run.
-Also, a phone charger is not necessarily a good power supply in general.
-Even powerful Apple 12W iPad chargers which outputs amps and amps of current, fails to deliver more than 4.6-4.8 volts to the Pi, which forces the Pi to go into "undervoltage" mode.
-In undervoltage mode, the Pi reduces the speed of the CPU and GPU, which affects the entire operation of the system.
-Hiccups in other parts of the system might occur, such as in RAM and I/O chips.
-Too low voltage is noticeable by a lightning bolt icon in the top right corner of the screen.
-More info about the power requirements [here](https://www.raspberrypi.org/help/faqs/#powerReqs).
-The official [Raspberry Pi universal power supply](https://www.raspberrypi.org/products/raspberry-pi-universal-power-supply/) is a more beefy (and proper) power supply that provides 5.1 volts over a thicker cable, which mitigates the power loss experienced in thinner generic USB cables.
-However, when running with lots of peripherals, like a touch screen, mouse, keyboard, gamepad, bluetooth dongle, Wi-Fi dongle, RTL-SDR dongle and whatnot, even an official power supply struggles.
-The solution is to somehow add another official power supply, or an even beefier power supply that can output 5.1 volt, 4+ amps.
-
-When the Pi goes into undervoltage mode, it may or may not affect the SDR dongle, and its operation with welle.io, causing random malfunctions in radio reception.
-The SD card might be corrupt if it is written to while the Pi experiences undervoltage.
-Using the Pi in undervoltage mode is not the end of the world, but expect the unexpected.
-
-Troubleshooting
-===============
-
-* If you have no audio out when using an external sound card like a HiFiBerry DAC+, IQAudIO PiDAC+, PiMoroni pHAT DAC, JustBoom or any USB DAC, try installing Pulseaudio.
- ```
- sudo apt install pulseaudio
- ```
-* If you for some reason don't have any text in either the qopenglwidget example or in welle.io and get a message like this in the terminal:
- ```
- QFontDatabase: Cannot find font directory /usr/local/qt5pi/lib/fonts.
- Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
- ```
- It means the fonts folder for the Qt environment does not exist.
- To fix this, we simply make the folder and populate it with some fonts.
- ```
- mkdir /usr/local/qt5pi/lib/fonts
- ```
- Then we steal a font from the system font folder.
- ```
- cp /usr/share/fonts/truetype/freefont/FreeSans.ttf /usr/local/qt5pi/lib/fonts/FreeSans.ttf
- ```
- You can basically put any font you want in the fonts folder.
-* If your screen goes blank after a set time, have a look at the [official documentation](https://www.raspberrypi.org/documentation/configuration/screensaver.md) for screensavers.
-* Error: **EGLFS: OpenGL windows cannot be mixed with others.** appears, this means the splash screen is not working correctly on Raspberry Pi.
-To work around this issue, start welle.io with the argument **--disable-splash**.
-```
-./welle-io --disable-splash
-```
-* When using VNC or another form of remote desktop software,
-OpenGLES will not output any Qt windows to the remote desktop,
-only a fullscreen window on an attached screen, such as HDMI or DSI port.
-To work around this issue, use argument **-platform xcb** when starting welle.io.
-You might have to install the proper xcb libraries if these are not present on your Raspberry Pi.
-```
-./welle-io -platform xcb
-```
-
-Known issues
------------
-* When using a touch screen, the user interface will be "transparent" to your screen touches.
-This means that you can accidentally click on icons on the desktop itself, behind the user interface of the program, while operating the program as normal.
-It is not known if this is a Qt issue, welle.io issue or a Raspbian driver issue.
-For now, take care when operating the user interface with a touch screen.
diff --git a/README.md b/README.md
index e60eab8..6f801cd 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
[welle.io](https://www.welle.io)
=====================
-- Linux, macOS (Travis): [![Travis Build Status](https://travis-ci.org/AlbrechtL/welle.io.svg?branch=master)](https://travis-ci.org/AlbrechtL/welle.io)
+- Linux, macOS (Travis): [![Travis Build Status](https://app.travis-ci.com/AlbrechtL/welle.io.svg?branch=next)](https://app.travis-ci.com/AlbrechtL/welle.io)
- Windows (AppVeyor): [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/yipsu95pb4ecdofe?svg=true)](https://ci.appveyor.com/project/AlbrechtL/welle-io)
This repository contains the implementation of an SDR DAB/DAB+ receiver.
@@ -16,12 +16,11 @@ Table of contents
* [Supported Hardware](#supported-hardware)
* [Building](#building)
* [General Information](#general-information)
- * [Ubuntu Linux 18.04 LTS](#ubuntu-linux-1804-lts)
- * [Windows 10](#windows-10)
+ * [Debian / Ubuntu Linux](#debian--ubuntu-linux)
+ * [Windows 10 / 11](#windows-10--11)
* [macOS](#macos)
* [CMake instead of Qt Creator (Windows, Linux, macOS)](#cmake-instead-of-qt-creator-windows-linux-macos)
* [Android](#android)
- * [Raspberry Pi 2 and 3](#raspberry-pi-2-and-3)
* [welle-cli](#welle-cli)
* [Usage](#usage-of-welle-cli)
* [Backend options](#backend-options)
@@ -31,28 +30,34 @@ Table of contents
Download
========
-##### Stable binaries
-* [welle.io for **Windows**, **Linux** and **Android (APK)**](http://github.com/AlbrechtL/welle.io/releases)
-* [welle.io for **Android at Google Play**](https://play.google.com/store/apps/details?id=io.welle.welle)
-* welle.io for **Debian** or **Ubuntu** 19.04+
+### Stable binaries
+* [**Windows**, **Linux**, **macOS** and **Android**](http://github.com/AlbrechtL/welle.io/releases)
+* **Debian** or **Ubuntu** 19.04+
* `apt install welle.io`, see the /usr/share/doc/welle.io/README.Debian for maintainer notes
-* welle.io for **macOS**
- * [through **MacPorts port**](https://ports.macports.org/port/welle.io/summary) (requires [MacPorts](https://www.macports.org/))
- * `sudo port install welle.io`
- * `sudo port install welle.io +cli` (if you wish to install also welle-cli)
+* **macOS** (requires [MacPorts](https://www.macports.org/))
+ * `sudo port install welle.io`
+ * `sudo port install welle.io +cli` (if you wish to install also welle-cli)
+* **FreeBSD**
+ * Building from sources (requires ports tree to be checked out at `/usr/ports/`)
+ ```
+ cd /usr/ports/audio/welle.io/
+ make install clean
+ ```
+ * Installing the binary package
+ ```
+ pkg install welle.io`
+ ```
+* [**Android at Google Play**](https://play.google.com/store/apps/details?id=io.welle.welle) (outdated)
If you discovered an issue please open a new [issue](https://github.com/AlbrechtL/welle.io/issues).
-##### Developer version
-welle.io is under heavy development. You can also try the latest developer builds. But PLEASE BE WARNED the builds are automatically created and untested.
- * [welle.io nightly builds for *Windows* & *Linux AppImage*](https://bintray.com/albrechtl/welle.io/welle.io_nightly#files)
- * welle.io devel builds on *macOS MacPorts* are updated perdiodically manually and can be installed through [port welle.io-devel](https://ports.macports.org/port/welle.io-devel/summary). The port has no maintainer so please feel free to update it yourself in case you need to use a more recent devel version.
- * `sudo port install welle.io-devel`
+### Unstable developer version
+welle.io is under development. You can also try the latest developer builds. But PLEASE BE WARNED the builds are automatically created and untested.
-##### Compilation from source
-To use it on a **Raspberry Pi** you have to compile welle.io directly from the sources. See [instructions to compile for Raspberry Pi](#raspberry-pi-2-and-3).
-Note that welle.io source also ships with a [**Homebrew**](https://brew.sh/) formula for macOS. See [instructions to install with Homebrew](#homebrew).
-You can find [more instructions to compile welle.io on various systems](#building) below.
+* [welle.io nightly builds](https://welle-io-nightlies.albrechtloh.de/) (Windows, Linux, macOS, Android)
+
+* macOS: welle.io devel builds on *macOS MacPorts* are updated periodically manually and can be installed through [port welle.io-devel](https://ports.macports.org/port/welle.io-devel/summary). The port has no maintainer so please feel free to update it yourself in case you need to use a more recent devel version
+ * `sudo port install welle.io-devel`
Usage
=====
@@ -65,6 +70,18 @@ Parameter | Description
--dump-file | Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert (https://www.basicmaster.de/xpadxpert).
--log-file | Log file name. Redirects all log output texts to a file.
+Keyboard shortcuts & hotkeys
+
+Keystroke | Action
+------ | ----------
+F1-F12, 1-9, 0, Ctrl+1-9, Ctrl+0 | Play the station no. 'x' in the stations list: <br />`1` for station no. `1`, <br />`0` for station no. `10`, <br />`Ctrl+1` for station no. `11`...
+S, Media Play, Media Stop, Media Pause, Media Play/Pause | Start playback/Stop
+N, Media next | play next station in list
+P, Media Previous | play previous station
+M, Volume Mute | mute/unmute
+Ctrl+Up, Volume Up | Volume Up
+Ctrl+Down, Volume Down | Volume Down
+
Supported Hardware
====================
The following SDR devices are supported
@@ -77,14 +94,14 @@ The following SDR devices are supported
* Devices supported by uhd are supported via [SoapyUHD](https://github.com/pothosware/SoapyUHD/wiki)
* One limitation is of course that the SDR devices must be tunable to the DAB+ frequencies.
-SoapySDR Notes
----
+### SoapySDR Notes
+
-### LimeSDR
+#### LimeSDR
Connect the antenna to the RX1_W port and configured SoapySDR antenna option to `LNAW`. `SoapySDRUtil --probe=driver=lime` may show other possible options.
-### USRP
+#### USRP
Configured SoapySDR driver arguments option to `driver=uhd`. Configure also antenna and clock source option. To list possible values for antenna and clock source use the command `SoapySDRUtil --probe=driver=uhd`.
@@ -100,35 +117,45 @@ The following libraries and their development files are needed:
* librtlsdr
* libusb
-Ubuntu Linux 18.04 LTS
+Debian / Ubuntu Linux
---
-This section shows how to compile welle.io on Ubuntu 16.04 LTS and Ubuntu 18.04 LTS.
+This section shows how to compile welle.io on Debian or Ubuntu (tested with Ubuntu 20.04).
-1. Install Qt 5.10 including the Qt Charts module by using the the "Qt Online Installer for Linux" https://www.qt.io/download-open-source/
+1. Install the base requirements
-2. Install the following packages
+```
+sudo apt install git build-essential
+```
- ```
-# sudo apt install libfaad-dev libmpg123-dev libmpg123-dev libfftw3-dev librtlsdr-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev libairspy-dev libmp3lame-dev
- ```
+2. Install the following non-Qt packages
-3. Clone welle.io
+```
+sudo apt install libfaad-dev libmpg123-dev libfftw3-dev librtlsdr-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev libairspy-dev libmp3lame-dev
+```
- ```
-# git clone https://github.com/AlbrechtL/welle.io.git
- ```
+3. Install the following Qt packages
-4. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
-5. Build welle.io
-6. Run welle.io and enjoy it
+```
+sudo apt install libqt5charts5-dev qtbase5-dev qttools5-dev-tools qtquickcontrols2-5-dev libqt5quick5 qtdeclarative5-dev qtmultimedia5-dev libqt5quick5 libqt5multimedia5-plugins qml-module-qt-labs-settings qml-module-qtquick-window2 qml-module-qtquick2 qml-module-qtquick-layouts qml-module-qtquick-dialogs qml-module-qtquick-controls2 qml-module-qtquick-controls qml-module-qtquick-templates2 qml-module-qtquick-privatewidgets qml-module-qtquick-localstorage qml-module-qtcharts qml-module-qtgraphicaleffects qml-module-qt-labs-folderlistmodel qtcreator
+```
+
+4. Clone welle.io
-Windows 10
+```
+git clone https://github.com/AlbrechtL/welle.io.git
+```
+
+5. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
+6. Build welle.io
+7. Run welle.io and enjoy it
+
+Windows 10 / 11
---
A compiled version can be found at the [release page](https://github.com/AlbrechtL/welle.io/releases)
This sections shows how to compile welle.io on Windows 10. Windows 7 should also be possible but is not tested.
-1. Install Qt 5.10 including the Qt Charts and mingw modules by using the the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
+1. Install Qt 5.10 including the Qt Charts and mingw modules by using the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
2. Clone welle.io https://github.com/AlbrechtL/welle.io.git e.g. by using [TortoiseGit](https://tortoisegit.org).
3. Clone the welle.io Windows libraries https://github.com/AlbrechtL/welle.io-win-libs.git.
4. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
@@ -147,13 +174,13 @@ Assuming that you have [Homebrew](https://brew.sh/) installed, execute the follo
1. Use the welle.io repository as a "tap" (alternative package repository):
```
-# brew tap AlbrechtL/welle_io https://github.com/AlbrechtL/welle.io
+brew tap AlbrechtL/welle_io https://github.com/AlbrechtL/welle.io
```
2. Install welle.io (and dependencies):
```
-# brew install AlbrechtL/welle_io/welle.io
+brew install AlbrechtL/welle_io/welle.io
```
### MacPorts
@@ -165,7 +192,7 @@ You can either use the welle.io port available in macports, or compile with QT C
This is the easiest way and will manage the dependencies for you.
Variants enabled by default are : "airspy" "rtlsdr" "soapysdr". Each enables compilation with that specific input device library.
```
-# sudo port install welle.io
+sudo port install welle.io
```
Additional variants are : "cli" (to install also welle-cli) "profiling" & "kiss_fft".
@@ -173,7 +200,7 @@ With MacPorts, welle.io is installed as a bundle app in `/Applications/MacPorts`
You can also use welle.io-devel port if you prefer:
```
-# sudo port install welle.io-devel
+sudo port install welle.io-devel
```
#### compile with QT Creator
@@ -181,57 +208,76 @@ You can also use welle.io-devel port if you prefer:
You need to install the dependencies with MacPorts first, assuming you have [MacPorts](https://www.macports.org/) installed:
```
-# sudo port install fftw-3-single faad2 rtl-sdr libusb mpg123 lame
+sudo port install fftw-3-single faad2 rtl-sdr libusb mpg123 lame
```
1. Install Qt 5.10 with Qt Creator directly from Qt website, not through MacPorts.
2. Clone welle.io
- ```
-# git clone https://github.com/AlbrechtL/welle.io.git
- ```
+```
+git clone https://github.com/AlbrechtL/welle.io.git
+```
3. Open welle.io.pro with Qt Creator.
4. Make sure in Qt Creator, "Projects, Build&Run, Run" that the checkbox "Add build library path to DYLD..." is off.
5. Build and run.
-CMake instead of Qt Creator (Windows, Linux, macOS)
+FreeBSD
+---
+This section describes how to build welle.io from sources on FreeBSD 12.2 and 13.0.
+
+1. You will need the following dependencies, either built from the
+ ports or installed as a binary package. You may also build them
+ yourself.
+
+```
+pkg install alsa-lib faad lame mpg123 pkgconf cmake qt5-charts \
+ qt5-core qt5-declarative qt5-gui qt5-multimedia qt5-network \
+ qt5-quickcontrols2 qt5-widgets qt5-buildtools qt5-qmake \
+ rtl-sdr fftw3-float fftw3
+```
+ For SoapySDR support, you will also need `soapysdr`. For AirSpy support, you will need `airspy`.
+
+2. Now follow the build instructions for CMake as indicated below.
+
+
+CMake instead of Qt Creator (Windows, Linux, macOS, FreeBSD)
---
As an alternative to Qt Creator, CMake can be used for building welle.io after installing dependencies and cloning the repository. On Linux, you can also use CMake to build [**welle-cli**](#welle-cli), the command-line backend testing tool that does not require Qt.
1. Create a build directory inside the repository and change into it
- ```
-# mkdir build
-# cd build
- ```
+```
+mkdir build
+cd build
+```
2. Run CMake. To enable support for RTL-SDR add the flag `-DRTLSDR=1` (requires librtlsdr) and for SoapySDR add `-DSOAPYSDR=1` (requires SoapySDR compiled with support for each desired hardware, e.g. UHD for Ettus USRP, LimeSDR, Airspy or HackRF). By default, CMake will build both welle-io and welle-cli. Use `-DBUILD_WELLE_IO=OFF` or `-DBUILD_WELLE_CLI=OFF` to compile only the one you need.
- ```
-# cmake ..
- ```
+```
+cmake ..
+```
or to enable support for both RTL-SDR and Soapy-SDR:
- ```
-# cmake .. -DRTLSDR=1 -DSOAPYSDR=1
- ```
+```
+cmake .. -DRTLSDR=1 -DSOAPYSDR=1
+```
If you wish to use KISS FFT instead of FFTW (e.g. to compare performance), use `-DKISS_FFT=ON`.
3. Run make (or use the created project file depending on the selected generator)
- ```
-# make
- ```
+```
+make
+```
4. Install it (as super-user)
- ```
-# make install
- ```
+```
+make install
+```
5. Run welle.io and enjoy it
@@ -243,22 +289,18 @@ welle.io uses the "RTL2832U driver" from Martin Marinov, to be found at the [Goo
This sections shows how to compile welle.io for Android.
-1. Install Qt 5.12 for Android including the Qt Charts and Qt Remote Objects modules by using the the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
-2. Follow the side https://doc.qt.io/qt-5/androidgs.html to install the Android build enviroment
+1. Install Qt 5.12 for Android including the Qt Charts and Qt Remote Objects modules by using the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
+2. Follow the side https://doc.qt.io/qt-5/androidgs.html to install the Android build environment
3. Clone welle.io https://github.com/AlbrechtL/welle.io.git
- ```
-# git clone https://github.com/AlbrechtL/welle.io.git
- ```
+```
+git clone https://github.com/AlbrechtL/welle.io.git
+```
4. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
5. Build welle.io
6. Run welle.io and enjoy it
-Raspberry Pi 2 and 3
----
-To build and run welle.io on a Raspberry Pi 2 and 3 with GPU acceleration, please read [this guide](https://github.com/AlbrechtL/welle.io/blob/master/RASPBERRY-PI.md).
-
welle-cli
==
@@ -327,7 +369,7 @@ Examples:
Limitations
===
-* Windows 8 and older are not offically supported
+* Windows 8 and older are not officially supported
Development
===
diff --git a/THANKS b/THANKS
index f3f2f78..0beac41 100644
--- a/THANKS
+++ b/THANKS
@@ -23,8 +23,8 @@ welle.io uses parts from the following programs
Icons:
- Navigation icons made by Gregor Cresnar from www.flaticon.com (License CC 3.0 BY)
(http://www.flaticon.com/authors/gregor-cresnar)
-- Speaker icons made by smashicons from www.flaticon.com (License CC 3.0 BY)
- (https://smashicons.com)
+- Speaker, play, stop icons made by https://www.freepik.com from https://www.flaticon.com/
+ (https://www.flaticon.com/de/packs/media-and-technology)
- Antenna icon made by photo3idea_studio from www.flaticon.com (License CC 3.0 BY)
(https://www.flaticon.com/authors/photo3idea-studio)
- Application icon made by Freepik from www.flaticon.com (License CC 3.0 BY)
diff --git a/debian/changelog b/debian/changelog
index b3d1e0d..91db801 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-welle.io (2.2-2) UNRELEASED; urgency=low
+welle.io (2.4-1) UNRELEASED; urgency=low
* Move source package lintian overrides to debian/source.
* Bump debhelper from old 11 to 12.
@@ -9,8 +9,9 @@ welle.io (2.2-2) UNRELEASED; urgency=low
* Bump debhelper from old 12 to 13.
* Update standards version to 4.5.1, no changes needed.
* Avoid explicitly specifying -Wl,--as-needed linker flag.
+ * New upstream release.
- -- Debian Janitor <janitor@jelmer.uk> Wed, 26 Aug 2020 13:55:36 -0000
+ -- Debian Janitor <janitor@jelmer.uk> Mon, 14 Mar 2022 18:20:32 -0000
welle.io (2.2-1) unstable; urgency=medium
diff --git a/debian/patches/cli-path-patch b/debian/patches/cli-path-patch
index 092fd4e..ee975d1 100644
--- a/debian/patches/cli-path-patch
+++ b/debian/patches/cli-path-patch
@@ -23,9 +23,11 @@ Forwarded: <no|not-needed|url proving that it has been forwarded>
Reviewed-By: <name and email of someone who approved the patch>
Last-Update: 2019-10-23
---- welle.io-2.0.orig/src/welle-cli/webradiointerface.cpp
-+++ welle.io-2.0/src/welle-cli/webradiointerface.cpp
-@@ -439,10 +439,10 @@ bool WebRadioInterface::dispatch_client(
+Index: welle.io/src/welle-cli/webradiointerface.cpp
+===================================================================
+--- welle.io.orig/src/welle-cli/webradiointerface.cpp
++++ welle.io/src/welle-cli/webradiointerface.cpp
+@@ -462,10 +462,10 @@ bool WebRadioInterface::dispatch_client(
else {
if (req.is_get) {
if (req.url == "/") {
diff --git a/io.welle.welle-gui.json b/io.welle.welle-gui.json
new file mode 100644
index 0000000..243cf51
--- /dev/null
+++ b/io.welle.welle-gui.json
@@ -0,0 +1,57 @@
+{
+ "app-id": "io.welle.welle-gui",
+ "runtime": "org.kde.Platform",
+ "runtime-version": "5.15",
+ "sdk": "org.kde.Sdk",
+ "command": "welle-io",
+ "finish-args": [
+ "--share=network",
+ "--filesystem=host",
+ "--socket=pulseaudio",
+ "--socket=wayland",
+ "--socket=x11",
+ "--device=dri"
+ ],
+ "modules": [
+ {
+ "name": "fftw",
+ "buildsystem": "autotools",
+ "config-opts": ["--enable-float","--enable-sse"],
+ "sources": [ {"type": "archive", "url": "http://fftw.org/fftw-3.3.9.tar.gz", "md5":"50145bb68a8510b5d77605f11cadf8dc" } ]
+ },
+ {
+ "name": "libfaad",
+ "buildsystem": "autotools",
+ "sources": [ {"type": "git", "url": "https://salsa.debian.org/multimedia-team/faad2.git" } ]
+ },
+ {
+ "name": "libusb",
+ "buildsystem": "autotools",
+ "sources": [ {"type": "git", "url": "https://github.com/libusb/libusb.git" } ]
+ },
+ {
+ "name": "librtlsdr",
+ "buildsystem": "cmake",
+ "sources": [ {"type": "git", "url": "git://git.osmocom.org/rtl-sdr.git" } ]
+ },
+ {
+ "name": "libairspy",
+ "buildsystem": "cmake",
+ "sources": [ {"type": "git", "url": "https://github.com/airspy/airspyone_host.git" } ]
+ },
+ {
+ "name": "SoapySDR",
+ "buildsystem": "cmake",
+ "config-opts": ["-DCMAKE_BUILD_TYPE=Release"],
+ "sources": [ {"type": "git", "url": "https://github.com/pothosware/SoapySDR.git" } ]
+ },
+ {
+ "name": "welle.io",
+ "buildsystem": "qmake",
+ "build-commands" : ["cp src/welle-gui/welle-io /app/bin"],
+ "config-opts": [ "LIBS+=-L/app/lib"],
+ "sources": [ {"type": "dir", "path": "."} ]
+ }
+ ]
+}
+
diff --git a/src/backend.pri b/src/backend.pri
index 8952b40..077def7 100644
--- a/src/backend.pri
+++ b/src/backend.pri
@@ -56,7 +56,7 @@ macx {
LIBS += -lmp3lame
CONFIG += airspy
CONFIG += rtl_sdr
- #CONFIG += soapysdr
+ CONFIG += soapysdr
}
android {
diff --git a/src/backend/dab-constants.cpp b/src/backend/dab-constants.cpp
index f59cde2..7a50a63 100644
--- a/src/backend/dab-constants.cpp
+++ b/src/backend/dab-constants.cpp
@@ -31,7 +31,7 @@
#include <exception>
#include <sstream>
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
@@ -274,7 +274,7 @@ const char* DABConstants::getLanguageName(int language)
case 70: languageName = QT_TR_NOOP("Vietnamese"); break;
case 71: languageName = QT_TR_NOOP("Uzbek"); break;
case 72: languageName = QT_TR_NOOP("Urdu"); break;
- case 73: languageName = QT_TR_NOOP("Ukranian"); break;
+ case 73: languageName = QT_TR_NOOP("Ukrainian"); break;
case 74: languageName = QT_TR_NOOP("Thai"); break;
case 75: languageName = QT_TR_NOOP("Telugu"); break;
case 76: languageName = QT_TR_NOOP("Tatar"); break;
diff --git a/src/backend/dab_decoder.cpp b/src/backend/dab_decoder.cpp
index 1fc7223..2fae606 100644
--- a/src/backend/dab_decoder.cpp
+++ b/src/backend/dab_decoder.cpp
@@ -54,6 +54,8 @@ MP2Decoder::MP2Decoder(SubchannelSinkObserver* observer, bool float32) : Subchan
scf_crc_len = -1;
lsf = false;
+ // Reset DAB+ ACC error
+ observer->ACCFrameError(0);
int mpg_result;
diff --git a/src/backend/dabplus_decoder.cpp b/src/backend/dabplus_decoder.cpp
index 50dceac..838a91d 100644
--- a/src/backend/dabplus_decoder.cpp
+++ b/src/backend/dabplus_decoder.cpp
@@ -93,7 +93,7 @@ void SuperframeFilter::Feed(const uint8_t *data, size_t len) {
rs_dec.DecodeSuperframe(sf, sf_len, total_corr_count, uncorr_errors);
// forward statistics if errors present
- if(total_corr_count || uncorr_errors)
+ //if(total_corr_count || uncorr_errors)
observer->FECInfo(total_corr_count, uncorr_errors);
@@ -451,8 +451,7 @@ AACDecoderFAAD2::~AACDecoderFAAD2() {
void AACDecoderFAAD2::DecodeFrame(uint8_t *data, size_t len) {
// decode audio
uint8_t* output_frame = (uint8_t*) NeAACDecDecode(handle, &dec_frameinfo, data, len);
- if(dec_frameinfo.error)
- observer->AudioWarning("AAC");
+ observer->ACCFrameError(dec_frameinfo.error);
// abort, if no output at all
if(dec_frameinfo.bytesconsumed == 0 && dec_frameinfo.samples == 0)
diff --git a/src/backend/decoder_adapter.cpp b/src/backend/decoder_adapter.cpp
index f7920bf..a06046d 100644
--- a/src/backend/decoder_adapter.cpp
+++ b/src/backend/decoder_adapter.cpp
@@ -37,7 +37,7 @@ DecoderAdapter::DecoderAdapter(ProgrammeHandlerInterface &mr, int16_t bitRate, A
else if (dabModus == AudioServiceComponentType::DABPlus)
decoder = std::make_unique<SuperframeFilter>(this, true, false);
else
- throw std::runtime_error("DecoderAdapter: Unkonwn service component");
+ throw std::runtime_error("DecoderAdapter: Unknown service component");
// Open a dump file (XPADxpert) if the user defined it
if (!dumpFileName.empty()) {
@@ -94,8 +94,8 @@ void DecoderAdapter::PutAudio(const uint8_t *data, size_t len)
{
// Then len is given in bytes. For stereo it is the double times of mono.
// But we need two channels even if we have mono.
- // Mono: len = len / 2 * 2 We have len to devide by 2 and for two channels we have multiply by two
- // Stereo: len = len / 2 We just need to devide by 2 because it is stereo
+ // Mono: len = len / 2 * 2 We have len to divide by 2 and for two channels we have multiply by two
+ // Stereo: len = len / 2 We just need to divide by 2 because it is stereo
size_t bufferSize = audioChannels == 2 ? len/2 : len;
std::vector<int16_t> audio(bufferSize);
@@ -130,10 +130,9 @@ void DecoderAdapter::AudioError(const std::string &hint)
frameErrorCounter++;
}
-void DecoderAdapter::AudioWarning(const std::string &hint)
+void DecoderAdapter::ACCFrameError(const unsigned char error)
{
- (void)hint;
- myInterface.onAacErrors(1);
+ myInterface.onAacErrors(error);
}
void DecoderAdapter::FECInfo(int total_corr_count, bool uncorr_errors)
diff --git a/src/backend/decoder_adapter.h b/src/backend/decoder_adapter.h
index 6d2cf28..00c8118 100644
--- a/src/backend/decoder_adapter.h
+++ b/src/backend/decoder_adapter.h
@@ -54,7 +54,7 @@ class DecoderAdapter: public DabProcessor, public SubchannelSinkObserver, public
virtual void PutAudio(const uint8_t* /*data*/, size_t /*len*/);
virtual void ProcessPAD(const uint8_t* /*xpad_data*/, size_t /*xpad_len*/, bool /*exact_xpad_len*/, const uint8_t* /*fpad_data*/);
virtual void AudioError(const std::string& /*hint*/);
- virtual void AudioWarning(const std::string& /*hint*/);
+ virtual void ACCFrameError(const unsigned char /* error*/);
virtual void FECInfo(int /*total_corr_count*/, bool /*uncorr_errors*/);
// PADDecoderObserver impl
diff --git a/src/backend/eep-protection.cpp b/src/backend/eep-protection.cpp
index d32eaa4..a8d68d3 100644
--- a/src/backend/eep-protection.cpp
+++ b/src/backend/eep-protection.cpp
@@ -140,7 +140,7 @@ bool EEPProtection::deconvolve(const softbit_t *v, int32_t size, uint8_t *outBuf
}
}
// we had a final block of 24 bits with puncturing according to PI_X
- // This block constitues the 6 * 4 bits of the register itself.
+ // This block constitutes the 6 * 4 bits of the register itself.
for (i = 0; i < 24; i ++) {
if (PI_X [i] != 0)
viterbiBlock[viterbiCounter] = v [inputCounter ++];
diff --git a/src/backend/fib-processor.cpp b/src/backend/fib-processor.cpp
index 9cd170c..24942ed 100644
--- a/src/backend/fib-processor.cpp
+++ b/src/backend/fib-processor.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018
+ * Copyright (C) 2020
* Matthias P. Braendli (matthias.braendli@mpb.li)
*
* Copyright (C) 2014
@@ -108,7 +108,7 @@ void FIBProcessor::process_FIG0 (uint8_t *d)
}
-// FOG0/0 indicated a change in channel organization
+// FIG0/0 indicated a change in channel organization
// we are not equipped for that, so we just return
// control to the init
void FIBProcessor::FIG0Extension0 (uint8_t *d)
@@ -127,8 +127,6 @@ void FIBProcessor::FIG0Extension0 (uint8_t *d)
}
changeflag = getBits_2 (d, 16 + 16);
- if (changeflag == 0)
- return;
highpart = getBits_5 (d, 16 + 19) % 20;
(void)highpart;
@@ -137,7 +135,15 @@ void FIBProcessor::FIG0Extension0 (uint8_t *d)
occurrenceChange = getBits_8 (d, 16 + 32);
(void)occurrenceChange;
- // if (changeflag == 1) {
+ // In transmission mode I, because four ETI frames make one transmission frame, we will
+ // see lowpart == 0 only every twelve seconds, and not 6 as expected by the 250 overflow value.
+ if (lowpart == 0) {
+ timeLastFCT0Frame = std::chrono::system_clock::now();
+ }
+
+ if (changeflag == 0)
+ return;
+ // else if (changeflag == 1) {
// std::clog << "fib-processor:" << "Changes in sub channel organization\n") << std::endl;
// std::clog << "fib-processor:" << "cifcount = %d\n", highpart * 250 + lowpart) << std::endl;
// std::clog << "fib-processor:" << "Change happening in %d CIFs\n", occurrenceChange) << std::endl;
@@ -360,8 +366,9 @@ void FIBProcessor::FIG0Extension3 (uint8_t *d)
int16_t used = 2;
int16_t Length = getBits_5 (d, 3);
- while (used < Length)
+ while (used < Length) {
used = HandleFIG0Extension3 (d, used);
+ }
}
// DSCTy DataService Component Type
@@ -378,12 +385,12 @@ int16_t FIBProcessor::HandleFIG0Extension3(uint8_t *d, int16_t used)
ServiceComponent *packetComp = findPacketComponent(SCId);
used += 56 / 8;
- if (packetComp == NULL) // no ServiceComponent yet
- return used;
- packetComp->subchannelId = SubChId;
- packetComp->DSCTy = DSCTy;
- packetComp->DGflag = DGflag;
- packetComp->packetAddress = packetAddress;
+ if (packetComp) {
+ packetComp->subchannelId = SubChId;
+ packetComp->DSCTy = DSCTy;
+ packetComp->DGflag = DGflag;
+ packetComp->packetAddress = packetAddress;
+ }
return used;
}
@@ -439,38 +446,32 @@ int16_t FIBProcessor::HandleFIG0Extension8(
{
int16_t lOffset = used * 8;
uint32_t SId = getBits(d, lOffset, pdBit == 1 ? 32 : 16);
- uint8_t lsFlag;
- uint16_t SCIds;
- int16_t SCid;
- int16_t MSCflag;
- int16_t SubChId;
+ lOffset += (pdBit == 1 ? 32 : 16);
+
uint8_t extensionFlag;
- lOffset += pdBit == 1 ? 32 : 16;
- extensionFlag = getBits_1 (d, lOffset);
- SCIds = getBits_4 (d, lOffset + 4);
- lOffset += 8;
+ extensionFlag = getBits_1(d, lOffset);
+ uint16_t SCIds = getBits_4(d, lOffset + 4);
+ lOffset += 4;
- lsFlag = getBits_1 (d, lOffset + 8);
+ uint8_t lsFlag = getBits_1(d, lOffset);
if (lsFlag == 1) {
- SCid = getBits (d, lOffset + 4, 12);
+ int16_t SCid = getBits(d, lOffset + 4, 12);
lOffset += 16;
// if (findPacketComponent ((SCIds << 4) | SCid) != NULL) {
// std::clog << "fib-processor:" << "packet component bestaat !!\n") << std::endl;
// }
}
else {
- MSCflag = getBits_1 (d, lOffset + 1);
- SubChId = getBits_6 (d, lOffset + 2);
+ int16_t SubChId = getBits_6(d, lOffset + 4);
lOffset += 8;
}
- if (extensionFlag)
+
+ if (extensionFlag) {
lOffset += 8; // skip Rfa
+ }
(void)SId;
(void)SCIds;
- (void)SCid;
- (void)SubChId;
- (void)MSCflag;
return lOffset / 8;
}
@@ -1267,6 +1268,7 @@ void FIBProcessor::clearEnsemble()
services.clear();
serviceRepeatCount.clear();
timeLastServiceDecrement = std::chrono::steady_clock::now();
+ timeLastFCT0Frame = std::chrono::system_clock::now();
}
std::vector<Service> FIBProcessor::getServiceList() const
@@ -1328,3 +1330,9 @@ DabLabel FIBProcessor::getEnsembleLabel() const
std::lock_guard<std::mutex> lock(mutex);
return ensembleLabel;
}
+
+std::chrono::system_clock::time_point FIBProcessor::getTimeLastFCT0Frame() const
+{
+ std::lock_guard<std::mutex> lock(mutex);
+ return timeLastFCT0Frame;
+}
diff --git a/src/backend/fib-processor.h b/src/backend/fib-processor.h
index 48b24c6..921b01c 100644
--- a/src/backend/fib-processor.h
+++ b/src/backend/fib-processor.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018
+ * Copyright (C) 2020
* Matthias P. Braendli (matthias.braendli@mpb.li)
*
* Copyright (C) 2013
@@ -52,6 +52,7 @@ class FIBProcessor {
Service getService(uint32_t sId) const;
std::list<ServiceComponent> getComponents(const Service& s) const;
Subchannel getSubchannel(const ServiceComponent& sc) const;
+ std::chrono::system_clock::time_point getTimeLastFCT0Frame() const;
private:
RadioControllerInterface& myRadioInterface;
@@ -130,6 +131,7 @@ class FIBProcessor {
std::vector<Service> services;
std::unordered_map<uint32_t, uint8_t> serviceRepeatCount;
std::chrono::steady_clock::time_point timeLastServiceDecrement;
+ std::chrono::system_clock::time_point timeLastFCT0Frame;
};
#endif
diff --git a/src/backend/fic-handler.cpp b/src/backend/fic-handler.cpp
index 8fd6546..bca4cb5 100644
--- a/src/backend/fic-handler.cpp
+++ b/src/backend/fic-handler.cpp
@@ -181,7 +181,7 @@ void FicHandler::processFicInput(const softbit_t *ficblock, int16_t ficno)
/**
* we have a final block of 24 bits with puncturing according to PI_X
- * This block constitues the 6 * 4 bits of the register itself.
+ * This block constitutes the 6 * 4 bits of the register itself.
*/
for (k = 0; k < 24; k ++) {
if (PI_X [k] != 0) {
diff --git a/src/backend/ofdm-decoder.cpp b/src/backend/ofdm-decoder.cpp
index 1313b21..ff8793f 100644
--- a/src/backend/ofdm-decoder.cpp
+++ b/src/backend/ofdm-decoder.cpp
@@ -153,7 +153,7 @@ void OfdmDecoder::processPRS()
* within the signal region and bits outside.
* It is just an indication
*/
- snr = 0.7 * snr + 0.3 * get_snr(fft_buffer);
+ snr = 0.7 * snr + 0.3 * get_snr(fft_buffer, 1);
if (++snrCount > 10) {
radioInterface.onSNR(snr);
snrCount = 0;
@@ -234,26 +234,53 @@ void OfdmDecoder::decodeDataSymbol(int32_t sym_ix)
* K carriers.
* Just get the strength from the selected carriers compared
* to the strength of the carriers outside that region
+ * method: 0 Jans method. This method are originally developed by Jan and is not working if neighbor channels are used because it uses occupied bins for the noise calculation
+ * 1 New method. This method is working also if neighbor channels are used
*/
-int16_t OfdmDecoder::get_snr(DSPCOMPLEX *v)
+int16_t OfdmDecoder::get_snr(DSPCOMPLEX *v, uint8_t method)
{
int16_t i;
DSPFLOAT noise = 0;
DSPFLOAT signal = 0;
const auto T_u = params.T_u;
- int16_t low = T_u / 2 - params.K / 2;
- int16_t high = low + params.K;
+ const auto K = params.K;
+ int16_t low = T_u / 2 - K / 2;
+ int16_t high = low + K;
- for (i = 10; i < low - 20; i ++)
- noise += abs (v[(T_u / 2 + i) % T_u]);
+ if(method)
+ {
+ for (i = 70; i < low - 20; i ++) // low - 90 samples
+ noise += abs (v[(T_u / 2 + i) % T_u]);
- for (i = high + 20; i < T_u - 10; i ++)
- noise += abs (v[(T_u / 2 + i) % T_u]);
+ for (i = high + 20; i < high + 120; i ++) // 100 samples
+ noise += abs (v[(T_u / 2 + i) % T_u]);
- noise /= (low - 30 + T_u - high - 30);
- for (i = T_u / 2 - params.K / 4; i < T_u / 2 + params.K / 4; i ++)
- signal += abs (v[(T_u / 2 + i) % T_u]);
+ noise /= (low - 90 + 100);
+ for (i = T_u / 2 - K / 4; i < T_u / 2 + K / 4; i ++)
+ signal += abs (v[(T_u / 2 + i) % T_u]);
- return get_db_over_256(signal / (params.K / 2)) - get_db_over_256(noise);
-}
+ const auto dB_signal_new = get_db_over_256(signal / (K / 2));
+ const auto dB_noise_new = get_db_over_256(noise);
+ const auto snr_new = dB_signal_new - dB_noise_new;
+ return snr_new;
+ }
+ else
+ {
+ noise = 0;
+ signal = 0;
+ for (i = 10; i < low - 20; i ++)
+ noise += abs (v[(T_u / 2 + i) % T_u]);
+
+ for (i = high + 20; i < T_u - 10; i ++)
+ noise += abs (v[(T_u / 2 + i) % T_u]);
+ noise /= (low - 30 + T_u - high - 30);
+ for (i = T_u / 2 - K / 4; i < T_u / 2 + K / 4; i ++)
+ signal += abs (v[(T_u / 2 + i) % T_u]);
+
+ const auto dB_signal_old = get_db_over_256(signal / (K / 2));
+ const auto dB_noise_old = get_db_over_256(noise);
+ const auto snr_old = dB_signal_old - dB_noise_old;
+ return snr_old;
+ }
+}
diff --git a/src/backend/ofdm-decoder.h b/src/backend/ofdm-decoder.h
index ac3a9a7..5be96b4 100644
--- a/src/backend/ofdm-decoder.h
+++ b/src/backend/ofdm-decoder.h
@@ -50,7 +50,7 @@ class OfdmDecoder
void pushAllSymbols(std::vector<std::vector<DSPCOMPLEX> >&& sym);
void reset();
private:
- int16_t get_snr(DSPCOMPLEX *);
+ int16_t get_snr(DSPCOMPLEX *, uint8_t method);
const DABParams& params;
RadioControllerInterface& radioInterface;
@@ -76,7 +76,7 @@ class OfdmDecoder
std::vector<softbit_t> ibits;
int16_t snrCount = 0;
- int16_t snr = 0;
+ float snr = 0;
const double mer_alpha = 1e-7;
std::atomic<double> mer = ATOMIC_VAR_INIT(0.0);
diff --git a/src/backend/ofdm-processor.cpp b/src/backend/ofdm-processor.cpp
index 6afdc08..62f1e93 100644
--- a/src/backend/ofdm-processor.cpp
+++ b/src/backend/ofdm-processor.cpp
@@ -230,7 +230,7 @@ void OFDMProcessor::getSamples(DSPCOMPLEX *v, int16_t n, int32_t phase)
* time synchronization and frequency synchronization
* Identifying symbols in the DAB frame
* and sending them to the ofdmDecoder who will transfer the results
- * Finally, estimating the small freqency error
+ * Finally, estimating the small frequency error
*/
void OFDMProcessor::run()
{
diff --git a/src/backend/radio-controller.h b/src/backend/radio-controller.h
index 8f68734..7d4358f 100644
--- a/src/backend/radio-controller.h
+++ b/src/backend/radio-controller.h
@@ -83,7 +83,7 @@ enum class message_level_t { Information, Error };
class RadioControllerInterface {
public:
/* Signal-to-Noise Ratio was calculated. snr is a value in dB. */
- virtual void onSNR(int snr) = 0;
+ virtual void onSNR(float snr) = 0;
/* The frequency corrector estimated a new correction. The frequency
* correction consists of a coarse and a fine value, both having the
@@ -132,7 +132,7 @@ class RadioControllerInterface {
virtual void onInputFailure(void) { };
};
-/* A Programme Hander is associated to each tuned programme in the ensemble.
+/* A Programme Handler is associated to each tuned programme in the ensemble.
*/
class ProgrammeHandlerInterface {
public:
diff --git a/src/backend/radio-receiver.cpp b/src/backend/radio-receiver.cpp
index 2685a1e..4bd9a35 100644
--- a/src/backend/radio-receiver.cpp
+++ b/src/backend/radio-receiver.cpp
@@ -221,3 +221,10 @@ DABParams& RadioReceiver::getParams()
{
return params;
}
+
+RadioReceiverStats RadioReceiver::getReceiverStats() const
+{
+ RadioReceiverStats s;
+ s.timeLastFCT0Frame = ficHandler.fibProcessor.getTimeLastFCT0Frame();
+ return s;
+}
diff --git a/src/backend/radio-receiver.h b/src/backend/radio-receiver.h
index 5aa7034..2e0c6e9 100644
--- a/src/backend/radio-receiver.h
+++ b/src/backend/radio-receiver.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018
+ * Copyright (C) 2020
* Matthias P. Braendli (matthias.braendli@mpb.li)
*
* Copyright (C) 2017
@@ -33,6 +33,7 @@
#ifndef RADIO_RECEIVER_H
#define RADIO_RECEIVER_H
+#include <chrono>
#include <memory>
#include <string>
#include "radio-controller.h"
@@ -44,6 +45,10 @@
const char* fftPlacementMethodToString(FFTPlacementMethod fft_placement);
const char* freqSyncMethodToString(FreqsyncMethod method);
+struct RadioReceiverStats {
+ std::chrono::system_clock::time_point timeLastFCT0Frame;
+};
+
class RadioReceiver {
public:
RadioReceiver(
@@ -93,7 +98,9 @@ class RadioReceiver {
*/
Subchannel getSubchannel(const ServiceComponent& sc) const;
- DABParams& getParams(void);
+ DABParams& getParams();
+
+ RadioReceiverStats getReceiverStats() const;
private:
bool playProgramme(ProgrammeHandlerInterface& handler,
diff --git a/src/backend/subchannel_sink.h b/src/backend/subchannel_sink.h
index ea4827e..826c9d2 100644
--- a/src/backend/subchannel_sink.h
+++ b/src/backend/subchannel_sink.h
@@ -36,7 +36,7 @@ struct AUDIO_SERVICE_FORMAT {
AUDIO_SERVICE_FORMAT() : samplerate_khz(0), bitrate_kbps(0) {}
std::string GetSummary() const {
- return codec + ", " + std::to_string(samplerate_khz) + " kHz " + mode + " @ " + std::to_string(bitrate_kbps) + " kBit/s";
+ return codec + ", " + std::to_string(samplerate_khz) + " kHz " + mode + " @ " + std::to_string(bitrate_kbps) + " kbit/s";
}
};
@@ -52,7 +52,7 @@ public:
virtual void ProcessPAD(const uint8_t* /*xpad_data*/, size_t /*xpad_len*/, bool /*exact_xpad_len*/, const uint8_t* /*fpad_data*/) {}
virtual void AudioError(const std::string& /*hint*/) {}
- virtual void AudioWarning(const std::string& /*hint*/) {}
+ virtual void ACCFrameError(const unsigned char /* error*/) {}
virtual void FECInfo(int /*total_corr_count*/, bool /*uncorr_errors*/) {}
};
diff --git a/src/backend/uep-protection.cpp b/src/backend/uep-protection.cpp
index 095f780..1fd845f 100644
--- a/src/backend/uep-protection.cpp
+++ b/src/backend/uep-protection.cpp
@@ -223,7 +223,7 @@ bool UEPProtection::deconvolve(const softbit_t *v, int32_t size, uint8_t *outBuf
/**
* we have a final block of 24 bits with puncturing according to PI_X
- * This block constitues the 6 * 4 bits of the register itself.
+ * This block constitutes the 6 * 4 bits of the register itself.
*/
for (i = 0; i < 24; i ++) {
if (PI_X[i] != 0) {
diff --git a/src/input/airspy_sdr.cpp b/src/input/airspy_sdr.cpp
index 0cb6fca..b87189e 100644
--- a/src/input/airspy_sdr.cpp
+++ b/src/input/airspy_sdr.cpp
@@ -35,7 +35,7 @@
#include <iostream>
#include "airspy_sdr.h"
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
diff --git a/src/input/input_factory.cpp b/src/input/input_factory.cpp
index 1a64c7c..e28f4f8 100644
--- a/src/input/input_factory.cpp
+++ b/src/input/input_factory.cpp
@@ -28,7 +28,7 @@
#include <iostream>
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
@@ -71,7 +71,7 @@ CVirtualInput *CInputFactory::GetDevice(RadioControllerInterface& radioControlle
else
InputDevice = GetManualDevice(radioController, device);
- // Fallback if no device is found or an error occured
+ // Fallback if no device is found or an error occurred
if (InputDevice == nullptr) {
std::string text;
@@ -119,7 +119,7 @@ CVirtualInput *CInputFactory::GetDevice(RadioControllerInterface &radioControlle
"Error while opening device \"" << static_cast<int>(deviceId) << "\"." << std::endl;
}
- // Fallback if no device is found or an error occured
+ // Fallback if no device is found or an error occurred
if (InputDevice == nullptr) {
std::string text = QT_TRANSLATE_NOOP("CRadioController", "Error while opening device");
radioController.onMessage(message_level_t::Error, text);
@@ -153,7 +153,7 @@ CVirtualInput* CInputFactory::GetAutoDevice(RadioControllerInterface& radioContr
}
}
catch (...) {
- // An error occured. Maybe the device isn't present.
+ // An error occurred. Maybe the device isn't present.
// Just try the next input device
}
diff --git a/src/input/limesdr.cpp b/src/input/limesdr.cpp
index 51c7cc2..0dfd9bd 100644
--- a/src/input/limesdr.cpp
+++ b/src/input/limesdr.cpp
@@ -31,7 +31,7 @@
#include <iostream>
#include "limesdr.h"
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
diff --git a/src/input/raw_file.cpp b/src/input/raw_file.cpp
index d585d2a..284a0ac 100644
--- a/src/input/raw_file.cpp
+++ b/src/input/raw_file.cpp
@@ -41,7 +41,7 @@
#include "raw_file.h"
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
diff --git a/src/input/rtl_sdr.cpp b/src/input/rtl_sdr.cpp
index 58739fa..633c163 100644
--- a/src/input/rtl_sdr.cpp
+++ b/src/input/rtl_sdr.cpp
@@ -35,7 +35,7 @@
#include "rtl_sdr.h"
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
@@ -71,7 +71,7 @@ void CRTL_SDR::open_device()
std::clog << "RTL_SDR: " << "Found " << deviceCount << " devices. Uses the first working one" << std::endl;
}
- // Iterate over all found rtl-sdr devices and try to open it. Stops if one device is successfull opened.
+ // Iterate over all found rtl-sdr devices and try to open it. Stops if one device is successful opened.
for(uint32_t i=0; i<deviceCount; i++) {
ret = rtlsdr_open(&device, i);
if (ret >= 0) {
@@ -138,7 +138,7 @@ bool CRTL_SDR::restart(void)
try {
open_device();
} catch (...) {
- // An error occured. Maybe the device isn't present.
+ // An error occurred. Maybe the device isn't present.
radioController.onMessage(message_level_t::Error, QT_TRANSLATE_NOOP("CRadioController", "Error opening RTL-SDR. See log for details."));
return false;
}
diff --git a/src/input/rtl_tcp.cpp b/src/input/rtl_tcp.cpp
index 60e23c1..2fbc3a1 100644
--- a/src/input/rtl_tcp.cpp
+++ b/src/input/rtl_tcp.cpp
@@ -31,9 +31,11 @@
*/
#include <iostream>
+#include <sys/time.h>
+
#include "rtl_tcp.h"
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
#ifdef QT_CORE_LIB
#include <QtGlobal>
#else
@@ -60,9 +62,18 @@ enum rtlsdr_tuner {
#define ONE_BYTE 8
+static inline int64_t getMyTime(void)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ return ((int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec);
+}
+
CRTL_TCP_Client::CRTL_TCP_Client(RadioControllerInterface& radioController) :
radioController(radioController),
sampleBuffer(32 * 32768),
+ sampleNetworkBuffer(256 * 32768),
spectrumSampleBuffer(8192)
{
memset(&dongleInfo, 0, sizeof(dongle_info_t));
@@ -71,6 +82,7 @@ CRTL_TCP_Client::CRTL_TCP_Client(RadioControllerInterface& radioController) :
CRTL_TCP_Client::~CRTL_TCP_Client(void)
{
+ std::clog << "RTL_TCP_CLIENT: deleting ..." << std::endl;
stop();
}
@@ -93,6 +105,9 @@ bool CRTL_TCP_Client::restart(void)
rtlsdrRunning = true;
+ networkBufferThread = std::thread(&CRTL_TCP_Client::networkBufferCopy, this);
+ networkBufferThread.detach();
+
receiveThread = std::thread(&CRTL_TCP_Client::receiveAndReconnect, this);
receiveThread.detach();
@@ -117,12 +132,12 @@ void CRTL_TCP_Client::stop(void)
std::unique_lock<std::mutex> lock(mutex);
- agcRunning = false;
- rtlsdrRunning = false;
-
// Close connection
sock.close();
+ agcRunning = false;
+ rtlsdrRunning = false;
+
lock.unlock();
if (agcThread.joinable()) {
@@ -132,6 +147,12 @@ void CRTL_TCP_Client::stop(void)
if (receiveThread.joinable()) {
receiveThread.join();
}
+
+ if (networkBufferThread.joinable()) {
+ networkBufferThread.join();
+ }
+
+ connected = false;
}
static int32_t read_convert_from_buffer(
@@ -166,12 +187,15 @@ std::vector<DSPCOMPLEX> CRTL_TCP_Client::getSpectrumSamples(int size)
int32_t CRTL_TCP_Client::getSamplesToRead(void)
{
- return sampleBuffer.GetRingBufferReadAvailable () / 2;
+ return sampleBuffer.GetRingBufferReadAvailable() / 2;
}
void CRTL_TCP_Client::reset(void)
{
sampleBuffer.FlushRingBuffer();
+ sampleNetworkBuffer.FlushRingBuffer();
+ spectrumSampleBuffer.FlushRingBuffer();
+ firstFilledNetworkBuffer = false;
}
void CRTL_TCP_Client::receiveData(void)
@@ -249,8 +273,22 @@ void CRTL_TCP_Client::receiveData(void)
}
}
- sampleBuffer.putDataIntoBuffer(buffer.data(), buffer.size());
- spectrumSampleBuffer.putDataIntoBuffer(buffer.data(), buffer.size());
+ sampleNetworkBuffer.putDataIntoBuffer(buffer.data(), buffer.size());
+
+ // First fill the complete buffer to avoid sound outtages if the stream data rate is not stable e.g. over WIFI
+ if(!firstFilledNetworkBuffer) {
+ float bufferFill = (float) sampleNetworkBuffer.GetRingBufferReadAvailable() / sampleNetworkBuffer.GetBufferSize() * 100;
+
+ // Wait for 50% filled buffer
+ if(bufferFill >= 50)
+ firstFilledNetworkBuffer = true;
+
+ if((getMyTime() - oldTime_us > 100e3) || firstFilledNetworkBuffer) {
+ //std::clog << "RTL_TCP_CLIENT: Fill network buffer " << bufferFill << "%" << std::endl;
+ oldTime_us = getMyTime();
+ }
+ }
+
// Check if device is overloaded
minAmplitude = 255;
@@ -400,6 +438,8 @@ void CRTL_TCP_Client::receiveAndReconnect()
agcRunning = true;
agcThread = std::thread(&CRTL_TCP_Client::agcTimer, this);
}
+ firstData = true;
+ reset(); // Clear buffers
}
else {
std::clog << "RTL_TCP_CLIENT: Could not connect to server" <<
@@ -425,6 +465,56 @@ void CRTL_TCP_Client::receiveAndReconnect()
}
}
+#define NETWORK_BUFFER_READ_SAMPLES 32768
+void CRTL_TCP_Client::networkBufferCopy()
+{
+ std::vector<uint8_t> tempBuffer(NETWORK_BUFFER_READ_SAMPLES * 2);
+
+ while (rtlsdrRunning) {
+ if(!firstFilledNetworkBuffer) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ nextStop_us = getMyTime();
+ continue;
+ }
+
+ int32_t samples = NETWORK_BUFFER_READ_SAMPLES;
+
+ // Figure out the max samples to read from network buffer
+ int32_t samplesInBuffer = sampleNetworkBuffer.GetRingBufferReadAvailable() / 2;
+ if(samplesInBuffer < samples)
+ samples = samplesInBuffer;
+
+ if(samples == 0) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(100));
+ nextStop_us = getMyTime();
+ continue;
+ }
+
+ // Read data
+ int32_t amount = sampleNetworkBuffer.getDataFromBuffer(tempBuffer.data(), 2 * samples);
+
+ // Write data to standard buffers
+ sampleBuffer.putDataIntoBuffer(tempBuffer.data(), amount);
+ spectrumSampleBuffer.putDataIntoBuffer(tempBuffer.data(), amount);
+
+ if(getMyTime() - oldTime_us > 500e3) { // 500 ms
+
+ float bufferFill = (float) sampleNetworkBuffer.GetRingBufferReadAvailable() / sampleNetworkBuffer.GetBufferSize() * 100;
+ //std::clog << "RTL_TCP_CLIENT: Network buffer fill level " << bufferFill << "%" << std::endl;
+
+ oldTime_us = getMyTime();
+ }
+
+
+ uint32_t period_us = samples / ((float) INPUT_RATE / 1e6);
+ nextStop_us += period_us;
+ int64_t timeToWait_us = nextStop_us - getMyTime();
+
+ // Send thread to sleep
+ std::this_thread::sleep_for(std::chrono::microseconds(timeToWait_us));
+ }
+}
+
void CRTL_TCP_Client::agcTimer(void)
{
while (agcRunning) {
diff --git a/src/input/rtl_tcp.h b/src/input/rtl_tcp.h
index 5228a37..bcf62c1 100644
--- a/src/input/rtl_tcp.h
+++ b/src/input/rtl_tcp.h
@@ -82,6 +82,7 @@ private:
void agcTimer(void);
void receiveData(void);
void receiveAndReconnect(void);
+ void networkBufferCopy(void);
void handleDisconnect(void);
std::mutex mutex;
@@ -89,6 +90,7 @@ private:
std::thread receiveThread;
bool agcRunning = false;
std::thread agcThread;
+ std::thread networkBufferThread;
float currentGain = 0;
uint16_t currentGainCount = 0;
@@ -98,6 +100,7 @@ private:
bool isHwAGC = false;
int frequency = kHz(220000);
RingBuffer<uint8_t> sampleBuffer;
+ RingBuffer<uint8_t> sampleNetworkBuffer;
RingBuffer<uint8_t> spectrumSampleBuffer;
bool connected = false;
bool rtlsdrRunning = false;
@@ -105,6 +108,9 @@ private:
uint16_t serverPort = 1234;
bool firstData = true;
+ bool firstFilledNetworkBuffer = false;
+ int64_t oldTime_us = 0;
+ int64_t nextStop_us = 0;
dongle_info_t dongleInfo;
// Gain values for the different tuners
diff --git a/src/input/soapy_sdr.cpp b/src/input/soapy_sdr.cpp
index e3d039f..cef8c78 100644
--- a/src/input/soapy_sdr.cpp
+++ b/src/input/soapy_sdr.cpp
@@ -47,6 +47,24 @@ CSoapySdr::CSoapySdr(RadioControllerInterface& radioController) :
m_sampleBuffer(1024 * 1024),
m_spectrumSampleBuffer(8192)
{
+ //enumerate devices
+ const std::string args ="";
+ const auto foundDevices = SoapySDR::Device::enumerate("");
+
+ int nonAudioDeviceCount = 0;
+ for(auto found: foundDevices)
+ {
+ std::clog << "SoapySDR: Found device \"" << found.at("driver") << " \'" << found.at("label") << "\' \"" << std::endl;
+
+ if(found.at("driver").compare("audio") != 0)
+ nonAudioDeviceCount++;
+ }
+
+ if(nonAudioDeviceCount == 0)
+ {
+ std::clog << "SoapySDR: " << "No usable SDR device found" << std::endl;
+ throw 0;
+ }
}
CSoapySdr::~CSoapySdr()
@@ -60,7 +78,7 @@ void CSoapySdr::setFrequency(int Frequency)
if (m_device != nullptr) {
m_device->setFrequency(SOAPY_SDR_RX, 0, Frequency);
m_freq = m_device->getFrequency(SOAPY_SDR_RX, 0);
- std::clog << "OutputSoapySDR:Actual frequency: " <<
+ std::clog << "SoapySDR:Actual frequency: " <<
m_freq / 1000.0 <<
" kHz." << std::endl;
}
@@ -106,7 +124,7 @@ bool CSoapySdr::restart()
m_device->getMasterClockRate()/1000.0 << " kHz" << std::endl;
m_device->setSampleRate(SOAPY_SDR_RX, 0, INPUT_RATE);
- std::clog << "OutputSoapySDR:Actual RX rate: " <<
+ std::clog << "SoapySDR:Actual RX rate: " <<
m_device->getSampleRate(SOAPY_SDR_RX, 0) / 1000.0 <<
" ksps." << std::endl;
@@ -344,7 +362,8 @@ void CSoapySdr::workerthread()
std::vector<size_t> channels;
channels.push_back(0);
std::clog << " *************** Setup soapy stream" << std::endl;
- auto stream = m_device->setupStream(SOAPY_SDR_RX, "CF32", channels);
+ auto args = SoapySDR::KwargsFromString(m_driver_args);
+ auto stream = m_device->setupStream(SOAPY_SDR_RX, "CF32", channels, args);
m_device->activateStream(stream);
try {
diff --git a/src/tests/backend_tests.cpp b/src/tests/backend_tests.cpp
index 7ec540c..8cb1982 100644
--- a/src/tests/backend_tests.cpp
+++ b/src/tests/backend_tests.cpp
@@ -39,7 +39,7 @@
class TestRadioInterface : public RadioControllerInterface {
public:
- virtual void onSNR(int snr) override { (void)snr; }
+ virtual void onSNR(float snr) override { (void)snr; }
virtual void onFrequencyCorrectorChange(int fine, int coarse) override { (void)fine; (void)coarse; }
virtual void onSyncChange(char isSync) override { (void)isSync; }
virtual void onSignalPresence(bool isSignal) override { (void)isSignal; }
@@ -132,7 +132,7 @@ void BackendTests::runRadio(const std::string &rawFileName,
}
else
{
- std::cout << "Tune to " << service.serviceLabel.utf8_label() << " succesfully" << std::endl;
+ std::cout << "Tune to " << service.serviceLabel.utf8_label() << " successfully" << std::endl;
service_selected = true;
}
break;
diff --git a/src/various/channels.cpp b/src/various/channels.cpp
index 4cfcfcf..c49d8d6 100644
--- a/src/various/channels.cpp
+++ b/src/various/channels.cpp
@@ -118,7 +118,7 @@ int Channels::getFrequency(const string& channelName)
currentFrequency = frequency;
currentChannel = channelName;
- // Get index of current fequency
+ // Get index of current frequency
for (int i=0; i<NUMBEROFCHANNELS; i++) {
if (getChannelNameAtIndex(i) == channelName) {
currentFrequencyIndex = i;
diff --git a/src/various/ringbuffer.h b/src/various/ringbuffer.h
index 5198ccf..54a9d7d 100644
--- a/src/various/ringbuffer.h
+++ b/src/various/ringbuffer.h
@@ -163,6 +163,10 @@ class RingBuffer
* functions for checking available data for reading and space
* for writing
*/
+ int32_t GetBufferSize(void) {
+ return bufferSize;
+ }
+
int32_t GetRingBufferReadAvailable (void) {
return (writeIndex - readIndex) & bigMask;
}
diff --git a/src/welle-cli/alsa-output.cpp b/src/welle-cli/alsa-output.cpp
index b35abbb..6c570f1 100644
--- a/src/welle-cli/alsa-output.cpp
+++ b/src/welle-cli/alsa-output.cpp
@@ -58,7 +58,7 @@ AlsaOutput::AlsaOutput(int chans, unsigned int rate) :
fprintf(stderr, "ERROR: Can't set rate. %s\n", snd_strerror(err));
if ((err = snd_pcm_hw_params(pcm_handle, params)) < 0)
- fprintf(stderr, "ERROR: Can't set harware parameters. %s\n",
+ fprintf(stderr, "ERROR: Can't set hardware parameters. %s\n",
snd_strerror(err));
fprintf(stderr, "PCM name: '%s'\n", snd_pcm_name(pcm_handle));
diff --git a/src/welle-cli/doc/man/update_manpage.sh b/src/welle-cli/doc/man/update_manpage.sh
new file mode 100755
index 0000000..1fd3cc1
--- /dev/null
+++ b/src/welle-cli/doc/man/update_manpage.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+help2man \
+ --name "welle.io command line interface" \
+ --no-info \
+ --no-discard-stderr \
+ --help-option='-h' \
+ --version-option="-v" \
+ --output welle-cli.1 \
+ welle-cli
diff --git a/src/welle-cli/doc/man/welle-cli.1 b/src/welle-cli/doc/man/welle-cli.1
new file mode 100644
index 0000000..7dc4371
--- /dev/null
+++ b/src/welle-cli/doc/man/welle-cli.1
@@ -0,0 +1,133 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1.
+.TH WELLE-CLI "1" "November 2021" "welle-cli 2.4" "User Commands"
+.SH NAME
+welle-cli \- welle.io command line interface
+.SH SYNOPSIS
+.B welle-cli
+[\fI\,OPTION\/\fR]
+.br
+.B welle-cli
+\fI\,-w <port> \/\fR[\fI\,OPTION\/\fR]
+.SH DESCRIPTION
+welle\-cli is welle.io's command line interface.
+.SH OPTIONS
+.SS "Tuning:"
+.TP
+\fB\-c\fR channel
+Tune to <channel> (eg. 10B, 5A, LD...).
+.TP
+\fB\-p\fR programme
+Play <programme> with ALSA (text name of the radio: eg. GRIFF).
+.SS "Dumping:"
+.TP
+\fB\-D\fR
+Dump FIC and all programmes to files (cannot be used with \fB\-C\fR).
+This generates: dump.fic; <programme_name.msc> files;
+<programme_name.wav> files.
+.TP
+\fB\-d\fR
+Dump programme to <programme_name.msc> file.
+.SS "Web server mode:"
+.TP
+\fB\-w\fR port
+Enable web server on port <port>.
+.TP
+\fB\-C\fR number
+Number of programmes to decode in a carousel
+(to be used with \fB\-w\fR, cannot be used with \fB\-D\fR).
+This is useful if your machine cannot decode all programmes
+simultaneously, but you still want to get an overview of
+the ensemble.
+.TP
+\fB\-P\fR
+Without the \fB\-P\fR option, welle\-cli will switch every 10 seconds.
+With the \fB\-P\fR option, welle\-cli will switch once DLS and a
+slide were decoded, staying at most 80 seconds on a given
+programme.
+.SS "Backend and input options:"
+.TP
+\fB\-f\fR file
+Read an IQ file <file> and play with ALSA
+IQ file format is u8, unless the file ends with FORMAT.iq
+.TP
+\fB\-u\fR
+Disable coarse corrector, for receivers who have a low
+frequency offset.
+.TP
+\fB\-g\fR gain
+Set input gain to <gain> or \fB\-1\fR for auto gain.
+.TP
+\fB\-F\fR driver
+Set input driver and arguments. Default: "auto".
+Valid drivers depending on compilation options at build time
+are:
+airspy, rtl_sdr, android_rtl_sdr, rtl_tcp, soapysdr.
+With "rtl_tcp", host IP and port can be specified as
+"rtl_tcp,<HOST_IP>:<PORT>".
+.TP
+\fB\-s\fR args
+SoapySDR Driver arguments.
+.TP
+\fB\-A\fR antenna
+Set input antenna to ANT (for SoapySDR input only).
+.TP
+\fB\-T\fR
+Disable TII decoding to reduce CPU usage.
+.SS "Other options:"
+.TP
+\fB\-t\fR test_id
+Run test <test_id>.
+To understand what the tests do, please see source code.
+.TP
+\fB\-h\fR
+Display this help and exit.
+.TP
+\fB\-v\fR
+Output version information and exit.
+.SH EXAMPLES
+welle\-cli \-c 10B \-p GRRIF
+.IP
+Receive 'GRRIF' on channel '10B' using 'auto' driver, and play with ALSA.
+.PP
+welle\-cli \-f ./ofdm.iq \-p GRRIF
+.IP
+Read IQ file './ofdm.iq' (in u8 format) and play programme 'GRIFF' with ALSA.
+.PP
+welle\-cli \-f ./ofdm.iq \-t 1
+.IP
+Read IQ file './ofdm.iq' (in u8 format), and run test 1.
+.PP
+welle\-cli \-c 10B \-D
+.IP
+Dump FIC and all programmes of channel 10B to files.
+.PP
+welle\-cli \-c 10B \-w 8000
+.IP
+Enable web server on port 8000, decode programmes on channel 10B on demand
+(http://localhost:8000).
+.PP
+welle\-cli \-c 10B \-Dw 8000
+.IP
+Enable web server on port 8000, decode all programmes on channel 10B.
+.PP
+welle\-cli \-c 10B \-C 1 \-w 8000
+.IP
+Enable web server on port 8000, decode programmes one by one in a carousel
+on channel 10B; welle\-cli will switch every 10 seconds.
+.PP
+welle\-cli \-c 10B \-PC 1 \-w 8000
+.IP
+Enable web server on port 8000, decode programmes one by one in a carousel
+on channel 10B; welle\-cli will switch once DLS and a slide were decoded,
+staying at most 80 seconds on a given programme.
+.SH AUTHOR
+Written by: Albrecht Lohofener & Matthias P. Braendli.
+Other contributors: <https://github.com/AlbrechtL/welle.io/blob/master/AUTHORS>
+.SH "REPORTING BUGS"
+Report bugs to: <https://github.com/AlbrechtL/welle.io/issues>
+.SH COPYRIGHT
+Copyright \(co 2018 Matthias P. Braendli.
+.br
+Copyright \(co 2017 Albrecht Lohofener.
+License GPL\-2.0\-or\-later: GNU General Public License v2.0 or later
+<https://www.gnu.org/licenses/old\-licenses/gpl\-2.0\-standalone.html>
diff --git a/src/welle-cli/index.html b/src/welle-cli/index.html
index 353aaca..e1ab496 100644
--- a/src/welle-cli/index.html
+++ b/src/welle-cli/index.html
@@ -105,6 +105,7 @@ canvas {
Channel: <select id="channelselector" name="channel"></select>
FFT Placement: <select id="fftwindowselector" name="fftwindow"></select>
Coarse freq corrector: <input type="checkbox" id="coarsecheckbox">
+ <p><a href="/mux.m3u">Get m3u playlist</a>. <a href="/mux.json">Get mux json</a>. <a href="/fic">Get FIC stream</a>.</p>
</div>
<div id="ensembleinfo"></div>
diff --git a/src/welle-cli/index.js b/src/welle-cli/index.js
index 0b22814..5ea45f9 100644
--- a/src/welle-cli/index.js
+++ b/src/welle-cli/index.js
@@ -159,6 +159,7 @@ function ensembleInfoTemplate() {
html += ' <th><abbr title="Local Time Offset">LTO</abbr></th></th>';
html += ' <th>FIC CRC Errors</th>';
html += ' <th>Tuned at</th>';
+ html += ' <th>FCT0 frame received at</th>';
html += ' </tr>';
html += ' <tr><td>${EId}</td>';
html += ' <td>${ecc}</td>';
@@ -168,7 +169,8 @@ function ensembleInfoTemplate() {
html += ' <td>${year}-${month}-${day} ${hour}:${minutes} UTC</td>';
html += ' <td>${lto}</td>';
html += ' <td>${ficcrcerrors}</td>';
- html += ' <td>${lastchannelchange}</td></tr>';
+ html += ' <td>${lastchannelchange}</td>';
+ html += ' <td>${lastfct0frame}</td></tr>';
html += ' </table><br> <button type=button onclick="stopPlayer()">Stop</button><br><br>';
html += '';
html += '<table id="servicetable">';
@@ -419,8 +421,10 @@ function populateEnsembleinfo() {
ens["FrequencyCorrection"] = data.demodulator.frequencycorrection;
ens["services"] = servicehtml;
ens["ficcrcerrors"] = data.demodulator.fic.numcrcerrors;
- var lcc = new Date(data.receiver.software.lastchannelchange * 1000);
+ var lcc = new Date(data.receiver.software.lastchannelchange);
ens["lastchannelchange"] = lcc.toISOString();
+ var lfct0 = new Date(data.demodulator.time_last_fct0_frame);
+ ens["lastfct0frame"] = lfct0.toISOString();
var ei = document.getElementById('ensembleinfo');
ei.innerHTML = parseTemplate(ensembleInfoTemplate(), ens);
diff --git a/src/welle-cli/jsonconvert.cpp b/src/welle-cli/jsonconvert.cpp
index d57450f..95a2afb 100644
--- a/src/welle-cli/jsonconvert.cpp
+++ b/src/welle-cli/jsonconvert.cpp
@@ -46,13 +46,17 @@ static void to_json(nlohmann::json& j, const DabLabel& l)
static void to_json(nlohmann::json& j, const SoftwareJson& s) {
+ uint64_t lastchannelchange_ms =
+ std::chrono::duration_cast<std::chrono::milliseconds>(
+ s.lastchannelchange.time_since_epoch()).count();
+
j = nlohmann::json{
{"name", s.name},
{"version", s.version},
{"fftwindowplacement", s.fftwindowplacement},
{"coarsecorrectorenabled", s.coarsecorrectorenabled},
{"freqsyncmethod", s.freqsyncmethod},
- {"lastchannelchange", s.lastchannelchange}
+ {"lastchannelchange", lastchannelchange_ms}
};
}
@@ -217,6 +221,10 @@ static void to_json(nlohmann::json& j, const MuxJson& mux) {
};
j["demodulator"]["fic"]["numcrcerrors"] = mux.demodulator_fic_numcrcerrors;
+ uint64_t timelastfct0_ms =
+ std::chrono::duration_cast<std::chrono::milliseconds>(
+ mux.demodulator_timelastfct0frame.time_since_epoch()).count();
+ j["demodulator"]["time_last_fct0_frame"] = timelastfct0_ms;
j["demodulator"]["snr"] = mux.demodulator_snr;
j["demodulator"]["frequencycorrection"] = mux.demodulator_frequencycorrection;
}
diff --git a/src/welle-cli/jsonconvert.h b/src/welle-cli/jsonconvert.h
index db6607f..8f7ff48 100644
--- a/src/welle-cli/jsonconvert.h
+++ b/src/welle-cli/jsonconvert.h
@@ -25,6 +25,7 @@
#pragma once
#include <string>
+#include <chrono>
#include <list>
#include <vector>
#include <memory>
@@ -38,7 +39,7 @@ struct SoftwareJson {
std::string fftwindowplacement;
bool coarsecorrectorenabled = false;
std::string freqsyncmethod;
- std::time_t lastchannelchange = 0;
+ std::chrono::system_clock::time_point lastchannelchange;
};
struct HardwareJson {
@@ -137,6 +138,7 @@ struct MuxJson {
double demodulator_snr = 0.0;
double demodulator_frequencycorrection = 0.0;
+ std::chrono::system_clock::time_point demodulator_timelastfct0frame;
std::list<tii_measurement_t> tii;
std::vector<PeakJson> cir_peaks;
diff --git a/src/welle-cli/tests.cpp b/src/welle-cli/tests.cpp
index dbcd21c..bdb2b25 100644
--- a/src/welle-cli/tests.cpp
+++ b/src/welle-cli/tests.cpp
@@ -132,7 +132,7 @@ class TestRadioInterface : public RadioControllerInterface {
}
}
- virtual void onSNR(int snr) override { (void)snr; }
+ virtual void onSNR(float snr) override { (void)snr; }
virtual void onFrequencyCorrectorChange(int fine, int coarse) override { (void)fine; (void)coarse; }
virtual void onSyncChange(char isSync) override
{
diff --git a/src/welle-cli/webradiointerface.cpp b/src/welle-cli/webradiointerface.cpp
index 2e07766..3277bb0 100644
--- a/src/welle-cli/webradiointerface.cpp
+++ b/src/welle-cli/webradiointerface.cpp
@@ -89,6 +89,7 @@ static const char* http_405 = "HTTP/1.0 405 Method Not Allowed\r\n";
static const char* http_500 = "HTTP/1.0 500 Internal Server Error\r\n";
static const char* http_503 = "HTTP/1.0 503 Service Unavailable\r\n";
static const char* http_contenttype_mp3 = "Content-Type: audio/mpeg\r\n";
+static const char* http_contenttype_m3u = "Content-Type: application/mpegurl\r\n";
static const char* http_contenttype_text = "Content-Type: text/plain\r\n";
static const char* http_contenttype_data =
"Content-Type: application/octet-stream\r\n";
@@ -469,6 +470,9 @@ bool WebRadioInterface::dispatch_client(Socket&& client)
else if (req.url == "/mux.json") {
success = send_mux_json(s);
}
+ else if (req.url == "/mux.m3u") {
+ success = send_mux_playlist(s);
+ }
else if (req.url == "/fic") {
success = send_fic(s);
}
@@ -613,7 +617,7 @@ bool WebRadioInterface::send_mux_json(Socket& s)
mux_json.receiver.software.fftwindowplacement = fftPlacementMethodToString(rro.fftPlacementMethod);
mux_json.receiver.software.coarsecorrectorenabled = not rro.disableCoarseCorrector;
mux_json.receiver.software.freqsyncmethod = freqSyncMethodToString(rro.freqsyncMethod);
- mux_json.receiver.software.lastchannelchange = chrono::system_clock::to_time_t(time_rx_created);
+ mux_json.receiver.software.lastchannelchange = time_rx_created;
mux_json.receiver.hardware.name = input.getDescription();
mux_json.receiver.hardware.gain = input.getGain();
@@ -770,6 +774,7 @@ bool WebRadioInterface::send_mux_json(Socket& s)
mux_json.demodulator_snr = last_snr;
mux_json.demodulator_frequencycorrection = last_fine_correction + last_coarse_correction;
+ mux_json.demodulator_timelastfct0frame = rx->getReceiverStats().timeLastFCT0Frame;
mux_json.tii = getTiiStats();
}
@@ -793,6 +798,53 @@ bool WebRadioInterface::send_mux_json(Socket& s)
return true;
}
+bool WebRadioInterface::send_mux_playlist(Socket& s)
+{
+ stringstream m3u;
+ m3u << "#EXTM3U\n";
+
+ {
+ lock_guard<mutex> lock(rx_mut);
+ ASSERT_RX;
+
+ for (const auto& s : rx->getServiceList()) {
+ auto hex_sid = to_hex(s.serviceId, 4);
+ auto label = s.serviceLabel.utf8_label();
+ string url_mp3 = "";
+
+ for (const auto& sc : rx->getComponents(s)) {
+ switch (sc.transportMode()) {
+ case TransportMode::Audio:
+ if (sc.audioType() == AudioServiceComponentType::DAB or
+ sc.audioType() == AudioServiceComponentType::DABPlus) {
+ url_mp3 = "/mp3/" + hex_sid;
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (not url_mp3.empty()) {
+ m3u << "#EXTINF:-1 sid=\"" << hex_sid << "\"," << label << "\n";
+ m3u << url_mp3 << "\n";
+ }
+ }
+ }
+
+ if (not send_http_response(s, http_ok, "", http_contenttype_m3u)) {
+ return false;
+ }
+
+ const auto m3u_str = m3u.str();
+ ssize_t ret = s.send(m3u_str.c_str(), m3u_str.size(), MSG_NOSIGNAL);
+ if (ret == -1) {
+ cerr << "Failed to send mux.m3u data" << endl;
+ return false;
+ }
+ return true;
+}
+
bool WebRadioInterface::send_mp3(Socket& s, const std::string& stream)
{
unique_lock<mutex> lock(rx_mut);
@@ -1389,7 +1441,7 @@ void WebRadioInterface::serve()
carousel_services_active.clear();
}
-void WebRadioInterface::onSNR(int snr)
+void WebRadioInterface::onSNR(float snr)
{
lock_guard<mutex> lock(data_mut);
last_snr = snr;
diff --git a/src/welle-cli/webradiointerface.h b/src/welle-cli/webradiointerface.h
index ea3aa18..5aab0b9 100644
--- a/src/welle-cli/webradiointerface.h
+++ b/src/welle-cli/webradiointerface.h
@@ -82,7 +82,7 @@ class WebRadioInterface : public RadioControllerInterface {
void serve();
- virtual void onSNR(int snr) override;
+ virtual void onSNR(float snr) override;
virtual void onFrequencyCorrectorChange(int fine, int coarse) override;
virtual void onSyncChange(char isSync) override;
virtual void onSignalPresence(bool isSignal) override;
@@ -111,6 +111,9 @@ class WebRadioInterface : public RadioControllerInterface {
// Generate and send the mux.json
bool send_mux_json(Socket& s);
+ // Generate and send a m3u playlist with all services
+ bool send_mux_playlist(Socket& s);
+
// Send an mp3 stream containing the selected programme.
// stream is a service id, either in hex with 0x prefix or
// in decimal
diff --git a/src/welle-cli/welle-cli.cpp b/src/welle-cli/welle-cli.cpp
index 1a7ed9d..dcd1019 100644
--- a/src/welle-cli/welle-cli.cpp
+++ b/src/welle-cli/welle-cli.cpp
@@ -175,7 +175,7 @@ class WavProgrammeHandler: public ProgrammeHandlerInterface {
class RadioInterface : public RadioControllerInterface {
public:
- virtual void onSNR(int /*snr*/) override { }
+ virtual void onSNR(float /*snr*/) override { }
virtual void onFrequencyCorrectorChange(int /*fine*/, int /*coarse*/) override { }
virtual void onSyncChange(char isSync) override { synced = isSync; }
virtual void onSignalPresence(bool /*isSignal*/) override { }
@@ -293,64 +293,111 @@ struct options_t {
static void usage()
{
- cerr << "Usage: " << endl <<
-#if defined(HAVE_ALSA)
- "Receive using RTLSDR, and play with ALSA:" << endl <<
- " welle-cli -c channel -p programme" << endl <<
- endl <<
- "Read an IQ file and play with ALSA:" << endl <<
- "IQ file format is u8, unless the file ends with FORMAT.iq" << endl <<
- " welle-cli -f file -p programme" << endl <<
- endl <<
-#endif // defined(HAVE_ALSA)
- "Use -D to dump FIC and all programmes to files." << endl <<
- " welle-cli -c channel -D " << endl <<
- endl <<
- "Use -w to enable webserver, decode a programmes on demand." << endl <<
- " welle-cli -c channel -w port" << endl <<
- endl <<
- "Use -Dw to enable webserver, decode all programmes." << endl <<
- " welle-cli -c channel -Dw port" << endl <<
- endl <<
- "Use -C 1 -w to enable webserver, decode programmes one by one in a carousel." << endl <<
- "Use -C N -w to enable webserver, decode programmes N by N in a carousel." << endl <<
- "This is useful if your machine cannot decode all programmes simultaneously, but" << endl <<
- "you still want to get an overview of the ensemble." << endl <<
- "Without the -P option, welle-cli will switch every 10 seconds." << endl <<
- "With the -P option, welle-cli will switch once DLS and a slide were decoded, staying at most" << endl <<
- "80 seconds on a given programme." << endl <<
- " welle-cli -c channel -C 1 -w port" << endl <<
- " welle-cli -c channel -PC 1 -w port" << endl <<
- endl <<
- "Backend and input options" << endl <<
- " -u disable coarse corrector, for receivers who have a low frequency offset." << endl <<
- " -g GAIN set input gain to GAIN or -1 for auto gain." << endl <<
- " -F DRV set input driver and arguments. Default: \"auto\"." << endl <<
- " valid drivers: " <<
-#ifdef HAVE_AIRSPY
- "\"airspy\", " <<
-#endif
-#ifdef HAVE_RTLSDR
- "\"rtl_sdr\", " <<
-#endif
-#ifdef HAVE_SOAPYSDR
- "\"soapysdr\", " <<
-#endif
-#ifdef __ANDROID__
- "\"android_rtl_sdr\", " <<
-#endif
- "\"rtl_tcp\"." << endl <<
- " rtl_tcp host IP and port can be specified as \"rtl_tcp,<HOST_IP>:<PORT>\"." << endl <<
- " -s ARGS SoapySDR Driver arguments." << endl <<
- " -A ANT set input antenna to ANT (for SoapySDR input only)." << endl <<
- " -T disable TII decoding to reduce CPU usage." << endl <<
- endl <<
- "Use -t test_number to run a test." << endl <<
- "To understand what the tests do, please see source code." << endl <<
- endl <<
- " examples: welle-cli -c 10B -p GRRIF" << endl <<
- " welle-cli -f ./ofdm.iq -p GRRIF" << endl <<
- " welle-cli -f ./ofdm.iq -t 1" << endl;
+ cerr <<
+ "Usage: welle-cli [OPTION]" << endl <<
+ " or: welle-cli -w <port> [OPTION]" << endl <<
+ endl <<
+ "welle-cli is welle.io's command line interface." << endl <<
+ endl <<
+ "Options:" << endl <<
+ endl <<
+ "Tuning:" << endl <<
+ " -c channel Tune to <channel> (eg. 10B, 5A, LD...)." << endl <<
+ " -p programme Play <programme> with ALSA (text name of the radio: eg. GRIFF)." << endl <<
+ endl <<
+ "Dumping:" << endl <<
+ " -D Dump FIC and all programmes to files (cannot be used with -C)." << endl <<
+ " This generates: dump.fic; <programme_name.msc> files;" << endl <<
+ " <programme_name.wav> files." << endl <<
+ " -d Dump programme to <programme_name.msc> file." << endl <<
+ endl <<
+ "Web server mode:" << endl <<
+ " -w port Enable web server on port <port>." << endl <<
+ " -C number Number of programmes to decode in a carousel" << endl <<
+ " (to be used with -w, cannot be used with -D)." << endl <<
+ " This is useful if your machine cannot decode all programmes" << endl <<
+ " simultaneously, but you still want to get an overview of" << endl <<
+ " the ensemble." << endl <<
+ " -P Without the -P option, welle-cli will switch every 10 seconds." << endl <<
+ " With the -P option, welle-cli will switch once DLS and a" << endl <<
+ " slide were decoded, staying at most 80 seconds on a given" << endl <<
+ " programme." << endl <<
+ endl <<
+ "Backend and input options:" << endl <<
+ " -f file Read an IQ file <file> and play with ALSA." << endl <<
+ " IQ file format is u8, unless the file ends with 'FORMAT.iq'." << endl <<
+ " -u Disable coarse corrector, for receivers who have a low " << endl <<
+ " frequency offset." << endl <<
+ " -g gain Set input gain to <gain> or -1 for auto gain." << endl <<
+ " -F driver Set input driver and arguments." << endl <<
+ " Please note that some input drivers are available only if" << endl <<
+ " they were enabled at build time." << endl <<
+ " Possible values are: auto (default), airspy, rtl_sdr," << endl <<
+ " android_rtl_sdr, rtl_tcp, soapysdr." << endl <<
+ " With \"rtl_tcp\", host IP and port can be specified as " << endl <<
+ " \"rtl_tcp,<HOST_IP>:<PORT>\"." << endl <<
+ " -s args SoapySDR Driver arguments." << endl <<
+ " -A antenna Set input antenna to ANT (for SoapySDR input only)." << endl <<
+ " -T Disable TII decoding to reduce CPU usage." << endl <<
+ endl <<
+ "Other options:" << endl <<
+ " -t test_id Run test <test_id>." << endl <<
+ " To understand what the tests do, please see source code." << endl <<
+ " -h Display this help and exit." << endl <<
+ " -v Output version information and exit." << endl <<
+ endl <<
+ "Examples:" << endl <<
+ endl <<
+ "welle-cli -c 10B -p GRRIF" << endl <<
+ " Receive 'GRRIF' on channel '10B' using 'auto' driver, and play with ALSA." << endl <<
+ endl <<
+ "welle-cli -f ./ofdm.iq -p GRRIF" << endl <<
+ " Read IQ file './ofdm.iq' (in u8 format) and play programme 'GRIFF' with ALSA." << endl <<
+ endl <<
+ "welle-cli -f ./ofdm.iq -t 1" << endl <<
+ " Read IQ file './ofdm.iq' (in u8 format), and run test 1." << endl <<
+ endl <<
+ "welle-cli -c 10B -p GRRIF -F rtl_tcp,localhost:1234" << endl <<
+ " Receive 'GRRIF' on channel '10B' using 'rtl_tcp' driver on localhost:1234," << endl <<
+ " and play with ALSA." << endl <<
+ endl <<
+ "welle-cli -c 10B -D " << endl <<
+ " Dump FIC and all programmes of channel 10B to files." << endl <<
+ endl <<
+ "welle-cli -c 10B -w 8000" << endl <<
+ " Enable web server on port 8000, decode programmes on channel 10B on demand" << endl <<
+ " (http://localhost:8000)." << endl <<
+ endl <<
+ "welle-cli -c 10B -Dw 8000" << endl <<
+ " Enable web server on port 8000, decode all programmes on channel 10B." << endl <<
+ endl <<
+ "welle-cli -c 10B -C 1 -w 8000" << endl <<
+ " Enable web server on port 8000, decode programmes one by one in a carousel" << endl <<
+ " on channel 10B; welle-cli will switch every 10 seconds." << endl <<
+ endl <<
+ "welle-cli -c 10B -PC 1 -w 8000" << endl <<
+ " Enable web server on port 8000, decode programmes one by one in a carousel" << endl <<
+ " on channel 10B; welle-cli will switch once DLS and a slide were decoded," << endl <<
+ " staying at most 80 seconds on a given programme." << endl <<
+ endl <<
+ "Report bugs to: <https://github.com/AlbrechtL/welle.io/issues>" << endl;
+}
+
+static void copyright()
+{
+ cerr <<
+ "Copyright (C) 2018 Matthias P. Braendli." << endl <<
+ "Copyright (C) 2017 Albrecht Lohofener." << endl <<
+ "License GPL-2.0-or-later: GNU General Public License v2.0 or later" << endl <<
+ "<https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html>" << endl <<
+ endl <<
+ "Written by: Albrecht Lohofener & Matthias P. Braendli." << endl <<
+ "Other contributors: <https://github.com/AlbrechtL/welle.io/blob/master/AUTHORS>" << endl;
+}
+
+static void version()
+{
+ cerr << "welle-cli " << VERSION << endl;
}
options_t parse_cmdline(int argc, char **argv)
@@ -360,7 +407,7 @@ options_t parse_cmdline(int argc, char **argv)
options.rro.decodeTII = true;
int opt;
- while ((opt = getopt(argc, argv, "A:c:C:dDf:F:g:hp:PTs:t:w:u")) != -1) {
+ while ((opt = getopt(argc, argv, "A:c:C:dDf:F:g:hp:Ps:Tt:uvw:")) != -1) {
switch (opt) {
case 'A':
options.antenna = optarg;
@@ -404,6 +451,11 @@ options_t parse_cmdline(int argc, char **argv)
case 'T':
options.rro.decodeTII = false;
break;
+ case 'v':
+ version();
+ cerr << endl;
+ copyright();
+ exit(0);
case 'w':
options.web_port = std::atoi(optarg);
break;
@@ -435,8 +487,8 @@ options_t parse_cmdline(int argc, char **argv)
int main(int argc, char **argv)
{
- cerr << "Hello this is welle-cli " << VERSION << endl;
auto options = parse_cmdline(argc, argv);
+ version();
RadioInterface ri;
diff --git a/src/welle-gui/QML/ExpertView.qml b/src/welle-gui/QML/ExpertView.qml
index 7d81dab..1819a1b 100644
--- a/src/welle-gui/QML/ExpertView.qml
+++ b/src/welle-gui/QML/ExpertView.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.2
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/GeneralView.qml b/src/welle-gui/QML/GeneralView.qml
index ae1aac3..ff1caa1 100644
--- a/src/welle-gui/QML/GeneralView.qml
+++ b/src/welle-gui/QML/GeneralView.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
@@ -58,6 +83,12 @@ GridLayout {
// Create new view
console.debug("Creating component: " + path)
var component = Qt.createComponent(path);
+ if( component.status !== Component.Ready )
+ {
+ if( component.status === Component.Error )
+ console.debug("Error:"+ component.errorString() );
+ return;
+ }
var object = component.createObject(gridLayout);
object.sourcePath = path; // Save path inside component to make a saving possible
object.isExpert = Qt.binding(function() { return isExpert })
diff --git a/src/welle-gui/QML/InfoPage.qml b/src/welle-gui/QML/InfoPage.qml
index 1754f14..371e6bb 100644
--- a/src/welle-gui/QML/InfoPage.qml
+++ b/src/welle-gui/QML/InfoPage.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0
diff --git a/src/welle-gui/QML/MainView.qml b/src/welle-gui/QML/MainView.qml
index a44a7f7..468730c 100644
--- a/src/welle-gui/QML/MainView.qml
+++ b/src/welle-gui/QML/MainView.qml
@@ -1,42 +1,27 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * 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.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
-** OWNER 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
import QtQuick 2.9
import QtQuick.Layouts 1.3
@@ -44,6 +29,7 @@ import QtQuick.Controls 2.3
import QtQuick.Controls.Material 2.1
import QtQuick.Controls.Universal 2.1
import QtQuick.Window 2.2
+import QtGraphicalEffects 1.0
import Qt.labs.settings 1.0
import "texts"
@@ -58,8 +44,8 @@ ApplicationWindow {
property bool isLoaded: false
property bool isStationNameInWindowTitle: false
- StationListModel { id: stationList }
- StationListModel { id: favoritsList }
+ StationListModel { id: stationList ; type: "all"}
+ StationListModel { id: favoritsList ; type: "favorites"}
readonly property bool inPortrait: mainWindow.width < mainWindow.height
@@ -102,12 +88,16 @@ ApplicationWindow {
mainWindow.height = getHeight()
}
- // Show error message if one occured during startup
+ // Show error message if one occurred during startup
if(errorMessagePopup.text != "")
errorMessagePopup.open();
updateTheme()
+ guiHelper.updateMprisStationList(stationChannelView.model.serialized,
+ stationChannelView.model.type,
+ stationListBox.currentIndex)
+
isLoaded = true
}
@@ -117,13 +107,14 @@ ApplicationWindow {
property alias stationListSerialize: stationList.serialized
property alias favoritsListSerialize: favoritsList.serialized
property alias stationListBoxIndex: stationListBox.currentIndex
+ property alias volume: volumeSlider.value
}
header: ToolBar {
id: overlayHeader
RowLayout {
- spacing: 20
+ spacing: 5
anchors.fill: parent
ToolButton {
@@ -140,8 +131,8 @@ ApplicationWindow {
else
{
// Workaround for touch displays. (Discovered with Windows 10)
- // For some reason the dawer will be closed before it is openend
- // Disbale closing
+ // For some reason the dawer will be closed before it is opened
+ // Disable closing
stationDrawer.closePolicy = Popup.NoAutoClose
// Open drawer
@@ -160,6 +151,308 @@ ApplicationWindow {
Layout.fillWidth: true
}
+ ToolButton {
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ highlighted: startStopIconMouseArea.pressed
+
+ MouseArea {
+ id: startStopIconMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ onClicked: {
+ if (radioController.isPlaying || radioController.isChannelScan) {
+ startStopIcon.stop()
+ } else {
+ startStopIcon.play()
+ }
+ }
+ }
+
+ Image {
+ id: startStopIcon
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+
+ height: parent.availableHeight - parent.padding
+ fillMode: Image.PreserveAspectFit
+
+ Accessible.role: Accessible.Button
+ Accessible.name: (radioController.isPlaying || radioController.isChannelScan) ? qsTr("Stop") : qsTr("Play")
+ Accessible.description: radioController.isPlaying ? qsTr("Stop playback") : radioController.isChannelScan ? qsTr("Stop scan") : qsTr("Start playback")
+ Accessible.onPressAction: startStopIconMouseArea.clicked(mouse)
+
+ WToolTip {
+ text: (radioController.isPlaying || radioController.isChannelScan) ? qsTr("Stop") : qsTr("Play")
+ visible: startStopIconMouseArea.containsMouse
+ }
+
+ Component.onCompleted: { startStopIcon.setStartPlayIcon() }
+
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: ["Media Pause", "Toggle Media Play/Pause", "S"]
+ onActivated: startStopIconMouseArea.clicked(0)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: ["Media Stop"]
+ onActivated: if (radioController.isPlaying || radioController.isChannelScan) startStopIcon.stop()
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: ["Media Play"]
+ onActivated: if (!radioController.isPlaying) startStopIcon.play()
+ }
+
+ Connections {
+ target: radioController
+ onIsPlayingChanged: {
+ startStopIcon.setStartPlayIcon()
+ }
+ onIsChannelScanChanged: {
+ startStopIcon.setStartPlayIcon()
+ }
+ }
+
+ function setStartPlayIcon() {
+ if (radioController.isPlaying || radioController.isChannelScan) {
+ startStopIcon.source = "qrc:/icons/welle_io_icons/20x20/stop.png"
+ } else {
+ startStopIcon.source = "qrc:/icons/welle_io_icons/20x20/play.png"
+ }
+ }
+
+ function play() {
+ var channel = radioController.lastChannel[1]
+ var sidHex = radioController.lastChannel[0]
+ stationList.play(channel, sidHex)
+ }
+
+ function stop() {
+ if (radioController.isPlaying)
+ radioController.stop();
+ else if (radioController.isChannelScan)
+ radioController.stopScan()
+ }
+ }
+
+ ColorOverlay {
+ id: startStopIconOverlay
+ anchors.fill: startStopIcon
+ source: startStopIcon
+ color: (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+ }
+ }
+
+ ToolButton {
+ id: speakerIconContainer
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ highlighted: speakerIconMouseArea.pressed
+
+ MouseArea {
+ id: speakerIconMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ acceptedButtons: Qt.LeftButton | Qt.RightButton
+ onPressAndHold: volumePopup.open()
+ onClicked: {
+ if(mouse.button == Qt.RightButton)
+ volumePopup.open()
+ else
+ if(radioController.volume !== 0)
+ volumeSlider.value = 0
+ else
+ volumeSlider.value = 1
+ }
+ onWheel: (wheel.angleDelta.y > 0) ? volumeSlider.value = volumeSlider.value + 0.1 : volumeSlider.value = volumeSlider.value - 0.1
+ }
+
+ contentItem: Item {
+ // Use 2 Images to switch between speaker & speaker_mute icon (instead of toggle button).
+ // Permits use of color with org.kde.desktop style
+ Image {
+ id: speakerIcon
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+
+ height: speakerIconContainer.availableHeight - speakerIconContainer.padding
+ fillMode: Image.PreserveAspectFit
+
+ visible: false
+
+ source: "qrc:/icons/welle_io_icons/20x20@2/speaker.png"
+
+ WToolTip {
+ text: qsTr("Volume (%1)").arg(volumeLabel.text)
+ visible: speakerIconMouseArea.containsMouse
+ }
+
+ Accessible.role: Accessible.Button
+ Accessible.name: qsTr("Volume")
+ Accessible.description: qsTr("Toggle volume slider")
+ Accessible.onPressAction: speakerIconMouseArea.clicked(mouse)
+ }
+ Image {
+ id: speakerIconMuted
+ anchors.top: speakerIcon.top
+ anchors.left: speakerIcon.left
+ width: speakerIcon.width
+ height: speakerIcon.height
+ visible: false
+
+ source: "qrc:/icons/welle_io_icons/20x20@2/speaker_mute.png"
+ }
+ ColorOverlay {
+ id: speakerIconMutedRed
+ visible: false
+ anchors.fill: speakerIconMuted
+ source: speakerIconMuted
+ color: "red"
+ }
+
+ // We don't display the "speakerIcon" item, but the "speakerIconMaskApplied"
+ // item the right part of which is +/- opacified depending on the volume
+ Item {
+ id: hidingRect
+ anchors.fill: speakerIcon
+ visible: false
+ Rectangle {
+ anchors.right: parent.right
+ color: "green" //Could be any
+ width: speakerIcon.width *0.30
+ height: speakerIcon.height
+ opacity: 1 - volumeSlider.value
+ }
+ }
+ OpacityMask {
+ id: speakerIconMaskApplied
+ anchors.fill: speakerIcon
+ source: speakerIcon
+ maskSource: hidingRect
+ invert: true
+ visible: false
+ }
+ ColorOverlay {
+ id: speakerIconMaskAppliedOverlay
+ anchors.fill: speakerIconMaskApplied
+ source: speakerIconMaskApplied
+ color: (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+ }
+
+ Popup {
+ id: volumePopup
+ y: speakerIconContainer.y + speakerIconContainer.height
+ x: Math.round(speakerIconContainer.x + (speakerIconContainer.width / 2) - volumePopup.width/2 )
+
+ parent: Overlay.overlay
+
+ //modal: true //if 'true', double click on the speaker icon will not be caught
+ focus: true
+ closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
+
+ onOpened: volumeSliderTrigger.restart()
+ onClosed: volumeSliderTrigger.stop()
+
+ ColumnLayout{
+ Slider {
+ id: volumeSlider
+
+ Layout.alignment: Qt.AlignCenter
+
+ height: 100
+ orientation: Qt.Vertical
+ snapMode: Slider.SnapAlways
+ wheelEnabled: true
+
+ from: 0
+ to: 1
+ stepSize: 0.01
+ value: radioController.volume
+
+ onValueChanged: {
+ setVolume(value)
+ if (visible)
+ volumeSliderTrigger.restart()
+ }
+
+ Connections {
+ target: radioController
+ onVolumeChanged: {
+ volumeSlider.value = volume
+ }
+ }
+
+ Timer {
+ id: volumeSliderTrigger
+ interval: 3000
+ running: false
+ repeat: false
+ onTriggered: { volumePopup.close() }
+ }
+
+ function setVolume(value) {
+ if (volumeSlider.value != radioController.volume) {
+ if (value === 0) {
+ radioController.setVolume(value)
+ speakerIconMutedRed.visible = true
+ speakerIconMaskAppliedOverlay.visible = false
+ } else {
+ radioController.setVolume(value)
+ speakerIconMutedRed.visible = false
+ speakerIconMaskAppliedOverlay.visible = true
+ }
+ }
+ }
+ }
+
+ TextStandart {
+ id: volumeLabel
+ Layout.alignment: Qt.AlignCenter
+
+ font.pixelSize: Units.em(0.8)
+ text: Math.round(volumeSlider.value*100) + "%"
+
+ Accessible.description: qsTr("Volume set to %1").arg(text)
+ }
+
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: true
+ sequences: ["Ctrl+Up", "Volume Up"]
+ onActivated: {
+ volumeSlider.visible = true
+ volumeSlider.value = volumeSlider.value + volumeSlider.stepSize
+ }
+ }
+
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: true
+ sequences: ["Ctrl+Down", "Volume Down"]
+ onActivated: {
+ volumeSlider.visible = true
+ volumeSlider.value = volumeSlider.value - volumeSlider.stepSize
+ }
+ }
+
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: ["m", "Volume Mute"]
+ onActivated: {
+ volumeSlider.visible = true
+ volumeSlider.value = !(volumeSlider.value)
+ }
+ }
+ }
+ }
+ }
+ }
ToolButton {
icon.name: "menu"
icon.width: Units.dp(20)
@@ -223,7 +516,7 @@ ApplicationWindow {
visible: !inPortrait
// Workaround for touch displays. (Discovered with Windows 10)
- // For some reason the dawer will be closed before it is openend
+ // For some reason the dawer will be closed before it is opened
// Enable closing again
onOpened: closePolicy = Popup.CloseOnEscape | Popup.CloseOnPressOutside
@@ -250,6 +543,9 @@ ApplicationWindow {
case 0: stationChannelView.model = stationList; break;
case 1: stationChannelView.model = favoritsList; break;
}
+ guiHelper.updateMprisStationList(stationChannelView.model.serialized,
+ stationChannelView.model.type,
+ stationListBox.currentIndex)
}
}
@@ -332,7 +628,7 @@ ApplicationWindow {
Layout.fillHeight: true
clip: true
delegate: StationDelegate {
- stationNameText: stationName
+ stationNameText: stationName.trim()
stationSIdValue: stationSId
channelNameText: channelName == "File" ? qsTr("File") : channelName
isFavorit: favorit
@@ -350,6 +646,109 @@ ApplicationWindow {
}
ScrollIndicator.vertical: ScrollIndicator { }
+
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: ["n", "Media Next"]
+ onActivated: {
+ var channel = radioController.lastChannel[1]
+ var sidHex = radioController.lastChannel[0]
+ var index = stationChannelView.model.getIndexNext(parseInt(sidHex,16), channel)
+ stationChannelView.model.playAtIndex(index)
+ }
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: ["p", "Media Previous"]
+ onActivated: {
+ var channel = radioController.lastChannel[1]
+ var sidHex = radioController.lastChannel[0]
+ var index = stationChannelView.model.getIndexPrevious(parseInt(sidHex,16), channel)
+ stationChannelView.model.playAtIndex(index)
+ }
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F1", "1"]
+ onActivated: stationChannelView.model.playAtIndex(0)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F2", "2"]
+ onActivated: stationChannelView.model.playAtIndex(1)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F3", "3"]
+ onActivated: stationChannelView.model.playAtIndex(2)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F4", "4"]
+ onActivated: stationChannelView.model.playAtIndex(3)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F5", "5"]
+ onActivated: stationChannelView.model.playAtIndex(4)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F6", "6"]
+ onActivated: stationChannelView.model.playAtIndex(5)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F7", "7"]
+ onActivated: stationChannelView.model.playAtIndex(6)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F8", "8"]
+ onActivated: stationChannelView.model.playAtIndex(7)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F9", "9"]
+ onActivated: stationChannelView.model.playAtIndex(8)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F10", "0"]
+ onActivated: stationChannelView.model.playAtIndex(9)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F11", "Ctrl+1"]
+ onActivated: stationChannelView.model.playAtIndex(10)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F12", "Ctrl+2"]
+ onActivated: stationChannelView.model.playAtIndex(11)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+3"]
+ onActivated: stationChannelView.model.playAtIndex(12)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+4"]
+ onActivated: stationChannelView.model.playAtIndex(13)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+5"]
+ onActivated: stationChannelView.model.playAtIndex(14)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+6"]
+ onActivated: stationChannelView.model.playAtIndex(15)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+7"]
+ onActivated: stationChannelView.model.playAtIndex(16)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+8"]
+ onActivated: stationChannelView.model.playAtIndex(17)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+9"]
+ onActivated: stationChannelView.model.playAtIndex(18)
+ }
+ Shortcut {
+ context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+0"]
+ onActivated: stationChannelView.model.playAtIndex(19)
+ }
}
RowLayout {
@@ -600,7 +999,7 @@ ApplicationWindow {
onMaximizeWindow: showMaximized()
onRestoreWindow: {
// On Linux (KDE?): Hide before we restore
- // otherwise the window will occasionaly not be brought to the front
+ // otherwise the window will occasionally not be brought to the front
if (Qt.platform.os === "linux" && !active) // Linux Workaround to display the window
hide()
showNormal()
@@ -615,6 +1014,13 @@ ApplicationWindow {
guiHelper.tryHideWindow()
}
+ Shortcut {
+ context: Qt.ApplicationShortcut
+ autoRepeat: false
+ sequences: [StandardKey.Quit]
+ onActivated: guiHelper.close()
+ }
+
function updateTheme() {
if (guiHelper.getQQStyle === "Universal") {
switch(globalSettingsLoader.item.qQStyleTheme) {
diff --git a/src/welle-gui/QML/MotView.qml b/src/welle-gui/QML/MotView.qml
index 232c549..107ce73 100644
--- a/src/welle-gui/QML/MotView.qml
+++ b/src/welle-gui/QML/MotView.qml
@@ -1,6 +1,32 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.3
+import QtQuick.Dialogs 1.0
import "texts"
import "components"
@@ -9,172 +35,263 @@ import "components"
ViewBaseFrame {
labelText: qsTr("MOT Slide Show")
- // The component is like a factory for MyTabButtons now.
- Component {
- id: myTabButton
-
- TabButton {
- property string categoryTitle
- property int categoryId: 0
- property var pictureList: []
- property var slideIdList: []
- property int currentPictureIndex: 0
- text: categoryTitle
+ property var slideList: []
+ property var currentCategoryId: 0
+ property var currentCategoryListPos: 0
+ property var latestPictureName: ""
+
+ FileDialog {
+ id: fileDialog
+ title: "Please choose a folder"
+ folder: shortcuts.home
+ selectFolder: true
+ onAccepted: {
+ guiHelper.saveMotImages(fileDialog.folder)
}
}
Component.onCompleted: {
addEntry( qsTr("Save all images"),
function() {
- guiHelper.saveMotImages()
+ fileDialog.open()
})
+
+ _initCategories()
+ }
+
+ ListModel {
+ id: categoryListModel
}
content: Item {
anchors.fill: parent
- ColumnLayout {
+ RowLayout {
anchors.fill: parent
- TabBar {
- Layout.fillWidth: true
- id: bar
- visible: count > 1
+ ColumnLayout {
+ Layout.fillHeight: true
+ Layout.preferredWidth: Units.dp(180)
+ visible: slideList.length > 0
- TabButton {
- id: latestPicture
- property string pictureName
- text: qsTr("Latest")
- }
+ ListView {
+ Layout.fillWidth: true
+ Layout.fillHeight: true
+ Layout.alignment: Qt.AlignLeft
- onCurrentIndexChanged: {
- if(currentIndex > 0)
- motImage.source = "image://SLS/" + currentItem.pictureList[0]
- else
- motImage.source = "image://SLS/" + currentItem.pictureName
- }
- }
+ model: categoryListModel
+
+ delegate: Item {
+ width: parent.width
+ height: Units.dp(20)
- RowLayout {
- WButton {
- icon.name: "back"
- visible: bar.currentIndex > 0 && bar.currentItem.pictureList.length > 1 // visible only if we have more then one picture
+ Rectangle {
+ anchors.fill: parent
+ color: mouse.pressed ? "lightgrey" : "ghostwhite"
+ visible: mouse.pressed || categoryId === currentCategoryId
+ }
- onPressed: {
- if(bar.currentIndex > 0) {
- bar.currentItem.currentPictureIndex--
+ MouseArea {
+ id: mouse
+ onClicked: _categroryClicked(categoryId)
+ anchors.fill: parent
- if(bar.currentItem.currentPictureIndex < 0)
- bar.currentItem.currentPictureIndex = bar.currentItem.pictureList.length - 1
+ TextStandart {
+ anchors.left: parent.left
+ anchors.verticalCenter: parent.verticalCenter
+ anchors.leftMargin: Units.dp(10)
- motImage.source = "image://SLS/" + bar.currentItem.pictureList[bar.currentItem.currentPictureIndex]
+ text: categoryTitle
+ }
}
}
}
- Image {
- id: motImage
+ RowLayout {
+ Layout.preferredWidth: Units.dp(180)
- fillMode: Image.PreserveAspectFit
- Layout.fillWidth: true
- Layout.fillHeight: true
+ WButton {
+ icon.name: "back"
+ Layout.preferredHeight: Units.dp(20)
+ Layout.fillWidth: true
+ visible: slideList.length > 1 && slideList[currentCategoryListPos][2].length > 1 // visible only if we have more then one picture
- Connections{
- target: guiHelper
- onMotChanged:{
- latestPicture.pictureName = pictureName
-
- // Display slide show only of latest tab is select
- if(bar.currentIndex === 0)
- motImage.source = "image://SLS/" + pictureName
-
- if(categoryTitle !== "" && categoryId !== 0) {
- // Check if category exists, if not create it
- var foundCategory = false
- for (var i = 1; i < bar.contentChildren.length; ++i) {
- if(bar.contentChildren[i].categoryId === categoryId)
- foundCategory = true
- }
- // Create new tab
- if(!foundCategory) {
- bar.addItem(myTabButton.createObject(bar , {"categoryTitle": categoryTitle, "categoryId": categoryId}))
- }
+ onPressed: {
+ if(currentCategoryListPos > 0) {
+ categoryListModel.get(currentCategoryListPos).currentPictureIndex--
- // Put picture name into category
- for (i = 1; i < bar.contentChildren.length; ++i) {
- // Find the correct category
- if(bar.contentChildren[i].categoryId === categoryId) {
- // Check if picture is already in list
- var foundPicture = false
- for( var j=0; j< bar.contentChildren[i].pictureList.length; j++) {
- if(bar.contentChildren[i].slideIdList[j] === slideId) { // Found picture
- bar.contentChildren[i].pictureList[j] = pictureName
- foundPicture = true
- }
- }
- if(!foundPicture) {
- bar.contentChildren[i].slideIdList.push(slideId)
- bar.contentChildren[i].pictureList.push(pictureName)
- bar.contentChildren[i].pictureListChanged()
- }
- }
- }
+ if(categoryListModel.get(currentCategoryListPos).currentPictureIndex < 0)
+ categoryListModel.get(currentCategoryListPos).currentPictureIndex = slideList[currentCategoryListPos][2].length - 1
+
+ motImage.source = "image://SLS/" + slideList[currentCategoryListPos][2][categoryListModel.get(currentCategoryListPos).currentPictureIndex][1]
}
}
+ }
- onMotReseted:{
- // Delete tabs
- for (var i = 1; i < bar.contentChildren.length; ++i) {
- bar.contentChildren[i].destroy()
- }
+ WButton {
+ icon.name: "next"
+ Layout.preferredHeight: Units.dp(20)
+ Layout.fillWidth: true
+ visible: slideList.length > 1 && slideList[currentCategoryListPos][2].length > 1 // visible only if we have more then one picture
+
+ onPressed: {
+ if(currentCategoryListPos > 0) {
+ categoryListModel.get(currentCategoryListPos).currentPictureIndex++
+
+ categoryListModel.get(currentCategoryListPos).currentPictureIndex =
+ categoryListModel.get(currentCategoryListPos).currentPictureIndex % slideList[currentCategoryListPos][2].length
- motImage.source = "image://SLS/empty"
+ motImage.source = "image://SLS/" + slideList[currentCategoryListPos][2][categoryListModel.get(currentCategoryListPos).currentPictureIndex][1]
+ }
}
}
+ }
+
+ Label {
+ visible: mainWindow.isExpertView
+ text: currentCategoryListPos !== 0 && slideList[currentCategoryListPos][2].length > 1 ?
+ "Total numbers of sildes: " + slideList[currentCategoryListPos][2].length
+ : ""
+ background: Rectangle { opacity: 0.6; color: "white" }
+ }
+ }
- ColumnLayout {
- anchors.fill: parent
+ ColumnLayout {
+ Layout.alignment: Qt.AlignRight
- Item {
+ RowLayout {
+ Image {
+ id: motImage
+
+ fillMode: Image.PreserveAspectFit
+ Layout.fillWidth: true
Layout.fillHeight: true
- }
+ Layout.alignment: Qt.AlignTop
- Label {
- visible: mainWindow.isExpertView
- text: bar.currentIndex != 0 ?
- "Picture: " + (bar.currentItem.currentPictureIndex+1) + " / " + bar.currentItem.pictureList.length
- : " "
- background: Rectangle { opacity: 0.6; color: "white" }
- }
+ Connections{
+ target: guiHelper
+ onMotChanged:{
+ latestPictureName = pictureName
- Label {
- visible: mainWindow.isExpertView && motImage.source != ""
- text: "image://sls/CategoryID/CategoryTitle/SlideID/ContentName"
- background: Rectangle { opacity: 0.6; color: "white" }
- }
+ // Display slide show only of latest tab is select
+ if(currentCategoryId === 0) {
+ motImage.source = "image://SLS/" + pictureName
+ }
- Label {
- visible: mainWindow.isExpertView
- text: motImage.source
- background: Rectangle { opacity: 0.6; color: "white" }
- }
- }
- }
+ // Handle categories if exist
+ if(categoryTitle !== "" && categoryId !== 0) {
+
+ // Check if category exists, if not create it
+ var foundCategory = false
+ for (var i = 0; i < slideList.length; ++i) {
+ if(slideList[i][1] === categoryId)
+ foundCategory = true
+ }
+
+ // Create new tab
+ if(!foundCategory) {
+ //bar.addItem(myTabButton.createObject(bar , {"categoryTitle": categoryTitle, "categoryId": categoryId}))
+ categoryListModel.append({"categoryTitle": categoryTitle, "categoryId": categoryId, "currentPictureIndex": 0})
+ slideList.push([categoryTitle, categoryId, []])
+ }
+
+ // Put picture name into category
+ for (i=0; i < slideList.length; ++i) {
+ // Find the correct category
+ if(slideList[i][1] === categoryId) {
+ // Check if picture is already in list
+ var foundPicture = false
+ for( var j=0; j< slideList[i][2].length; j++) {
+ if(slideList[i][2][j][0] === slideId) { // Found picture
+ // Replace picture name
+ slideList[i][2][j][1] = pictureName
+ foundPicture = true
+ slideListChanged()
+ }
+ }
+
+ // Add new picture
+ if(!foundPicture) {
+ slideList[i][2].push([slideId, pictureName])
+ slideListChanged()
+ }
+ }
+ }
+ }
+ }
+
+ onMotReseted:{
+ slideList = [];
+ categoryListModel.clear()
+ _initCategories()
+
+ motImage.source = "image://SLS/empty"
+ }
+ }
- WButton {
- icon.name: "next"
- visible: bar.currentIndex > 0 && bar.currentItem.pictureList.length > 1 // visible only if we have more then one picture
+// ColumnLayout {
+// anchors.fill: parent
- onPressed: {
- if(bar.currentIndex > 0) {
- bar.currentItem.currentPictureIndex++
- bar.currentItem.currentPictureIndex = bar.currentItem.currentPictureIndex % bar.currentItem.pictureList.length
+// Item {
+// Layout.fillHeight: true
+// }
- motImage.source = "image://SLS/" + bar.currentItem.pictureList[bar.currentItem.currentPictureIndex]
+// Label {
+// visible: mainWindow.isExpertView && motImage.source != ""
+// text: "image://sls/CategoryID/CategoryTitle/SlideID/ContentName"
+// background: Rectangle { opacity: 0.6; color: "white" }
+// }
+
+// Label {
+// visible: mainWindow.isExpertView
+// text: motImage.source
+// background: Rectangle { opacity: 0.6; color: "white" }
+// }
+// }
}
}
- }
}
}
}
+
+ onSlideListChanged: {
+ _updateSlide()
+ }
+
+ function _categroryClicked(categoryId) {
+ console.debug("Select category: " + categoryId)
+ currentCategoryId = categoryId
+ _updateSlide()
+ }
+
+ function _updateSlide() {
+ // Handle of latest slide is selected or no category slide show exists
+ if(currentCategoryId === 0 && latestPictureName !== "") {
+ motImage.source = "image://SLS/" + latestPictureName
+ return
+ }
+
+ if(slideList.length < 1)
+ return;
+
+ // Find the correct category position
+ for (var i=0; i < slideList.length; ++i) {
+ if(slideList[i][1] === currentCategoryId) {
+ currentCategoryListPos = i
+ break
+ }
+ }
+
+ // Get last picture from current selected categroy
+ var pictureName = slideList[currentCategoryListPos][2][slideList[currentCategoryListPos][2].length -1][1]
+
+ // Show slide
+ motImage.source = "image://SLS/" + pictureName
+ }
+
+ function _initCategories() {
+ categoryListModel.append({"categoryTitle": "Latest", "categoryId": 0, "currentPictureIndex": 0})
+ slideList.push(["Latest", 0, []])
+ }
+
}
diff --git a/src/welle-gui/QML/RadioView.qml b/src/welle-gui/QML/RadioView.qml
index 681404f..f69e4c8 100644
--- a/src/welle-gui/QML/RadioView.qml
+++ b/src/welle-gui/QML/RadioView.qml
@@ -1,4 +1,29 @@
-import QtQuick 2.2
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+import QtQuick 2.9
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.3
import QtGraphicalEffects 1.0
@@ -19,46 +44,6 @@ ViewBaseFrame {
text: radioController.ensemble.trim()
}
- // Use 2 Images to switch between speaker & speaker_mute icon (instead of toggle button).
- // Permits use of color with org.kde.desktop style
- Image {
- id: speakerIcon
- anchors.verticalCenter: signalStrength.verticalCenter
- anchors.right: parent.right
- width: Units.dp(30)
- height: Units.dp(30)
- visible: true
- source: "qrc:/icons/welle_io_icons/20x20@2/speaker.png"
-
- MouseArea {
- anchors.fill: parent
- onClicked: {radioController.setVolume(0); speakerIconMutedRed.visible = true; speakerIcon.visible = false}
- }
- }
-
- Image {
- id: speakerIconMuted
- anchors.verticalCenter: signalStrength.verticalCenter
- anchors.right: parent.right
- width: Units.dp(30)
- height: Units.dp(30)
- visible: false
-
- source: "qrc:/icons/welle_io_icons/20x20@2/speaker_mute.png"
- }
-
- ColorOverlay {
- id: speakerIconMutedRed
- visible: false
- anchors.fill: speakerIconMuted
- source: speakerIconMuted
- color: "red"
- MouseArea {
- anchors.fill: parent
- onClicked: {radioController.setVolume(100); speakerIconMutedRed.visible = false; speakerIcon.visible = true}
- }
- }
-
RowLayout{
id: signalStrength
anchors.top: parent.top
@@ -132,7 +117,7 @@ ViewBaseFrame {
}
visible: opacity == 0 ? false : true
- opacity: 100
+ opacity: 0
Connections {
target: frame
@@ -193,15 +178,7 @@ ViewBaseFrame {
Connections {
target: antennaSymbol
- onIsSignalChanged: {
- if (antennaSymbol.isSignal) {
- antennaIconNoSignalRed.visible = false;
- antennaIcon.visible = true;
- } else {
- antennaIconNoSignalRed.visible = true;
- antennaIcon.visible = false;
- }
- }
+ onIsSignalChanged: setAntennaVisibility()
}
NumberAnimation on opacity {
@@ -226,6 +203,8 @@ ViewBaseFrame {
else
__setIsSignal(false)
}
+ onIsPlayingChanged: setAntennaVisibility()
+ onIsChannelScanChanged: setAntennaVisibility()
}
}
}
@@ -284,7 +263,7 @@ ViewBaseFrame {
}
else {
antennaSymbol.isSignal = false
- antennaSymbol.opacity = 100
+ antennaSymbol.opacity = 1.0
effect.stop()
}
}
@@ -295,4 +274,21 @@ ViewBaseFrame {
else
antennaSymbol.state = "alignBottom"
}
+
+ function setAntennaVisibility() {
+ if (!radioController.isPlaying && !radioController.isChannelScan) {
+ antennaIconNoSignalRed.visible = false;
+ antennaIcon.visible = false;
+ return
+ }
+ if (antennaSymbol.isSignal) {
+ antennaIconNoSignalRed.visible = false;
+ antennaIcon.visible = true;
+ } else {
+ antennaIconNoSignalRed.visible = true;
+ antennaIcon.visible = false;
+ antennaSymbol.opacity = 1.0
+ effect.stop()
+ }
+ }
}
diff --git a/src/welle-gui/QML/components/MessagePopup.qml b/src/welle-gui/QML/components/MessagePopup.qml
index c5b47ff..b385936 100644
--- a/src/welle-gui/QML/components/MessagePopup.qml
+++ b/src/welle-gui/QML/components/MessagePopup.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.5
import QtQuick.Controls 2.3
import QtGraphicalEffects 1.0
diff --git a/src/welle-gui/QML/components/SettingSection.qml b/src/welle-gui/QML/components/SettingSection.qml
index e92d685..22b37b9 100644
--- a/src/welle-gui/QML/components/SettingSection.qml
+++ b/src/welle-gui/QML/components/SettingSection.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/components/StationDelegate.qml b/src/welle-gui/QML/components/StationDelegate.qml
index dadf874..37d467c 100644
--- a/src/welle-gui/QML/components/StationDelegate.qml
+++ b/src/welle-gui/QML/components/StationDelegate.qml
@@ -1,48 +1,34 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-** * Redistributions of source code must retain the above copyright
-** notice, this list of conditions and the following disclaimer.
-** * 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.
-** * Neither the name of The Qt Company Ltd nor the names of its
-** contributors may be used to endorse or promote products derived
-** from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
-** OWNER 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."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.2
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.3
import QtQuick.Controls.Material 2.1
import QtQuick.Controls.Universal 2.1
+import QtGraphicalEffects 1.0
// Import custom styles
import "../texts"
@@ -68,6 +54,13 @@ Item {
visible: mouse.pressed
}
+ Rectangle {
+ id: selectRecangle
+ anchors.fill: parent
+ color: (mainWindow.Material.theme === Material.Dark ) ? "dimgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "dimgrey" : "whitesmoke"
+ visible: false
+ }
+
MouseArea {
id: mouse
onClicked: root.clicked()
@@ -78,8 +71,53 @@ Item {
anchors.left: parent.left
anchors.leftMargin: Units.dp(10)
- TextStandart {
- id: stationItem
+ RowLayout {
+ TextStandart {
+ id: stationItem
+ }
+
+// Item {
+// Layout.preferredHeight: playbackStatusImage.height
+// Layout.preferredWidth: playbackStatusImage.width
+// Image {
+// id: playbackStatusImage
+// width: Units.dp(10)
+// height: Units.dp(10)
+// fillMode: Image.PreserveAspectFit
+// visible:false
+// source: "qrc:/icons/welle_io_icons/20x20/play.png"
+
+// layer {
+// enabled: true
+// effect: ColorOverlay {
+// color: (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+// }
+// }
+// }
+// Item {
+// id: playbackStatusImageStrikethrough
+// anchors.fill: playbackStatusImage
+
+// Canvas {
+// id: playbackStatusImageStrikethroughCanvas
+// anchors.fill: parent
+// onPaint: {
+// var ctx = getContext("2d");
+// ctx.strokeStyle = (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+// ctx.lineWidth = 2
+// ctx.lineCap = "round"
+// ctx.beginPath()
+// ctx.moveTo(0, parent.height)
+// ctx.lineTo(parent.width, 0)
+// ctx.stroke()
+// }
+// }
+// }
+// }
+
+ TextStation {
+ id: channelPlayStatus
+ }
}
RowLayout {
@@ -109,4 +147,59 @@ Item {
Accessible.name: isFavorit ? qsTr("Remove station from favorites") : qsTr("Add station to favorites")
Accessible.onPressAction: click(mouse)
}
+
+ Component.onCompleted: { setPlaybackStatus() }
+
+// SequentialAnimation {
+// id: playbackStatusImageEffect
+// running: false
+// loops: Animation.Infinite
+// NumberAnimation {
+// target: playbackStatusImage
+// property: "opacity"
+// from: 1
+// to: 0.2
+// duration: 1000;
+// }
+// NumberAnimation {
+// target:playbackStatusImage
+// property: "opacity"
+// from: 0.2
+// to: 1
+// duration: 1000;
+// }
+// }
+
+ Connections {
+ target: radioController
+ onIsPlayingChanged: setPlaybackStatus()
+ }
+
+ function setPlaybackStatus() {
+// if (stationSIdValue == radioController.autoService) {
+// playbackStatusImage.visible = true
+// if (radioController.isPlaying) {
+// //channelPlayStatus.text = ""
+// //playbackStatusImageEffect.start() //Don't use the animation because it consumes CPU
+// playbackStatusImage.opacity = 1
+// playbackStatusImageStrikethrough.visible = false
+// } else {
+// //channelPlayStatus.text = qsTr("stopped")
+// //playbackStatusImageEffect.stop() //Don't use the animation because it consumes CPU
+// playbackStatusImage.opacity = 0.6
+// playbackStatusImageStrikethrough.visible = true
+// playbackStatusImageStrikethroughCanvas.requestPaint()
+// }
+// }
+// else {
+// //channelPlayStatus.text = ""
+// playbackStatusImage.visible = false
+// playbackStatusImageStrikethrough.visible = false
+// }
+
+ if (stationSIdValue === radioController.autoService)
+ selectRecangle.visible = true
+ else
+ selectRecangle.visible = false
+ }
}
diff --git a/src/welle-gui/QML/components/StationListModel.qml b/src/welle-gui/QML/components/StationListModel.qml
index 770f68a..ef6a6b6 100644
--- a/src/welle-gui/QML/components/StationListModel.qml
+++ b/src/welle-gui/QML/components/StationListModel.qml
@@ -1,13 +1,38 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
ListModel {
property string serialized: ""
+ property string type: ""
function addStation(station, sId, channel, favorit) {
// Check if station already exists
for (var i=0; i<count; i++) {
- if (get(i).stationSId === sId && get(i).channelName === channel) {
- get(i).stationName = station;
+ if (get(i).stationSId === sId) {
return;
}
}
@@ -51,12 +76,68 @@ ListModel {
}
}
+ function getStationName(sIdDec, channel) {
+ for(var i=0; i<count; i++) {
+ if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+ return get(i).stationName
+ }
+ }
+ }
+
+ function getIndex(sIdDec, channel) {
+ for(var i=0; i<count; i++) {
+ if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+ return i
+ }
+ }
+ }
+
+ function getIndexPrevious(sIdDec, channel) {
+ for(var i=0; i<count; i++) {
+ if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+ return Math.max(0, i-1)
+ }
+ }
+ console.debug("Station '" + sIdDec + "' not found in this list. Returning index 0")
+ return 0
+ }
+
+ function getIndexNext(sIdDec, channel) {
+ for(var i=0; i<count; i++) {
+ if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+ return Math.min(count-1, i+1)
+ }
+ }
+ console.debug("Station '" + sIdDec + "' not found in this list. Returning index 0")
+ return 0
+ }
+
+ function play(channel, sidHex) {
+ var sidDec = parseInt(sidHex,16);
+ var stationName = getStationName(sidDec, channel)
+ //console.debug("stationName: " + stationName + " channel: " + channel + " sidHex: "+ sidHex)
+ if (!channel || !sidHex || !stationName) {
+ infoMessagePopup.text = qsTr("Last played station not found.\nSelect a station to start playback.");
+ infoMessagePopup.open();
+ } else {
+ radioController.play(channel, stationName, sidDec)
+ }
+ }
+
+ function playAtIndex(index) {
+ if (index < count) {
+ //console.debug("stationName: " + get(index).stationName + " channel: " + get(index).channelName + " sidDec: " + get(index).stationSId)
+ radioController.play(get(index).channelName, get(index).stationName, get(index).stationSId)
+ }
+ }
+
// Necessary workaround because the settings component doesn't saves models
function serialize() {
var tmp = []
for (var i = 0; i < count; ++i)
tmp.push(get(i))
serialized = JSON.stringify(tmp)
+ guiHelper.updateMprisStationList(serialized, type, stationListBox.currentIndex)
}
function deSerialize() {
diff --git a/src/welle-gui/QML/components/Units.qml b/src/welle-gui/QML/components/Units.qml
index 5303a74..8a939ba 100644
--- a/src/welle-gui/QML/components/Units.qml
+++ b/src/welle-gui/QML/components/Units.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
pragma Singleton
import QtQuick 2.2
diff --git a/src/welle-gui/QML/components/ViewBaseFrame.qml b/src/welle-gui/QML/components/ViewBaseFrame.qml
index 5971218..bda6c2b 100644
--- a/src/welle-gui/QML/components/ViewBaseFrame.qml
+++ b/src/welle-gui/QML/components/ViewBaseFrame.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.0
@@ -11,7 +36,8 @@ import "../components"
Rectangle {
id: root
color: (Material.theme === Material.Dark || Universal.theme === Universal.Dark) ? "grey" : "white"
- border.color: isExpert ? "lightgrey": "white"
+ //border.color: isExpert ? "lightgrey": "white"
+ border.color: "lightgrey"
Layout.fillHeight: true
Layout.fillWidth: true
@@ -34,7 +60,7 @@ Rectangle {
}
}
- // Posibility to add options entries dynamically
+ // Possibility to add options entries dynamically
function addEntry(title, onTriggered) {
var obj = menuItem.createObject(menu, {text: title})
obj.triggered.connect(onTriggered)
diff --git a/src/welle-gui/QML/components/WButton.qml b/src/welle-gui/QML/components/WButton.qml
index f66abb5..5ac0cdb 100644
--- a/src/welle-gui/QML/components/WButton.qml
+++ b/src/welle-gui/QML/components/WButton.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
diff --git a/src/welle-gui/QML/components/WComboBox.qml b/src/welle-gui/QML/components/WComboBox.qml
index c33ffa8..e5b3f59 100644
--- a/src/welle-gui/QML/components/WComboBox.qml
+++ b/src/welle-gui/QML/components/WComboBox.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.7
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
@@ -25,6 +50,11 @@ ComboBox {
highlighted: comboBox.highlightedIndex === index
}
+ Keys.onShortcutOverride: {
+ if (event.key == Qt.Key_M || event.key == Qt.Key_S || event.key == Qt.Key_P || event.key == Qt.Key_N)
+ event.accepted = true
+ }
+
TextMetrics {
id: textMetrics
}
diff --git a/src/welle-gui/QML/components/WComboBoxList.qml b/src/welle-gui/QML/components/WComboBoxList.qml
index 364e404..cdddf50 100644
--- a/src/welle-gui/QML/components/WComboBoxList.qml
+++ b/src/welle-gui/QML/components/WComboBoxList.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.7
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
@@ -25,6 +50,11 @@ ComboBox {
highlighted: comboBox.highlightedIndex === index
}
+ Keys.onShortcutOverride: {
+ if (event.key == Qt.Key_M || event.key == Qt.Key_S || event.key == Qt.Key_P || event.key == Qt.Key_N)
+ event.accepted = true
+ }
+
TextMetrics {
id: textMetrics
}
diff --git a/src/welle-gui/QML/components/WDialog.qml b/src/welle-gui/QML/components/WDialog.qml
index 3d8abf4..30c85ef 100644
--- a/src/welle-gui/QML/components/WDialog.qml
+++ b/src/welle-gui/QML/components/WDialog.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/components/WMenu.qml b/src/welle-gui/QML/components/WMenu.qml
index e329dc1..6c83373 100644
--- a/src/welle-gui/QML/components/WMenu.qml
+++ b/src/welle-gui/QML/components/WMenu.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls 2.3
diff --git a/src/welle-gui/QML/components/WSpectrum.qml b/src/welle-gui/QML/components/WSpectrum.qml
index 634c247..9d94f5e 100644
--- a/src/welle-gui/QML/components/WSpectrum.qml
+++ b/src/welle-gui/QML/components/WSpectrum.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtCharts 2.1
import QtQuick.Layouts 1.1
@@ -54,7 +79,6 @@ ColumnLayout {
Waterfall {
id: waterfallPlot
- sensitivity: sensitivitySlider.value
minValue: yMin
Layout.fillHeight: true
Layout.fillWidth: true
@@ -93,26 +117,6 @@ ColumnLayout {
}
}
}
-
- Column {
- spacing: 10
-
- Text {
- text: qsTr("Sensitivity")
- anchors.horizontalCenter: parent.horizontalCenter
- }
- Slider {
- id: sensitivitySlider
- anchors.horizontalCenter: parent.horizontalCenter
- height: 180
- orientation: Qt.Vertical
-
- from: 0.005
- to: 0.1
- stepSize: 0.0001
- value: 0.02
- }
- }
}
ChartView {
diff --git a/src/welle-gui/QML/components/WSwitch.qml b/src/welle-gui/QML/components/WSwitch.qml
index d7ee2df..0007e75 100644
--- a/src/welle-gui/QML/components/WSwitch.qml
+++ b/src/welle-gui/QML/components/WSwitch.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Controls 2.0
import QtQuick.Controls.Material 2.1
diff --git a/src/welle-gui/QML/components/WToolTip.qml b/src/welle-gui/QML/components/WToolTip.qml
new file mode 100644
index 0000000..7a0bc60
--- /dev/null
+++ b/src/welle-gui/QML/components/WToolTip.qml
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+import QtQuick 2.0
+import QtQuick.Controls 2.0
+
+ToolTip {
+ id: toolTip
+
+ delay: 500
+ timeout: 5000
+}
diff --git a/src/welle-gui/QML/components/WTumbler.qml b/src/welle-gui/QML/components/WTumbler.qml
index c428fcf..dbc8e25 100644
--- a/src/welle-gui/QML/components/WTumbler.qml
+++ b/src/welle-gui/QML/components/WTumbler.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/expertviews/ConstellationGraph.qml b/src/welle-gui/QML/expertviews/ConstellationGraph.qml
index e490473..7bc2aab 100644
--- a/src/welle-gui/QML/expertviews/ConstellationGraph.qml
+++ b/src/welle-gui/QML/expertviews/ConstellationGraph.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtCharts 2.1
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml b/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml
index 03d5bff..5247327 100644
--- a/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml
+++ b/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtCharts 2.1
import QtQuick.Layouts 1.1
@@ -80,9 +105,9 @@ ViewBaseFrame {
spectrum.freqMax = Xmax
}
- onNewDebugOutput: {
- spectrum.waterfallObject.plotMessage(text)
- }
+// onNewDebugOutput: {
+// spectrum.waterfallObject.plotMessage(text)
+// }
}
Connections {
diff --git a/src/welle-gui/QML/expertviews/NullSymbolGraph.qml b/src/welle-gui/QML/expertviews/NullSymbolGraph.qml
index 53e94f8..0fc3ba4 100644
--- a/src/welle-gui/QML/expertviews/NullSymbolGraph.qml
+++ b/src/welle-gui/QML/expertviews/NullSymbolGraph.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
import Qt.labs.settings 1.0
diff --git a/src/welle-gui/QML/expertviews/RawRecorder.qml b/src/welle-gui/QML/expertviews/RawRecorder.qml
index a2e2871..2dfa4f5 100644
--- a/src/welle-gui/QML/expertviews/RawRecorder.qml
+++ b/src/welle-gui/QML/expertviews/RawRecorder.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/expertviews/ServiceDetails.qml b/src/welle-gui/QML/expertviews/ServiceDetails.qml
index 516de0e..9f3f7b9 100644
--- a/src/welle-gui/QML/expertviews/ServiceDetails.qml
+++ b/src/welle-gui/QML/expertviews/ServiceDetails.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.2
import QtQuick.Layouts 1.1
@@ -23,8 +48,17 @@ ViewBaseFrame {
text: radioController.channel + " (" + (radioController.frequency > 0 ? radioController.frequency/1e6 : "N/A") + " MHz)"
}
+ TextExpert {
+ name: qsTr("Frequency correction") + ":"
+ text: radioController.frequencyCorrection + " Hz (" + (radioController.frequency > 0 ? radioController.frequencyCorrectionPpm.toFixed(2) : "N/A") + " ppm)"
+ }
+
+ TextExpert {
+ name: qsTr("SNR") + ":"
+ text: radioController.snr.toFixed(2) + " dB"
+ }
+
RowLayout {
- property bool isServiceDetailsRawLayout: true
Rectangle{
height: Units.dp(16)
width: Units.dp(16)
@@ -39,7 +73,6 @@ ViewBaseFrame {
}
RowLayout {
- property bool isServiceDetailsRawLayout: true
Rectangle{
height: Units.dp(16)
width: Units.dp(16)
@@ -53,7 +86,6 @@ ViewBaseFrame {
}
RowLayout {
- property bool isServiceDetailsRawLayout: true
Rectangle{
height: Units.dp(16)
width: Units.dp(16)
@@ -68,24 +100,36 @@ ViewBaseFrame {
}
}
- TextExpert {
- name: qsTr("Frequency correction") + ":"
- text: radioController.frequencyCorrection + " Hz (" + (radioController.frequency > 0 ? radioController.frequencyCorrectionPpm.toFixed(2) : "N/A") + " ppm)"
- }
+ RowLayout {
+ Rectangle{
+ height: Units.dp(16)
+ width: Units.dp(16)
+ color: (radioController.rsCorrectedErrors === 0
+ && radioController.rsUncorrectedErrors === 0)
+ ? "green" : (radioController.rsCorrectedErrors >= 0
+ && radioController.rsUncorrectedErrors === 0) ? "yellow" : "red"
+ }
- TextExpert {
- name: qsTr("SNR") + ":"
- text: radioController.snr + " dB"
+ TextExpert {
+ name: qsTr("RS errors") + ":"
+ text: (radioController.rsCorrectedErrors === 0
+ && radioController.rsUncorrectedErrors === 0)
+ ? qsTr("OK") : (radioController.rsCorrectedErrors >= 0
+ && radioController.rsUncorrectedErrors === 0) ? qsTr("Corrected Error") : qsTr("Uncorrected Error")
+ }
}
- TextExpert {
- name: qsTr("RS errors") + ":"
- text: radioController.rsErrors
- }
+ RowLayout {
+ Rectangle{
+ height: Units.dp(16)
+ width: Units.dp(16)
+ color: radioController.aacErrors === 0 ? "green" : "red"
+ }
- TextExpert {
- name: qsTr("AAC errors") + ":"
- text: radioController.aacErrors
+ TextExpert {
+ name: qsTr("AAC errors") + ":"
+ text: radioController.aacErrors
+ }
}
TextExpert {
diff --git a/src/welle-gui/QML/expertviews/SpectrumGraph.qml b/src/welle-gui/QML/expertviews/SpectrumGraph.qml
index 36a46a9..a9fe5e0 100644
--- a/src/welle-gui/QML/expertviews/SpectrumGraph.qml
+++ b/src/welle-gui/QML/expertviews/SpectrumGraph.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.1
@@ -30,9 +55,9 @@ ViewBaseFrame {
spectrum.freqMax = Xmax
}
- onNewDebugOutput: {
- spectrum.waterfallObject.plotMessage(text)
- }
+// onNewDebugOutput: {
+// spectrum.waterfallObject.plotMessage(text)
+// }
}
Connections {
diff --git a/src/welle-gui/QML/expertviews/TextOutputView.qml b/src/welle-gui/QML/expertviews/TextOutputView.qml
index 9b1ce39..50dd548 100644
--- a/src/welle-gui/QML/expertviews/TextOutputView.qml
+++ b/src/welle-gui/QML/expertviews/TextOutputView.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/AirspySettings.qml b/src/welle-gui/QML/settingpages/AirspySettings.qml
index 422357e..1e8827f 100644
--- a/src/welle-gui/QML/settingpages/AirspySettings.qml
+++ b/src/welle-gui/QML/settingpages/AirspySettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/ChannelSettings.qml b/src/welle-gui/QML/settingpages/ChannelSettings.qml
index 75ea55f..680885c 100644
--- a/src/welle-gui/QML/settingpages/ChannelSettings.qml
+++ b/src/welle-gui/QML/settingpages/ChannelSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/ExpertSettings.qml b/src/welle-gui/QML/settingpages/ExpertSettings.qml
index d59b95f..4c0be3d 100644
--- a/src/welle-gui/QML/settingpages/ExpertSettings.qml
+++ b/src/welle-gui/QML/settingpages/ExpertSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/GlobalSettings.qml b/src/welle-gui/QML/settingpages/GlobalSettings.qml
index afe4e8a..ccff724 100644
--- a/src/welle-gui/QML/settingpages/GlobalSettings.qml
+++ b/src/welle-gui/QML/settingpages/GlobalSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
@@ -55,6 +80,9 @@ Item {
default: deviceBox.currentIndex = 0;
}
}
+ onSetFullScreen: {
+ enableFullScreen.checked = isFullScreen
+ }
}
ColumnLayout{
@@ -72,6 +100,8 @@ Item {
text: qsTr("Full screen mode")
Layout.fillWidth: true
checked: false
+ onCheckedChanged: guiHelper.setMprisFullScreenState(checked)
+ Component.onCompleted: guiHelper.setMprisFullScreenState(checked)
}
RowLayout {
@@ -234,7 +264,7 @@ Item {
model: guiHelper.qQStyleComboModel
onActivated: {
guiHelper.saveQQStyle(currentIndex)
- infoMessagePopup.text = qsTr("Style changed. Please restart welle.io");
+ infoMessagePopup.text = qsTr("Style changed. Please restart welle.io.");
infoMessagePopup.open();
}
}
diff --git a/src/welle-gui/QML/settingpages/NullSettings.qml b/src/welle-gui/QML/settingpages/NullSettings.qml
index f7de1be..6bcf92a 100644
--- a/src/welle-gui/QML/settingpages/NullSettings.qml
+++ b/src/welle-gui/QML/settingpages/NullSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/RTLSDRSettings.qml b/src/welle-gui/QML/settingpages/RTLSDRSettings.qml
index b4cdfca..0eb9170 100644
--- a/src/welle-gui/QML/settingpages/RTLSDRSettings.qml
+++ b/src/welle-gui/QML/settingpages/RTLSDRSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.6
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.1
@@ -18,7 +43,7 @@ SettingSection {
WSwitch {
id: enableBiasTee
Layout.fillWidth: true
- text: qsTr("Enable bias tee (not from all dongles supported)")
+ text: qsTr("Enable bias tee (not supported by all dongles)")
onClicked: {
guiHelper.setBiasTeeRtlSdr(checked)
}
diff --git a/src/welle-gui/QML/settingpages/RTLTCPSettings.qml b/src/welle-gui/QML/settingpages/RTLTCPSettings.qml
index 8c1dc9a..4a1ee03 100644
--- a/src/welle-gui/QML/settingpages/RTLTCPSettings.qml
+++ b/src/welle-gui/QML/settingpages/RTLTCPSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.2
diff --git a/src/welle-gui/QML/settingpages/RawFileSettings.qml b/src/welle-gui/QML/settingpages/RawFileSettings.qml
index 56040f3..15b334a 100644
--- a/src/welle-gui/QML/settingpages/RawFileSettings.qml
+++ b/src/welle-gui/QML/settingpages/RawFileSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.2
diff --git a/src/welle-gui/QML/settingpages/SoapySDRSettings.qml b/src/welle-gui/QML/settingpages/SoapySDRSettings.qml
index 70e46f2..8f2e930 100644
--- a/src/welle-gui/QML/settingpages/SoapySDRSettings.qml
+++ b/src/welle-gui/QML/settingpages/SoapySDRSettings.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
import QtQuick.Controls 2.2
diff --git a/src/welle-gui/QML/texts/TextExpert.qml b/src/welle-gui/QML/texts/TextExpert.qml
index 77df024..3a2627e 100644
--- a/src/welle-gui/QML/texts/TextExpert.qml
+++ b/src/welle-gui/QML/texts/TextExpert.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/texts/TextRadioInfo.qml b/src/welle-gui/QML/texts/TextRadioInfo.qml
index 2aa39d4..76ddb18 100644
--- a/src/welle-gui/QML/texts/TextRadioInfo.qml
+++ b/src/welle-gui/QML/texts/TextRadioInfo.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
// Import custom styles
diff --git a/src/welle-gui/QML/texts/TextRadioStation.qml b/src/welle-gui/QML/texts/TextRadioStation.qml
index d9ab546..74e17bf 100644
--- a/src/welle-gui/QML/texts/TextRadioStation.qml
+++ b/src/welle-gui/QML/texts/TextRadioStation.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
// Import custom styles
diff --git a/src/welle-gui/QML/texts/TextStandart.qml b/src/welle-gui/QML/texts/TextStandart.qml
index fd6eca7..569217b 100644
--- a/src/welle-gui/QML/texts/TextStandart.qml
+++ b/src/welle-gui/QML/texts/TextStandart.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls.Material 2.1
import QtQuick.Controls.Universal 2.1
diff --git a/src/welle-gui/QML/texts/TextStation.qml b/src/welle-gui/QML/texts/TextStation.qml
index 5dcb3d1..53ced92 100644
--- a/src/welle-gui/QML/texts/TextStation.qml
+++ b/src/welle-gui/QML/texts/TextStation.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
import QtQuick.Controls.Material 2.1
import QtQuick.Controls.Universal 2.1
diff --git a/src/welle-gui/QML/texts/TextStyle.qml b/src/welle-gui/QML/texts/TextStyle.qml
index 79c3553..eef8aa0 100644
--- a/src/welle-gui/QML/texts/TextStyle.qml
+++ b/src/welle-gui/QML/texts/TextStyle.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
pragma Singleton
import QtQuick 2.0
diff --git a/src/welle-gui/QML/texts/TextTitle.qml b/src/welle-gui/QML/texts/TextTitle.qml
index 0384998..a82d2c6 100644
--- a/src/welle-gui/QML/texts/TextTitle.qml
+++ b/src/welle-gui/QML/texts/TextTitle.qml
@@ -1,3 +1,28 @@
+/*
+ * Copyright (C) 2017 - 2021
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
import QtQuick 2.0
// Import custom styles
diff --git a/src/welle-gui/android/AndroidManifest.xml b/src/welle-gui/android/AndroidManifest.xml
index de84c00..43358f8 100644
--- a/src/welle-gui/android/AndroidManifest.xml
+++ b/src/welle-gui/android/AndroidManifest.xml
@@ -1,7 +1,16 @@
<?xml version="1.0"?>
-<manifest package="io.welle.welle" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.1" android:versionCode="21" android:installLocation="auto">
- <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@string/app_name" android:icon="@drawable/icon">
- <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="@string/app_name" android:screenOrientation="unspecified" android:theme="@style/AppTheme" android:launchMode="singleTop">
+<manifest package="io.welle.welle" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.3" android:versionCode="23" android:installLocation="auto">
+ <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
+ Remove the comment if you do not require these default permissions. -->
+ <!-- %%INSERT_PERMISSIONS -->
+
+ <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
+ Remove the comment if you do not require these default features. -->
+ <!-- %%INSERT_FEATURES -->
+
+ <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+ <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="welle.io" android:extractNativeLibs="true" android:icon="@drawable/icon">
+ <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="welle.io" android:screenOrientation="unspecified" android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
@@ -18,24 +27,31 @@
<meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
<!-- Deploy Qt libs as part of package -->
<meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
- <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
- <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
+
<!-- Run with local libs -->
<meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
<meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
- <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
+ <meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
<meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
<meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
+ <!-- Used to specify custom system library path to run with local system libs -->
+ <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
<!-- Messages maps -->
<meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
<meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
<meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
+ <meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/>
<!-- Messages maps -->
<!-- Splash screen -->
- <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
- <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
+ <!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
+ then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
+ use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
+ are done populating your window with content. -->
+ <!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
+ <!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
+ <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
<!-- Splash screen -->
<!-- Background running -->
@@ -52,29 +68,17 @@
<!-- extract android style -->
<!-- available android:values :
+ * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
* full - useful QWidget & Quick Controls 1 apps
* minimal - useful for Quick Controls 2 apps, it is much faster than "full"
* none - useful for apps that don't use any of the above Qt modules
-->
- <meta-data android:name="android.app.extract_android_style" android:value="full"/>
+ <meta-data android:name="android.app.extract_android_style" android:value="default"/>
<!-- extract android style -->
- </activity>
-
- </application>
-
- <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28"/>
- <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
-
- <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
- Remove the comment if you do not require these default permissions. -->
+ </activity>
+ <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
- <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
- Remove the comment if you do not require these default features. -->
- <!-- %%INSERT_FEATURES -->
-
-
-<uses-permission android:name="android.permission.INTERNET"/>
+ </application>
-<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
diff --git a/src/welle-gui/android/build.gradle b/src/welle-gui/android/build.gradle
index 6f27670..443a800 100644
--- a/src/welle-gui/android/build.gradle
+++ b/src/welle-gui/android/build.gradle
@@ -1,26 +1,23 @@
buildscript {
repositories {
+ google()
jcenter()
}
dependencies {
- classpath 'com.android.tools.build:gradle:2.2.3'
+ classpath 'com.android.tools.build:gradle:3.6.0'
}
}
-allprojects {
- repositories {
- jcenter()
- }
+repositories {
+ google()
+ jcenter()
}
apply plugin: 'com.android.application'
dependencies {
- compile fileTree(include: ['*.jar'], dir: 'libs')
- compile 'com.android.support:appcompat-v7:25.3.1'
- compile 'com.android.support:support-compat:25.3.1'
- compile 'com.android.support:support-media-compat:25.3.1'
+ implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
android {
@@ -39,7 +36,7 @@ android {
compileSdkVersion androidCompileSdkVersion.toInteger()
- buildToolsVersion androidBuildToolsVersion
+ buildToolsVersion '28.0.3'
sourceSets {
main {
@@ -47,15 +44,34 @@ android {
java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
res.srcDirs = [qt5AndroidDir + '/res', 'res']
- resources.srcDirs = ['src']
+ resources.srcDirs = ['resources']
renderscript.srcDirs = ['src']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
}
+ tasks.withType(JavaCompile) {
+ options.incremental = true
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
lintOptions {
abortOnError false
- disable 'MissingTranslation'
+ }
+
+ // Do not compress Qt binary resources file
+ aaptOptions {
+ noCompress 'rcc'
+ }
+
+ defaultConfig {
+ resConfig "en"
+ minSdkVersion = qtMinSdkVersion
+ targetSdkVersion = qtTargetSdkVersion
}
}
diff --git a/src/welle-gui/android/gradle.properties b/src/welle-gui/android/gradle.properties
index 2650d04..fded106 100644
--- a/src/welle-gui/android/gradle.properties
+++ b/src/welle-gui/android/gradle.properties
@@ -1,9 +1,11 @@
-## This file is automatically generated by QtCreator.
-#
-# This file must *NOT* be checked into Version Control Systems,
-# as it contains information specific to your local configuration.
+# Project-wide Gradle settings.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m
-androidBuildToolsVersion=25.0.2
-androidCompileSdkVersion=26
-buildDir=.build
-qt5AndroidDir=/home/albrecht/Qt/5.9.3/android_armv7/src/android/java
+# Gradle caching allows reusing the build artifacts from a previous
+# build with the same inputs. However, over time, the cache size will
+# grow. Uncomment the following line to enable it.
+#org.gradle.caching=true
diff --git a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar
index 13372ae..f6b961f 100644
Binary files a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar and b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties
index 04e285f..5028f28 100644
--- a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties
+++ b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/src/welle-gui/android/gradlew b/src/welle-gui/android/gradlew
old mode 100644
new mode 100755
index 9d82f78..cccdd3d
--- a/src/welle-gui/android/gradlew
+++ b/src/welle-gui/android/gradlew
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
##############################################################################
##
@@ -6,20 +6,38 @@
##
##############################################################################
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
-warn ( ) {
+warn () {
echo "$*"
}
-die ( ) {
+die () {
echo
echo "$*"
echo
@@ -30,6 +48,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
+nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,26 +59,11 @@ case "`uname`" in
MINGW* )
msys=true
;;
+ NONSTOP* )
+ nonstop=true
+ ;;
esac
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +154,19 @@ if $cygwin ; then
esac
fi
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
- JVM_OPTS=("$@")
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
}
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+ cd "$(dirname "$0")"
+fi
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/src/welle-gui/android/gradlew.bat b/src/welle-gui/android/gradlew.bat
index aec9973..f955316 100644
--- a/src/welle-gui/android/gradlew.bat
+++ b/src/welle-gui/android/gradlew.bat
@@ -1,90 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/src/welle-gui/android/local.properties b/src/welle-gui/android/local.properties
deleted file mode 100644
index f10bc87..0000000
--- a/src/welle-gui/android/local.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-## This file is automatically generated by QtCreator.
-#
-# This file must *NOT* be checked into Version Control Systems,
-# as it contains information specific to your local configuration.
-
-sdk.dir=/home/albrecht/Android/Sdk
diff --git a/src/welle-gui/android/res/drawable/ic_antenna.xml b/src/welle-gui/android/res/drawable/ic_antenna.xml
deleted file mode 100644
index 43e0d47..0000000
--- a/src/welle-gui/android/res/drawable/ic_antenna.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="477.0"
- android:viewportWidth="477.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#9e9e9e" android:pathData="M190,192.8c3.6,2 8.2,0.6 10.2,-3c2,-3.6 0.6,-8.2 -3,-10.2C168.7,164.2 151,134.7 151,102.5c0,-48.2 39.3,-87.5 87.5,-87.5S326,54.3 326,102.5c0,32.2 -17.7,61.7 -46.1,77.1c-3.6,2 -5,6.5 -3,10.2c1.4,2.5 3.9,3.9 6.6,3.9c1.2,0 2.4,-0.3 3.6,-0.9C320.3,174.8 341,140.2 341,102.5C341,46 295,0 238.5,0S136,46 136,102.5C136,140.2 156.7,174.8 190,192.8z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M265.9,141.3c-3.4,2.4 -4.2,7.1 -1.8,10.5c1.5,2.1 3.8,3.2 6.1,3.2c1.5,0 3,-0.4 4.3,-1.4C291.1,141.8 301,122.7 301,102.5c0,-34.5 -28,-62.5 -62.5,-62.5S176,68 176,102.5c0,20.2 9.9,39.3 26.5,51c3.4,2.4 8.1,1.6 10.5,-1.8c2.4,-3.4 1.6,-8.1 -1.8,-10.5C198.5,132.4 191,117.9 191,102.5c0,-26.2 21.3,-47.5 47.5,-47.5S286,76.3 286,102.5C286,117.9 278.5,132.4 265.9,141.3z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M326.1,380c-0,-0 -0,-0 -0,-0.1L246,146.3v-22.5c8.7,-3.1 15,-11.4 15,-21.2c0,-12.4 -10.1,-22.5 -22.5,-22.5S216,90.1 216,102.5c0,9.8 6.3,18.1 15,21.2v22.5l-28.9,84.4c-0,0.1 -0,0.1 -0.1,0.2l-24.9,72.7c-0,0.1 -0.1,0.2 -0.1,0.3l-39.2,114.4c-1.3,3.9 0.7,8.2 4.7,9.5c0.8,0.3 1.6,0.4 2.4,0.4c3.1,0 6,-2 7.1,-5.1l10.2,-29.7l68.8,39.9V469.5c0,4.1 3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5v-36.2l68.8,-39.9l10.2,29.7c1.3,3.9 5.6,6 9.5,4.7c3.9,-1.3 6,-5.6 4.7,-9.5L326.1,380zM212.7,245.9L231,261.5v67.8l-37.9,-26.1L212.7,245.9zM246,261.5l18.3,-15.5l19.6,57.2L246,329.2V261.5zM259.1,230.7L246,241.8v-49.2L259.1,230.7zM238.5,95c4.1,0 7.5,3.4 7.5,7.5s-3.4,7.5 -7.5,7.5s-7.5,-3.4 -7.5,-7.5S234.4,95 238.5,95zM231,241.8l-13.1,-11.1L231,192.5V241.8zM167.2,379l20.9,-61.1L231,347.4v68.5L167.2,379zM246,416v-68.5l42.9,-29.6l20.9,61.1L246,416z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_cancel.xml b/src/welle-gui/android/res/drawable/ic_cancel.xml
deleted file mode 100644
index 6125aed..0000000
--- a/src/welle-gui/android/res/drawable/ic_cancel.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_close.xml b/src/welle-gui/android/res/drawable/ic_close.xml
deleted file mode 100644
index d11cc5c..0000000
--- a/src/welle-gui/android/res/drawable/ic_close.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_favorite.xml b/src/welle-gui/android/res/drawable/ic_favorite.xml
deleted file mode 100644
index 46cfb27..0000000
--- a/src/welle-gui/android/res/drawable/ic_favorite.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_favorite_border.xml b/src/welle-gui/android/res/drawable/ic_favorite_border.xml
deleted file mode 100644
index d8e3541..0000000
--- a/src/welle-gui/android/res/drawable/ic_favorite_border.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_favorites.xml b/src/welle-gui/android/res/drawable/ic_favorites.xml
deleted file mode 100644
index 68f466f..0000000
--- a/src/welle-gui/android/res/drawable/ic_favorites.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FF9E9E9E"
- android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_icon.xml b/src/welle-gui/android/res/drawable/ic_icon.xml
deleted file mode 100644
index 6ce7e2c..0000000
--- a/src/welle-gui/android/res/drawable/ic_icon.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="465.0"
- android:viewportWidth="465.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#9e9e9e" android:pathData="M396.5,156.8L115.8,156.8l0,-2.2c0,-5.6 -2.1,-10.7 -5.5,-14.7L379.5,67.8c3.2,-0.9 5.1,-4.1 4.2,-7.3 -0.9,-3.2 -4.1,-5.1 -7.3,-4.2L92.5,132.3c-11.9,0.5 -21.5,10.3 -21.5,22.3l0,2.2L68.5,156.8c-12.1,0 -22,9.9 -22,22l0,208.2c0,12.1 9.9,22 22,22l328,0c12.1,0 22,-9.9 22,-22l0,-208.2c0,-12.1 -9.9,-22 -22,-22zM83,154.6c0,-5.7 4.6,-10.4 10.3,-10.4 0,0 0,0 0,0 0,0 0,-0 0,-0 5.7,0 10.4,4.7 10.4,10.4l0,2.2L83,156.8ZM406.5,387c0,5.5 -4.5,10 -10,10l-328,0c-5.5,0 -10,-4.5 -10,-10l0,-208.2c0,-5.5 4.5,-10 10,-10l328,0c5.5,0 10,4.5 10,10z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m158.9,203.3c-43.9,0 -79.6,35.7 -79.6,79.6 0,43.9 35.7,79.6 79.6,79.6 43.9,0 79.6,-35.7 79.6,-79.6 0,-43.9 -35.7,-79.6 -79.6,-79.6zM158.9,350.5c-37.3,0 -67.6,-30.3 -67.6,-67.6 0,-37.3 30.3,-67.6 67.6,-67.6 37.3,0 67.6,30.3 67.6,67.6 0,37.3 -30.3,67.6 -67.6,67.6z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m158.9,227.8c-30.4,0 -55.1,24.7 -55.1,55.1 0,30.4 24.7,55.1 55.1,55.1 30.4,0 55.1,-24.7 55.1,-55.1 -0,-30.4 -24.7,-55.1 -55.1,-55.1zM158.9,326c-23.8,0 -43.1,-19.3 -43.1,-43.1 0,-23.8 19.3,-43.1 43.1,-43.1 23.8,0 43.1,19.3 43.1,43.1 -0,23.8 -19.3,43.1 -43.1,43.1z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m283.6,318.7c13.5,0 24.4,-11 24.4,-24.4 0,-13.5 -11,-24.4 -24.4,-24.4 -13.5,0 -24.4,11 -24.4,24.4 0,13.5 11,24.4 24.4,24.4zM283.6,281.9c6.8,0 12.4,5.6 12.4,12.4 0,6.8 -5.6,12.4 -12.4,12.4 -6.8,0 -12.4,-5.6 -12.4,-12.4 0,-6.8 5.6,-12.4 12.4,-12.4z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m361.4,269.9c-13.5,0 -24.4,11 -24.4,24.4 0,13.5 11,24.4 24.4,24.4 13.5,0 24.4,-11 24.4,-24.4 0,-13.5 -11,-24.4 -24.4,-24.4zM361.4,306.7c-6.8,0 -12.4,-5.6 -12.4,-12.4 0,-6.8 5.6,-12.4 12.4,-12.4 6.8,0 12.4,5.6 12.4,12.4 0,6.8 -5.6,12.4 -12.4,12.4z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M379.8,188.1L265.2,188.1c-3.3,0 -6,2.7 -6,6l0,57.3c0,3.3 2.7,6 6,6l114.5,0c3.3,0 6,-2.7 6,-6l0,-57.3c0,-3.3 -2.7,-6 -6,-6zM373.8,245.4l-69.8,0l0,-25.3c0,-3.3 -2.7,-6 -6,-6 -3.3,0 -6,2.7 -6,6l0,25.3L271.2,245.4l0,-45.3l102.5,0l0,45.3z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M379.8,331.3L265.2,331.3c-3.3,0 -6,2.7 -6,6l0,33c0,3.3 2.7,6 6,6l114.5,0c3.3,0 6,-2.7 6,-6l0,-33c0,-3.3 -2.7,-6 -6,-6zM335.6,343.3l0,21l-26.2,0l0,-21zM271.2,343.3l26.2,0l0,21l-26.2,0zM373.8,364.2l-26.2,0l0,-21l26.2,0z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m158.9,252.3c-3.3,0 -6,2.7 -6,6l0,49.1c0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6l0,-49.1c0,-3.3 -2.7,-6 -6,-6z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m134.3,258.9c-3.3,0 -6,2.7 -6,6l0,35.9c0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6l0,-35.9c0,-3.3 -2.7,-6 -6,-6z"/>
- <path android:fillColor="#9e9e9e" android:pathData="m183.4,258.9c-3.3,0 -6,2.7 -6,6l0,35.9c0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6l0,-35.9c0,-3.3 -2.7,-6 -6,-6z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_pause.xml b/src/welle-gui/android/res/drawable/ic_pause.xml
deleted file mode 100644
index 8356ff5..0000000
--- a/src/welle-gui/android/res/drawable/ic_pause.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_play.xml b/src/welle-gui/android/res/drawable/ic_play.xml
deleted file mode 100644
index 81a8f74..0000000
--- a/src/welle-gui/android/res/drawable/ic_play.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8,5v14l11,-7z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_radio.xml b/src/welle-gui/android/res/drawable/ic_radio.xml
deleted file mode 100644
index 469c43b..0000000
--- a/src/welle-gui/android/res/drawable/ic_radio.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="465.0"
- android:viewportWidth="465.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
- <path android:fillColor="#9e9e9e" android:pathData="M437.5,137.9H86.6v-2.7c0,-7 -2.6,-13.4 -6.9,-18.3l336.5,-90.2c4,-1.1 6.4,-5.2 5.3,-9.2c-1.1,-4 -5.2,-6.4 -9.2,-5.3L57.5,107.2c-14.9,0.6 -26.9,12.9 -26.9,27.9v2.7H27.5c-15.2,0 -27.5,12.3 -27.5,27.5v260.2c0,15.2 12.3,27.5 27.5,27.5h410c15.2,0 27.5,-12.3 27.5,-27.5v-260.2C465,150.2 452.7,137.9 437.5,137.9zM45.7,135.2c0,-7.1 5.8,-12.9 12.9,-13c0,0 0,0 0,0c0,0 0,-0 0,-0c7.1,0 12.9,5.8 12.9,13v2.7H45.7V135.2zM450,425.6c0,6.9 -5.6,12.5 -12.5,12.5h-410c-6.9,0 -12.5,-5.6 -12.5,-12.5v-260.2c0,-6.9 5.6,-12.5 12.5,-12.5h410c6.9,0 12.5,5.6 12.5,12.5V425.6z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M140.5,195.9c-54.9,0 -99.5,44.7 -99.5,99.5s44.7,99.5 99.5,99.5S240,350.4 240,295.5S195.3,195.9 140.5,195.9zM140.5,380c-46.6,0 -84.5,-37.9 -84.5,-84.5s37.9,-84.5 84.5,-84.5S225,248.9 225,295.5S187.1,380 140.5,380z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M140.5,226.6c-38,0 -68.9,30.9 -68.9,68.9c0,38 30.9,68.9 68.9,68.9s68.9,-30.9 68.9,-68.9C209.3,257.5 178.4,226.6 140.5,226.6zM140.5,349.4c-29.7,0 -53.9,-24.2 -53.9,-53.9c0,-29.7 24.2,-53.9 53.9,-53.9s53.9,24.2 53.9,53.9C194.3,325.2 170.2,349.4 140.5,349.4z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M296.4,340.3c16.8,0 30.5,-13.7 30.5,-30.5c0,-16.8 -13.7,-30.5 -30.5,-30.5s-30.5,13.7 -30.5,30.5C265.9,326.6 279.6,340.3 296.4,340.3zM296.4,294.3c8.6,0 15.5,7 15.5,15.5c0,8.6 -7,15.5 -15.5,15.5s-15.5,-7 -15.5,-15.5C280.9,301.2 287.9,294.3 296.4,294.3z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M393.6,279.3c-16.8,0 -30.5,13.7 -30.5,30.5c0,16.8 13.7,30.5 30.5,30.5s30.5,-13.7 30.5,-30.5C424.1,293 410.4,279.3 393.6,279.3zM393.6,325.3c-8.6,0 -15.5,-7 -15.5,-15.5c0,-8.6 7,-15.5 15.5,-15.5s15.5,7 15.5,15.5C409.1,318.3 402.1,325.3 393.6,325.3z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M416.6,177H273.4c-4.1,0 -7.5,3.4 -7.5,7.5v71.6c0,4.1 3.4,7.5 7.5,7.5h143.2c4.1,0 7.5,-3.4 7.5,-7.5v-71.6C424.1,180.4 420.7,177 416.6,177zM409.1,248.6h-87.3v-31.6c0,-4.1 -3.4,-7.5 -7.5,-7.5s-7.5,3.4 -7.5,7.5v31.6h-25.9v-56.6h128.2V248.6z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M416.6,356H273.4c-4.1,0 -7.5,3.4 -7.5,7.5v41.2c0,4.1 3.4,7.5 7.5,7.5h143.2c4.1,0 7.5,-3.4 7.5,-7.5v-41.2C424.1,359.3 420.7,356 416.6,356zM361.4,371v26.2h-32.7v-26.2H361.4zM280.9,371h32.7v26.2h-32.7V371zM409.1,397.2h-32.7v-26.2h32.7V397.2z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M140.5,257.3c-4.1,0 -7.5,3.4 -7.5,7.5v61.4c0,4.1 3.4,7.5 7.5,7.5c4.1,0 7.5,-3.4 7.5,-7.5v-61.4C148,260.7 144.6,257.3 140.5,257.3z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M109.8,265.5c-4.1,0 -7.5,3.4 -7.5,7.5v44.9c0,4.1 3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5v-44.9C117.3,268.9 113.9,265.5 109.8,265.5z"/>
- <path android:fillColor="#9e9e9e" android:pathData="M171.1,265.5c-4.1,0 -7.5,3.4 -7.5,7.5v44.9c0,4.1 3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5v-44.9C178.6,268.9 175.3,265.5 171.1,265.5z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_radio_button_checked.xml b/src/welle-gui/android/res/drawable/ic_radio_button_checked.xml
deleted file mode 100644
index f6e8a94..0000000
--- a/src/welle-gui/android/res/drawable/ic_radio_button_checked.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_radio_button_unchecked.xml b/src/welle-gui/android/res/drawable/ic_radio_button_unchecked.xml
deleted file mode 100644
index 42988f2..0000000
--- a/src/welle-gui/android/res/drawable/ic_radio_button_unchecked.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_search.xml b/src/welle-gui/android/res/drawable/ic_search.xml
deleted file mode 100644
index 47432c1..0000000
--- a/src/welle-gui/android/res/drawable/ic_search.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_skip_next.xml b/src/welle-gui/android/res/drawable/ic_skip_next.xml
deleted file mode 100644
index 5d1017b..0000000
--- a/src/welle-gui/android/res/drawable/ic_skip_next.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_skip_previous.xml b/src/welle-gui/android/res/drawable/ic_skip_previous.xml
deleted file mode 100644
index 7528785..0000000
--- a/src/welle-gui/android/res/drawable/ic_skip_previous.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_skip_up.xml b/src/welle-gui/android/res/drawable/ic_skip_up.xml
deleted file mode 100644
index eae5c78..0000000
--- a/src/welle-gui/android/res/drawable/ic_skip_up.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="24dp"
- android:height="24dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M5,17.5H19L12,6.5Z"/>
-</vector>
diff --git a/src/welle-gui/android/res/values-de/strings.xml b/src/welle-gui/android/res/values-de/strings.xml
deleted file mode 100644
index a4b51d2..0000000
--- a/src/welle-gui/android/res/values-de/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="app_name">welle.io</string>
- <string name="menu_stations">Sender</string>
- <string name="menu_channels">Kanäle</string>
- <string name="menu_channel_scan">Sendersuchlauf</string>
- <string name="menu_favorites">Favoriten</string>
- <string name="action_close">Beenden</string>
- <string name="action_cancel">Abbrechen</string>
- <string name="action_scan">Suchen</string>
- <string name="action_favorite">Favorit</string>
- <string name="action_record">Aufnehmen</string>
- <string name="action_play">Abspielen</string>
- <string name="action_pause">Pausieren</string>
- <string name="action_skip_next">Nächste</string>
- <string name="action_skip_prev">Vorherige</string>
- <string name="action_next_channel">Nächster Kanal</string>
- <string name="label_scanning">Scanne</string>
- <string name="error_unknown">Unbekannter Fehler.</string>
- <string name="error_not_initialised">Radioempfänger meldet einen Fehler oder existiert nicht.</string>
- <string name="error_driver_not_installed">Android RTL-SDR Treiber ist nicht installiert.</string>
- <string name="dialog_driver_title">Android RTL-SDR Treiber ist nicht installiert</string>
- <string name="dialog_driver_msg">Soll er installiert werden? welle.io muss nach der Treiberinstallation neu gestartet werden.</string>
- <string name="dialog_driver_btn_ok">Installieren</string>
- <string name="dialog_driver_btn_cancel">Abbrechen</string>
-</resources>
diff --git a/src/welle-gui/android/res/values/libs.xml b/src/welle-gui/android/res/values/libs.xml
index 4009a77..6b1a4a2 100644
--- a/src/welle-gui/android/res/values/libs.xml
+++ b/src/welle-gui/android/res/values/libs.xml
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<array name="qt_sources">
- <item>https://download.qt.io/ministro/android/qt5/qt-5.9</item>
+ <item>https://download.qt.io/ministro/android/qt5/qt-5.14</item>
</array>
<!-- The following is handled automatically by the deployment tool. It should
@@ -11,15 +11,12 @@
<!-- %%INSERT_EXTRA_LIBS%% -->
</array>
- <array name="qt_libs">
- <!-- %%INSERT_QT_LIBS%% -->
- </array>
-
- <array name="bundled_in_lib">
- <!-- %%INSERT_BUNDLED_IN_LIB%% -->
+ <array name="qt_libs">
+ <!-- %%INSERT_QT_LIBS%% -->
</array>
- <array name="bundled_in_assets">
- <!-- %%INSERT_BUNDLED_IN_ASSETS%% -->
+
+ <array name="load_local_libs">
+ <!-- %%INSERT_LOCAL_LIBS%% -->
</array>
</resources>
diff --git a/src/welle-gui/android/res/values/strings.xml b/src/welle-gui/android/res/values/strings.xml
deleted file mode 100644
index cf5c400..0000000
--- a/src/welle-gui/android/res/values/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="app_name">welle.io</string>
- <string name="menu_stations">Stations</string>
- <string name="menu_channels">Channels</string>
- <string name="menu_channel_scan">Find Stations</string>
- <string name="menu_favorites">Favorites</string>
- <string name="action_close">Close</string>
- <string name="action_cancel">Cancel</string>
- <string name="action_scan">Scan</string>
- <string name="action_favorite">Favorite</string>
- <string name="action_record">Record</string>
- <string name="action_play">Play</string>
- <string name="action_pause">Pause</string>
- <string name="action_skip_next">Next</string>
- <string name="action_skip_prev">Previous</string>
- <string name="action_next_channel">Next Channel</string>
- <string name="label_scanning">Scanning</string>
- <string name="error_unknown">Unknown error.</string>
- <string name="error_not_initialised">Radio device is not ready or does not exist.</string>
- <string name="error_driver_not_installed">Android RTL-SDR driver is not installed.</string>
- <string name="dialog_driver_title">Android RTL-SDR driver is not installed</string>
- <string name="dialog_driver_msg">Would you like to install it? Start welle.io again after install.</string>
- <string name="dialog_driver_btn_ok">Install</string>
- <string name="dialog_driver_btn_cancel">Cancel</string>
-</resources>
diff --git a/src/welle-gui/android/res/values/styles.xml b/src/welle-gui/android/res/values/styles.xml
deleted file mode 100644
index ab09d90..0000000
--- a/src/welle-gui/android/res/values/styles.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <color name="colorPrimary">#ffff3d00</color>
- <color name="colorAccent">#ffff3d00</color>
- <color name="colorPrimaryDark">#ff212126</color>
- <color name="background">#ff212126</color>
-
- <style name="AppTheme" parent="Theme.AppCompat">
- <item name="colorPrimary">@color/colorPrimary</item>
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- <item name="colorAccent">@color/colorAccent</item>
- <!--<item name="android:background">@color/background</item>-->
- <item name="android:windowBackground">@color/background</item>
- <item name="android:colorBackground">@color/background</item>
- </style>
-
- <style name="CarTheme" parent="AppTheme">
- <!-- colorPrimaryDark is currently used in Android Auto for:
- - App background
- - Drawer right side ("more" custom actions) background
- - Notification icon badge tinting
- - Overview “now playing” icon tinting
- -->
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-
- <!-- colorAccent is used in Android Auto for:
- - Spinner
- - progress bar
- - floating action button background (Play/Pause in media apps)
- -->
- <item name="colorAccent">@color/colorAccent</item>
- </style>
-
- <style name="WearTheme" parent="AppTheme">
- <!-- colorPrimaryDark is currently used on Android Wear for:
- - Card background on media browse
- - Card background on 4-way media controls
- -->
- <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
- </style>
-
-</resources>
diff --git a/src/welle-gui/android/res/xml/automotive_app_desc.xml b/src/welle-gui/android/res/xml/automotive_app_desc.xml
deleted file mode 100644
index 8e77bb0..0000000
--- a/src/welle-gui/android/res/xml/automotive_app_desc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<automotiveApp>
- <uses name="media" />
-</automotiveApp>
diff --git a/src/welle-gui/android/res/xml/device_filter.xml b/src/welle-gui/android/res/xml/device_filter.xml
deleted file mode 100644
index ca85543..0000000
--- a/src/welle-gui/android/res/xml/device_filter.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-
- <usb-device vendor-id="0x0bda" product-id="0x2832"/> <!-- Generic RTL2832U-->
- <usb-device vendor-id="0x0bda" product-id="0x2838"/> <!-- Generic RTL2832U OEM-->
- <usb-device vendor-id="0x0413" product-id="0x6680"/> <!-- DigitalNow Quad DVB-T PCI-E card-->
- <usb-device vendor-id="0x0413" product-id="0x6f0f"/> <!-- Leadtek WinFast DTV Dongle mini D-->
- <usb-device vendor-id="0x0458" product-id="0x707f"/> <!-- Genius TVGo DVB-T03 USB dongle (Ver. B)-->
- <usb-device vendor-id="0x0ccd" product-id="0x00a9"/> <!-- Terratec Cinergy T Stick Black (rev 1)-->
- <usb-device vendor-id="0x0ccd" product-id="0x00b3"/> <!-- Terratec NOXON DAB/DAB+ USB dongle (rev 1)-->
- <usb-device vendor-id="0x0ccd" product-id="0x00b4"/> <!-- Terratec Deutschlandradio DAB Stick-->
- <usb-device vendor-id="0x0ccd" product-id="0x00b5"/> <!-- Terratec NOXON DAB Stick - Radio Energy-->
- <usb-device vendor-id="0x0ccd" product-id="0x00b7"/> <!-- Terratec Media Broadcast DAB Stick-->
- <usb-device vendor-id="0x0ccd" product-id="0x00b8"/> <!-- Terratec BR DAB Stick-->
- <usb-device vendor-id="0x0ccd" product-id="0x00b9"/> <!-- Terratec WDR DAB Stick-->
- <usb-device vendor-id="0x0ccd" product-id="0x00c0"/> <!-- Terratec MuellerVerlag DAB Stick-->
- <usb-device vendor-id="0x0ccd" product-id="0x00c6"/> <!-- Terratec Fraunhofer DAB Stick-->
- <usb-device vendor-id="0x0ccd" product-id="0x00d3"/> <!-- Terratec Cinergy T Stick RC (Rev.3)-->
- <usb-device vendor-id="0x0ccd" product-id="0x00d7"/> <!-- Terratec T Stick PLUS-->
- <usb-device vendor-id="0x0ccd" product-id="0x00e0"/> <!-- Terratec NOXON DAB/DAB+ USB dongle (rev 2)-->
- <usb-device vendor-id="0x1554" product-id="0x5020"/> <!-- PixelView PV-DT235U(RN)-->
- <usb-device vendor-id="0x15f4" product-id="0x0131"/> <!-- Astrometa DVB-T/DVB-T2-->
- <usb-device vendor-id="0x15f4" product-id="0x0133"/> <!-- HanfTek DAB+FM+DVB-T-->
- <usb-device vendor-id="0x185b" product-id="0x0620"/> <!-- Compro Videomate U620F-->
- <usb-device vendor-id="0x185b" product-id="0x0650"/> <!-- Compro Videomate U650F-->
- <usb-device vendor-id="0x185b" product-id="0x0680"/> <!-- Compro Videomate U680F-->
- <usb-device vendor-id="0x1b80" product-id="0xd393"/> <!-- GIGABYTE GT-U7300-->
- <usb-device vendor-id="0x1b80" product-id="0xd394"/> <!-- DIKOM USB-DVBT HD-->
- <usb-device vendor-id="0x1b80" product-id="0xd395"/> <!-- Peak 102569AGPK-->
- <usb-device vendor-id="0x1b80" product-id="0xd397"/> <!-- KWorld KW-UB450-T USB DVB-T Pico TV-->
- <usb-device vendor-id="0x1b80" product-id="0xd398"/> <!-- Zaapa ZT-MINDVBZP-->
- <usb-device vendor-id="0x1b80" product-id="0xd39d"/> <!-- SVEON STV20 DVB-T USB & FM-->
- <usb-device vendor-id="0x1b80" product-id="0xd3a4"/> <!-- Twintech UT-40-->
- <usb-device vendor-id="0x1b80" product-id="0xd3a8"/> <!-- ASUS U3100MINI_PLUS_V2-->
- <usb-device vendor-id="0x1b80" product-id="0xd3af"/> <!-- SVEON STV27 DVB-T USB & FM-->
- <usb-device vendor-id="0x1b80" product-id="0xd3b0"/> <!-- SVEON STV21 DVB-T USB & FM-->
- <usb-device vendor-id="0x1d19" product-id="0x1101"/> <!-- Dexatek DK DVB-T Dongle (Logilink VG0002A)-->
- <usb-device vendor-id="0x1d19" product-id="0x1102"/> <!-- Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)-->
- <usb-device vendor-id="0x1d19" product-id="0x1103"/> <!-- Dexatek Technology Ltd. DK 5217 DVB-T Dongle-->
- <usb-device vendor-id="0x1d19" product-id="0x1104"/> <!-- MSI DigiVox Micro HD-->
- <usb-device vendor-id="0x1f4d" product-id="0xa803"/> <!-- Sweex DVB-T USB-->
- <usb-device vendor-id="0x1f4d" product-id="0xb803"/> <!-- GTek T803-->
- <usb-device vendor-id="0x1f4d" product-id="0xc803"/> <!-- Lifeview LV5TDeluxe-->
- <usb-device vendor-id="0x1f4d" product-id="0xd286"/> <!-- MyGica TD312-->
- <usb-device vendor-id="0x1f4d" product-id="0xd803"/> <!-- PROlectrix DV107669-->
-
-</resources>
\ No newline at end of file
diff --git a/src/welle-gui/android_rtl_sdr.cpp b/src/welle-gui/android_rtl_sdr.cpp
index 915f2c2..9770b88 100644
--- a/src/welle-gui/android_rtl_sdr.cpp
+++ b/src/welle-gui/android_rtl_sdr.cpp
@@ -136,7 +136,7 @@ void CAndroid_RTL_SDR::setOpenInstallDialog()
// Init pop up
QAndroidJniObject okButtonText = QAndroidJniObject::fromString(QT_TR_NOOP("OK"));
QAndroidJniObject cancelButtonText = QAndroidJniObject::fromString(QT_TR_NOOP("Cancel"));
- QAndroidJniObject message = QAndroidJniObject::fromString(QT_TR_NOOP("Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again."));
+ QAndroidJniObject message = QAndroidJniObject::fromString(QT_TR_NOOP("Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again."));
dialog.callMethod<void>("setMessageText",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
okButtonText.object<jstring>(), cancelButtonText.object<jstring>(), message.object<jstring>());
diff --git a/src/welle-gui/audio_output.cpp b/src/welle-gui/audio_output.cpp
index a3e7d7d..d85b653 100644
--- a/src/welle-gui/audio_output.cpp
+++ b/src/welle-gui/audio_output.cpp
@@ -85,6 +85,7 @@ void CAudioThread::init(int sampleRate)
if (audioOutput != nullptr) {
delete audioOutput;
audioOutput = nullptr;
+ currentState = QAudio::StoppedState;
}
audioFormat.setSampleRate(sampleRate);
@@ -109,7 +110,7 @@ void CAudioThread::init(int sampleRate)
audioOutput->setBufferSize(audioOutput->bufferSize()*2);
connect(audioOutput, &QAudioOutput::stateChanged, this, &CAudioThread::handleStateChanged);
- audioIODevice.start();
+ //audioIODevice.start();
// Disable audio at startup. It will be started through "checkAudioBufferTimeout" method when needed
//audioOutput->start(&audioIODevice);
diff --git a/src/welle-gui/doc/man/update_manpage.sh b/src/welle-gui/doc/man/update_manpage.sh
new file mode 100755
index 0000000..cb1f4cb
--- /dev/null
+++ b/src/welle-gui/doc/man/update_manpage.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+help2man \
+ --name "DAB/DAB+ Software Radio" \
+ --no-info \
+ --output welle-io.1 \
+ welle-io
diff --git a/src/welle-gui/doc/man/welle-io.1 b/src/welle-gui/doc/man/welle-io.1
new file mode 100644
index 0000000..51ec5b1
--- /dev/null
+++ b/src/welle-gui/doc/man/welle-io.1
@@ -0,0 +1,30 @@
+.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.48.1.
+.TH WELLE.IO "1" "November 2021" "welle.io 2.4 dev Git: unknown" "User Commands"
+.SH NAME
+welle.io \- DAB/DAB+ Software Radio
+.SH SYNOPSIS
+.B welle-io
+[\fI\,options\/\fR]
+.SH DESCRIPTION
+welle.io is an open source DAB and DAB+ software defined radio (SDR) with support for rtl\-sdr (RTL2832U) and airspy. It supports high DPI and touch displays and it runs even on cheap computers like Raspberry Pi 2/3 and 100??? China Windows 10 tablets.
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Displays help on commandline options.
+.TP
+\fB\-\-help\-all\fR
+Displays help including Qt specific options.
+.TP
+\fB\-v\fR, \fB\-\-version\fR
+Displays version information.
+.TP
+\fB\-\-dump\-file\fR <File name>
+Records DAB frames (*.mp2) or DAB+ superframes with
+RS coding (*.dab). This file can be used to analyse
+X\-PAD data with XPADxpert
+.TP
+\fB\-\-log\-file\fR <File name>
+Redirects all log output texts to a file.
+.TP
+\fB\-\-qqc\-style\fR <Style name>
+Qt Quick Controls Style for the 1st launch
diff --git a/src/welle-gui/gui_helper.cpp b/src/welle-gui/gui_helper.cpp
index 947c713..4641731 100644
--- a/src/welle-gui/gui_helper.cpp
+++ b/src/welle-gui/gui_helper.cpp
@@ -94,6 +94,9 @@ CGUIHelper::CGUIHelper(CRadioController *RadioController, QObject *parent)
#endif
+#ifndef __ANDROID__
+ mpris = new Mpris(radioController, this);
+#endif
CDebugOutput::setCGUI(this);
}
@@ -178,8 +181,13 @@ const QByteArray CGUIHelper::getInfoPage(QString pageName)
// Set application version
InfoContent.append(tr("welle.io version") + ": " + QString(CURRENT_VERSION) + "\n");
InfoContent.append(tr("Git revision") + ": " + QString(GITHASH) + "\n");
- QString ts = QString(__TIMESTAMP__).replace(" "," ");
- QDateTime tsDT = QLocale(QLocale::C).toDateTime(ts, "ddd MMM d hh:mm:ss yyyy");
+ QDateTime tsDT;
+ QString source_date_epoch = BUILD_DATE;
+ if (!source_date_epoch.isEmpty()) {
+ tsDT = QDateTime::fromSecsSinceEpoch(source_date_epoch.toLongLong());
+ } else {
+ tsDT = QDateTime::currentDateTime();
+ }
InfoContent.append(tr("Built on") + ": " + tsDT.toString(Qt::ISODate) + "\n");
InfoContent.append(tr("QT version") + ": " + qVersion() + "\n");
InfoContent.append("\n");
@@ -525,9 +533,9 @@ void CGUIHelper::updateConstellation()
*/
}
-void CGUIHelper::saveMotImages()
+void CGUIHelper::saveMotImages(QString folder)
{
- motImageProvider->saveAll();
+ motImageProvider->saveAll(folder);
}
void CGUIHelper::openAutoDevice()
@@ -895,3 +903,15 @@ QVariant StyleModel::data(const QModelIndex & index, int role) const
return style.style();
return QVariant();
}
+
+#ifndef __ANDROID__
+void CGUIHelper::updateMprisStationList(QString serializedJson, QString listType, int index)
+{
+ mpris->setStationArray(serializedJson, listType, index);
+}
+
+void CGUIHelper::setMprisFullScreenState(bool isFullscreen)
+{
+ mpris->setFullscreenState(isFullscreen);
+}
+#endif
diff --git a/src/welle-gui/gui_helper.h b/src/welle-gui/gui_helper.h
index 038f63e..935fbad 100644
--- a/src/welle-gui/gui_helper.h
+++ b/src/welle-gui/gui_helper.h
@@ -52,6 +52,10 @@
#include "dab-constants.h"
#include "radio_controller.h"
+#ifndef __ANDROID__
+ #include "mpris/mpris.h"
+#endif
+
#ifdef __ANDROID__
class FileActivityResultReceiver;
#endif
@@ -144,7 +148,7 @@ public:
Q_INVOKABLE void updateImpulseResponse();
Q_INVOKABLE void updateNullSymbol();
Q_INVOKABLE void updateConstellation();
- Q_INVOKABLE void saveMotImages();
+ Q_INVOKABLE void saveMotImages(QString folder);
Q_INVOKABLE void openAutoDevice();
Q_INVOKABLE void openNull();
@@ -172,6 +176,11 @@ public:
Q_INVOKABLE bool isThemableStyle(QString);
Q_INVOKABLE void saveQQStyle(int);
+#ifndef __ANDROID__
+ Q_INVOKABLE void updateMprisStationList(QString, QString, int);
+ Q_INVOKABLE void setMprisFullScreenState(bool isFullscreen);
+#endif
+
CMOTImageProvider* motImageProvider; // ToDo: Must be a getter
private:
@@ -200,6 +209,10 @@ private:
StyleModel *m_styleModel = nullptr;
bool settingsStyleInAvailableStyles = false;
+#ifndef __ANDROID__
+ Mpris *mpris;
+#endif
+
#ifndef QT_NO_SYSTEMTRAYICON
QAction *minimizeAction;
QAction *maximizeAction;
@@ -236,11 +249,16 @@ signals:
void newDeviceId(int deviceId);
void styleChanged(void);
void translationFinished(void);
+ void setFullScreen(bool isFullScreen);
#ifndef QT_NO_SYSTEMTRAYICON
void minimizeWindow(void);
void maximizeWindow(void);
void restoreWindow(void);
+#else
+ #ifndef QT_NO_DBUS
+ void restoreWindow(void);
+ #endif
#endif
};
diff --git a/src/welle-gui/i18n/de_DE.qm b/src/welle-gui/i18n/de_DE.qm
index 29f3911..5976380 100644
Binary files a/src/welle-gui/i18n/de_DE.qm and b/src/welle-gui/i18n/de_DE.qm differ
diff --git a/src/welle-gui/i18n/de_DE.ts b/src/welle-gui/i18n/de_DE.ts
index dc4db0f..e269efc 100644
--- a/src/welle-gui/i18n/de_DE.ts
+++ b/src/welle-gui/i18n/de_DE.ts
@@ -24,14 +24,6 @@
</context>
<context>
<name>CAndroid_RTL_SDR</name>
- <message>
- <source>Android RTL-SDR driver is not installed</source>
- <translation type="vanished">Android RTL-SDR Treiber ist nicht installiert</translation>
- </message>
- <message>
- <source>Would you like to install it? Start welle.io again after install.</source>
- <translation type="vanished">Soll er installiert werden? welle.io muss nach der Treiberinstallation neu gestartet werden.</translation>
- </message>
<message>
<location filename="../android_rtl_sdr.cpp" line="137"/>
<source>OK</source>
@@ -44,367 +36,79 @@
</message>
<message>
<location filename="../android_rtl_sdr.cpp" line="139"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
- <translation>Der Android RTL-SDR-Treiber ist nicht installiert. Möchten Sie ihn installieren? Danach bitte welle.io neu starten.</translation>
- </message>
-</context>
-<context>
- <name>CDABConstants</name>
- <message>
- <source>none</source>
- <translation type="vanished">nicht gesetzt</translation>
- </message>
- <message>
- <source>News</source>
- <translation type="vanished">Nachrichten</translation>
- </message>
- <message>
- <source>Current Affairs</source>
- <translation type="vanished">Aktuelle Nachrichten</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="vanished">Informationen</translation>
- </message>
- <message>
- <source>Sport</source>
- <translation type="vanished">Sport</translation>
- </message>
- <message>
- <source>Education</source>
- <translation type="vanished">Bildung</translation>
- </message>
- <message>
- <source>Drama</source>
- <translation type="vanished">Drama</translation>
- </message>
- <message>
- <source>Arts</source>
- <translation type="vanished">Kunst</translation>
- </message>
- <message>
- <source>Science</source>
- <translation type="vanished">Forschung</translation>
- </message>
- <message>
- <source>Talk</source>
- <translation type="vanished">Talk</translation>
- </message>
- <message>
- <source>Pop Music</source>
- <translation type="vanished">Pop</translation>
- </message>
- <message>
- <source>Rock Music</source>
- <translation type="vanished">Rock</translation>
- </message>
- <message>
- <source>Light classical</source>
- <translation type="vanished">Klassik</translation>
- </message>
- <message>
- <source>Classical Music</source>
- <translation type="vanished">Klassik</translation>
- </message>
- <message>
- <source>Weather</source>
- <translation type="vanished">Wetter</translation>
- </message>
- <message>
- <source>Finance</source>
- <translation type="vanished">Finanzen</translation>
- </message>
- <message>
- <source>Children's</source>
- <translation type="vanished">Kinder</translation>
- </message>
- <message>
- <source>Religion</source>
- <translation type="vanished">Religion</translation>
- </message>
- <message>
- <source>Travel</source>
- <translation type="vanished">Reise</translation>
- </message>
- <message>
- <source>Leisure</source>
- <translation type="vanished">Freizeit</translation>
- </message>
- <message>
- <source>Jazz and Blues</source>
- <translation type="vanished">Jazz und Blues</translation>
- </message>
- <message>
- <source>Country Music</source>
- <translation type="vanished">Country</translation>
- </message>
- <message>
- <source>Oldies Music</source>
- <translation type="vanished">Oldies</translation>
- </message>
- <message>
- <source>Unknown</source>
- <translation type="vanished">Unbekannt</translation>
- </message>
- <message>
- <source>Albanian</source>
- <translation type="vanished">Albanisch</translation>
- </message>
- <message>
- <source>Breton</source>
- <translation type="vanished">Bretonisch</translation>
- </message>
- <message>
- <source>Catalan</source>
- <translation type="vanished">Katalanisch</translation>
- </message>
- <message>
- <source>Croatian</source>
- <translation type="vanished">Kroatisch</translation>
- </message>
- <message>
- <source>Welsh</source>
- <translation type="vanished">Wallisisch</translation>
- </message>
- <message>
- <source>Czech</source>
- <translation type="vanished">Tschechisch</translation>
- </message>
- <message>
- <source>Danish</source>
- <translation type="vanished">Dänisch</translation>
- </message>
- <message>
- <source>German</source>
- <translation type="vanished">Deutsch</translation>
- </message>
- <message>
- <source>English</source>
- <translation type="vanished">Englisch</translation>
- </message>
- <message>
- <source>Spanish</source>
- <translation type="vanished">Spanisch</translation>
- </message>
- <message>
- <source>Esperanto</source>
- <translation type="vanished">Esperanto</translation>
- </message>
- <message>
- <source>Estonian</source>
- <translation type="vanished">Estnisch</translation>
- </message>
- <message>
- <source>Basque</source>
- <translation type="vanished">Baskisch</translation>
- </message>
- <message>
- <source>Faroese</source>
- <translation type="vanished">Färöisch</translation>
- </message>
- <message>
- <source>French</source>
- <translation type="vanished">Französisch</translation>
- </message>
- <message>
- <source>Frisian</source>
- <translation type="vanished">Friesisch</translation>
- </message>
- <message>
- <source>Irish</source>
- <translation type="vanished">Irisch</translation>
- </message>
- <message>
- <source>Gaelic</source>
- <translation type="vanished">Gälisch</translation>
- </message>
- <message>
- <source>Galician</source>
- <translation type="vanished">Galicisch</translation>
- </message>
- <message>
- <source>Icelandic</source>
- <translation type="vanished">Isländisch</translation>
- </message>
- <message>
- <source>Italian</source>
- <translation type="vanished">Italienisch</translation>
- </message>
- <message>
- <source>Lappish</source>
- <translation type="vanished">Lappisch</translation>
- </message>
- <message>
- <source>Latin</source>
- <translation type="vanished">Latein</translation>
- </message>
- <message>
- <source>Latvian</source>
- <translation type="vanished">Lettisch</translation>
- </message>
- <message>
- <source>Luxembourgian</source>
- <translation type="vanished">Luxemburgisch</translation>
- </message>
- <message>
- <source>Lithuanian</source>
- <translation type="vanished">Litauisch</translation>
- </message>
- <message>
- <source>Hungarian</source>
- <translation type="vanished">Ungarisch</translation>
- </message>
- <message>
- <source>Maltese</source>
- <translation type="vanished">Maltesisch</translation>
- </message>
- <message>
- <source>Dutch</source>
- <translation type="vanished">Niederländisch</translation>
- </message>
- <message>
- <source>Norwegian</source>
- <translation type="vanished">Norwegisch</translation>
- </message>
- <message>
- <source>Occitan</source>
- <translation type="vanished">Okzitanisch</translation>
- </message>
- <message>
- <source>Polish</source>
- <translation type="vanished">Polnisch</translation>
- </message>
- <message>
- <source>Portuguese</source>
- <translation type="vanished">Portugiesisch</translation>
- </message>
- <message>
- <source>Romanian</source>
- <translation type="vanished">Rumänisch</translation>
- </message>
- <message>
- <source>Romansh</source>
- <translation type="vanished">Rätoromanisch</translation>
- </message>
- <message>
- <source>Serbian</source>
- <translation type="vanished">Serbisch</translation>
- </message>
- <message>
- <source>Slovak</source>
- <translation type="vanished">Slowakisch</translation>
- </message>
- <message>
- <source>Slovene</source>
- <translation type="vanished">Slowenisch</translation>
- </message>
- <message>
- <source>Finnish</source>
- <translation type="vanished">Finnisch</translation>
- </message>
- <message>
- <source>Swedish</source>
- <translation type="vanished">Schwedisch</translation>
- </message>
- <message>
- <source>Turkish</source>
- <translation type="vanished">Türkisch</translation>
- </message>
- <message>
- <source>Flemish</source>
- <translation type="vanished">Flämisch</translation>
- </message>
- <message>
- <source>Walloon</source>
- <translation type="vanished">Wallonisch</translation>
- </message>
-</context>
-<context>
- <name>CGUI</name>
- <message>
- <source>Station list is empty</source>
- <translation type="vanished">Keine Sender vorhanden</translation>
- </message>
- <message>
- <source>version</source>
- <translation type="vanished">Version</translation>
- </message>
- <message>
- <source>Git revision</source>
- <translation type="vanished">Git Revision</translation>
- </message>
- <message>
- <source>Build on</source>
- <translation type="vanished">Übersetzt am</translation>
- </message>
- <message>
- <source>QT version</source>
- <translation type="vanished">QT Version</translation>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
+ <translation type="unfinished">Der Android RTL-SDR-Treiber ist nicht installiert. Möchten Sie ihn installieren? Danach bitte welle.io neu starten.</translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
- <location filename="../gui_helper.cpp" line="65"/>
- <location filename="../gui_helper.cpp" line="654"/>
+ <location filename="../gui_helper.cpp" line="66"/>
+ <location filename="../gui_helper.cpp" line="699"/>
<source>Mi&nimize</source>
<translation>Mi&nimieren</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="68"/>
- <location filename="../gui_helper.cpp" line="655"/>
+ <location filename="../gui_helper.cpp" line="69"/>
+ <location filename="../gui_helper.cpp" line="700"/>
<source>Ma&ximize</source>
<translation>Ma&ximieren</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="71"/>
- <location filename="../gui_helper.cpp" line="656"/>
+ <location filename="../gui_helper.cpp" line="72"/>
+ <location filename="../gui_helper.cpp" line="701"/>
<source>&Restore</source>
<translation>Wiede&rherstellen</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="74"/>
- <location filename="../gui_helper.cpp" line="657"/>
+ <location filename="../gui_helper.cpp" line="75"/>
+ <location filename="../gui_helper.cpp" line="702"/>
<source>&Quit</source>
<translation>Beenden (&Quit)</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="127"/>
- <source>version</source>
- <translation>Version</translation>
+ <location filename="../gui_helper.cpp" line="180"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="128"/>
- <source>Git revision</source>
- <translation>Git-Revision</translation>
+ <location filename="../gui_helper.cpp" line="184"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="129"/>
- <source>Build on</source>
- <translation>Übersetzt am</translation>
+ <location filename="../gui_helper.cpp" line="302"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation type="unfinished">Das Programm bleibt im Hintergrund aktiv. Um es gänzlich zu schließen, wählen Sie "%1" aus dem Kontextmenü des Icons in der Taskleiste.</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="130"/>
- <source>QT version</source>
- <translation>Qt-Version</translation>
+ <location filename="../gui_helper.cpp" line="307"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished">Beenden</translation>
+ </message>
+ <message>
+ <location filename="../gui_helper.cpp" line="181"/>
+ <source>Git revision</source>
+ <translation>Git-Revision</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="283"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation>Das Programm bleibt im Hintergrund aktiv. Um es gänzlich zu schließen, wählen Sie <b>Beenden</b> aus dem Kontextmenü des Icons in der Taskleiste.</translation>
+ <location filename="../gui_helper.cpp" line="185"/>
+ <source>QT version</source>
+ <translation>Qt-Version</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="776"/>
+ <location filename="../gui_helper.cpp" line="823"/>
<source> (unavailable, fallback to Default)</source>
<translation> (nicht verfügbar, Rücksetzen auf Standardeinstellung)</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="780"/>
+ <location filename="../gui_helper.cpp" line="827"/>
<source>Style of system</source>
<translation>Systemstil</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="782"/>
+ <location filename="../gui_helper.cpp" line="829"/>
<source> (Recommended)</source>
<translation> (empfohlen)</translation>
</message>
@@ -412,13 +116,13 @@
<context>
<name>CRadioController</name>
<message>
- <location filename="../radio_controller.cpp" line="608"/>
+ <location filename="../radio_controller.cpp" line="646"/>
<source>Unknown</source>
<translation>Unbekannt</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="406"/>
- <location filename="../radio_controller.cpp" line="627"/>
+ <location filename="../radio_controller.cpp" line="443"/>
+ <location filename="../radio_controller.cpp" line="665"/>
<source>No Station</source>
<translation>Kein Sender gewählt</translation>
</message>
@@ -428,40 +132,42 @@
<translation>Fehler beim Öffnen der Datei </translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="369"/>
+ <location filename="../radio_controller.cpp" line="255"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="276"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="405"/>
<source>RAW File</source>
<translation>RAW Datei</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="382"/>
- <location filename="../radio_controller.cpp" line="848"/>
+ <location filename="../radio_controller.cpp" line="419"/>
+ <location filename="../radio_controller.cpp" line="904"/>
<source>Scanning</source>
<translation>Scanne</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="386"/>
- <location filename="../radio_controller.cpp" line="873"/>
+ <location filename="../radio_controller.cpp" line="423"/>
+ <location filename="../radio_controller.cpp" line="929"/>
<source>Found channels</source>
<translation>Gefundene Sender</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="602"/>
+ <location filename="../radio_controller.cpp" line="640"/>
<source>Playing last station</source>
<translation>Gebe zuletzt gehörten Sender wieder</translation>
</message>
<message>
- <source>Lost signal or bad signal quality, trying to find it again.</source>
- <translation type="vanished">Kein oder schlechter Empfang. Suche Sender neu.</translation>
- </message>
- <message>
- <location filename="../radio_controller.cpp" line="660"/>
+ <location filename="../radio_controller.cpp" line="715"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Gerät meldet einen Fehler oder existiert nicht.</translation>
</message>
- <message>
- <source>Tuning</source>
- <translation type="vanished">Suche</translation>
- </message>
<message>
<location filename="../../input/airspy_sdr.cpp" line="152"/>
<source>airspy is unplugged.</source>
@@ -500,28 +206,33 @@
<translation>Unbekanntes RAW-Dateiformat</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="294"/>
- <location filename="../../input/rtl_tcp.cpp" line="462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translation type="unfinished">ADC überlastet. Evtl. Verstärkung zu stark.</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="390"/>
+ <location filename="../../input/rtl_sdr.cpp" line="402"/>
<source>RTL-SDR is unplugged.</source>
<translation>RTL-SDR wurde entfernt.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="272"/>
+ <location filename="../../input/rtl_tcp.cpp" line="309"/>
<source>RTL-TCP connection closed.</source>
<translation>RTL-TCP-Verbindung wurde geschlossen.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="413"/>
+ <location filename="../../input/rtl_tcp.cpp" line="450"/>
<source>Connection failed to server </source>
<translation>Verbindungsfehler zu Server </translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation type="unfinished"></translation>
</message>
@@ -533,42 +244,6 @@
<source></source>
<translation></translation>
</message>
- <message>
- <source>Found channels</source>
- <translation type="obsolete">Gefundene Sender</translation>
- </message>
- <message>
- <source>Automatic RF gain</source>
- <translation type="obsolete">Auto HF-Verstärkung</translation>
- </message>
- <message>
- <source>Manual gain</source>
- <translation type="obsolete">Manuelle Verstärkung</translation>
- </message>
- <message>
- <source>Value: </source>
- <translation type="obsolete">Aktuell: </translation>
- </message>
- <message>
- <source>Select channel manually</source>
- <translation type="obsolete">Manuelle Kanalwahl</translation>
- </message>
- <message>
- <source>Clear station list</source>
- <translation type="obsolete">Lösche Senderliste</translation>
- </message>
- <message>
- <source>Full screen mode</source>
- <translation type="obsolete">Vollbildmodus</translation>
- </message>
- <message>
- <source>Expert mode</source>
- <translation type="obsolete">Expertenmodus</translation>
- </message>
- <message>
- <source>Exit welle.io</source>
- <translation type="obsolete">welle.io beenden</translation>
- </message>
</context>
<context>
<name>ChannelSettings</name>
@@ -578,7 +253,7 @@
<translation type="unfinished">Zuletzt gehörten Sender wiedergeben</translation>
</message>
<message>
- <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
<source>Display station name in the window title</source>
<translation type="unfinished">Zeige Stationsnamen im Titelfenster</translation>
</message>
@@ -1303,206 +978,157 @@
<translation type="unfinished">Grobe Korrektur aktivieren (für Geräte mit >1kHz Fehler)</translation>
</message>
<message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="65"/>
- <source>GetMiddle</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="65"/>
- <source>CorrelatePRS</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="65"/>
- <source>PatternOfZeros</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="75"/>
- <source>Coarse corrector algorithm</source>
- <translation type="unfinished">Algorithmus für Grobe Korrektur</translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="83"/>
- <source>Enable TII decoding to console log (increases CPU usage)</source>
- <translation type="unfinished">TII-Dekoder-Log auf der Konsole aktivieren (erhöht die CPU-Last)</translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="97"/>
- <source>Strongest Peak</source>
- <translation type="unfinished">Größter Spitzenwert</translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="97"/>
- <source>Earliest Peak With Binning</source>
- <translation type="unfinished">Frühester Spitzenwert mit Binning</translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="97"/>
- <source>Threshold Before Peak</source>
- <translation type="unfinished">Schwelle vor dem Spitzenwert</translation>
- </message>
- <message>
- <location filename="../QML/settingpages/ExpertSettings.qml" line="107"/>
- <source>FFT Window placement algorithm</source>
- <translation type="unfinished">Algorithmus für FFT Fensterposition</translation>
- </message>
-</context>
-<context>
- <name>ExpertView</name>
- <message>
- <source>Device</source>
- <translation type="vanished">Radioempfänger</translation>
- </message>
- <message>
- <source>Current channel</source>
- <translation type="vanished">Aktueller Kanal</translation>
- </message>
- <message>
- <source>Frequency correction</source>
- <translation type="vanished">Frequenzkorrektur</translation>
- </message>
- <message>
- <source>SNR</source>
- <translation type="vanished">SNR</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="67"/>
+ <source>GetMiddle</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Frame errors</source>
- <translation type="vanished">Framefehler</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="68"/>
+ <source>CorrelatePRS</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>RS errors</source>
- <translation type="vanished">RS Fehler</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="69"/>
+ <source>PatternOfZeros</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>AAC errors</source>
- <translation type="vanished">AAC Framefehler</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="81"/>
+ <source>Coarse corrector algorithm</source>
+ <translation type="unfinished">Algorithmus für Grobe Korrektur</translation>
</message>
<message>
- <source>Frame synchronization</source>
- <translation type="vanished">Synchronisation</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="89"/>
+ <source>Enable TII decoding to console log (increases CPU usage)</source>
+ <translation type="unfinished">TII-Dekoder-Log auf der Konsole aktivieren (erhöht die CPU-Last)</translation>
</message>
<message>
- <source>FIC CRC</source>
- <translation type="vanished">FIC CRC</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="105"/>
+ <source>Strongest Peak</source>
+ <translation type="unfinished">Größter Spitzenwert</translation>
</message>
<message>
- <source>OK</source>
- <translation type="vanished">OK</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="106"/>
+ <source>Earliest Peak With Binning</source>
+ <translation type="unfinished">Frühester Spitzenwert mit Binning</translation>
</message>
<message>
- <source>Not synced</source>
- <translation type="vanished">Nicht synchron</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="107"/>
+ <source>Threshold Before Peak</source>
+ <translation type="unfinished">Schwelle vor dem Spitzenwert</translation>
</message>
<message>
- <source>Error</source>
- <translation type="vanished">Fehler</translation>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="119"/>
+ <source>FFT Window placement algorithm</source>
+ <translation type="unfinished">Algorithmus für FFT Fensterposition</translation>
</message>
</context>
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
<source>Global settings</source>
<translation type="unfinished">Allgemeine Einstellungen</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
<source>Full screen mode</source>
<translation>Vollbildmodus</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
<source>Language</source>
<translation>Sprache</translation>
</message>
<message>
- <source>Qt Quick Style. Restart to apply.</source>
- <translation type="obsolete">Stil von Qt Quick. Neustarten zum Übernehmen.</translation>
- </message>
- <message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
<source>Global receiver settings</source>
<translation>Allgemeine Geräteeinstellungen</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
<source>Automatic RF gain</source>
<translation>Automatische HF-Verstärkung</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
<source>Manual gain</source>
<translation>Manuelle Verstärkung</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
<source>Value: </source>
<translation type="unfinished">Wert: </translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
<source>Auto detect</source>
<translation type="unfinished">Automatische Erkennung</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="211"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
<source>Style settings</source>
<translation type="unfinished">Stileinstellungen</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="223"/>
- <source>Style changed. Please restart welle.io</source>
- <translation type="unfinished">Stil geändert. Bitte welle.io neu starten</translation>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <source>Style changed. Please restart welle.io.</source>
+ <translation type="unfinished">Stil geändert. Bitte welle.io neu starten.</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="228"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
<source>Style. Restart to apply.</source>
<translation type="unfinished">Stil. Neustarten zum Übernehmen.</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="241"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
<source>Light</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="243"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
<source>Theme</source>
<translation type="unfinished">Thema</translation>
</message>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
<source>None</source>
- <translation type="obsolete">Kein</translation>
+ <translation type="unfinished">Kein</translation>
</message>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
<source>Airspy</source>
- <translation type="obsolete">Airspy</translation>
+ <translation type="unfinished">Airspy</translation>
</message>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
<source>rtl-sdr</source>
- <translation type="obsolete">rtl-sdr</translation>
+ <translation type="unfinished">rtl-sdr</translation>
</message>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
<source>SoapySDR</source>
- <translation type="obsolete">SoapySDR</translation>
+ <translation type="unfinished">SoapySDR</translation>
</message>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
<source>rtl-tcp</source>
- <translation type="obsolete">rtl-tcp</translation>
+ <translation type="unfinished">rtl-tcp</translation>
</message>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
<source>RAW file</source>
- <translation type="obsolete">RAW Datei</translation>
+ <translation type="unfinished">RAW Datei</translation>
</message>
</context>
<context>
@@ -1514,119 +1140,229 @@
</message>
<message>
<location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
- <source>Amplitude</source>
- <translation type="unfinished">Amplitude</translation>
- </message>
- <message>
- <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
<source>Samples</source>
<translation type="unfinished">Abtastwerte</translation>
</message>
</context>
+<context>
+ <name>InfoPage</name>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="26"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="31"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="36"/>
+ <source>Licenses</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="172"/>
+ <location filename="../QML/MainView.qml" line="138"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="139"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Stop</source>
+ <translation type="unfinished">Stopp</translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="284"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="289"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="290"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="421"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="462"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="463"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="474"/>
<source>Settings</source>
<translation>Einstellungen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="180"/>
+ <location filename="../QML/MainView.qml" line="482"/>
<source>Expert Settings</source>
<translation>Experteneinstellungen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="188"/>
+ <location filename="../QML/MainView.qml" line="490"/>
<source>About</source>
<translation>Über</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="196"/>
+ <location filename="../QML/MainView.qml" line="498"/>
<source>Exit</source>
<translation>Beenden</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="234"/>
+ <location filename="../QML/MainView.qml" line="534"/>
<source>All stations</source>
<translation type="unfinished">Alle Sender</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="234"/>
+ <location filename="../QML/MainView.qml" line="535"/>
<source>Favorites</source>
<translation>Favoriten</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="263"/>
+ <location filename="../QML/MainView.qml" line="566"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="567"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="575"/>
<source>Start station scan</source>
<translation>Suchlauf starten</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="275"/>
+ <location filename="../QML/MainView.qml" line="587"/>
<source>Stop station scan</source>
<translation>Suchlauf stoppen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="287"/>
+ <location filename="../QML/MainView.qml" line="599"/>
<source>Clear station list</source>
<translation type="unfinished">Lösche Senderliste</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="295"/>
+ <location filename="../QML/MainView.qml" line="607"/>
<source>Station settings</source>
<translation type="unfinished">Sendereinstellungen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="308"/>
+ <location filename="../QML/MainView.qml" line="620"/>
<source>No stations in list</source>
<translation type="unfinished">Kein Sender in der Liste</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="345"/>
+ <location filename="../QML/MainView.qml" line="634"/>
+ <source>File</source>
+ <translation type="unfinished">Datei</translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="764"/>
<source>Manual channel</source>
<translation type="unfinished">Manueller Kanal</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="400"/>
+ <location filename="../QML/MainView.qml" line="816"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="817"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="825"/>
<source>Service Overview</source>
<translation type="unfinished">Senderübersicht</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="406"/>
+ <location filename="../QML/MainView.qml" line="831"/>
<source>Service Details</source>
<translation type="unfinished">Senderdetails</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="412"/>
+ <location filename="../QML/MainView.qml" line="837"/>
<source>MOT Slide Show</source>
<translation type="unfinished">MOT Slideshow</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="418"/>
+ <location filename="../QML/MainView.qml" line="843"/>
<source>Spectrum</source>
<translation>Spektrum</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="424"/>
+ <location filename="../QML/MainView.qml" line="849"/>
<source>Impulse Response</source>
<translation type="unfinished">Impulsantwort</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="430"/>
+ <location filename="../QML/MainView.qml" line="855"/>
<source>Constellation Diagram</source>
<translation>Konstellationsdiagramm</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="436"/>
+ <location filename="../QML/MainView.qml" line="861"/>
<source>Null Symbol</source>
<translation>Nullsymbol</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="442"/>
+ <location filename="../QML/MainView.qml" line="867"/>
<source>Console Output</source>
<translation>Konsolenausgabe</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="448"/>
+ <location filename="../QML/MainView.qml" line="873"/>
<source>RAW Recorder</source>
<translation type="unfinished">RAW-Aufzeichnung</translation>
</message>
@@ -1634,20 +1370,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="10"/>
+ <location filename="../QML/MotView.qml" line="11"/>
<source>MOT Slide Show</source>
<translation type="unfinished">MOT Slideshow</translation>
</message>
<message>
- <location filename="../QML/MotView.qml" line="27"/>
+ <location filename="../QML/MotView.qml" line="29"/>
<source>Save all images</source>
<translation type="unfinished">Alle Bilder speichern</translation>
</message>
- <message>
- <location filename="../QML/MotView.qml" line="47"/>
- <source>Latest</source>
- <translation type="unfinished">Letztes</translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1656,54 +1387,6 @@
<source>Null Symbol</source>
<translation type="unfinished">Nullsymbol</translation>
</message>
- <message>
- <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
- <message>
- <source>Frequency</source>
- <translation type="obsolete">Frequenz</translation>
- </message>
-</context>
-<context>
- <name>QObject</name>
- <message>
- <source>No valid device found, using Null device instead.</source>
- <translation type="vanished">Kein Radioempfänger gefunden.</translation>
- </message>
- <message>
- <source>Error while opening device</source>
- <translation type="vanished">Fehler beim Zugriff auf Empfänger</translation>
- </message>
- <message>
- <source>Unknown RAW file format</source>
- <translation type="vanished">Unbekanntes RAW-Dateiformat</translation>
- </message>
- <message>
- <source>Cannot open file</source>
- <translation type="vanished">Fehler beim Öffnen der Datei</translation>
- </message>
- <message>
- <source>End of file, restarting</source>
- <translation type="vanished">RAW-Datei zu Ende, beginne von vorn</translation>
- </message>
- <message>
- <source>AGC overload. Maybe you are using a to high gain.</source>
- <translation type="obsolete">HF-Eingangsverstärkung ist zu groß (AGC ist übersteuert).</translation>
- </message>
- <message>
- <source>RTL-SDR is unplugged.</source>
- <translation type="vanished">RTL-SDR wurde entfernt.</translation>
- </message>
- <message>
- <source>RTL-TCP connection closed.</source>
- <translation type="vanished">RTL-TCP-Versbindung geschlossen.</translation>
- </message>
- <message>
- <source>Connection failed to server </source>
- <translation type="vanished">Verbindungsfehler zu Server </translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1714,7 +1397,7 @@
</message>
<message>
<location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
- <source>Enable bias tee (not from all dongles supported)</source>
+ <source>Enable bias tee (not supported by all dongles)</source>
<translation type="unfinished">Fernspeisung aktivieren (nicht von allen Geräten unterstützt)</translation>
</message>
</context>
@@ -1750,10 +1433,6 @@
<source>Host name</source>
<translation type="unfinished">Hostname</translation>
</message>
- <message>
- <source>Apply</source>
- <translation type="obsolete">Übernehmen</translation>
- </message>
</context>
<context>
<name>RadioView</name>
@@ -1771,24 +1450,20 @@
<translation type="unfinished">Einstellungen für Rohdaten</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
<source>Open RAW file</source>
<translation>Öffne Rohdatendatei</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
<source>Currently shown under Android</source>
<translation type="unfinished">Derzeit unter Android angezeigt</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
<source>Selected file:</source>
<translation>Ausgewählte Datei:</translation>
</message>
- <message>
- <source>Apply</source>
- <translation type="vanished">Übernehmen</translation>
- </message>
</context>
<context>
<name>RawRecorder</name>
@@ -1836,115 +1511,71 @@
<translation type="unfinished">Aktueller Kanal</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
<source>Frame sync</source>
<translation type="unfinished">Framesynchron</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
<source>FIC CRC</source>
<translation type="unfinished">FIC CRC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
<source>Frame errors</source>
<translation type="unfinished">Framefehler</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
<source>OK</source>
<translation type="unfinished">OK</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
<source>Not synced</source>
<translation type="unfinished">Nicht synchron</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
<source>Error</source>
<translation type="unfinished">Fehler</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
<source>Frequency correction</source>
<translation type="unfinished">Frequenzkorrektur</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
<source>SNR</source>
<translation type="unfinished">SNR</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
<source>RS errors</source>
<translation type="unfinished">RS Fehler</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
- <source>AAC errors</source>
- <translation type="unfinished">AAC Fehler</translation>
- </message>
- <message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
- <source>DAB date and time</source>
- <translation type="unfinished">DAB Datum/Uhrzeit</translation>
- </message>
-</context>
-<context>
- <name>SettingsPage</name>
- <message>
- <source>Channel scan</source>
- <translation type="vanished">Sendersuchlauf</translation>
- </message>
- <message>
- <source>Start</source>
- <translation type="vanished">Start</translation>
- </message>
- <message>
- <source>Stop</source>
- <translation type="vanished">Stopp</translation>
- </message>
- <message>
- <source>Found channels</source>
- <translation type="vanished">Gefundene Sender</translation>
- </message>
- <message>
- <source>Found stations</source>
- <translation type="vanished">Gefundene Programme</translation>
- </message>
- <message>
- <source>Automatic RF gain</source>
- <translation type="vanished">Auto HF-Verstärkung</translation>
- </message>
- <message>
- <source>Manual gain</source>
- <translation type="vanished">Manuelle Verstärkung</translation>
- </message>
- <message>
- <source>Value: </source>
- <translation type="vanished">Aktuell: </translation>
- </message>
- <message>
- <source>Full screen mode</source>
- <translation type="vanished">Vollbildmodus</translation>
- </message>
- <message>
- <source>Expert mode</source>
- <translation type="vanished">Expertenmodus</translation>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Select channel manually</source>
- <translation type="vanished">Manuelle Kanalwahl</translation>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Clear station list</source>
- <translation type="vanished">Lösche Senderliste</translation>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
+ <source>AAC errors</source>
+ <translation type="unfinished">AAC Fehler</translation>
</message>
<message>
- <source>Exit welle.io</source>
- <translation type="vanished">welle.io beenden</translation>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
+ <source>DAB date and time</source>
+ <translation type="unfinished">DAB Datum/Uhrzeit</translation>
</message>
</context>
<context>
@@ -1997,29 +1628,27 @@
<source>Spectrum</source>
<translation>Spektrum</translation>
</message>
- <message>
- <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
- <message>
- <source>Frequency</source>
- <translation type="obsolete">Frequenz</translation>
- </message>
</context>
<context>
- <name>SpectrumView</name>
+ <name>StationDelegate</name>
<message>
- <source>Spectrum</source>
- <translation type="vanished">Spektrum</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>Amplitude</source>
- <translation type="vanished">Amplitude</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>StationListModel</name>
<message>
- <source>Frequency</source>
- <translation type="vanished">Frequenz</translation>
+ <location filename="../QML/components/StationListModel.qml" line="96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -2036,30 +1665,39 @@
</message>
</context>
<context>
- <name>TouchSwitch</name>
+ <name>ViewBaseFrame</name>
<message>
- <source>ON</source>
- <translation type="vanished">AN</translation>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <source>OFF</source>
- <translation type="vanished">AUS</translation>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
</message>
-</context>
-<context>
- <name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Minimize</source>
<translation type="unfinished">Minimieren</translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Maximize</source>
<translation type="unfinished">Maximieren</translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
<source>Remove</source>
<translation>Entfernen</translation>
</message>
@@ -2094,111 +1732,34 @@
<source>experimental</source>
<translation>experimentell</translation>
</message>
- <message>
- <location filename="../QML/components/WSpectrum.qml" line="101"/>
- <source>Sensitivity</source>
- <translation>Empfindlichkeit</translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <source>Set the GUI language (e.g. de-DE)</source>
- <translation type="vanished">GUI Sprache festlegen</translation>
- </message>
- <message>
- <location filename="../main.cpp" line="100"/>
+ <location filename="../main.cpp" line="111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation type="unfinished">Speichert DAB Frames (*.mp2) oder DAB+ Superframes mit RS Kodierung (*.dab). Diese Datei kann zur Analyse der X-PAD-Daten in XPADxpert verwendet werden</translation>
</message>
<message>
- <location filename="../main.cpp" line="101"/>
- <location filename="../main.cpp" line="106"/>
+ <location filename="../main.cpp" line="112"/>
+ <location filename="../main.cpp" line="117"/>
<source>File name</source>
<translation>Dateiname</translation>
</message>
<message>
- <location filename="../main.cpp" line="105"/>
+ <location filename="../main.cpp" line="116"/>
<source>Redirects all log output texts to a file.</source>
<translation type="unfinished">Leitet alle Log-Meldungen in eine Datei um.</translation>
</message>
<message>
- <location filename="../main.cpp" line="110"/>
+ <location filename="../main.cpp" line="121"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation type="unfinished">Qt Quick Controls Vorlage für den ersten Start</translation>
</message>
<message>
- <location filename="../main.cpp" line="111"/>
- <source>style_name</source>
+ <location filename="../main.cpp" line="122"/>
+ <source>Style name</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Sets the GUI language according to the ISO country codes (e.g. de_DE)</source>
- <translation type="vanished">GUI-Sprache gemäß ISO Ländercode setzen (zB de_DE)</translation>
- </message>
- <message>
- <source>Language</source>
- <translation type="vanished">Sprache</translation>
- </message>
- <message>
- <source>Input device</source>
- <translation type="vanished">Radioempfänger</translation>
- </message>
- <message>
- <source>Input device. Possible is: auto (default), airspy, rtl_tcp, rtl_sdr, rawfile, soapysdr</source>
- <translation type="vanished">Radioempfänger. Möglich ist auto (Standard), airspy, rtl_tcp, rtl_sdr, rawfile, soapysdr</translation>
- </message>
- <message>
- <source>Name</source>
- <translation type="vanished">Name</translation>
- </message>
- <message>
- <source>DAB mode. Possible is: 1, 2 or 4, default: 1</source>
- <translation type="vanished">DAB Mode. Möglich ist 1, 2 oder 4, Standard: 1</translation>
- </message>
- <message>
- <source>Mode</source>
- <translation type="vanished">Modus</translation>
- </message>
- <message>
- <source>rtl_tcp server IP address. Only valid for input rtl_tcp.</source>
- <translation type="vanished">rtl_tcp server IP Adresse. Nur gültig für Empfänger rtl_tcp.</translation>
- </message>
- <message>
- <source>IP address</source>
- <translation type="vanished">IP-Adresse</translation>
- </message>
- <message>
- <source>rtl_tcp server IP port. Only valid for input rtl_tcp.</source>
- <translation type="vanished">IP Port. Nur gültig für Empfänger rtl_tcp.</translation>
- </message>
- <message>
- <source>Port</source>
- <translation type="vanished">Port</translation>
- </message>
- <message>
- <source>I/Q RAW file. Only valid for input rawfile.</source>
- <translation type="vanished">I/Q RAW Datei als Radioempfänger. Nur gültig für Empfänger rawfile.</translation>
- </message>
- <message>
- <source>I/Q RAW file</source>
- <translation type="vanished">I/Q RAW Rohdatei</translation>
- </message>
- <message>
- <source>I/Q RAW file format. Possible is: u8 (standard), s8, s16le, s16be. Only valid for input rawfile.</source>
- <translation type="vanished">I/Q RAW Rohdateiformat. Möglich ist u8 (Standard), s8, s16le, s16be. Nur gültig für Radioempfänger rawfile.</translation>
- </message>
- <message>
- <source>I/Q RAW file format</source>
- <translation type="vanished">I/Q RAW Rohdatenformat</translation>
- </message>
- <message>
- <source>Expert mode is enabled</source>
- <translation type="vanished">Expertenmodus eingeschaltet</translation>
- </message>
- <message>
- <source>Expert mode is disabled</source>
- <translation type="vanished">Expertenmodus ausgeschaltet</translation>
- </message>
</context>
</TS>
diff --git a/src/welle-gui/i18n/fr_FR.qm b/src/welle-gui/i18n/fr_FR.qm
index 09bfb21..c16ef1b 100755
Binary files a/src/welle-gui/i18n/fr_FR.qm and b/src/welle-gui/i18n/fr_FR.qm differ
diff --git a/src/welle-gui/i18n/fr_FR.ts b/src/welle-gui/i18n/fr_FR.ts
index e1ea01b..2104f2e 100644
--- a/src/welle-gui/i18n/fr_FR.ts
+++ b/src/welle-gui/i18n/fr_FR.ts
@@ -36,7 +36,7 @@
</message>
<message>
<location line="+1"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
<translation>Le pilote RTL-SDR Android n'est pas installé. Voulez-vous l'installer ? Redémarrez welle.io après l'installation.</translation>
</message>
</context>
@@ -44,67 +44,61 @@
<name>CGUIHelper</name>
<message>
<location filename="../gui_helper.cpp" line="+66"/>
- <location line="+614"/>
+ <location line="+633"/>
<source>Mi&nimize</source>
<translation>Mi&nimiser</translation>
</message>
<message>
- <location line="-611"/>
- <location line="+612"/>
+ <location line="-630"/>
+ <location line="+631"/>
<source>Ma&ximize</source>
<translation>Ma&ximiser</translation>
</message>
<message>
- <location line="-609"/>
- <location line="+610"/>
+ <location line="-628"/>
+ <location line="+629"/>
<source>&Restore</source>
<translation>&Restaurer</translation>
</message>
<message>
- <location line="-607"/>
- <location line="+608"/>
+ <location line="-626"/>
+ <location line="+627"/>
<source>&Quit</source>
<translation>&Quitter</translation>
</message>
<message>
- <location line="-504"/>
+ <location line="-522"/>
<source>welle.io version</source>
<translation>Version de welle.io</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+4"/>
<source>Built on</source>
<translation>Compilé le</translation>
</message>
<message>
- <source>version</source>
- <translation type="vanished">version</translation>
+ <location line="+118"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation>Le programme continue de tourner dans la boite à miniatures. Pour le terminer, choisir "%1" dans le menu contextuel de la boîte à miniatures.</translation>
</message>
<message>
- <location line="-1"/>
- <source>Git revision</source>
- <translation>Révision Git</translation>
+ <location line="+5"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation>Quitter</translation>
</message>
<message>
- <source>Build on</source>
- <translation type="vanished">Compilé le</translation>
+ <location line="-126"/>
+ <source>Git revision</source>
+ <translation>Révision Git</translation>
</message>
<message>
- <location line="+2"/>
+ <location line="+4"/>
<source>QT version</source>
<translation>Version QT</translation>
</message>
<message>
- <source>The program will keep running in the system tray. To terminate the program, choose "Quit" in the context menu of the system tray entry.</source>
- <translation type="obsolete">Le programme continue de tourner dans la boite à miniatures. Pour le terminer, choisir "Quitter" dans le menu contextuel de la boîte à miniatures.</translation>
- </message>
- <message>
- <location line="+116"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation>Le programme continue de tourner dans la boite à miniatures. Pour le terminer, choisir "Quitter" dans le menu contextuel de la boîte à miniatures.</translation>
- </message>
- <message>
- <location line="+506"/>
+ <location line="+638"/>
<source> (unavailable, fallback to Default)</source>
<translation> (non disponible, utilise "Default" à la place)</translation>
</message>
@@ -122,46 +116,56 @@
<context>
<name>CRadioController</name>
<message>
- <location filename="../radio_controller.cpp" line="+619"/>
+ <location filename="../radio_controller.cpp" line="+646"/>
<source>Unknown</source>
<translation>Inconnu</translation>
</message>
<message>
- <location line="-202"/>
- <location line="+221"/>
+ <location line="-203"/>
+ <location line="+222"/>
<source>No Station</source>
<translation>Pas de station</translation>
</message>
<message>
- <location line="-486"/>
+ <location line="-513"/>
<source>Error while opening file </source>
<translation>Erreur à l'ouverture du fichier </translation>
</message>
<message>
- <location line="+228"/>
+ <location line="+103"/>
+ <source>Playback failed</source>
+ <translation>Lecture en échec</translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Stopped</source>
+ <translation>Arrêté</translation>
+ </message>
+ <message>
+ <location line="+129"/>
<source>RAW File</source>
<translation>Fichier RAW</translation>
</message>
<message>
- <location line="+13"/>
- <location line="+466"/>
+ <location line="+14"/>
+ <location line="+485"/>
<source>Scanning</source>
<translation>Recherche</translation>
</message>
<message>
- <location line="-462"/>
- <location line="+487"/>
+ <location line="-481"/>
+ <location line="+506"/>
<source>Found channels</source>
<translatorcomment>Contexte: nombre stations trouvées durant la recherche de stations en scannant tous les canaux. Donc c'est bien "station" qu'il faut mettre, et pas "canal"</translatorcomment>
<translation>Stations trouvées</translation>
</message>
<message>
- <location line="-271"/>
+ <location line="-289"/>
<source>Playing last station</source>
<translation>Lecture de la dernière station</translation>
</message>
<message>
- <location line="+58"/>
+ <location line="+75"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Le récepteur radio n'est pas prêt ou n'existe pas.</translation>
</message>
@@ -191,7 +195,7 @@
<message>
<location line="+113"/>
<source>End of file, restarting</source>
- <translatorcomment>doute sur la traduction de "lecture en boucle"</translatorcomment>
+ <translatorcomment>doute sur la traduction précédente de "lecture en boucle"</translatorcomment>
<translation type="unfinished">Fin du fichier, recommence depuis le début</translation>
</message>
<message>
@@ -205,10 +209,15 @@
<translation>Format de fichier RAW inconnu</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="+294"/>
- <location filename="../../input/rtl_tcp.cpp" line="+462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="+142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished">Erreur à l'ouverture de RTL-SDR. Voir le journal pour les détails.</translation>
+ </message>
+ <message>
+ <location line="+164"/>
+ <location filename="../../input/rtl_tcp.cpp" line="+549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
- <translatorcomment>ADC ou AGC ? Saturation ou Surcharge ? Saturation semble préférable.</translatorcomment>
+ <translatorcomment>Saturation ou Surcharge ? Saturation semble préférable.</translatorcomment>
<translation type="unfinished">Saturation ADC. Peut-être le gain est trop élevé.</translation>
</message>
<message>
@@ -217,7 +226,7 @@
<translation>RTL-SDR est débranché.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="-190"/>
+ <location filename="../../input/rtl_tcp.cpp" line="-240"/>
<source>RTL-TCP connection closed.</source>
<translation>Connexion RTL-TCP fermée.</translation>
</message>
@@ -227,7 +236,7 @@
<translation>Echec de connexion au serveur </translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="+91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="+109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation>Chargement de SoapySDR impossible avec les paramètres de périphérique renseignés.</translation>
</message>
@@ -1053,7 +1062,7 @@
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="+68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="+71"/>
<source>Global settings</source>
<translation>Paramètres globaux</translation>
</message>
@@ -1063,12 +1072,17 @@
<translation>Mode plein écran</translation>
</message>
<message>
- <location line="+31"/>
+ <location line="+33"/>
<source>Language</source>
<translation>Langue</translation>
</message>
<message>
- <location line="+148"/>
+ <location line="+134"/>
+ <source>Style changed. Please restart welle.io.</source>
+ <translation>Style changé. Veuillez redémarrer welle.io.</translation>
+ </message>
+ <message>
+ <location line="+18"/>
<source>Light</source>
<translation>Clair</translation>
</message>
@@ -1088,7 +1102,7 @@
<translation>Thème</translation>
</message>
<message>
- <location line="-147"/>
+ <location line="-151"/>
<source>Global receiver settings</source>
<translation>Paramètres globaux du récepteur</translation>
</message>
@@ -1113,7 +1127,7 @@
<translation>Détection automatique</translation>
</message>
<message>
- <location line="+14"/>
+ <location line="+18"/>
<source>Airspy</source>
<translation></translation>
</message>
@@ -1128,15 +1142,22 @@
<translation>Paramètres de style</translation>
</message>
<message>
- <location line="+12"/>
- <source>Style changed. Please restart welle.io</source>
- <translation>Style changé. Veuillez redémarrer welle.io</translation>
- </message>
- <message>
- <location line="+5"/>
+ <location line="+17"/>
<source>Style. Restart to apply.</source>
<translation>Style. Redémarrez pour appliquer.</translation>
</message>
+ <message>
+ <source>Font settings</source>
+ <translation type="obsolete">Paramètres de police</translation>
+ </message>
+ <message>
+ <source>General font: use system font</source>
+ <translation type="obsolete">Police générale : utiliser la police du système</translation>
+ </message>
+ <message>
+ <source>Fixed space font: use system font</source>
+ <translation type="obsolete">Police à chasse fixe : utiliser la police du système</translation>
+ </message>
<message>
<location line="-60"/>
<source>None</source>
@@ -1169,11 +1190,6 @@
</message>
<message>
<location line="+11"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
- <message>
- <location line="+1"/>
<source>Samples</source>
<translation>Echantillon</translation>
</message>
@@ -1204,7 +1220,74 @@
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="+172"/>
+ <location filename="../QML/MainView.qml" line="+138"/>
+ <source>Stations list</source>
+ <translation>Liste des stations</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Display or hide stations list</source>
+ <translation>Afficher ou cacher la liste des stations</translation>
+ </message>
+ <message>
+ <location line="+42"/>
+ <location line="+5"/>
+ <source>Stop</source>
+ <translation>Stop</translation>
+ </message>
+ <message>
+ <location line="-5"/>
+ <location line="+5"/>
+ <source>Play</source>
+ <translation>Lecture</translation>
+ </message>
+ <message>
+ <location line="-4"/>
+ <source>Stop playback</source>
+ <translation>Arrêter la lecture</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Stop scan</source>
+ <translation>Arrêter la recherche</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Start playback</source>
+ <translation>Démarrer la lecture</translation>
+ </message>
+ <message>
+ <location line="+102"/>
+ <source>Volume (%1)</source>
+ <translation>Volume (%1)</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Volume</source>
+ <translation>Volume</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Toggle volume slider</source>
+ <translation>Afficher/cacher le curseur du volume</translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>Volume set to %1</source>
+ <translation>Volume fixé à %1</translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Main menu</source>
+ <translation>Menu principal</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show the main menu</source>
+ <translation>Afficher le menu principal</translation>
+ </message>
+ <message>
+ <location line="+11"/>
<source>Settings</source>
<translation>Paramètres</translation>
</message>
@@ -1234,7 +1317,17 @@
<translation>Favoris</translation>
</message>
<message>
- <location line="+34"/>
+ <location line="+31"/>
+ <source>Stations menu</source>
+ <translation>Menu des stations</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show stations menu</source>
+ <translation>Afficher le menu des stations</translation>
+ </message>
+ <message>
+ <location line="+8"/>
<source>Start station scan</source>
<translation>Rechercher les stations</translation>
</message>
@@ -1259,12 +1352,27 @@
<translation>Pas de stations dans la liste</translation>
</message>
<message>
- <location line="+108"/>
+ <location line="+14"/>
+ <source>File</source>
+ <translation>Fichier</translation>
+ </message>
+ <message>
+ <location line="+130"/>
<source>Manual channel</source>
<translation>Canal manuel</translation>
</message>
<message>
- <location line="+55"/>
+ <location line="+52"/>
+ <source>Add</source>
+ <translation>Ajouter</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add a view</source>
+ <translation>Ajouter une vue</translation>
+ </message>
+ <message>
+ <location line="+8"/>
<source>Service Overview</source>
<translation>Aperçu du service</translation>
</message>
@@ -1313,20 +1421,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="+10"/>
+ <location filename="../QML/MotView.qml" line="+11"/>
<source>MOT Slide Show</source>
<translation>Diaporama MOT</translation>
</message>
<message>
- <location line="+17"/>
+ <location line="+18"/>
<source>Save all images</source>
<translation>Sauvegarder toutes les images</translation>
</message>
- <message>
- <location line="+20"/>
- <source>Latest</source>
- <translation>Le plus récent</translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1336,11 +1439,6 @@
<translatorcomment>Traduction de NULL selon : TERMIUM Plus®. Mais peut etre laisser tel quel car Null Symbol a un sens précis dans le signal DAB+</translatorcomment>
<translation type="unfinished">Null Symbol</translation>
</message>
- <message>
- <location line="+8"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1351,7 +1449,7 @@
</message>
<message>
<location line="+9"/>
- <source>Enable bias tee (not from all dongles supported)</source>
+ <source>Enable bias tee (not supported by all dongles)</source>
<translation>Activer le té de polarisation (non pris en charge par tous les récepteurs)</translation>
</message>
</context>
@@ -1393,59 +1491,10 @@
<context>
<name>RadioView</name>
<message>
- <location filename="../QML/RadioView.qml" line="+13"/>
+ <location filename="../QML/RadioView.qml" line="+12"/>
<source>Service Overview</source>
<translation>Aperçu du service</translation>
</message>
- <message>
- <location line="+27"/>
- <location line="+5"/>
- <source>Volume</source>
- <translation>Volume</translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Toggle volume slider</source>
- <translation type="unfinished">Afficher/cacher le curseur du volume</translation>
- </message>
- <message>
- <location line="+59"/>
- <source>Volume set to %1</source>
- <translation>Volume fixé à %1</translation>
- </message>
- <message>
- <location line="+128"/>
- <location line="+5"/>
- <source>Stop</source>
- <translation>Stop</translation>
- </message>
- <message>
- <location line="-5"/>
- <location line="+5"/>
- <source>Play</source>
- <translation>Lecture</translation>
- </message>
- <message>
- <location line="-4"/>
- <source>Stop playback</source>
- <translation>Arrêter la lecture</translation>
- </message>
- <message>
- <location line="+0"/>
- <source>Start playback</source>
- <translation>Démarrer la lecture</translation>
- </message>
- <message>
- <location line="+17"/>
- <source>Playback stopped</source>
- <translation>Lecture arrêtée</translation>
- </message>
- <message>
- <source>Last played station not found.
-Select a station to start playback.</source>
- <translation type="obsolete">Dernière station lue non trouvée.
-Sélectionnez une station pour démarrer la lecture.</translation>
- </message>
</context>
<context>
<name>RawFileSettings</name>
@@ -1519,24 +1568,25 @@ Sélectionnez une station pour démarrer la lecture.</translation>
<translation>Canal actuel</translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+22"/>
<source>Frame sync</source>
<translatorcomment>pluriel ?</translatorcomment>
<translation>Synchronisation de trame</translation>
</message>
<message>
<location line="+1"/>
- <location line="+15"/>
+ <location line="+14"/>
+ <location line="+33"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location line="-15"/>
+ <location line="-47"/>
<source>Not synced</source>
<translation>Pas de sync.</translation>
</message>
<message>
- <location line="+14"/>
+ <location line="+13"/>
<source>FIC CRC</source>
<translation>FIC CRC</translation>
</message>
@@ -1546,13 +1596,13 @@ Sélectionnez une station pour démarrer la lecture.</translation>
<translation>Erreur</translation>
</message>
<message>
- <location line="+15"/>
+ <location line="+14"/>
<source>Frame errors</source>
<translatorcomment>pluriel ?</translatorcomment>
<translation>Erreurs de trame</translation>
</message>
<message>
- <location line="+6"/>
+ <location line="-46"/>
<source>Frequency correction</source>
<translation>Correction de fréquence</translation>
</message>
@@ -1562,17 +1612,27 @@ Sélectionnez une station pour démarrer la lecture.</translation>
<translation>SNR (rapport signal/bruit)</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+57"/>
<source>RS errors</source>
<translation>Erreurs RS</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+4"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished">Erreur corrigée</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished">Erreur non corrigée</translation>
+ </message>
+ <message>
+ <location line="+12"/>
<source>AAC errors</source>
<translation>Erreurs AAC</translation>
</message>
<message>
- <location line="+5"/>
+ <location line="+6"/>
<source>DAB date and time</source>
<translation>Date et heure DAB</translation>
</message>
@@ -1627,16 +1687,24 @@ Sélectionnez une station pour démarrer la lecture.</translation>
<source>Spectrum</source>
<translation>Spectre</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
<message>
- <location line="+9"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="+155"/>
+ <source>Remove station from favorites</source>
+ <translation>Retirer la station des favoris</translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Add station to favorites</source>
+ <translation>Ajouter la station aux favoris</translation>
</message>
</context>
<context>
<name>StationListModel</name>
<message>
- <location filename="../QML/components/StationListModel.qml" line="+91"/>
+ <location filename="../QML/components/StationListModel.qml" line="+96"/>
<source>Last played station not found.
Select a station to start playback.</source>
<translation>Dernière station lue non trouvée.
@@ -1659,7 +1727,27 @@ Sélectionnez une station pour démarrer la lecture.</translation>
<context>
<name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="+122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="+69"/>
+ <source>%1 title bar</source>
+ <translation>Barre de titre %1</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>%1 title bar to drag the element</source>
+ <translation>Barre de titre %1 pour déplacer l'élément</translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>%1 menu</source>
+ <translation>Menu de %1</translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show %1 menu</source>
+ <translation>Afficher le menu %1</translation>
+ </message>
+ <message>
+ <location line="+11"/>
<source>Minimize</source>
<translation>Minimiser</translation>
</message>
@@ -1705,16 +1793,11 @@ Sélectionnez une station pour démarrer la lecture.</translation>
<source>experimental</source>
<translation>expérimental</translation>
</message>
- <message>
- <location line="+62"/>
- <source>Sensitivity</source>
- <translation>Sensibilité</translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <location filename="../main.cpp" line="+100"/>
+ <location filename="../main.cpp" line="+111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation>Enregistre les trames DAB (*.mp2) ou les supertrames DAB+ avec codage RS (*.dab). Ce fichier peut être utilisé pour analyser des données X-PAD avec XPADxpert</translation>
</message>
@@ -1737,8 +1820,8 @@ Sélectionnez une station pour démarrer la lecture.</translation>
</message>
<message>
<location line="+1"/>
- <source>style_name</source>
- <translation>nom_du_style</translation>
+ <source>Style name</source>
+ <translation>Nom du style</translation>
</message>
</context>
</TS>
diff --git a/src/welle-gui/i18n/hu_HU.qm b/src/welle-gui/i18n/hu_HU.qm
index 6c5b844..1205ef4 100644
Binary files a/src/welle-gui/i18n/hu_HU.qm and b/src/welle-gui/i18n/hu_HU.qm differ
diff --git a/src/welle-gui/i18n/hu_HU.ts b/src/welle-gui/i18n/hu_HU.ts
index 322c80f..1cbc2a1 100644
--- a/src/welle-gui/i18n/hu_HU.ts
+++ b/src/welle-gui/i18n/hu_HU.ts
@@ -36,73 +36,79 @@
</message>
<message>
<location filename="../android_rtl_sdr.cpp" line="139"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
- <location filename="../gui_helper.cpp" line="65"/>
- <location filename="../gui_helper.cpp" line="654"/>
+ <location filename="../gui_helper.cpp" line="66"/>
+ <location filename="../gui_helper.cpp" line="699"/>
<source>Mi&nimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="68"/>
- <location filename="../gui_helper.cpp" line="655"/>
+ <location filename="../gui_helper.cpp" line="69"/>
+ <location filename="../gui_helper.cpp" line="700"/>
<source>Ma&ximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="71"/>
- <location filename="../gui_helper.cpp" line="656"/>
+ <location filename="../gui_helper.cpp" line="72"/>
+ <location filename="../gui_helper.cpp" line="701"/>
<source>&Restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="74"/>
- <location filename="../gui_helper.cpp" line="657"/>
+ <location filename="../gui_helper.cpp" line="75"/>
+ <location filename="../gui_helper.cpp" line="702"/>
<source>&Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="127"/>
- <source>version</source>
- <translation type="unfinished">verzió</translation>
+ <location filename="../gui_helper.cpp" line="180"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="128"/>
- <source>Git revision</source>
- <translation type="unfinished">Git revízió</translation>
+ <location filename="../gui_helper.cpp" line="184"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="129"/>
- <source>Build on</source>
- <translation type="unfinished">Készült</translation>
+ <location filename="../gui_helper.cpp" line="302"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="130"/>
- <source>QT version</source>
- <translation type="unfinished">QT verzió</translation>
+ <location filename="../gui_helper.cpp" line="307"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="283"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation type="unfinished"></translation>
+ <location filename="../gui_helper.cpp" line="181"/>
+ <source>Git revision</source>
+ <translation type="unfinished">Git revízió</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="778"/>
+ <location filename="../gui_helper.cpp" line="185"/>
+ <source>QT version</source>
+ <translation type="unfinished">QT verzió</translation>
+ </message>
+ <message>
+ <location filename="../gui_helper.cpp" line="823"/>
<source> (unavailable, fallback to Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="782"/>
+ <location filename="../gui_helper.cpp" line="827"/>
<source>Style of system</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="784"/>
+ <location filename="../gui_helper.cpp" line="829"/>
<source> (Recommended)</source>
<translation type="unfinished"></translation>
</message>
@@ -110,13 +116,13 @@
<context>
<name>CRadioController</name>
<message>
- <location filename="../radio_controller.cpp" line="608"/>
+ <location filename="../radio_controller.cpp" line="646"/>
<source>Unknown</source>
<translation type="unfinished">Ismeretlen</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="406"/>
- <location filename="../radio_controller.cpp" line="627"/>
+ <location filename="../radio_controller.cpp" line="443"/>
+ <location filename="../radio_controller.cpp" line="665"/>
<source>No Station</source>
<translation type="unfinished">Nincs állomás</translation>
</message>
@@ -126,29 +132,39 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="369"/>
+ <location filename="../radio_controller.cpp" line="255"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="276"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="405"/>
<source>RAW File</source>
<translation type="unfinished">RAW Fájl</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="382"/>
- <location filename="../radio_controller.cpp" line="848"/>
+ <location filename="../radio_controller.cpp" line="419"/>
+ <location filename="../radio_controller.cpp" line="904"/>
<source>Scanning</source>
<translation type="unfinished">Keresés</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="386"/>
- <location filename="../radio_controller.cpp" line="873"/>
+ <location filename="../radio_controller.cpp" line="423"/>
+ <location filename="../radio_controller.cpp" line="929"/>
<source>Found channels</source>
<translation type="unfinished">Megtalált állomások</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="602"/>
+ <location filename="../radio_controller.cpp" line="640"/>
<source>Playing last station</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="660"/>
+ <location filename="../radio_controller.cpp" line="715"/>
<source>Radio device is not ready or does not exist.</source>
<translation type="unfinished">A rádióvevő nem áll készen vagy nincs.</translation>
</message>
@@ -190,28 +206,33 @@
<translation type="unfinished">Ismeretlen RAW fájl formátum</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="294"/>
- <location filename="../../input/rtl_tcp.cpp" line="462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="390"/>
+ <location filename="../../input/rtl_sdr.cpp" line="402"/>
<source>RTL-SDR is unplugged.</source>
- <translation type="unfinished">RTL-SDR nincs csatlakoztatva</translation>
+ <translation type="unfinished">RTL-SDR nincs csatlakoztatva.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="272"/>
+ <location filename="../../input/rtl_tcp.cpp" line="309"/>
<source>RTL-TCP connection closed.</source>
- <translation type="unfinished">RTL-TCP kapcsolat zárva</translation>
+ <translation type="unfinished">RTL-TCP kapcsolat zárva.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="413"/>
+ <location filename="../../input/rtl_tcp.cpp" line="450"/>
<source>Connection failed to server </source>
- <translation type="unfinished">Szerverkapcsolat hiba</translation>
+ <translation type="unfinished">Szerverkapcsolat hiba </translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation type="unfinished"></translation>
</message>
@@ -232,7 +253,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
<source>Display station name in the window title</source>
<translation type="unfinished"></translation>
</message>
@@ -1005,107 +1026,107 @@
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
<source>Global settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
<source>Full screen mode</source>
<translation type="unfinished">Teljesképernyő mód</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
<source>Language</source>
<translation type="unfinished">Nyelv</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
<source>Global receiver settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
<source>Automatic RF gain</source>
<translation type="unfinished">Automatikus RF erősítés</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
<source>Manual gain</source>
<translation type="unfinished">Kézi RF erősítés</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
<source>Value: </source>
<translation type="unfinished">Érték:</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
<source>Auto detect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
<source>Airspy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
<source>rtl-sdr</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
<source>SoapySDR</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
<source>rtl-tcp</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
<source>RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
<source>Style settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
- <source>Style changed. Please restart welle.io</source>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <source>Style changed. Please restart welle.io.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
<source>Style. Restart to apply.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
<source>Light</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
@@ -1119,119 +1140,229 @@
</message>
<message>
<location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
- <source>Amplitude</source>
- <translation type="unfinished">Amplitúdó</translation>
+ <source>Samples</source>
+ <translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>InfoPage</name>
<message>
- <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
- <source>Samples</source>
+ <location filename="../QML/InfoPage.qml" line="21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="26"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="31"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="36"/>
+ <source>Licenses</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="172"/>
+ <location filename="../QML/MainView.qml" line="138"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="139"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="284"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="289"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="290"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="421"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="462"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="463"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="474"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="180"/>
+ <location filename="../QML/MainView.qml" line="482"/>
<source>Expert Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="188"/>
+ <location filename="../QML/MainView.qml" line="490"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="196"/>
+ <location filename="../QML/MainView.qml" line="498"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="232"/>
+ <location filename="../QML/MainView.qml" line="534"/>
<source>All stations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="233"/>
+ <location filename="../QML/MainView.qml" line="535"/>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="267"/>
+ <location filename="../QML/MainView.qml" line="566"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="567"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="575"/>
<source>Start station scan</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="279"/>
+ <location filename="../QML/MainView.qml" line="587"/>
<source>Stop station scan</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="291"/>
+ <location filename="../QML/MainView.qml" line="599"/>
<source>Clear station list</source>
<translation type="unfinished">Állomáslista törlése</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="299"/>
+ <location filename="../QML/MainView.qml" line="607"/>
<source>Station settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="312"/>
+ <location filename="../QML/MainView.qml" line="620"/>
<source>No stations in list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="349"/>
+ <location filename="../QML/MainView.qml" line="634"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="764"/>
<source>Manual channel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="404"/>
+ <location filename="../QML/MainView.qml" line="816"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="817"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="825"/>
<source>Service Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="410"/>
+ <location filename="../QML/MainView.qml" line="831"/>
<source>Service Details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="416"/>
+ <location filename="../QML/MainView.qml" line="837"/>
<source>MOT Slide Show</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="422"/>
+ <location filename="../QML/MainView.qml" line="843"/>
<source>Spectrum</source>
<translation type="unfinished">Spektrum</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="428"/>
+ <location filename="../QML/MainView.qml" line="849"/>
<source>Impulse Response</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="434"/>
+ <location filename="../QML/MainView.qml" line="855"/>
<source>Constellation Diagram</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="440"/>
+ <location filename="../QML/MainView.qml" line="861"/>
<source>Null Symbol</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="446"/>
+ <location filename="../QML/MainView.qml" line="867"/>
<source>Console Output</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="452"/>
+ <location filename="../QML/MainView.qml" line="873"/>
<source>RAW Recorder</source>
<translation type="unfinished"></translation>
</message>
@@ -1239,20 +1370,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="10"/>
+ <location filename="../QML/MotView.qml" line="11"/>
<source>MOT Slide Show</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MotView.qml" line="27"/>
+ <location filename="../QML/MotView.qml" line="29"/>
<source>Save all images</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/MotView.qml" line="47"/>
- <source>Latest</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1261,11 +1387,6 @@
<source>Null Symbol</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
- <source>Amplitude</source>
- <translation type="unfinished">Amplitúdó</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1276,7 +1397,7 @@
</message>
<message>
<location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
- <source>Enable bias tee (not from all dongles supported)</source>
+ <source>Enable bias tee (not supported by all dongles)</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1329,17 +1450,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
<source>Open RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
<source>Currently shown under Android</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
<source>Selected file:</source>
<translation type="unfinished"></translation>
</message>
@@ -1390,58 +1511,69 @@
<translation type="unfinished">Aktuális csatorna</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
<source>Frame sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
<source>OK</source>
<translation type="unfinished">Rendben</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
<source>Not synced</source>
<translation type="unfinished">Nem szinkronizált</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
<source>FIC CRC</source>
<translation type="unfinished">FIC CRC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
<source>Error</source>
<translation type="unfinished">Hiba</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
<source>Frame errors</source>
<translation type="unfinished">Frame hibák</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
<source>Frequency correction</source>
<translation type="unfinished">Frekvencia korrekció</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
<source>SNR</source>
<translation type="unfinished">Jel-zaj viszony</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
<source>RS errors</source>
<translation type="unfinished">RS hibák</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
<source>AAC errors</source>
<translation type="unfinished">AAC hibák</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
<source>DAB date and time</source>
<translation type="unfinished"></translation>
</message>
@@ -1496,10 +1628,27 @@
<source>Spectrum</source>
<translation type="unfinished">Spektrum</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
<message>
- <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
- <source>Amplitude</source>
- <translation type="unfinished">Amplitúdó</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StationListModel</name>
+ <message>
+ <location filename="../QML/components/StationListModel.qml" line="96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -1518,17 +1667,37 @@
<context>
<name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Minimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
@@ -1563,38 +1732,33 @@
<source>experimental</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/components/WSpectrum.qml" line="101"/>
- <source>Sensitivity</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <location filename="../main.cpp" line="100"/>
+ <location filename="../main.cpp" line="111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="101"/>
- <location filename="../main.cpp" line="106"/>
+ <location filename="../main.cpp" line="112"/>
+ <location filename="../main.cpp" line="117"/>
<source>File name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="105"/>
+ <location filename="../main.cpp" line="116"/>
<source>Redirects all log output texts to a file.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="110"/>
+ <location filename="../main.cpp" line="121"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="111"/>
- <source>style_name</source>
+ <location filename="../main.cpp" line="122"/>
+ <source>Style name</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/src/welle-gui/i18n/it_IT.qm b/src/welle-gui/i18n/it_IT.qm
index 7d03956..2acb347 100644
Binary files a/src/welle-gui/i18n/it_IT.qm and b/src/welle-gui/i18n/it_IT.qm differ
diff --git a/src/welle-gui/i18n/it_IT.ts b/src/welle-gui/i18n/it_IT.ts
index 389da97..5620cee 100644
--- a/src/welle-gui/i18n/it_IT.ts
+++ b/src/welle-gui/i18n/it_IT.ts
@@ -36,73 +36,79 @@
</message>
<message>
<location filename="../android_rtl_sdr.cpp" line="139"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
- <location filename="../gui_helper.cpp" line="65"/>
- <location filename="../gui_helper.cpp" line="654"/>
+ <location filename="../gui_helper.cpp" line="66"/>
+ <location filename="../gui_helper.cpp" line="699"/>
<source>Mi&nimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="68"/>
- <location filename="../gui_helper.cpp" line="655"/>
+ <location filename="../gui_helper.cpp" line="69"/>
+ <location filename="../gui_helper.cpp" line="700"/>
<source>Ma&ximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="71"/>
- <location filename="../gui_helper.cpp" line="656"/>
+ <location filename="../gui_helper.cpp" line="72"/>
+ <location filename="../gui_helper.cpp" line="701"/>
<source>&Restore</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="74"/>
- <location filename="../gui_helper.cpp" line="657"/>
+ <location filename="../gui_helper.cpp" line="75"/>
+ <location filename="../gui_helper.cpp" line="702"/>
<source>&Quit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="127"/>
- <source>version</source>
- <translation>versione</translation>
+ <location filename="../gui_helper.cpp" line="180"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="128"/>
- <source>Git revision</source>
- <translation>Versione di Git</translation>
+ <location filename="../gui_helper.cpp" line="184"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="129"/>
- <source>Build on</source>
- <translation>Compilata il</translation>
+ <location filename="../gui_helper.cpp" line="302"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="130"/>
- <source>QT version</source>
- <translation>Versione di Qt</translation>
+ <location filename="../gui_helper.cpp" line="307"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="283"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation type="unfinished"></translation>
+ <location filename="../gui_helper.cpp" line="181"/>
+ <source>Git revision</source>
+ <translation>Versione di Git</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="778"/>
+ <location filename="../gui_helper.cpp" line="185"/>
+ <source>QT version</source>
+ <translation>Versione di Qt</translation>
+ </message>
+ <message>
+ <location filename="../gui_helper.cpp" line="823"/>
<source> (unavailable, fallback to Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="782"/>
+ <location filename="../gui_helper.cpp" line="827"/>
<source>Style of system</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="784"/>
+ <location filename="../gui_helper.cpp" line="829"/>
<source> (Recommended)</source>
<translation type="unfinished"></translation>
</message>
@@ -110,13 +116,13 @@
<context>
<name>CRadioController</name>
<message>
- <location filename="../radio_controller.cpp" line="608"/>
+ <location filename="../radio_controller.cpp" line="646"/>
<source>Unknown</source>
<translation>Sconosciuto</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="406"/>
- <location filename="../radio_controller.cpp" line="627"/>
+ <location filename="../radio_controller.cpp" line="443"/>
+ <location filename="../radio_controller.cpp" line="665"/>
<source>No Station</source>
<translation>Nessuna Stazione</translation>
</message>
@@ -126,29 +132,39 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="369"/>
+ <location filename="../radio_controller.cpp" line="255"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="276"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="405"/>
<source>RAW File</source>
<translation>File RAW</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="382"/>
- <location filename="../radio_controller.cpp" line="848"/>
+ <location filename="../radio_controller.cpp" line="419"/>
+ <location filename="../radio_controller.cpp" line="904"/>
<source>Scanning</source>
<translation>Cerco</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="386"/>
- <location filename="../radio_controller.cpp" line="873"/>
+ <location filename="../radio_controller.cpp" line="423"/>
+ <location filename="../radio_controller.cpp" line="929"/>
<source>Found channels</source>
<translation>Canali trovati</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="602"/>
+ <location filename="../radio_controller.cpp" line="640"/>
<source>Playing last station</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="660"/>
+ <location filename="../radio_controller.cpp" line="715"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Il dispositivo radio non è pronto o non è connesso.</translation>
</message>
@@ -190,28 +206,33 @@
<translation>Formato del file RAW sconosciuto</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="294"/>
- <location filename="../../input/rtl_tcp.cpp" line="462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="390"/>
+ <location filename="../../input/rtl_sdr.cpp" line="402"/>
<source>RTL-SDR is unplugged.</source>
<translation type="unfinished">Il dispositivo RTL-SDR è scollegato.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="272"/>
+ <location filename="../../input/rtl_tcp.cpp" line="309"/>
<source>RTL-TCP connection closed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="413"/>
+ <location filename="../../input/rtl_tcp.cpp" line="450"/>
<source>Connection failed to server </source>
<translation type="unfinished">Connessione al server fallita </translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation type="unfinished"></translation>
</message>
@@ -224,7 +245,7 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
<source>Display station name in the window title</source>
<translation type="unfinished"></translation>
</message>
@@ -997,107 +1018,107 @@
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
<source>Global settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
<source>Full screen mode</source>
<translation>Modalità tutto schermo</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
<source>Language</source>
<translation>Lingua</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
<source>Global receiver settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
<source>Automatic RF gain</source>
<translation>Guadagno RF automatico</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
<source>Manual gain</source>
<translation>Guadagno manuale</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
<source>Value: </source>
<translation>Valore: </translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
<source>Auto detect</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
<source>Airspy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
<source>rtl-sdr</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
<source>SoapySDR</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
<source>rtl-tcp</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
<source>RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
<source>Style settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
- <source>Style changed. Please restart welle.io</source>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <source>Style changed. Please restart welle.io.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
<source>Style. Restart to apply.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
<source>Light</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
@@ -1111,119 +1132,229 @@
</message>
<message>
<location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
- <source>Amplitude</source>
- <translation>Ampiezza</translation>
+ <source>Samples</source>
+ <translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>InfoPage</name>
<message>
- <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
- <source>Samples</source>
+ <location filename="../QML/InfoPage.qml" line="21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="26"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="31"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="36"/>
+ <source>Licenses</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="172"/>
+ <location filename="../QML/MainView.qml" line="138"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="139"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="284"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="289"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="290"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="421"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="462"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="463"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="474"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="180"/>
+ <location filename="../QML/MainView.qml" line="482"/>
<source>Expert Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="188"/>
+ <location filename="../QML/MainView.qml" line="490"/>
<source>About</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="196"/>
+ <location filename="../QML/MainView.qml" line="498"/>
<source>Exit</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="232"/>
+ <location filename="../QML/MainView.qml" line="534"/>
<source>All stations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="233"/>
+ <location filename="../QML/MainView.qml" line="535"/>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="267"/>
+ <location filename="../QML/MainView.qml" line="566"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="567"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="575"/>
<source>Start station scan</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="279"/>
+ <location filename="../QML/MainView.qml" line="587"/>
<source>Stop station scan</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="291"/>
+ <location filename="../QML/MainView.qml" line="599"/>
<source>Clear station list</source>
<translation>Elimina la lista delle stazioni</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="299"/>
+ <location filename="../QML/MainView.qml" line="607"/>
<source>Station settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="312"/>
+ <location filename="../QML/MainView.qml" line="620"/>
<source>No stations in list</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="349"/>
+ <location filename="../QML/MainView.qml" line="634"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="764"/>
<source>Manual channel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="404"/>
+ <location filename="../QML/MainView.qml" line="816"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="817"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="825"/>
<source>Service Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="410"/>
+ <location filename="../QML/MainView.qml" line="831"/>
<source>Service Details</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="416"/>
+ <location filename="../QML/MainView.qml" line="837"/>
<source>MOT Slide Show</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="422"/>
+ <location filename="../QML/MainView.qml" line="843"/>
<source>Spectrum</source>
<translation type="unfinished">Spettro</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="428"/>
+ <location filename="../QML/MainView.qml" line="849"/>
<source>Impulse Response</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="434"/>
+ <location filename="../QML/MainView.qml" line="855"/>
<source>Constellation Diagram</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="440"/>
+ <location filename="../QML/MainView.qml" line="861"/>
<source>Null Symbol</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="446"/>
+ <location filename="../QML/MainView.qml" line="867"/>
<source>Console Output</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="452"/>
+ <location filename="../QML/MainView.qml" line="873"/>
<source>RAW Recorder</source>
<translation type="unfinished"></translation>
</message>
@@ -1231,20 +1362,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="10"/>
+ <location filename="../QML/MotView.qml" line="11"/>
<source>MOT Slide Show</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/MotView.qml" line="27"/>
+ <location filename="../QML/MotView.qml" line="29"/>
<source>Save all images</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/MotView.qml" line="47"/>
- <source>Latest</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1253,11 +1379,6 @@
<source>Null Symbol</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
- <source>Amplitude</source>
- <translation type="unfinished">Ampiezza</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1268,7 +1389,7 @@
</message>
<message>
<location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
- <source>Enable bias tee (not from all dongles supported)</source>
+ <source>Enable bias tee (not supported by all dongles)</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -1321,17 +1442,17 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
<source>Open RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
<source>Currently shown under Android</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
<source>Selected file:</source>
<translation type="unfinished"></translation>
</message>
@@ -1382,58 +1503,69 @@
<translation>Canale attuale</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
<source>Frame sync</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
<source>Not synced</source>
<translation>Non sincronizzato</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
<source>FIC CRC</source>
<translation>FIC CRC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
<source>Frame errors</source>
<translation>Errori di frame</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
<source>Frequency correction</source>
<translation>Correzione di frequenza</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
<source>SNR</source>
<translation>SNR</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
<source>RS errors</source>
<translation>Errori RS</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
<source>AAC errors</source>
<translation>Errori AAC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
<source>DAB date and time</source>
<translation type="unfinished"></translation>
</message>
@@ -1488,10 +1620,27 @@
<source>Spectrum</source>
<translation>Spettro</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
<message>
- <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
- <source>Amplitude</source>
- <translation>Ampiezza</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StationListModel</name>
+ <message>
+ <location filename="../QML/components/StationListModel.qml" line="96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -1510,17 +1659,37 @@
<context>
<name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Minimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
@@ -1555,38 +1724,33 @@
<source>experimental</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/components/WSpectrum.qml" line="101"/>
- <source>Sensitivity</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <location filename="../main.cpp" line="100"/>
+ <location filename="../main.cpp" line="111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="101"/>
- <location filename="../main.cpp" line="106"/>
+ <location filename="../main.cpp" line="112"/>
+ <location filename="../main.cpp" line="117"/>
<source>File name</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="105"/>
+ <location filename="../main.cpp" line="116"/>
<source>Redirects all log output texts to a file.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="110"/>
+ <location filename="../main.cpp" line="121"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="111"/>
- <source>style_name</source>
+ <location filename="../main.cpp" line="122"/>
+ <source>Style name</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/src/welle-gui/i18n/nb_NO.qm b/src/welle-gui/i18n/nb_NO.qm
index 491ad98..21d353e 100644
Binary files a/src/welle-gui/i18n/nb_NO.qm and b/src/welle-gui/i18n/nb_NO.qm differ
diff --git a/src/welle-gui/i18n/nb_NO.ts b/src/welle-gui/i18n/nb_NO.ts
index bf4514c..b60aa70 100644
--- a/src/welle-gui/i18n/nb_NO.ts
+++ b/src/welle-gui/i18n/nb_NO.ts
@@ -36,76 +36,82 @@
</message>
<message>
<location filename="../android_rtl_sdr.cpp" line="139"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
- <translation>Android RTL-SDR-driver er ikke installert. Vil du installere? Etter installasjon, start welle.io om igjen.</translation>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
+ <translation type="unfinished">Android RTL-SDR-driver er ikke installert. Vil du installere? Etter installasjon, start welle.io om igjen.</translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
- <location filename="../gui_helper.cpp" line="65"/>
- <location filename="../gui_helper.cpp" line="654"/>
+ <location filename="../gui_helper.cpp" line="66"/>
+ <location filename="../gui_helper.cpp" line="699"/>
<source>Mi&nimize</source>
<translation>Mi&nimer</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="68"/>
- <location filename="../gui_helper.cpp" line="655"/>
+ <location filename="../gui_helper.cpp" line="69"/>
+ <location filename="../gui_helper.cpp" line="700"/>
<source>Ma&ximize</source>
<translation>Ma&ksimer</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="71"/>
- <location filename="../gui_helper.cpp" line="656"/>
+ <location filename="../gui_helper.cpp" line="72"/>
+ <location filename="../gui_helper.cpp" line="701"/>
<source>&Restore</source>
<translation>&Gjenoprett</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="74"/>
- <location filename="../gui_helper.cpp" line="657"/>
+ <location filename="../gui_helper.cpp" line="75"/>
+ <location filename="../gui_helper.cpp" line="702"/>
<source>&Quit</source>
<translation>&Avslutt</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="127"/>
- <source>version</source>
- <translation>versjon</translation>
+ <location filename="../gui_helper.cpp" line="180"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="128"/>
- <source>Git revision</source>
- <translation>Git-versjon</translation>
+ <location filename="../gui_helper.cpp" line="184"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="129"/>
- <source>Build on</source>
- <translation>Kompilert</translation>
+ <location filename="../gui_helper.cpp" line="302"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translatorcomment>Rough translation, should be refined.</translatorcomment>
+ <translation type="unfinished">Programmet vil kjøre i bakgrunnen som et ikon på oppgavelinjen. For å avslutte programmet, velg "%1" i filmenyen for ikonet på oppgavelinjen.</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="130"/>
- <source>QT version</source>
- <translation>QT-versjon</translation>
+ <location filename="../gui_helper.cpp" line="307"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished">Avslutt</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="283"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translatorcomment>Rough translation, should be refined.</translatorcomment>
- <translation>Programmet vil kjøre i bakgrunnen som et ikon på oppgavelinjen. For å avslutte programmet, velg <b>Avslutt</b> i filmenyen for ikonet på oppgavelinjen.</translation>
+ <location filename="../gui_helper.cpp" line="181"/>
+ <source>Git revision</source>
+ <translation>Git-versjon</translation>
+ </message>
+ <message>
+ <location filename="../gui_helper.cpp" line="185"/>
+ <source>QT version</source>
+ <translation>QT-versjon</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="778"/>
+ <location filename="../gui_helper.cpp" line="823"/>
<source> (unavailable, fallback to Default)</source>
<translatorcomment>inaccurate translation</translatorcomment>
<translation> (utilgjengelig, bruker standardinnstillinger)</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="782"/>
+ <location filename="../gui_helper.cpp" line="827"/>
<source>Style of system</source>
<translatorcomment>Inaccurate translation</translatorcomment>
<translation>Systemutseende</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="784"/>
+ <location filename="../gui_helper.cpp" line="829"/>
<source> (Recommended)</source>
<translation> (Anbefalt)</translation>
</message>
@@ -113,13 +119,13 @@
<context>
<name>CRadioController</name>
<message>
- <location filename="../radio_controller.cpp" line="608"/>
+ <location filename="../radio_controller.cpp" line="646"/>
<source>Unknown</source>
<translation>Ukjent</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="406"/>
- <location filename="../radio_controller.cpp" line="627"/>
+ <location filename="../radio_controller.cpp" line="443"/>
+ <location filename="../radio_controller.cpp" line="665"/>
<source>No Station</source>
<translation>Ingen radiokanal valgt</translation>
</message>
@@ -129,29 +135,39 @@
<translation>Feil ved åpning av fil </translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="369"/>
+ <location filename="../radio_controller.cpp" line="255"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="276"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="405"/>
<source>RAW File</source>
<translation>RAW-fil</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="382"/>
- <location filename="../radio_controller.cpp" line="848"/>
+ <location filename="../radio_controller.cpp" line="419"/>
+ <location filename="../radio_controller.cpp" line="904"/>
<source>Scanning</source>
<translation>Søker</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="386"/>
- <location filename="../radio_controller.cpp" line="873"/>
+ <location filename="../radio_controller.cpp" line="423"/>
+ <location filename="../radio_controller.cpp" line="929"/>
<source>Found channels</source>
<translation>Radiokanaler funnet</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="602"/>
+ <location filename="../radio_controller.cpp" line="640"/>
<source>Playing last station</source>
<translation>Spiller sist valgte radiokanal</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="660"/>
+ <location filename="../radio_controller.cpp" line="715"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Radiomottaker er ikke klar eller er ikke tilkoblet.</translation>
</message>
@@ -194,29 +210,34 @@
<translation>Ukjent RAW filformat</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="294"/>
- <location filename="../../input/rtl_tcp.cpp" line="462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translatorcomment>Refine translation.</translatorcomment>
<translation>ADC overbelastning. Gain muligens satt for høyt.</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="390"/>
+ <location filename="../../input/rtl_sdr.cpp" line="402"/>
<source>RTL-SDR is unplugged.</source>
<translation>RTL-SDR er frakoblet.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="272"/>
+ <location filename="../../input/rtl_tcp.cpp" line="309"/>
<source>RTL-TCP connection closed.</source>
<translation>RTL-TCP tilkobling avsluttet.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="413"/>
+ <location filename="../../input/rtl_tcp.cpp" line="450"/>
<source>Connection failed to server </source>
<translation>Tilkobling til server mislyktes </translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translatorcomment>refine translation</translatorcomment>
<translation>Kunne ikke aktivere SoapySDR med gitte enhetsargumeter.</translation>
@@ -238,7 +259,7 @@
<translation>Automatisk start å spille av sist valgte radiokanal</translation>
</message>
<message>
- <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
<source>Display station name in the window title</source>
<translatorcomment>Unsure about translation.</translatorcomment>
<translation>Vis kanalnavn i tittelvinduet</translation>
@@ -1019,107 +1040,107 @@
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
<source>Global settings</source>
<translation>Globale innstillinger</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
<source>Full screen mode</source>
<translation>Fullskjermsmodus</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
<source>Language</source>
<translation>Språk</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
<source>Global receiver settings</source>
<translation>Globale mottakerinnstillinger</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
<source>Automatic RF gain</source>
<translation>Automatisk RF forsterkning</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
<source>Manual gain</source>
<translation>Manuell forsterkning</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
<source>Value: </source>
<translation>Verdi: </translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
<source>Auto detect</source>
<translation>Automatisk gjenkjenning</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
<source>None</source>
<translation>Ingen</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
<source>Airspy</source>
<translation>Airspy</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
<source>rtl-sdr</source>
<translation>rtl-sdr</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
<source>SoapySDR</source>
<translation>SoapySDR</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
<source>rtl-tcp</source>
<translation>rtl-tcp</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
<source>RAW file</source>
<translation>RAW fil</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
<source>Style settings</source>
<translation>Temainnstillinger</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
- <source>Style changed. Please restart welle.io</source>
- <translation>Tema forandret. Start welle.io på nytt for å bruke</translation>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <source>Style changed. Please restart welle.io.</source>
+ <translation type="unfinished">Tema forandret. Start welle.io på nytt for å bruke.</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
<source>Style. Restart to apply.</source>
<translation>Tema. Start på nytt for å bruke.</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
<source>Light</source>
<translation>Lys</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
<source>Dark</source>
<translation>Mørk</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
<source>System</source>
<translation>System</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
<source>Theme</source>
<translation>Tema</translation>
</message>
@@ -1133,122 +1154,232 @@
</message>
<message>
<location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
- <message>
- <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
<source>Samples</source>
<translatorcomment>Needs a better translation</translatorcomment>
<translation>Prøver</translation>
</message>
</context>
+<context>
+ <name>InfoPage</name>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="26"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="31"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="36"/>
+ <source>Licenses</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="172"/>
+ <location filename="../QML/MainView.qml" line="138"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="139"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="284"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="289"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="290"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="421"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="462"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="463"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="474"/>
<source>Settings</source>
<translation>Innstillinger</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="180"/>
+ <location filename="../QML/MainView.qml" line="482"/>
<source>Expert Settings</source>
<translation>Ekspertinnstillinger</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="188"/>
+ <location filename="../QML/MainView.qml" line="490"/>
<source>About</source>
<translation>Om</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="196"/>
+ <location filename="../QML/MainView.qml" line="498"/>
<source>Exit</source>
<translation>Avslutt</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="232"/>
+ <location filename="../QML/MainView.qml" line="534"/>
<source>All stations</source>
<translation>Alle radiokanaler</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="233"/>
+ <location filename="../QML/MainView.qml" line="535"/>
<source>Favorites</source>
<translation>Favoritter</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="267"/>
+ <location filename="../QML/MainView.qml" line="566"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="567"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="575"/>
<source>Start station scan</source>
<translation>Start kanalsøk</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="279"/>
+ <location filename="../QML/MainView.qml" line="587"/>
<source>Stop station scan</source>
<translation>Stopp kanalsøk</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="291"/>
+ <location filename="../QML/MainView.qml" line="599"/>
<source>Clear station list</source>
<translation>Tøm kanalliste</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="299"/>
+ <location filename="../QML/MainView.qml" line="607"/>
<source>Station settings</source>
<translation>Kanalinnstillinger</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="312"/>
+ <location filename="../QML/MainView.qml" line="620"/>
<source>No stations in list</source>
<translation>Ingen radiokanaler i listen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="349"/>
+ <location filename="../QML/MainView.qml" line="634"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="764"/>
<source>Manual channel</source>
<translation>Manuell kanal</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="404"/>
+ <location filename="../QML/MainView.qml" line="816"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="817"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="825"/>
<source>Service Overview</source>
<translatorcomment>Needs a better translation</translatorcomment>
<translation>Oversikt</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="410"/>
+ <location filename="../QML/MainView.qml" line="831"/>
<source>Service Details</source>
<translatorcomment>Needs a better translation</translatorcomment>
<translation>Detaljer</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="416"/>
+ <location filename="../QML/MainView.qml" line="837"/>
<source>MOT Slide Show</source>
<translation>MOT bildevisning</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="422"/>
+ <location filename="../QML/MainView.qml" line="843"/>
<source>Spectrum</source>
<translation>Spektrum</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="428"/>
+ <location filename="../QML/MainView.qml" line="849"/>
<source>Impulse Response</source>
<translation>Impulsrespons</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="434"/>
+ <location filename="../QML/MainView.qml" line="855"/>
<source>Constellation Diagram</source>
<translation>Konstellasjonsdiagram</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="440"/>
+ <location filename="../QML/MainView.qml" line="861"/>
<source>Null Symbol</source>
<translation>Null-symbol</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="446"/>
+ <location filename="../QML/MainView.qml" line="867"/>
<source>Console Output</source>
<translation>Konsoll</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="452"/>
+ <location filename="../QML/MainView.qml" line="873"/>
<source>RAW Recorder</source>
<translation>RAW-opptaker</translation>
</message>
@@ -1256,20 +1387,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="10"/>
+ <location filename="../QML/MotView.qml" line="11"/>
<source>MOT Slide Show</source>
<translation>MOT bildevisning</translation>
</message>
<message>
- <location filename="../QML/MotView.qml" line="27"/>
+ <location filename="../QML/MotView.qml" line="29"/>
<source>Save all images</source>
<translation>Lagre alle bilder</translation>
</message>
- <message>
- <location filename="../QML/MotView.qml" line="47"/>
- <source>Latest</source>
- <translation>Nyeste bilde</translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1278,11 +1404,6 @@
<source>Null Symbol</source>
<translation>Null-symbol</translation>
</message>
- <message>
- <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1293,8 +1414,8 @@
</message>
<message>
<location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
- <source>Enable bias tee (not from all dongles supported)</source>
- <translation>Aktiver bias-tee (Ikke alle enheter støttes)</translation>
+ <source>Enable bias tee (not supported by all dongles)</source>
+ <translation type="unfinished">Aktiver bias-tee (Ikke alle enheter støttes)</translation>
</message>
</context>
<context>
@@ -1346,18 +1467,18 @@
<translation>RAW-fil innstillinger</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
<source>Open RAW file</source>
<translation>Åpne RAW-fil</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
<source>Currently shown under Android</source>
<translatorcomment>inaccurate translation</translatorcomment>
<translation>Nå vist under Android</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
<source>Selected file:</source>
<translation>Valgt fil:</translation>
</message>
@@ -1409,58 +1530,69 @@
<translation>Kanalblokk</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
<source>Frame sync</source>
<translation>Pakke-synkronisering</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
<source>Not synced</source>
<translation>Ikke synkronisert</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
<source>FIC CRC</source>
<translation>FIC CRC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
<source>Error</source>
<translation>Feil</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
<source>Frame errors</source>
<translation>Pakkefeil</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
<source>Frequency correction</source>
<translation>Frekvenskorreksjon</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
<source>SNR</source>
<translation>SNR</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
<source>RS errors</source>
<translation>RS-feil</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
<source>AAC errors</source>
<translation>AAC-feil</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
<source>DAB date and time</source>
<translation>DAB tid og dato</translation>
</message>
@@ -1515,10 +1647,27 @@
<source>Spectrum</source>
<translation>Spektrum</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
<message>
- <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StationListModel</name>
+ <message>
+ <location filename="../QML/components/StationListModel.qml" line="96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -1538,17 +1687,37 @@
<context>
<name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Minimize</source>
<translation>Minimer</translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Maximize</source>
<translation>Maksimer</translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
<source>Remove</source>
<translation>Fjern</translation>
</message>
@@ -1583,40 +1752,34 @@
<source>experimental</source>
<translation>eksperimentell</translation>
</message>
- <message>
- <location filename="../QML/components/WSpectrum.qml" line="101"/>
- <source>Sensitivity</source>
- <translation>Sensitivitet</translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <location filename="../main.cpp" line="100"/>
+ <location filename="../main.cpp" line="111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation>Lagrer DAB-pakker (*.mp2) eller Dab+ superpakker med RS-koding (*.dab) Denne filen kan brukes til å analysere X-PAD-data med XPADxpert</translation>
</message>
<message>
- <location filename="../main.cpp" line="101"/>
- <location filename="../main.cpp" line="106"/>
+ <location filename="../main.cpp" line="112"/>
+ <location filename="../main.cpp" line="117"/>
<source>File name</source>
<translation>Filnavn</translation>
</message>
<message>
- <location filename="../main.cpp" line="105"/>
+ <location filename="../main.cpp" line="116"/>
<source>Redirects all log output texts to a file.</source>
<translation>Lagrer all konsolltekst til en fil.</translation>
</message>
<message>
- <location filename="../main.cpp" line="110"/>
+ <location filename="../main.cpp" line="121"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation>Qt Quick Controls Style for førstegangs kjøring</translation>
</message>
<message>
- <location filename="../main.cpp" line="111"/>
- <source>style_name</source>
- <translatorcomment>Unsure if this is supposed to be translated</translatorcomment>
- <translation>style_name</translation>
+ <location filename="../main.cpp" line="122"/>
+ <source>Style name</source>
+ <translation type="unfinished">Temanavn</translation>
</message>
</context>
</TS>
diff --git a/src/welle-gui/i18n/nl_NL.qm b/src/welle-gui/i18n/nl_NL.qm
index 370df5f..a5f3a3d 100644
Binary files a/src/welle-gui/i18n/nl_NL.qm and b/src/welle-gui/i18n/nl_NL.qm differ
diff --git a/src/welle-gui/i18n/nl_NL.ts b/src/welle-gui/i18n/nl_NL.ts
index 70d7df6..7f377a4 100644
--- a/src/welle-gui/i18n/nl_NL.ts
+++ b/src/welle-gui/i18n/nl_NL.ts
@@ -36,73 +36,79 @@
</message>
<message>
<location filename="../android_rtl_sdr.cpp" line="139"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
- <location filename="../gui_helper.cpp" line="65"/>
- <location filename="../gui_helper.cpp" line="654"/>
+ <location filename="../gui_helper.cpp" line="66"/>
+ <location filename="../gui_helper.cpp" line="699"/>
<source>Mi&nimize</source>
<translation>Mi&nimaliseren</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="68"/>
- <location filename="../gui_helper.cpp" line="655"/>
+ <location filename="../gui_helper.cpp" line="69"/>
+ <location filename="../gui_helper.cpp" line="700"/>
<source>Ma&ximize</source>
<translation>Ma&ximaliseren</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="71"/>
- <location filename="../gui_helper.cpp" line="656"/>
+ <location filename="../gui_helper.cpp" line="72"/>
+ <location filename="../gui_helper.cpp" line="701"/>
<source>&Restore</source>
<translation>He&rstellen</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="74"/>
- <location filename="../gui_helper.cpp" line="657"/>
+ <location filename="../gui_helper.cpp" line="75"/>
+ <location filename="../gui_helper.cpp" line="702"/>
<source>&Quit</source>
<translation>Af&sluiten</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="127"/>
- <source>version</source>
- <translation>versie</translation>
+ <location filename="../gui_helper.cpp" line="180"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="128"/>
- <source>Git revision</source>
- <translation>Git revisie</translation>
+ <location filename="../gui_helper.cpp" line="184"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="129"/>
- <source>Build on</source>
- <translation>Gemaakt op</translation>
+ <location filename="../gui_helper.cpp" line="302"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation type="unfinished">Dit programma blijft actief in de systeembalk. Om het programma af te sluiten kies "%1" in het context menu van de systeembalk ingang.</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="130"/>
- <source>QT version</source>
- <translation>QT versie</translation>
+ <location filename="../gui_helper.cpp" line="307"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished">Afsluiten</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="283"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation>Dit programma blijft actief in de systeembalk. Om het programma af te sluiten kies <b>Afsluiten</b> in het context menu van de systeembalk ingang.</translation>
+ <location filename="../gui_helper.cpp" line="181"/>
+ <source>Git revision</source>
+ <translation>Git revisie</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="778"/>
+ <location filename="../gui_helper.cpp" line="185"/>
+ <source>QT version</source>
+ <translation>QT versie</translation>
+ </message>
+ <message>
+ <location filename="../gui_helper.cpp" line="823"/>
<source> (unavailable, fallback to Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="782"/>
+ <location filename="../gui_helper.cpp" line="827"/>
<source>Style of system</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="784"/>
+ <location filename="../gui_helper.cpp" line="829"/>
<source> (Recommended)</source>
<translation type="unfinished"></translation>
</message>
@@ -115,40 +121,50 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="369"/>
+ <location filename="../radio_controller.cpp" line="255"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="276"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="405"/>
<source>RAW File</source>
<translation>RAW bestand</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="382"/>
- <location filename="../radio_controller.cpp" line="848"/>
+ <location filename="../radio_controller.cpp" line="419"/>
+ <location filename="../radio_controller.cpp" line="904"/>
<source>Scanning</source>
<translation>Scannen</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="386"/>
- <location filename="../radio_controller.cpp" line="873"/>
+ <location filename="../radio_controller.cpp" line="423"/>
+ <location filename="../radio_controller.cpp" line="929"/>
<source>Found channels</source>
<translation>Gevonden kanalen</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="406"/>
- <location filename="../radio_controller.cpp" line="627"/>
+ <location filename="../radio_controller.cpp" line="443"/>
+ <location filename="../radio_controller.cpp" line="665"/>
<source>No Station</source>
<translation>Geen station</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="602"/>
+ <location filename="../radio_controller.cpp" line="640"/>
<source>Playing last station</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="608"/>
+ <location filename="../radio_controller.cpp" line="646"/>
<source>Unknown</source>
<translation>Onbekend</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="660"/>
+ <location filename="../radio_controller.cpp" line="715"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Radio apparaat is niet klaar of bestaat niet</translation>
</message>
@@ -190,28 +206,33 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="294"/>
- <location filename="../../input/rtl_tcp.cpp" line="462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="390"/>
+ <location filename="../../input/rtl_sdr.cpp" line="402"/>
<source>RTL-SDR is unplugged.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="272"/>
+ <location filename="../../input/rtl_tcp.cpp" line="309"/>
<source>RTL-TCP connection closed.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="413"/>
+ <location filename="../../input/rtl_tcp.cpp" line="450"/>
<source>Connection failed to server </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation type="unfinished"></translation>
</message>
@@ -224,7 +245,7 @@
<translation>Start automatisch met afspelen van laatst afgespeelde station</translation>
</message>
<message>
- <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
<source>Display station name in the window title</source>
<translation type="unfinished"></translation>
</message>
@@ -997,107 +1018,107 @@
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
<source>Global settings</source>
<translation>Globale instellingen</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
<source>Full screen mode</source>
<translation>Volledigschermmodus</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
<source>Language</source>
<translation type="unfinished">Taal</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
<source>Global receiver settings</source>
<translation>Globale instellingen voor ontvanger</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
<source>Automatic RF gain</source>
<translation>Automatische RF versterking</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
<source>Manual gain</source>
<translation>Handmatige versterking</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
<source>Value: </source>
<translation>Waarde: </translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
<source>Auto detect</source>
<translation>Automatische detectie</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
<source>Airspy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
<source>rtl-sdr</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
<source>SoapySDR</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
<source>rtl-tcp</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
<source>RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
<source>Style settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
- <source>Style changed. Please restart welle.io</source>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <source>Style changed. Please restart welle.io.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
<source>Style. Restart to apply.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
<source>Light</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
@@ -1111,119 +1132,229 @@
</message>
<message>
<location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
- <message>
- <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
<source>Samples</source>
<translation>Bemonsteringen</translation>
</message>
</context>
+<context>
+ <name>InfoPage</name>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="26"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="31"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="36"/>
+ <source>Licenses</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="172"/>
+ <location filename="../QML/MainView.qml" line="138"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="139"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="284"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="289"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="290"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="421"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="462"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="463"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="474"/>
<source>Settings</source>
<translation>Instellingen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="180"/>
+ <location filename="../QML/MainView.qml" line="482"/>
<source>Expert Settings</source>
<translation>Expert instellingen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="188"/>
+ <location filename="../QML/MainView.qml" line="490"/>
<source>About</source>
<translation>Over</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="196"/>
+ <location filename="../QML/MainView.qml" line="498"/>
<source>Exit</source>
<translation>Afsluiten</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="232"/>
+ <location filename="../QML/MainView.qml" line="534"/>
<source>All stations</source>
<translation>Alle stations</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="233"/>
+ <location filename="../QML/MainView.qml" line="535"/>
<source>Favorites</source>
<translation>Favorieten</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="267"/>
+ <location filename="../QML/MainView.qml" line="566"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="567"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="575"/>
<source>Start station scan</source>
<translation>Start scan voor stations</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="279"/>
+ <location filename="../QML/MainView.qml" line="587"/>
<source>Stop station scan</source>
<translation>Stop scan voor stations</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="291"/>
+ <location filename="../QML/MainView.qml" line="599"/>
<source>Clear station list</source>
<translation>Stationslijst legen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="299"/>
+ <location filename="../QML/MainView.qml" line="607"/>
<source>Station settings</source>
<translation>Station instellingen</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="312"/>
+ <location filename="../QML/MainView.qml" line="620"/>
<source>No stations in list</source>
<translation>Geen stations in lijst</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="349"/>
+ <location filename="../QML/MainView.qml" line="634"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="764"/>
<source>Manual channel</source>
<translation>Handmatig kanaal</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="404"/>
+ <location filename="../QML/MainView.qml" line="816"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="817"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="825"/>
<source>Service Overview</source>
<translation>Service overzicht</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="410"/>
+ <location filename="../QML/MainView.qml" line="831"/>
<source>Service Details</source>
<translation>Service details</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="416"/>
+ <location filename="../QML/MainView.qml" line="837"/>
<source>MOT Slide Show</source>
<translation>MOT diashow</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="422"/>
+ <location filename="../QML/MainView.qml" line="843"/>
<source>Spectrum</source>
<translation>Spectrum</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="428"/>
+ <location filename="../QML/MainView.qml" line="849"/>
<source>Impulse Response</source>
<translation>Impulsantwoord</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="434"/>
+ <location filename="../QML/MainView.qml" line="855"/>
<source>Constellation Diagram</source>
<translation>Constellatiediagram</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="440"/>
+ <location filename="../QML/MainView.qml" line="861"/>
<source>Null Symbol</source>
<translation>Nul symbool</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="446"/>
+ <location filename="../QML/MainView.qml" line="867"/>
<source>Console Output</source>
<translation>Console uitvoer</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="452"/>
+ <location filename="../QML/MainView.qml" line="873"/>
<source>RAW Recorder</source>
<translation>RAW opname</translation>
</message>
@@ -1231,20 +1362,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="10"/>
+ <location filename="../QML/MotView.qml" line="11"/>
<source>MOT Slide Show</source>
<translation>MOT diashow</translation>
</message>
<message>
- <location filename="../QML/MotView.qml" line="27"/>
+ <location filename="../QML/MotView.qml" line="29"/>
<source>Save all images</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/MotView.qml" line="47"/>
- <source>Latest</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1253,11 +1379,6 @@
<source>Null Symbol</source>
<translation>Nul symbool</translation>
</message>
- <message>
- <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1268,8 +1389,8 @@
</message>
<message>
<location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
- <source>Enable bias tee (not from all dongles supported)</source>
- <translation>Bias tee inschakelen (niet alle dongles zijn ondersteund)</translation>
+ <source>Enable bias tee (not supported by all dongles)</source>
+ <translation type="unfinished">Bias tee inschakelen (niet alle dongles zijn ondersteund)</translation>
</message>
</context>
<context>
@@ -1321,17 +1442,17 @@
<translation>RAW bestand instellingen</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
<source>Open RAW file</source>
<translation>Open RAW bestand</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
<source>Currently shown under Android</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
<source>Selected file:</source>
<translation>Geselecteerd bestand:</translation>
</message>
@@ -1382,58 +1503,69 @@
<translation>Huidig kanaal</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
<source>Frame sync</source>
<translation>Frame sync</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
<source>FIC CRC</source>
<translation>FIC CRC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
<source>Frame errors</source>
<translation>Frame fouten</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
<source>Not synced</source>
<translation>Niet in sync</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
<source>Error</source>
<translation>Fout</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
<source>Frequency correction</source>
<translation>Frequentie correctie</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
<source>SNR</source>
<translation>SNR</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
<source>RS errors</source>
<translation>RS fouten</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
<source>AAC errors</source>
<translation>AAC fouten</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
<source>DAB date and time</source>
<translation>DAB datum en tijd</translation>
</message>
@@ -1488,10 +1620,27 @@
<source>Spectrum</source>
<translation>Spectrum</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
<message>
- <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
- <source>Amplitude</source>
- <translation>Amplitude</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StationListModel</name>
+ <message>
+ <location filename="../QML/components/StationListModel.qml" line="96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -1510,17 +1659,37 @@
<context>
<name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Minimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
<source>Remove</source>
<translation>Verwijderen</translation>
</message>
@@ -1555,38 +1724,33 @@
<source>experimental</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/components/WSpectrum.qml" line="101"/>
- <source>Sensitivity</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <location filename="../main.cpp" line="100"/>
+ <location filename="../main.cpp" line="111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation>Opname DAB pakket (*.mp2) of DAB+ superpakket met RS codering (*.dab). Dit bestand kan gebruikt worden om X-PAD data te analyseren met XPADxpert</translation>
</message>
<message>
- <location filename="../main.cpp" line="101"/>
- <location filename="../main.cpp" line="106"/>
+ <location filename="../main.cpp" line="112"/>
+ <location filename="../main.cpp" line="117"/>
<source>File name</source>
<translation>Bestandsnaam</translation>
</message>
<message>
- <location filename="../main.cpp" line="105"/>
+ <location filename="../main.cpp" line="116"/>
<source>Redirects all log output texts to a file.</source>
<translation>Stuur alle log uitvoer tekst naar een bestand</translation>
</message>
<message>
- <location filename="../main.cpp" line="110"/>
+ <location filename="../main.cpp" line="121"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="111"/>
- <source>style_name</source>
+ <location filename="../main.cpp" line="122"/>
+ <source>Style name</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/src/welle-gui/i18n/pl_PL.qm b/src/welle-gui/i18n/pl_PL.qm
index 67e256c..4352344 100644
Binary files a/src/welle-gui/i18n/pl_PL.qm and b/src/welle-gui/i18n/pl_PL.qm differ
diff --git a/src/welle-gui/i18n/pl_PL.ts b/src/welle-gui/i18n/pl_PL.ts
index 38976d7..65156bf 100644
--- a/src/welle-gui/i18n/pl_PL.ts
+++ b/src/welle-gui/i18n/pl_PL.ts
@@ -36,73 +36,79 @@
</message>
<message>
<location filename="../android_rtl_sdr.cpp" line="139"/>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
- <location filename="../gui_helper.cpp" line="65"/>
- <location filename="../gui_helper.cpp" line="654"/>
+ <location filename="../gui_helper.cpp" line="66"/>
+ <location filename="../gui_helper.cpp" line="699"/>
<source>Mi&nimize</source>
<translation>Minimalizuj</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="68"/>
- <location filename="../gui_helper.cpp" line="655"/>
+ <location filename="../gui_helper.cpp" line="69"/>
+ <location filename="../gui_helper.cpp" line="700"/>
<source>Ma&ximize</source>
<translation>Maksymalizuj</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="71"/>
- <location filename="../gui_helper.cpp" line="656"/>
+ <location filename="../gui_helper.cpp" line="72"/>
+ <location filename="../gui_helper.cpp" line="701"/>
<source>&Restore</source>
<translation>Przwróć</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="74"/>
- <location filename="../gui_helper.cpp" line="657"/>
+ <location filename="../gui_helper.cpp" line="75"/>
+ <location filename="../gui_helper.cpp" line="702"/>
<source>&Quit</source>
<translation>&Wyjście</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="127"/>
- <source>version</source>
- <translation>wersja</translation>
+ <location filename="../gui_helper.cpp" line="180"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="128"/>
- <source>Git revision</source>
- <translation>Rewizja Git'a</translation>
+ <location filename="../gui_helper.cpp" line="184"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="129"/>
- <source>Build on</source>
- <translation>Zbudowany</translation>
+ <location filename="../gui_helper.cpp" line="302"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation type="unfinished">Program będzie kontynuował pracę w zasobniku systemowym. Aby przerwać jego działanie wybierz "%1" w menu ikony w zasobniku systemowym.</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="130"/>
- <source>QT version</source>
- <translation>Wersja QT</translation>
+ <location filename="../gui_helper.cpp" line="307"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished">Wyjście</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="283"/>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation>Program będzie kontynuował pracę w zasobniku systemowym. Aby przerwać jego działanie wybierz <b>Wyjście</b> w menu ikony w zasobniku systemowym.</translation>
+ <location filename="../gui_helper.cpp" line="181"/>
+ <source>Git revision</source>
+ <translation>Rewizja Git'a</translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="778"/>
+ <location filename="../gui_helper.cpp" line="185"/>
+ <source>QT version</source>
+ <translation>Wersja QT</translation>
+ </message>
+ <message>
+ <location filename="../gui_helper.cpp" line="823"/>
<source> (unavailable, fallback to Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="782"/>
+ <location filename="../gui_helper.cpp" line="827"/>
<source>Style of system</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../gui_helper.cpp" line="784"/>
+ <location filename="../gui_helper.cpp" line="829"/>
<source> (Recommended)</source>
<translation type="unfinished"></translation>
</message>
@@ -110,13 +116,13 @@
<context>
<name>CRadioController</name>
<message>
- <location filename="../radio_controller.cpp" line="608"/>
+ <location filename="../radio_controller.cpp" line="646"/>
<source>Unknown</source>
<translation>Nieznany</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="406"/>
- <location filename="../radio_controller.cpp" line="627"/>
+ <location filename="../radio_controller.cpp" line="443"/>
+ <location filename="../radio_controller.cpp" line="665"/>
<source>No Station</source>
<translation>Brak stacji</translation>
</message>
@@ -126,29 +132,39 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="369"/>
+ <location filename="../radio_controller.cpp" line="255"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="276"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="405"/>
<source>RAW File</source>
<translation>Plik RAW</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="382"/>
- <location filename="../radio_controller.cpp" line="848"/>
+ <location filename="../radio_controller.cpp" line="419"/>
+ <location filename="../radio_controller.cpp" line="904"/>
<source>Scanning</source>
<translation>Skanowanie</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="386"/>
- <location filename="../radio_controller.cpp" line="873"/>
+ <location filename="../radio_controller.cpp" line="423"/>
+ <location filename="../radio_controller.cpp" line="929"/>
<source>Found channels</source>
<translation>Znaleziono kanałów</translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="602"/>
+ <location filename="../radio_controller.cpp" line="640"/>
<source>Playing last station</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../radio_controller.cpp" line="660"/>
+ <location filename="../radio_controller.cpp" line="715"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Urządzenie radiowe nie jest gotowe albo nie istnieje.</translation>
</message>
@@ -190,28 +206,33 @@
<translation type="unfinished">Nieznany format pliku RAW</translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="294"/>
- <location filename="../../input/rtl_tcp.cpp" line="462"/>
+ <location filename="../../input/rtl_sdr.cpp" line="142"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../input/rtl_sdr.cpp" line="390"/>
+ <location filename="../../input/rtl_sdr.cpp" line="402"/>
<source>RTL-SDR is unplugged.</source>
<translation type="unfinished">RTL-SDR jest odłączone.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="272"/>
+ <location filename="../../input/rtl_tcp.cpp" line="309"/>
<source>RTL-TCP connection closed.</source>
<translation type="unfinished">Połączenie RTL-TCP zostało zamknięte.</translation>
</message>
<message>
- <location filename="../../input/rtl_tcp.cpp" line="413"/>
+ <location filename="../../input/rtl_tcp.cpp" line="450"/>
<source>Connection failed to server </source>
<translation type="unfinished">Połączenie z serwerem nie powiodło się </translation>
</message>
<message>
- <location filename="../../input/soapy_sdr.cpp" line="91"/>
+ <location filename="../../input/soapy_sdr.cpp" line="109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation type="unfinished"></translation>
</message>
@@ -232,7 +253,7 @@
<translation>Automatycznie rozpocznij od ostatniej stacji</translation>
</message>
<message>
- <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
<source>Display station name in the window title</source>
<translation type="unfinished"></translation>
</message>
@@ -1005,107 +1026,107 @@
<context>
<name>GlobalSettings</name>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
<source>Global settings</source>
<translation>Ustawienia ogólne</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
<source>Full screen mode</source>
<translation>Tryb pełnego ekranu</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
<source>Language</source>
<translation type="unfinished">Język</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
<source>Global receiver settings</source>
<translation>Ogólne ustawienia odbiornika</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
<source>Automatic RF gain</source>
<translation>Automatyczne wzmocnienie</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
<source>Manual gain</source>
<translation>Wzmocnienie ręczne</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
<source>Value: </source>
<translation>Wartość: </translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
<source>Auto detect</source>
<translation>Detekcja automatyczna</translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
<source>Airspy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
<source>rtl-sdr</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
<source>SoapySDR</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
<source>rtl-tcp</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
<source>RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
<source>Style settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
- <source>Style changed. Please restart welle.io</source>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+ <source>Style changed. Please restart welle.io.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
<source>Style. Restart to apply.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
<source>Light</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
@@ -1119,119 +1140,229 @@
</message>
<message>
<location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
- <source>Amplitude</source>
- <translation>Amplituda</translation>
- </message>
- <message>
- <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
<source>Samples</source>
<translation>Próbki</translation>
</message>
</context>
+<context>
+ <name>InfoPage</name>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="26"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="31"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="36"/>
+ <source>Licenses</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
<context>
<name>MainView</name>
<message>
- <location filename="../QML/MainView.qml" line="172"/>
+ <location filename="../QML/MainView.qml" line="138"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="139"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="181"/>
+ <location filename="../QML/MainView.qml" line="186"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="182"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="284"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="289"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="290"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="421"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="462"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="463"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="474"/>
<source>Settings</source>
<translation>Ustawienia</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="180"/>
+ <location filename="../QML/MainView.qml" line="482"/>
<source>Expert Settings</source>
<translation>Ustawienia zaawansowane</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="188"/>
+ <location filename="../QML/MainView.qml" line="490"/>
<source>About</source>
<translation>O programie</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="196"/>
+ <location filename="../QML/MainView.qml" line="498"/>
<source>Exit</source>
<translation>Wyjście</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="232"/>
+ <location filename="../QML/MainView.qml" line="534"/>
<source>All stations</source>
<translation>Wszystkie stacje</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="233"/>
+ <location filename="../QML/MainView.qml" line="535"/>
<source>Favorites</source>
<translation>Ulubione</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="267"/>
+ <location filename="../QML/MainView.qml" line="566"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="567"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="575"/>
<source>Start station scan</source>
<translation>Rozpocznij wyszukiwanie stacji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="279"/>
+ <location filename="../QML/MainView.qml" line="587"/>
<source>Stop station scan</source>
<translation>Zakończ wyszukiwanie stacji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="291"/>
+ <location filename="../QML/MainView.qml" line="599"/>
<source>Clear station list</source>
<translation>Wyczyść listę stacji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="299"/>
+ <location filename="../QML/MainView.qml" line="607"/>
<source>Station settings</source>
<translation>Ustawienia stacji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="312"/>
+ <location filename="../QML/MainView.qml" line="620"/>
<source>No stations in list</source>
<translation>Brak stacji na liście</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="349"/>
+ <location filename="../QML/MainView.qml" line="634"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="764"/>
<source>Manual channel</source>
<translation>Ustawienia ręczne</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="404"/>
+ <location filename="../QML/MainView.qml" line="816"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="817"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/MainView.qml" line="825"/>
<source>Service Overview</source>
<translation type="unfinished">Opis audycji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="410"/>
+ <location filename="../QML/MainView.qml" line="831"/>
<source>Service Details</source>
<translation>Szczegóły transmisji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="416"/>
+ <location filename="../QML/MainView.qml" line="837"/>
<source>MOT Slide Show</source>
<translation>Pokaz slajdów</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="422"/>
+ <location filename="../QML/MainView.qml" line="843"/>
<source>Spectrum</source>
<translation>Widmo</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="428"/>
+ <location filename="../QML/MainView.qml" line="849"/>
<source>Impulse Response</source>
<translation>Impuls zwrotny</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="434"/>
+ <location filename="../QML/MainView.qml" line="855"/>
<source>Constellation Diagram</source>
<translation>Diagram konstelacji</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="440"/>
+ <location filename="../QML/MainView.qml" line="861"/>
<source>Null Symbol</source>
<translation>Symbol zerowy</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="446"/>
+ <location filename="../QML/MainView.qml" line="867"/>
<source>Console Output</source>
<translation>Wyjście konsoli</translation>
</message>
<message>
- <location filename="../QML/MainView.qml" line="452"/>
+ <location filename="../QML/MainView.qml" line="873"/>
<source>RAW Recorder</source>
<translation>Nagrywanie RAW</translation>
</message>
@@ -1239,20 +1370,15 @@
<context>
<name>MotView</name>
<message>
- <location filename="../QML/MotView.qml" line="10"/>
+ <location filename="../QML/MotView.qml" line="11"/>
<source>MOT Slide Show</source>
<translation>Pokaz slajdów</translation>
</message>
<message>
- <location filename="../QML/MotView.qml" line="27"/>
+ <location filename="../QML/MotView.qml" line="29"/>
<source>Save all images</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/MotView.qml" line="47"/>
- <source>Latest</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
@@ -1261,11 +1387,6 @@
<source>Null Symbol</source>
<translation>Symbol zerowy</translation>
</message>
- <message>
- <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
- <source>Amplitude</source>
- <translation>Amplituda</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
@@ -1276,8 +1397,8 @@
</message>
<message>
<location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
- <source>Enable bias tee (not from all dongles supported)</source>
- <translation>Włącz zasilanie anteny (nie wszystkie urządzenia to obsługują)</translation>
+ <source>Enable bias tee (not supported by all dongles)</source>
+ <translation type="unfinished">Włącz zasilanie anteny (nie wszystkie urządzenia to obsługują)</translation>
</message>
</context>
<context>
@@ -1329,17 +1450,17 @@
<translation>Ustawienia pliku RAW</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
<source>Open RAW file</source>
<translation>Otwórz plik RAW</translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
<source>Currently shown under Android</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
<source>Selected file:</source>
<translation>Wybrany plik:</translation>
</message>
@@ -1390,58 +1511,69 @@
<translation>Aktualny kanał</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
<source>Frame sync</source>
<translation>Synchronizacja ramki</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
<source>FIC CRC</source>
<translation>FIC CRC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
<source>Frame errors</source>
<translation>Błędy ramki</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
<source>OK</source>
<translation>OK</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
<source>Not synced</source>
<translation>Brak synchronizacji</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
<source>Error</source>
<translation>Błąd</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
<source>Frequency correction</source>
<translation>Korekcja częstotliwości</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
<source>SNR</source>
<translation></translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
<source>RS errors</source>
<translation>Błędy RS</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
<source>AAC errors</source>
<translation>Błędy AAC</translation>
</message>
<message>
- <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
<source>DAB date and time</source>
<translation>Data i czas DAB</translation>
</message>
@@ -1496,10 +1628,27 @@
<source>Spectrum</source>
<translation>Widmo</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
<message>
- <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
- <source>Amplitude</source>
- <translation>Amplituda</translation>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/StationDelegate.qml" line="155"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StationListModel</name>
+ <message>
+ <location filename="../QML/components/StationListModel.qml" line="96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -1518,17 +1667,37 @@
<context>
<name>ViewBaseFrame</name>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Minimize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
<source>Maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
<source>Remove</source>
<translation>Usuń</translation>
</message>
@@ -1563,38 +1732,33 @@
<source>experimental</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <location filename="../QML/components/WSpectrum.qml" line="101"/>
- <source>Sensitivity</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>main</name>
<message>
- <location filename="../main.cpp" line="101"/>
- <location filename="../main.cpp" line="106"/>
+ <location filename="../main.cpp" line="112"/>
+ <location filename="../main.cpp" line="117"/>
<source>File name</source>
<translation>Nazwa pliku</translation>
</message>
<message>
- <location filename="../main.cpp" line="100"/>
+ <location filename="../main.cpp" line="111"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation>Zapisuje ramki DAB (*.mp3) lub superramki DAB+z kodowaniem RS (*.dab). Ten plik może być użyty do analizy danych X-PAD przy pomocy XPADxpert</translation>
</message>
<message>
- <location filename="../main.cpp" line="105"/>
+ <location filename="../main.cpp" line="116"/>
<source>Redirects all log output texts to a file.</source>
<translation>Przekierowuje teksty logów do pliku.</translation>
</message>
<message>
- <location filename="../main.cpp" line="110"/>
+ <location filename="../main.cpp" line="121"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../main.cpp" line="111"/>
- <source>style_name</source>
+ <location filename="../main.cpp" line="122"/>
+ <source>Style name</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/src/welle-gui/i18n/ru_RU.qm b/src/welle-gui/i18n/ru_RU.qm
index 46073f1..9e7d98a 100644
Binary files a/src/welle-gui/i18n/ru_RU.qm and b/src/welle-gui/i18n/ru_RU.qm differ
diff --git a/src/welle-gui/i18n/ru_RU.ts b/src/welle-gui/i18n/ru_RU.ts
index a3c1bf1..d610f62 100644
--- a/src/welle-gui/i18n/ru_RU.ts
+++ b/src/welle-gui/i18n/ru_RU.ts
@@ -4,6 +4,7 @@
<context>
<name>ActivityResultReceiver</name>
<message>
+ <location filename="../android_rtl_sdr.cpp" line="+178"/>
<source>Android RTL-SDR driver is not installed</source>
<translation type="unfinished"></translation>
</message>
@@ -11,10 +12,12 @@
<context>
<name>AirspySettings</name>
<message>
+ <location filename="../QML/settingpages/AirspySettings.qml" line="+12"/>
<source>Airspy settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+15"/>
<source>Enable bias tee</source>
<translation type="unfinished"></translation>
</message>
@@ -22,159 +25,227 @@
<context>
<name>CAndroid_RTL_SDR</name>
<message>
+ <location filename="../android_rtl_sdr.cpp" line="-41"/>
<source>OK</source>
<translation type="unfinished">Ок</translation>
</message>
<message>
+ <location line="+1"/>
<source>Cancel</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+ <location line="+1"/>
+ <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CGUIHelper</name>
<message>
+ <location filename="../gui_helper.cpp" line="+66"/>
+ <location line="+633"/>
<source>Mi&nimize</source>
<translation type="unfinished">Св&ернуть</translation>
</message>
<message>
+ <location line="-630"/>
+ <location line="+631"/>
<source>Ma&ximize</source>
<translation type="unfinished">Ра&звернуть</translation>
</message>
<message>
+ <location line="-628"/>
+ <location line="+629"/>
<source>&Restore</source>
<translation type="unfinished">&Восстановить</translation>
</message>
<message>
+ <location line="-626"/>
+ <location line="+627"/>
<source>&Quit</source>
<translation type="unfinished">&Выход</translation>
</message>
<message>
- <source>version</source>
- <translation type="unfinished">версия</translation>
- </message>
- <message>
+ <location line="-521"/>
<source>Git revision</source>
<translation type="unfinished">Git ревизия</translation>
</message>
<message>
- <source>Build on</source>
- <translation type="unfinished">Выпуск</translation>
- </message>
- <message>
+ <location line="+4"/>
<source>QT version</source>
<translation type="unfinished">Версия QT</translation>
</message>
<message>
- <source>The program will keep running in the system tray. To terminate the program, choose <b>Quit</b> in the context menu of the system tray entry.</source>
- <translation type="unfinished">Программа будет продолжать работать в системном трее. Чтобы завершить программу, выберите <b>Выход</b> в контекстном меню программы в системном трее.</translation>
- </message>
- <message>
+ <location line="+638"/>
<source> (unavailable, fallback to Default)</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+4"/>
<source>Style of system</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+2"/>
<source> (Recommended)</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location line="-649"/>
+ <source>welle.io version</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+4"/>
+ <source>Built on</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+118"/>
+ <source>The program will keep running in the system tray. To terminate the program, choose "%1" in the context menu of the system tray entry.</source>
+ <translation type="unfinished">Программа будет продолжать работать в системном трее. Чтобы завершить программу, выберите "%1" в контекстном меню программы в системном трее.</translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Quit</source>
+ <extracomment>"Quit" translation should be the same as the one of system tray</extracomment>
+ <translation type="unfinished">Выход</translation>
+ </message>
</context>
<context>
<name>CRadioController</name>
<message>
+ <location filename="../radio_controller.cpp" line="+646"/>
<source>Unknown</source>
<translation>Неизвестный</translation>
</message>
<message>
+ <location line="-203"/>
+ <location line="+222"/>
<source>No Station</source>
<translation>Нет каналов</translation>
</message>
<message>
+ <location line="-260"/>
<source>RAW File</source>
<translation>RAW файл</translation>
</message>
<message>
+ <location line="+14"/>
+ <location line="+485"/>
<source>Scanning</source>
<translation>Сканирование</translation>
</message>
<message>
+ <location line="-481"/>
+ <location line="+506"/>
<source>Found channels</source>
<translation>Найдено каналов</translation>
</message>
<message>
+ <location line="-214"/>
<source>Radio device is not ready or does not exist.</source>
<translation>Устройство не работает или отключено.</translation>
</message>
<message>
+ <location filename="../../input/airspy_sdr.cpp" line="+152"/>
<source>airspy is unplugged.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../input/input_factory.cpp" line="+79"/>
<source>No valid device found use Null device instead.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+2"/>
+ <location line="+43"/>
<source>Error while opening device</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../input/raw_file.cpp" line="+177"/>
+ <location line="+20"/>
<source>Cannot open file </source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+113"/>
<source>End of file, restarting</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+3"/>
<source>End of file</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+88"/>
<source>Unknown RAW file format</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../input/rtl_sdr.cpp" line="+306"/>
+ <location filename="../../input/rtl_tcp.cpp" line="+549"/>
<source>ADC overload. Maybe you are using a too high gain.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+96"/>
<source>RTL-SDR is unplugged.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../input/rtl_tcp.cpp" line="-240"/>
<source>RTL-TCP connection closed.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+141"/>
<source>Connection failed to server </source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../input/soapy_sdr.cpp" line="+109"/>
<source>Could not load SoapySDR with provided device arguments.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../radio_controller.cpp" line="-563"/>
<source>Error while opening file </source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+488"/>
<source>Playing last station</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../../input/rtl_sdr.cpp" line="-260"/>
+ <source>Error opening RTL-SDR. See log for details.</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../radio_controller.cpp" line="-385"/>
+ <source>Playback failed</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+21"/>
+ <source>Stopped</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>ChannelSettings</name>
<message>
+ <location filename="../QML/settingpages/ChannelSettings.qml" line="+29"/>
<source>Automatic start playing last station</source>
<translation>Автоматически начинать воспроизведение последнего канала</translation>
</message>
<message>
+ <location line="+8"/>
<source>Display station name in the window title</source>
<translation type="unfinished"></translation>
</message>
@@ -182,14 +253,17 @@
<context>
<name>ConstellationGraph</name>
<message>
+ <location filename="../QML/expertviews/ConstellationGraph.qml" line="+10"/>
<source>Constellation Diagram</source>
<translation type="unfinished">Диаграмма созвездий</translation>
</message>
<message>
+ <location line="+30"/>
<source>DQPSK Angle [Degree]</source>
<translation type="unfinished">ДКФМ угол (градусы)</translation>
</message>
<message>
+ <location line="+7"/>
<source>Subcarrier</source>
<translation type="unfinished">Поднесущая</translation>
</message>
@@ -197,542 +271,678 @@
<context>
<name>DABConstants</name>
<message>
+ <location filename="../../backend/dab-constants.cpp" line="+184"/>
<source>News</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Current Affairs</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Sport</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Education</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Drama</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Arts</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Science</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Talk</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Pop Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Rock Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Easy Listening</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Light classical</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Classical Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Other Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Weather</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Finance</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Children's</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Factual</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Religion</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Phone In</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Travel</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Leisure</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Jazz and Blues</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Country Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>National Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Oldies Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Folk Music</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Documentary</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>entry 30 not used</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>entry 31 not used</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
+ <location line="+117"/>
<source>UNKNOWN</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="-103"/>
<source>Albanian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Breton</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Catalan</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Croatian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Welsh</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Czech</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Danish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>German</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>English</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Spanish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Esperanto</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Estonian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Basque</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Faroese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>French</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Frisian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Irish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Gaelic</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Galician</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Icelandic</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Italian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Lappish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Latin</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Latvian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Luxembourgian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Lithuanian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Hungarian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Maltese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Dutch</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Norwegian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Occitan</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Polish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Portuguese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Romanian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Romansh</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Serbian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Slovak</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Slovene</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Finnish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Swedish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Turkish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Flemish</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Walloon</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Background sound/clean feed</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Zulu</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Vietnamese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Uzbek</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Urdu</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Ukranian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Thai</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Telugu</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Tatar</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Tamil</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Tadzhik</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Swahili</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Sranan Tongo</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Somali</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Sinhalese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Shona</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Serbo-Croat</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Rusyn</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Russian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Quechua</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Pushtu</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Punjabi</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Persian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Papiamento</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Oriya</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Nepali</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Ndebele</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Marathi</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Moldavian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Malaysian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Malagasay</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Macedonian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Laotian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Korean</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Khmer</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Kazakh</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Kannada</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Japanese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Indonesian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Hindi</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Hebrew</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Hausa</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Gurani</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Gujurati</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Greek</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Georgian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Fulani</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Dari</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Chuvash</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Chinese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Burmese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Bulgarian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Bengali</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Belorussian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Bambora</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Azerbaijani</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Assamese</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Armenian</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Arabic</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Amharic</source>
<translation type="unfinished"></translation>
</message>
@@ -740,54 +950,67 @@
<context>
<name>ExpertSettings</name>
<message>
+ <location filename="../QML/settingpages/ExpertSettings.qml" line="+33"/>
<source>Global</source>
<translation type="unfinished">Основные параметры</translation>
</message>
<message>
+ <location line="+4"/>
<source>Expert mode</source>
<translation type="unfinished">Расширенный режим</translation>
</message>
<message>
+ <location line="+6"/>
<source>Backend</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+7"/>
<source>Enable coarse corrector (for receivers with >1kHz error)</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+17"/>
<source>GetMiddle</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>CorrelatePRS</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>PatternOfZeros</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+12"/>
<source>Coarse corrector algorithm</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+8"/>
<source>Enable TII decoding to console log (increases CPU usage)</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+16"/>
<source>Strongest Peak</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Earliest Peak With Binning</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Threshold Before Peak</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+12"/>
<source>FFT Window placement algorithm</source>
<translation type="unfinished"></translation>
</message>
@@ -795,252 +1018,410 @@
<context>
<name>GlobalSettings</name>
<message>
+ <location filename="../QML/settingpages/GlobalSettings.qml" line="+75"/>
<source>Full screen mode</source>
<translation>Полноэкранный режим</translation>
</message>
<message>
+ <location line="+44"/>
<source>Automatic RF gain</source>
<translation>Автоматический уровень</translation>
</message>
<message>
+ <location line="+20"/>
<source>Manual gain</source>
<translation>Ручной уровень</translation>
</message>
<message>
+ <location line="+6"/>
<source>Value: </source>
<translation>Значение: </translation>
</message>
<message>
+ <location line="-74"/>
<source>Global settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+37"/>
<source>Language</source>
<translation type="unfinished">Язык</translation>
</message>
<message>
+ <location line="+7"/>
<source>Global receiver settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+55"/>
<source>Auto detect</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+17"/>
<source>None</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Airspy</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>rtl-sdr</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>SoapySDR</source>
<translation type="unfinished">Параметры SoapySDR</translation>
</message>
<message>
+ <location line="+1"/>
<source>rtl-tcp</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+38"/>
<source>Style settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Style changed. Please restart welle.io</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
+ <location line="+17"/>
<source>Style. Restart to apply.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+13"/>
<source>Light</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Dark</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>System</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+4"/>
<source>Theme</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location line="-24"/>
+ <source>Style changed. Please restart welle.io.</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>ImpulseResponseGraph</name>
<message>
+ <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="+12"/>
<source>Impulse Response</source>
<translation type="unfinished">Импульсная характеристика</translation>
</message>
<message>
- <source>Amplitude</source>
- <translation type="unfinished">Амплитуда</translation>
- </message>
- <message>
+ <location line="+11"/>
<source>Samples</source>
<translation type="unfinished">Отсчеты</translation>
</message>
</context>
+<context>
+ <name>InfoPage</name>
+ <message>
+ <location filename="../QML/InfoPage.qml" line="+21"/>
+ <source>Versions</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Authors</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Thanks</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Licenses</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
<context>
<name>MainView</name>
<message>
+ <location filename="../QML/MainView.qml" line="+474"/>
<source>Settings</source>
<translation>Настройки</translation>
</message>
<message>
+ <location line="+8"/>
<source>Expert Settings</source>
<translation>Расширенные настройки</translation>
</message>
<message>
+ <location line="+8"/>
<source>About</source>
<translation>О программе</translation>
</message>
<message>
+ <location line="+8"/>
<source>Exit</source>
<translation>Выход</translation>
</message>
<message>
+ <location line="+36"/>
<source>All stations</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+40"/>
<source>Start station scan</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+12"/>
<source>Stop station scan</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+12"/>
<source>Clear station list</source>
<translation type="unfinished">Очистка списка каналов</translation>
</message>
<message>
+ <location line="+8"/>
<source>Station settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+13"/>
<source>No stations in list</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+144"/>
<source>Manual channel</source>
<translation type="unfinished">Ручной поиск</translation>
</message>
<message>
+ <location line="+61"/>
<source>Service Overview</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Service Details</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>MOT Slide Show</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Spectrum</source>
<translation type="unfinished">Спектральная диаграмма</translation>
</message>
<message>
+ <location line="+6"/>
<source>Impulse Response</source>
<translation type="unfinished">Импульсная характеристика</translation>
</message>
<message>
+ <location line="+6"/>
<source>Constellation Diagram</source>
<translation type="unfinished">Диаграмма созвездий</translation>
</message>
<message>
+ <location line="+6"/>
<source>Null Symbol</source>
<translation type="unfinished">Пустой символ</translation>
</message>
<message>
+ <location line="+6"/>
<source>Console Output</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>RAW Recorder</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location line="-735"/>
+ <source>Stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Display or hide stations list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+42"/>
+ <location line="+5"/>
+ <source>Stop</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-5"/>
+ <location line="+5"/>
+ <source>Play</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-4"/>
+ <source>Stop playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Stop scan</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Start playback</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+102"/>
+ <source>Volume (%1)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+5"/>
+ <source>Volume</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Toggle volume slider</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+131"/>
+ <source>Volume set to %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+41"/>
+ <source>Main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show the main menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+103"/>
+ <source>Stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show stations menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+67"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+182"/>
+ <source>Add</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Add a view</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>MotView</name>
<message>
+ <location filename="../QML/MotView.qml" line="+11"/>
<source>MOT Slide Show</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+18"/>
<source>Save all images</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Latest</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>NullSymbolGraph</name>
<message>
+ <location filename="../QML/expertviews/NullSymbolGraph.qml" line="+10"/>
<source>Null Symbol</source>
<translation type="unfinished">Пустой символ</translation>
</message>
- <message>
- <source>Amplitude</source>
- <translation type="unfinished">Амплитуда</translation>
- </message>
</context>
<context>
<name>RTLSDRSettings</name>
<message>
+ <location filename="../QML/settingpages/RTLSDRSettings.qml" line="+12"/>
<source>rtl-sdr settings</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>Enable bias tee (not from all dongles supported)</source>
+ <location line="+9"/>
+ <source>Enable bias tee (not supported by all dongles)</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>RTLTCPSettings</name>
<message>
+ <location filename="../QML/settingpages/RTLTCPSettings.qml" line="+11"/>
<source>rtl-tcp settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+16"/>
<source>Use host name</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+10"/>
<source>IP address</source>
<translation type="unfinished">IP адрес</translation>
</message>
<message>
+ <location line="+31"/>
<source>IP port</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+16"/>
<source>Enter host name</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+4"/>
<source>Host name</source>
<translation type="unfinished"></translation>
</message>
@@ -1048,6 +1429,7 @@
<context>
<name>RadioView</name>
<message>
+ <location filename="../QML/RadioView.qml" line="+12"/>
<source>Service Overview</source>
<translation type="unfinished"></translation>
</message>
@@ -1055,18 +1437,22 @@
<context>
<name>RawFileSettings</name>
<message>
+ <location filename="../QML/settingpages/RawFileSettings.qml" line="+12"/>
<source>RAW file settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+30"/>
<source>Open RAW file</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+4"/>
<source>Currently shown under Android</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+23"/>
<source>Selected file:</source>
<translation type="unfinished"></translation>
</message>
@@ -1074,22 +1460,27 @@
<context>
<name>RawRecorder</name>
<message>
+ <location filename="../QML/expertviews/RawRecorder.qml" line="+11"/>
<source>I/Q RAW Recorder (experimental)</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+8"/>
<source>Ring buffer length [s]</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+14"/>
<source>Save ring buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+0"/>
<source>Init</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+14"/>
<source>Ring buffer size (roughly): </source>
<translation type="unfinished"></translation>
</message>
@@ -1097,93 +1488,127 @@
<context>
<name>ServiceDetails</name>
<message>
+ <location filename="../QML/expertviews/ServiceDetails.qml" line="+10"/>
<source>Service Details</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+7"/>
<source>Device</source>
<translation type="unfinished">Устройство</translation>
</message>
<message>
+ <location line="+5"/>
<source>Current channel</source>
<translation type="unfinished">Текущий канал</translation>
</message>
<message>
+ <location line="+22"/>
<source>Frame sync</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+1"/>
+ <location line="+14"/>
+ <location line="+33"/>
<source>OK</source>
<translation type="unfinished">Ок</translation>
</message>
<message>
+ <location line="-47"/>
<source>Not synced</source>
<translation type="unfinished">Не синхронизировано</translation>
</message>
<message>
+ <location line="+13"/>
<source>FIC CRC</source>
<translation type="unfinished">FIC CRC</translation>
</message>
<message>
+ <location line="+1"/>
<source>Error</source>
<translation type="unfinished">Ошибка</translation>
</message>
<message>
+ <location line="+14"/>
<source>Frame errors</source>
<translation type="unfinished">Ошибки кадра</translation>
</message>
<message>
+ <location line="-46"/>
<source>Frequency correction</source>
<translation type="unfinished">Коррекция частоты</translation>
</message>
<message>
+ <location line="+5"/>
<source>SNR</source>
<translation type="unfinished">Шум</translation>
</message>
<message>
+ <location line="+57"/>
<source>RS errors</source>
<translation type="unfinished">Ошибки RS</translation>
</message>
<message>
+ <location line="+16"/>
<source>AAC errors</source>
<translation type="unfinished">Ошибки AAC</translation>
</message>
<message>
+ <location line="+6"/>
<source>DAB date and time</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location line="-18"/>
+ <source>Corrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+0"/>
+ <source>Uncorrected Error</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>SoapySDRSettings</name>
<message>
+ <location filename="../QML/settingpages/SoapySDRSettings.qml" line="+11"/>
<source>SoapySDR settings</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+13"/>
<source>Antenna</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Enter antenna</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Clock source</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Enter clock source</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Driver arguments</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Enter driver arguments</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+6"/>
<source>Apply</source>
<translation type="unfinished"></translation>
</message>
@@ -1191,21 +1616,42 @@
<context>
<name>SpectrumGraph</name>
<message>
+ <location filename="../QML/expertviews/SpectrumGraph.qml" line="+12"/>
<source>Spectrum</source>
<translation type="unfinished">Спектральная диаграмма</translation>
</message>
+</context>
+<context>
+ <name>StationDelegate</name>
+ <message>
+ <location filename="../QML/components/StationDelegate.qml" line="+155"/>
+ <source>Remove station from favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
<message>
- <source>Amplitude</source>
- <translation type="unfinished">Амплитуда</translation>
+ <location line="+0"/>
+ <source>Add station to favorites</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>StationListModel</name>
+ <message>
+ <location filename="../QML/components/StationListModel.qml" line="+96"/>
+ <source>Last played station not found.
+Select a station to start playback.</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TextOutputView</name>
<message>
+ <location filename="../QML/expertviews/TextOutputView.qml" line="+11"/>
<source>Console Output</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+58"/>
<source>Warning: The console view can slow down the complete app!</source>
<translation type="unfinished"></translation>
</message>
@@ -1213,21 +1659,45 @@
<context>
<name>ViewBaseFrame</name>
<message>
+ <location filename="../QML/components/ViewBaseFrame.qml" line="+130"/>
<source>Minimize</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+0"/>
<source>Maximize</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+9"/>
<source>Remove</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location line="-70"/>
+ <source>%1 title bar</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>%1 title bar to drag the element</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+48"/>
+ <source>%1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Show %1 menu</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>WDialog</name>
<message>
+ <location filename="../QML/components/WDialog.qml" line="+32"/>
<source>‹</source>
<translation type="unfinished"></translation>
</message>
@@ -1235,46 +1705,52 @@
<context>
<name>WSpectrum</name>
<message>
+ <location filename="../QML/components/WSpectrum.qml" line="+15"/>
<source>Amplitude</source>
<translation type="unfinished">Амплитуда</translation>
</message>
<message>
+ <location line="+1"/>
<source>Frequency</source>
<translation type="unfinished">Частота</translation>
</message>
<message>
+ <location line="+23"/>
<source>Waterfall</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+0"/>
<source>experimental</source>
<translation type="unfinished"></translation>
</message>
- <message>
- <source>Sensitivity</source>
- <translation type="unfinished"></translation>
- </message>
</context>
<context>
<name>main</name>
<message>
+ <location filename="../main.cpp" line="+112"/>
+ <location line="+5"/>
<source>File name</source>
<translation>Имя файла</translation>
</message>
<message>
+ <location line="-1"/>
<source>Redirects all log output texts to a file.</source>
<translation>Сохранить все логи в файл.</translation>
</message>
<message>
+ <location line="-5"/>
<source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="+10"/>
<source>Qt Quick Controls Style for the 1st launch</source>
<translation type="unfinished"></translation>
</message>
<message>
- <source>style_name</source>
+ <location line="+1"/>
+ <source>Style name</source>
<translation type="unfinished"></translation>
</message>
</context>
diff --git a/src/welle-gui/icons/111476-media-and-technology.zip b/src/welle-gui/icons/111476-media-and-technology.zip
new file mode 100644
index 0000000..bb39371
Binary files /dev/null and b/src/welle-gui/icons/111476-media-and-technology.zip differ
diff --git a/src/welle-gui/icons/111476-media-and-technology_README.txt b/src/welle-gui/icons/111476-media-and-technology_README.txt
new file mode 100644
index 0000000..186f997
--- /dev/null
+++ b/src/welle-gui/icons/111476-media-and-technology_README.txt
@@ -0,0 +1,3 @@
+Source: 111476-media-and-technology.zip
+
+<div>Icons made by <a href="https://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></div>
diff --git a/src/welle-gui/icons/welle_io_icons/074-music.svg b/src/welle-gui/icons/welle_io_icons/074-music.svg
new file mode 100644
index 0000000..6ffa1d4
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/074-music.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 284.707 284.707" style="enable-background:new 0 0 284.707 284.707;" xml:space="preserve">
+<g>
+ <path style="fill:#000002;" d="M40.013,71.088H17.5c-9.649,0-17.5,7.851-17.5,17.5v95.171c0,9.649,7.851,17.5,17.5,17.5h22.513
+ c9.649,0,17.5-7.851,17.5-17.5V88.588C57.513,78.938,49.662,71.088,40.013,71.088z M42.513,183.759c0,1.355-1.145,2.5-2.5,2.5H17.5
+ c-1.355,0-2.5-1.145-2.5-2.5V88.588c0-1.355,1.145-2.5,2.5-2.5h22.513c1.355,0,2.5,1.145,2.5,2.5V183.759z"/>
+ <path style="fill:#000002;" d="M213.249,139.6c-8.322,0-16.309,1.444-23.743,4.071V15.628c0-5.457-2.327-9.851-6.385-12.054
+ c-4.058-2.204-9.01-1.762-13.586,1.211L80.002,62.939C73.273,67.309,68.2,76.654,68.2,84.676v102.995
+ c0,8.021,5.073,17.367,11.801,21.737l89.777,58.312c12.053,9.27,27.125,14.799,43.47,14.799c39.402,0,71.458-32.056,71.458-71.459
+ C284.707,171.656,252.651,139.6,213.249,139.6z M269.707,211.059c0,12.696-4.215,24.426-11.315,33.867l-79.01-79.01
+ c9.441-7.101,21.171-11.316,33.868-11.316C244.38,154.6,269.707,179.927,269.707,211.059z M83.2,187.671V84.676
+ c0-2.936,2.509-7.558,4.972-9.158l86.334-56.075v131.619c-19.667,12.744-32.716,34.868-32.716,59.997
+ c0,8.082,1.368,15.847,3.852,23.097l-57.47-37.328C85.71,195.229,83.2,190.607,83.2,187.671z M186.696,260.867
+ c-0.192-0.154-0.394-0.301-0.605-0.438l-7.669-4.981c-13.157-10.346-21.632-26.391-21.632-44.388
+ c0-13.038,4.454-25.048,11.905-34.616l79.171,79.17c-9.568,7.451-21.578,11.905-34.616,11.905
+ C203.655,267.518,194.616,265.106,186.696,260.867z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/090-sound.svg b/src/welle-gui/icons/welle_io_icons/090-sound.svg
new file mode 100644
index 0000000..41b71e4
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/090-sound.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 284.318 284.318" style="enable-background:new 0 0 284.318 284.318;" xml:space="preserve">
+<g>
+ <path style="fill:#000002;" d="M260.494,68.611c-2.574-3.244-7.292-3.788-10.537-1.213c-3.245,2.575-3.788,7.292-1.213,10.537
+ c12.499,15.75,20.574,40.858,20.574,63.964c0,23.321-8.224,48.618-20.952,64.447c-2.596,3.227-2.083,7.948,1.145,10.544
+ c1.385,1.114,3.045,1.656,4.695,1.656c2.194,0,4.368-0.958,5.85-2.801c14.739-18.329,24.263-47.315,24.263-73.846
+ C284.318,115.617,274.967,86.849,260.494,68.611z"/>
+ <path style="fill:#000002;" d="M211.401,92.064c-3.245,2.575-3.788,7.292-1.214,10.537c6.959,8.771,12.01,25.34,12.01,39.397
+ c0,14.181-5.145,30.869-12.233,39.68c-2.596,3.228-2.085,7.948,1.143,10.545c1.386,1.115,3.046,1.657,4.696,1.657
+ c2.193,0,4.367-0.958,5.849-2.799c10.739-13.349,15.546-34.27,15.546-49.082c0-14.677-4.718-35.434-15.259-48.72
+ C219.362,90.033,214.646,89.49,211.401,92.064z"/>
+ <path style="fill:#000002;" d="M177.606,8.181c-2.711,0-5.427,0.871-8.073,2.59L80,68.925c-6.728,4.37-11.801,13.715-11.801,21.737
+ v102.995c0,8.023,5.073,17.367,11.801,21.737l89.533,58.153c2.645,1.719,5.361,2.59,8.073,2.59c5.913,0,11.899-4.614,11.899-13.433
+ V21.614C189.505,12.795,183.519,8.181,177.606,8.181z M174.505,258.889l-86.334-56.075c-2.462-1.6-4.972-6.221-4.972-9.158V90.661
+ c0-2.936,2.509-7.558,4.972-9.158l86.334-56.075V258.889z"/>
+ <path style="fill:#000002;" d="M40.012,77.074H17.5c-9.649,0-17.5,7.851-17.5,17.5v95.171c0,9.649,7.851,17.5,17.5,17.5h22.512
+ c9.649,0,17.5-7.851,17.5-17.5V94.574C57.512,84.924,49.661,77.074,40.012,77.074z M42.512,189.744c0,1.355-1.145,2.5-2.5,2.5H17.5
+ c-1.355,0-2.5-1.145-2.5-2.5V94.574c0-1.355,1.145-2.5,2.5-2.5h22.512c1.355,0,2.5,1.145,2.5,2.5V189.744z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/136-stop button.svg b/src/welle-gui/icons/welle_io_icons/136-stop button.svg
new file mode 100644
index 0000000..c69e634
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/136-stop button.svg
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 265.405 265.405" style="enable-background:new 0 0 265.405 265.405;" xml:space="preserve">
+<g>
+ <path style="fill:#000002;" d="M132.703,0C59.53,0,0,59.53,0,132.702s59.53,132.702,132.703,132.702
+ c73.172,0,132.702-59.53,132.702-132.702S205.875,0,132.703,0z M132.703,250.405C67.801,250.405,15,197.604,15,132.702
+ S67.801,15,132.703,15c64.901,0,117.702,52.801,117.702,117.702S197.604,250.405,132.703,250.405z"/>
+ <path style="fill:#000002;" d="M174.816,73.089H90.589c-9.649,0-17.5,7.851-17.5,17.5v84.227c0,9.649,7.851,17.5,17.5,17.5h84.227
+ c9.649,0,17.5-7.851,17.5-17.5V90.589C192.316,80.94,184.465,73.089,174.816,73.089z M177.316,174.816c0,1.355-1.145,2.5-2.5,2.5
+ H90.589c-1.355,0-2.5-1.145-2.5-2.5V90.589c0-1.355,1.145-2.5,2.5-2.5h84.227c1.355,0,2.5,1.145,2.5,2.5V174.816z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/147-play arrow.svg b/src/welle-gui/icons/welle_io_icons/147-play arrow.svg
new file mode 100644
index 0000000..35068cc
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/147-play arrow.svg
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 265.404 265.404" style="enable-background:new 0 0 265.404 265.404;" xml:space="preserve">
+<g>
+ <path style="fill:#000002;" d="M194.172,123.684l-78.081-51.122c-1.921-1.257-4.032-1.922-6.106-1.922
+ c-5.521,0-9.686,4.496-9.686,10.458v103.207c0,5.962,4.164,10.458,9.685,10.458c2.075,0,4.187-0.665,6.106-1.923l78.082-51.129
+ c3.251-2.129,5.117-5.415,5.116-9.014C199.289,129.098,197.424,125.814,194.172,123.684z M115.3,175.429V89.973l65.256,42.725
+ L115.3,175.429z"/>
+ <path style="fill:#000002;" d="M132.702,0.001C59.53,0.001,0,59.53,0,132.702c0,73.172,59.53,132.702,132.702,132.702
+ s132.702-59.53,132.702-132.702C265.404,59.53,205.875,0.001,132.702,0.001z M132.702,250.404
+ C67.801,250.404,15,197.603,15,132.702C15,67.801,67.801,15.001,132.702,15.001s117.702,52.8,117.702,117.701
+ C250.404,197.603,197.604,250.404,132.702,250.404z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/play.png b/src/welle-gui/icons/welle_io_icons/20x20/play.png
new file mode 100644
index 0000000..49b44ad
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20/speaker.png
index 804be4a..8a979fa 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png
index f7a7184..08c5d25 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/stop.png b/src/welle-gui/icons/welle_io_icons/20x20/stop.png
new file mode 100644
index 0000000..1943f36
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/play.png b/src/welle-gui/icons/welle_io_icons/20x20@2/play.png
new file mode 100644
index 0000000..1d91f0e
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@2/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png
index b5b4e10..3c1cd29 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png
index 8ebd1f7..eba6a96 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/stop.png b/src/welle-gui/icons/welle_io_icons/20x20@2/stop.png
new file mode 100644
index 0000000..2e01bb4
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@2/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/play.png b/src/welle-gui/icons/welle_io_icons/20x20@3/play.png
new file mode 100644
index 0000000..2ee1622
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@3/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png
index ec0ca18..712e35b 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png
index b3c8457..0dd5cae 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/stop.png b/src/welle-gui/icons/welle_io_icons/20x20@3/stop.png
new file mode 100644
index 0000000..f6b80fd
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@3/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/play.png b/src/welle-gui/icons/welle_io_icons/20x20@4/play.png
new file mode 100644
index 0000000..cc5e58d
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@4/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png
index 7dabce0..eb93744 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png
index aa78bcf..49c92d1 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/stop.png b/src/welle-gui/icons/welle_io_icons/20x20@4/stop.png
new file mode 100644
index 0000000..2d32223
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@4/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/speaker.svg b/src/welle-gui/icons/welle_io_icons/speaker.svg
deleted file mode 100644
index 996421e..0000000
--- a/src/welle-gui/icons/welle_io_icons/speaker.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 52.026 52.026" style="enable-background:new 0 0 52.026 52.026;" xml:space="preserve">
-<g>
- <path d="M28.404,3.413c-0.976-0.552-2.131-0.534-3.09,0.044c-0.046,0.027-0.09,0.059-0.13,0.093L11.634,15.013H1
- c-0.553,0-1,0.447-1,1v19c0,0.266,0.105,0.52,0.293,0.707S0.734,36.013,1,36.013l10.61-0.005l13.543,12.44
- c0.05,0.046,0.104,0.086,0.161,0.12c0.492,0.297,1.037,0.446,1.582,0.446c0.517-0.001,1.033-0.134,1.508-0.402
- C29.403,48.048,30,47.018,30,45.857V6.169C30,5.008,29.403,3.978,28.404,3.413z M28,45.857c0,0.431-0.217,0.81-0.579,1.015
- c-0.155,0.087-0.548,0.255-1,0.026L13,34.569v-4.556c0-0.553-0.447-1-1-1s-1,0.447-1,1v3.996l-9,0.004v-17h9v4c0,0.553,0.447,1,1,1
- s1-0.447,1-1v-4.536l13.405-11.34c0.461-0.242,0.86-0.07,1.016,0.018C27.783,5.36,28,5.739,28,6.169V45.857z"/>
- <path d="M38.797,7.066c-0.523-0.177-1.091,0.103-1.269,0.626c-0.177,0.522,0.103,1.091,0.626,1.269
- c7.101,2.411,11.872,9.063,11.872,16.553c0,7.483-4.762,14.136-11.849,16.554c-0.522,0.178-0.802,0.746-0.623,1.27
- c0.142,0.415,0.53,0.677,0.946,0.677c0.107,0,0.216-0.017,0.323-0.054c7.896-2.693,13.202-10.106,13.202-18.446
- C52.026,17.166,46.71,9.753,38.797,7.066z"/>
- <path d="M43.026,25.513c0-5.972-4.009-11.302-9.749-12.962c-0.533-0.151-1.084,0.152-1.238,0.684
- c-0.153,0.53,0.152,1.085,0.684,1.238c4.889,1.413,8.304,5.953,8.304,11.04s-3.415,9.627-8.304,11.04
- c-0.531,0.153-0.837,0.708-0.684,1.238c0.127,0.438,0.526,0.723,0.961,0.723c0.092,0,0.185-0.013,0.277-0.039
- C39.018,36.815,43.026,31.485,43.026,25.513z"/>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/speaker_mute.svg b/src/welle-gui/icons/welle_io_icons/speaker_mute.svg
deleted file mode 100644
index 666c7a3..0000000
--- a/src/welle-gui/icons/welle_io_icons/speaker_mute.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- version="1.1"
- id="Capa_1"
- x="0px"
- y="0px"
- viewBox="0 0 54 54"
- style="enable-background:new 0 0 54 54;"
- xml:space="preserve"
- sodipodi:docname="speaker_mute.svg"
- inkscape:export-filename="/home/albrecht/src/welle.io_next/src/gui/icon/welle_io_icons/20x20@4/speaker_mute.png"
- inkscape:export-xdpi="142.22223"
- inkscape:export-ydpi="142.22223"
- inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
- id="metadata88"><rdf:RDF><cc:Work
- rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
- id="defs86" /><sodipodi:namedview
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1"
- objecttolerance="10"
- gridtolerance="10"
- guidetolerance="10"
- inkscape:pageopacity="0"
- inkscape:pageshadow="2"
- inkscape:window-width="1853"
- inkscape:window-height="1025"
- id="namedview84"
- showgrid="false"
- inkscape:zoom="4.3703704"
- inkscape:cx="27"
- inkscape:cy="27"
- inkscape:window-x="67"
- inkscape:window-y="27"
- inkscape:window-maximized="1"
- inkscape:current-layer="Capa_1" />
-<g
- id="g51">
- <path
- d="M46.414,26l7.293-7.293c0.391-0.391,0.391-1.023,0-1.414s-1.023-0.391-1.414,0L45,24.586l-7.293-7.293 c-0.391-0.391-1.023-0.391-1.414,0s-0.391,1.023,0,1.414L43.586,26l-7.293,7.293c-0.391,0.391-0.391,1.023,0,1.414 C36.488,34.902,36.744,35,37,35s0.512-0.098,0.707-0.293L45,27.414l7.293,7.293C52.488,34.902,52.744,35,53,35 s0.512-0.098,0.707-0.293c0.391-0.391,0.391-1.023,0-1.414L46.414,26z"
- id="path47" />
- <path
- d="M28.404,4.4c-0.975-0.552-2.131-0.534-3.09,0.044c-0.046,0.027-0.09,0.059-0.13,0.093L11.634,16H1c-0.553,0-1,0.447-1,1v19 c0,0.266,0.105,0.52,0.293,0.707S0.734,37,1,37l10.61-0.005l13.543,12.44c0.05,0.046,0.104,0.086,0.161,0.12 c0.492,0.297,1.037,0.446,1.582,0.446c0.517-0.001,1.033-0.134,1.508-0.402C29.403,49.035,30,48.005,30,46.844V7.156 C30,5.995,29.403,4.965,28.404,4.4z M28,46.844c0,0.431-0.217,0.81-0.579,1.015c-0.155,0.087-0.548,0.255-1,0.026L13,35.556V31 c0-0.553-0.447-1-1-1s-1,0.447-1,1v3.996L2,35V18h9v4c0,0.553,0.447,1,1,1s1-0.447,1-1v-4.536l13.405-11.34 c0.46-0.242,0.86-0.07,1.016,0.018C27.783,6.347,28,6.725,28,7.156V46.844z"
- id="path49" />
-</g>
-<g
- id="g53">
-</g>
-<g
- id="g55">
-</g>
-<g
- id="g57">
-</g>
-<g
- id="g59">
-</g>
-<g
- id="g61">
-</g>
-<g
- id="g63">
-</g>
-<g
- id="g65">
-</g>
-<g
- id="g67">
-</g>
-<g
- id="g69">
-</g>
-<g
- id="g71">
-</g>
-<g
- id="g73">
-</g>
-<g
- id="g75">
-</g>
-<g
- id="g77">
-</g>
-<g
- id="g79">
-</g>
-<g
- id="g81">
-</g>
-</svg>
\ No newline at end of file
diff --git a/src/welle-gui/main.cpp b/src/welle-gui/main.cpp
index 539ec9d..5bfe87f 100644
--- a/src/welle-gui/main.cpp
+++ b/src/welle-gui/main.cpp
@@ -63,6 +63,16 @@ int main(int argc, char** argv)
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
// QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
+ // Disable a lot of new Qml warnings since Qt 5.15:
+ //
+ // Warning: qrc:/QML/settingpages/GlobalSettings.qml:37:5:
+ // QML Connections: Implicitly defined onFoo properties in Connections are deprecated.
+ // Use this syntax instead: function onFoo(<arguments>) { ... }
+ //
+ // Ref: https://zren.github.io/2020/06/19/qml-connections-onfoo-warnings-will-get-logging-category-in-qt-5151
+ //
+ qputenv("QT_LOGGING_RULES", "qt.qml.connections=false");
+
// Handle debug output
CDebugOutput::init();
@@ -78,13 +88,13 @@ int main(int argc, char** argv)
CGUIHelper::loadTranslationFile(translator, lang);
QCoreApplication::installTranslator(translator);
- // Register custiom types
+ // Register custom types
qmlRegisterType<WaterfallItem>("io.welle", 1, 0, "Waterfall");
qRegisterMetaType<mot_file_t>("mot_file_t");
// Set icon path
QStringList themePaths;
- themePaths << ":/icons";
+ themePaths << ":/icons/welle_io_icons";
QIcon::setThemeSearchPaths(themePaths);
QIcon::setThemeName("welle_io_icons");
@@ -93,7 +103,7 @@ int main(int argc, char** argv)
// Handle the command line
QCommandLineParser optionParser;
- optionParser.setApplicationDescription("welle.io Help");
+ optionParser.setApplicationDescription("welle.io is an open source DAB and DAB+ software defined radio (SDR) with support for rtl-sdr (RTL2832U) and airspy. It supports high DPI and touch displays and it runs even on cheap computers like Raspberry Pi 2/3 and 100€ China Windows 10 tablets.");
optionParser.addHelpOption();
optionParser.addVersionOption();
@@ -109,7 +119,7 @@ int main(int argc, char** argv)
QCommandLineOption styleName("qqc-style",
QCoreApplication::translate("main", "Qt Quick Controls Style for the 1st launch"),
- QCoreApplication::translate("main", "style_name"));
+ QCoreApplication::translate("main", "Style name"));
optionParser.addOption(styleName);
// Process the actual command line arguments given by the user
@@ -153,7 +163,7 @@ int main(int argc, char** argv)
CGUIHelper guiHelper(&radioController);
guiHelper.setTranslator(translator);
- // Create new QML application, set some requried options and load the QML file
+ // Create new QML application, set some required options and load the QML file
QQmlApplicationEngine engine;
QQmlContext* rootContext = engine.rootContext();
diff --git a/src/welle-gui/mot_image_provider.cpp b/src/welle-gui/mot_image_provider.cpp
index 2916dff..3b65044 100644
--- a/src/welle-gui/mot_image_provider.cpp
+++ b/src/welle-gui/mot_image_provider.cpp
@@ -30,6 +30,7 @@
#include <iostream>
#include <stdio.h>
#include <QStandardPaths>
+#include <QUrl>
CMOTImageProvider::CMOTImageProvider(): QQuickImageProvider(QQuickImageProvider::Pixmap)
{
@@ -76,10 +77,10 @@ void CMOTImageProvider::clear()
pictureList.clear();
}
-void CMOTImageProvider::saveAll()
+void CMOTImageProvider::saveAll(QString folder)
{
for (auto const& picture : pictureList)
- picture->save();
+ picture->save(folder);
}
motPicture::motPicture(QPixmap data, QString name)
@@ -93,16 +94,16 @@ void motPicture::setData(QPixmap data)
this->data = data;
}
-void motPicture::save()
+void motPicture::save(QString url)
{
- QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
+ QString folder = QUrl(url).toEncoded(QUrl::RemoveScheme);
// Replace all "/" by "_"
QString filename = name;
filename.replace("/", "_");
// Add home directory and "MOT" preffix
- filename = homePath + "/MOT" + filename;
+ filename = folder + "/MOT" + filename;
std::clog << "SLS: Saving picture \"" << filename.toStdString() << "\"" << std::endl;
data.save(filename);
diff --git a/src/welle-gui/mot_image_provider.h b/src/welle-gui/mot_image_provider.h
index 0830c35..2e091e5 100644
--- a/src/welle-gui/mot_image_provider.h
+++ b/src/welle-gui/mot_image_provider.h
@@ -43,7 +43,7 @@ public:
void setPixmap(QPixmap Pixmap, QString pictureName);
void clear();
- void saveAll();
+ void saveAll(QString folder);
private:
std::list<std::shared_ptr<motPicture>> pictureList;
@@ -55,7 +55,7 @@ class motPicture
public:
motPicture(QPixmap data, QString name);
void setData(QPixmap data);
- void save();
+ void save(QString url);
QPixmap data;
QString name;
diff --git a/src/welle-gui/mpris/mpris.cpp b/src/welle-gui/mpris/mpris.cpp
new file mode 100644
index 0000000..9805fec
--- /dev/null
+++ b/src/welle-gui/mpris/mpris.cpp
@@ -0,0 +1,332 @@
+/*
+ * Copyright (C) 2020
+ * tenzap (@github)
+ *
+ * Copyright (C) 2019
+ * Matthias P. Braendli (matthias.braendli@mpb.li)
+ *
+ * Copyright (C) 2017
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * This file was partly generated by qdbusxml2cpp version 0.8
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ */
+
+#include <QtCore/QMetaObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+
+#if defined __unix__ || defined __APPLE__
+ #include <unistd.h>
+ #define GETPID getpid
+#endif
+#ifdef _WIN32
+ #include <process.h>
+ #define GETPID _getpid
+#endif
+
+#include "mpris.h"
+#include "mpris_mp2.h"
+#include "mpris_mp2_player.h"
+#include "../gui_helper.h"
+
+Mpris::Mpris(CRadioController *RadioController, QObject *parent)
+ : QObject(parent)
+ , radioController(RadioController)
+{
+ new MediaPlayer2Adaptor(this);
+ new PlayerAdaptor(this);
+
+ guiHelper = qobject_cast< CGUIHelper * >(parent);
+
+ // Connect to Dbus for MPRIS2
+ QDBusConnection connection = QDBusConnection::sessionBus();
+
+ QString serviceName = "org.mpris.MediaPlayer2.welleio";
+ bool registered = connection.registerService(serviceName);
+ if (!registered)
+ registered = connection.registerService(serviceName + ".instance" + QString::number(GETPID()));
+
+ registered = connection.registerObject("/org/mpris/MediaPlayer2", this, QDBusConnection::ExportAdaptors);
+ if (!registered)
+ qDebug() << "MPRIS: DBus Object not registered.";
+
+ connect(radioController, &CRadioController::autoServiceChanged, this, &Mpris::autoServiceChanged);
+ connect(radioController, &CRadioController::autoChannelChanged, this, &Mpris::autoChannelChanged);
+ connect(radioController, &CRadioController::titleChanged, this, &Mpris::metadataChanged);
+ connect(radioController, &CRadioController::textChanged, this, &Mpris::metadataChanged);
+ connect(radioController, &CRadioController::isPlayingChanged, this, &Mpris::isPlayingChanged);
+ connect(radioController, &CRadioController::volumeChanged, this, &Mpris::volumeChanged);
+ connect(radioController, &CRadioController::motReseted, this, &Mpris::motReseted);
+ connect(guiHelper, &CGUIHelper::motChanged, this, &Mpris::motChanged);
+}
+
+Mpris::~Mpris()
+{
+ // Remove picture file
+ deletePicFile();
+}
+
+void Mpris::setStationArray(QString serializedJson, QString listType, int index)
+{
+ if ((listType == "all" && index == 0) || (listType == "favorites" && index == 1)) {
+ stationArray = QJsonDocument::fromJson(serializedJson.toUtf8()).array();
+ //qDebug() << "MPRIS: Updating stations list using:" << listType;
+ }
+}
+
+int Mpris::getCurrentStationIndex()
+{
+ quint32 sid = 0;
+
+ // In case the station is not found, use the 1st in the list
+ // Typically, it can happen when the user is playing a station
+ // from the "All stations" (that is not in the Favorites) while displaying the favorites in the GUI
+ int currentStationIndex = 0;
+
+ for (int i=0; i<stationArray.size(); i++) {
+ sid = stationArray.at(i).toObject().value("stationSId").toInt();
+ if (sid == autoService) {
+ currentStationIndex = i;
+ break;
+ }
+ }
+ qDebug() << "MPRIS: currentStationIndex" << currentStationIndex;
+
+ return currentStationIndex;
+}
+
+bool Mpris::canQuit() const { return true; }
+
+bool Mpris::canRaise() const { return true; }
+
+bool Mpris::canSetFullscreen() const { return true; }
+
+QString Mpris::desktopEntry() const { return "welle-io"; }
+
+bool Mpris::fullscreen() const { return fullscreenState; }
+
+void Mpris::setFullscreen(bool value)
+{
+ fullscreenState = value;
+ EmitNotification("Fullscreen", fullscreenState);
+ emit guiHelper->setFullScreen(fullscreenState);
+}
+
+void Mpris::setFullscreenState(bool value)
+{
+ fullscreenState = value;
+ EmitNotification("Fullscreen", fullscreenState);
+}
+
+bool Mpris::hasTrackList() const { return false; }
+
+QString Mpris::identity() const { return QCoreApplication::applicationName(); }
+
+QStringList Mpris::supportedMimeTypes() const { return QStringList(); }
+
+QStringList Mpris::supportedUriSchemes() const { return QStringList(); }
+
+void Mpris::Quit() { QCoreApplication::quit(); }
+
+void Mpris::Raise() { emit guiHelper->restoreWindow(); }
+
+bool Mpris::canControl() const { return true; }
+
+bool Mpris::canGoNext() const { return true; }
+
+bool Mpris::canGoPrevious() const { return true; }
+
+bool Mpris::canPause() const { return true; }
+
+bool Mpris::canPlay() const { return true; }
+
+bool Mpris::canSeek() const { return false; }
+
+QString Mpris::loopStatus() const { return "None"; }
+
+void Mpris::setLoopStatus(const QString &value) {}
+
+double Mpris::maximumRate() const { return 1.0; }
+
+void Mpris::autoChannelChanged(QString autoChannel) { this->autoChannel = autoChannel; }
+
+void Mpris::autoServiceChanged(quint32 autoService)
+{
+ this->autoService = autoService;
+ EmitNotification("Metadata", metadata());
+}
+
+void Mpris::isPlayingChanged(bool isPlaying)
+{
+ m_isPlaying = isPlaying;
+ if (m_isPlaying)
+ m_playbackStatus = "Playing";
+ else
+ m_playbackStatus = "Stopped";
+
+ EmitNotification("PlaybackStatus", playbackStatus());
+}
+
+void Mpris::volumeChanged(qreal volume)
+{
+ EmitNotification("Volume", volume);
+}
+
+void Mpris::motChanged(QString pictureName, QString categoryTitle, int categoryId, int slideId)
+{
+ //qDebug() << "MPRIS: pictureName: " << pictureName;
+
+ deletePicFile();
+
+ QString file = pictureName.split("/").last();
+ picPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) +
+ QStringLiteral("/") +
+ QString("welle-io.pic.%1.%2").arg(autoService).arg(file);
+
+ QSize * size = new QSize(10,10);
+
+ QPixmap pixmap = guiHelper->motImageProvider->requestPixmap(pictureName, size, QSize(100,100));
+ pixmap.save(picPath);
+
+ EmitNotification("Metadata", metadata());
+}
+
+void Mpris::motReseted()
+{
+ deletePicFile();
+ picPath = "";
+ EmitNotification("Metadata", metadata());
+}
+
+void Mpris::deletePicFile() { if (! picPath.isEmpty()) QFile::remove(picPath); }
+
+void Mpris::metadataChanged() { EmitNotification("Metadata", metadata()); }
+
+QVariantMap Mpris::metadata() const
+{
+ QString stationTitle = qvariant_cast< QString >(radioController->property("title"));
+ QString stationText = qvariant_cast< QString >(radioController->property("text"));
+ if (stationText.simplified().isEmpty())
+ stationText = stationTitle;
+ QString picPathAsUrl = QString::fromUtf8(QUrl::fromLocalFile(picPath).toEncoded());
+
+ QVariantMap map;
+ map.insert("mpris:trackid", "io.welle.welle-io.Service." + QString::number(autoService));
+ if (!picPathAsUrl.isEmpty())
+ map.insert("mpris:artUrl", picPathAsUrl);
+ map.insert("xesam:album", stationTitle.simplified());
+ map.insert("xesam:title", stationText.simplified());
+ return map;
+}
+
+double Mpris::minimumRate() const { return 1.0; }
+
+QString Mpris::playbackStatus() const { return m_playbackStatus; }
+
+qlonglong Mpris::position() const { return 0; }
+
+double Mpris::rate() const { return 1.0; }
+
+void Mpris::setRate(double value) {}
+
+bool Mpris::shuffle() const { return false; }
+
+void Mpris::setShuffle(bool value) {}
+
+double Mpris::volume() const { return (double) qvariant_cast< qreal >(radioController->property("volume")); }
+
+void Mpris::setVolume(double value) { radioController->setVolume(value); }
+
+void Mpris::Next()
+{
+ int next = std::min(stationArray.size()-1, getCurrentStationIndex()+1);
+ QJsonObject obj = stationArray.at(next).toObject();
+
+ QString autoChannel = obj.value("channelName").toString();
+ quint32 autoService = obj.value("stationSId").toInt();
+ QString title = obj.value("stationName").toString();
+ if (autoService != this->autoService || autoChannel != this->autoChannel)
+ radioController->play(autoChannel, title, autoService);
+}
+
+void Mpris::OpenUri(const QString &Uri) {}
+
+void Mpris::Pause() { Stop(); }
+
+void Mpris::Play()
+{
+ this->autoChannel = qvariant_cast< QString >(radioController->property("autoChannel"));
+ this->autoService = qvariant_cast< quint32 >(radioController->property("autoService"));
+ QString title = qvariant_cast< QString >(radioController->property("title"));
+ radioController->play(this->autoChannel, title, this->autoService);
+}
+
+void Mpris::PlayPause()
+{
+ if (m_isPlaying)
+ Stop();
+ else
+ Play();
+}
+
+void Mpris::Previous()
+{
+ int previous = std::max(0, getCurrentStationIndex()-1);
+ QJsonObject obj = stationArray.at(previous).toObject();
+
+ QString autoChannel = obj.value("channelName").toString();
+ quint32 autoService = obj.value("stationSId").toInt();
+ QString title = obj.value("stationName").toString();
+ if (autoService != this->autoService || autoChannel != this->autoChannel)
+ radioController->play(autoChannel, title, autoService);
+}
+
+void Mpris::Seek(qlonglong Offset) {}
+
+void Mpris::SetPosition(const QDBusObjectPath &TrackId, qlonglong Position) {}
+
+void Mpris::Stop() { radioController->stop(); }
+
+void Mpris::EmitNotification(const QString& name, const QVariant& val)
+{
+ EmitNotification(name, val, "org.mpris.MediaPlayer2.Player");
+}
+
+void Mpris::EmitNotification(const QString& name,
+ const QVariant& val,
+ const QString& mprisEntity)
+{
+ QDBusMessage msg = QDBusMessage::createSignal("/org/mpris/MediaPlayer2",
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged");
+ QVariantMap map;
+ map.insert(name, val);
+ QVariantList args = QVariantList() << mprisEntity << map << QStringList();
+ msg.setArguments(args);
+ QDBusConnection::sessionBus().send(msg);
+}
diff --git a/src/welle-gui/mpris/mpris.h b/src/welle-gui/mpris/mpris.h
new file mode 100644
index 0000000..9593a91
--- /dev/null
+++ b/src/welle-gui/mpris/mpris.h
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2020
+ * tenzap (@github)
+ *
+ * Copyright (C) 2019
+ * Matthias P. Braendli (matthias.braendli@mpb.li)
+ *
+ * Copyright (C) 2017
+ * Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ * This file is part of the welle.io.
+ * Many of the ideas as implemented in welle.io are derived from
+ * other work, made available through the GNU general Public License.
+ * All copyrights of the original authors are recognized.
+ *
+ * welle.io is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * welle.io is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with welle.io; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * This file was partly generated by qdbusxml2cpp version 0.8
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ */
+
+#ifndef MPRIS_H
+#define MPRIS_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+#include "../radio_controller.h"
+
+class CGUIHelper;
+
+QT_BEGIN_NAMESPACE
+class QByteArray;
+template<class T> class QList;
+template<class Key, class Value> class QMap;
+class QString;
+class QStringList;
+class QVariant;
+QT_END_NAMESPACE
+
+class Mpris: public QObject
+{
+ Q_OBJECT
+public:
+ Mpris(CRadioController *RadioController, QObject *parent );
+ virtual ~Mpris();
+ void setStationArray(QString serializedJson, QString, int);
+ void setFullscreenState(bool value);
+
+public: // PROPERTIES
+ Q_PROPERTY(bool CanQuit READ canQuit)
+ bool canQuit() const;
+
+ Q_PROPERTY(bool CanRaise READ canRaise)
+ bool canRaise() const;
+
+ Q_PROPERTY(bool CanSetFullscreen READ canSetFullscreen)
+ bool canSetFullscreen() const;
+
+ Q_PROPERTY(QString DesktopEntry READ desktopEntry)
+ QString desktopEntry() const;
+
+ Q_PROPERTY(bool Fullscreen READ fullscreen WRITE setFullscreen)
+ bool fullscreen() const;
+ void setFullscreen(bool value);
+
+ Q_PROPERTY(bool HasTrackList READ hasTrackList)
+ bool hasTrackList() const;
+
+ Q_PROPERTY(QString Identity READ identity)
+ QString identity() const;
+
+ Q_PROPERTY(QStringList SupportedMimeTypes READ supportedMimeTypes)
+ QStringList supportedMimeTypes() const;
+
+ Q_PROPERTY(QStringList SupportedUriSchemes READ supportedUriSchemes)
+ QStringList supportedUriSchemes() const;
+
+ Q_PROPERTY(bool CanControl READ canControl)
+ bool canControl() const;
+
+ Q_PROPERTY(bool CanGoNext READ canGoNext)
+ bool canGoNext() const;
+
+ Q_PROPERTY(bool CanGoPrevious READ canGoPrevious)
+ bool canGoPrevious() const;
+
+ Q_PROPERTY(bool CanPause READ canPause)
+ bool canPause() const;
+
+ Q_PROPERTY(bool CanPlay READ canPlay)
+ bool canPlay() const;
+
+ Q_PROPERTY(bool CanSeek READ canSeek)
+ bool canSeek() const;
+
+ Q_PROPERTY(QString LoopStatus READ loopStatus WRITE setLoopStatus)
+ QString loopStatus() const;
+ void setLoopStatus(const QString &value);
+
+ Q_PROPERTY(double MaximumRate READ maximumRate)
+ double maximumRate() const;
+
+ Q_PROPERTY(QVariantMap Metadata READ metadata)
+ QVariantMap metadata() const;
+
+ Q_PROPERTY(double MinimumRate READ minimumRate)
+ double minimumRate() const;
+
+ Q_PROPERTY(QString PlaybackStatus READ playbackStatus)
+ QString playbackStatus() const;
+
+ Q_PROPERTY(qlonglong Position READ position)
+ qlonglong position() const;
+
+ Q_PROPERTY(double Rate READ rate WRITE setRate)
+ double rate() const;
+ void setRate(double value);
+
+ Q_PROPERTY(bool Shuffle READ shuffle WRITE setShuffle)
+ bool shuffle() const;
+ void setShuffle(bool value);
+
+ Q_PROPERTY(double Volume READ volume WRITE setVolume)
+ double volume() const;
+ void setVolume(double value);
+
+public Q_SLOTS: // METHODS
+ void Quit();
+ void Raise();
+ void Next();
+ void OpenUri(const QString &Uri);
+ void Pause();
+ void Play();
+ void PlayPause();
+ void Previous();
+ void Seek(qlonglong Offset);
+ void SetPosition(const QDBusObjectPath &TrackId, qlonglong Position);
+ void Stop();
+Q_SIGNALS: // SIGNALS
+ void Seeked(qlonglong Position);
+
+private:
+ CRadioController *radioController;
+ CGUIHelper *guiHelper;
+ void EmitNotification(const QString& name, const QVariant& val);
+ void EmitNotification(const QString& name, const QVariant& val,
+ const QString& mprisEntity);
+ int getCurrentStationIndex();
+ void deletePicFile();
+ QString picPath;
+ QString m_playbackStatus;
+ bool m_isPlaying;
+ quint32 autoService;
+ QString autoChannel;
+ QJsonArray stationArray;
+ bool fullscreenState = false;
+
+private slots:
+ void motChanged(QString pictureName, QString categoryTitle, int categoryId, int slideId);
+ void motReseted();
+ void metadataChanged();
+ void isPlayingChanged(bool);
+ void volumeChanged(qreal);
+ void autoServiceChanged(quint32);
+ void autoChannelChanged(QString);
+};
+
+#endif
diff --git a/src/welle-gui/mpris/mpris_mp2.cpp b/src/welle-gui/mpris/mpris_mp2.cpp
new file mode 100644
index 0000000..e0ea0ba
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2.cpp
@@ -0,0 +1,107 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.xml -a mpris_mp2
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * Do not edit! All changes made to it will be lost.
+ */
+
+#include "mpris_mp2.h"
+#include <QtCore/QMetaObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+
+/*
+ * Implementation of adaptor class MediaPlayer2Adaptor
+ */
+
+MediaPlayer2Adaptor::MediaPlayer2Adaptor(QObject *parent)
+ : QDBusAbstractAdaptor(parent)
+{
+ // constructor
+ setAutoRelaySignals(true);
+}
+
+MediaPlayer2Adaptor::~MediaPlayer2Adaptor()
+{
+ // destructor
+}
+
+bool MediaPlayer2Adaptor::canQuit() const
+{
+ // get the value of property CanQuit
+ return qvariant_cast< bool >(parent()->property("CanQuit"));
+}
+
+bool MediaPlayer2Adaptor::canRaise() const
+{
+ // get the value of property CanRaise
+ return qvariant_cast< bool >(parent()->property("CanRaise"));
+}
+
+bool MediaPlayer2Adaptor::canSetFullscreen() const
+{
+ // get the value of property CanSetFullscreen
+ return qvariant_cast< bool >(parent()->property("CanSetFullscreen"));
+}
+
+QString MediaPlayer2Adaptor::desktopEntry() const
+{
+ // get the value of property DesktopEntry
+ return qvariant_cast< QString >(parent()->property("DesktopEntry"));
+}
+
+bool MediaPlayer2Adaptor::fullscreen() const
+{
+ // get the value of property Fullscreen
+ return qvariant_cast< bool >(parent()->property("Fullscreen"));
+}
+
+void MediaPlayer2Adaptor::setFullscreen(bool value)
+{
+ // set the value of property Fullscreen
+ parent()->setProperty("Fullscreen", QVariant::fromValue(value));
+}
+
+bool MediaPlayer2Adaptor::hasTrackList() const
+{
+ // get the value of property HasTrackList
+ return qvariant_cast< bool >(parent()->property("HasTrackList"));
+}
+
+QString MediaPlayer2Adaptor::identity() const
+{
+ // get the value of property Identity
+ return qvariant_cast< QString >(parent()->property("Identity"));
+}
+
+QStringList MediaPlayer2Adaptor::supportedMimeTypes() const
+{
+ // get the value of property SupportedMimeTypes
+ return qvariant_cast< QStringList >(parent()->property("SupportedMimeTypes"));
+}
+
+QStringList MediaPlayer2Adaptor::supportedUriSchemes() const
+{
+ // get the value of property SupportedUriSchemes
+ return qvariant_cast< QStringList >(parent()->property("SupportedUriSchemes"));
+}
+
+void MediaPlayer2Adaptor::Quit()
+{
+ // handle method call org.mpris.MediaPlayer2.Quit
+ QMetaObject::invokeMethod(parent(), "Quit");
+}
+
+void MediaPlayer2Adaptor::Raise()
+{
+ // handle method call org.mpris.MediaPlayer2.Raise
+ QMetaObject::invokeMethod(parent(), "Raise");
+}
+
diff --git a/src/welle-gui/mpris/mpris_mp2.h b/src/welle-gui/mpris/mpris_mp2.h
new file mode 100644
index 0000000..05b5d83
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2.h
@@ -0,0 +1,87 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.xml -a mpris_mp2
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * This file may have been hand-edited. Look for HAND-EDIT comments
+ * before re-generating it.
+ */
+
+#ifndef MPRIS_MP2_H
+#define MPRIS_MP2_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+QT_BEGIN_NAMESPACE
+class QByteArray;
+template<class T> class QList;
+template<class Key, class Value> class QMap;
+class QString;
+class QStringList;
+class QVariant;
+QT_END_NAMESPACE
+
+/*
+ * Adaptor class for interface org.mpris.MediaPlayer2
+ */
+class MediaPlayer2Adaptor: public QDBusAbstractAdaptor
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.mpris.MediaPlayer2")
+ Q_CLASSINFO("D-Bus Introspection", ""
+" <interface name=\"org.mpris.MediaPlayer2\">\n"
+" <method name=\"Raise\"/>\n"
+" <method name=\"Quit\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanQuit\"/>\n"
+" <property access=\"readwrite\" type=\"b\" name=\"Fullscreen\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanSetFullscreen\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanRaise\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"HasTrackList\"/>\n"
+" <property access=\"read\" type=\"s\" name=\"Identity\"/>\n"
+" <property access=\"read\" type=\"s\" name=\"DesktopEntry\"/>\n"
+" <property access=\"read\" type=\"as\" name=\"SupportedUriSchemes\"/>\n"
+" <property access=\"read\" type=\"as\" name=\"SupportedMimeTypes\"/>\n"
+" </interface>\n"
+ "")
+public:
+ MediaPlayer2Adaptor(QObject *parent);
+ virtual ~MediaPlayer2Adaptor();
+
+public: // PROPERTIES
+ Q_PROPERTY(bool CanQuit READ canQuit)
+ bool canQuit() const;
+
+ Q_PROPERTY(bool CanRaise READ canRaise)
+ bool canRaise() const;
+
+ Q_PROPERTY(bool CanSetFullscreen READ canSetFullscreen)
+ bool canSetFullscreen() const;
+
+ Q_PROPERTY(QString DesktopEntry READ desktopEntry)
+ QString desktopEntry() const;
+
+ Q_PROPERTY(bool Fullscreen READ fullscreen WRITE setFullscreen)
+ bool fullscreen() const;
+ void setFullscreen(bool value);
+
+ Q_PROPERTY(bool HasTrackList READ hasTrackList)
+ bool hasTrackList() const;
+
+ Q_PROPERTY(QString Identity READ identity)
+ QString identity() const;
+
+ Q_PROPERTY(QStringList SupportedMimeTypes READ supportedMimeTypes)
+ QStringList supportedMimeTypes() const;
+
+ Q_PROPERTY(QStringList SupportedUriSchemes READ supportedUriSchemes)
+ QStringList supportedUriSchemes() const;
+
+public Q_SLOTS: // METHODS
+ void Quit();
+ void Raise();
+Q_SIGNALS: // SIGNALS
+};
+
+#endif
diff --git a/src/welle-gui/mpris/mpris_mp2_player.cpp b/src/welle-gui/mpris/mpris_mp2_player.cpp
new file mode 100644
index 0000000..b8faba9
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2_player.cpp
@@ -0,0 +1,203 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.Player.xml -a mpris_mp2_player
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * Do not edit! All changes made to it will be lost.
+ */
+
+#include "mpris_mp2_player.h"
+#include <QtCore/QMetaObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+
+/*
+ * Implementation of adaptor class PlayerAdaptor
+ */
+
+PlayerAdaptor::PlayerAdaptor(QObject *parent)
+ : QDBusAbstractAdaptor(parent)
+{
+ // constructor
+ setAutoRelaySignals(true);
+}
+
+PlayerAdaptor::~PlayerAdaptor()
+{
+ // destructor
+}
+
+bool PlayerAdaptor::canControl() const
+{
+ // get the value of property CanControl
+ return qvariant_cast< bool >(parent()->property("CanControl"));
+}
+
+bool PlayerAdaptor::canGoNext() const
+{
+ // get the value of property CanGoNext
+ return qvariant_cast< bool >(parent()->property("CanGoNext"));
+}
+
+bool PlayerAdaptor::canGoPrevious() const
+{
+ // get the value of property CanGoPrevious
+ return qvariant_cast< bool >(parent()->property("CanGoPrevious"));
+}
+
+bool PlayerAdaptor::canPause() const
+{
+ // get the value of property CanPause
+ return qvariant_cast< bool >(parent()->property("CanPause"));
+}
+
+bool PlayerAdaptor::canPlay() const
+{
+ // get the value of property CanPlay
+ return qvariant_cast< bool >(parent()->property("CanPlay"));
+}
+
+bool PlayerAdaptor::canSeek() const
+{
+ // get the value of property CanSeek
+ return qvariant_cast< bool >(parent()->property("CanSeek"));
+}
+
+QString PlayerAdaptor::loopStatus() const
+{
+ // get the value of property LoopStatus
+ return qvariant_cast< QString >(parent()->property("LoopStatus"));
+}
+
+void PlayerAdaptor::setLoopStatus(const QString &value)
+{
+ // set the value of property LoopStatus
+ parent()->setProperty("LoopStatus", QVariant::fromValue(value));
+}
+
+double PlayerAdaptor::maximumRate() const
+{
+ // get the value of property MaximumRate
+ return qvariant_cast< double >(parent()->property("MaximumRate"));
+}
+
+QVariantMap PlayerAdaptor::metadata() const
+{
+ // get the value of property Metadata
+ return qvariant_cast< QVariantMap >(parent()->property("Metadata"));
+}
+
+double PlayerAdaptor::minimumRate() const
+{
+ // get the value of property MinimumRate
+ return qvariant_cast< double >(parent()->property("MinimumRate"));
+}
+
+QString PlayerAdaptor::playbackStatus() const
+{
+ // get the value of property PlaybackStatus
+ return qvariant_cast< QString >(parent()->property("PlaybackStatus"));
+}
+
+qlonglong PlayerAdaptor::position() const
+{
+ // get the value of property Position
+ return qvariant_cast< qlonglong >(parent()->property("Position"));
+}
+
+double PlayerAdaptor::rate() const
+{
+ // get the value of property Rate
+ return qvariant_cast< double >(parent()->property("Rate"));
+}
+
+void PlayerAdaptor::setRate(double value)
+{
+ // set the value of property Rate
+ parent()->setProperty("Rate", QVariant::fromValue(value));
+}
+
+bool PlayerAdaptor::shuffle() const
+{
+ // get the value of property Shuffle
+ return qvariant_cast< bool >(parent()->property("Shuffle"));
+}
+
+void PlayerAdaptor::setShuffle(bool value)
+{
+ // set the value of property Shuffle
+ parent()->setProperty("Shuffle", QVariant::fromValue(value));
+}
+
+double PlayerAdaptor::volume() const
+{
+ // get the value of property Volume
+ return qvariant_cast< double >(parent()->property("Volume"));
+}
+
+void PlayerAdaptor::setVolume(double value)
+{
+ // set the value of property Volume
+ parent()->setProperty("Volume", QVariant::fromValue(value));
+}
+
+void PlayerAdaptor::Next()
+{
+ // handle method call org.mpris.MediaPlayer2.Player.Next
+ QMetaObject::invokeMethod(parent(), "Next");
+}
+
+void PlayerAdaptor::OpenUri(const QString &Uri)
+{
+ // handle method call org.mpris.MediaPlayer2.Player.OpenUri
+ QMetaObject::invokeMethod(parent(), "OpenUri", Q_ARG(QString, Uri));
+}
+
+void PlayerAdaptor::Pause()
+{
+ // handle method call org.mpris.MediaPlayer2.Player.Pause
+ QMetaObject::invokeMethod(parent(), "Pause");
+}
+
+void PlayerAdaptor::Play()
+{
+ // handle method call org.mpris.MediaPlayer2.Player.Play
+ QMetaObject::invokeMethod(parent(), "Play");
+}
+
+void PlayerAdaptor::PlayPause()
+{
+ // handle method call org.mpris.MediaPlayer2.Player.PlayPause
+ QMetaObject::invokeMethod(parent(), "PlayPause");
+}
+
+void PlayerAdaptor::Previous()
+{
+ // handle method call org.mpris.MediaPlayer2.Player.Previous
+ QMetaObject::invokeMethod(parent(), "Previous");
+}
+
+void PlayerAdaptor::Seek(qlonglong Offset)
+{
+ // handle method call org.mpris.MediaPlayer2.Player.Seek
+ QMetaObject::invokeMethod(parent(), "Seek", Q_ARG(qlonglong, Offset));
+}
+
+void PlayerAdaptor::SetPosition(const QDBusObjectPath &TrackId, qlonglong Position)
+{
+ // handle method call org.mpris.MediaPlayer2.Player.SetPosition
+ QMetaObject::invokeMethod(parent(), "SetPosition", Q_ARG(QDBusObjectPath, TrackId), Q_ARG(qlonglong, Position));
+}
+
+void PlayerAdaptor::Stop()
+{
+ // handle method call org.mpris.MediaPlayer2.Player.Stop
+ QMetaObject::invokeMethod(parent(), "Stop");
+}
+
diff --git a/src/welle-gui/mpris/mpris_mp2_player.h b/src/welle-gui/mpris/mpris_mp2_player.h
new file mode 100644
index 0000000..2e2e8c8
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2_player.h
@@ -0,0 +1,141 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.Player.xml -a mpris_mp2_player
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * This file may have been hand-edited. Look for HAND-EDIT comments
+ * before re-generating it.
+ */
+
+#ifndef MPRIS_MP2_PLAYER_H
+#define MPRIS_MP2_PLAYER_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+QT_BEGIN_NAMESPACE
+class QByteArray;
+template<class T> class QList;
+template<class Key, class Value> class QMap;
+class QString;
+class QStringList;
+class QVariant;
+QT_END_NAMESPACE
+
+/*
+ * Adaptor class for interface org.mpris.MediaPlayer2.Player
+ */
+class PlayerAdaptor: public QDBusAbstractAdaptor
+{
+ Q_OBJECT
+ Q_CLASSINFO("D-Bus Interface", "org.mpris.MediaPlayer2.Player")
+ Q_CLASSINFO("D-Bus Introspection", ""
+" <interface name=\"org.mpris.MediaPlayer2.Player\">\n"
+" <method name=\"Next\"/>\n"
+" <method name=\"Previous\"/>\n"
+" <method name=\"Pause\"/>\n"
+" <method name=\"PlayPause\"/>\n"
+" <method name=\"Stop\"/>\n"
+" <method name=\"Play\"/>\n"
+" <method name=\"Seek\">\n"
+" <arg direction=\"in\" type=\"x\" name=\"Offset\"/>\n"
+" </method>\n"
+" <method name=\"SetPosition\">\n"
+" <arg direction=\"in\" type=\"o\" name=\"TrackId\"/>\n"
+" <arg direction=\"in\" type=\"x\" name=\"Position\"/>\n"
+" </method>\n"
+" <method name=\"OpenUri\">\n"
+" <arg direction=\"in\" type=\"s\" name=\"Uri\"/>\n"
+" </method>\n"
+" <signal name=\"Seeked\">\n"
+" <arg type=\"x\" name=\"Position\"/>\n"
+" </signal>\n"
+" <property access=\"read\" type=\"s\" name=\"PlaybackStatus\"/>\n"
+" <property access=\"readwrite\" type=\"s\" name=\"LoopStatus\"/>\n"
+" <property access=\"readwrite\" type=\"d\" name=\"Rate\"/>\n"
+" <property access=\"readwrite\" type=\"b\" name=\"Shuffle\"/>\n"
+" <property access=\"read\" type=\"a{sv}\" name=\"Metadata\">\n"
+" <annotation value=\"QVariantMap\" name=\"org.qtproject.QtDBus.QtTypeName\"/>\n"
+" </property>\n"
+" <property access=\"readwrite\" type=\"d\" name=\"Volume\"/>\n"
+" <property access=\"read\" type=\"x\" name=\"Position\"/>\n"
+" <property access=\"read\" type=\"d\" name=\"MinimumRate\"/>\n"
+" <property access=\"read\" type=\"d\" name=\"MaximumRate\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanGoNext\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanGoPrevious\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanPlay\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanPause\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanSeek\"/>\n"
+" <property access=\"read\" type=\"b\" name=\"CanControl\"/>\n"
+" </interface>\n"
+ "")
+public:
+ PlayerAdaptor(QObject *parent);
+ virtual ~PlayerAdaptor();
+
+public: // PROPERTIES
+ Q_PROPERTY(bool CanControl READ canControl)
+ bool canControl() const;
+
+ Q_PROPERTY(bool CanGoNext READ canGoNext)
+ bool canGoNext() const;
+
+ Q_PROPERTY(bool CanGoPrevious READ canGoPrevious)
+ bool canGoPrevious() const;
+
+ Q_PROPERTY(bool CanPause READ canPause)
+ bool canPause() const;
+
+ Q_PROPERTY(bool CanPlay READ canPlay)
+ bool canPlay() const;
+
+ Q_PROPERTY(bool CanSeek READ canSeek)
+ bool canSeek() const;
+
+ Q_PROPERTY(QString LoopStatus READ loopStatus WRITE setLoopStatus)
+ QString loopStatus() const;
+ void setLoopStatus(const QString &value);
+
+ Q_PROPERTY(double MaximumRate READ maximumRate)
+ double maximumRate() const;
+
+ Q_PROPERTY(QVariantMap Metadata READ metadata)
+ QVariantMap metadata() const;
+
+ Q_PROPERTY(double MinimumRate READ minimumRate)
+ double minimumRate() const;
+
+ Q_PROPERTY(QString PlaybackStatus READ playbackStatus)
+ QString playbackStatus() const;
+
+ Q_PROPERTY(qlonglong Position READ position)
+ qlonglong position() const;
+
+ Q_PROPERTY(double Rate READ rate WRITE setRate)
+ double rate() const;
+ void setRate(double value);
+
+ Q_PROPERTY(bool Shuffle READ shuffle WRITE setShuffle)
+ bool shuffle() const;
+ void setShuffle(bool value);
+
+ Q_PROPERTY(double Volume READ volume WRITE setVolume)
+ double volume() const;
+ void setVolume(double value);
+
+public Q_SLOTS: // METHODS
+ void Next();
+ void OpenUri(const QString &Uri);
+ void Pause();
+ void Play();
+ void PlayPause();
+ void Previous();
+ void Seek(qlonglong Offset);
+ void SetPosition(const QDBusObjectPath &TrackId, qlonglong Position);
+ void Stop();
+Q_SIGNALS: // SIGNALS
+ void Seeked(qlonglong Position);
+};
+
+#endif
diff --git a/src/welle-gui/mpris/org.mpris.MediaPlayer2.Player.xml b/src/welle-gui/mpris/org.mpris.MediaPlayer2.Player.xml
new file mode 100644
index 0000000..711a74e
--- /dev/null
+++ b/src/welle-gui/mpris/org.mpris.MediaPlayer2.Player.xml
@@ -0,0 +1,43 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node>
+ <interface name='org.mpris.MediaPlayer2.Player'>
+ <method name='Next'/>
+ <method name='Previous'/>
+ <method name='Pause'/>
+ <method name='PlayPause'/>
+ <method name='Stop'/>
+ <method name='Play'/>
+ <method name='Seek'>
+ <arg direction='in' name='Offset' type='x'/>
+ </method>
+ <method name='SetPosition'>
+ <arg direction='in' name='TrackId' type='o'/>
+ <arg direction='in' name='Position' type='x'/>
+ </method>
+ <method name='OpenUri'>
+ <arg direction='in' name='Uri' type='s'/>
+ </method>
+ <signal name='Seeked'>
+ <arg name='Position' type='x'/>
+ </signal>
+ <property name='PlaybackStatus' type='s' access='read'/>
+ <property name='LoopStatus' type='s' access='readwrite'/>
+ <property name='Rate' type='d' access='readwrite'/>
+ <property name='Shuffle' type='b' access='readwrite'/>
+ <property name='Metadata' type='a{sv}' access='read'>
+ <annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
+ </property>
+ <property name='Volume' type='d' access='readwrite'/>
+ <property name='Position' type='x' access='read'/>
+ <property name='MinimumRate' type='d' access='read'/>
+ <property name='MaximumRate' type='d' access='read'/>
+ <property name='CanGoNext' type='b' access='read'/>
+ <property name='CanGoPrevious' type='b' access='read'/>
+ <property name='CanPlay' type='b' access='read'/>
+ <property name='CanPause' type='b' access='read'/>
+ <property name='CanSeek' type='b' access='read'/>
+ <property name='CanControl' type='b' access='read'/>
+ </interface>
+</node>
diff --git a/src/welle-gui/mpris/org.mpris.MediaPlayer2.xml b/src/welle-gui/mpris/org.mpris.MediaPlayer2.xml
new file mode 100644
index 0000000..7e8d728
--- /dev/null
+++ b/src/welle-gui/mpris/org.mpris.MediaPlayer2.xml
@@ -0,0 +1,18 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node>
+ <interface name='org.mpris.MediaPlayer2'>
+ <method name='Raise'/>
+ <method name='Quit'/>
+ <property name='CanQuit' type='b' access='read'/>
+ <property name='Fullscreen' type='b' access='readwrite'/>
+ <property name='CanSetFullscreen' type='b' access='read'/>
+ <property name='CanRaise' type='b' access='read'/>
+ <property name='HasTrackList' type='b' access='read'/>
+ <property name='Identity' type='s' access='read'/>
+ <property name='DesktopEntry' type='s' access='read'/>
+ <property name='SupportedUriSchemes' type='as' access='read'/>
+ <property name='SupportedMimeTypes' type='as' access='read'/>
+ </interface>
+</node>
diff --git a/src/welle-gui/radio_controller.cpp b/src/welle-gui/radio_controller.cpp
index bdc0f85..5d20e76 100644
--- a/src/welle-gui/radio_controller.cpp
+++ b/src/welle-gui/radio_controller.cpp
@@ -237,33 +237,56 @@ void CRadioController::play(QString channel, QString title, quint32 service)
stopScan();
}
- deviceRestart();
+ bool isRestartOk = deviceRestart();
setChannel(channel, false);
setService(service);
currentLastChannel = QStringList() << serialise_serviceid(service) << channel;
QSettings settings;
settings.setValue("lastchannel", currentLastChannel);
+
+ if (isRestartOk) {
+ isPlaying = true;
+ emit isPlayingChanged(isPlaying);
+ } else {
+ resetTechnicalData();
+ currentTitle = title;
+ emit titleChanged();
+ currentText = tr("Playback failed");
+ emit textChanged();
+ }
}
void CRadioController::stop()
{
+ if (radioReceiver) {
+ radioReceiver->stop();
+ }
+
if (device) {
device->stop();
}
else
throw std::runtime_error("device is null in file " + std::string(__FILE__) +":"+ std::to_string(__LINE__));
- audio.reset();
+ QString title = currentTitle;
+ resetTechnicalData();
+ currentTitle = title;
+ emit titleChanged();
+ currentText = tr("Stopped");
+ emit textChanged();
+
+ audio.stop();
labelTimer.stop();
}
void CRadioController::setService(uint32_t service, bool force)
{
- if (currentService != service or force) {
+ if (currentService != service or force or isPlaying == false) {
currentService = service;
autoService = service;
emit stationChanged();
+ emit autoServiceChanged(autoService);
// Wait if we found the station inside the signal
stationTimer.start(1000);
@@ -286,7 +309,9 @@ void CRadioController::setAutoPlay(bool isAutoPlayValue, QString channel, QStrin
{
isAutoPlay = isAutoPlayValue;
autoChannel = channel;
+ emit autoChannelChanged(autoChannel);
autoService = deserialise_serviceid(service.toStdString().c_str());
+ emit autoServiceChanged(autoService);
currentLastChannel = QStringList() << service << channel;
}
@@ -299,17 +324,21 @@ void CRadioController::setVolume(qreal Volume)
void CRadioController::setChannel(QString Channel, bool isScan, bool Force)
{
- if (currentChannel != Channel || Force == true) {
+ if (currentChannel != Channel || Force == true || isPlaying == false) {
if (device && device->getID() == CDeviceID::RAWFILE) {
currentChannel = "File";
- autoChannel = currentChannel;
+ if (!isScan)
+ autoChannel = currentChannel;
currentEId = 0;
currentEnsembleLabel = "";
currentFrequency = 0;
}
else { // A real device
+ if(radioReceiver)
+ radioReceiver->stop(); // Stop the demodulator in order to avoid working with old data
currentChannel = Channel;
- autoChannel = currentChannel;
+ if (!isScan)
+ autoChannel = currentChannel;
currentEId = 0;
currentEnsembleLabel = "";
@@ -331,6 +360,8 @@ void CRadioController::setChannel(QString Channel, bool isScan, bool Force)
}
emit channelChanged();
+ if (!isScan)
+ emit autoChannelChanged(autoChannel);
emit ensembleChanged();
emit frequencyChanged();
}
@@ -368,6 +399,8 @@ void CRadioController::startScan(void)
{
qDebug() << "RadioController:" << "Start channel scan";
+ stop();
+
deviceRestart();
if(device && device->getID() == CDeviceID::RAWFILE) {
@@ -383,6 +416,7 @@ void CRadioController::startScan(void)
setChannel(Channel, true);
isChannelScan = true;
+ emit isChannelScanChanged(isChannelScan);
stationCount = 0;
currentTitle = tr("Scanning") + " ... " + Channel
+ " (" + QString::number((1 * 100 / NUMBEROFCHANNELS)) + "%)";
@@ -415,6 +449,7 @@ void CRadioController::stopScan(void)
emit textChanged();
isChannelScan = false;
+ emit isChannelScanChanged(isChannelScan);
emit scanStopped();
stop();
@@ -635,38 +670,56 @@ void CRadioController::resetTechnicalData(void)
currentText = "";
emit textChanged();
+ isPlaying = false;
+ emit isPlayingChanged(isPlaying);
+
errorMsg = "";
isSync = false;
+ emit isSyncChanged(isSync);
isFICCRC = false;
+ emit isFICCRCChanged(isFICCRC);
isSignal = false;
+ emit isSignalChanged(isSignal);
snr = 0;
+ emit snrChanged(snr);
frequencyCorrection = 0;
+ emit frequencyCorrectionChanged(frequencyCorrection);
frequencyCorrectionPpm = NAN;
+ emit frequencyCorrectionPpmChanged(frequencyCorrectionPpm);
bitRate = 0;
+ emit bitRateChanged(bitRate);
audioSampleRate = 0;
isDAB = true;
+ emit isDABChanged(isDAB);
frameErrors = 0;
- rsErrors = 0;
+ emit frameErrorsChanged(frameErrors);
+ rsUncorrectedErrors = 0;
+ emit rsUncorrectedErrorsChanged(this->rsUncorrectedErrors);
+ emit rsCorrectedErrorsChanged(this->rsCorrectedErrors);
aaErrors = 0;
+ emit aacErrorsChanged(aaErrors);
emit motReseted();
}
-void CRadioController::deviceRestart()
+bool CRadioController::deviceRestart()
{
bool isPlay = false;
if(device) {
isPlay = device->restart();
+ } else {
+ return false;
}
if(!isPlay) {
qDebug() << "RadioController:" << "Radio device is not ready or does not exist.";
emit showErrorMessage(tr("Radio device is not ready or does not exist."));
- return;
+ return false;
}
labelTimer.start(40);
+ return true;
}
/*****************
@@ -954,7 +1007,7 @@ void CRadioController::onMessage(message_level_t level, const std::string& text,
}
}
-void CRadioController::onSNR(int snr)
+void CRadioController::onSNR(float snr)
{
if (this->snr == snr)
return;
@@ -1024,12 +1077,17 @@ void CRadioController::onFrameErrors(int frameErrors)
void CRadioController::onRsErrors(bool uncorrectedErrors, int numCorrectedErrors)
{
- (void)numCorrectedErrors;
+ if (this->rsUncorrectedErrors != uncorrectedErrors)
+ {
+ this->rsUncorrectedErrors = uncorrectedErrors;
+ emit rsUncorrectedErrorsChanged(this->rsUncorrectedErrors);
+ }
- if (this->rsErrors == uncorrectedErrors ? 1 : 0)
- return;
- this->rsErrors = uncorrectedErrors ? 1 : 0;
- emit rsErrorsChanged(this->rsErrors);
+ if (this->rsCorrectedErrors != numCorrectedErrors)
+ {
+ this->rsCorrectedErrors = numCorrectedErrors;
+ emit rsCorrectedErrorsChanged(this->rsCorrectedErrors);
+ }
}
void CRadioController::onAacErrors(int aacErrors)
diff --git a/src/welle-gui/radio_controller.h b/src/welle-gui/radio_controller.h
index 2d80875..f913180 100644
--- a/src/welle-gui/radio_controller.h
+++ b/src/welle-gui/radio_controller.h
@@ -63,17 +63,20 @@ class CRadioController :
Q_PROPERTY(QString deviceName MEMBER deviceName NOTIFY deviceNameChanged)
Q_PROPERTY(CDeviceID deviceId MEMBER deviceId NOTIFY deviceIdChanged)
Q_PROPERTY(QDateTime dateTime MEMBER currentDateTime NOTIFY dateTimeChanged)
+ Q_PROPERTY(bool isPlaying MEMBER isPlaying NOTIFY isPlayingChanged)
+ Q_PROPERTY(bool isChannelScan MEMBER isChannelScan NOTIFY isChannelScanChanged)
Q_PROPERTY(bool isSync MEMBER isSync NOTIFY isSyncChanged)
Q_PROPERTY(bool isFICCRC MEMBER isFICCRC NOTIFY isFICCRCChanged)
Q_PROPERTY(bool isSignal MEMBER isSignal NOTIFY isSignalChanged)
Q_PROPERTY(QString audioMode MEMBER audioMode NOTIFY audioModeChanged)
Q_PROPERTY(bool isDAB MEMBER isDAB NOTIFY isDABChanged)
- Q_PROPERTY(int snr MEMBER snr NOTIFY snrChanged)
+ Q_PROPERTY(float snr MEMBER snr NOTIFY snrChanged)
Q_PROPERTY(int frequencyCorrection MEMBER frequencyCorrection NOTIFY frequencyCorrectionChanged)
Q_PROPERTY(float frequencyCorrectionPpm MEMBER frequencyCorrectionPpm NOTIFY frequencyCorrectionPpmChanged)
Q_PROPERTY(int bitRate MEMBER bitRate NOTIFY bitRateChanged)
Q_PROPERTY(int frameErrors MEMBER frameErrors NOTIFY frameErrorsChanged)
- Q_PROPERTY(int rsErrors MEMBER rsErrors NOTIFY rsErrorsChanged)
+ Q_PROPERTY(int rsUncorrectedErrors MEMBER rsUncorrectedErrors NOTIFY rsUncorrectedErrorsChanged)
+ Q_PROPERTY(int rsCorrectedErrors MEMBER rsCorrectedErrors NOTIFY rsCorrectedErrorsChanged)
Q_PROPERTY(int aacErrors MEMBER aaErrors NOTIFY aacErrorsChanged)
Q_PROPERTY(bool agc MEMBER isAGC WRITE setAGC NOTIFY agcChanged)
Q_PROPERTY(float gainValue MEMBER currentManualGainValue NOTIFY gainValueChanged)
@@ -84,9 +87,11 @@ class CRadioController :
Q_PROPERTY(QString channel MEMBER currentChannel NOTIFY channelChanged)
Q_PROPERTY(QStringList lastChannel MEMBER currentLastChannel NOTIFY lastChannelChanged)
+ Q_PROPERTY(QString autoChannel MEMBER autoChannel NOTIFY autoChannelChanged)
Q_PROPERTY(QString ensemble MEMBER currentEnsembleLabel NOTIFY ensembleChanged)
Q_PROPERTY(int frequency MEMBER currentFrequency NOTIFY frequencyChanged)
Q_PROPERTY(quint32 service MEMBER currentService NOTIFY stationChanged)
+ Q_PROPERTY(quint32 autoService MEMBER autoService NOTIFY autoServiceChanged)
Q_PROPERTY(QString stationType MEMBER currentStationType NOTIFY stationTypChanged)
Q_PROPERTY(QString languageType MEMBER currentLanguageType NOTIFY languageTypeChanged)
Q_PROPERTY(QString title MEMBER currentTitle NOTIFY titleChanged)
@@ -105,7 +110,7 @@ public:
void setDeviceParam(QString param, QString value);
Q_INVOKABLE void play(QString channel, QString title, quint32 service);
void pause();
- void stop();
+ Q_INVOKABLE void stop();
void setService(uint32_t service, bool force = false);
void setChannel(QString Channel, bool isScan, bool Force = false);
Q_INVOKABLE void setManualChannel(QString Channel);
@@ -138,7 +143,7 @@ public:
virtual void onNewDynamicLabel(const std::string& label) override;
virtual void onMOT(const mot_file_t& mot_file) override;
virtual void onPADLengthError(size_t announced_xpad_len, size_t xpad_len) override;
- virtual void onSNR(int snr) override;
+ virtual void onSNR(float snr) override;
virtual void onFrequencyCorrectorChange(int fine, int coarse) override;
virtual void onSyncChange(char isSync) override;
virtual void onSignalPresence(bool isSignal) override;
@@ -157,7 +162,7 @@ public:
private:
void initialise(void);
void resetTechnicalData(void);
- void deviceRestart(void);
+ bool deviceRestart(void);
std::shared_ptr<CVirtualInput> device;
QVariantMap commandLineOptions;
@@ -178,18 +183,20 @@ private:
QString errorMsg;
QDateTime currentDateTime;
+ bool isPlaying = false;
bool isSync = false;
bool isFICCRC = false;
bool isSignal = false;
bool isDAB = false;
QString audioMode = "";
- int snr = 0;
+ float snr = 0;
int frequencyCorrection = 0;
float frequencyCorrectionPpm = 0.0;
int bitRate = 0;
int audioSampleRate = 0;
int frameErrors = 0;
- int rsErrors = 0;
+ int rsUncorrectedErrors = 0;
+ int rsCorrectedErrors = 0;
int aaErrors = 0;
int gainCount = 0;
int stationCount = 0;
@@ -250,17 +257,20 @@ signals:
void deviceNameChanged();
void deviceIdChanged();
void dateTimeChanged(QDateTime);
+ void isPlayingChanged(bool);
+ void isChannelScanChanged(bool isChannelScan);
void isSyncChanged(bool);
void isFICCRCChanged(bool);
void isSignalChanged(bool);
void isDABChanged(bool);
void audioModeChanged(QString);
- void snrChanged(int);
+ void snrChanged(float);
void frequencyCorrectionChanged(int);
void frequencyCorrectionPpmChanged(float);
void bitRateChanged(int);
void frameErrorsChanged(int);
- void rsErrorsChanged(int);
+ void rsUncorrectedErrorsChanged(int);
+ void rsCorrectedErrorsChanged(int);
void aacErrorsChanged(int);
void gainCountChanged(int);
@@ -269,15 +279,17 @@ signals:
void agcChanged(bool);
void gainValueChanged(float);
void gainChanged(int);
- void volumeChanged(qreal);
+ void volumeChanged(qreal volume);
void motChanged(mot_file_t);
void motReseted(void);
void channelChanged();
void lastChannelChanged();
+ void autoChannelChanged(QString autoChannel);
void ensembleChanged();
void frequencyChanged();
void stationChanged();
+ void autoServiceChanged(quint32 autoService);
void stationTypChanged();
void titleChanged();
void textChanged();
diff --git a/src/welle-gui/resources.qrc b/src/welle-gui/resources.qrc
index 588b697..12c5d3c 100644
--- a/src/welle-gui/resources.qrc
+++ b/src/welle-gui/resources.qrc
@@ -24,6 +24,8 @@
<file>icons/welle_io_icons/20x20/antenna_no_signal.png</file>
<file>icons/welle_io_icons/20x20/speaker.png</file>
<file>icons/welle_io_icons/20x20/speaker_mute.png</file>
+ <file>icons/welle_io_icons/20x20/play.png</file>
+ <file>icons/welle_io_icons/20x20/stop.png</file>
<file>icons/welle_io_icons/20x20@2/back.png</file>
<file>icons/welle_io_icons/20x20@2/next.png</file>
<file>icons/welle_io_icons/20x20@2/drawer.png</file>
@@ -35,6 +37,8 @@
<file>icons/welle_io_icons/20x20@2/antenna_no_signal.png</file>
<file>icons/welle_io_icons/20x20@2/speaker.png</file>
<file>icons/welle_io_icons/20x20@2/speaker_mute.png</file>
+ <file>icons/welle_io_icons/20x20@2/play.png</file>
+ <file>icons/welle_io_icons/20x20@2/stop.png</file>
<file>icons/welle_io_icons/20x20@3/back.png</file>
<file>icons/welle_io_icons/20x20@3/next.png</file>
<file>icons/welle_io_icons/20x20@3/drawer.png</file>
@@ -46,6 +50,8 @@
<file>icons/welle_io_icons/20x20@3/antenna_no_signal.png</file>
<file>icons/welle_io_icons/20x20@3/speaker.png</file>
<file>icons/welle_io_icons/20x20@3/speaker_mute.png</file>
+ <file>icons/welle_io_icons/20x20@3/play.png</file>
+ <file>icons/welle_io_icons/20x20@3/stop.png</file>
<file>icons/welle_io_icons/20x20@4/back.png</file>
<file>icons/welle_io_icons/20x20@4/next.png</file>
<file>icons/welle_io_icons/20x20@4/drawer.png</file>
@@ -57,6 +63,8 @@
<file>icons/welle_io_icons/20x20@4/antenna_no_signal.png</file>
<file>icons/welle_io_icons/20x20@4/speaker.png</file>
<file>icons/welle_io_icons/20x20@4/speaker_mute.png</file>
+ <file>icons/welle_io_icons/20x20@4/play.png</file>
+ <file>icons/welle_io_icons/20x20@4/stop.png</file>
<file>i18n/de_DE.qm</file>
<file>i18n/it_IT.qm</file>
<file>i18n/hu_HU.qm</file>
@@ -93,6 +101,7 @@
<file>QML/components/WButton.qml</file>
<file>QML/components/WSpectrum.qml</file>
<file>QML/components/WMenu.qml</file>
+ <file>QML/components/WToolTip.qml</file>
<file>QML/components/qmldir</file>
<file>QML/expertviews/ServiceDetails.qml</file>
<file>QML/expertviews/ImpulseResponseGraph.qml</file>
diff --git a/src/welle-gui/version.h b/src/welle-gui/version.h
index 0e13fa4..c10d7dd 100644
--- a/src/welle-gui/version.h
+++ b/src/welle-gui/version.h
@@ -5,5 +5,5 @@
#define GITHASH "unknown"
#endif
-#define CURRENT_VERSION "2.2"
+#define CURRENT_VERSION "2.4"
diff --git a/src/welle-gui/waterfallitem.cpp b/src/welle-gui/waterfallitem.cpp
index 6b58a48..5ac6d9d 100644
--- a/src/welle-gui/waterfallitem.cpp
+++ b/src/welle-gui/waterfallitem.cpp
@@ -40,7 +40,6 @@ WaterfallItem::WaterfallItem(QQuickItem *parent)
_samplesUpdated = false;
_image = QImage((int)this->width(), (int)this->height(), QImage::Format_ARGB32);
_image.fill(QColor(255, 255, 255));
- _sensitivity = 0.05;
// Generate displayable colors
QImage img(500, 1, QImage::Format_ARGB32);
@@ -113,15 +112,6 @@ void WaterfallItem::plotMessage(QString message)
messageToPlot = message;
}
-float WaterfallItem::sensitivity() const {
- return _sensitivity;
-}
-
-void WaterfallItem::setSensitivity(float value) {
- _sensitivity = value;
- emit this->sensitivityChanged();
-}
-
float WaterfallItem::minValue() const
{
return _minValue;
@@ -146,11 +136,21 @@ void WaterfallItem::samplesCollected() {
QPainter painter;
painter.begin(&img);
+ // Find max value
+ float maxValue = 0;
+ for(int x = 0; x < _sampleNumber; x++)
+ {
+ float amplitude = (dataSeries.at(x).y() - _minValue);
+ if(maxValue < amplitude)
+ maxValue = amplitude;
+ }
+
// Draw 1st pixel row: new values
for (int x = 0; x < img.width(); x++) {
unsigned i1 = x * _sampleNumber / img.width();
- float amplitude = dataSeries.at(i1).y() - _minValue;
- int value = (int)(amplitude * (float)_sensitivity * (float)_colors.length());
+ float amplitude = (dataSeries.at(i1).y() - _minValue);
+
+ int value = (int)(amplitude / maxValue * 256); // Scale to max value
if (value < 0)
value = 0;
if (value >= _colors.length())
@@ -167,7 +167,7 @@ void WaterfallItem::samplesCollected() {
// Draw message into the plot
if(!messageToPlot.isEmpty()) {
- // Draw everthing in black
+ // Draw everything in black
painter.setPen(QColor("black"));
// Draw horizontal line
diff --git a/src/welle-gui/waterfallitem.h b/src/welle-gui/waterfallitem.h
index 7a27a7a..c9d327d 100644
--- a/src/welle-gui/waterfallitem.h
+++ b/src/welle-gui/waterfallitem.h
@@ -29,13 +29,11 @@ class WaterfallItem : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(bool isStarted READ isStarted NOTIFY isStartedChanged)
- Q_PROPERTY(float sensitivity READ sensitivity WRITE setSensitivity NOTIFY sensitivityChanged)
Q_PROPERTY(float minValue READ minValue WRITE setMinValue NOTIFY minMinValueChanged)
QImage _image;
QList<QRgb> _colors;
bool _samplesUpdated;
- float _sensitivity;
float _minValue;
QLineSeries dataSeries;
QString messageToPlot;
@@ -44,7 +42,6 @@ public:
explicit WaterfallItem(QQuickItem *parent = 0);
void paint(QPainter *painter);
bool isStarted() const;
- float sensitivity() const;
void setSensitivity(float value);
float minValue() const;
void setMinValue(float value);
diff --git a/src/welle-gui/welle-gui.pro b/src/welle-gui/welle-gui.pro
index ae6761a..6fef182 100644
--- a/src/welle-gui/welle-gui.pro
+++ b/src/welle-gui/welle-gui.pro
@@ -2,7 +2,7 @@ include(../backend.pri)
TEMPLATE = app
TARGET = welle-io
-QT += quickcontrols2 qml quick charts multimedia
+QT += quickcontrols2 qml quick charts multimedia dbus
RC_ICONS = icons/icon.ico
RESOURCES += resources.qrc
@@ -57,7 +57,15 @@ DISTFILES += \
QML/components/WSpectrum.qml \
QML/components/WMenu.qml \
QML/expertviews/ServiceDetails.qml \
- QML/components/WDialog.qml
+ QML/components/WDialog.qml \
+ android/AndroidManifest.xml \
+ android/build.gradle \
+ android/gradle/wrapper/gradle-wrapper.jar \
+ android/gradle/wrapper/gradle-wrapper.properties \
+ android/gradle.properties \
+ android/gradlew \
+ android/gradlew.bat \
+ android/res/values/libs.xml
ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
@@ -84,6 +92,9 @@ HEADERS += \
gui_helper.h \
mot_image_provider.h \
radio_controller.h \
+ mpris/mpris.h \
+ mpris/mpris_mp2.h \
+ mpris/mpris_mp2_player.h \
waterfallitem.h \
version.h
@@ -94,21 +105,57 @@ SOURCES += \
gui_helper.cpp \
mot_image_provider.cpp \
radio_controller.cpp \
+ mpris/mpris.cpp \
+ mpris/mpris_mp2.cpp \
+ mpris/mpris_mp2_player.cpp \
waterfallitem.cpp
android {
QT += androidextras
+ QT += svg
+ QT += multimediawidgets
+ qtHaveModule(virtualkeyboard): QT += virtualkeyboard
+
HEADERS += android_rtl_sdr.h
SOURCES += android_rtl_sdr.cpp
+
+ # Remove MPRIS related code since Qt for Android doesn't ship dbus
+ QT -= dbus
+ SOURCES -= \
+ mpris/mpris.cpp \
+ mpris/mpris_mp2.cpp \
+ mpris/mpris_mp2_player.cpp
+ HEADERS -= \
+ mpris/mpris.h \
+ mpris/mpris_mp2.h \
+ mpris/mpris_mp2_player.h
}
-# Include git hash into build
+# Include git hash & BUILD_DATE into build
unix: {
GITHASHSTRING = $$system(git rev-parse --short HEAD)
+ isEmpty(SOURCE_DATE_EPOCH) {
+ SOURCE_DATE_EPOCH=$$(SOURCE_DATE_EPOCH)
+ }
+ isEmpty(SOURCE_DATE_EPOCH) {
+ SOURCE_DATE_EPOCH=$$system(git log -1 --pretty=%ct)
+ }
+ isEmpty(SOURCE_DATE_EPOCH) {
+ SOURCE_DATE_EPOCH=$$system(date +%s)
+ }
}
win32 {
GITHASHSTRING = $$system(git.exe rev-parse --short HEAD)
+ isEmpty(SOURCE_DATE_EPOCH) {
+ SOURCE_DATE_EPOCH=$$(SOURCE_DATE_EPOCH)
+ }
+ isEmpty(SOURCE_DATE_EPOCH) {
+ SOURCE_DATE_EPOCH=$$system(git.exe log -1 --pretty=%ct)
+ }
+ isEmpty(SOURCE_DATE_EPOCH) {
+ SOURCE_DATE_EPOCH=$$system(powershell -Command (Get-Date -UFormat %s -Millisecond 0))
+ }
} else:macx {
ICON = icons/icon.icns
}
@@ -120,3 +167,11 @@ win32 {
else {
warning("Can't get git hash.")
}
+
+!isEmpty(SOURCE_DATE_EPOCH) {
+ message("BUILD_DATE = $$SOURCE_DATE_EPOCH")
+ DEFINES += BUILD_DATE=\\\"$$SOURCE_DATE_EPOCH\\\"
+}
+else {
+ warning("BUILD_DATE could not be set.")
+}
diff --git a/welle.io.pro b/welle.io.pro
index cf8e069..befece9 100644
--- a/welle.io.pro
+++ b/welle.io.pro
@@ -1,11 +1,11 @@
TEMPLATE = subdirs
SUBDIRS = src/welle-gui
-!android: {
-SUBDIRS += \
- src/welle-cli \
- src/tests
-}
+#!android: {
+#SUBDIRS += \
+# src/welle-cli \
+# src/tests
+#}
DISTFILES += $$PWD/README.md
diff --git a/windows/create_installer.ps1 b/windows/create_installer.ps1
index 86c33eb..882f248 100644
--- a/windows/create_installer.ps1
+++ b/windows/create_installer.ps1
@@ -79,5 +79,5 @@ $Filename = $Date + "_" + $gitHash + "_Windows_welle-io-setup.exe"
Write-Host "*** Creating $Filename ***" -ForegroundColor Red
& "binarycreator" "--offline-only" "--config" "installer\config\config.xml" "--packages" "installer\packages" "$Filename"
-# Store file name to a enviroment variable
+# Store file name to a environment variable
$env:welle_io_filename = $Filename
diff --git a/windows/packages/io.welle.welle/meta/package.xml b/windows/packages/io.welle.welle/meta/package.xml
index 72a7b8f..dbd0644 100644
--- a/windows/packages/io.welle.welle/meta/package.xml
+++ b/windows/packages/io.welle.welle/meta/package.xml
@@ -2,8 +2,8 @@
<Package>
<DisplayName>welle.io</DisplayName>
<Description>welle.io</Description>
- <Version>2.0</Version>
- <ReleaseDate>2018-09-07</ReleaseDate>
+ <Version>2.3</Version>
+ <ReleaseDate>2021-05-22</ReleaseDate>
<Licenses>
<License name="GNU GENERAL PUBLIC LICENSE" file="COPYING" />
</Licenses>