Plugin Series: Winamp&Plugin
Winamp做为从1997年就流行至今的音频播放器,其丰富的插件更是令其忠实的粉丝爱不释手。

Winamp是Nullsoft工作室的拳头产品,在1996年由Justin Frankel(右图) 首次发布,最近交由Ben Allison, Will Fisher, Taber Buhl, Maksim Tyrtyshny, Chris Edwards 和Stephen Loomis六人开发。
发展历史
1997年4月21日,简陋的0.20a版发布,名字是WinAMP,简单的菜单,只能一次播放一首mp3。Mp3解码器采用Tomislav Uzelac开发的AMP引擎。
1997年5月,发布0.92版,开始显现经典的"classic"界面:黑灰色边框、银色3D按钮和绿色LED字体等,开始支持多文件播放。
Winamp 1
1997年6月7日,发布1.006版,正式命名为Winamp,增加频谱分析器(spectrum analyzer)。
1998年1月,Frankel创建Nullsoft,也决定将Winamp从免费软件改为$10的共享软件。不久之后的3月份,Uzelac也成立了自己的公司PlayMedia Systems,他发给Frankel一封信,要求Nullsoft停止使用AMP引擎。Frankel回应说自己早就换成了自己开发的Nitrance引擎。
1998年3月31日,发布1.90版,开始正式支持插件,包括两个input插件(MOD和MP3)和一个视觉插件。这是一个具有里程碑意义的版本,Winamp也正式成为普通意义上的音频播放器。仅仅在18天之后,又添加wave、cdda和Windows系统栏控制插件,以及著名的DEMO.mp3,"Winamp, it really whips the llama’s ass(鞭打美洲驼的屁股)"。
Winamp 2
1998年9月8日,2.0版问世。2.x版本得到了广泛流行,成为微软Windows系统上最流行的软件之一,它提升了播放列表的可用性和均衡器的精准性,提供了更多的插件,以及提供了让人津津乐道的皮肤支持。
1999年3月,对于Winamp的日进斗金,Uzelac再也坐不住了,对Nullsoft提起了联邦诉讼。6月,Nullsoft被AOL以8千万美元收购。不久后,Nullsoft被裁定停止使用Nitrane引擎,双方也达成庭外和解。之后不久,Nullsoft转向MP3格式开发者Fraunhofer Gesellschaft的ISO解码器。
2000年6月,Winamp注册用户达到2500万。
Winamp 3
2002年8月9日发布的3.0版无疑是个失败的版本,采用了跨系统的程序框架 Wasabi,代码完全重写。大量用户抱怨说占用了太多的系统资源,并且一点也不稳定,同时不能兼容2.0版本的皮肤和插件。许多用户都返回到了2.0版本。这使得Nullsoft放弃了3.0版本的继续升级,返回到了2.0版本,一直升级到2.9和2.91。后来Winamp3的Wasabi框架开放了源代码,并成为Wasabi框架的单独一个版本。(关于Winamp3版本我们可以联想到微软的Windows XP和Vista进行参考)
Winamp 5
NullSoft开创先河地使用了一种版本号,将Winamp2和Winamp3的特点熔合在一起, 2+3=5,直接到版本5,从而跳过了版本4。2003十二月Winamp5.0发布。在后来的5.2版本中,更是增加了同步iPod的插件。
2007年十月10日,为了庆祝第十个周年庆典,发布5.5版本。增加了像Windows Media Player类似的Album Art 的功能。
插件
Winamp有一套开发包,公开了Winamp的API,允许第三方通过插件方式扩展Winamp的功能。Winamp对其插件库的管理有着严谨的规范,插件统一放在Winamp\Plugins目录下,插件的文件命名也有专属的名字空间。Winamp将插件分为以下七个类型:
- Input plug-ins 对特定文件格式的多媒体数据进行解码,插件前缀是in_;
- Output plug-ins 控制已解码的音频的去向,比如是到DirectSound设备或是直接输出到文件 ,插件前缀是out_;
- Visualization plug-ins 提供音乐控制的视觉效果,插件前缀是vis_;
- DSP/Effect plug-ins 处理音频本身(特效、均衡、压缩等) ,插件前缀是dsp_;
- General Purpose plug-ins 增加一些普通功能,比如媒体库、时钟提醒、用户注销时暂停等) ,插件前缀是gen_;
- Media Library plug-ins 对媒体库增加特定功能,插件前缀是ml_;
- Portable Device plug-ins 增加对可携带媒体设备的支持,如Apple的iPod、用于Windows Mobile的ActiveSync设备等,插件前缀是pmp_;。
插件在Winamp的发展道路上起到着举足轻重的作用,第三方开发的极大了丰富了Winamp的功能,几乎能播放所有的音频格式。相对大量的其它媒体播放器,Winamp的插件开发也更容易。
插件开发
Winamp的插件以32位的Windows DLL文件实现,开发工具一般使用Microsoft Visual C++ 4.0以上版本,以C或C++语言编写,也有一些开发者使用Delphi、LCC和Visual Basic。
Winamp SDK下载:5.02版本SDK的zip包 下载地址 | 5.34版本SDK的exe文件 下载地址
开发时可以使用SDK中Winamp公开API的头文件,开发不同插件时使用不同的头文件。
这里提供一个简单的使用VC6的样例代码:
gen_empty.h
1: #ifndef gen_empty_h
2: #define gen_empty_h
3: #include <windows.h>
4:
5: typedef struct {
6: int version;
7: char *description;
8: int (*init)();
9: void (*config)();
10: void (*quit)();
11: HWND hwndParent;
12: HINSTANCE hDllInstance;
13: } winampGeneralPurposePlugin;
14:
15: #define GPPHDR_VER 0x10
16:
17: extern winampGeneralPurposePlugin *gen_plugins[256];
18: typedef winampGeneralPurposePlugin * (*winampGeneralPurposePluginGetter)();
19:
20: #endif
gen_empty.c
1: #include <windows.h>
2: #include "gen_empty.h"
3:
4: int init(void);
5: void config(void);
6: void quit(void);
7:
8: winampGeneralPurposePlugin plugin = {
9: GPPHDR_VER,
10: "MyEmpyProject vx.x (gen_empty.dll)", // Plug-in description
11: init,
12: config,
13: quit,
14: };
15:
16: int init() {
17: //MessageBox(plugin.hwndParent,"Init","",MB_OK);
18: return 0;
19: }
20:
21: void config() {
22: MessageBox(plugin.hwndParent,"Config","",MB_OK);
23: }
24:
25: void quit() {
26: //MessageBox(0,"Quit","",MB_OK);
27: }
28:
29: __declspec(dllexport) winampGeneralPurposePlugin * winampGetGeneralPurposePlugin() {
30: return &plugin;
31: }
to be continued…




