找回密码
 -注册-
查看: 1705|回复: 17
打印 上一主题 下一主题

【分享】scream2diretta — Scream UDP 直通 Diretta SDK 的 Linux 音频桥接工具

[复制链接]
跳转到指定楼层
1
发表于 2026-5-20 20:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 | 来自上海 来自 上海
大家好,
折腾了一段时间,今天把 scream2diretta 正式发布到 GitHub 了。这是一个 C++ 写的小工具,专门运行在 Linux 上(树莓派 4/5、x86 小主机均可),功能是:把 Scream 协议发来的 UDP PCM 流,不经过 ALSA,直接喂给 Diretta Host SDK
对已经在用 DRUP 的朋友,这不是替代品,而是补充。DRUP 在 UPnP 流(LMS、Roon、Audirvana)上表现很好,而 scream2diretta 主要覆盖 DRUP 不太方便处理的几个场景:
  • Spotify、Foobar2000 等桌面应用:Windows 走 ASIOScream,Linux 走 ScreamAlsa → scream2diretta → Diretta Target → DAC
  • HQPlayer + NAA(绕开 DirettaAlsaHost):NAA → ScreamAlsa → scream2diretta,避免 ALSA 的 period/buffer 唤醒带来的抖动
  • UPnP 流 + DSP:upmpdcli → MPD → CamillaDSP(EQ / 分频 / 房间校正)→ ScreamAlsa → scream2diretta,实现 Diretta + DSP 同时使用
  • 手机 / 随身播放器(Apple Music / Spotify):Apple Music / Spotify App → USB gadget(树莓派虚拟声卡)→ CamillaDSP(可选)→ ScreamAlsa → scream2diretta → Diretta Target → DAC

内部是双线程无锁 SPSC 架构,Scream 接收线程和 Diretta SDK 工作线程可以分别绑核(--cpu-scream、--cpu-audio),尽量减少调度干扰。
支持 aarch64(树莓派 4 的 4K 页、树莓派 5 的 16K 页)和 x86-64(AVX2 / AVX-512 / Zen 4 等变体)。自带交互式安装脚本,一条命令基本可以完成编译和部署。
目前项目还处在比较早期阶段,我自己的测试主要是在树莓派平台(RPi 4/5)上完成的,也欢迎大家在不同平台和环境下帮忙测试、反馈。
最后特别感谢 cometdom 的 [DirettaRendererUPnP (DRUP)] 和 [slim2Diretta],本项目的整体思路和实现方式很大程度上受到了这两个项目的启发(包括 getNewStream() 拉流模型和 buffer 参数设计),也从中学习了很多。
由于本职工作比较忙,后续回复和问题跟进可能会稍慢一些,但我会尽量持续跟进。
GitHub:https://github.com/ayanamilee/scream2diretta
中文说明:https://github.com/ayanamilee/scream2diretta/blob/main/README_CN.md
欢迎交流、测试,也欢迎提 issue 或 PR。

2
发表于 2026-5-21 06:39 | 只看该作者 | 来自北京 来自 北京
ALSA的period唤醒抖动对异步USB DAC的影响非常有限,因为其核心设计就是为了从根源上隔离主机的时钟抖动。因此,ALSA唤醒抖动本质上是“水厂供水”的波动,在异步模式下,只要“蓄水池”(DAC缓冲区)不干涸,这些波动就会被有效隔离,不会直接影响音质。  所以一直感觉绕过Alsa是新版diretta的噱头。  USB gadget(树莓派虚拟声卡)看起来实现不容易
回复

使用道具 举报

3
 楼主| 发表于 2026-5-21 06:56 | 只看该作者 | 来自上海 来自 上海
主要影响是存在于 DirettaAlsaHost 的 alsa-bridge 模块和 diretta sdk 传递这一环节,许多参数需要调整来决定 target 的节奏。
ALSA 层引入的不确定性需要通过多段缓冲和补偿机制来弥补,而这些补偿措施本身又进一步增加了延迟和 CPU 负担。
而且事实就是 DRUP 的确比 DirettaAlsaHost 好听的多
回复

使用道具 举报

4
 楼主| 发表于 2026-5-21 07:05 | 只看该作者 | 来自上海 来自 上海
usb gadget 结合 camilladsp 的玩法由来已久,用户可以自己组建一个高性价比的 DIY DSP,可以参考
https://github.com/mdsimon2/RPi-CamillaDSP

推而广之,如果不想玩 camilladsp,甚至可以把 usb gadget 作为 naa input,送给 hqplayer 来处理,可以参考
https://community.roonlabs.com/t/using-any-audio-source-with-hqplayer-spotify-amazon-apple-music-youtube-music-deezer-soundcloud-2023/244358
回复

使用道具 举报

5
发表于 2026-5-21 08:49 | 只看该作者 | 来自北京 来自 北京
Scream 本身就挺好,没必要从diretta绕一下,反而失去了Scream的特色,增加了复杂度
回复

使用道具 举报

6
 楼主| 发表于 2026-5-21 09:26 | 只看该作者 | 来自上海 来自 上海
初衷倒不是为了 scream 的声音,只是为了利用 scream 的灵活度
回复

使用道具 举报

7
发表于 2026-5-21 09:43 | 只看该作者 | 来自广东 来自 广东佛山
本帖最后由 bloodyevil 于 2026-5-21 10:33 编辑

screamalsa和direttahost不是一样的东西吗
都是虚拟ALSA,没绕开啊
想了下这个项目可能唯一可用情况是ALBUM PLAYER直转Diretta,其他说真的意义不大
回复

使用道具 举报

