硬件环境:
imx6ul 自制电路板 本次中使用到了cs4344和pt12913(这两个没啥说的一个i2s,一个i2c但是蛮好用的)。
软件:
linux 3.14.10(好像是,记不清了)
libmad 0.15.1b
本文使用的是异步模式!
同步模式不会fork
最大的感觉是这玩意蛮方便,但是使用过程中还是被他坑了一波(其实说到底还是自己太水)。
在这里吐槽一下我司,项目经理和产品实在是比较无力,没啥说的。
最差的端午。2天加班 1天装修。手都肿了,还借了别人2w块钱。
言归正传:
首先编译,没啥好说的
./configure arch=xxxxx prefix=xxxx
make
make install
得到libmad和头文件mad.h
加入工程。
在源代码中有比较简单的示例程序。
大概是设置一下 input output的函数做回调。然后run就可以开始了。
but 我一开始以为只是api直接调用就好,用了第一反应这东西应该是不用我自己开线程。库自身会开一个线程然后调用我的程序借口,不过还是too young too simple。到最后发现是直接开了一个子进程。我调试的时候都怀疑人生了,怎么调试怎么不对。最后才搞明白。
搞明白之后就有方向了。单单是按照他的例子写一个不难,就是要嵌入到自己的程序。考虑到他会自己起一个进程所以开销比较大。我选择直接让他做常驻的进程,不要再父子进程了。
那剩下的就是一个 共享内存和进程间同步的东西
使用了shm和mutex,再libmad的进程中 开了两片区域
struct share
{
pthread_mutex_t smutex;
uint8_t buff[xxxx];
uint32_t index;
uint32_t length;
};
类型就是这个类型。一个做要解码的数据的缓存区。一个做解完的数据的缓存区。但是要注意数据的同步,不然也够喝一壶的。
其他还有个问题就是,我们不知道输入的mp3文件的大小,解码完了你也不知道会变多大。一开始开buff的时候不好开。我是直接检测文件大小然后开这么大的缓存区(其实可以开小一点,然后多次读取)做未解码数据的存放,做了个乒乓。下面解码完成之后的输出,直接使用的多个buff循环的套路。两个队列(忙,闲)不断进出。然后丢给下面alsa通过cs4344输出。
这次主要还是学到了一些知识,共享内存,数据同步等等的。没有白做。
不高兴写了再说吧