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…


分享: Fanfou Misterwong-CN QQ Bookmark Baidu Bookmark del.icio.us Digg Google Yahoo! Yotie

永久链接   订阅

相关文章

Leave a Comment