From fc4c42ffd430384edc8bad6e046eb34bddb3a321 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Wed, 24 Jan 2024 21:02:06 +0100 Subject: [PATCH 01/14] build instructions --- build.ios.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 build.ios.md diff --git a/build.ios.md b/build.ios.md new file mode 100644 index 0000000..f5b390f --- /dev/null +++ b/build.ios.md @@ -0,0 +1,22 @@ +# Prepare QT environment +``` +pip3 install aqtinstall + +aqt install-qt mac desktop 6.6.1 clang_64 +aqt install-qt mac ios 6.6.1 + +#aqt list-qt mac ios --modules 6.6.1 ios +aqt install-qt mac ios 6.6.1 -m qtmultimedia + +./6.6.1/ios/bin/qmake ../DroidStar.pro +make + +open DroidStar.xcodeproj +``` + + + + +# References +- https://stackoverflow.com/questions/2664885/xcode-build-and-archive-from-command-line +- https://github.com/marketplace/actions/install-qt From bd73d8f26f765a9fcb31cb5fa2ded5be713533d9 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Wed, 24 Jan 2024 21:21:43 +0100 Subject: [PATCH 02/14] config --- build.ios.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build.ios.md b/build.ios.md index f5b390f..5cb01fd 100644 --- a/build.ios.md +++ b/build.ios.md @@ -15,6 +15,16 @@ open DroidStar.xcodeproj ``` +# Configration +In Settings +- Callsign +- DMRID +- BM Pass (hotspot) +In Main +- Mode DMR +- Host +- SWTX, SWRX, AGC +- TG: i.e. 9990 with private (parrot) # References From 9b0eef430e721c58fcfb6377d1f4f01b93312a7b Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Sat, 27 Jan 2024 18:09:26 +0100 Subject: [PATCH 03/14] ignore build dirs --- .gitignore | 3 +++ DroidStar.code-workspace | 10 ++++++++++ 2 files changed, 13 insertions(+) create mode 100644 .gitignore create mode 100644 DroidStar.code-workspace diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c1f3e08 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +build/* +build_*/* \ No newline at end of file diff --git a/DroidStar.code-workspace b/DroidStar.code-workspace new file mode 100644 index 0000000..fd3b45f --- /dev/null +++ b/DroidStar.code-workspace @@ -0,0 +1,10 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "git.ignoreLimitWarning": true + } +} \ No newline at end of file From bb881926fe7ad86ad78f838078e3ca49692baa37 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Sat, 27 Jan 2024 18:11:24 +0100 Subject: [PATCH 04/14] qt build --- build.ios.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/build.ios.md b/build.ios.md index 5cb01fd..d07858f 100644 --- a/build.ios.md +++ b/build.ios.md @@ -1,14 +1,16 @@ # Prepare QT environment ``` pip3 install aqtinstall +QT_VERSION=6.6.1 -aqt install-qt mac desktop 6.6.1 clang_64 -aqt install-qt mac ios 6.6.1 +mkdir build_ios +cd build_ios -#aqt list-qt mac ios --modules 6.6.1 ios -aqt install-qt mac ios 6.6.1 -m qtmultimedia +aqt install-qt mac desktop $QT_VERSION clang_64 +aqt install-qt mac ios $QT_VERSION +aqt install-qt mac ios $QT_VERSION -m qtmultimedia -./6.6.1/ios/bin/qmake ../DroidStar.pro +./$QT_VERSION/ios/bin/qmake ../DroidStar.pro make open DroidStar.xcodeproj From fd39a288680ad381f0b78df1d2b45730dd5c9bd6 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Sat, 3 Feb 2024 14:41:29 +0100 Subject: [PATCH 05/14] cleanup doc --- README.md | 44 ++++++++++++++++++++++++++++++++------------ build.ios.md | 34 ---------------------------------- 2 files changed, 32 insertions(+), 46 deletions(-) delete mode 100644 build.ios.md diff --git a/README.md b/README.md index 22fb66d..e6f2d3b 100644 --- a/README.md +++ b/README.md @@ -34,18 +34,13 @@ I added Flite TTS TX capability so I didn't have to talk to myself all of the ti # Usage Linux users with USB AMBE and/or MMDVM dongles will need to make sure they have permission to use the USB serial device, and disable the archaic ModeManager service that still exists on many Linux systems. On most systems this means adding your user to the 'dialout' group, and running 'sudo systemctl disable ModemManager.service' and rebooting. This is a requirement for any serial device to be accessed. -Host/Mod: Select the desired host and module (for D-STAR and M17) from the selections. - -Callsign: Enter your amateur radio callsign. A valid license is required to use this software. - -DMRID: A valid DMR ID is required to connect to DMR servers. -Latitude/Longitude/Location/Description: These are DMR config options, sent to the DMR server during connect. Some servers require specific values here, some do not. This is specific to the server you are connecting to, so please dont ask what these values should be. - -DMR+ IPSC2 hosts: The format for the DMR+ options string is the complete string including 'Options='. Create your options string and check 'Send DMR+ options on connect' before connecting. A description of the DMR+ options string can be found here: https://github.com/g4klx/MMDVMHost/blob/master/DMRplus_startup_options.md . - -Talkgroup: For DMR, enter the talkgroup ID number. A very active TG for testing functionality on Brandmeister is 91 (Brandmeister Worldwide). You must TX with a talkgroup entered to link to that talkgroup, just like a real radio. Any statics you have defined in BM selfcare will work the same way they do if you were using a hotspot/radio. - -MYCALL/URCALL/RPTR1/RPTR2 are for Dstar modes REF/DCS/XRF. These fields need to be entered correctly before attempting to TX on any DSTAR reflector. All fields are populated with suggested values upon connect, but can still be modified for advanced users. RPT2 is always overwritten with the current reflector upon connected. +* Host/Mod: Select the desired host and module (for D-STAR and M17) from the selections. +* Callsign: Enter your amateur radio callsign. A valid license is required to use this software. +* DMRID: A valid DMR ID is required to connect to DMR servers. +* Latitude/Longitude/Location/Description: These are DMR config options, sent to the DMR server during connect. Some servers require specific values here, some do not. This is specific to the server you are connecting to, so please dont ask what these values should be. +* DMR+ IPSC2 hosts: The format for the DMR+ options string is the complete string including 'Options='. Create your options string and check 'Send DMR+ options on connect' before connecting. A description of the DMR+ options string can be found here: https://github.com/g4klx/MMDVMHost/blob/master/DMRplus_startup_options.md . +* Talkgroup: For DMR, enter the talkgroup ID number. A very active TG for testing functionality on Brandmeister is 91 (Brandmeister Worldwide). You must TX with a talkgroup entered to link to that talkgroup, just like a real radio. Any statics you have defined in BM selfcare will work the same way they do if you were using a hotspot/radio. +* MYCALL/URCALL/RPTR1/RPTR2 are for Dstar modes REF/DCS/XRF. These fields need to be entered correctly before attempting to TX on any DSTAR reflector. All fields are populated with suggested values upon connect, but can still be modified for advanced users. RPT2 is always overwritten with the current reflector upon connected. # IAX Client for AllStar DroidStar can connect to an AllStar node as an IAX(2) client. See the AllStar wiki and other AllStar, Asterisk, and IAX2 protocal related websites for the technical details of IAX2 for AllStar. This is a basic client and currently only uLaw audio codec is supported. This is the default codec on most AllStar nodes. @@ -91,6 +86,31 @@ My primary development platform is Fedora Linux. With a proper build environmen All of the gradle build files are provided to create an APK file ready to be installed on an Android device. A proper Android build system including the Android NDK is required and beyond the scope of this document. +## Note for building for iOS +Building for iOS is only possible on a mac with xcode installed. In a first step you have install a recent QT version; a convenient way +to do this is using aqtinstall as follows: +``` +pip3 install aqtinstall +QT_VERSION=6.6.1 + +mkdir build_ios +cd build_ios + +aqt install-qt mac desktop $QT_VERSION clang_64 +aqt install-qt mac ios $QT_VERSION +aqt install-qt mac ios $QT_VERSION -m qtmultimedia +``` +Afterwards you can create the xcode project using the qmake version for iOS, i.e.: +``` +./$QT_VERSION/ios/bin/qmake ../DroidStar.pro +make +``` +Once this is done, you can open the xcode project +``` +open DroidStar.xcodeproj +``` +and build (or deploy to Testflight) as with any other iOS app. + # No builds are available on Github No builds for any platform are available on this Github site. This is and always will be an open source project, to be used for educational and development purposes only. I am currently providing a Windows build which is *not* to be confused as any sort of official release of any kind. No support will be provided for any build at any time. diff --git a/build.ios.md b/build.ios.md deleted file mode 100644 index d07858f..0000000 --- a/build.ios.md +++ /dev/null @@ -1,34 +0,0 @@ -# Prepare QT environment -``` -pip3 install aqtinstall -QT_VERSION=6.6.1 - -mkdir build_ios -cd build_ios - -aqt install-qt mac desktop $QT_VERSION clang_64 -aqt install-qt mac ios $QT_VERSION -aqt install-qt mac ios $QT_VERSION -m qtmultimedia - -./$QT_VERSION/ios/bin/qmake ../DroidStar.pro -make - -open DroidStar.xcodeproj -``` - - -# Configration -In Settings -- Callsign -- DMRID -- BM Pass (hotspot) -In Main -- Mode DMR -- Host -- SWTX, SWRX, AGC -- TG: i.e. 9990 with private (parrot) - - -# References -- https://stackoverflow.com/questions/2664885/xcode-build-and-archive-from-command-line -- https://github.com/marketplace/actions/install-qt From ab4462a5b674486e3e7e043f72acd84a5bedbc93 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Thu, 9 Apr 2026 16:35:11 +0200 Subject: [PATCH 06/14] Use git describe for VERSION_NUMBER and set project version to 0.90.0 --- CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 38c89cc..149c270 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.16) -project(DroidStar VERSION 1.0 LANGUAGES C CXX) +project(DroidStar VERSION 0.90.0 LANGUAGES C CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -103,7 +103,7 @@ qt_add_qml_module(DroidStar ) execute_process( - COMMAND git rev-parse --short HEAD + COMMAND git describe --tags --always WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} OUTPUT_VARIABLE VERSION_NUMBER OUTPUT_STRIP_TRAILING_WHITESPACE From f2e984507182340c0c48e025eb05fe9ee7ddb4ae Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Thu, 9 Apr 2026 19:12:47 +0200 Subject: [PATCH 07/14] Add copilot-instructions.md with project architecture and build docs --- .github/copilot-instructions.md | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..d61c6c6 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,71 @@ +# Copilot Instructions for DroidStar + +## Project Overview + +DroidStar is a cross-platform amateur radio digital voice client that connects to M17, D-STAR (REF/XRF/DCS), DMR, YSF/FCS, P25, NXDN reflectors and AllStar nodes (IAX2). Built with C++/Qt6 Quick (QML) and targets Linux, Windows, macOS, Android, and iOS. + +Licensed under GPL v3. + +## Build + +Requires **Qt6 >= 6.5** with modules: Core, Gui, Multimedia, Network, Quick, QuickControls2, SerialPort (except iOS). + +```bash +mkdir build && cd build +cmake .. +make +``` + +### Compile-time feature flags (in CMakeLists.txt) + +- `VOCODER_PLUGIN` — build without internal AMBE vocoder (plugin-only mode) +- `USE_FLITE` — enable Flite text-to-speech for TX +- `USE_EXTERNAL_CODEC2` — link system codec2 instead of bundled C++ port +- `USE_MD380_VOCODER` — enable md380 vocoder (ARM platforms, requires external lib) + +Toggle these by changing `if(TRUE)` / `if(FALSE)` blocks or uncommenting `DEFINES+=` lines in CMakeLists.txt. + +## Architecture + +### Core layers + +1. **QML UI** (`Main.qml`, `MainTab.qml`, `SettingsTab.qml`, `LogTab.qml`, `HostsTab.qml`, `AboutTab.qml`) — Qt Quick tabbed interface. The `DroidStar` C++ type is registered as `org.dudetronics.droidstar` and instantiated directly in QML. + +2. **DroidStar** (`droidstar.h/.cpp`) — Application controller (QObject). Manages settings, host lists, device discovery, and user interactions. Creates protocol `Mode` instances and moves them to a worker `QThread`. + +3. **Mode** (`mode.h/.cpp`) — Abstract base class for all digital voice protocols. Owns the `QUdpSocket`, audio engine, vocoder state, and MMDVM modem connection. Each protocol subclass implements `process_udp()`, `transmit()`, `send_ping()`, `send_disconnect()`, and `hostname_lookup()`. + +4. **Protocol subclasses** — One per protocol, all inheriting `Mode`: + - `REF`, `XRF`, `DCS` — D-STAR reflector protocols + - `DMR` — DMR with Brandmeister/TGIF/DMR+ auth + - `YSF` — Yaesu System Fusion (also used for FCS) + - `P25`, `NXDN` — P25 and NXDN reflectors + - `M17` — M17 protocol with Codec2 vocoder + - `IAX` — AllStar IAX2 client + +5. **AudioEngine** (`audioengine.h/.cpp`) — Wraps Qt audio I/O with AGC, capture/playback queues, and 8kHz PCM processing. + +### Factory pattern + +`Mode::create_mode(QString)` in `mode.cpp` is the factory that instantiates protocol subclasses by name string (e.g., `"DMR"`, `"M17"`). The `DroidStar` controller calls this, then moves the `Mode` to its own thread and wires up Qt signal/slot connections. + +### Vocoder system + +Three vocoder paths exist: +- **Hardware**: USB AMBE devices via `SerialAMBE` (not available on iOS) +- **Software plugin**: Dynamic loading (`dlopen`/`LoadLibrary`) via the `Vocoder` interface in `vocoder_plugin.h` +- **Bundled**: `codec2/` (C++ port for M17), `imbe_vocoder/` (P25), `mbe/` (DMR/D-STAR/YSF/NXDN) + +### Threading model + +Each active `Mode` runs on its own `QThread`. Communication between the QML UI ↔ `DroidStar` controller ↔ `Mode` worker is entirely via Qt signals and slots. + +## Key Conventions + +- **Flat source layout**: All protocol implementations and helpers are in the project root (no `src/` directory). +- **Platform conditionals**: Heavy use of `#ifdef Q_OS_ANDROID`, `Q_OS_IOS`, `Q_OS_WIN` and CMake `if(IOS)` / `if(ANDROID)` / `if(WIN32)` blocks. iOS excludes serial port support entirely. +- **No test suite**: There are no automated tests in this project. +- **Settings persistence**: `QSettings` stores all user config; `save_settings()` is called from nearly every setter in `DroidStar`. +- **Host files**: Reflector/server lists (DMRHosts.txt, DMRIDs.data, etc.) are downloaded at runtime and stored in the platform's config directory (`~/.config/dudetronics` on Linux). +- **Signal/slot wiring**: `DroidStar::process_connect()` contains extensive signal/slot connections between the controller and the active `Mode`. When adding new protocol features, connections must be added here. +- **QML registration**: The `DroidStar` type is registered via `qmlRegisterType` in `main.cpp` and accessed from QML as a singleton-like instance. From 913be037b2628d558321f14a908319d538db4555 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Thu, 9 Apr 2026 20:09:36 +0200 Subject: [PATCH 08/14] Fix iOS build: exclude md380_vocoder and link FFmpeg frameworks for Qt Multimedia --- CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 149c270..e60eea7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,6 +148,10 @@ if(APPLE) target_link_libraries(DroidStar PRIVATE "-framework AVFoundation" ) + if(IOS) + include(${Qt6Multimedia_DIR}/Qt6MultimediaMacros.cmake) + qt_add_ios_ffmpeg_libraries(DroidStar) + endif() endif() if(ANDROID) @@ -210,7 +214,7 @@ if(FALSE) # set TRUE for flite ) endif() -if(TRUE) # set TRUE for md380_vocoder +if(NOT IOS) # md380_vocoder is not available on iOS target_compile_definitions(DroidStar PRIVATE USE_MD380_VOCODER ) From 63b563afbdceb4104f8e3fd5f3dff281244916a2 Mon Sep 17 00:00:00 2001 From: Gerolf Ziegenhain Date: Thu, 9 Apr 2026 20:27:34 +0200 Subject: [PATCH 09/14] Fix Info.plist for iOS: add bundle ID, version strings, orientations, app icon, and asset catalog integration --- CMakeLists.txt | 9 +++++++++ Info.plist | 15 ++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e60eea7..103d1eb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -145,10 +145,19 @@ endif() if(APPLE) set_target_properties(DroidStar PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist) + set_target_properties(DroidStar PROPERTIES + MACOSX_BUNDLE_GUI_IDENTIFIER org.dudetronics.droidstar + XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER org.dudetronics.droidstar + ) target_link_libraries(DroidStar PRIVATE "-framework AVFoundation" ) if(IOS) + set_target_properties(DroidStar PROPERTIES + XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME AppIcon + ) + set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/Images.xcassets PROPERTIES MACOSX_PACKAGE_LOCATION Resources) + target_sources(DroidStar PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/Images.xcassets") include(${Qt6Multimedia_DIR}/Qt6MultimediaMacros.cmake) qt_add_ios_ffmpeg_libraries(DroidStar) endif() diff --git a/Info.plist b/Info.plist index 450494d..8b49017 100755 --- a/Info.plist +++ b/Info.plist @@ -8,15 +8,28 @@ DroidStar CFBundleIconFile droidstar.icns + CFBundleIconName + AppIcon CFBundleIdentifier - com.yourcompany.90d5dd37.DroidStar + org.dudetronics.droidstar CFBundleName DroidStar CFBundlePackageType APPL + CFBundleShortVersionString + 0.90.0 + CFBundleVersion + 90 NSMicrophoneUsageDescription You know you want to... UILaunchStoryboardName LaunchScreen + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + From b456618ba32483a343c816bb71fed21e81f91722 Mon Sep 17 00:00:00 2001 From: "Dr. Gerolf Ziegenhain" Date: Thu, 9 Apr 2026 23:19:50 +0200 Subject: [PATCH 10/14] fix(ios): add NSCameraUsageDescription and bump build to 91 Resolves ITMS-90683 App Store rejection by adding required NSCameraUsageDescription key to Info.plist. Bumps build number from 90 to 91 for resubmission. --- Info.plist | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Info.plist b/Info.plist index 8b49017..cf7e68f 100755 --- a/Info.plist +++ b/Info.plist @@ -19,7 +19,9 @@ CFBundleShortVersionString 0.90.0 CFBundleVersion - 90 + 91 + NSCameraUsageDescription + DroidStar does not use the camera, but a linked library references the Camera API. NSMicrophoneUsageDescription You know you want to... UILaunchStoryboardName From 0815b480282c2b8e84ccbec93c95d91918acb02d Mon Sep 17 00:00:00 2001 From: "Dr. Gerolf Ziegenhain" Date: Thu, 9 Apr 2026 23:28:51 +0200 Subject: [PATCH 11/14] fix(ios): add ITSAppUsesNonExemptEncryption to skip TestFlight compliance dialog Sets ITSAppUsesNonExemptEncryption=NO since DroidStar only uses standard HTTPS via Qt Network (exempt under US export regulations). --- Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Info.plist b/Info.plist index cf7e68f..8a1a683 100755 --- a/Info.plist +++ b/Info.plist @@ -20,6 +20,8 @@ 0.90.0 CFBundleVersion 91 + ITSAppUsesNonExemptEncryption + NSCameraUsageDescription DroidStar does not use the camera, but a linked library references the Camera API. NSMicrophoneUsageDescription From 5a195108b7538022ce55367755e9ed992102cdb4 Mon Sep 17 00:00:00 2001 From: "Dr. Gerolf Ziegenhain" Date: Thu, 9 Apr 2026 23:32:47 +0200 Subject: [PATCH 12/14] build(ios): bump build number to 92 for TestFlight resubmission --- Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Info.plist b/Info.plist index 8a1a683..e4a8bd0 100755 --- a/Info.plist +++ b/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 0.90.0 CFBundleVersion - 91 + 92 ITSAppUsesNonExemptEncryption NSCameraUsageDescription From f85da60236535164a3f9654e1aafacdbd5ba6c97 Mon Sep 17 00:00:00 2001 From: "Dr. Gerolf Ziegenhain" Date: Thu, 9 Apr 2026 23:36:55 +0200 Subject: [PATCH 13/14] fix: resolve all compiler warnings for iOS build - Replace sprintf with snprintf in dmr.cpp and ysf.cpp - Add explicit casts for long-to-int conversions in codec2/quantise.cpp, audioengine.cpp, dcs.cpp, m17.cpp - Suppress nodiscard warning in httpmanager.cpp - Bump build number to 93 --- Info.plist | 2 +- audioengine.cpp | 2 +- codec2/quantise.cpp | 4 ++-- dcs.cpp | 2 +- dmr.cpp | 6 +++--- httpmanager.cpp | 2 +- m17.cpp | 2 +- ysf.cpp | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Info.plist b/Info.plist index e4a8bd0..2efbe37 100755 --- a/Info.plist +++ b/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 0.90.0 CFBundleVersion - 92 + 93 ITSAppUsesNonExemptEncryption NSCameraUsageDescription diff --git a/audioengine.cpp b/audioengine.cpp index 381e3c1..f384886 100644 --- a/audioengine.cpp +++ b/audioengine.cpp @@ -268,7 +268,7 @@ uint16_t AudioEngine::read(int16_t *pcm) s = 160; } else{ - s = m_audioinq.size(); + s = (int)m_audioinq.size(); } for(int i = 0; i < s; ++i){ diff --git a/codec2/quantise.cpp b/codec2/quantise.cpp index dd3e4ef..61ff07b 100644 --- a/codec2/quantise.cpp +++ b/codec2/quantise.cpp @@ -102,7 +102,7 @@ void CQuantize::encode_lspds_scalar(int indexes[], float lsp[], int order) k = lsp_cbd[i].k; m = lsp_cbd[i].m; cb = lsp_cbd[i].cb; - indexes[i] = quantise(cb, &dlsp[i], wt, k, m, &se); + indexes[i] = (int)quantise(cb, &dlsp[i], wt, k, m, &se); dlsp_[i] = cb[indexes[i]*k]; @@ -572,7 +572,7 @@ void CQuantize::encode_lsps_scalar(int indexes[], float lsp[], int order) k = lsp_cb[i].k; m = lsp_cb[i].m; cb = lsp_cb[i].cb; - indexes[i] = quantise(cb, &lsp_hz[i], wt, k, m, &se); + indexes[i] = (int)quantise(cb, &lsp_hz[i], wt, k, m, &se); } } diff --git a/dcs.cpp b/dcs.cpp index f88aa37..e472e20 100755 --- a/dcs.cpp +++ b/dcs.cpp @@ -39,7 +39,7 @@ void DCS::process_udp() static int sd_seq = 0; static char user_data[21]; buf.resize(200); - int size = m_udp->readDatagram(buf.data(), buf.size(), &sender, &senderPort); + int size = (int)m_udp->readDatagram(buf.data(), buf.size(), &sender, &senderPort); if(m_debug){ QDebug debug = qDebug(); diff --git a/dmr.cpp b/dmr.cpp index eeb6852..ece13be 100755 --- a/dmr.cpp +++ b/dmr.cpp @@ -175,8 +175,8 @@ void DMR::process_udp() char latitude[20U]; char longitude[20U]; - sprintf(latitude, "%08f", m_lat.toFloat()); - sprintf(longitude, "%09f", m_lon.toFloat()); + snprintf(latitude, sizeof(latitude), "%08f", m_lat.toFloat()); + snprintf(longitude, sizeof(longitude), "%09f", m_lon.toFloat()); char *p; if((p = strchr(latitude, ',')) != NULL){ @@ -185,7 +185,7 @@ void DMR::process_udp() if((p = strchr(longitude, ',')) != NULL){ *p = '.'; } - ::sprintf(buffer + 8U, "%-8.8s%09u%09u%02u%02u%8.8s%9.9s%03d%-20.20s%-19.19s%c%-124.124s%-40.40s%-40.40s", m_modeinfo.callsign.toStdString().c_str(), + ::snprintf(buffer + 8U, sizeof(buffer) - 8U, "%-8.8s%09u%09u%02u%02u%8.8s%9.9s%03d%-20.20s%-19.19s%c%-124.124s%-40.40s%-40.40s", m_modeinfo.callsign.toStdString().c_str(), m_freq.toUInt(), m_freq.toUInt(), 1, 1, latitude, longitude, 0, m_location.toStdString().c_str(), m_desc.toStdString().c_str(), '4', m_url.toStdString().c_str(), m_swid.toStdString().c_str(), m_pkid.toStdString().c_str()); out.append(buffer, 302); diff --git a/httpmanager.cpp b/httpmanager.cpp index 27cda83..c2bd832 100644 --- a/httpmanager.cpp +++ b/httpmanager.cpp @@ -62,7 +62,7 @@ void HttpManager::http_finished(QNetworkReply *reply) QStringList l = m_filename.split('_'); if((l.at(0) != "/vocoder") && (l.size() > 1)) return; QFile *hosts_file = new QFile(m_config_path + m_filename); - hosts_file->open(QIODevice::WriteOnly); + (void)hosts_file->open(QIODevice::WriteOnly); QFileInfo fileInfo(hosts_file->fileName()); QString filename(fileInfo.fileName()); hosts_file->write(reply->readAll()); diff --git a/m17.cpp b/m17.cpp index 744ba28..512c8f3 100755 --- a/m17.cpp +++ b/m17.cpp @@ -106,7 +106,7 @@ void M17::encode_callsign(uint8_t *callsign) memset(cs, 0, sizeof(cs)); memcpy(cs, callsign, strlen((char *)callsign)); uint64_t encoded = 0; - for(int i = std::strlen((char *)callsign)-1; i >= 0; i--) { + for(int i = (int)std::strlen((char *)callsign)-1; i >= 0; i--) { auto pos = m17_alphabet.find(cs[i]); if (pos == std::string::npos) { pos = 0; diff --git a/ysf.cpp b/ysf.cpp index b3977a5..631e1fe 100755 --- a/ysf.cpp +++ b/ysf.cpp @@ -155,7 +155,7 @@ void YSF::process_udp() if(m_refname.left(3) == "FCS"){ char info[100U]; - ::sprintf(info, "%9u%9u%-6.6s%-12.12s%7u", 438000000, 438000000, "AA00AA", "MMDVM", 1234567); + ::snprintf(info, sizeof(info), "%9u%9u%-6.6s%-12.12s%7u", 438000000, 438000000, "AA00AA", "MMDVM", 1234567); ::memset(info + 43U, ' ', 57U); out.append(info, 100); m_udp->writeDatagram(out, m_address, m_modeinfo.port); From 0bbd159791b6706c5249092be25ddaa23b1df282 Mon Sep 17 00:00:00 2001 From: "Dr. Gerolf Ziegenhain" Date: Thu, 9 Apr 2026 23:50:39 +0200 Subject: [PATCH 14/14] fix(ios): enable dSYM generation and bump build to 94 Add XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT=dwarf-with-dsym to resolve 'Upload Symbols Failed' warnings during TestFlight distribution. --- CMakeLists.txt | 1 + Info.plist | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 103d1eb..67901c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -148,6 +148,7 @@ if(APPLE) set_target_properties(DroidStar PROPERTIES MACOSX_BUNDLE_GUI_IDENTIFIER org.dudetronics.droidstar XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER org.dudetronics.droidstar + XCODE_ATTRIBUTE_DEBUG_INFORMATION_FORMAT "dwarf-with-dsym" ) target_link_libraries(DroidStar PRIVATE "-framework AVFoundation" diff --git a/Info.plist b/Info.plist index 2efbe37..f053a6f 100755 --- a/Info.plist +++ b/Info.plist @@ -19,7 +19,7 @@ CFBundleShortVersionString 0.90.0 CFBundleVersion - 93 + 94 ITSAppUsesNonExemptEncryption NSCameraUsageDescription