从一个听起来很简单的需求开始
我用 Mac 的时候,习惯常年在桌面上接一台显示器,有时还会连上蓝牙音箱。但是有个问题一直困扰我,它们明明都能发出声音,但 macOS 默只能选择其中一个作为声音的输出。
于是我就想:既然面前已经有两三个扬声器,为什么不能让它们同时播放?声场效果不是更好吗?
系统其实做得到,只是做完以后更难用了
于是我上网找了一圈,发现很多人也有和我一样的困惑,然后看到有人推荐,使用 macOS 自带的“音频 MIDI 设置”,可以创建多输出设备。把几个输出勾选进去之后,同一个声音确实能从多个设备里一起出来。
但创建多输出设备后,平音量键不再像原来那样工作;想调整声音大小,你要一个个调,它没有一个总音量可以同时调整所有的设备。临时切换设备或重新组合时,也要再回到“音频 MIDI 设置”里操作,这个就很方便了。
更明显的问题是延迟。显示器、Mac 内置扬声器和蓝牙音箱处理声音的速度并不相同。只要其中一台慢了一点,就会感觉到声音对不齐,听起来像在 KTV 里几个人抢着唱同一句。
MacOS 系统已经提供了“让它们一起响”的底层能力,却没有把它变成一套适合每天使用的控制体验。原本只是想多开一个音箱,最后却要面对音量、同步和切换三个问题。

我先找了一圈现成方案
MIDI这条路走不通,于是我在想是不是已经有其他更好的APP解决,可以解决这个问题?
我先后看了 FineTune、SoundSource 和 Loopback 等工具。它们各有不同的重心:有的主要解决按 App 调整音量,有的提供更完整、更专业的音频路由能力。
这些产品也让我逐渐确认,我真正想解决的并不是“给 APP 再加一个音量滑块”,而是把多个实体输出设备当作一组来管理:快速选择设备、统一控制总音量、保留各自的音量大小,并补偿不同设备之间的延迟。
我尤其在意最后一点。桌上的蓝牙音箱总是比 Mac 自带扬声器慢一点,而我没有找到一套完全符合自己操作习惯的解决方式。那我就想,既然没有合适的,我就自己做一个好了,反正现在AI编程这么强了。这才成为我开始做 Tutti 的理由。
把多输出设备重新放回菜单栏
现在的 Tutti,是一个常驻菜单栏的原生 Mac 应用。打开面板后,可以像选择普通输出一样勾选多个设备,让 Mac 内置扬声器、显示器、蓝牙音箱、耳机或 USB 音频设备同时播放。对了,它也可以实现类似iPhone上接入两个AirPods的同步功能。我不懂为什么苹果在iOS上做了这个功能,但是在MacOS上却没有把它带进来。
以我桌上的显示器和蓝牙音箱为例,我可以先调整各自的响度,再用一个总音量统一控制整组设备。下次使用时,把这套组合存成预设,不必再回到“音频 MIDI 设置”重新创建。
如果两个设备没有同时发声,还可以单独增加某台设备的延迟。Tutti 不能让较慢的蓝牙设备凭空变快,它做的是把更快的设备稍微往后推,尽量让两边重新对齐。
另一个场景是按 App 控制声音。在 macOS 14.4 及以上,可以分别调整不同 App 的音量、EQ 和输出位置。例如把音乐送到显示器,把浏览器送到另一台扬声器,减少来回切换系统输出的次数。
我还做了个Tutti Theater功能,可以把把一只音箱设为左声道,另一只设为右声道。相当于把独立的音箱组成一套立体声系统,让左右声道分别从不同设备播放,而不是所有设备播放相同的混音。之前你在耳机里面才能听到的左右声道,现在在桌面上也可以听到了。
我甚至还做了一个iPhone 的遥控APP,使用iPhone就可以控制Mac上的各个设备的音量、APP的音量,以及查看现在播放的信息。
这些功能看起来分散,其实都围绕同一个目标:把多设备播放从一次性的系统设置,变成菜单栏上的一个小工具。


