前天晚上开始把 [XMMS2] 的 Monkey's Audio 插件更正到最新的 [Transform](xform) 架构上去。对于 XMMS2 来讲,这是一个非常大的变动,原来有 Transport,Decoder 等,现在这些都没有了,连同 Effect 一起以及他们的插件都统一为 xform 和 xform 的插件。这样在播放一个文件的时候,需要把这一系列的 xform 和最后的输出(ALSA 或者 OSS 或者其他的输出插件)连接起来,完成读取/解码/效果/播放的过程。一个这样连起来的链会是这样:URI:file<-magic<-MAC Decoder<-OUTPUT,在解码器之后,输出之前可能会再一些音效的 xform。每个 xform 都具有一个输入 MIME 和输出 MIME,前一个的输出 MIME 要和后一个的输入 MIME 一致。现在的结构比去年要好上很多,要加一个插件很方便。
由于 Monkey's Audio SDK 本身设计上的限制,它自己读取文件,最低要求也要求外部提供 IO 接口,调用 READ/SEEK/POS/SIZE 等功能,也就是说它本身不是针对 Buffer 的,而是针对 FD 的,这样就带来了很多的限制。一般一个成熟的多媒体框架都会提供这种类似于 buffer chain 的结构,把 Transport 层和 Decode 层给分开。解码器的功能就是针对一个缓冲区中的数据进行解码,当然自己也有一个缓冲区,保存一些未能成功解码的部分。这样就可以不依赖于真正的数据是来自于网络还是来自于文件,还是其他来源,只要专心解码就好。对于这种情况 MAC SDK 就必须适应这种框架,自己编写一个 Adapater,把下面的 Transport 层封装一下,供其使用。这种方法在大多数情况是可以的,有些情形下就难以解决。
对于 XMMS2 来讲,xform 的接口主要有四个 Init/Read/Seek/Destroy,没有 POS/SIZE 功能。所以当时就卡在这里,没有想到解决方法。然后昨天在仔细阅读各种插件的代码时候,在 musepack.c 中找到了解决方法,Seek 一般会有三种模式,BEGIN, CUR, END,那么要得到当前的位置,多数情况下返回 Seek 到的位置,那么要得到当前位置,可以使用 Seek(Distance, CUR)。而 Size 是直接读取 Medialib 中的 XMMS_MEDIALIB_ENTRY_PROPERTY_SIZE。虽说有些丑,但用起来还是没有问题的。昨天晚上稍微改了改就直接可以工作了,调试都没调试,真是不可思议,很久都没有碰到这种感觉了。
然后就在 #xmms2 跟 tru 聊了会,说只要改改编码风格就可以提交。
我记得当初在准备写 [xine] 的插件的时候,就发现 Monkey's Audio SDK 不能符合要求,再抽空看看,说不定采用什么方法能绕一下。不过这毕竟不是长久之计,最好的办法是能够让其 SDK 能够直接从一段缓冲区里面读取数据,并解码。这个对其修改可能比较大,涉及到的东西比较多。




正式接受了
Monkey's Aduio plugin for XMMS 正式接受了,现在在 Tru 的[个人 GIT] 中,估计不久会进入开发版的分支。
我看错了?
昨天晚上我看 Git 的时候,上次更新还是几天前的,现在一看这几天的更新都进去了。难道是缓存?已经进入 -devel 分支了。
Post new comment