声音的控制和播放.docx
- 文档编号:1707123
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:9
- 大小:16.83KB
声音的控制和播放.docx
《声音的控制和播放.docx》由会员分享,可在线阅读,更多相关《声音的控制和播放.docx(9页珍藏版)》请在冰点文库上搜索。
声音的控制和播放
——声音的控制和播放
姓名:
王贵学号:
0882020572010年12月21日
一,实验目的:
*掌握8235声音的播放的控制方法
*学会使用按键控制声音播放的方法
*能够实现即时发声
*掌握音调的控制方法,并且能够利用16进制来表示
二,实验步骤:
1,scp192.168.210.11:
/tftpboot/8253/main.c/home/st/wg
利用这条命令从主机上下载名为8253的文件夹到自己的文件夹wg下
2,将8253文件夹下的shidriver.c更名为wgdriver.c,然后利用命令:
gcc-wall-DLINUX–cwgdriver.cI/usr/src/linux-24.20-8/include生成wgdriver.o文件
3,利用mknodwgdriver.oc123o-m666生成设备节点运行时所需的文件 wgdriver
4,gcc–omainmian.c生成可运行程序main
5,./main运行程序
注意点:
1,要统一设备的节点号,就是说要做到:
main.cwgdriver.c命令:
“mknodwgdriver.oc123o-m666” 三者的节点是统一的,本次实验,统一设定为123;
2,要统一节点文件的文件名,本次实验中,统一设定为“wgdriver”要将main.c中原“shidriver”全部改为“wgdriver”同样的,也要在wgdriver文件中,做相应的修改;
3,再所有的修改都完成之后,才可以按上面的操作步骤进行实验,不然是不会得到实验现象的!
4,如果遇到设备节点加载失败,则运行命令:
cat/proc/devices查看节点使用情况
利用命令:
/sbin/rmmod123删除被占用的节点,然后再从新加载节点
实验中使用的程序
main.c
#include
#include
#include
#defineTIMERIOMAGIC's'
#defineTIMERIOCSINIT_IOW(TIMERIOMAGIC,0,int)
#defineTIMERIOCSDAT_IOW(TIMERIOMAGIC,1,int)
#defineTIMERIOCSTART_IOW(TIMERIOMAGIC,2,int)
#defineTIMERIOCSTOP_IOW(TIMERIOMAGIC,3,int)
#defineTIMER_MAJOR123
#defineTIMER_NAME"wgdriver"
#defineSUCCESS0
unsignedintmediant[]={0x11be,0x0fd0,0x0e16,0x0d52,0x0bdc,0x0a91,0x0969,0x0871,0x1eb6,0x8971};
intfd;
voidstartmusic()
{
inti;
charmusic[]={3,3,4,5,5,4,3,2,0,1,1,2,3,3,2,2,2,0,3,3,4,5,5,4,3,2,0,1,1,2,3,2,1,1,1};
for(i=0;i { if(music[i]==0) ioctl(fd,TIMERIOCSDAT,0x20); else ioctl(fd,TIMERIOCSDAT,mediant[music[i]-1]); ioctl(fd,TIMERIOCSTART,0); usleep(500000); ioctl(fd,TIMERIOCSTOP,0); usleep(1000); if(i==sizeof(music)-1) break; } } main() { intget_val,i; fd=open("./wgdriver",O_RDONLY); if(fd<0) printf("ERROR"); else printf("OK"); printf("fd=%d\n",fd); ioctl(fd,TIMERIOCSINIT,0); printf("initok\n"); ioctl(fd,TIMERIOCSTART,0); printf("startok\n"); while (1) { ioctl(fd,TIMERIOCSINIT,0); get_val=getchar(); printf("aa"); switch(get_val) { case'1': ioctl(fd,TIMERIOCSDAT,mediant[0]);break; case'2': ioctl(fd,TIMERIOCSDAT,mediant[1]);break; case'3': ioctl(fd,TIMERIOCSDAT,mediant[2]);break; case'4': ioctl(fd,TIMERIOCSDAT,mediant[3]);break; case'5': ioctl(fd,TIMERIOCSDAT,mediant[4]);break; case'6': ioctl(fd,TIMERIOCSDAT,mediant[5]);break; case'7': ioctl(fd,TIMERIOCSDAT,mediant[6]);break; case'x': ioctl(fd,TIMERIOCSDAT,mediant[7]);break; case'y': ioctl(fd,TIMERIOCSDAT,mediant[8]);break; case'z': ioctl(fd,TIMERIOCSDAT,mediant[9]);break; case'a': startmusic();break; default: break; } usleep(100000); } ioctl(fd,TIMERIOCSTOP,0); close(fd); return0; } Wgdriver.c #defineMODULE #define__KERNEL__ //#define__NOVERSIONS__ #include #include #include #include #include #include #defineTIMERIOMAGIC's' #defineTIMERIOCSINIT_IOW(TIMERIOMAGIC,0,int) #defineTIMERIOCSDAT_IOW(TIMERIOMAGIC,1,int) #defineTIMERIOCSTART_IOW(TIMERIOMAGIC,2,int) #defineTIMERIOCSTOP_IOW(TIMERIOMAGIC,3,int) #defineTIMER_MAJOR123 #defineTIMER_NAME"wgdriver" #defineSUCCESS0 staticintdevicevalue=0; intshi_open(structinode*inode,structfile*file) { devicevalue++; return0; } intshi_ioctl(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg) { unsignedintvalue=0; printk("<1>ioctl\n"); switch(cmd) { caseTIMERIOCSINIT: outb_p(0xb6,0x43); printk("<1>INIT! \n"); break; caseTIMERIOCSTART: outb_p(0x03,0x61); printk("<1>START! \n"); break; caseTIMERIOCSDAT: value=(unsignedint)arg; outb_p((char)(value&0x00ff),0x42); outb_p((char)(value>>8),0x42); printk("<1>SETDATA! \n"); break; caseTIMERIOCSTOP: outb_p(0x00,0x61); break; default: printk("<1>ERRORCOMMANDS! \n"); } return0; } intshi_release(structinode*inode,structfile*file) { devicevalue--; return0; } structfile_operationsshi_fops={ open: shi_open, ioctl: shi_ioctl, release: shi_release, }; intinit_module() { charret; ret=register_chrdev(TIMER_MAJOR,TIMER_NAME,&shi_fops); printk("<1>initmoduleok\n"); returnSUCCESS; } voidcleanup_module(void) { intret; ret=unregister_chrdev(TIMER_MAJOR,TIMER_NAME); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("SHI"); 制作自己的音乐: 将main.c中的 charmusic[]={3,3,4,5,5,4,3,2,0,1,1,2,3,3,2,2,2,0,3,3,4,5,5,4,3,2,0,1,1,2,3,2,1,1,1}; 修改为自己想要的音乐,可以是 music[]={5,5,0,4,4,2,2,2,5,3,3,5,5,2,3,4,6,7,2,6,2,7,1,8,3,7,4,7}; 可以添加一个新的声调 intmediant[]={0x11be,0x0fd0,0x0e16,0x0d52,0x0bdc,0x0a91,0x0969,0x0871,0x1eb6,0x8971,0x1223,0x6532}; 再在case选择语句中添加: case'8': ioctl(fd,TIMERIOCSDAT,mediant[7]);break; case'9': ioctl(fd,TIMERIOCSDAT,mediant[8]);break; 再做完成程序的编译,运行之后,按“8”,“9”键,就有相应的声音出来; 即时发生: 主要有三处地方需要修改: while (1) {initscr();//第一处 ioctl(fd,TIMERIOCSINIT,0); get_val=getch();//第二处 printf("aa"); switch(get_val) { case'1': ioctl(fd,TIMERIOCSDAT,mediant[0]);break; case'2': ioctl(fd,TIMERIOCSDAT,mediant[1]);break; case'3': ioctl(fd,TIMERIOCSDAT,mediant[2]);break; case'4': ioctl(fd,TIMERIOCSDAT,mediant[3]);break; case'5': ioctl(fd,TIMERIOCSDAT,mediant[4]);break; case'6': ioctl(fd,TIMERIOCSDAT,mediant[5]);break; case'7': ioctl(fd,TIMERIOCSDAT,mediant[6]);break; case'x': ioctl(fd,TIMERIOCSDAT,mediant[7]);break; case'y': ioctl(fd,TIMERIOCSDAT,mediant[8]);break; case'z': ioctl(fd,TIMERIOCSDAT,mediant[9]);break; case'a': startmusic();break; default: break; } usleep(100000); } endwin();//第三处 ioctl(fd,TIMERIOCSTOP,0); close(fd); return0; } 再用gcc–omainmain.c–lcurses代替原来的gcc–omainmain.c 完成以上的改变,就可以做到即时发声 实验小结: 实验中,我们需要添加一些别的音调,这些音调产生的原理是“分频”即,将8253最大的发生频率进行分频,得到的就是我们想要的频率
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 声音 控制 播放