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函数中的大循环
Mpg123源代码详解的更多相关文章
- 结合源代码详解android消息模型
Handler是整个消息系统的核心,是Handler向MessageQueue发送的Message,最后Looper也是把消息通知给Handler,所以就从Handler讲起. 一.Handler H ...
- wordcount源代码详解
package wordcount; import java.io.IOException; import java.util.StringTokenizer; import org.apache.h ...
- java Object类源代码详解 及native (转自 http://blog.csdn.net/sjw890821sjw/article/details/8058843)
package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static na ...
- 【算法】C++用链表实现一个箱子排序附源代码详解
01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O ...
- 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...
- 详解如何在RVIZ中用Marker显示机器人运动路径
写在前面 最近有道作业题需要将机器人的历史路径显示出来,但是网上很多相关的教程都是搬运了官网的链接,并没有详细的操作流程...因此我又花费了很多时间去ros官网上学习marker的用法,学习怎么写pu ...
- 转载:C/C++源代码到可执行程序的过程详解
C/C++源代码到可执行程序的过程详解 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格 ...
- Java学习-007-Log4J 日志记录配置文件详解及实例源代码
此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...
- 《TensorFlow学习指南深度学习系统构建详解》英文PDF+源代码+部分中文PDF
主要介绍如何使用 TensorFlow 框架进行深度学习系统的构建.涉及卷积神经网络.循环神经网络等核心的技术,并介绍了用于图像数据和文本序列数据的模型.给出了分布式深度学习系统在TensorFlow ...
随机推荐
- Thinkphp中的U函数(Thinkphp3.2.3版本)
U函数的作用是根据当前的URL设置生成对应的URL地址,使用U函数可以确保项目在移植过程中不受环境的影响. U方法的定义规则如下(方括号内参数根据实际应用决定): U('地址表达式',['参数'],[ ...
- P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解
1.内容概述 P2P即点对点通信,或称为对等联网,与传统的服务器客户端模式(如下图"P2P结构模型"所示)有着明显的区别,在即时通讯方案中应用广泛(比如IM应用中的实时音视频通信. ...
- Delphi7数据库编程之TDataSet(转)
TDataSet类由TBDEDataSet(BDE组件).TCustomADODataSet(ADO组件).TIBCustomDataSet(InterBase组件).TCustomSQLDataSe ...
- Linux常用命令大全(归类)
最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...
- ACM Sudoku
Sudoku是一个非常简单的任务. 具有9行9列的方形表被划分为9个较小的正方形3x3,如图所示. 在一些单元格中写入从1到9的十进制数字.其他单元格为空. 目标是填充空单元格,其中十进制数字从1到9 ...
- django之允许外部机器访问
开开启django时,使用0.0.0.0:xxxx,作为ip和端口例如: python3 manage.py runserver 0.0.0.0:9000 然后在settings里修改ALLOWED_ ...
- DuKBitmapImages 图片压缩处理技术
Android图片压缩上传系列 *压缩中的问题: --图片压缩上如果存在问题,势必造成消耗大量的流量,下载图片的速度慢等影响产品性能,那么如何解决?请看下面: 压缩图片一共多少张?一起压缩?分开压缩? ...
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法 ...
- XMPP 测试工具
XMPP 测试工具(金庆的专栏 2016.10)XMPP的客户端Pidgin有个Debug Window, 可以显示所有发送和接收的xml节.但是无法发送任意的自定义节.<XMPP高级编程-使用 ...
- 为什么函数式编程可以没有while?
以前想不通,今天在写代码时不知怎么的,偶然就发现了答案.. 比如说把某个字符串s中所有"00"及更长的'00'统统换为'0'.最后结果中不能包含'00'. 00001100--&g ...