arancormonk/dsd-neo
GitHub: arancormonk/dsd-neo
DSD-neo 是一个现代模块化的 C/C++ 数字语音解码器,用于高效解码多种无线电协议并提升性能和可用性。
Stars: 109 | Forks: 14
# DSD-neo
著名的数字语音解码器 (DSD) 的模块化性能增强版本,采用现代 CMake 构建,拆分为专注于特定功能的库(`runtime`、`platform`、`dsp`、`io`、`engine`、`fec`、`crypto`、`protocol`、`core`、`ui`)和一个轻量级 CLI。
项目主页:https://github.com/arancormonk/dsd-neo
[](https://github.com/arancormonk/dsd-neo/actions/workflows/linux-ci.yaml)
[](https://github.com/arancormonk/dsd-neo/actions/workflows/windows-ci.yaml)
[](https://github.com/arancormonk/dsd-neo/actions/workflows/macos-ci.yaml)
[](https://www.bestpractices.dev/projects/12978)
[](https://www.bestpractices.dev/projects/12978)

## 下载
- 稳定版本:请查看 [GitHub Releases](https://github.com/arancormonk/dsd-neo/releases)
- Linux AppImage (x86_64): `dsd-neo-linux-x86_64-portable-.AppImage`
- Linux AppImage (aarch64): `dsd-neo-linux-aarch64-portable-.AppImage`
- macOS DMG (arm64): `dsd-neo-macos-arm64-portable-.dmg`
- Windows 原生 ZIP (MSVC x86_64): `dsd-neo-msvc-x86_64-native-.zip`
- 每日构建:
- Linux AppImage (x86_64): [dsd-neo-linux-x86_64-portable-nightly.AppImage](https://github.com/arancormonk/dsd-neo/releases/download/nightly/dsd-neo-linux-x86_64-portable-nightly.AppImage)
- Linux AppImage (aarch64): [dsd-neo-linux-aarch64-portable-nightly.AppImage](https://github.com/arancormonk/dsd-neo/releases/download/nightly/dsd-neo-linux-aarch64-portable-nightly.AppImage)
- macOS DMG (arm64): [dsd-neo-macos-arm64-portable-nightly.dmg](https://github.com/arancormonk/dsd-neo/releases/download/nightly/dsd-neo-macos-arm64-portable-nightly.dmg)
- Windows 原生 ZIP (MSVC x86_64): [dsd-neo-msvc-x86_64-native-nightly.zip](https://github.com/arancormonk/dsd-neo/releases/download/nightly/dsd-neo-msvc-x86_64-native-nightly.zip)
- Arch Linux (AUR): 稳定版本请安装 [dsd-neo](https://aur.archlinux.org/packages/dsd-neo),
或安装 [dsd-neo-git](https://aur.archlinux.org/packages/dsd-neo-git) 获取主分支快照。
在 Windows 上,原生 MSVC ZIP 是推荐的下载方式,以获得与 Windows 控制台和音频栈的最佳集成。
## 项目状态
本项目正在积极开发中,我们正在从上游分叉项目解耦并继续进行模块化工作。在此稳定化工作进行期间,请预期构建预设、选项、CLI 标志和内部库边界会发生破坏性变更。主分支可能不稳定;用于部署时,建议构建已知的提交。欢迎提交问题和 PR——报告回归问题时请包含日志和复现细节。
## 概述
- 性能增强的 [lwvmobile/dsd-fme](https://github.com/lwvmobile/dsd-fme) 分叉版本,而后者是 [szechyjs/dsd](https://github.com/szechyjs/dsd) 的分叉版本。
- 模块化分叉,边界清晰:`runtime`、`platform`、`dsp`、`io`、`engine`、`fec`、`crypto`、`protocol`、`core`,外加 `ui` 和一个 CLI 应用。
- 协议覆盖:DMR、dPMR、D-STAR、NXDN、P25 Phase 1/2、X2-TDMA、EDACS、ProVoice、M17、YSF。
- 需要 [arancormonk/mbelib-neo](https://github.com/arancormonk/mbelib-neo) 2.x 用于 IMBE/AMBE 声码器基元。
- 公开头文件位于 `include/dsd-neo/...` 下,通过 `#include />` 方式包含。
## DSD‑neo 有何不同
- 更多的输入和流式传输选项
- 直接 RTL-SDR USB 输入,以及用于非 RTL 无线电的 RTL-TCP (`-i rtltcp[:host:port]`) 和 SoapySDR (`-i soapy[:args]`)(例如 Airspy/SDRplay/HackRF/LimeSDR)。
- 通用 TCP PCM16LE 输入 (`-i tcp[:host:port]`,SDR++/GRC 7355 音频流)。
- UDP 音频输入/输出:通过 UDP 接收 PCM16LE 作为输入,并将解码后的音频发送到 UDP 接收端,便于管道传输到其他应用或主机(解码语音通常为 8 kHz;参见 `docs/network-audio.md`)。
- M17 UDP/IP 输入/输出:通过专用 UDP 接收/发送 M17 帧 (`-i m17udp[:bind:17000]`, `-o m17udp[:host:17000]`)。
- RF I/Q 捕获/回放工作流,带元数据 (`--iq-capture`, `--iq-info`, `--iq-replay`),用于可复现的解码调试和回归回放。
- 内置中继工作流
- 使用信道映射和组列表自动跟踪 P25 和 DMR 中继语音 (`-C ...csv`, `-G group.csv`, `-T`, `-N`)。
- 通过 rigctl (`-U`) 进行实时重调谐控制,适用于外部 SDR 前端(例如 SDR++)。对于 RTL/RTL-TCP 输入,DSD-neo 直接重调谐(可选的外部 UDP 重调谐控制可通过 `--rtl-udp-control ` 在环回上启用;远程访问需要 `--rtl-udp-control-bind `;参见 `docs/udp-control.md`)。
- RTL-SDR 便利功能
- Bias-tee 控制(如果您的 librtlsdr 支持),手动或自动增益,功率静噪,可调谐器带宽,以及每次运行的 PPM 校正。
- 可选的基于载波/误差的自动 PPM 漂移校正,具有 SNR/功率门控和短训练/锁定功能,适用于长时间无人值守运行。
- rtl_tcp 便利功能:可配置的预缓冲以减少丢包,并针对稳定网络使用进行了设置调优。
- RTL-SDR 优化和诊断
- RTL USB、RTL-TCP、SoapySDR 和 IQ 回放数字解码位于符号域:FSK 和 CQPSK 路径向解码器提供归一化浮点符号,源监听音频由单独的抽头处理。
- 终端中实时可视辅助工具,便于更快设置和故障排除:
- 带可调门控和归一化的星座图。
- 眼图(Unicode/ASCII,可选颜色),带自适应比例和电平指南。
- 频谱分析仪,带可调 FFT 大小。
- FSK 4 电平直方图和实时每调制 SNR 读数。
- 针对更平滑音频和更少丢包进行深度优化的 RTL 路径:
- 单次处理字节→I/Q 扩展,带可选的 90° 旋转和直流杂散 fs/4 捕获移位(可配置)。
- 级联抽取和可选的有理重采样器,保持处理高效且响应迅速。
- 可选的来自定时误差检测器的自动 PPM 校正,适用于长时间无人值守运行。
- 来自 UI 的设备控制:切换 bias-tee,切换 AGC/手动增益,调整带宽和静噪,以及快速重调谐。
- M17 编码工具
- 为测试/气隙工作流生成 M17 信号:流式语音 (`-fZ`)、数据包 (`-fP`) 和 BERT (`-fB`) 编码器。
- 面向高级用户的扩展 DSP 控制
- 更改从 UI 即时应用,并在重调谐之间持续生效。
- 有关环境变量参考,请参阅 [docs/cli.md](docs/cli.md)。
- 可移植、即开即用的构建
- Linux AppImage、macOS DMG 和 Windows 便携式 ZIP 版本。
### 简要对比
- 与 DSD-FME 对比:协议覆盖和 UI 传承相似,但 DSD-neo 增加了网络友好的 I/O(UDP 音频输入)、精炼的 RTL-TCP 处理(预缓冲、调优默认值)、可选自动 PPM 以及打包的跨平台二进制文件。
- 与原始 DSD 对比:更多协议(特别是 P25 Phase 2、M17、YSF、EDACS)、内置中继、网络输入、设备控制和交互式 UI。
## 从源代码构建
要求
- 支持 C11 的 C 编译器和支持 C++14 的 C++ 编译器。
- CMake ≥ 3.20。
- 依赖项:
- 必需:libsndfile;curses 后端 (ncursesw/PDCurses);以及音频后端(默认为 PulseAudio,Windows 上为 PortAudio)。
- 可选:librtlsdr(RTL-SDR 支持)、SoapySDR(非 RTL SDR 后端)、Codec2(额外的声码器路径)、libcurl(rdio API 上传)、Windows 以外的平台上的 PortAudio、help2man(手册页生成)。
- 声码器:需要 mbelib-neo 2.x (`mbe-neo` CMake 包)。
操作系统软件包提示
- Ubuntu/Debian (apt):
- `sudo apt-get update && sudo apt-get install -y build-essential cmake ninja-build libsndfile1-dev libpulse-dev libncurses-dev librtlsdr-dev libsoapysdr-dev`
- macOS (Homebrew):
- `brew install cmake ninja libsndfile ncurses pulseaudio librtlsdr soapysdr codec2`
- Windows:
- 首选二进制:原生 MSVC ZIP。
- 源代码构建使用 CMake 预设和 vcpkg;设置 `VCPKG_ROOT` 并在 `CMakePresets.json` 中使用 `win-msvc-*` 预设。
MBE 声码器依赖项 (mbelib-neo)
DSD-neo 需要来自 `mbelib-neo` 的 `mbe-neo` 2.x CMake 包(使用软判决/V2 API)。不支持旧的 1.x mbelib-neo 版本。如果 CMake 配置失败并提示 “could not find mbe-neo”,请安装它并重新运行配置。
示例(Linux/macOS):
```
# 构建并安装 mbelib-neo(一次性)
git clone https://github.com/arancormonk/mbelib-neo
cmake -S mbelib-neo -B mbelib-neo/build -DCMAKE_BUILD_TYPE=Release
cmake --build mbelib-neo/build -j
cmake --install mbelib-neo/build --prefix "$HOME/.local"
# 然后配置 dsd-neo(将 CMake 指向安装前缀)
cmake --preset dev-release -DCMAKE_PREFIX_PATH="$HOME/.local"
```
构建配方(复制/粘贴)
### Linux/macOS — 发布构建(预设 `dev-release`,推荐)
```
# 从仓库根目录开始。
# # 操作系统依赖(示例):
# - Ubuntu/Debian:sudo apt-get update && sudo apt-get install -y build-essential cmake ninja-build libsndfile1-dev libpulse-dev libncurses-dev librtlsdr-dev libsoapysdr-dev
# - macOS: brew install cmake ninja libsndfile ncurses pulseaudio librtlsdr soapysdr codec2
# # 安装是可选的;您可以直接从构建树运行。
cmake --preset dev-release
cmake --build --preset dev-release -j
# 运行(无需安装)
build/dev-release/apps/dsd-cli/dsd-neo -h
# 安装(可选;选择一种方式)
cmake --install build/dev-release --prefix "$HOME/.local"
# sudo cmake --install build/dev-release
```
### Linux/macOS — 调试构建 + 测试(预设 `dev-debug`)
```
# 操作系统依赖(示例):
# - Ubuntu/Debian:sudo apt-get update && sudo apt-get install -y build-essential cmake ninja-build libsndfile1-dev libpulse-dev libncurses-dev librtlsdr-dev libsoapysdr-dev
# - macOS: brew install cmake ninja libsndfile ncurses pulseaudio librtlsdr soapysdr codec2
cmake --preset dev-debug
cmake --build --preset dev-debug -j
ctest --preset dev-debug --output-on-failure
# 可选的竞态检测步骤。将其与 ASan/UBSan 分开。
cmake --preset tsan-debug
cmake --build --preset tsan-debug -j
ctest --preset tsan-debug --output-on-failure
# 预设配置应用 tools/tsan.supp 以处理已知的第三方 PulseAudio 运行时报告。
# 运行(无需安装)
build/dev-debug/apps/dsd-cli/dsd-neo -h
```
### 手动配置/构建(无预设)
```
# 使用非预设的构建目录(因此不期望存在 build/dev-release)。
cmake -S . -B build/manual -DCMAKE_BUILD_TYPE=Release
cmake --build build/manual -j
# 运行(无需安装)
build/manual/apps/dsd-cli/dsd-neo -h
# 安装(可选;选择一种方式)
cmake --install build/manual --prefix "$HOME/.local"
# sudo cmake --install build/manual
```
### 覆盖率(可选)
```
tools/coverage.sh # generates build/coverage-debug/coverage_html
```
注意
- 预设位于 `CMakePresets.json`。
- 预设在 `build//` 下创建外部构建目录。请从仓库根目录运行。
- CLI 二进制文件输出到 `build//apps/dsd-cli/dsd-neo`。
- `cmake --install ` 仅在配置了该构建目录时才有效。如果您在构建目录内,请使用 `cmake --install .`。
- 如果 `cmake --install build/dev-release` 失败且 `build/dev-release/` 不存在,您可能进行了手动构建(请从实际构建目录安装)。
## 安装 / 卸载
```
# 预设构建(推荐)
# 单配置生成器(Unix Makefiles/Ninja):
cmake --install build/dev-release --prefix "$HOME/.local"
# 多配置生成器(Visual Studio/Xcode):
cmake --install build/dev-release --config Release --prefix "$HOME/.local"
# 手动构建目录(上面示例使用 `build/manual/`):
cmake --install build/manual --prefix "$HOME/.local"
# cmake --install build --prefix "$HOME/.local" # 如果您配置在 `build/` 中
# 从同一构建目录卸载
cmake --build build/dev-release --target uninstall # preset build
cmake --build build/manual --target uninstall # manual build directory
# cmake --build build --target uninstall # 如果您配置在 `build/` 中
```
## 构建选项
这些是 CMake 缓存选项(在配置时通过 `-D...` 设置)。
- 构建卫生和优化:
- `-DDSD_ENABLE_WARNINGS=ON` — 启用常见警告(默认开启)。
- `-DDSD_WARNINGS_AS_ERRORS=ON|OFF` — 将警告视为错误(默认开启)。
- `-DDSD_ENABLE_FAST_MATH=ON` — 在所有目标上启用快速数学(`-ffast-math`/`/fp:fast`)。
- `-DDSD_ENABLE_LTO=ON` — 在 Release 构建中启用 IPO/LTO(如果支持)。
- `-DDSD_ENABLE_NATIVE=ON` — 启用 `-march=native -mtune=native`(非可移植二进制文件)。
- `-DDSD_ENABLE_ASAN=ON` — 在 Debug 构建中启用 AddressSanitizer。
- `-DDSD_ENABLE_UBSAN=ON` — 在 Debug 构建中启用 UndefinedBehaviorSanitizer。
- `-DDSD_ENABLE_TSAN=ON` — 在 Debug 构建中启用 ThreadSanitizer;请使用与 ASan/UBSan 分开的构建目录。
- 音频后端选择:
- `-DDSD_USE_PORTAUDIO=ON` — 使用 PortAudio 而不是 PulseAudio(Windows 上默认开启)。
- 无线电后端选择:
- `-DDSD_ENABLE_RTLSDR=ON|OFF` — 启用/禁用 RTL-SDR 后端发现。
- `-DDSD_ENABLE_SOAPYSDR=ON|OFF` — 启用/禁用 SoapySDR 后端发现。
- `-DDSD_REQUIRE_RTLSDR=ON|OFF` — 当启用 RTL-SDR 但不可用时,配置失败。
- `-DDSD_REQUIRE_SOAPYSDR=ON|OFF` — 当启用 SoapySDR 但不可用时,配置失败。
- UI 和行为开关:
- `-DCOLORS=OFF` — 禁用 ncurses 颜色输出。
- `-DCOLORSLOGS=OFF` — 禁用彩色终端/日志输出。
- 协议和功能开关:
- `-DPVC=ON` — 启用 ProVoice 常规帧同步。
- `-DLZ=ON` — 启用 LimaZulu 请求的 NXDN 调整。
- `-DSID=ON` — 启用实验性的 P25p1 软 ID 解码。
- 可选功能(自动检测):
- 找到 `librtlsdr` 时启用 RTL-SDR 支持。
- 找到 SoapySDR 时启用 SoapySDR 支持。
- 找到 `codec2` 时启用 Codec2 支持。
- 找到 libcurl 时启用 rdio API 上传支持。
## CI 后端策略
- CI 将后端可用性视为构建契约,而非尽力而为的选项。
- Linux CI 运行一个后端矩阵:`both`、`soapy_only`、`rtl_only` 和 `neither`。
- 需要测试无线电后端的发布/打包/静态分析任务使用以下配置:
- `-DDSD_REQUIRE_RTLSDR=ON`
- `-DDSD_REQUIRE_SOAPYSDR=ON`
- 如果任一必需后端缺失,配置会快速失败。
## 后端矩阵复现(本地)
在安装依赖项(需要时包括 `librtlsdr` 和 SoapySDR)后,从仓库根目录运行:
```
# 需要两个后端
cmake --preset dev-debug \
-DDSD_ENABLE_RTLSDR=ON -DDSD_REQUIRE_RTLSDR=ON \
-DDSD_ENABLE_SOAPYSDR=ON -DDSD_REQUIRE_SOAPYSDR=ON
cmake --build --preset dev-debug -j
# 仅 soapy
cmake --preset dev-debug \
-DDSD_ENABLE_RTLSDR=OFF \
-DDSD_ENABLE_SOAPYSDR=ON -DDSD_REQUIRE_SOAPYSDR=ON
cmake --build --preset dev-debug -j
# 仅 rtl
cmake --preset dev-debug \
-DDSD_ENABLE_RTLSDR=ON -DDSD_REQUIRE_RTLSDR=ON \
-DDSD_ENABLE_SOAPYSDR=OFF
cmake --build --preset dev-debug -j
# 两者都无
cmake --preset dev-debug \
-DDSD_ENABLE_RTLSDR=OFF \
-DDSD_ENABLE_SOAPYSDR=OFF
cmake --build --preset dev-debug -j
```
类 CI 的严格 scan-build 运行:
```
tools/scan_build.sh --strict \
--cmake-arg -DDSD_REQUIRE_RTLSDR=ON \
--cmake-arg -DDSD_REQUIRE_SOAPYSDR=ON
```
## 运行时调优
大多数用户可以使用默认设置运行。有关高级调优,请参阅 [docs/cli.md](docs/cli.md)。
常用选项:
- 自动 PPM 漂移校正(RTL-SDR):`--auto-ppm`
- RTL-TCP 自适应缓冲:`--rtltcp-autotune`
- Rig 控制(SDR++):`-U 4532`(默认端口),`-B `(带宽)
## SoapySDR 快速入门
- 当您的硬件不是通过 `librtlsdr` 直接访问时,请使用 SoapySDR。
- 构建时启用 Soapy (`-DDSD_ENABLE_SOAPYSDR=ON`) 并可选地要求它 (`-DDSD_REQUIRE_SOAPYSDR=ON`)。
- 安装 SoapySDR 工具和您无线电的 Soapy 模块;使用 `SoapySDRUtil --info` 验证,并使用 `SoapySDRUtil --find` 发现参数。
- 使用 `-i soapy[:args]` 运行。`soapy:` 字符串仅选择后端/设备;通过 `rtl_*` 键设置调谐参数(至少需要 `rtl_freq`;最简单的方式是通过配置)。请参阅指南了解最小配置片段。
- SoapySDR 数字解码使用与 RTL USB/RTL-TCP/IQ 回放相同的归一化符号域路径;`rtl_volume` 仅影响监听和其他非符号音频。
- 完整指南:`docs/soapysdr.md`。
## 使用 CLI
- 请参阅友好的 CLI 指南:[docs/cli.md](docs/cli.md)
- 或者在终端中运行 `dsd-neo -h` 获取快速用法。
- 数字/模拟输出增益:`-g `(数字;`0` = 自动,`1` ≈ 2%,`50` = 100%)和 `-n `(模拟 0–100%)。
- DMR 单声道辅助功能:
- 现代形式:`-fs -nm`(DMR BS/MS 单工 + 单声道音频)。
- 旧版别名:`-fr`(保留作为相同 DMR 单声道配置的简写)。
- CSV 格式(信道映射、组列表、密钥列表):`docs/csv-formats.md`(示例在 `examples/`)
快速示例
- UDP 输入 → Pulse 输出并带 UI:`dsd-neo -i udp -o pulse -N`
- 从 TCP PCM 输入的 DMR 中继(带 rigctl):`dsd-neo -fs -i tcp -U 4532 -T -C dmr_t3_chan.csv -G group.csv -N`
- IQ 捕获 + 检查 + 回放:`dsd-neo -i rtl:0:851.375M:22:0:48:0:2 --iq-capture p25-control.iq -N` 然后 `dsd-neo --iq-info p25-control.iq.json` 然后 `dsd-neo --iq-replay p25-control.iq.json -f1 -N`
## 配置
- 实现了 INI 风格的用户配置用于稳定默认值(输入/输出/模式/中继);参见 `docs/config-system.md`。
- 配置加载是可选的:使用 `--config` 启用(可选带路径),设置 `DSD_NEO_CONFIG=`,或传递单个位置 `*.ini` 路径(视为 `--config `)。
- 默认路径(当传递 `--config` 但未指定路径时):`${XDG_CONFIG_HOME:-$HOME/.config}/dsd-neo/config.ini`。
- `--interactive-setup` 强制运行引导向导,即使配置已存在;`--print-config` 将有效配置转储为 INI。
- 启用配置时,最终设置在退出时会自动保存;显式的 `--profile NAME` 运行会为该进程禁用自动保存。
## 测试
- 运行所有测试:`ctest --preset dev-debug --output-on-failure`(或 `ctest --test-dir build/dev-debug --output-on-failure`)。
- 范围:单元测试覆盖 runtime/config、DSP、IO、platform、core、protocol、FEC、crypto、engine 和终端 UI 辅助工具。
## 文档
- CLI 用法和选项:`docs/cli.md`
- IQ 捕获/回放格式和工作流:`docs/iq-capture-replay.md`
- SoapySDR 非 RTL 设置和使用:`docs/soapysdr.md`
- 用户配置系统(INI):`docs/config-system.md`
- 中继 CSV 格式:`docs/csv-formats.md`(示例在 `examples/`)
- 网络音频 I/O 详情(TCP/UDP/stdin/stdout):`docs/network-audio.md`
- 终端 UI 热键和菜单:`docs/ui-terminal.md`
- RTL UDP 重调谐控制协议:`docs/udp-control.md`
- 模块概述和构建目标:`docs/code_map.md`
- 构建和安装策略:`docs/build-installation.md`
- 测试策略:`docs/testing.md`
- 缺陷报告:`docs/issue-reporting.md`
- 依赖管理:`docs/dependencies.md`
- 安全要求:`docs/security-requirements.md`
- 发布验证:`docs/release-verification.md`
- 代码质量和评审护栏:`docs/code-quality-guardrails.md`
- 供应链护栏:`docs/supply-chain-guardrails.md`
- OpenSSF OSPS 基线证据:`docs/openssf-baseline.md`
## 项目布局
- Apps: `apps/dsd-cli` — CLI 入口点,目标 `dsd-neo`。
- Core: `src/core`, 头文件 `` — 粘合层(音频、声码器、帧调度、GPS、文件导入)。
- Engine: `src/engine`, 头文件 `` — 顶层解码/编码运行器和生命周期管理。
- Platform: `src/platform`, 头文件 `` — 跨平台原语(音频后端、套接字、线程、计时、curses)。
- Runtime: `src/runtime`, 头文件 `` — 配置、日志、对齐内存、环形缓冲、工作池、RT 调度、git 版本信息。
- DSP: `src/dsp`, 头文件 `` — 解调流水线、重采样器、滤波器、FLL/TED、SIMD 辅助工具。
- IO: `src/io`, 头文件 `` — 无线电(RTL-SDR、RTL-TCP、SoapySDR)、IQ 捕获/回放、网络音频(TCP/UDP PCM 和 M17 UDP)以及控制(UDP/rigctl/串口)。
- FEC: `src/fec`, 头文件 `` — BCH、Golay、Hamming、RS、BPTC、CRC/FCS。
- Crypto: `src/crypto`, 头文件 `` — RC2/RC4/DES/AES 及辅助工具。
- Protocols: `src/protocol/`, 头文件 `/...>` — DMR、dPMR、D-STAR、NXDN、P25、X2-TDMA、EDACS、ProVoice、M17、YSF。
- Third-party: `src/third_party/ezpwd` (INTERFACE 目标 `dsd-neo_ezpwd`), `src/third_party/pffft` (STATIC 目标 `dsd-neo_pffft`)。
## 工具
- 格式化:`tools/format.sh`(需要 `clang-format`;参见 `.clang-format`)。
- 静态分析:
- `tools/clang_tidy.sh`(使用 `--strict` 进行额外检查)。
- `tools/cppcheck.sh`(使用 `--strict` 进行更广泛检查)。
- `tools/iwyu.sh`(通过 include-what-you-use 进行包含头文件卫生检查;排除 `src/third_party`)。
- `tools/gcc_fanalyzer.sh`(GCC `-fanalyzer` 路径敏感诊断;排除 `src/third_party`)。
- `tools/scan_build.sh`(通过 `scan-build` 进行 Clang 静态分析,更重量级的全构建检查;排除 `src/third_party`;支持可重复的 `--cmake-arg` 传递)。
- `tools/semgrep.sh`(额外的 SAST 和项目护栏规则;使用 `--strict` 在发现时失败;排除 `src/third_party`)。
- `tools/shell_lint.sh`(ShellCheck 加上 `shfmt -d` 用于 shell 脚本和钩子)。
- `tools/workflow_lint.sh`(actionlint 用于 GitHub Actions 工作流)。
- `tools/zizmor.sh`(支持 SARIF 的 GitHub Actions 安全分析)。
- `tools/osv_scan.sh`(OSV 依赖项和供应商提供的 C/C++ 漏洞扫描)。
- `tools/cmake_format_check.sh`(使用 gersemi 进行 CMake 格式化;使用 `--fix` 重写)。
- `tools/gitleaks.sh`(支持 GitHub 代码扫描 SARIF 输出的秘密扫描)。
- 安全护栏:
- `tools/check_secret_redaction.sh`(在没有 `DSD_SECRET_REDACTED` 的情况下阻止格式化的密钥/密钥流输出)。
- `tools/check_workflow_git_pins.sh`(阻止工作流和 CI 辅助脚本中浮动的公共 GitHub 源代码检出)。
- `tools/check_workflow_download_pins.sh`(阻止可变发布辅助下载和无摘要的 AppImage 容器引用)。
- `tools/check_release_hardening.sh`(验证 Linux ELF PIE/RELRO/BIND_NOW、macOS Mach-O PIE/@rpath 以及强化编译标志)。
- `tools/check_release_hardening.ps1`(验证 Windows PE ASLR、NX 和高熵 VA 强化)。
- 模糊测试:`tools/fuzz_smoke.sh` 配置/构建 `fuzz-asan-debug` 预设,并运行有限的 libFuzzer 冒烟测试。
- Git 钩子:`tools/install-git-hooks.sh` 启用提交时自动格式化,以及在推送前运行与 CI 对齐的分析检查(包括工作流源代码/下载引脚、clang-format、CMake 格式、clang-tidy、cppcheck、IWYU、GCC fanalyzer、Semgrep、zizmor、OSV 扫描、shell/工作流 lint)针对更改的路径。
- 可选的推送前/预检完整 scan-build 检查:设置 `DSD_HOOK_RUN_SCAN_BUILD=1`。
- 手动预检运行器:`tools/preflight_ci.sh` 运行与 `pre-push` 相同的 CI 对齐检查,但不推送。
- 完整质量预检:`tools/quality_preflight.sh` 启用缺失工具失败,包含 scan-build,并运行完整的本地护栏集。
- 评审期望和高风险更改清单:`docs/code-quality-guardrails.md`。
- 供应链更新策略:`docs/supply-chain-guardrails.md`。
## 贡献
- 贡献流程和评审要求请参阅 `CONTRIBUTING.md`。
- 语言:C (C11) 和 C++ (C++14)。缩进宽度 4 个空格;不使用制表符;所有控制语句均使用大括号;行长 ≤ 120。
- 仅使用项目前缀包含:`#include `。
- 优先使用小型、可测试的辅助函数,并在 `tests/` 下添加有针对性的测试。
- 发送更改前:构建您修改过的预设,运行 `tools/format.sh`,处理可行的 clang-tidy 和 cppcheck 警告。
## 许可证
- 项目许可证:GPL-3.0-or-later(见 `LICENSE`)。
- 部分代码仍根据原始 DSD 作者的 ISC 许可证发布(见 `COPYRIGHT`)。
- 第三方声明位于 `THIRD_PARTY.md`(安装的许可证文本:`share/doc/dsd-neo/licenses/`)。
- 项目编写的源文件带有反映其许可证的 SPDX 标识符;供应商提供的第三方文件保留上游许可证头。
标签:AppImage分发, Bash脚本, C/C++编程, CMake构建系统, DMR协议, macOS应用, NXDN协议, P25协议, Windows原生构建, YSF协议, 信号处理, 安全最佳实践, 客户端加密, 开源框架, 性能优化, 持续集成, 数字信号处理, 数字语音解码, 无线电通信, 构建自动化, 检测绕过, 模块化架构, 现代解码器, 语音编码解码, 跨平台支持, 软件库设计, 通信协议解码