为什么我坚持不安装虚拟音频驱动
开发 Tutti 时,我给自己定了一条边界:尽量使用 macOS 已经提供的 Core Audio 能力,不额外安装虚拟音频驱动、内核扩展或系统扩展。
当用户选择多个输出时,Tutti 会在系统能力范围内临时组织这些设备;退出应用后,再恢复此前的系统音频输出。我希望它像一个随时可以关掉的菜单栏工具,而不是接管整套音频环境的基础设施。
这并不是说虚拟音频驱动不好。对于录音、直播或复杂混音,它们能提供更完整的路由能力。只是 Tutti 面向的是日常播放和设备控制,我更愿意用较轻的实现,换取更简单的安装、退出和恢复过程。
这个选择也意味着 Tutti 有明确边界。它不能代替专业音频工作站,也不会覆盖所有路由需求;我更关心的是,让普通用户在连接显示器、音箱和耳机时,不必先理解一整套专业音频概念。
从能运行的 Demo 到愿意长期维护的产品
这是我第一次真正把一个 App 从想法、代码和测试,一直做到官网、写帮助文档、接入支付与售后系统。第一版很快就能用了,但我后来才发现,“能运行”和“可以交给别人长期使用”之间,还有很长一段距离。
真正耗费时间的,是各种不在 Demo 里的事情:不同品牌设备的行为、蓝牙重新连接、系统版本变化、异常退出后的恢复,以及某些 App 特有的兼容问题。
最初我的脑袋里有很多想做的功能,但是我也不知道功能优先级应该怎样排列,更不知道这个需求是否只属于我自己。后来我找了一些用户测试,根据他们连接的设备、实际使用方式和遇到的问题,持续迭代了一个多月,才决定正式发布。

这段经历也改变了我对 Vibe coding 的看法。借助现有AI Agent做出一个能跑的原型Demo并不难,难的是理解每一处行为,并愿意继续处理反馈、兼容性和边缘问题。一个产品真正的工作,往往从 Demo 能运行之后才开始。
我从一开始就不想让 Tutti 停留在免费 Demo。基础功能可以免费使用,高级功能采用一次买断,用户第一次下载就提供 Pro 的高级功能七天试用。我希望商业化带来的不是更激进的功能限制,而是让我有理由继续维护这个小工具,并对用户遇到的问题负责。
它现在适合谁,又不适合谁
如果你的 Mac 经常连接显示器、蓝牙音箱、USB DAC 或多副耳机,或者你希望分别控制不同 App 的声音,Tutti 会比较接近它最初想解决的场景。
应用本体支持 macOS 13 及以上;按 App 调整音量、EQ 和输出需要 macOS 14.4 及以上。如果使用较早的系统,仍然可以使用多设备输出和设备控制,但不会出现应用级功能。
它目前也有一些明确限制。AirPlay 设备不能加入 Tutti 的多输出组合,因为苹果并没有开放这部分的API。但是呢,我尝试自己使用其他的方法,让iPad跟iPhone、还有其他 Mac 也可以加入到输出设备里,预计会在下一个大版本里面更新;部分 App 或 macOS 测试版可能出现 Core Audio 兼容问题。如果你的核心需求是 HomePod、AirPlay 多房间播放或专业录音路由,Tutti 并不适合替代对应的专业方案。
我宁愿把这些边界提前写清楚。音频工具和每个人手上的硬件关系很大,同一个功能在显示器、蓝牙音箱和 USB 声卡上的体验可能并不完全相同。

我还想知道大家音响系统是怎么样的?
Tutti 最早来自我自己的桌面,但发布以后,我发现大家的音响设备比我想象得复杂得多。有人连接两台显示器,有人需要连接声卡,也有人同时处理会议、音乐和浏览器声音。
所以我现在最想知道两件事:你平时会给一台 Mac 同时连接哪些音频设备?在统一音量、设备同步和按 App 分配输出之间,哪一个问题最影响你的日常使用?
如果你愿意尝试,也欢迎把 macOS 版本、设备型号和具体问题告诉我。即使 Tutti 目前不能解决,这些真实场景也会帮助我判断下一步应该先做什么。
- 产品演示:
