下载本文示例代码
我想:在回答“你用什么播放器听 MP3”这个问题时,90%的人都会回答Winamp!那么你一定用过 Winamp 的插件功能吧,正是多样化的插件使这“老”播放器不断地焕发青春。不管新推出什么音频格式(MP4,VQF,RM...),只要插件一装就能播放。还有形形色色的可视插件,比如Giess 等等,将音乐的节奏感表现的可谓淋漓尽致! 既然插件是用程序编写的,那么我们何不来一试身手,动手做它一个出来?!用过 Winamp 的人都知道,Winamp 插件是放在 Pulgin 文件夹中一个个的 DLL(动态链接库)文件,所以编写 Winamp 插件其实就是编写 Windows 的动态链接库。当然写的时候是要遵循一定的规范的(相关文档可以从 下载),在这方面,Winamp 作者 Justin Frankel 写的一个可视插件的例子可以作为我们很好的参考。下面我们就以这个例子(当然也是一个编写规范)为参考,认识一下Winamp 可视插件的编写方法。 (下面的程序可从 Winamp 官方网站下载,文件名为 vis_minisdk.zip) 首先让我们看一下可视插件使用的数据结构(在文件 Vis.h 中)
// 注意:// 任何呆在前台的插件窗口都应该将按键传送给其父(WinAMP 的)窗口,以确保// 用户仍旧可以控制 WinAMP(除非用户按了 ESC 键或者插件所指定的键)。// 在存储配置时,配置数据应当统一存放在 \plugin.ini 中。// 请将这个插件例程看作一个框架。typedef struct winampVisModule { char *description; // 模块描述(出现在插件选择列表框下面得下拉列表框中) HWND hwndParent; // 父窗口------------- (由主调应用填充) HINSTANCE hDllInstance; // 此 DLL 的实例句柄 - (由主调应用填充) int sRate; // 采样速率 ---------- (由主调应用填充) int nCh; // 声道数 ------------ (由主调应用填充) int latencyMs; // 从调用 RenderFrame 到真正绘制的潜伏时间(毫秒) // (主调应用在获取数据的时候会查看这个值) int delayMs; // 每两次调用之间的间隔时间(毫秒) // 数据依照各自的 Nch(声道数) 条目被填充 int spectrumNch; int waveformNch; unsigned char spectrumData[2][576]; // 频谱数据 unsigned char waveformData[2][576]; // 波形数据 void (*Config)(struct winampVisModule *this_mod); // 模块配置函数 int (*Init)(struct winampVisModule *this_mod); // 初始化函数(创建窗口等等)。成功返回0 int (*Render)(struct winampVisModule *this_mod); // “表演”函数。成功返回0,如返回1表示插件应该终止 void (*Quit)(struct winampVisModule *this_mod); // 模块退出函数。完成之后调用 void *userData; // 用户数据 (可选)} winampVisModule;typedef struct { int version; // VID_HDRVER (当前模块的版本) char *description; // 插件的描述(出现在选择插件对话框的插件列表框中) winampVisModule* (*getModule)(int); // 用来获取模块结构} winampVisHeader;// 定义导出标识typedef winampVisHeader* (*winampVisGetHeaderType)();// 当前模块的版本 (0x101 == 1.01)#define VIS_HDRVER 0x101上面列出的是一个编写可视插件必须包含的头文件,里面列出了可视插件用到的数据结构。在探讨具体插件程序之前,有一些概念必须搞清:一个可视插件中可以包含若干个模块(每一模块都是一种演示效果,可以在插件选择对话框中选择用哪个模块来演示),这些模块通过某种方法(后面将会看到)被 Winamp 获取,从而得到“表演”的机会。共2页。 1 2 :
我想:在回答“你用什么播放器听 MP3”这个问题时,90%的人都会回答Winamp!那么你一定用过 Winamp 的插件功能吧,正是多样化的插件使这“老”播放器不断地焕发青春。不管新推出什么音频格式(MP4,VQF,RM...),只要插件一装就能播放。还有形形色色的可视插件,比如Giess 等等,将音乐的节奏感表现的可谓淋漓尽致! 既然插件是用程序编写的,那么我们何不来一试身手,动手做它一个出来?!用过 Winamp 的人都知道,Winamp 插件是放在 Pulgin 文件夹中一个个的 DLL(动态链接库)文件,所以编写 Winamp 插件其实就是编写 Windows 的动态链接库。当然写的时候是要遵循一定的规范的(相关文档可以从 下载),在这方面,Winamp 作者 Justin Frankel 写的一个可视插件的例子可以作为我们很好的参考。下面我们就以这个例子(当然也是一个编写规范)为参考,认识一下Winamp 可视插件的编写方法。 (下面的程序可从 Winamp 官方网站下载,文件名为 vis_minisdk.zip) 首先让我们看一下可视插件使用的数据结构(在文件 Vis.h 中)
// 注意:// 任何呆在前台的插件窗口都应该将按键传送给其父(WinAMP 的)窗口,以确保// 用户仍旧可以控制 WinAMP(除非用户按了 ESC 键或者插件所指定的键)。// 在存储配置时,配置数据应当统一存放在 \plugin.ini 中。// 请将这个插件例程看作一个框架。typedef struct winampVisModule { char *description; // 模块描述(出现在插件选择列表框下面得下拉列表框中) HWND hwndParent; // 父窗口------------- (由主调应用填充) HINSTANCE hDllInstance; // 此 DLL 的实例句柄 - (由主调应用填充) int sRate; // 采样速率 ---------- (由主调应用填充) int nCh; // 声道数 ------------ (由主调应用填充) int latencyMs; // 从调用 RenderFrame 到真正绘制的潜伏时间(毫秒) // (主调应用在获取数据的时候会查看这个值) int delayMs; // 每两次调用之间的间隔时间(毫秒) // 数据依照各自的 Nch(声道数) 条目被填充 int spectrumNch; int waveformNch; unsigned char spectrumData[2][576]; // 频谱数据 unsigned char waveformData[2][576]; // 波形数据 void (*Config)(struct winampVisModule *this_mod); // 模块配置函数 int (*Init)(struct winampVisModule *this_mod); // 初始化函数(创建窗口等等)。成功返回0 int (*Render)(struct winampVisModule *this_mod); // “表演”函数。成功返回0,如返回1表示插件应该终止 void (*Quit)(struct winampVisModule *this_mod); // 模块退出函数。完成之后调用 void *userData; // 用户数据 (可选)} winampVisModule;typedef struct { int version; // VID_HDRVER (当前模块的版本) char *description; // 插件的描述(出现在选择插件对话框的插件列表框中) winampVisModule* (*getModule)(int); // 用来获取模块结构} winampVisHeader;// 定义导出标识typedef winampVisHeader* (*winampVisGetHeaderType)();// 当前模块的版本 (0x101 == 1.01)#define VIS_HDRVER 0x101上面列出的是一个编写可视插件必须包含的头文件,里面列出了可视插件用到的数据结构。在探讨具体插件程序之前,有一些概念必须搞清:一个可视插件中可以包含若干个模块(每一模块都是一种演示效果,可以在插件选择对话框中选择用哪个模块来演示),这些模块通过某种方法(后面将会看到)被 Winamp 获取,从而得到“表演”的机会。共2页。 1 2 :
下载本文示例代码
WinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIYWinAMP 插件DIY
阅读(138) | 评论(0) | 转发(0) |