远程音频

之前折腾了远程音频,差不多就是把各个机子的音频转发到另一个机子上,然后在那上面插耳机。好处主要是换机器不用换耳机,全都是一个出口。 Windows 的发送靠 Scream (https://github.com/duncanthrax/scream),可以把音频发送到网上的接收端。Windows 这边是个驱动,也有各种客户端可以收。默认是多播,注册表改改就能单播了…… Linux 靠的是 Pulseaudio 的 rtp send/recv。其实挺简单的,就是弄个 rtp sink 作为默认音频 sink,然后把这个 sink 的收到的东西用 rtp-send 发出去: load-module module-null-sink sink_name=rtpload-module module-rtp-send source=rtp.monitor destination_ip=<receiver IP> rate=96000set-default-sink rtp 接收端么弄个 rtp-recv,就行了: load-module module-rtp-recv sap_address=<receiver IP> 就像我之前说的,默认这货会用多播,然后导致一些 WiFi 问题…… 所以要指定 IP 才行。 FreeBSD 嘛比较麻烦点。首先,支持 Pulseaudio 的程序可以按 Linux 一样处理。然而,有些程序就认基础的 oss,打开 /dev/dsp 就用…… 对这种东西当然可以用padsp,不过这货好像有点bug,不太行。我找了个结合 virtual_oss 和 Pulseaudio 的方法。 …

Continue reading ‘远程音频’ »

GPU Passthrough in Bhyve

所谓 GPU Passthrough 其实就是把一个 GPU 扔给虚拟机用。众所周知,虚拟机没法打游戏的主要问题就是显示性能不行,因为基本上没有 3D 加速。如果能够把整个显卡直接扔进去,那当然性能应该和原生的差不多,就可以打游戏了…… 所以因为懒得重启到 win 下面打游戏,就想尝试在 Bhyve 搞这个。Linux 下面这套东西其实很成熟,大家都用 KVM 搞个 windows 虚拟机然后传个显卡进去,然而 FreeBSD 底下这个 Bhyve 么…… 问题还不少。 首先是设置一些设备为 passthrough 设备,这样 host 就管不着它们了。这个是在 /boot/loader.conf 里面加上 pptdevs=”1/0/0 1/0/1″ 至于为啥是这俩,是因为这俩是我显卡搞出来的俩 PCI 设备。装了 vm-bhyve 之后,直接 vm passthru 就能看见对应的 Bhyve ID 了。 弄完之后,直接在 VM 的配置文件(vm configure <vm name>)里面加上 passthru0=”1/0/0=10:0″passthru1=”1/0/1=10:1″ 就可以让这俩设备传给 VM 了。 当然,以上只是最基本的…… 接着跑个 …

Continue reading ‘GPU Passthrough in Bhyve’ »

老调重谈:Spotify & Netflix on FreeBSD

FreeBSD 上没法用 Spotify 和 Netflix 很久了,自从这些东西的网页版需要 DRM 以来。具体来说,现在这些(以及基本上所有别的 Streaming 服务,例如 Disney+)都需要 Google 的 Widevine DRM 模块,而这货只有 binary,只提供给了 Windows/Linux/MacOS,所以 FreeBSD 就没法满足 DRM 需求。 理想状况当然是干掉 DRM,这个当然没戏;让 G 提供这个也不错,但是应该也没那么容易;用兼容层跑 Widevine 那个库或许可行,不过还需要花点功夫;之前还搞过在另一台 Linux 机子上放,转发过来。今天说的是通过跑个 Linux 虚拟机达到这个目的…… 第一次拿 bhyve 搞虚拟机,还挺好用的(通过使用 vm-bhyve……),几步就装完了一个 Debian。装好之后就有几个问题: 视频输出 音频输出 问题1有很多个办法,比如说可以ssh -Y,比如说可以remote desktop,可以VNC之类的…… 试了几波,ssh -Y和remote desktop都受限于 CPU,没法传4K。remote desktop差不多能到2560×1440,看流量大概有一个多Gbps…… 回头一想,搞什么ssh,直接连X啊…… 于是打开 X 的 TCP 监听,直接 DISPLAY=<IP>:0 怼过去,然后的确能用,4K都行,流量大概4个多Gbps…… …

Continue reading ‘老调重谈:Spotify & Netflix on FreeBSD’ »

yakyak on FreeBSD

Google Hangouts 这个网页客户端实在是让人受不了…… 浪费很多空间不说,经常还很卡。Chrome 插件还行,然而我用Firefox…… 幸好我们还有人们自行研发的 yakyak,用着还行,有通知,界面和 Hangouts 那个 Chrome 插件基本一样。但是问题在于,这货很流行地使用了 Electron 平台,这货还没官方 FreeBSD 支持…… 幸好已经有人port了Electron,现在是4.2.9。因此,yakyak 也是可以跑在 FreeBSD 上面的。 先装好 electron,然后checkout我修改过的yakyak:https://github.com/HenryHu/yakyak。进去,跑npm install,再npm run gulp。这样就产生了一个app目录,里面是编译好的内容(yakyak是CoffeeScript写的……)。 最后跑electron app,就行了。 其实修改只有一个内容:干掉了自动启动,因为 auto-launch 这个包还不支持FreeBSD。auto-launch这种写个.desktop的事情,应该也没啥特别不portable的问题,既然支持 Linux,改 FreeBSD 应该很容易…… 如果这个也支持了的话,那就可以直接用官方版本了。 Hangouts 的失败不知道没有好用的桌面客户端有多少锅,至少 Telegram 就有桌面客户端…… 不过 Telegram 主要卖点大概还是群组和表情包?……

FreeBSD 的中文console

其实 FreeBSD 的 console 早就支持中文了,问题是默认没装中文字体,所以显示出来都是方块…… 系统提供了 vtfontcvt 工具,用来转换字体到系统需要的fnt格式。它吃俩格式,bdf和hex,我只认识bdf…… 于是尝试转换 wenquanyi 的位图字体。源文件是pcf的,先要找个东西转换成bdf,姑且在github找了个: https://github.com/ganaware/pcf2bdf (刚看了眼原来有port,当初搜pcftobdf没搜到……) 转完之后用vtfontcvt,冒出来了各种错误。先是说字符宽度不支持。 打开文件一看,这货好像对字体有很多假设,比如所有字符宽度不是目标宽度的2倍就是和目标一样(等宽字体?)。 wenquanyi 里面虽然中文都是一样的,但是其他英文什么的有各种宽度,比如10pt的字体,pixel宽度有2-13不等…… 于是先修vtfontcvt才行。这个vtfontcvt问题还真不少…… 除了前面那个假设之外,他还假设每个字符都和目标一样高,是不是写的时候连bdf格式描述都没读过,拿个样例文件就开搞了…… 他还忽略了字符的偏移位置…… 修完的vtfontcvt干了这么几个事情: × 读取FONTBOUNDINGBOX信息,了解全局的基线位置 × 读取字符的BBX信息,这个包括了这个字符多大和应该放哪儿 × 干掉了那个宽度假设。当然,太宽还是不行的…… 打算提交这个修改的时候,发现有个PR已经管了一部分问题: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=205707 但是这个PR修的东西略少,也没管位置偏移之类的问题,于是还是把我修的版本交了上去(一开始还弄错一个版本……)。 之后在这个PR和我的patch的基础上又搞了搞,于是支持多字体叠起来了(wenquanyi的英文太丑了,还不等宽……)。 完整版patch:http://www.henryhu.net/vtfontcvt_full.patch 最后转了个Terminus+wenquanyi的字体出来,用vidcontrol -f弄进去,现在控制台终于可以原生显示中文啦! 转完的字体(Terminus 14pt + wenquanyi 10pt): http://www.henryhu.net/ter-wqy-8×14.fnt