【原创】Winamp输入模块编写详解,超重量级贴子,必看!

fireseed 2003-09-10 11:02:01
加精
写给C/C++基础类的朋友:
很长时间都没有认真的来版上和网友们聊聊了,偶尔上来也是随便转转,仅处理一下版务。这些日子里来你们之中的有些人给我发了短消息,问道“嘿,哥们(大多数时候用的是‘老大’这个词,但我并不怎么喜欢这个称呼,感觉有点像黑社会?),最近怎么不见你露面啊,忙什么呢?”而我在极为敷衍的回答道:“在忙自己的活呢,不好意思啊。”之后也感觉到非常内疚,但是每当我一想起现在做的工作,能真正的给那些在C/C++版里做出贡献的网友们留下点东西,我也便觉得心安理得了。




在正式开始之间我还是想说一些废话,如果你是老手就向下拖动右边的滚动条30-50像素吧。Winamp是众所周知的世界上最好最流行的音乐(媒体)播放软件,它所支持的音频格式之多另其它同类软件望尘莫及。而这种广泛支持性又是由于它采用了非常合理巧妙的插件式设计,每个人都可以用winamp来播放自己发明的音频格式,只要你写出了相应的输入插件。但这篇文章不会教你用小波变换等高难度数学算法来编写比MP3或APE更为优秀的音频编码格式,如果你企图在文章里找到这些东西,我还是劝你到此为止,关掉浏览器,然后去图书馆翻看《信号学》。在这篇文章里我首先会教你怎样编写一个符合Winamp插件规范的输出插件,你一定会问,我刚才说的不是输入插件吗?其实这两种插件是一体的,你向下看便会得到答案。在练习编写输出插件的的同时,我还将帮你了解电声的基础原理、了解Winamp的设计结构、熟悉WAVE(PCM)的文件格式、声卡的基本工作机制等。最后,我们还会用DirectX来完成这个音频的输出模块。这是一系列非常令人激动的主题,但请你还是先不要急着热血沸腾,下面这几盆凉水是一定要泼的。在继续看下去之间请确定你有这些条件或能力:可以随时打开VC.net编写测试程序、装有DirectX8.1SDK、能够熟练的开发一个并不十分复杂的SDK程序,熟悉C++……好了,想来想去要求的条件就这么多了,我为了避免吓跑大批的读者还是尽量使用了较温合的词汇。还有一点要说的是,我希望你能在一个愉快的心境中阅读全文,而不是像蹲在厕所里读《量子力学》那种感觉一样,确定我们可以开始了吗?

为了从哪里开始这个问题我伤透了脑筋,想来想去毕竟这偏文章是发表在网上的,那么就从你移动鼠标开始吧,现在再打开一个浏览器,进入下面的网址:http://www.winamp.com/nsdn/winamp2x/dev/plugins/out.jhtml这里是Winamp插件开发的主页,他美其名曰NSDN,可是和MSDN相比,它除了一点原代码之外什么也没有。你现在需要做的是下载那个OUT_MINISDK,链接在:http://ftpwa.newaol.com/customize/component/nsdn/winamp2x/out_minisdk.zip,你打开这个压缩包你会看到三个文件in2.h、out.h和out_raw.c,什么,你还看到了别的文件?哦,在那是还有一些别的文件,但我们现在只需要这三个。把它们解压出来,然后打开他们,因为你在听我讲述Winamp的设计结构的时候需要对应着看看实现的代码。

当我第一次看到这个插件的封装结构时我惊呆了,原来Winamp比我想象中的更懒,它其实什么都没有做,仅仅是一个界面,调用了一些输入的接口,仅此而已。我们先看一下In_Module和Out_Module的结构:

