本着跟踪技术潮流和尝鲜精神,一直尽量让自己机器安装最新环境,还要经常保持升级。ubuntu版本是22.04,Qt是6.4.2。
最近对morse码很感兴趣,想学习找不到合适工具,所以就用Qt6写一个。
QSoundEffect和QMultimedia都是Qt提供的可以播放声音的工具,但QSoundEffect时间响应要好于QMultimedia,需要精确时间控制和快速响应的声音播放应该选用QSoundEffect。
声音方案很简单,界面上维护着一个全局的QSoundEffect,初始化时候装入音频文件,在需要时候播放,滴嗒声音靠定时器控制QSoundEffect的播放时长。
前期测试时功能基本可用,就把代码固定下来。虽然这个月ubuntu和qt都进行过更新,但也没做多想,没再进行过测试,而是集中精力研究了Qt的部署问题。
win环境部署有现成的windeployqt,linux的linuxdeployqt得单独准备。因为环境太新,所以只能下载源码自己编译。费了很多周折,总算把部署问题基本搞定。结论是linuxdeployqt根本不是给Qt6准备,Qt6的应用直接用linuxdeployqt生成的安装根本不可用,还得自己额外补充很多必要库之后在新环境才可能使用。又测试一个Qt5生成的应用,linuxdeployqt表现还可以。
但把我的应用部署到新环境之后,却发现出了问题。QSoundEffect无法连续工作,发出五六次声音之后,再也不出声。查很多资料理不出头绪。只好做折衷,先让应用跑起来再说。不使用全局的QSoundEffect,改为在每次发声前申请一个“新鲜”的QSoundEffect,只使用一次。这样处理之后连续发声可以实现,但又发现新问题,每次播放的第一个声音,不管是滴还是嗒都会不出声,之后的所有滴嗒都正常。找不出原因,还是折衷让应用先跑起来。又申请一个QSoundEffect,装入空白声音,在正式播放之前,先放这个空白100毫秒,再停止,再延时100毫秒之后再进行正式播放,这么处理之后,所有声音都能够按要求播出。虽然应用按设计要求实现了功能,但这代码真的很恶心,莫名其妙加入那么多垃圾。
为了做对照,用Qt5实现了同样功能,Qt5的表现好于Qt6,全局的QsoundEffect好用,不需要重复申请,但吃掉第一个声音的现象还有,还得用播放一个空白来抵消。
在Win下编译同样代码,这些现象都不存在,只需要按正常逻辑实现即可。总的说来,Linux下的Qt成熟度还是不大够。