《基于armmp3播放器-毕业论文.doc》由会员分享,可在线阅读,更多相关《基于armmp3播放器-毕业论文.doc(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、济源职业技术学院 毕 业 设 计(论 文)题目基于嵌入式ARM9 Mp3播放器的实现 系别信息工程系 专业计算机应用技术 班级应用技术0803班 姓名# 学号8090342 指导教师# 日期二零一零年十二月 I目 录 摘 要IABSTRACTII第1章 绪论- 1 -1.1 开发嵌入式MP3播放系统的目的- 1 -1.2 开发嵌入式MP3播放系统的意义- 1 -第2章系统方案及嵌入式LINUX环境的搭建- 2 -2.1嵌入式系统方案的设计- 2 -2.2 嵌入式Linux环境的搭建- 2 -第3章 硬件开发平台及其操作系统的构建- 3 -3.1开发平台的硬件资源- 3 -3.2 开发平台的体系
2、结构- 5 -3.3 开发平台硬件间的工作流程- 6 -3.4 开发平台操作系统的搭建- 7 -3.4.1 U-Boot的编译- 7 -3.4.2烧写U-boot- 8 -3.4.3 内核(kernel)的编译与烧写- 8 -3.4.4 根文件系统的制作- 9 -第四章MP3播放器的制作与移植- 11 -4.1 Madplay原理- 11 -4.2移植到TX2440开发板上- 11 -4.2.1 编译文件- 11 -4.2.2移植madplay到TX2440- 12 -致 谢14参考文献15摘 要二十一世纪是信息技术的时代,信息的交流量非常大,这就会使人们在计算机面前工作的时间大大增加,因而增
3、加了人们的负担和压力。再加上飞快的生活节奏,物质生活的逐步改善,更会给人们带来身心的劳累,人们在这种身体状况下去工作,不但效率不高,而且还很容易犯错,人们对精神层面的需求逐渐增强。因此人们需要一些娱乐和消遣的软件来减轻压力,消除疲劳,让人们更好的去工作和生活。由于不满足于仅在家中欣赏电视提供的多媒体,便携的媒体播放器应运而生。本Mp3播放器就是为了实现这个目的而编写的。由于嵌入式Linux操作系统功能强大又易于移植。本次设计的是MP3播放器应用程序,就是一个基于嵌入式开发的一个媒体播放器软件,采用嵌入式ARM9经典开发平台。关键词: 嵌入式系统,Linux,Mp3播放器AbstractThe
4、twenty-first century is the era of information technology, information exchange is very large, which make people work in front of the computer time is greatly increased, thus increasing the peoples burden and pressure. Coupled with the fast pace of life, the gradual improvement of material life, but
5、 also give rise to physical and mental fatigue, physical condition in which people go to work not only inefficient, and very easy to make mistakes, people on the spiritual demand gradually. So people need some entertainment and recreation software to reduce stress, reduce fatigue, allow people to wo
6、rk and live better. Because not content to provide only watch TV at home, multimedia, portable media players have emerged.Due to the embedded Linux operating system, powerful and easy to transplant. The design of the MP3 player application, is a development based on an embedded media player software
7、, using the classical embedded ARM9 development platform.朗读显示对应的拉丁字符的拼音字典 - 查看字典详细内容翻译以下任意网站 Vogue-法国 USA Today-美国 Marmiton.org-法国 Bild.de-德国 La Informacin-西班牙 Los Angeles Times-美国 Yomuiri Online-日本 Pblico.es-西班牙 Zamalek Fans-阿拉伯语 Nord-Cinema-法国 News.de-德国 NouvelObs-法国在更多的 Google 产品中使用 Google 翻译Key
8、Words: Embedded systems, Linux, Mp3 playerIII济源职业技术学院毕业设计(论文)第1章 绪论1.1 开发嵌入式MP3播放系统的目的二十一世纪是信息技术的时代,信息的交流量非常大,这就会使人们在计算机面前工作的时间大大增加,因而增加了人们的负担和压力。再加上飞快的生活节奏,物质生活的逐步改善,更会给人们带来身心的劳累,人们在这种身体状况下去工作,不但效率不高,而且还很容易犯错,人们对精神层面的需求逐渐增强。因此人们需要一些娱乐和消遣的软件来减轻压力,消除疲劳,让人们更好的去工作和生活。由于不满足于仅在家中欣赏电视提供的多媒体,便携的媒体播放器应运而生。1
9、.2 开发嵌入式MP3播放系统的意义社会信息化、智能化、网络化高速发展的今天,嵌入式系统技术也随之提高,嵌入式Linux操作系统功能强大又易于移植,嵌入式产品渗入各个行业,如图1-1所示。嵌入式系统开发无疑成为当今最热门最有发展前途的IT领域之一。图1-1嵌入式产品渗入各个行业由于嵌入式Linux操作系统功能强大又易于移植。本次设计的是MP3播放器应用程序,就是一个基于嵌入式ARM9开发的一个媒体播放器软件,采用S3C2440经典开发平台,基于嵌入式ARM9开发的。本软件所具有的功能就可以满足一般用户的要求。本软件能支持所有MP3格式的音频文件,这些文件在网上都很容易找得到。根据个人的不同喜好
10、,可以下载自己喜欢的MP3歌曲类型进行播放。因为音乐能使人们的神经放松,消除疲累,使人们有更好的状态工作和生活。15第2章系统方案及嵌入式Linux环境的搭建2.1嵌入式系统方案的设计嵌入式系统开发环境建立在一台主机(pc)上,开发是使用主机上的交叉编译、汇编及连接工具形成在目标板上可以运行的二进制代码。然后下载到板子上运行。本设计的宿主机Linux 操作系统是建立在Linux-Red Hat 9.0虚拟机中,这样可以灵活的与我们熟悉的Windows操作系统进行数据共享,加快开发速度。之后在宿主机上设置各种环境变量,建立交叉编译调试的环境,移植到开发板。 2.2 嵌入式Linux环境的搭建嵌入
11、式Linux(Embedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量只有几十万字或几十字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux 操作系统。通常它的体积小,性能稳定,源代码免费,将大大减少开发商的成本,更具市竟争力。最基本的嵌入式Linux系统需要4个基本元素:(1)u-boot移植:包括固化在固件中的启动代码和Bootloader 两大部分,用于完成机器加电后的系统定位引导。(2)LINUX 系统内核的编译和烧写:为嵌入式应用提供一个软件环境,为应用程序完成基本的底层的资源管理工作。(3)根文件系统的制作: 操作系统中负责管理和存储文件信息的软件
12、机构。(4)为了最小嵌入式系统具有一定的实用性,还需加上硬件驱动程序及一个或几个应用进程以提供必要的应用功能支持。第3章 硬件开发平台及其操作系统的构建3.1开发平台的硬件资源我们采用的硬件开发平台为S3C2440经典开发平台。(1) 核心板S3C2440 核心板:S3C2440 ARM CPU、64M SDRAM、64M NAND FLASH,通过280Pin 精密插座与主板连接。核心板上可以配置2M 或4M 容量的Nor Flash AM29LV160/320,硬件支持从NorFlash 启动并可增加NandFlash 容量。PXA270 核心板:PXA270 XScale CPU、64M
13、 SDRAM、64M NAND FLASH,16M Nor FLASH。经典平台的核心板接口设计完全兼容博创的 PXA270 核心板和S3C2440 核心板,在软件支持下,两个核心板在经典开发平台主板上均可以实现大部分硬件功能,完全可以替换原有的2440-S 和270A 系列产品。(2) 双100M EtherNet 网卡:由两片DM9000AE 构成的双网卡,一般可只用其一。(3) 4 HOST / 1 DEVICE USB 接口:从CPU 的主USB 口扩展为4 个,由AT43301 构成USB HUB。USB 从口保持处理器本身的1 个。(4) 3 UART/IrDA: 2 个RS232
14、 串口。另有1 个RS485 串口,1 个IrDA 收发器,均从处理器的UART2 引出,由CPLD 内部逻辑进行选择。(5) 168Pin EXPORT:提供一个168Pin 扩展卡插槽,引出所有总线信号和未占用资源。(6) LCD 和VGA 接口:标配8 寸16bit 真彩屏,同时预留一个24bit 接口。扩展了VGA 接口和AV 接口,可以连接VGA 显示器。(7) TouchScr:采用2440 内部ADC 构成的控制和转换电路,或者PXA270 的AC97 CODEC 芯片的触摸屏控制器,二者根据核心板的不同由软件设置CPLD 逻辑进行选择。(8) AUDIO:CODEC 采用UDA
15、1341 和UCB1400,二者根据核心板的不同由软件设置CPLD 逻辑进行选择,具有放音、录音和线路输入等功能。功放电路由LM386 构成,板载扬声器可播放音频。(9) PS2 KEYPAD:使用ATMEGA8 单片机控制2 个PS2 接口和板载17 键小键盘。两个PS2 可接PC 键盘和鼠标。(10) LED:扩展2 个数码管和1 个8x8 点阵发光管显示器,均由CPLD 逻辑驱动。(11) POWER SUPPLY、RESET、RTC 等必须资源。经典平台主板集成了UP-LINK 调试电路,可以直接用并口电缆连接计算机进行仿真、下载等(12) ADC:板载3 个电位器,同时在板上设模拟电
16、压输入专用接口。(13 )IDE/CF 卡插座:扩展有笔记本硬盘接口和PCCARD 模式的CF 卡接口电路,使用CPLD 芯片实现PCCARD 逻辑。(14) SD 卡插座:从CPU 扩展SD 接口。(15) IC 卡。也由ATMEGA8 单片机控制。(16) 直流电机。扩展直流电机驱动电路,由PWM 控制。带有红外线测速电路。(17) CAN BUS:设置1 个CAN 口,采用MCP2510 和TJA1050 芯片构成。(18) DA 输出:采用MAX504 ,SPI 总线操作,输出模拟电压。(19) 设置了PWM DA、IIC 存储器、IO 控制LED 和可产生硬中断的按键等简单调试资源(
17、20) 可以提供配套的GPRS/GPS、FPGA、WLAN、USB2.0、RFID、指纹识别等扩展板。3.2 开发平台的体系结构S3C2440开发平台的体系结构如图1-2所示。图1-2 体系结构3.3 开发平台硬件间的工作流程S3C2440开发平台的工作流程如图1-3所示。图1-3 工作流程3.4 开发平台操作系统的搭建3.4.1 U-Boot的编译在 U-boot 的board 目录下就是其支持的开发板,数量非常多。这里我们选择2440开发板。(1) 在board 下建立开发板目录,修改Makefile 文件,添加我们自己开发板的配置信息:在 Makefile 中找到TX2410的配置信息,
18、在下面加上与TX2440 相关的信息(2) 建立开发板的头文件TX2440.h, 再把所有的文件全部删除,只留TX2440.h,用以下命令建立TX2440.h: cp include/configs/TQM866M.h include/configs/Giga_Switch.h (3) 建立TX2440 开发板的私有目录,即把TX2410目录下的所有文件拷贝到TX2440目录下,包括Makefile.(4) 设置编译工具,我们使用的是3.4.1版本,所以要在Makefile 文件里做相应的修改:将 ifeq($(ARCH),PPC)CROSS_COMPILE = powerpc-linux-修
19、改为:ifeq ($(ARCH),arm) CROSS_COMPILE = arm-linux-(5) 执行make。如果可以完成u-boot 编译的全过程,说明TX2440 移植框架成功建立。但是显然现在编译生成的这个U-boot.bin 仍然不适合我们的开发板,实际上它还是为TX2410 开发板设计的源代码。结合具体开发板修改文件,一般来说,虽然U-boot 可以支持很多开发板,但是在开发时有些文件还是要注意结合开发板的具体信息来修改,以下是需要注意修改的几个地方。SDRAM 的设置:在board/TX2440/lowlevel_init.S中,检查#define B6_BWSCON (D
20、W32) 位宽为32根据HCLK设置SDRAM的刷新参数,主要是REFCNT寄存器。开发板HCLK为100M将 #define REFCNT 0x1113 改为#define REFCNT 0x4f4,将FCLK设为400MHz,分频比为FCLK:HCLK:PCLK=1:4:8。修改board/TX2440/TX2440.c中的board_init函数,在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量,修改get_PLLCLK函数.支持NAND Flash:首先在配置文件include/configs/TX2440.h的宏CONFIG_COMMANDS
21、中增加CFG_CMD_NAN,再在include/configs/TX2440.h的最后面增加3个宏。其次board_nand_init函数定义, board_nand_init需要自己编写,在cpu/arm920t/s3c24x0下新建nand_flash.c编写之前,需要针对S3C2440 NAND Flash定义一些数据结构和函数,在include/s3c24x0.h中增加S3C2440_NAND数据结构,定义2440的函数:static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void) return (S3C2440_NAND
22、 * const)S3C2410_NAND_BASE; 在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的。修改cpu/arm920t/s3c24x0/Makefile: COBJS = 加上一项nand_flash.o支持网卡芯片DM9000:在driver下,有网卡驱动DM9000x.c 和 DM9000x.h,网卡芯片DM9000接在BANK4,位宽16。在include/configs/TX2440.h中设置网卡的基地址,在drivers目录下,只留nand、na
23、nd_legacy、dm9000x.c、dm9000x.h和Makefile文件,其他文件全部删除,修改Makefile文件,将顶层目录下没用的lib_x 文件夹删除,只留lib_arm和lib_generic文件。然后,设置一下Linux启动参数就可以了。运行执行make TX2440_config make all 生成生成支持NAND Flash和网卡芯片DM9000的u-boot.bin文件。3.4.2烧写U-boot将编译后生成的u-boot.bin文件烧入NAND Flash中运行。3.4.3 内核(kernel)的编译与烧写我们在网上下载内核源码并解压源码,进入目录linux-2
24、.6.31,修改Makefile文件:指定系统硬件架构、交叉编译器、修改时钟和修改机器码(根据实际情况,这个要和bootloader的匹配)。接下来配置文件,在配置菜单中选择这一项:“Load an Alternate Configuation File”输入2440的默认配置: arch/arm/configs/s3c2410_defconfig配置完后,回到主菜单,选择这一项“save an Altenate configuration File” 输入要保存的配置文件名称:.config(默认),编译内核:#make zlmage。编译后,会在arch/arm/boot下生成zimage
25、内核镜像文件,把zimage镜像烧进nandflash跑一下,检查是否正常打印出信息。支持NandFlas h:修改arch/arm/plat-s3c24xx/common-smdk.c文件,这里我们要使nandflash同时支持64M,256M或更高容量。 接下来修改Nand读写匹配时间,这个改不改应该问题都不大,是根据Nand的读写特性相关的,也就是查芯片资料得到的值,每种Nand的值都不一样,修改Kconfig文件,在配置时选择NAND类型,修改driver/mtd/nand/Kconfig, 配置内核,支持NandFlash 。启动时输出: S3C24XX NAND Driver, (
26、c) 2004 Simtec Electronics s3c24xx-nand s3c2440-nand: Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns s3c24xx-nand s3c2440-nand: NAND hardware ECC NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit) Scanning device for bad blocks Creating 3 MTD partitions on NAND 256MiB 3,3
27、V 8-bit: 0x000000000000-0x000000100000 : boot 0x000000120000-0x000000520000 : kernel 0x000000520000-0x000010000000 : yaffs2 支持yaffs2文件系统:下载yaffs2源码并解压,进入yaffs2目录, 给内核打上yaffs2文件系统的补丁,这时内核源码fs目录下多了一个yaffs2目录,同时Makefile文件和Kconfig文件也增加了yaffs2的配置和编译条件。 配置对yaffs2支持这部分配置比较多,可根据自己的需要进行配置,把不用的文件系统都去掉就可以了。 支持
28、LCD:内核里已经有很完善的LCD驱动了,只要根据所用的LCD进行简单的修改,在内核源码drivers/video/s3c2410fb.c是LCD驱动的源码,首先要设置LCD的时钟频率, 在s3c2410fb_display结构体中加入了setclkval变量,我们需要在结构体原型中加入这个变量,在arch/arm/mach-s3c2410/include/mach/fb.h中第40行加入:unsigned setclkval; /*clkval*/ 修改LCD参数配置并屏蔽掉第150行的语句,配置内核,支持LCD。支持声卡:(1)在网上下了一个uda1341的驱动文件s3c2440-uda1
29、341.c稍作修改后,把它放到linux2.6.14/sound/oss/目录下。(2) 修改oss目录下的kconfig文件,以便在我们下面配置内核的时候可以选中它。(3) 修改Makefile文件,修改增加内存映射,以使内核知道该虚拟地址可用,而且对应的物理地址是我们的声卡。修改/arch/arm/mach-s3c2410/smdk-s3c2410。(4)配置完毕后,在make menuconfig后,选择driver-sound-oss-uda1341 ,即选择对声卡的支持。3.4.4 根文件系统的制作创建根文件系统目录:/bin,/etc,/dev,/home,/lib,/mnt,/p
30、ot,/proc,/root,/sbin, /sys,/tmp,/usr,/var 建一个名为root_2.6.31,在文件夹下创建以上目录。编译busybox,修改 Makefile 文件,执行#make menuconfig进行配置busybox,配置选项大部分都是保持默认的。然后执行 #make make install就会在上一级目录下生成rootfs文件夹,里包含几个文件/bin/sbin/usr/linuxrc把这些文件全部复制到刚建好的root_2.6.31目录下,用命令 #cp rf * ./root_2.6.31实现。接下来开始制作文件系统,在 dev目录下,创建设备节点,进
31、入etc目录,添加文件:拷贝Busbox-1.15.2/examples/bootfloopy/etc/*和/etc/passwd,/etc/group,/etx/shadow到当前目录下。修改inittab、fstab 、init.d/rcS和profile文件内容。新建sysconfig 文件夹,在里面新建HOSTNAME文件,内容为:TX2440A 进入lib目录,然后拷贝交叉编译的库文件到lib目录下,文件系统的框架已经做好。把制作好的文件系统烧写进Nandflash中的yaffs2镜像文件。我们使用编译好的mkyaffs2image工具,把解压出来的可执行文件复制到/usr/bin目
32、录下。最后制作文件系统镜像,root_2.6.31bin就是yaffs2文件系统镜像,要先修改它的权限,否则该文件无法被复制,把root_2.6.31.bin下载到nandflash中的文件系统分区中如果文件系统能正常挂载,终端会打印出:Please press Enter to activate this console.Processing/etc/profile Done 第四章 MP3播放器的制作与移植4.1 Madplay原理madplay 是linux上的一个开源mp3播放器,是一个高精度MPEG音频解码库。支持MPEG-1 Layer I, Layer II 和 LayerIII
33、(也就是 MP3)标准,它利用libmad库进行mp3软解码。libmad提供 24-bit 的 PCM 输出,完全定点计算,使用 libmad 提供的一系列 API,就可以非常简单地实现 MP3 数据解码工作。在 libmad 的源代码文件目录下的 mad.h 文件中,可以看到绝大部分该库的数据结构和 API 等。madplay基于libmad还做了一些扩展功能,比如将mp3格式转成别的音频格式如 wav等,又集成了libid3tag库进行mp3信息显示,非常适合在没有浮点支持的嵌入式硬件平台上使用。libmad主要数据结构如表4-1所示:表4-1 libmad主要数据结构主要数据结构作用s
34、truct mad_stream存放解码前的Bitstream数据struct mad_synth存放解码合成滤波后的PCM数据struct mad_pcm定义了音频的采样率,声道个数和PCM采样数据,用来初始化音频struct mad_frame记录MPEG帧解码后PCM数据的数据结构,其中的mad_Header用来记录MPEG帧的基本信息,比如MPEG层数、声道模式、流比特率、采样比特率。声道模式包括单声道、双声道、联合立体混音道以及一般立体声。4.2移植到TX2440开发板上4.2.1 编译文件 我们需要在home下先建立两个文件夹,一个存放源码,一个存放安装文件,即madplay-sr
35、c和madplay 文件夹。依次解压四个源码包到madplay-src目录下。 (1) 编译zlib-1.1.4使用命令./configure -prefix=/home/madplay进入madplay目录。配置configure 文件并修改Makefile 文件中的内容: CC=arm-linux-gcc AR=arm-linux-ar rc RANLIB=arm-linux-ranlib #make #make install (2) 编译libid3tag#./configure CC=arm-linux-gcc -host=arm-linux -prefix=/home/madpla
36、y CPPFLAGS=-I/home/madplay/include LDFLAGS=-L/home/madplay/lib#make #make install (3) 编译libmad #./configure CC=arm-linux-gcc -host=arm-linux -prefix=/home/madplay CPPFLAGS=-I/home/madplay/include LDFLAGS=-L/home/madplay/lib #make #make install (4) 编译madplay #./configure CC=arm-linux-gcc -host=arm-li
37、nux -prefix=/home/madplay CPPFLAGS=-I/home/madplay/include LDFLAGS=-L/home/madplay/lib #make (5)静态编译以上是用动态编译的方法,程序运行时需依赖动态库文件。也可以采用静态编译的方法,将静态库编译到程序中,运行时不需要动态库文件。在配置libid3tag、libmad、madplay时,加上参数“disable-shared -enable-static”即可静态编译madplay 。编译完成后只需将madplay复制到根文件系统/usr/bin目录下,不需要复制动态库。4.2.2移植madplay到
38、TX2440编译完成后在madplay-0.15.2b目录下生成madplay的可执行文件,需要的动态库有libmad.so.0、libid3tag.so.0、libm.so.6和libc.so.6四个库。查看/usr/lib目录中有没有 libm.so.6和libc.so.6库文件,如果没有,则将其拷贝到/usr/lib目录下。libmad.so.0和libid3tag.so.0文件是在/madplay/lib/下生成的,也需要拷贝到/usr/lib下。 最后,将madplay也复制到根文件系统/usr/bin目录下,找一个MP3文件也放在某一目录下,在开发板上执行madplay程序#mad
39、play XXX.mp3 MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al s3c2440-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66 Title: XX Artist: XXX Album: XXXX Track: XXComment: XXXXXXXXX s3c2440-uda1341-superlp: audio_set_dsp_speed:44100 prescaler:66 致 谢 这次毕业设计得到了很多老师、
40、同学和同事的帮助。其中我的导师 陈平老师对我的关心和支持尤为重要,每次遇到难题,我最先做的就是向陈老师寻求帮助,而陈老师每次不管忙或闲,总会抽空来找我面谈,然后一起商量解决的办法。 另外,感谢校方给予我这样一次机会,能够独立地完成一个课题,并在这个过程当中,给予我们各种方便,使我们在即将离校的最后一段时间里,能够更多学习一些实践应用知识,增强了我们实践操作和动手应用能力,提高了独立思考的能力。 最后再一次对我的母校表示感谢,再一次感谢所有在这次毕业设计中给予过我帮助的人,同时也感谢学院为我提供良好的做毕业设计的环境。以及在设计中被我引用或参考的论著的作者。感谢在整个毕业设计期间和我密切合作的同
41、学,和曾经在各个方面给予过我帮助的伙伴们,在大学生活即将结束的最后的日子里,我们再一次演绎了团结合作的童话,把一个庞大的,从来没有上手的课题,圆满地完成了。 参考文献1陈亮,裴海龙,伍越. 基于Linux系统的USB摄像头视频播放实现J. 现代电子技术,2008(24):93-98.2罗贤全,尚朝轩,高勤.开发Linux嵌入式应用程序. 微计算机信息J(测控自动化),2004,20(6):67-68.3潘影波,王健,Rusty Lynch. MIDLinux新一代播放器的设计与实现J. 计算机技术与发展,2009,19(2):202-204.4杜春雷arm体系结构与编程M北京:清华大学出版社2
42、0045W.Richard Stevens, Stephen A. Rago. Unix Programming in the UNIX Environment 2nd editionM.译者(尤晋元, 张亚英, 戚正伟),译.北京:人民邮电出版社,2006:47-68.6Wim Taymans, Steve Baker, Andy Wingo, Ronald S. Bultje, and Stefan Kost. GStreamer Application Development Manual (0.10.21.3)M. Open Publication License. 2009.7Jon Masters, Richard Blum. Professional Linux ProgrammingM. Wiley Publishing, Inc. 2007:319-340.