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, &param.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, &param.rva, NULL);;将mp参数传入到para中。

如何实现播放控制:即如何实现热键控制?

按键逻辑控制在term.c中实现。

get_key 读按键

term_handle_input按键处理

term_handle_key  按键播放控制逻辑

term_control(mh,ao);

main函数中的大循环

Mpg123源代码详解的更多相关文章

  1. 结合源代码详解android消息模型

    Handler是整个消息系统的核心,是Handler向MessageQueue发送的Message,最后Looper也是把消息通知给Handler,所以就从Handler讲起. 一.Handler H ...

  2. wordcount源代码详解

    package wordcount; import java.io.IOException; import java.util.StringTokenizer; import org.apache.h ...

  3. java Object类源代码详解 及native (转自 http://blog.csdn.net/sjw890821sjw/article/details/8058843)

    package java.lang; public class Object { /* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用.*/ private static na ...

  4. 【算法】C++用链表实现一个箱子排序附源代码详解

    01 箱子排序 1.1 什么是分配排序? 分配排序的基本思想:排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序.它们的时间复杂度可达到线性阶:O ...

  5. 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

    C++编写贪吃蛇小游戏快速入门 刚学完C++.一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能.希望大家Enjoy It. 效果图示 AI模式演示 imageimage 整 ...

  6. 详解如何在RVIZ中用Marker显示机器人运动路径

    写在前面 最近有道作业题需要将机器人的历史路径显示出来,但是网上很多相关的教程都是搬运了官网的链接,并没有详细的操作流程...因此我又花费了很多时间去ros官网上学习marker的用法,学习怎么写pu ...

  7. 转载:C/C++源代码到可执行程序的过程详解

    C/C++源代码到可执行程序的过程详解 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格 ...

  8. Java学习-007-Log4J 日志记录配置文件详解及实例源代码

    此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:20 ...

  9. 《TensorFlow学习指南深度学习系统构建详解》英文PDF+源代码+部分中文PDF

    主要介绍如何使用 TensorFlow 框架进行深度学习系统的构建.涉及卷积神经网络.循环神经网络等核心的技术,并介绍了用于图像数据和文本序列数据的模型.给出了分布式深度学习系统在TensorFlow ...

随机推荐

  1. 使用C# (.NET Core) 实现状态设计模式 (State Pattern)

    本文的概念性内容来自深入浅出设计模式一书 项目需求 这是一个糖果机的需求图. 它有四种状态, 分别是图中的四个圆圈: No Quarter: 无硬币 Has Quater 有硬币 Gumball So ...

  2. Chinese-Text-Classification:Tensorflow CNN 模型实现的中文文本分类器[不分词版]

    从现在的结果来看,分词的版本准确率稍微高一点. 训练过程: 模型评估: 实验三,准备换一下数据集,用这里的数据集来跑这个模型:https://zhuanlan.zhihu.com/p/30736422 ...

  3. WPF ListBox/ListView/DataGrid 虚拟化时的滚动方式

    ListBox的滚动方式 分为像素滚动和列表项滚动 通过ListBox的附加属性ScrollViewer.CanContentScroll来设置.因此ListBox的默认模板中,含有ScrollVie ...

  4. WPF 窗口居中 & 变更触发机制

    窗口居中 & 变更触发机制 解决: 1.单实例窗口,窗口每次隐藏后再显示时,位置居中显示 2.多屏幕下单实例窗口,当父窗口移动到其它屏幕时,单实例窗口再次弹出时,位置才更新到父窗口屏幕. 3. ...

  5. JMeter如何和Charles进行接口测试

    什么是接口测试,接口测试到底如何开展,我相信任何一个软件测试人员都会有这样的疑问, 这里我以接口测试自动化平台的登录接口进行讲解. 一.什么是接口测试? 接口测试是测试系统组件间接口的一种测试.接口测 ...

  6. git 学习笔记(常用命令)

    1.新建一个文件,如果没有使用git add 命令将它提交到暂存区,那么这个文件就还没有被跟踪. 2.通过配置.gitignore文件可以指定要忽略的文件,被忽略的文件夹是不会被提交到暂存区的.所以这 ...

  7. delphi 线程教学第五节:多个线程同时执行相同的任务

    第五节:多个线程同时执行相同的任务   1.锁   设,有一个房间 X ,X为全局变量,它有两个函数  X.Lock 与 X.UnLock; 有如下代码:   X.Lock;      访问资源 P; ...

  8. ActionContext.getContext()用法

    为了避免与Servlet API耦合在一起,方便Action类做单元测试,Struts 2对HttpServletRequest.HttpSession和ServletContext进行了封装,构造了 ...

  9. Zookeeper动态更新服务器列表

    -------------------------------------------------------------------------------------- [版权申明:本文系作者原创 ...

  10. java 随机数高效生成

    分享牛,分享牛原创.近期去面试经常被问到java如何生产随机数,以及生成很大的字符串保证不能重复,还要考虑性能,之前本人面试别人的时候,可能不会问这个问题.既然这个java随机数问题经常被问到,那咱们 ...