1、 实现 MP3 播放器的快进快退专业班级: XXXXX 设计者 : XXXXXXXX 指导老师: XXXXXXX 设计时间: XXXXXXX 一、设计题目:实现 MP3 播放器的快进快退。二、主要指标和要求:1) 指标:open 函数,write 函数,read 函数,设备控制函数 ioctl,结构体 struct wav_fmt,以及 fd1、fd2 文件描述符。2) 要求:在 linux 环境下,将/home/asdf/mp3player/nuannuan.wav 文件读出并写入声卡设备文件/dev/dsp 中。实验结果通过三步实现:第一步,实现声卡的发声,其现象为产生噪声;第二步,实现
2、MP3 音乐文件的播放,其现象为 nuannuan.wav文件的正常播放;第三步,实现快进快退功能,其现象为按下设定的按键时,音乐能快进或快退 5 秒。三、方案选择及其工作原理:1) 方案选择:首先在计算机上安装的虚拟机中编程实现 MP3 文件的快进快退功能,然后通过 arm-linux-gcc rc.c,arm-linux-gcc a./.out 等一系列语句将文件连接到超级终端,最后由超级终端将文件发送到实验开发板,观察现象完成实验。2) 工作原理:程序开始需先定义一个音频控制的结构体 struct wav_fmt 和一个异步端口控制函数 fun() 。然后通过 open 函数将/home
3、/asdf/mp3player/nuannuan.wav 文件和声卡设备文件/dev/dsp 打开,分别赋给 fd1 和 fd2(称其为文件描述符),紧接着用 read 函数读 fd1,通过声卡设备 ioctl(fd2,SNDCTL_DSP_SETFMT, / 音频文件结构体定义;struct wav_fmt char fiffid4;int riffsize;char rifffmt4;char fmtid4;int fmttag;short fmttype;short nchannels;int speed;int bpsecond;short align;short bitspersam
4、ple;struct wav_fmt fmt; int fun() / 异步端口控制; int ret;struct termios new_opts;if(tcgetattr (0,k=getchar();if(k=f)lseek(fd1,44100*2*5,SEEK_CUR);if(k=l)lseek(fd1,-44100*2*5,SEEK_CUR);close(fd1); / 关闭文件;close(fd2); 五、仿真、调试中遇到的问题,解决的方法以及实验效果:1) 声音的失真:在程序编写完成并正常执行后,输出的声音不是设置的女声而是略带嘈杂的低沉的声音,经检查并在老师的指导下发现是 i
5、octl()中第 3 各参数赋值的错误,他指出我们不能直接将 CHANNELS、SPEED 这样的参数赋给 ioctl(),而需先将CHANNELS、SPEED 分别赋给变量 a、b,再由&a、&b 赋给 ioctl(),这是与 linux 下的存储结构有关的。更改后能正常发声。2) 无法快进快退:在程序中我们用 getchar()语句来实现输入外来控制字符(我的程序中用 f、 l分别实现快进快退) ,但我们知道 getchar()语句为同步执行 ,当我执行f或l,程序进入等待状态,并不执行快进快退功能,为解决这个问题老师给我们提供了异步端口控制函数 fun(),在执行 getchar()之前
6、我们先调用这个函数,这样使得 getchar()能异步执行,运行程序后,按下f 、 l能正常实现快进快退。六、设计体会:这次的课程设计的实现方式是独特的,由专门的科技人员对我们进行理论知识的灌输和上机的指导,这种理论与实践相结合的方式让我从这次设计中受益匪浅。尽管在设计中我们遇到很多棘手的问题,但在错误中学到的知识和总结的经验无疑让我们更加铭记于心。作为大学生,我们在更多时候都是接受理论知识的教育,以至于在更多时候我们只能纸上谈兵,无法将理论与实践相结合。这次课程设计无疑给了我们一次很好的动手机会,我们把它当做一次学习和检验学习成果的机会,设计中我深刻的认识到了自己知识的不足和动手能力的薄弱,这让我懂得今后的学习得更加扎实与努力,这样才能提升自己的能力。这次设计的唯一遗憾是没能在开发板上展示设计效果,但瑕不掩瑜,总体说来,这是一次理论与实践相结合的完美的课程设计,让我们都满载而归!