typedef struct
{
int nVer; // 模块版本号
char *szDesc; //模块描述信息
HWND hMainWnd; // Winamp的主窗体句柄(由Winamp来填写)
HINSTANCE hDllInstance; // DLL实例句柄(由Winamp来填写)
char *szFileExt; // 扩展名过滤器,格式参见GetOpenFileName
int nIsSeekable; // 是否可索引媒体,是-你可以拖动进度条,否-反之
int UsesOutputPlug; // 是否使用输出插件?你想在这个模块里搞定一切?

// 下面都是函数指针,将被Winamp调用
void (*Config)(HWND hwndParent); // 配置对话框
void (*About)(HWND hwndParent); // 关于对话框
void (*Init)(); // 初始化
void (*Quit)(); // 退出
// szFile - 传入的文件名,szTitle - 传出的标题,nLen - 转出的时间长度,毫秒。
// 如果szFile传NULL,则返回当前播放文件的信息
void (*GetFileInfo)(char *szFile, char *szTitle, int *nLen);
int (*InfoBox)(char *szFile, HWND hwndParent); // 弹出文件信息对话框
int (*IsOurFile)(char *szFile); // 检查文件格式
int (*Play)(char *szFile); // 开始播放文件szFile,返回0正常,-1错误
void (*Pause)(); // 暂停处理
void (*UnPause)(); // 取消暂停
int (*IsPaused)(); // 是否斩停?1是暂停,0不是
void (*Stop)(); // 停止播放
int (*GetLength)(); // 取得长度,毫秒单位
int (*GetOutputTime)(); // 获取当前时间,一般调用out模块的同名函数即可
void (*SetOutputTime)(int nTime); // 索引到某一时刻
void (*SetVolume)(int volume); // 音量调节,从0 - 255
void (*SetPan)(int pan); // 左右声道平衡,从-127 - 127

//下面的函数多和AVS、可视化效果、均衡器等有关,具体咱们用不到,就暂时不讲了。
void (*SAVSAInit)(int maxlatency_in_ms, int srate);
void (*SAVSADeInit)(); // call in Stop()
void (*SAAddPCMData)(void *PCMData, int nch, int bps, int timestamp);
int (*SAGetMode)();
void (*SAAdd)(void *data, int timestamp, int csa);
void (*VSAAddPCMData)(void *PCMData, int nch, int bps, int timestamp);
int (*VSAGetMode)(int *specNch, int *waveNch);
void (*VSAAdd)(void *data, int timestamp);
void (*VSASetInfo)(int nch, int srate);
int (*dsp_isactive)();
int (*dsp_dosamples)(short int *samples, int numsamples, int bps, int nch, int srate);
void (*EQSet)(int on, char data[10], int preamp);
void (*SetInfo)(int bitrate, int srate, int stereo, int synched);

Out_Module *outMod; // 看看,Winamp终于露出马脚了吧?
} In_Module;


...全文
267 107 打赏 收藏 转发到动态 举报
写回复
用AI写文章
107 条回复
切换为时间正序
请发表友善的回复…
发表回复
CoolKin9 2003-11-24
  • 打赏
  • 举报
回复
gz X
lofly 2003-11-23
  • 打赏
  • 举报
回复
hao
Frank001 2003-09-23
  • 打赏
  • 举报
回复
路过,捧场! 嘻嘻。
ejiue 2003-09-23
  • 打赏
  • 举报
回复
强烈支持。
shines77 2003-09-21
  • 打赏
  • 举报
回复
关注
紫郢剑侠 2003-09-21
  • 打赏
  • 举报
回复
当然要收了!
kotton8848 2003-09-20
  • 打赏
  • 举报
回复
下载研究。。。。。。。。。。。。。。。。
showming 2003-09-20
  • 打赏
  • 举报
回复
我收藏了!!

谢谢!!!

88
hhlong 2003-09-20
  • 打赏
  • 举报
回复
先收藏 慢慢研究
whoever 2003-09-20
  • 打赏
  • 举报
回复
真厉害啊
fireseed 2003-09-20
  • 打赏
  • 举报
回复
回复到100结贴
thrillers 2003-09-20
  • 打赏
  • 举报
回复
收藏,慢慢看
wkoji 2003-09-20
  • 打赏
  • 举报
回复
好东西
lemon520 2003-09-20
  • 打赏
  • 举报
回复
回家漫漫看!好东西呀!
lw549 2003-09-19
  • 打赏
  • 举报
回复
n天没来c/c++版了,回来就看到这个好东西,呵呵。

支持!!
sherlerliu 2003-09-19
  • 打赏
  • 举报
回复
mark
MadLee 2003-09-19
  • 打赏
  • 举报
回复
555555555555555555555
tass 2003-09-19
  • 打赏
  • 举报
回复
up
zy6318 2003-09-18
  • 打赏
  • 举报
回复
mark!
科比布莱恩特 2003-09-18
  • 打赏
  • 举报
回复
学习ing......
加载更多回复(87)

69,396

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