Mpg123源代码详解
Mpg123与libmad一样,支持mpeg1,2,2.5音频解码。目前来看mpg123比libmad支持了网络播放功能。而且libmad基本上开源社区在2005年左右,基本停止更新,mpg123至今还在持续更新源代码。
1. mpg123是如何支持某种音频驱动的?
Mpg123跟liamad一样,向下也支持oss,alsa,win32等驱动,是如何支持的。Libmad是修改config文件的宏来完成,而mpg123是修改makefile或者configure来完成
ALSA_LIBS =-lasound,同时也要修改配置文件.config.因为此makefile只变异一个驱动
默认只是 alsa驱动。
2. main函数框架
mpg123_init();初化mpeg123相关资源
cleanup_mpg123 =TRUE; 已经初始化后的标志置位
mpg123_new_pars(&result)动态申请一个结构体,并初始化结构体属性参数
mpg123_getpar(mp,MPG123_RVA, ¶m.rva, NULL);
将预设的结构体参数,读取到para这个结构体参数中来
getlopt(argc,argv, opts) 解析main函数传入的参数
如果param.list_cpu为真的话
mpg123_decoders(); 列出解码器资源
解码完毕mpg123_delete_pars(mp);释放资源
如果param.test_cpu 存在
mpg123_supported_decoders() 测试cpu属性
解码完毕mpg123_delete_pars(mp);释放资源
正常情况下不会走到这两个流程
init_output(&ao)初始化输出模块,觉得是输出到哪个驱动还是转码输出
have_output =TRUE; 设置初始化输出完毕标准
httpdata_init(&htd);初始化网络播放参数
mpg123_par()将para结构体数据在此写入到mp结构体中来
设置各种参数
mh =mpg123_parnew(mp, param.cpu, &result);
将mp参数读到fr全局参数中,供以后的解码器使用
mpg123_delete_pars(mp)mp参数现在可以释放了
dump_open()目前还没理解是什么意思
audio_capabilities(ao,mh); 初始化音频输出
load_equalizer(mh);载入音频均衡算法脚本
sp.sched_priority= sched_get_priority_min(SCHED_FIFO);
if (sched_setscheduler(0, SCHED_RR, &sp) == -1)
设置实时参数,提高该进程的优先级
prepare_playlist()初始化播放列表
如果需要http://则要打开socket,连接服务器端
初始化终端,初始化遥控操作
进入大循环解码播放,每获取一个节目
{
open_track(fname) 打开解码器播放打开某个文件和网络读流
term_control 初始化终端设置
mpg123_scan(mh); 完成seek定位
mpg123_seek_frame 初始化seek
play_frame() 开启解码进程解码
每解码一次进行一次按键处理
}
播放完毕所有的节目,释放资源
解码过程:
play_frame---mpg123_decode_frame---decode_the_frame(mh);
如何显示时间状态:
-v 可以将时间显示出来。实现代码以下:
Main函数中-------print_stat函数
(每解一buffer数据打印一次)
Parse.c 关于MP3头的解析。
如何送数据?
1. 而在config.h 中#define DEFAULT_OUTPUT_MODULE"alsa"
结构体一定义,就默认为
structparameter param = {
FALSE , /* aggressiv */
FALSE , /* shuffle */
FALSE , / * remote */
FALSE , /*remote to stderr */
DECODE_AUDIO , /* writesamples to audio device */
FALSE , /* silent operation*/
FALSE , /* xterm title on/off */
0 , /* second level buffer size */
0 , /* verbose level */
DEFAULT_OUTPUT_MODULE,
2. moudule_name 传入init_output---open_module(legad_audio.c)----
mpg123_output_module_info---alsa驱动
3. 每解码完毕一个单元,就flush_output
4. flush_output 通过ao->write 写入底层 底层通过映射到不同的驱动
structparameter param 这个结构体很重要,一定义就有个默认值,后面可以通过main函数参数去修改该默认值或者mpg123_getpar(mp,MPG123_RVA, ¶m.rva, NULL);;将mp参数传入到para中。
如何实现播放控制:即如何实现热键控制?
按键逻辑控制在term.c中实现。
get_key 读按键
term_handle_input按键处理
term_handle_key 按键播放控制逻辑
term_control(mh,ao);
main函数中的大循环