2 多功能掌上媒体播放器系统的软件设计
系统设计和软件设计是本系统的难点。系统软件设计的总体框架如图3所示。
2.1 嵌入式Linux操纵系统
Linux最初由Linux Torvalds编写,后来在网络上被众多的Linux兴趣者加以修改和维护,具有内核高效不乱、开源、可移植性强、内核可定制可裁剪、多线程多任务等特点,因此选择其作为本媒体播放器系统的操纵系统。图1多功能掌上多媒体系统的硬件设计图2多功能掌上多媒体系统的视频录制系统的框图图3多功能掌上多媒体系统的软件设计总体框架
首先定制裁剪并移植了Linux2.6的内核,然后为使各硬件能正常工作编写了键盘驱动、LCD驱动、触摸屏驱动、音频驱动、USB驱动等驱动。多功能掌上多媒体系统的正常工作首先是进入ARM-Linux操纵系统,然后加载各个硬件的驱动程序并初始化各外围设备,接着就进入基于QT/Embedded库的Qtopia桌面系统编写的GUI图形界面程序的播放器,最后选择要进行的操纵。
对于Linux内核的移植首先要移植bootloader,系统采用的是VIVI,其功能包括:分区治理、参数治理、启动Linux操纵系统、文件系统治理、支持网络、通过串口下载程序到Flash或者RAM等。建立嵌入式开发环境,使得能够交叉编译源代码,对VIVI的源代码进行交叉编译,天生能在ARM Linux上运行的bin文件,通过
开发板的JTA谋生将其烧写到开发板的Flash中。
对内核的移植首先要对内核进行修改MAKEFILE文件指定编译器以及目标平台,然后配置内核,交叉编译天生内核镜像,通过UART口(串口)下载到开发板上。移植相应的文件系统。文件系统中的文件是数据的集合,不仅包含着文件中的数据,而且还有文件系统的结构,所有Linux用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。在设计过程中把文件系统设置为可读写,这样操纵性强一些,在投入到出产中的时候应该把文件系统设置为只读的,这样整个掌上多功能媒体播放器的操纵系统就加载好了。
2.2 驱动程序的设计
本系统共涉及到键盘驱动、触摸屏驱动、LCD驱动、音频驱动和USB驱动等驱动。由于多媒体功能是本系统的重点,所以播放器部门很重要,这里主要先容音频驱动的编写。
目前Linux下常用的音频驱动程序主要有两种类型:OSS(Open Sound System) 和ALSA。最早泛起的Linux上的编程接口是OSS,它由一套完整的内核驱动程序模块组成,可为大多数音频芯片驱动提供同一的编程接口。在嵌入式系统中,对于特定的处理器(如本系统采用的S3C2410),可以按照OSS接口尺度来编写音频驱动程序,以知足Linux上的应用程序。OSS接口已经足够简朴,需要完成的主要的工作就是对音频设备(本系统采用的是Philips的UDA1314TS)的read,write和ioctl等操纵。
系统音频驱动主要是对UDA1314TS进行驱动编写,包括对UDA1314TS的L3接口的控制。首先初始化I/O和UDA1 314芯片,然后申请两个DMA(Direct Memory Access)通道用于音频传输(音频数据的发送和接收都通过一个先入先出的队列FIFO,但是只靠FIFO要保证音频的连续播放是很难题的,所以申请DMA通道来解决此题目)。OSS尺度中由两个最基本的音频设备:混音器(Mixer)和数字信号处理器(DSP)又称编解码器,其中混音器主要用来控制输入输出音量的大小,只有open和release以及几个接管OSS尺度的iotcl。而DSF设备驱动的方法比较复杂,主要包括open、release、read、write、poll、ioctl。其中主要在write和read方法中实现音频的播放和录音。以播放音频来说明DSP驱动程序的编写,对应了驱动程序中的open和write方法,它们利用DMA实现了音频的播放。在open中,首先判定设备打开的方法:读取、写入和读/写,分别对应音频的录音、播放以及录音同时回放,然后申请两个与音频DMA缓冲区相关的,在初始化DMA时要用到,最后程序可以根据设备打开模式的初始化S3C2410的工作模式,并清空所需的DMA缓冲区(在write方法被调用时创建)的数据结构,把它留给缓冲区创建。在这里,由于使用了两个DMA音频数据传输,DMA缓冲的建立发生在第一次调用wri te将音频数据传送到设备,而OSS驱动的调用者通常要在打开音频设备时就期望获得DMA缓冲的信息,然而由于缓冲尚未建立,会使得缓冲大小为0这个结果,解决办法时在两个与音频DMA缓冲区相关的程序部门一定不能少了以下代码:
if(!output_stream.buffer&&audio_setup_buf(&out stream))
return-ENOMEM;
在Write方法中首先判定设备文件打开的方式,具有write特性打开的设备才可以写入,然后判定是否没有建立DMA缓冲区,若没有,则通过audio_setup_buf()来创建,定义一个结构体(audio_stream_t)的指针如下:
2.3 Gu l程序的设计与播放器的实现
2.3.1 GUI程序的设计和实现
播放器的图形界面在Qtopia视窗环境下运行,采用Qt/Embedded2.3.7作为底层图形库,用于天生用户界面。QT是一个跨平台的c++图形用户界面库,Qt/Embedded是面向嵌入式系统的版本,其最大的特点就是使信号和槽用于对象间的通讯,Qt的窗口部件有多个预定义的信号,槽是一个可以被调用处理特定信号的函数。Qt的窗口部件有多个预定义的槽,当一个特定事件发生的时候,一个信号被发射,对应感爱好的槽就会调用对应的相应函数。播放器界面主要包括主界面窗口、文件操纵窗口、播放列表窗口。主界面窗口有一个显示屏和一些控制按钮,包括播放、暂停、快进、快退、下一首、上一首、音量调整以及播放进度条和播放时间显示。文件操纵窗口可以使用户选择要播放的文件。播放列表用来播放最近播放的五个多媒体文件。
2.3.2 播放器的实现
Linux下的播放器Mplayer是Linux上最优秀的多媒体播放器,它能够使用众多的编解码器,支持多种输出设备。可以播放市道市情上几乎所有的音视频格局。本系统选择其作为播放器,对其进行优化和移植。进行的优化主要有:
(1)Mplayer在系统上运行的时候颜色会有偏差,因此编程校正Mplayer的色彩;
(2)Mplayer正常模式不能在FramBuffer的中间显示,带-fs的全屏参数播放后,只能将播放位置移到中间,并不放大,修改播放显示位置,让它和Nplayer图形界面的调用相符合;
(3)编程实现播放时对键盘事件正常化;
(4)Mplayer采用的自带的mp3lib浮点音频解码库的解码效率很低,在播放音频时会很卡,通过采用使用定点运算的libmad音频解码库替换原来的mp3lib库进行音频解码;
(5)使用Mplayer的-input选项,通过FIFO从GUI向后端程序传递控制信息。通过优化后,对Mplayer交叉编译,移植到系统上可以流畅地播放mp3等音频文件以及mpeg-1、mpeg-2、avi等视频格局。
2.4 影音录制
影音录制的系统框架见图2。通过扩展用于视频录制的Philips的视频解码芯片SAA7113和ADI的JPEG压缩芯片来实现。首先输入的模拟视频信号经由SAA7113转换为数字信号,然后传输给ADI的JPEG压缩芯片JPEG2000,压缩为JPEG图像信号,并通过扩展的总线接口传输到系统上。音频信号则直接通过音频输入接口送到音频解码芯片,并转化为数字信号进行编码。编写应用程序使传到的音视频数字信号一起转化为Mo
tion JPEG编码的AVI格局的多媒体文件,并存入扩展的存储设备(微硬盘或者MMC/SD卡),这样就可以被Mplayer播放。
1