2024年5月份看到IT新闻,9月份Winamp会正式对外开源,9月25日在某群里看到正式开源,
https://github.com/WinampDesktop/winamp 于是高高兴兴下载,打算自己编译一个Winamp,找找当年的回忆。Winamp最早是Nullsoft开发的,后来特别是Nullsoft的Installer,我们还在Ubiquecom的项目中正式使用过,非常小巧好用。
1、通过Github下载Winamp代码
Github时灵时不灵,好在下载Winamp的时候速度还可以,很快就下载了,不算太大,不到2GB的样子,比较出乎意料。下载了几次,还是成功了,这是最简单的一步了,由于网速问题,花了至少1小时。然后就要准备环境和编译。不要小瞧了2GB的大小,编译之后的中间代码和目标代码,最后超过了7GB,我的硬盘已经没有空间,于是用移动硬盘来放Winamp,拷贝用了一个多小时!
2、安装Visual Studio 2019开发环境
目前可以个人免费使用的是VS 2022的社区版本,VS 2019的社区办已经找不到下载之处了。于是只好用VS 2022的社区办版本,运行build脚本,不出意外的就失败了。然后研究一下,发现这不是我的特例,也不是Winamp的特例,其他的开源代码也有这个问题,原因之一是VS 2022用了C++的新版本,和VS 2019不兼容。所以即便在2019编译通过的代码,在2019上也不一定编译通过。好在MS的VS2022安装程序非常强大,可以支持安装多个编译环境,而且也提供了2019的编译环境,于是又下载大约2GB,真是紧忙乎,大约折腾了1个晚上。
3、编译Winamp的依赖库和工具
这个是我始料未及的复杂。我也做过很多的Windows桌面软件,也会使用开源软件,一般有三种方法,有些小的直接用源代码;还有一些是Include+lib;还有些就是DLL。如果涉及到第三方工具,一般弄个二进制包放到目录下,直接调用就完了。当然,我这种仅仅是图省事,正规的方法是要下载所有用到开源库的源代码,然后找人维护,注意不是专人,而是组员兼职,以前在BellLabs的研发部门,基本都是这样的,大家都很有兴趣和主动性。
没料到的是,Winamp把所有的依赖包、工具的源代码都维护起来了!!!其中,只有商业化的Qt DLL使用了二进制文件,而且还提供了x86、x64的debug和release版本,一共4个交付包!为了管理好这一大堆第三方库,特别的,很多还是Linux版本的Windows port。于是Winamp使用了CMake编译,为了和VC结合好,又使用了MS的vcpkg和nijia!!真是太复杂了,我估计,世界上没有多少人能同时弄明白CMake和vcpkg的程序员!这样折腾半天,最大的好处是,Winamp的代码和第三方代码彻底分开了,Winamp开源代码并没有交付任何第三方的,e.g. GPL的代码。
Winamp提供了一个脚本install-packages.cmd,用来动态下载、编译和部署这些工具和第三方库。貌似简单的批处理工具,却出现了问题。首先是下载问题,国内对很多国外代码托管网站是限速或者屏蔽的,这样批处理脚本就会失败!于是需要反复执行,每次执行,脚本都会删除一切,重新下载。于是简化了这个脚本,只让脚本下载和build没出错的脚本。弄到最后,19个第三方包,只有两个还无法安装:freetype和spdlog。
3.1 Freetype是一个字体渲染开源库
Freetype依赖了一大批开源软件,其中有一个Brotlt编译出问题,虽然单独编译可以通过,但是放在一起就没法通过,想自己排查,但是无从下手,原因是这些出问题的脚本都是由另外的脚本生成的,应该是某个脚本的参数不对。参见下面两个图就可以看到问题
3.2 spdlog是C++常用的一个日志库
spdlog看上去不是什么刚性的依赖,但是编译不通过,查看错误,应该是C++编译器的事情,不知道什么地方配置错误,折腾了好一阵子,也没弄好。直接把spdlog放到VS 2022中编译也出现类似的问题。
折腾了2个晚上,也没有解决这两问题,想想算了,干脆编译Winamp,编译出问题再单独编译freetype和spdlog就行,不用浪费时间
4、编译Winamp播放器和配套软件
Winamp提供了一个winampAll_2019.sln,可以在VS 2022中编译。这个是所有Winamp的可执行代码和动态库,src目录下还有一个Winamp\WINAMP.sln,也可以编译,先编译第一个,果然又出问题了。这次提示需要Qt.props,搜索了一下,这个是Qt的VS2022插件需要的内容,安装插件可以用VS2022,但是尝试了几次,安装不上Qt插件,后来等了好久才提示可以安装。后来才知道,Qt插件有很多镜像站,可以快速下载,可以参见文后的列表。
由于安装Qt插件,还是要安装Qt的,看了一下,Winamp使用了Qt的5.12版本,于是老老实实找这个版本,找到下载链接后,提示:“Download from your IP address is not allowed”,原来我大唐的IP地址被Qt Block了!!。这个软件5.12.10的X86版本需要3.7GB,估计国内有下载的,果然就找到了,但是只有5.12.0版本,而且在百度网盘上,下载太慢了,又花钱买了百度网盘的VIP,15分钟可以下载完成,下楼扔一趟垃圾的时间。(后来又看到一个文章,据说不用花钱也可以高速下载!欲练神功…)
安装了Qt5.12.0和Intel IPP之后,一些项目就可以编译起来了,但是很多项目的配置还是不对,要是数量不大就改了,没料到Winamp里面有150个子项目!!改好了几个以后,验证了方法,就不折腾了,有兴趣的同好可以继续试试~
小结:
Winamp是一个高质量、最广受众的多媒体播放软件,支持最全的多媒体插件、DSP播放效果等。目前部分开源后,虽然没有编译成功,但还是学习到了商业化开源软件的代码规划和管理方法,复杂代码中第三方工具和开源代码的整合机制。目前虽然云计算还是主流,但那仅仅是服务端软件的架构和转型,而在客户端,不论移动终端如何发展,Windows这种桌面客户端还是会占据很大的市场,除非以后一切都被Android统治,说不定,这股势力背后还会有华为鸿蒙的助力,美帝要卡死中国的IT脖子,说不定反而被中国IT突围,胜负未知、拭目以待!
附1:Winamp的开源许可问题
2024 年 5 月 16 日,Llama Group 宣布 Winamp 将于 2024 年 9 月 24 日部分开源。源代码是在“Winamp Collaborative License”下发布的,该许可证自称是自由和 copyleft 许可证,同时限制分发从源代码编译的修改和原始二进制文件的能力(不被视为免费或开源),并放弃第三方对 Llama Group 贡献的所有所有权,许可证的早期修订版阻止了软件的任何分支。源代码发布后,发现了多段专有源代码,例如杜比的加密实现、整个 SHOUTcast 服务器软件,以及以前未发布的 GPL 许可代码,这些代码被 Winamp 修改,违反了许可证条款。
附2:Qt无法下载和安装的原因
不少人遇到了Qt无法安装下载和安装Qt的最新开源版本,也就是Qt5.10+系列,从Qt论坛看,有一些俄罗斯人遇到这个问题,引发了激烈的讨论,有十几页的讨论,看上去中国、俄罗斯等国的IP地址都被Block了。
附3:Winamp发展历程回顾
Winamp 是 Microsoft Windows 的媒体播放器,最初由 Justin Frankel 和 Dmitry Boldyrev 由他们的公司 Nullsoft 开发,后来他们于 1999 年以 8000 万美元的价格出售给 AOL。然后,它于 2014 年被 Radionomy 收购,现在称为 Llama Group(注意:和Meta的大模型Llama不是一回事)。从版本 2 开始,它就作为免费增值方式出售,支持插件和皮肤的可扩展性,并具有音乐可视化、播放列表和媒体库,由大型在线社区提供支持。
Winamp 的第 1 版于 1997 年发布,并迅速流行起来,下载量超过 300 万次,与 MP3(音乐)文件共享的发展趋势平行。Winamp 2.0 于 1998 年 9 月 8 日发布。2.x 版本被广泛使用,使 Winamp 成为下载次数最多的 Windows 应用程序之一。到 2000 年,Winamp 拥有超过 2500 万注册用户,到 2001 年已拥有 6000 万用户。2002 年重写的 Winamp3 反响不佳,随后于 2003 年发布了 Winamp 5,随后于 2007 年发布了 5.5 版。此外,还发布了现已停产的 Android 版本,以及 MS-DOS 和 Macintosh 的早期版本。
经过五年的中断,Winamp 5.8(写为 Winamp 5. ∞ )于 2018 年向公众泄露,最终由 Radionomy 发布;此后,开发已恢复,最新版本 5.9.2 于 2023 年 4 月 26 日发布。其开发商 Radionomy 此后更名为 Llama Group,并推出了一项流媒体服务,允许用户通过购买津贴或 NFT 来支持艺术家。该服务于 2023 年 4 月在网络上推出,随后于 2023 年 7 月推出了适用于 Android 和 iOS 的测试版应用程序。2024 年 9 月,Llama Group 根据自定义源代码可用许可证部分开源了 Winamp for Windows。
附4:Winamp 源代码的Readme
About
Winamp is a multimedia player launched in 1997, iconic for its flexibility and wide compatibility with audio formats. Originally developed by Nullsoft, it gained massive popularity with still millions of users. Its development slowed down, but now, its source code was opened to the community, allowing developers to improve and modernize the player to meet current user needs.
It really whips the llama’s ass.
Usage
Building of the Winamp desktop client is currently based around Visual Studio 2019 (VS2019) and Intel IPP libs (You need to use exactly v6.1.1.035). There are different options of how to build Winamp:
- Use the
build_winampAll_2019.cmd
script file that makes 4 versions x86/x64 (Debug and Release). In this case, Visual Studio IDE is not required.
- Use the
winampAll_2019.sln
file to build and debug in Visual Studio IDE.
Dependencies
libdiscid
We take libdiscid from https://github.com/metabrainz/libdiscid/tree/v0.6.2, copy it in /Src/external_dependencies/libdiscid-0.6.2/
libvpx
We take libvpx from https://github.com/ShiftMediaProject/libvpx, modify it, and pack it to archive. Run unpack_libvpx_v1.8.2_msvc16.cmd
to unpack.
libmpg123
We take libmpg123 from https://www.mpg123.de/download.shtml, modify it, and pack it to archive. Run unpack_libmpg123.cmd
to unpack and process the DLLs.
OpenSSL
You need to use openssl-1.0.1u
. For that, you need to build a static version of these libs. Run build_vs_2019_openssl_x86.cmd
and build_vs_2019_openssl_64.cmd
.
To build OpenSSL, you need to install:
- 7-Zip (https://www.7-zip.org/) – Licensed under the GNU LGPL.
- NASM (https://www.nasm.us/) – Licensed under the 2-Clause BSD License.
- Perl (https://www.perl.org/) – Licensed under the Artistic License or GPL.
DirectX 9 SDK
We take DirectX 9 SDK (June 2010) from Microsoft, modify it, and pack it to archive. Run unpack_microsoft_directx_sdk_2010.cmd
to unpack it.
Microsoft ATLMFC lib fix
In file C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\atlmfc\include\atltransactionmanager.h
Go to line 427 and change from:
return ::DeleteFile((LPTSTR)lpFileName);
to:
return DeleteFile((LPTSTR)lpFileName);
Intel IPP 6.1.1.035
We take Intel IPP 6.1.1.035, modify it, and pack it to archive.
Run unpack_intel_ipp_6.1.1.035.cmd
to unpack it.
Build Tools
Several external build tools are required to build Winamp. These tools are not bundled directly into the repository to comply with their respective licenses. You will need to download them separately from the following links:
-
7-Zip Portable: Download from https://www.7-zip.org/
License: GNU LGPL -
Git: Download from https://git-scm.com/download/win
License: GNU GPL v2 -
TortoiseSVN: Download from https://tortoisesvn.net/downloads.html
License: GNU GPL v2
Make sure to install these tools as part of your build environment. You may need to modify the build scripts to reflect the correct paths to these tools on your system.
相关信息
https://en.wikipedia.org/wiki/Winamp
https://github.com/WinampDesktop/winamp
https://download.qt.io/archive/qt/5.12/
https://github.com/google/brotli
https://zhuanlan.zhihu.com/p/676733751
https://blog.csdn.net/MelyLenient/article/details/123854069
https://blog.csdn.net/Viciower/article/details/134561404
https://blog.csdn.net/qq_43627907/article/details/140424827
https://zhuanlan.zhihu.com/p/351086156
https://download.qt.io/static/mirrorlist/ (注意:仅到5.9版本,但是有很多最新工具)
https://forum.qt.io/topic/134764/installation-from-this-ip-address-is-not-allowed/2
https://zhuanlan.zhihu.com/p/351086156
https://www.intel.com/content/www/us/en/developer/tools/oneapi/ipp.html