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 [![linux-ci](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/4bac370fba174954.svg)](https://github.com/arancormonk/dsd-neo/actions/workflows/linux-ci.yaml) [![windows-ci](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7d28e88a6a174955.svg)](https://github.com/arancormonk/dsd-neo/actions/workflows/windows-ci.yaml) [![macos-ci](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/53da6c582f174956.svg)](https://github.com/arancormonk/dsd-neo/actions/workflows/macos-ci.yaml) [![OpenSSF 最佳实践](https://www.bestpractices.dev/projects/12978/badge)](https://www.bestpractices.dev/projects/12978) [![OpenSSF 基线](https://www.bestpractices.dev/projects/12978/baseline)](https://www.bestpractices.dev/projects/12978) ![DSD-neo](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/e9bcc161cf174956.png) ## 下载 - 稳定版本:请查看 [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协议, 信号处理, 安全最佳实践, 客户端加密, 开源框架, 性能优化, 持续集成, 数字信号处理, 数字语音解码, 无线电通信, 构建自动化, 检测绕过, 模块化架构, 现代解码器, 语音编码解码, 跨平台支持, 软件库设计, 通信协议解码