8
 楼主| 发表于 2026-5-21 11:14 | 只看该作者 | 来自上海 来自 上海
bloodyevil 发表于 2026-5-21 09:43
screamalsa和direttahost不是一样的东西吗
都是虚拟ALSA,没绕开啊
想了下这个项目可能唯一可用情况是A ...

主要解决的是 DirettaAlsaHost 这个中间层,因为它和 Target 之间的参数复杂,而且需要根据所听歌曲的格式和采样率进行动态调整,不容易出好声音,这也是为什么会有 Diretta MemoryPlay,它是 Diretta 官方设计的完全绕过 ALSA 的解决方案。
而ScreamAlsa 没这个问题,它只是固定节奏 udp 发包而已,指定好 ip 和端口就行,没有那么多和 scream receiver (apscream) 之间的动态参数



回复

使用道具 举报

9
发表于 2026-5-21 13:18 | 只看该作者 | 来自北京 来自 北京
carrionlee 发表于 2026-5-21 09:26
初衷倒不是为了 scream 的声音,只是为了利用 scream 的灵活度

scream 并没有更灵活
回复

使用道具 举报

10
发表于 2026-5-21 15:11 | 只看该作者 | 来自广东 来自 广东佛山
原版screamalsa的pacer算法的确非常简单,就是一个“盲推”机器
回复

使用道具 举报

11
发表于 2026-5-21 16:05 | 只看该作者 | 来自香港 来自 香港
carrionlee 发表于 2026-5-21 11:14
主要解决的是 DirettaAlsaHost 这个中间层,因为它和 Target 之间的参数复杂,而且需要根据所听歌曲的格 ...


不知道 Anthropic 的进度有多牛 B,姑且把「某文件」的内容喂给 Claude,看看它能否好好利用 MS Mode3 的 RAW Socket 吧:

https://help.diretta.link/support/solutions/articles/73000661171-dds-diretta-direct-stream
https://help.diretta.link/support/solutions/articles/73000661777-ms-mode-dds
https://www.diretta.link/dds/
  1. <div>/DDS/check/Makefile</div><div>/DDS/check/dds_check.cpp</div><div>/DDS/dds.txt</div><div>/DDS/diretta_direct.c</div><div>/DDS/diretta_direct.h</div><div>/DDS/Makefile</div><div>/doc/classDIRETTA_1_1DDS.html</div><div>/doc/classDIRETTA_1_1DDS-members.html</div><div>/doc/classDIRETTA_1_1DDS.js</div><div>/include/ACQUA/DDS_RawSend</div><div>/include/Diretta/DDS</div><div>/include/Diretta/DDS.hpp</div>
复制代码


另外 LLMs 也可以借助 EVL 的力量:

https://github.com/leeeanh/slim2Diretta/blob/main/docs/plans/2026-03-17-evl-pop-sem-design.md
https://github.com/leeeanh/slim2Diretta/blob/main/docs/plans/2026-03-17-evl-pop-sem.md
https://www.stsd99.com/phpBB3/viewtopic.php?p=22610#p22610

可是月費並不便宜,加上 tokens 方面的限制越来越苛刻,且看那泡沫何时爆破了。
回复

使用道具 举报

12
 楼主| 发表于 2026-5-21 16:19 | 只看该作者 | 来自上海 来自 上海
dds 都实现了,evl 我没弄,没玩过&#128514;,放到 todolist 吧
回复

使用道具 举报

13
 楼主| 发表于 2026-5-21 16:25 | 只看该作者 | 来自上海 来自 上海
bloodyevil 发表于 2026-5-21 15:11
原版screamalsa的pacer算法的确非常简单,就是一个“盲推”机器

是的,非常像 av 系统里的 aoip。所以我参照 aoip 里的 linuxptp 同步(这里要感谢 seetoyou 老兄的资料),scream 两端的系统我都加了 chrony 同步
同步后 scream 的发送和 diretta 的抽取基本保持平衡,缓冲区维持稳定,不然的话可能会有缓冲区抽干的情况。我看就有烧友高采样率原版 scream 播放一段时间变音的描述。
回复

使用道具 举报

14
发表于 2026-5-22 08:48 | 只看该作者 | 来自浙江 来自 浙江宁波
顶下楼主。都是技术大拿。我既有scream又有target,这下桥端不用切换了。
回复

使用道具 举报

15
发表于 2026-5-27 15:44 | 只看该作者 | 来自四川 来自 四川成都
Windows 走 ASIOScream这个是不是对WINDOWS11不适用了,一直没成功
回复

使用道具 举报

16
 楼主| 发表于 2026-5-28 09:25 | 只看该作者 | 来自上海 来自 上海浦东新区
zheng_nick 发表于 2026-5-27 15:44
Windows 走 ASIOScream这个是不是对WINDOWS11不适用了,一直没成功

你看下 ip 和端口号是否一致
回复

使用道具 举报

17
发表于 2026-6-24 16:12 | 只看该作者 | 来自浙江 来自 浙江宁波
32位解码正常,16位解码噪声。麻烦大神加参数,支持老解码。
回复

使用道具 举报

18
 楼主| 发表于 2026-6-24 16:30 | 只看该作者 | 来自上海 来自 上海
nblinan 发表于 2026-6-24 16:12
32位解码正常,16位解码噪声。麻烦大神加参数,支持老解码。

告诉我一下你的DAC型号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | -注册-

本版积分规则

Archiver|手机版|粤icp备09046054号-9|耳机网-耳机大家坛

粤公网安备 44030602000598号 耳机大家坛、www.erji.net、网站LOGO图形均为注册商标

GMT+8, 2026-6-24 17:41

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表